1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-13 03:14:38 +00:00

Merge branch 'master' into doc_pause_menu

This commit is contained in:
Dragorn421 2022-12-11 10:52:27 +01:00
commit 61c4864972
No known key found for this signature in database
GPG key ID: 32B53D2D16FC4118
103 changed files with 5237 additions and 7978 deletions

View file

@ -1,7 +1,5 @@
<Root> <Root>
<File Name="object_ik" Segment="6"> <File Name="object_ik" Segment="6">
<!--Blob Name="object_ik_zeroes_unk_00000000" Size="0xF630" Offset="0x0" /-->
<Skeleton Name="object_ik_Skel_000380" Type="Normal" LimbType="Standard" Offset="0x380"/> <Skeleton Name="object_ik_Skel_000380" Type="Normal" LimbType="Standard" Offset="0x380"/>
<Skeleton Name="object_ik_Skel_000660" Type="Normal" LimbType="Standard" Offset="0x660"/> <Skeleton Name="object_ik_Skel_000660" Type="Normal" LimbType="Standard" Offset="0x660"/>
<Skeleton Name="object_ik_Skel_000C90" Type="Normal" LimbType="Standard" Offset="0xC90"/> <Skeleton Name="object_ik_Skel_000C90" Type="Normal" LimbType="Standard" Offset="0xC90"/>
@ -10,62 +8,62 @@
<Skeleton Name="object_ik_Skel_000F30" Type="Flex" LimbType="Standard" Offset="0xF30"/> <Skeleton Name="object_ik_Skel_000F30" Type="Flex" LimbType="Standard" Offset="0xF30"/>
<Skeleton Name="object_ik_Skel_01EB40" Type="Flex" LimbType="Standard" Offset="0x1EB40"/> <Skeleton Name="object_ik_Skel_01EB40" Type="Flex" LimbType="Standard" Offset="0x1EB40"/>
<Skeleton Name="object_ik_Skel_01EE60" Type="Flex" LimbType="Standard" Offset="0x1EE60"/> <Skeleton Name="object_ik_Skel_01EE60" Type="Flex" LimbType="Standard" Offset="0x1EE60"/>
<Skeleton Name="object_ik_Skel_01E178" Type="Flex" LimbType="Standard" Offset="0x1E178"/> <Skeleton Name="gIronKnuckleSkel" Type="Flex" LimbType="Standard" Offset="0x1E178"/>
<Skeleton Name="object_ik_Skel_0205C0" Type="Flex" LimbType="Standard" Offset="0x205C0"/> <Skeleton Name="gIronKnuckleDefeatSkel" Type="Flex" LimbType="Standard" Offset="0x205C0"/>
<Animation Name="object_ik_Anim_00035C" Offset="0x35C"/> <Animation Name="object_ik_Anim_00035C" Offset="0x35C"/>
<Animation Name="object_ik_Anim_000634" Offset="0x634"/> <Animation Name="object_ik_Anim_000634" Offset="0x634"/>
<Animation Name="object_ik_Anim_0008DC" Offset="0x8DC"/> <Animation Name="object_ik_Anim_0008DC" Offset="0x8DC"/>
<Animation Name="object_ik_Anim_000C6C" Offset="0xC6C"/> <Animation Name="object_ik_Anim_000C6C" Offset="0xC6C"/>
<Animation Name="object_ik_Anim_000F0C" Offset="0xF0C"/> <Animation Name="object_ik_Anim_000F0C" Offset="0xF0C"/>
<Animation Name="object_ik_Anim_001C28" Offset="0x1C28"/> <Animation Name="gIronKnuckleVerticalAttackAnim" Offset="0x1C28"/>
<Animation Name="object_ik_Anim_002538" Offset="0x2538"/> <Animation Name="gIronKnuckleRecoverFromVerticalAttackAnim" Offset="0x2538"/>
<Animation Name="object_ik_Anim_0029FC" Offset="0x29FC"/> <Animation Name="gIronKnuckleAxeStuckAnim" Offset="0x29FC"/>
<Animation Name="object_ik_Anim_0033C4" Offset="0x33C4"/> <Animation Name="gIronKnuckleHorizontalAttackAnim" Offset="0x33C4"/>
<Animation Name="object_ik_Anim_003DBC" Offset="0x3DBC"/> <Animation Name="gIronKnuckleRecoverFromHorizontalAttackAnim" Offset="0x3DBC"/>
<Animation Name="object_ik_Anim_0045BC" Offset="0x45BC"/> <Animation Name="gIronKnuckleBackHitAnim" Offset="0x45BC"/>
<Animation Name="object_ik_Anim_00485C" Offset="0x485C"/> <Animation Name="gIronKnuckleBlockAnim" Offset="0x485C"/>
<Animation Name="object_ik_Anim_005944" Offset="0x5944"/> <Animation Name="gIronKnuckleDeathAnim" Offset="0x5944"/>
<Animation Name="object_ik_Anim_006194" Offset="0x6194"/> <Animation Name="gIronKnuckleFrontHitAnim" Offset="0x6194"/>
<Animation Name="object_ik_Anim_006734" Offset="0x6734"/> <Animation Name="gIronKnuckleRunAnim" Offset="0x6734"/>
<Animation Name="object_ik_Anim_00C114" Offset="0xC114"/> <Animation Name="gIronKnuckleNabooruSummonAxeAnim" Offset="0xC114"/>
<Animation Name="object_ik_Anim_00CD70" Offset="0xCD70"/> <Animation Name="gIronKnuckleStandUpAnim" Offset="0xCD70"/>
<Animation Name="object_ik_Anim_00DD50" Offset="0xDD50"/> <Animation Name="object_ik_Anim_00DD50" Offset="0xDD50"/>
<Animation Name="object_ik_Anim_00ED24" Offset="0xED24"/> <Animation Name="gIronKnuckleWalkAnim" Offset="0xED24"/>
<Animation Name="object_ik_Anim_01EB14" Offset="0x1EB14"/> <Animation Name="object_ik_Anim_01EB14" Offset="0x1EB14"/>
<Animation Name="object_ik_Anim_01EE34" Offset="0x1EE34"/> <Animation Name="object_ik_Anim_01EE34" Offset="0x1EE34"/>
<Animation Name="object_ik_Anim_0203D8" Offset="0x203D8"/> <Animation Name="gIronKnuckleNabooruDeathAnim" Offset="0x203D8"/>
<Texture Name="object_ik_Tlut_00F630" OutName="tlut_00F630" Format="rgba16" Width="23" Height="8" Offset="0xf630"/> <Texture Name="object_ik_Tlut_00F630" OutName="tlut_00F630" Format="rgba16" Width="23" Height="8" Offset="0xf630"/>
<Texture Name="object_ik_Tex_00F7A0" OutName="tex_00F7A0" Format="i4" Width="32" Height="64" Offset="0xF7A0"/> <Texture Name="gIronKnuckleMetalTex" OutName="iron_knuckle_metal_tex" Format="i4" Width="32" Height="64" Offset="0xF7A0"/>
<Texture Name="object_ik_Tex_00FBA0" OutName="tex_00FBA0" Format="ia8" Width="32" Height="32" Offset="0xFBA0"/> <Texture Name="gIronKnuckleBigRivetTex" OutName="iron_knuckle_big_rivet_tex" Format="ia8" Width="32" Height="32" Offset="0xFBA0"/>
<Texture Name="object_ik_Tex_00FFA0" OutName="tex_00FFA0" Format="rgba16" Width="16" Height="16" Offset="0xFFA0"/> <Texture Name="gIronKnuckleBlockPatternTex" OutName="iron_knuckle_block_pattern_tex" Format="rgba16" Width="16" Height="16" Offset="0xFFA0"/>
<Texture Name="object_ik_Tex_0101A0" OutName="tex_0101A0" Format="rgba16" Width="16" Height="16" Offset="0x101A0"/> <Texture Name="gIronKnuckleChainMailTex" OutName="iron_knuckle_chain_mail_tex" Format="rgba16" Width="16" Height="16" Offset="0x101A0"/>
<Texture Name="object_ik_Tex_0103A0" OutName="tex_0103A0" Format="ia16" Width="32" Height="32" Offset="0x103A0"/> <Texture Name="object_ik_Tex_0103A0" OutName="tex_0103A0" Format="ia16" Width="32" Height="32" Offset="0x103A0"/>
<Texture Name="object_ik_Tex_010BA0" OutName="tex_010BA0" Format="rgba16" Width="32" Height="32" Offset="0x10BA0"/> <Texture Name="gIronKnuckleGerudoEyeTex" OutName="iron_knuckle_gerudo_eye_tex" Format="rgba16" Width="32" Height="32" Offset="0x10BA0"/>
<Texture Name="object_ik_Tex_0113A0" OutName="tex_0113A0" Format="rgba16" Width="8" Height="8" Offset="0x113A0"/> <Texture Name="gIronKnuckleNabooruLipTex" OutName="iron_kuckle_nabooru_lip_tex" Format="rgba16" Width="8" Height="8" Offset="0x113A0"/>
<Texture Name="object_ik_Tex_011420" OutName="tex_011420" Format="ci8" Width="16" Height="16" Offset="0x11420" TlutOffset="0xf630"/> <Texture Name="gIronKnuckleJewelTex" OutName="iron_knuckle_jewel_tex" Format="ci8" Width="16" Height="16" Offset="0x11420" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011520" OutName="tex_011520" Format="ci8" Width="16" Height="16" Offset="0x11520" TlutOffset="0xf630"/> <Texture Name="gIronKnuckleNabooruForeheadJewelTex" OutName="iron_knuckle_nabooru_forehead_jewel_tex" Format="ci8" Width="16" Height="16" Offset="0x11520" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011620" OutName="tex_011620" Format="ci8" Width="8" Height="8" Offset="0x11620" TlutOffset="0xf630"/> <Texture Name="object_ik_Tex_011620" OutName="tex_011620" Format="ci8" Width="8" Height="8" Offset="0x11620" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011660" OutName="tex_011660" Format="ci8" Width="16" Height="16" Offset="0x11660" TlutOffset="0xf630"/> <Texture Name="gIronKnuckleNabooruHair1Tex" OutName="iron_knuckle_nabooru_hair_1_tex" Format="ci8" Width="16" Height="16" Offset="0x11660" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011760" OutName="tex_011760" Format="ci8" Width="8" Height="16" Offset="0x11760" TlutOffset="0xf630"/> <Texture Name="object_ik_Tex_011760" OutName="tex_011760" Format="ci8" Width="8" Height="16" Offset="0x11760" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_0117E0" OutName="tex_0117E0" Format="ci8" Width="8" Height="16" Offset="0x117E0" TlutOffset="0xf630"/> <Texture Name="object_ik_Tex_0117E0" OutName="tex_0117E0" Format="ci8" Width="8" Height="16" Offset="0x117E0" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011860" OutName="tex_011860" Format="ci8" Width="16" Height="16" Offset="0x11860" TlutOffset="0xf630"/> <Texture Name="object_ik_Tex_011860" OutName="tex_011860" Format="ci8" Width="16" Height="16" Offset="0x11860" TlutOffset="0xf630"/>
<Texture Name="object_ik_Tex_011960" OutName="tex_011960" Format="ia8" Width="16" Height="16" Offset="0x11960"/> <Texture Name="object_ik_Tex_011960" OutName="tex_011960" Format="ia8" Width="16" Height="16" Offset="0x11960"/>
<DList Name="object_ik_DL_0151F0" Offset="0x151F0"/> <DList Name="object_ik_DL_0151F0" Offset="0x151F0"/>
<DList Name="object_ik_DL_015380" Offset="0x15380"/> <DList Name="object_ik_DL_015380" Offset="0x15380"/>
<DList Name="object_ik_DL_0154E0" Offset="0x154E0"/> <DList Name="gIronKnuckleNabooruHelmetDL" Offset="0x154E0"/>
<DList Name="object_ik_DL_015840" Offset="0x15840"/> <DList Name="gIronKnuckleAxeDL" Offset="0x15840"/>
<DList Name="object_ik_DL_015B00" Offset="0x15B00"/> <DList Name="gIronKnuckleShockedNabooruHeadDL" Offset="0x15B00"/>
<DList Name="object_ik_DL_016118" Offset="0x16118"/> <DList Name="object_ik_DL_016118" Offset="0x16118"/>
<DList Name="object_ik_DL_016278" Offset="0x16278"/> <DList Name="object_ik_DL_016278" Offset="0x16278"/>
<DList Name="object_ik_DL_016340" Offset="0x16340"/> <DList Name="object_ik_DL_016340" Offset="0x16340"/>
<DList Name="object_ik_DL_0164A0" Offset="0x164A0"/> <DList Name="object_ik_DL_0164A0" Offset="0x164A0"/>
<DList Name="object_ik_DL_016568" Offset="0x16568"/> <DList Name="object_ik_DL_016568" Offset="0x16568"/>
<DList Name="object_ik_DL_016658" Offset="0x16658"/> <DList Name="object_ik_DL_016658" Offset="0x16658"/>
<DList Name="object_ik_DL_016748" Offset="0x16748"/> <DList Name="gIronKnuckleSplitHelmetLeftDL" Offset="0x16748"/>
<DList Name="object_ik_DL_0169E8" Offset="0x169E8"/> <DList Name="gIronKnuckleSplitHelmetRightDL" Offset="0x169E8"/>
<DList Name="object_ik_DL_016BE0" Offset="0x16BE0"/> <DList Name="gIronKnuckleArmorRivetAndSymbolDL" Offset="0x16BE0"/>
<DList Name="object_ik_DL_016CD8" Offset="0x16CD8"/> <DList Name="object_ik_DL_016CD8" Offset="0x16CD8"/>
<DList Name="object_ik_DL_016D88" Offset="0x16D88"/> <DList Name="object_ik_DL_016D88" Offset="0x16D88"/>
<DList Name="object_ik_DL_016EE8" Offset="0x16EE8"/> <DList Name="object_ik_DL_016EE8" Offset="0x16EE8"/>
@ -75,14 +73,14 @@
<Texture Name="object_ik_Tlut_017288" OutName="tlut_017288" Format="rgba16" Width="15" Height="8" Offset="0x17288"/> <Texture Name="object_ik_Tlut_017288" OutName="tlut_017288" Format="rgba16" Width="15" Height="8" Offset="0x17288"/>
<Texture Name="object_ik_Tex_017378" OutName="tex_017378" Format="ci8" Width="16" Height="16" Offset="0x17378" TlutOffset="0x17288"/> <Texture Name="object_ik_Tex_017378" OutName="tex_017378" Format="ci8" Width="16" Height="16" Offset="0x17378" TlutOffset="0x17288"/>
<Texture Name="object_ik_Tex_017478" OutName="tex_017478" Format="ci8" Width="8" Height="8" Offset="0x17478" TlutOffset="0x17288"/> <Texture Name="object_ik_Tex_017478" OutName="tex_017478" Format="ci8" Width="8" Height="8" Offset="0x17478" TlutOffset="0x17288"/>
<Texture Name="object_ik_Tex_0174B8" OutName="tex_0174B8" Format="ci8" Width="16" Height="16" Offset="0x174B8" TlutOffset="0x17288"/> <Texture Name="gIronKnuckleHair2Tex" OutName="iron_knuckle_hair_2_tex" Format="ci8" Width="16" Height="16" Offset="0x174B8" TlutOffset="0x17288"/>
<Texture Name="object_ik_Tex_0175B8" OutName="tex_0175B8" Format="ci8" Width="8" Height="16" Offset="0x175B8" TlutOffset="0x17288"/> <Texture Name="object_ik_Tex_0175B8" OutName="tex_0175B8" Format="ci8" Width="8" Height="16" Offset="0x175B8" TlutOffset="0x17288"/>
<Texture Name="object_ik_Tex_017638" OutName="tex_017638" Format="ci8" Width="8" Height="16" Offset="0x17638" TlutOffset="0x17288"/> <Texture Name="object_ik_Tex_017638" OutName="tex_017638" Format="ci8" Width="8" Height="16" Offset="0x17638" TlutOffset="0x17288"/>
<Texture Name="object_ik_Tex_0176B8" OutName="tex_0176B8" Format="ci8" Width="16" Height="16" Offset="0x176B8" TlutOffset="0x17288"/> <Texture Name="object_ik_Tex_0176B8" OutName="tex_0176B8" Format="ci8" Width="16" Height="16" Offset="0x176B8" TlutOffset="0x17288"/>
<DList Name="object_ik_DL_018E78" Offset="0x18E78"/> <DList Name="gIronKnuckleHelmetDL" Offset="0x18E78"/>
<DList Name="object_ik_DL_019100" Offset="0x19100"/> <DList Name="gIronKnuckleGerudoHeadDL" Offset="0x19100"/>
<DList Name="object_ik_DL_019E08" Offset="0x19E08"/> <DList Name="gIronKnuckleHelmetMarkingDL" Offset="0x19E08"/>
<DList Name="object_ik_DL_01BA78" Offset="0x1BA78"/> <DList Name="gIronKnuckleTorsoDL" Offset="0x1BA78"/>
<DList Name="object_ik_DL_01BE98" Offset="0x1BE98"/> <DList Name="object_ik_DL_01BE98" Offset="0x1BE98"/>
<DList Name="object_ik_DL_01C130" Offset="0x1C130"/> <DList Name="object_ik_DL_01C130" Offset="0x1C130"/>
<DList Name="object_ik_DL_01C2B8" Offset="0x1C2B8"/> <DList Name="object_ik_DL_01C2B8" Offset="0x1C2B8"/>
@ -97,8 +95,7 @@
<DList Name="object_ik_DL_01D638" Offset="0x1D638"/> <DList Name="object_ik_DL_01D638" Offset="0x1D638"/>
<Texture Name="object_ik_Tlut_01D9A8" OutName="tlut_01D9A8" Format="rgba16" Width="16" Height="16" Offset="0x1D9A8"/> <Texture Name="object_ik_Tlut_01D9A8" OutName="tlut_01D9A8" Format="rgba16" Width="16" Height="16" Offset="0x1D9A8"/>
<Texture Name="object_ik_Tex_01DBA8" OutName="tex_01DBA8" Format="ia16" Width="16" Height="16" Offset="0x1DBA8"/> <Texture Name="object_ik_Tex_01DBA8" OutName="tex_01DBA8" Format="ia16" Width="16" Height="16" Offset="0x1DBA8"/>
<Texture Name="object_ik_Tex_01DDA8" OutName="tex_01DDA8" Format="ci8" Width="16" Height="16" Offset="0x1DDA8" TlutOffset="0x1D9A8"/> <Texture Name="gIronKnuckleHair3Tex" OutName="iron_knuckle_hair_3_tex" Format="ci8" Width="16" Height="16" Offset="0x1DDA8" TlutOffset="0x1D9A8"/>
<Texture Name="object_ik_Tex_01DEA8" OutName="tex_01DEA8" Format="ci8" Width="16" Height="16" Offset="0x1DEA8" TlutOffset="0x1D9A8"/> <Texture Name="gIronKnuckleNabooruChestJewelTex" OutName="iron_knuckle_nabooru_chest_jewel_tex" Format="ci8" Width="16" Height="16" Offset="0x1DEA8" TlutOffset="0x1D9A8"/>
<!--Blob Name="object_ik_zeroes_unk_0001DFA8" Size="0x2628" Offset="0x1DFA8" /-->
</File> </File>
</Root> </Root>

View file

@ -435,7 +435,7 @@ void func_8002F8F0(Actor* actor, u16 sfxId);
void func_8002F91C(Actor* actor, u16 sfxId); void func_8002F91C(Actor* actor, u16 sfxId);
void func_8002F948(Actor* actor, u16 sfxId); void func_8002F948(Actor* actor, u16 sfxId);
void func_8002F974(Actor* actor, u16 sfxId); void func_8002F974(Actor* actor, u16 sfxId);
void func_8002F994(Actor* actor, s32 arg1); void func_8002F994(Actor* actor, s32 timer);
s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos); s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos);
void Actor_DisableLens(PlayState* play); void Actor_DisableLens(PlayState* play);
void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* playerEntry); void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* playerEntry);
@ -653,10 +653,10 @@ Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera);
s16 Camera_GetCamDirPitch(Camera* camera); s16 Camera_GetCamDirPitch(Camera* camera);
s16 Camera_GetCamDirYaw(Camera* camera); s16 Camera_GetCamDirYaw(Camera* camera);
s32 Camera_RequestQuake(Camera* camera, s32 unused, s16 y, s32 duration); s32 Camera_RequestQuake(Camera* camera, s32 unused, s16 y, s32 duration);
s32 Camera_SetParam(Camera* camera, s32 param, void* value); s32 Camera_SetViewParam(Camera* camera, s32 viewFlag, void* param);
s32 func_8005AC48(Camera* camera, s16 arg1); s32 Camera_OverwriteStateFlags(Camera* camera, s16 stateFlags);
s16 func_8005ACFC(Camera* camera, s16 arg1); s16 Camera_SetStateFlag(Camera* camera, s16 stateFlag);
s16 func_8005AD1C(Camera* camera, s16 arg1); s16 Camera_UnsetStateFlag(Camera* camera, s16 stateFlag);
s32 Camera_ResetAnim(Camera* camera); s32 Camera_ResetAnim(Camera* camera);
s32 Camera_SetCSParams(Camera* camera, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints, Player* player, s32 Camera_SetCSParams(Camera* camera, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints, Player* player,
s16 relativeToPlayer); s16 relativeToPlayer);

View file

@ -927,17 +927,17 @@
/* 0x2E9 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3_3, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2E9 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3_3, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
// Labeled as "Test Area" in Map Select // Labeled as "Test Area" in Map Select
/* 0x2EA */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2EA */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2EB */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_1, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2EB */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_1, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2EC */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_2, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2EC */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_2, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2ED */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_3, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2ED */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_3, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2EE */ DEFINE_ENTRANCE(ENTR_TEST_SPOT05_0_4, SCENE_SACRED_FOREST_MEADOW, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2EE */ DEFINE_ENTRANCE(ENTR_TEST_SACRED_FOREST_MEADOW_0_4, SCENE_SACRED_FOREST_MEADOW, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2EF */ DEFINE_ENTRANCE(ENTR_TEST_HIRAL_DEMO_0_5, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2EF */ DEFINE_ENTRANCE(ENTR_TEST_CUTSCENE_MAP_0_5, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F0 */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_6, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F0 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_6, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F1 */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_7, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F1 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_7, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F2 */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_8, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F2 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_8, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F3 */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_9, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F3 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_9, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F4 */ DEFINE_ENTRANCE(ENTR_TEST_SYATEKIJYOU_0_10, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F4 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_10, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F5 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F5 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)
/* 0x2F6 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) /* 0x2F6 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK)

View file

@ -16,8 +16,8 @@
/* 0x04 */ DEFINE_SCENE(HIDAN_scene, g_pn_03, SCENE_FIRE_TEMPLE, SDC_FIRE_TEMPLE, 2, 6) /* 0x04 */ DEFINE_SCENE(HIDAN_scene, g_pn_03, SCENE_FIRE_TEMPLE, SDC_FIRE_TEMPLE, 2, 6)
/* 0x05 */ DEFINE_SCENE(MIZUsin_scene, g_pn_04, SCENE_WATER_TEMPLE, SDC_WATER_TEMPLE, 1, 7) /* 0x05 */ DEFINE_SCENE(MIZUsin_scene, g_pn_04, SCENE_WATER_TEMPLE, SDC_WATER_TEMPLE, 1, 7)
/* 0x06 */ DEFINE_SCENE(jyasinzou_scene, g_pn_05, SCENE_SPIRIT_TEMPLE, SDC_SPIRIT_TEMPLE, 1, 8) /* 0x06 */ DEFINE_SCENE(jyasinzou_scene, g_pn_05, SCENE_SPIRIT_TEMPLE, SDC_SPIRIT_TEMPLE, 1, 8)
/* 0x07 */ DEFINE_SCENE(HAKAdan_scene, g_pn_02, SCENE_SHADOW_TEMPLE, SDC_SHADOW_TEMPLE, 2, 9) /* 0x07 */ DEFINE_SCENE(HAKAdan_scene, g_pn_02, SCENE_SHADOW_TEMPLE, SDC_SHADOW_TEMPLE_AND_WELL, 2, 9)
/* 0x08 */ DEFINE_SCENE(HAKAdanCH_scene, g_pn_54, SCENE_BOTTOM_OF_THE_WELL, SDC_SHADOW_TEMPLE, 2, 10) /* 0x08 */ DEFINE_SCENE(HAKAdanCH_scene, g_pn_54, SCENE_BOTTOM_OF_THE_WELL, SDC_SHADOW_TEMPLE_AND_WELL, 2, 10)
/* 0x09 */ DEFINE_SCENE(ice_doukutu_scene, g_pn_10, SCENE_ICE_CAVERN, SDC_ICE_CAVERN, 0, 0) /* 0x09 */ DEFINE_SCENE(ice_doukutu_scene, g_pn_10, SCENE_ICE_CAVERN, SDC_ICE_CAVERN, 0, 0)
/* 0x0A */ DEFINE_SCENE(ganon_scene, none, SCENE_GANONS_TOWER, SDC_DEFAULT, 2, 0) /* 0x0A */ DEFINE_SCENE(ganon_scene, none, SCENE_GANONS_TOWER, SDC_DEFAULT, 2, 0)
/* 0x0B */ DEFINE_SCENE(men_scene, g_pn_11, SCENE_GERUDO_TRAINING_GROUND, SDC_GERUDO_TRAINING_GROUND, 0, 0) /* 0x0B */ DEFINE_SCENE(men_scene, g_pn_11, SCENE_GERUDO_TRAINING_GROUND, SDC_GERUDO_TRAINING_GROUND, 0, 0)
@ -33,7 +33,7 @@
/* 0x15 */ DEFINE_SCENE(FIRE_bs_scene, none, SCENE_FIRE_TEMPLE_BOSS, SDC_FIRE_TEMPLE, 0, 0) /* 0x15 */ DEFINE_SCENE(FIRE_bs_scene, none, SCENE_FIRE_TEMPLE_BOSS, SDC_FIRE_TEMPLE, 0, 0)
/* 0x16 */ DEFINE_SCENE(MIZUsin_bs_scene, none, SCENE_WATER_TEMPLE_BOSS, SDC_WATER_TEMPLE_BOSS, 0, 0) /* 0x16 */ DEFINE_SCENE(MIZUsin_bs_scene, none, SCENE_WATER_TEMPLE_BOSS, SDC_WATER_TEMPLE_BOSS, 0, 0)
/* 0x17 */ DEFINE_SCENE(jyasinboss_scene, none, SCENE_SPIRIT_TEMPLE_BOSS, SDC_DEFAULT, 0, 0) /* 0x17 */ DEFINE_SCENE(jyasinboss_scene, none, SCENE_SPIRIT_TEMPLE_BOSS, SDC_DEFAULT, 0, 0)
/* 0x18 */ DEFINE_SCENE(HAKAdan_bs_scene, none, SCENE_SHADOW_TEMPLE_BOSS, SDC_SHADOW_TEMPLE, 0, 0) /* 0x18 */ DEFINE_SCENE(HAKAdan_bs_scene, none, SCENE_SHADOW_TEMPLE_BOSS, SDC_SHADOW_TEMPLE_AND_WELL, 0, 0)
/* 0x19 */ DEFINE_SCENE(ganon_boss_scene, none, SCENE_GANONDORF_BOSS, SDC_DEFAULT, 0, 0) /* 0x19 */ DEFINE_SCENE(ganon_boss_scene, none, SCENE_GANONDORF_BOSS, SDC_DEFAULT, 0, 0)
/* 0x1A */ DEFINE_SCENE(ganon_final_scene, none, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SDC_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, 0) /* 0x1A */ DEFINE_SCENE(ganon_final_scene, none, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SDC_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, 0)
/* 0x1B */ DEFINE_SCENE(entra_scene, none, SCENE_MARKET_ENTRANCE_DAY, SDC_DEFAULT, 0, 0) /* 0x1B */ DEFINE_SCENE(entra_scene, none, SCENE_MARKET_ENTRANCE_DAY, SDC_DEFAULT, 0, 0)

View file

@ -3,6 +3,7 @@
#include "ultra64.h" #include "ultra64.h"
#include "z64cutscene.h" #include "z64cutscene.h"
#include "z64save.h"
// these two angle conversion macros are slightly inaccurate // these two angle conversion macros are slightly inaccurate
#define CAM_DEG_TO_BINANG(degrees) (s16)((degrees) * 182.04167f + .5f) #define CAM_DEG_TO_BINANG(degrees) (s16)((degrees) * 182.04167f + .5f)
@ -27,7 +28,97 @@
#define PARENT_CAM(cam) ((cam)->play->cameraPtrs[(cam)->parentCamId]) #define PARENT_CAM(cam) ((cam)->play->cameraPtrs[(cam)->parentCamId])
#define CHILD_CAM(cam) ((cam)->play->cameraPtrs[(cam)->childCamId]) #define CHILD_CAM(cam) ((cam)->play->cameraPtrs[(cam)->childCamId])
// All scenes using `SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT` or `SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT` are expected // Shrinking the window from the top and bottom with black borders (letterboxing)
#define CAM_LETTERBOX_SHIFT 12
#define CAM_LETTERBOX_MASK (0xF << CAM_LETTERBOX_SHIFT)
#define CAM_LETTERBOX_SIZE_MASK (0x7 << CAM_LETTERBOX_SHIFT)
#define CAM_LETTERBOX(letterBoxFlag) (((letterBoxFlag) & 0xF) << CAM_LETTERBOX_SHIFT)
// small/medium/large black borders
#define CAM_LETTERBOX_NONE CAM_LETTERBOX(0)
#define CAM_LETTERBOX_SMALL CAM_LETTERBOX(1)
#define CAM_LETTERBOX_MEDIUM CAM_LETTERBOX(2)
#define CAM_LETTERBOX_LARGE CAM_LETTERBOX(3)
#define CAM_LETTERBOX_INSTANT CAM_LETTERBOX(8) // Bit to determine whether to set the current value directly (on), or to set the size target (off)
#define CAM_LETTERBOX_IGNORE CAM_LETTERBOX(0xF) // No change in letterbox size, keep the previous size
// Camera-unique hud visibility mode macros
#define CAM_HUD_VISIBILITY_SHIFT 8
#define CAM_HUD_VISIBILITY_MASK (0xF << CAM_HUD_VISIBILITY_SHIFT)
#define CAM_HUD_VISIBILITY(hudVisibility) (((hudVisibility) & 0xF) << CAM_HUD_VISIBILITY_SHIFT)
//! @note: since `interfaceField` can only have `0 - 0xF` values,
//! there is no cam value mapped to `HUD_VISIBILITY_NOTHING_INSTANT`.
//! @note: since 0 means `HUD_VISIBILITY_ALL`,
//! there is no cam value mapped to `HUD_VISIBILITY_NO_CHANGE`.
#define CAM_HUD_VISIBILITY_ALL CAM_HUD_VISIBILITY(0) // HUD_VISIBILITY_ALL
#define CAM_HUD_VISIBILITY_NOTHING CAM_HUD_VISIBILITY(HUD_VISIBILITY_NOTHING)
#define CAM_HUD_VISIBILITY_NOTHING_ALT CAM_HUD_VISIBILITY(HUD_VISIBILITY_NOTHING_ALT)
#define CAM_HUD_VISIBILITY_HEARTS_FORCE CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_FORCE)
#define CAM_HUD_VISIBILITY_A CAM_HUD_VISIBILITY(HUD_VISIBILITY_A)
#define CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE)
#define CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_FORCE CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_FORCE)
#define CAM_HUD_VISIBILITY_ALL_NO_MINIMAP_BY_BTN_STATUS CAM_HUD_VISIBILITY(HUD_VISIBILITY_ALL_NO_MINIMAP_BY_BTN_STATUS)
#define CAM_HUD_VISIBILITY_B CAM_HUD_VISIBILITY(HUD_VISIBILITY_B)
#define CAM_HUD_VISIBILITY_HEARTS_MAGIC CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_MAGIC)
#define CAM_HUD_VISIBILITY_B_ALT CAM_HUD_VISIBILITY(HUD_VISIBILITY_B_ALT)
#define CAM_HUD_VISIBILITY_HEARTS CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS)
#define CAM_HUD_VISIBILITY_A_B_MINIMAP CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_B_MINIMAP)
#define CAM_HUD_VISIBILITY_HEARTS_MAGIC_FORCE CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_MAGIC_FORCE)
// Unique to camera, does not change hud visibility mode (similar effect as HUD_VISIBILITY_NO_CHANGE)
#define CAM_HUD_VISIBILITY_IGNORE CAM_HUD_VISIBILITY(0xF)
/**
* letterboxFlag: Determines the size of the letter-box window. See CAM_LETTERBOX_* defines.
* Can also add on the flag ( | CAM_LETTERBOX_INSTANT) to make the size change immediately
* hudVisibilityMode: Determines the hud visibility mode. See CAM_HUD_VISIBILITY_* defines.
* - A value of 0 (CAM_HUD_VISIBILITY_ALL) in camera maps to a hud visibility mode of HUD_VISIBILITY_ALL
* - A value of 0xF in camera results in no change in the hudVisibility (CAM_HUD_VISIBILITY_IGNORE)
* funcFlags: Custom flags for functions
*/
#define CAM_INTERFACE_FIELD(letterboxFlag, hudVisibilityMode, funcFlags) \
(((letterboxFlag) & CAM_LETTERBOX_MASK) | (hudVisibilityMode) | ((funcFlags) & 0xFF))
// Camera behaviorFlags. Flags specifically for settings, modes, and bgCam
// Used to store current state, only CAM_BEHAVIOR_SETTING_1 and CAM_BEHAVIOR_BG_2 are read from and used in logic
// Setting (0x1, 0x10)
#define CAM_BEHAVIOR_SETTING_1 (1 << 0)
#define CAM_BEHAVIOR_SETTING_2 (1 << 4)
// Mode (0x2, 0x20)
#define CAM_BEHAVIOR_MODE_1 (1 << 1)
#define CAM_BEHAVIOR_MODE_2 (1 << 5)
// bgCam (0x4, 0x40)
#define CAM_BEHAVIOR_BG_1 (1 << 2)
#define CAM_BEHAVIOR_BG_2 (1 << 6)
// Camera stateFlags. Variety of generic flags
#define CAM_STATE_0 (1 << 0) // Must be set for the camera to change settings based on the bg surface
#define CAM_STATE_1 (1 << 1) // Must be set for Camera_UpdateWater to run
#define CAM_STATE_2 (1 << 2)
#define CAM_STATE_3 (1 << 3) // Customizable flag for different functions
#define CAM_STATE_4 (1 << 4)
#define CAM_STATE_5 (1 << 5)
#define CAM_STATE_6 (1 << 6)
#define CAM_STATE_7 (1 << 7) // Set in play, unused
#define CAM_STATE_8 (1 << 8) // Camera (eye) is underwater
#define CAM_STATE_9 (1 << 9)
#define CAM_STATE_10 (1 << 10) // Prevents the camera from changing settings based on the bg surface
#define CAM_STATE_12 (1 << 12) // Set in Camera_Demo7, but Camera_Demo7 is never called
#define CAM_STATE_14 (1 << 14) // isInitialized. Turned on in Camera Init, never used or changed
#define CAM_STATE_15 ((s16)(1 << 15))
// Camera viewFlags. Set params related to view
#define CAM_VIEW_AT (1 << 0) // camera->at
#define CAM_VIEW_EYE (1 << 1) // camera->eye and camera->eyeNext
#define CAM_VIEW_UP (1 << 2) // camera->up
#define CAM_VIEW_TARGET (1 << 3) // camera->target
#define CAM_VIEW_TARGET_POS (1 << 4) // camera->targetPosRot.pos
#define CAM_VIEW_FOV (1 << 5) // camera->fov
#define CAM_VIEW_ROLL (1 << 6) // camera->roll
// All scenes using `SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT` or `SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT` are expected
// to have their first two bgCamInfo entries be the following: // to have their first two bgCamInfo entries be the following:
#define BGCAM_INDEX_TOGGLE_LOCKED 0 #define BGCAM_INDEX_TOGGLE_LOCKED 0
#define BGCAM_INDEX_TOGGLE_PIVOT 1 #define BGCAM_INDEX_TOGGLE_PIVOT 1
@ -112,26 +203,26 @@ typedef enum {
typedef enum { typedef enum {
/* 0x00 */ CAM_MODE_NORMAL, /* 0x00 */ CAM_MODE_NORMAL,
/* 0x01 */ CAM_MODE_TARGET, // "PARALLEL" /* 0x01 */ CAM_MODE_Z_PARALLEL, // Holding Z but with no target, keeps the camera aligned
/* 0x02 */ CAM_MODE_FOLLOWTARGET, // "KEEPON" /* 0x02 */ CAM_MODE_Z_TARGET_FRIENDLY,
/* 0x03 */ CAM_MODE_TALK, /* 0x03 */ CAM_MODE_TALK,
/* 0x04 */ CAM_MODE_BATTLE, /* 0x04 */ CAM_MODE_Z_TARGET_UNFRIENDLY,
/* 0x05 */ CAM_MODE_CLIMB, /* 0x05 */ CAM_MODE_WALL_CLIMB, // Climbing a wall: ladders and vines
/* 0x06 */ CAM_MODE_FIRSTPERSON, // "SUBJECT" /* 0x06 */ CAM_MODE_FIRST_PERSON,
/* 0x07 */ CAM_MODE_BOWARROW, /* 0x07 */ CAM_MODE_AIM_ADULT, // First person aiming as adult: bow and hookshot
/* 0x08 */ CAM_MODE_BOWARROWZ, /* 0x08 */ CAM_MODE_Z_AIM, // Third person aiming for all items, child and adult
/* 0x09 */ CAM_MODE_HOOKSHOT, // "FOOKSHOT" /* 0x09 */ CAM_MODE_HOOKSHOT_FLY, // Player being pulled by the hookshot to a target
/* 0x0A */ CAM_MODE_BOOMERANG, /* 0x0A */ CAM_MODE_AIM_BOOMERANG, // Aiming the boomerang
/* 0x0B */ CAM_MODE_SLINGSHOT, // "PACHINCO" /* 0x0B */ CAM_MODE_AIM_CHILD, // First person aiming as child: slingshot
/* 0x0C */ CAM_MODE_CLIMBZ, /* 0x0C */ CAM_MODE_Z_WALL_CLIMB, // Climbing a wall with Z pressed: ladders and vines
/* 0x0D */ CAM_MODE_JUMP, /* 0x0D */ CAM_MODE_JUMP, // Falling in air from a ledge jump
/* 0x0E */ CAM_MODE_HANG, /* 0x0E */ CAM_MODE_LEDGE_HANG, // Hanging from and climbing a ledge
/* 0x0F */ CAM_MODE_HANGZ, /* 0x0F */ CAM_MODE_Z_LEDGE_HANG, // Hanging from and climbing a ledge with Z pressed
/* 0x10 */ CAM_MODE_FREEFALL, /* 0x10 */ CAM_MODE_FREE_FALL, // Falling in air except for a ledge jump or knockback
/* 0x11 */ CAM_MODE_CHARGE, /* 0x11 */ CAM_MODE_CHARGE, // Charging a spin attack
/* 0x12 */ CAM_MODE_STILL, /* 0x12 */ CAM_MODE_STILL, // Attacks without Z pressed, falling in air from knockback
/* 0x13 */ CAM_MODE_PUSHPULL, /* 0x13 */ CAM_MODE_PUSH_PULL,
/* 0x14 */ CAM_MODE_FOLLOWBOOMERANG, // "BOOKEEPON" /* 0x14 */ CAM_MODE_FOLLOW_BOOMERANG, // Boomerang has been thrown, force-target the boomerang as it flies
/* 0x15 */ CAM_MODE_MAX /* 0x15 */ CAM_MODE_MAX
} CameraModeType; } CameraModeType;
@ -220,7 +311,7 @@ typedef enum {
/* 0x06 */ CAM_DATA_MAX_YAW_UPDATE, /* 0x06 */ CAM_DATA_MAX_YAW_UPDATE,
/* 0x07 */ CAM_DATA_FOV, /* 0x07 */ CAM_DATA_FOV,
/* 0x08 */ CAM_DATA_AT_LERP_STEP_SCALE, /* 0x08 */ CAM_DATA_AT_LERP_STEP_SCALE,
/* 0x09 */ CAM_DATA_FLAGS, /* 0x09 */ CAM_DATA_INTERFACE_FIELD,
/* 0x0A */ CAM_DATA_YAW_TARGET, /* 0x0A */ CAM_DATA_YAW_TARGET,
/* 0x0B */ CAM_DATA_GROUND_Y_OFFSET, /* 0x0B */ CAM_DATA_GROUND_Y_OFFSET,
/* 0x0C */ CAM_DATA_GROUND_AT_LERP_STEP_SCALE, /* 0x0C */ CAM_DATA_GROUND_AT_LERP_STEP_SCALE,
@ -241,8 +332,8 @@ typedef enum {
/* 0x1B */ CAM_DATA_MAX /* 0x1B */ CAM_DATA_MAX
} CameraDataType; } CameraDataType;
#define CAM_FUNCDATA_FLAGS(flags) \ #define CAM_FUNCDATA_INTERFACE_FIELD(interfaceField) \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ Vec3f collisionClosePoint; /* 0x00 */ Vec3f collisionClosePoint;
@ -264,7 +355,7 @@ typedef struct {
/* 0x18 */ f32 fovTarget; /* 0x18 */ f32 fovTarget;
/* 0x1C */ f32 atLERPScaleMax; /* 0x1C */ f32 atLERPScaleMax;
/* 0x20 */ s16 pitchTarget; /* 0x20 */ s16 pitchTarget;
/* 0x22 */ s16 interfaceFlags; /* 0x22 */ s16 interfaceField;
} Normal1ReadOnlyData; // size = 0x24 } Normal1ReadOnlyData; // size = 0x24
typedef struct { typedef struct {
@ -282,7 +373,14 @@ typedef struct {
/* 0x24 */ Normal1ReadWriteData rwData; /* 0x24 */ Normal1ReadWriteData rwData;
} Normal1; // size = 0x50 } Normal1; // size = 0x50
#define CAM_FUNCDATA_NORM1(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, flags) \ #define NORMAL1_FLAG_0 (1 << 0)
#define NORMAL1_FLAG_1 (1 << 1)
#define NORMAL1_FLAG_2 (1 << 2)
#define NORMAL1_FLAG_4 (1 << 4)
#define NORMAL1_FLAG_5 (1 << 5)
#define NORMAL1_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_NORM1(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -292,9 +390,9 @@ typedef struct {
{ maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \ { maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
#define CAM_FUNCDATA_NORM1_ALT(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_NORM1_ALT(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -304,7 +402,7 @@ typedef struct {
{ maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \ { maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 unk_00; /* 0x00 */ f32 unk_00;
@ -315,7 +413,7 @@ typedef struct {
/* 0x14 */ f32 unk_14; /* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18; /* 0x18 */ f32 unk_18;
/* 0x1C */ s16 unk_1C; /* 0x1C */ s16 unk_1C;
/* 0x1E */ s16 interfaceFlags; /* 0x1E */ s16 interfaceField;
} Normal2ReadOnlyData; // size = 0x20 } Normal2ReadOnlyData; // size = 0x20
typedef struct { typedef struct {
@ -334,7 +432,12 @@ typedef struct {
/* 0x20 */ Normal2ReadWriteData rwData; /* 0x20 */ Normal2ReadWriteData rwData;
} Normal2; // size = 0x4C } Normal2; // size = 0x4C
#define CAM_FUNCDATA_NORM2(yOffset, eyeDist, eyeDistNext, unk_23, yawUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, flags) \ #define NORMAL2_FLAG_0 (1 << 0)
#define NORMAL2_FLAG_2 (1 << 2)
#define NORMAL2_FLAG_4 (1 << 4)
#define NORMAL2_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_NORM2(yOffset, eyeDist, eyeDistNext, unk_23, yawUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -343,7 +446,7 @@ typedef struct {
{ maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \ { maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
@ -354,7 +457,7 @@ typedef struct {
/* 0x14 */ f32 fovTarget; /* 0x14 */ f32 fovTarget;
/* 0x18 */ f32 maxAtLERPScale; /* 0x18 */ f32 maxAtLERPScale;
/* 0x1C */ s16 pitchTarget; /* 0x1C */ s16 pitchTarget;
/* 0x1E */ s16 interfaceFlags; /* 0x1E */ s16 interfaceField;
} Normal3ReadOnlyData; // size = 0x20 } Normal3ReadOnlyData; // size = 0x20
typedef struct { typedef struct {
@ -372,7 +475,7 @@ typedef struct {
/* 0x20 */ Normal3ReadWriteData rwData; /* 0x20 */ Normal3ReadWriteData rwData;
} Normal3; // size = 0x4C } Normal3; // size = 0x4C
#define CAM_FUNCDATA_NORM3(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_NORM3(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -381,7 +484,7 @@ typedef struct {
{ xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \ { xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
@ -394,7 +497,7 @@ typedef struct {
/* 0x1C */ f32 unk_1C; /* 0x1C */ f32 unk_1C;
/* 0x20 */ s16 pitchTarget; /* 0x20 */ s16 pitchTarget;
/* 0x22 */ s16 yawTarget; /* 0x22 */ s16 yawTarget;
/* 0x24 */ s16 interfaceFlags; /* 0x24 */ s16 interfaceField;
} Parallel1ReadOnlyData; // size = 0x28 } Parallel1ReadOnlyData; // size = 0x28
typedef struct { typedef struct {
@ -412,7 +515,16 @@ typedef struct {
/* 0x28 */ Parallel1ReadWriteData rwData; /* 0x28 */ Parallel1ReadWriteData rwData;
} Parallel1; // size = 0x44 } Parallel1; // size = 0x44
#define CAM_FUNCDATA_PARA1(yOffset, eyeDist, pitchTarget, yawTarget, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, flags, groundYOffset, groundAtLerpStepScale) \ #define PARALLEL1_FLAG_0 (1 << 0)
#define PARALLEL1_FLAG_1 (1 << 1)
#define PARALLEL1_FLAG_2 (1 << 2)
#define PARALLEL1_FLAG_3 (1 << 3)
#define PARALLEL1_FLAG_4 (1 << 4)
#define PARALLEL1_FLAG_5 (1 << 5)
#define PARALLEL1_FLAG_6 (1 << 6)
#define PARALLEL1_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_PARA1(yOffset, eyeDist, pitchTarget, yawTarget, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, interfaceField, groundYOffset, groundAtLerpStepScale) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
@ -421,10 +533,13 @@ typedef struct {
{ xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \ { xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS }, \ { interfaceField, CAM_DATA_INTERFACE_FIELD }, \
{ groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \ { groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \
{ groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE } { groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE }
#define PARALLEL3_FLAG_0 (1 << 0)
#define PARALLEL3_FLAG_1 (1 << 1)
typedef struct { typedef struct {
/* 0x00 */ f32 atYOffset; /* 0x00 */ f32 atYOffset;
/* 0x04 */ f32 distMin; /* 0x04 */ f32 distMin;
@ -433,7 +548,7 @@ typedef struct {
/* 0x10 */ f32 maxYawUpdate; /* 0x10 */ f32 maxYawUpdate;
/* 0x14 */ f32 unk_14; // never used. /* 0x14 */ f32 unk_14; // never used.
/* 0x18 */ f32 atLERPScaleMax; /* 0x18 */ f32 atLERPScaleMax;
/* 0x1C */ s16 interfaceFlags; /* 0x1C */ s16 interfaceField;
} Jump1ReadOnlyData; // size = 0x20 } Jump1ReadOnlyData; // size = 0x20
typedef struct { typedef struct {
@ -449,7 +564,10 @@ typedef struct {
/* 0x20 */ Jump1ReadWriteData rwData; /* 0x20 */ Jump1ReadWriteData rwData;
} Jump1; // size = 0x48 } Jump1; // size = 0x48
#define CAM_FUNCDATA_JUMP1(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, flags) \ #define JUMP1_FLAG_2 (1 << 2)
#define JUMP1_FLAG_4 (1 << 4)
#define CAM_FUNCDATA_JUMP1(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -457,7 +575,7 @@ typedef struct {
{ maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \ { maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 atYOffset; /* 0x00 */ f32 atYOffset;
@ -468,7 +586,7 @@ typedef struct {
/* 0x14 */ f32 xzUpdRateTarget; /* 0x14 */ f32 xzUpdRateTarget;
/* 0x18 */ f32 fovTarget; /* 0x18 */ f32 fovTarget;
/* 0x1C */ f32 atLERPStepScale; /* 0x1C */ f32 atLERPStepScale;
/* 0x20 */ s16 interfaceFlags; /* 0x20 */ s16 interfaceField;
} Jump2ReadOnlyData; // size = 0x24 } Jump2ReadOnlyData; // size = 0x24
typedef struct { typedef struct {
@ -485,7 +603,10 @@ typedef struct {
/* 0x24 */ Jump2ReadWriteData rwData; /* 0x24 */ Jump2ReadWriteData rwData;
} Jump2; // size = 0x34 } Jump2; // size = 0x34
#define CAM_FUNCDATA_JUMP2(yOffset, eyeDist, eyeDistNext, minMaxDistFactor, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, flags) \ #define JUMP2_FLAG_1 (1 << 1)
#define JUMP2_FLAG_2 (1 << 2)
#define CAM_FUNCDATA_JUMP2(yOffset, eyeDist, eyeDistNext, minMaxDistFactor, yawUpdateRateTarget, xzUpdateRateTarget, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -494,7 +615,7 @@ typedef struct {
{ xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \ { xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
@ -506,7 +627,7 @@ typedef struct {
/* 0x18 */ f32 fovTarget; /* 0x18 */ f32 fovTarget;
/* 0x1C */ f32 unk_1C; /* 0x1C */ f32 unk_1C;
/* 0x20 */ s16 pitchTarget; /* 0x20 */ s16 pitchTarget;
/* 0x22 */ s16 interfaceFlags; /* 0x22 */ s16 interfaceField;
} Jump3ReadOnlyData; // size = 0x24 } Jump3ReadOnlyData; // size = 0x24
typedef struct { typedef struct {
@ -521,7 +642,11 @@ typedef struct {
/* 0x24 */ Jump3ReadWriteData rwData; /* 0x24 */ Jump3ReadWriteData rwData;
} Jump3; // size = 0x48 } Jump3; // size = 0x48
#define CAM_FUNCDATA_JUMP3(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, flags) \ #define JUMP3_FLAG_0 (1 << 0)
#define JUMP3_FLAG_2 (1 << 2)
#define JUMP3_FLAG_4 (1 << 4)
#define CAM_FUNCDATA_JUMP3(yOffset, eyeDist, eyeDistNext, pitchTarget, yawUpdateRateTarget, xzUpdateRateTarget, maxYawUpdate, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -531,7 +656,7 @@ typedef struct {
{ maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \ { maxYawUpdate, CAM_DATA_MAX_YAW_UPDATE }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
@ -545,7 +670,7 @@ typedef struct {
/* 0x20 */ f32 atLERPScaleOnGround; /* 0x20 */ f32 atLERPScaleOnGround;
/* 0x24 */ f32 yOffsetOffGround; /* 0x24 */ f32 yOffsetOffGround;
/* 0x28 */ f32 atLERPScaleOffGround; /* 0x28 */ f32 atLERPScaleOffGround;
/* 0x2C */ s16 flags; /* 0x2C */ s16 interfaceField;
} Battle1ReadOnlyData; // size = 0x30 } Battle1ReadOnlyData; // size = 0x30
typedef struct { typedef struct {
@ -566,7 +691,11 @@ typedef struct {
/* 0x30 */ Battle1ReadWriteData rwData; /* 0x30 */ Battle1ReadWriteData rwData;
} Battle1; // size = 0x50 } Battle1; // size = 0x50
#define CAM_FUNCDATA_BATT1(yOffset, eyeDist, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, flags, groundYOffset, groundAtLerpStepScale) \ #define BATTLE1_FLAG_0 (1 << 0)
#define BATTLE1_FLAG_1 (1 << 1)
#define BATTLE1_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_BATT1(yOffset, eyeDist, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, interfaceField, groundYOffset, groundAtLerpStepScale) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ swingYawInit, CAM_DATA_SWING_YAW_INIT }, \ { swingYawInit, CAM_DATA_SWING_YAW_INIT }, \
@ -576,7 +705,7 @@ typedef struct {
{ swingPitchAdj, CAM_DATA_SWING_PITCH_ADJ }, \ { swingPitchAdj, CAM_DATA_SWING_PITCH_ADJ }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS }, \ { interfaceField, CAM_DATA_INTERFACE_FIELD }, \
{ groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \ { groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \
{ groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE } { groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE }
@ -587,7 +716,7 @@ typedef struct {
/* 0x0C */ f32 lerpUpdateRate; /* 0x0C */ f32 lerpUpdateRate;
/* 0x10 */ f32 fovTarget; /* 0x10 */ f32 fovTarget;
/* 0x14 */ f32 atLERPTarget; /* 0x14 */ f32 atLERPTarget;
/* 0x18 */ s16 interfaceFlags; /* 0x18 */ s16 interfaceField;
/* 0x1A */ s16 unk_1A; /* 0x1A */ s16 unk_1A;
} Battle4ReadOnlyData; // size = 0x1C } Battle4ReadOnlyData; // size = 0x1C
@ -600,14 +729,14 @@ typedef struct {
/* 0x1C */ Battle4ReadWriteData rwData; /* 0x1C */ Battle4ReadWriteData rwData;
} Battle4; // size = 0x20 } Battle4; // size = 0x20
#define CAM_FUNCDATA_BATT4(yOffset, eyeDist, pitchTarget, yawUpdateRateTarget, fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_BATT4(yOffset, eyeDist, pitchTarget, yawUpdateRateTarget, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 unk_00; /* 0x00 */ f32 unk_00;
@ -622,7 +751,7 @@ typedef struct {
/* 0x24 */ f32 unk_24; /* 0x24 */ f32 unk_24;
/* 0x28 */ f32 unk_28; /* 0x28 */ f32 unk_28;
/* 0x2C */ f32 unk_2C; /* 0x2C */ f32 unk_2C;
/* 0x30 */ s16 interfaceFlags; /* 0x30 */ s16 interfaceField;
} KeepOn1ReadOnlyData; // size = 0x34 } KeepOn1ReadOnlyData; // size = 0x34
typedef struct { typedef struct {
@ -641,7 +770,10 @@ typedef struct {
/* 0x34 */ KeepOn1ReadWriteData rwData; /* 0x34 */ KeepOn1ReadWriteData rwData;
} KeepOn1; // size = 0x4C } KeepOn1; // size = 0x4C
#define CAM_FUNCDATA_KEEP1(yOffset, eyeDist, eyeDistNext, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, flags, groundYOffset, groundAtLerpStepScale) \ #define KEEPON1_FLAG_0 (1 << 0)
#define KEEPON1_FLAG_1 (1 << 1)
#define CAM_FUNCDATA_KEEP1(yOffset, eyeDist, eyeDistNext, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, interfaceField, groundYOffset, groundAtLerpStepScale) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -652,7 +784,7 @@ typedef struct {
{ swingPitchAdj, CAM_DATA_SWING_PITCH_ADJ }, \ { swingPitchAdj, CAM_DATA_SWING_PITCH_ADJ }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS }, \ { interfaceField, CAM_DATA_INTERFACE_FIELD }, \
{ groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \ { groundYOffset, CAM_DATA_GROUND_Y_OFFSET }, \
{ groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE } { groundAtLerpStepScale, CAM_DATA_GROUND_AT_LERP_STEP_SCALE }
@ -668,7 +800,7 @@ typedef struct {
/* 0x20 */ f32 fovTarget; /* 0x20 */ f32 fovTarget;
/* 0x24 */ f32 atLERPScaleMax; /* 0x24 */ f32 atLERPScaleMax;
/* 0x28 */ s16 initTimer; /* 0x28 */ s16 initTimer;
/* 0x2A */ s16 flags; /* 0x2A */ s16 interfaceField;
} KeepOn3ReadOnlyData; // size = 0x2C } KeepOn3ReadOnlyData; // size = 0x2C
typedef struct { typedef struct {
@ -685,7 +817,11 @@ typedef struct {
/* 0x2C */ KeepOn3ReadWriteData rwData; /* 0x2C */ KeepOn3ReadWriteData rwData;
} KeepOn3; // size = 0x4C } KeepOn3; // size = 0x4C
#define CAM_FUNCDATA_KEEP3(yOffset, eyeDist, eyeDistNext, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, yawUpdateRateTarget, flags) \ #define KEEPON3_FLAG_4 (1 << 4)
#define KEEPON3_FLAG_5 (1 << 5)
#define KEEPON3_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_KEEP3(yOffset, eyeDist, eyeDistNext, swingYawInit, swingYawFinal, swingPitchInit, swingPitchFinal, swingPitchAdj, fov, atLerpStepScale, yawUpdateRateTarget, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -697,7 +833,7 @@ typedef struct {
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 unk_00; /* 0x00 */ f32 unk_00;
@ -707,7 +843,7 @@ typedef struct {
/* 0x10 */ f32 unk_10; /* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14; /* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18; /* 0x18 */ f32 unk_18;
/* 0x1C */ s16 unk_1C; /* 0x1C */ s16 interfaceField;
/* 0x1E */ s16 unk_1E; /* 0x1E */ s16 unk_1E;
} KeepOn4ReadOnlyData; // size = 0x20 } KeepOn4ReadOnlyData; // size = 0x20
@ -727,14 +863,23 @@ typedef struct {
/* 0x20 */ KeepOn4ReadWriteData rwData; /* 0x20 */ KeepOn4ReadWriteData rwData;
} KeepOn4; // size = 0x38 } KeepOn4; // size = 0x38
#define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetZ, fov, flags, yawUpdateRateTarget, unk_22) \ #define KEEPON4_FLAG_0 (1 << 0)
#define KEEPON4_FLAG_1 (1 << 1)
#define KEEPON4_FLAG_2 (1 << 2)
#define KEEPON4_FLAG_3 (1 << 3)
#define KEEPON4_FLAG_4 (1 << 4)
#define KEEPON4_FLAG_5 (1 << 5)
#define KEEPON4_FLAG_6 (1 << 6)
#define KEEPON4_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetZ, fov, interfaceField, yawUpdateRateTarget, unk_22) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ yawTarget, CAM_DATA_YAW_TARGET }, \ { yawTarget, CAM_DATA_YAW_TARGET }, \
{ atOffsetZ, CAM_DATA_AT_OFFSET_Z }, \ { atOffsetZ, CAM_DATA_AT_OFFSET_Z }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS }, \ { interfaceField, CAM_DATA_INTERFACE_FIELD }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ unk_22, CAM_DATA_UNK_22 } { unk_22, CAM_DATA_UNK_22 }
@ -742,7 +887,7 @@ typedef struct {
/* 0x00 */ f32 fovScale; /* 0x00 */ f32 fovScale;
/* 0x04 */ f32 yawScale; /* 0x04 */ f32 yawScale;
/* 0x08 */ s16 timerInit; /* 0x08 */ s16 timerInit;
/* 0x0A */ s16 interfaceFlags; /* 0x0A */ s16 interfaceField;
} KeepOn0ReadOnlyData; // size = 0x0C } KeepOn0ReadOnlyData; // size = 0x0C
typedef struct { typedef struct {
@ -755,17 +900,17 @@ typedef struct {
/* 0x0C */ KeepOn0ReadWriteData rwData; /* 0x0C */ KeepOn0ReadWriteData rwData;
} KeepOn0; // size = 0x14 } KeepOn0; // size = 0x14
#define CAM_FUNCDATA_KEEP0(fovScale, yawScale, yawUpdateRateTarget, flags) \ #define CAM_FUNCDATA_KEEP0(fovScale, yawScale, yawUpdateRateTarget, interfaceField) \
{ fovScale, CAM_DATA_FOV_SCALE }, \ { fovScale, CAM_DATA_FOV_SCALE }, \
{ yawScale, CAM_DATA_YAW_SCALE }, \ { yawScale, CAM_DATA_YAW_SCALE }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 unk_00; // seems to be unused? /* 0x00 */ f32 unk_00; // seems to be unused?
/* 0x04 */ f32 lerpStep; /* 0x04 */ f32 lerpStep;
/* 0x08 */ f32 fov; /* 0x08 */ f32 fov;
/* 0x0C */ s16 interfaceFlags; /* 0x0C */ s16 interfaceField;
} Fixed1ReadOnlyData; // size = 0x10 } Fixed1ReadOnlyData; // size = 0x10
typedef struct { typedef struct {
@ -778,18 +923,18 @@ typedef struct {
/* 0x10 */ Fixed1ReadWriteData rwData; /* 0x10 */ Fixed1ReadWriteData rwData;
} Fixed1; // size = 0x28 } Fixed1; // size = 0x28
#define CAM_FUNCDATA_FIXD1(yOffset, yawUpdateRateTarget, fov, flags) \ #define CAM_FUNCDATA_FIXD1(yOffset, yawUpdateRateTarget, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
/* 0x04 */ f32 eyeStepScale; /* 0x04 */ f32 eyeStepScale;
/* 0x08 */ f32 posStepScale; /* 0x08 */ f32 posStepScale;
/* 0x0C */ f32 fov; /* 0x0C */ f32 fov;
/* 0x10 */ s16 interfaceFlags; /* 0x10 */ s16 interfaceField;
} Fixed2ReadOnlyData; // size = 0x14 } Fixed2ReadOnlyData; // size = 0x14
typedef struct { typedef struct {
@ -802,15 +947,18 @@ typedef struct {
/* 0x14 */ Fixed2ReadWriteData rwData; /* 0x14 */ Fixed2ReadWriteData rwData;
} Fixed2; // size = 0x24 } Fixed2; // size = 0x24
#define CAM_FUNCDATA_FIXD2(yOffset, yawUpdateRateTarget, xzUpdateRateTarget, fov, flags) \
#define FIXED2_FLAG_0 (1 << 0)
#define CAM_FUNCDATA_FIXD2(yOffset, yawUpdateRateTarget, xzUpdateRateTarget, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \ { xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Fixed3ReadOnlyData; // size = 0x4 } Fixed3ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -830,7 +978,7 @@ typedef struct {
/* 0x04 */ f32 speedToEyePos; /* 0x04 */ f32 speedToEyePos;
/* 0x08 */ f32 followSpeed; /* 0x08 */ f32 followSpeed;
/* 0x0C */ f32 fov; /* 0x0C */ f32 fov;
/* 0x10 */ s16 interfaceFlags; /* 0x10 */ s16 interfaceField;
} Fixed4ReadOnlyData; // size = 0x14 } Fixed4ReadOnlyData; // size = 0x14
typedef struct { typedef struct {
@ -843,12 +991,14 @@ typedef struct {
/* 0x14 */ Fixed4ReadWriteData rwData; /* 0x14 */ Fixed4ReadWriteData rwData;
} Fixed4; // size = 0x24 } Fixed4; // size = 0x24
#define CAM_FUNCDATA_FIXD4(yOffset, yawUpdateRateTarget, xzUpdateRateTarget, fov, flags) \ #define FIXED4_FLAG_2 (1 << 2)
#define CAM_FUNCDATA_FIXD4(yOffset, yawUpdateRateTarget, xzUpdateRateTarget, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \ { xzUpdateRateTarget, CAM_DATA_XZ_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 eyeNextYOffset; /* 0x00 */ f32 eyeNextYOffset;
@ -857,7 +1007,7 @@ typedef struct {
/* 0x0C */ f32 unk_0C; // unused /* 0x0C */ f32 unk_0C; // unused
/* 0x10 */ Vec3f atOffset; /* 0x10 */ Vec3f atOffset;
/* 0x1C */ f32 fovTarget; /* 0x1C */ f32 fovTarget;
/* 0x20 */ s16 interfaceFlags; /* 0x20 */ s16 interfaceField;
} Subj3ReadOnlyData; // size = 0x24 } Subj3ReadOnlyData; // size = 0x24
typedef struct { typedef struct {
@ -872,7 +1022,7 @@ typedef struct {
/* 0x24 */ Subj3ReadWriteData rwData; /* 0x24 */ Subj3ReadWriteData rwData;
} Subj3; // size = 0x30 } Subj3; // size = 0x30
#define CAM_FUNCDATA_SUBJ3(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, atOffsetX, atOffsetY, atOffsetZ, fov, flags) \ #define CAM_FUNCDATA_SUBJ3(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, atOffsetX, atOffsetY, atOffsetZ, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -881,10 +1031,10 @@ typedef struct {
{ atOffsetY, CAM_DATA_AT_OFFSET_Y }, \ { atOffsetY, CAM_DATA_AT_OFFSET_Y }, \
{ atOffsetZ, CAM_DATA_AT_OFFSET_Z }, \ { atOffsetZ, CAM_DATA_AT_OFFSET_Z }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Subj4ReadOnlyData; // size = 0x4 } Subj4ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -903,18 +1053,18 @@ typedef struct {
/* 0x04 */ Subj4ReadWriteData rwData; /* 0x04 */ Subj4ReadWriteData rwData;
} Subj4; // size = 0x38 } Subj4; // size = 0x38
#define CAM_FUNCDATA_SUBJ4(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, fov, flags) \ #define CAM_FUNCDATA_SUBJ4(yOffset, eyeDist, eyeDistNext, yawUpdateRateTarget, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ f32 yOffset; /* 0x0 */ f32 yOffset;
/* 0x4 */ f32 fov; /* 0x4 */ f32 fov;
/* 0x8 */ s16 interfaceFlags; /* 0x8 */ s16 interfaceField;
} Data4ReadOnlyData; // size = 0xC } Data4ReadOnlyData; // size = 0xC
typedef struct { typedef struct {
@ -929,10 +1079,10 @@ typedef struct {
/* 0x0C */ Data4ReadWriteData rwData; /* 0x0C */ Data4ReadWriteData rwData;
} Data4; // size = 0x2C } Data4; // size = 0x2C
#define CAM_FUNCDATA_DATA4(yOffset, fov, flags) \ #define CAM_FUNCDATA_DATA4(yOffset, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
@ -942,7 +1092,7 @@ typedef struct {
/* 0x10 */ f32 fovTarget; /* 0x10 */ f32 fovTarget;
/* 0x14 */ f32 atLERPScaleMax; /* 0x14 */ f32 atLERPScaleMax;
/* 0x18 */ s16 pitchTarget; /* 0x18 */ s16 pitchTarget;
/* 0x1A */ s16 interfaceFlags; /* 0x1A */ s16 interfaceField;
} Unique1ReadOnlyData; // size = 0x1C } Unique1ReadOnlyData; // size = 0x1C
typedef struct { typedef struct {
@ -957,20 +1107,20 @@ typedef struct {
/* 0x1C */ Unique1ReadWriteData rwData; /* 0x1C */ Unique1ReadWriteData rwData;
} Unique1; // size = 0x28 } Unique1; // size = 0x28
#define CAM_FUNCDATA_UNIQ1(yOffset, eyeDist, eyeDistNext, pitchTarget, fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_UNIQ1(yOffset, eyeDist, eyeDistNext, pitchTarget, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
/* 0x04 */ f32 distTarget; /* 0x04 */ f32 distTarget;
/* 0x08 */ f32 fovTarget; /* 0x08 */ f32 fovTarget;
/* 0x0C */ s16 interfaceFlags; /* 0x0C */ s16 interfaceField;
} Unique2ReadOnlyData; // size = 0x10 } Unique2ReadOnlyData; // size = 0x10
typedef struct { typedef struct {
@ -983,11 +1133,15 @@ typedef struct {
/* 0x10 */ Unique2ReadWriteData rwData; /* 0x10 */ Unique2ReadWriteData rwData;
} Unique2; // size = 0x18 } Unique2; // size = 0x18
#define CAM_FUNCDATA_UNIQ2(yOffset, eyeDist, fov, flags) \ #define UNIQUE2_FLAG_0 (1 << 0)
#define UNIQUE2_FLAG_1 (1 << 1)
#define UNIQUE2_FLAG_4 (1 << 4)
#define CAM_FUNCDATA_UNIQ2(yOffset, eyeDist, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ struct Actor* doorActor; /* 0x0 */ struct Actor* doorActor;
@ -1000,7 +1154,7 @@ typedef struct {
typedef struct { typedef struct {
/* 0x0 */ f32 yOffset; /* 0x0 */ f32 yOffset;
/* 0x4 */ f32 fov; /* 0x4 */ f32 fov;
/* 0x8 */ s16 interfaceFlags; /* 0x8 */ s16 interfaceField;
} Unique3ReadOnlyData; // size = 0xC } Unique3ReadOnlyData; // size = 0xC
typedef struct { typedef struct {
@ -1013,13 +1167,16 @@ typedef struct {
/* 0x0C */ Unique3ReadWriteData rwData; /* 0x0C */ Unique3ReadWriteData rwData;
} Unique3; // size = 0x14 } Unique3; // size = 0x14
#define CAM_FUNCDATA_UNIQ3(yOffset, fov, flags) \ #define UNIQUE3_FLAG_1 (1 << 1)
#define UNIQUE3_FLAG_2 (1 << 2)
#define CAM_FUNCDATA_UNIQ3(yOffset, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Unique0ReadOnlyData; // size = 0x4 } Unique0ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -1033,17 +1190,21 @@ typedef struct {
/* 0x04 */ Unique0ReadWriteData rwData; /* 0x04 */ Unique0ReadWriteData rwData;
} Unique0; // size = 0x2C } Unique0; // size = 0x2C
#define UNIQUE0_FLAG_0 (1 << 0)
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Unique6ReadOnlyData; // size = 0x4 } Unique6ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
/* 0x0 */ Unique6ReadOnlyData roData; /* 0x0 */ Unique6ReadOnlyData roData;
} Unique6; // size = 0x4 } Unique6; // size = 0x4
#define UNIQUE6_FLAG_0 (1 << 0)
typedef struct { typedef struct {
/* 0x0 */ f32 fov; /* 0x0 */ f32 fov;
/* 0x4 */ s16 interfaceFlags; /* 0x4 */ s16 interfaceField;
/* 0x6 */ s16 align; /* 0x6 */ s16 align;
} Unique7ReadOnlyData; // size = 0x8 } Unique7ReadOnlyData; // size = 0x8
@ -1056,9 +1217,9 @@ typedef struct {
/* 0x08 */ Unique7ReadWriteData rwData; /* 0x08 */ Unique7ReadWriteData rwData;
} Unique7; // size = 0x10 } Unique7; // size = 0x10
#define CAM_FUNCDATA_UNIQ7(fov, flags) \ #define CAM_FUNCDATA_UNIQ7(fov, interfaceField) \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
/** initFlags /** initFlags
* & 0x00FF = atInitFlags * & 0x00FF = atInitFlags
@ -1091,7 +1252,7 @@ typedef struct {
} OnePointCsInfo; // size = 0x8 } OnePointCsInfo; // size = 0x8
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Unique9ReadOnlyData; // size = 0x40 } Unique9ReadOnlyData; // size = 0x40
typedef struct { typedef struct {
@ -1115,7 +1276,7 @@ typedef struct {
} Unique9; // size = 0x4C } Unique9; // size = 0x4C
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Demo1ReadOnlyData; // size = 0x4 } Demo1ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -1131,7 +1292,7 @@ typedef struct {
typedef struct { typedef struct {
/* 0x0 */ f32 fov; /* 0x0 */ f32 fov;
/* 0x4 */ f32 unk_04; // unused /* 0x4 */ f32 unk_04; // unused
/* 0x8 */ s16 interfaceFlags; /* 0x8 */ s16 interfaceField;
} Demo3ReadOnlyData; // size = 0xC } Demo3ReadOnlyData; // size = 0xC
typedef struct { typedef struct {
@ -1146,13 +1307,13 @@ typedef struct {
/* 0x0C */ Demo3ReadWriteData rwData; /* 0x0C */ Demo3ReadWriteData rwData;
} Demo3; // size = 0x20 } Demo3; // size = 0x20
#define CAM_FUNCDATA_DEMO3(fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_DEMO3(fov, atLerpStepScale, interfaceField) \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
/* 0x2 */ s16 unk_02; /* 0x2 */ s16 unk_02;
} Demo6ReadOnlyData; // size = 0x4 } Demo6ReadOnlyData; // size = 0x4
@ -1174,7 +1335,7 @@ typedef struct {
} OnePointCamData; // size = 0xC } OnePointCamData; // size = 0xC
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Demo9ReadOnlyData; // size = 0x4 } Demo9ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -1191,18 +1352,21 @@ typedef struct {
/* 0x10 */ Demo9ReadWriteData rwData; /* 0x10 */ Demo9ReadWriteData rwData;
} Demo9; // size = 0x1C } Demo9; // size = 0x1C
#define DEMO9_FLAG_1 (1 << 1)
#define DEMO9_FLAG_4 (1 << 4)
typedef struct { typedef struct {
/* 0x0 */ f32 lerpAtScale; /* 0x0 */ f32 lerpAtScale;
/* 0x4 */ s16 interfaceFlags; /* 0x4 */ s16 interfaceField;
} Special0ReadOnlyData; // size = 0x8 } Special0ReadOnlyData; // size = 0x8
typedef struct { typedef struct {
/* 0x0 */ Special0ReadOnlyData roData; /* 0x0 */ Special0ReadOnlyData roData;
} Special0; // size = 0x8 } Special0; // size = 0x8
#define CAM_FUNCDATA_SPEC0(yawUpdateRateTarget, flags) \ #define CAM_FUNCDATA_SPEC0(yawUpdateRateTarget, interfaceField) \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 initalTimer; /* 0x0 */ s16 initalTimer;
@ -1220,7 +1384,7 @@ typedef struct {
/* 0x10 */ f32 atMaxLERPScale; /* 0x10 */ f32 atMaxLERPScale;
/* 0x14 */ s16 timerInit; /* 0x14 */ s16 timerInit;
/* 0x16 */ s16 pitch; /* 0x16 */ s16 pitch;
/* 0x18 */ s16 interfaceFlags; /* 0x18 */ s16 interfaceField;
/* 0x1A */ s16 unk_1A; /* 0x1A */ s16 unk_1A;
} Special5ReadOnlyData; // size = 0x1C } Special5ReadOnlyData; // size = 0x1C
@ -1233,7 +1397,7 @@ typedef struct {
/* 0x1C */ Special5ReadWriteData rwData; /* 0x1C */ Special5ReadWriteData rwData;
} Special5; // size = 0x20 } Special5; // size = 0x20
#define CAM_FUNCDATA_SPEC5(yOffset, eyeDist, eyeDistNext, unk_22, pitchTarget, fov, atLerpStepScale, flags) \ #define CAM_FUNCDATA_SPEC5(yOffset, eyeDist, eyeDistNext, unk_22, pitchTarget, fov, atLerpStepScale, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -1241,10 +1405,10 @@ typedef struct {
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
// Uses incorrect CAM_DATA values // Uses incorrect CAM_DATA values
#define CAM_FUNCDATA_SPEC5_ALT(yOffset, eyeDist, eyeDistNext, pitchTarget, fov, atLerpStepScale, unk_22, flags) \ #define CAM_FUNCDATA_SPEC5_ALT(yOffset, eyeDist, eyeDistNext, pitchTarget, fov, atLerpStepScale, unk_22, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
@ -1252,7 +1416,7 @@ typedef struct {
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ unk_22, CAM_DATA_UNK_22 }, \ { unk_22, CAM_DATA_UNK_22 }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct { typedef struct {
/* 0x0 */ s16 index; // See `CamElevatorPlatform` /* 0x0 */ s16 index; // See `CamElevatorPlatform`
@ -1263,7 +1427,7 @@ typedef struct {
} Special7; // size = 0x4 } Special7; // size = 0x4
typedef struct { typedef struct {
/* 0x0 */ s16 interfaceFlags; /* 0x0 */ s16 interfaceField;
} Special6ReadOnlyData; // size = 0x4 } Special6ReadOnlyData; // size = 0x4
typedef struct { typedef struct {
@ -1279,7 +1443,7 @@ typedef struct {
typedef struct { typedef struct {
/* 0x0 */ f32 yOffset; /* 0x0 */ f32 yOffset;
/* 0x4 */ f32 unk_04; /* 0x4 */ f32 unk_04;
/* 0x8 */ s16 interfaceFlags; /* 0x8 */ s16 interfaceField;
/* 0xA */ s16 unk_0A; /* 0xA */ s16 unk_0A;
} Special9ReadOnlyData; // size = 0xC } Special9ReadOnlyData; // size = 0xC
@ -1292,10 +1456,14 @@ typedef struct {
/* 0x0C */ Special9ReadWriteData rwData; /* 0x0C */ Special9ReadWriteData rwData;
} Special9; // size = 0x10 } Special9; // size = 0x10
#define CAM_FUNCDATA_SPEC9(yOffset, fov, flags) \ #define SPECIAL9_FLAG_0 (1 << 0)
#define SPECIAL9_FLAG_1 (1 << 1)
#define SPECIAL9_FLAG_3 (1 << 3)
#define CAM_FUNCDATA_SPEC9(yOffset, fov, interfaceField) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ flags, CAM_DATA_FLAGS } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef union { typedef union {
Normal1 norm1; Normal1 norm1;
@ -1394,8 +1562,8 @@ typedef struct Camera {
/* 0x144 */ s16 mode; /* 0x144 */ s16 mode;
/* 0x146 */ s16 bgId; // bgId the camera is currently interacting with /* 0x146 */ s16 bgId; // bgId the camera is currently interacting with
/* 0x148 */ s16 bgCamIndex; /* 0x148 */ s16 bgCamIndex;
/* 0x14A */ s16 unk_14A; /* 0x14A */ s16 behaviorFlags; // includes flags on settings, modes, bgCam. All related to camera update behaviour
/* 0x14C */ s16 unk_14C; /* 0x14C */ s16 stateFlags;
/* 0x14E */ s16 childCamId; /* 0x14E */ s16 childCamId;
/* 0x150 */ s16 waterDistortionTimer; /* 0x150 */ s16 waterDistortionTimer;
/* 0x152 */ s16 distortionFlags; /* 0x152 */ s16 distortionFlags;
@ -1403,7 +1571,7 @@ typedef struct Camera {
/* 0x156 */ s16 nextBgCamIndex; /* 0x156 */ s16 nextBgCamIndex;
/* 0x158 */ s16 nextBgId; /* 0x158 */ s16 nextBgId;
/* 0x15A */ s16 roll; /* 0x15A */ s16 roll;
/* 0x15C */ s16 paramFlags; /* 0x15C */ s16 viewFlags; // For setting params: at, eye, up, target, targetPos, fov, roll
/* 0x15E */ s16 animState; /* 0x15E */ s16 animState;
/* 0x160 */ s16 timer; /* 0x160 */ s16 timer;
/* 0x162 */ s16 parentCamId; /* 0x162 */ s16 parentCamId;

View file

@ -388,12 +388,12 @@ typedef enum {
#define ENTR_LOAD_OPENING -1 #define ENTR_LOAD_OPENING -1
typedef enum { typedef enum {
/* 0x7FF9 */ ENTR_RETURN_YOUSEI_IZUMI_YOKO = 0x7FF9, // Great Fairy Fountain (spells) /* 0x7FF9 */ ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS = 0x7FF9,
/* 0x7FFA */ ENTR_RETURN_SYATEKIJYOU, // Shooting gallery /* 0x7FFA */ ENTR_RETURN_SHOOTING_GALLERY,
/* 0x7FFB */ ENTR_RETURN_2, // unused /* 0x7FFB */ ENTR_RETURN_2, // unused
/* 0x7FFC */ ENTR_RETURN_SHOP1, // Bazaar /* 0x7FFC */ ENTR_RETURN_BAZAAR,
/* 0x7FFD */ ENTR_RETURN_4, // unused /* 0x7FFD */ ENTR_RETURN_4, // unused
/* 0x7FFE */ ENTR_RETURN_DAIYOUSEI_IZUMI, // Great Fairy Fountain (magic, double magic, double defense) /* 0x7FFE */ ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC,
/* 0x7FFF */ ENTR_RETURN_GROTTO // Grottos and normal Fairy Fountain /* 0x7FFF */ ENTR_RETURN_GROTTO // Grottos and normal Fairy Fountain
} ReturnEntranceIndex; } ReturnEntranceIndex;
@ -416,13 +416,13 @@ typedef enum {
/* 15 */ SDC_DEATH_MOUNTAIN_CRATER, /* 15 */ SDC_DEATH_MOUNTAIN_CRATER,
/* 16 */ SDC_GORON_CITY, /* 16 */ SDC_GORON_CITY,
/* 17 */ SDC_LON_LON_RANCH, /* 17 */ SDC_LON_LON_RANCH,
/* 18 */ SDC_FIRE_TEMPLE, // used for Fire Temple and its boss scene /* 18 */ SDC_FIRE_TEMPLE,
/* 19 */ SDC_DEKU_TREE, /* 19 */ SDC_DEKU_TREE,
/* 20 */ SDC_DODONGOS_CAVERN, /* 20 */ SDC_DODONGOS_CAVERN,
/* 21 */ SDC_JABU_JABU, // used for Jabu-Jabu and its boss scene /* 21 */ SDC_JABU_JABU,
/* 22 */ SDC_FOREST_TEMPLE, /* 22 */ SDC_FOREST_TEMPLE,
/* 23 */ SDC_WATER_TEMPLE, /* 23 */ SDC_WATER_TEMPLE,
/* 24 */ SDC_SHADOW_TEMPLE, // used for Bottom Of The Well, Shadow Temple and its boss scene /* 24 */ SDC_SHADOW_TEMPLE_AND_WELL,
/* 25 */ SDC_SPIRIT_TEMPLE, /* 25 */ SDC_SPIRIT_TEMPLE,
/* 26 */ SDC_INSIDE_GANONS_CASTLE, /* 26 */ SDC_INSIDE_GANONS_CASTLE,
/* 27 */ SDC_GERUDO_TRAINING_GROUND, /* 27 */ SDC_GERUDO_TRAINING_GROUND,
@ -431,13 +431,13 @@ typedef enum {
/* 30 */ SDC_TEMPLE_OF_TIME, /* 30 */ SDC_TEMPLE_OF_TIME,
/* 31 */ SDC_GROTTOS, /* 31 */ SDC_GROTTOS,
/* 32 */ SDC_CHAMBER_OF_THE_SAGES, /* 32 */ SDC_CHAMBER_OF_THE_SAGES,
/* 33 */ SDC_GREAT_FAIRYS_FOUNTAIN, // used for both Great Fairy Fountains scenes /* 33 */ SDC_GREAT_FAIRYS_FOUNTAIN,
/* 34 */ SDC_SHOOTING_GALLERY, /* 34 */ SDC_SHOOTING_GALLERY,
/* 35 */ SDC_CASTLE_COURTYARD_GUARDS, // used for Castle Courtyard (with the hedges) (day, night and debug scenes) /* 35 */ SDC_CASTLE_COURTYARD_GUARDS,
/* 36 */ SDC_OUTSIDE_GANONS_CASTLE, // used for two scenes /* 36 */ SDC_OUTSIDE_GANONS_CASTLE,
/* 37 */ SDC_ICE_CAVERN, /* 37 */ SDC_ICE_CAVERN,
/* 38 */ SDC_GANONS_TOWER_COLLAPSE_EXTERIOR, /* 38 */ SDC_GANONS_TOWER_COLLAPSE_EXTERIOR,
/* 39 */ SDC_FAIRYS_FOUNTAIN, // used for both Fairy Fountains scenes /* 39 */ SDC_FAIRYS_FOUNTAIN,
/* 40 */ SDC_THIEVES_HIDEOUT, /* 40 */ SDC_THIEVES_HIDEOUT,
/* 41 */ SDC_BOMBCHU_BOWLING_ALLEY, /* 41 */ SDC_BOMBCHU_BOWLING_ALLEY,
/* 42 */ SDC_ROYAL_FAMILYS_TOMB, /* 42 */ SDC_ROYAL_FAMILYS_TOMB,
@ -445,8 +445,8 @@ typedef enum {
/* 44 */ SDC_LON_LON_BUILDINGS, /* 44 */ SDC_LON_LON_BUILDINGS,
/* 45 */ SDC_MARKET_GUARD_HOUSE, /* 45 */ SDC_MARKET_GUARD_HOUSE,
/* 46 */ SDC_POTION_SHOP_GRANNY, /* 46 */ SDC_POTION_SHOP_GRANNY,
/* 47 */ SDC_CALM_WATER, // used for Castle Courtyard (with Zelda), Sacred Forest Meadow, and debug Jungle Gym /* 47 */ SDC_CALM_WATER,
/* 48 */ SDC_GRAVE_EXIT_LIGHT_SHINING, // used for one grave scene and the Dampé race scene /* 48 */ SDC_GRAVE_EXIT_LIGHT_SHINING,
/* 49 */ SDC_BESITU, /* 49 */ SDC_BESITU,
/* 50 */ SDC_FISHING_POND, /* 50 */ SDC_FISHING_POND,
/* 51 */ SDC_GANONS_TOWER_COLLAPSE_INTERIOR, /* 51 */ SDC_GANONS_TOWER_COLLAPSE_INTERIOR,

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1430,7 +1430,7 @@ s32 Cutscene_Command_07(PlayState* play, CutsceneContext* csCtx, u8* cmd, u8 unu
Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE); Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE);
Play_CameraChangeSetting(play, csCtx->subCamId, CAM_SET_FREE0); Play_CameraChangeSetting(play, csCtx->subCamId, CAM_SET_FREE0);
sp28 = csCtx->subCamLookAtPoints->cameraRoll * 1.40625f; sp28 = csCtx->subCamLookAtPoints->cameraRoll * 1.40625f;
Camera_SetParam(subCam, 64, &sp28); Camera_SetViewParam(subCam, CAM_VIEW_ROLL, &sp28);
sp3C.x = csCtx->subCamLookAtPoints->pos.x; sp3C.x = csCtx->subCamLookAtPoints->pos.x;
sp3C.y = csCtx->subCamLookAtPoints->pos.y; sp3C.y = csCtx->subCamLookAtPoints->pos.y;
sp3C.z = csCtx->subCamLookAtPoints->pos.z; sp3C.z = csCtx->subCamLookAtPoints->pos.z;

View file

@ -1700,7 +1700,8 @@ void Environment_DrawRain(PlayState* play, View* view, GraphicsContext* gfxCtx)
Vec3f windDirection = { 0.0f, 0.0f, 0.0f }; Vec3f windDirection = { 0.0f, 0.0f, 0.0f };
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
if (!(play->cameraPtrs[0]->unk_14C & 0x100) && (play->envCtx.precipitation[PRECIP_SNOW_CUR] == 0)) { if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_8) &&
(play->envCtx.precipitation[PRECIP_SNOW_CUR] == 0)) {
OPEN_DISPS(gfxCtx, "../z_kankyo.c", 2799); OPEN_DISPS(gfxCtx, "../z_kankyo.c", 2799);
vec.x = view->at.x - view->eye.x; vec.x = view->at.x - view->eye.x;

View file

@ -482,7 +482,7 @@ s32 OnePointCutscene_SetInfo(PlayState* play, s16 subCamId, s16 csId, Actor* act
case 3120: case 3120:
csInfo->keyFrames = D_80121954[-(timer + 101)]; csInfo->keyFrames = D_80121954[-(timer + 101)];
subCam->timer = 100; subCam->timer = 100;
subCam->unk_14C |= 2; subCam->stateFlags |= CAM_STATE_1;
csInfo->keyFrameCnt = 2; csInfo->keyFrameCnt = 2;
func_8002DF54(play, NULL, 8); func_8002DF54(play, NULL, 8);
@ -494,7 +494,7 @@ s32 OnePointCutscene_SetInfo(PlayState* play, s16 subCamId, s16 csId, Actor* act
func_8002DF54(play, NULL, 8); func_8002DF54(play, NULL, 8);
func_800C0808(play, subCamId, player, CAM_SET_CS_C); func_800C0808(play, subCamId, player, CAM_SET_CS_C);
subCam->unk_14C |= 2; subCam->stateFlags |= CAM_STATE_1;
break; break;
case 3140: case 3140:
D_80121C24[0].atTargetInit = play->view.at; D_80121C24[0].atTargetInit = play->view.at;
@ -1266,7 +1266,7 @@ s32 OnePointCutscene_Attention(PlayState* play, Actor* actor) {
sUnused = -1; sUnused = -1;
parentCam = play->cameraPtrs[CAM_ID_MAIN]; parentCam = play->cameraPtrs[CAM_ID_MAIN];
if (parentCam->mode == CAM_MODE_FOLLOWBOOMERANG) { if (parentCam->mode == CAM_MODE_FOLLOW_BOOMERANG) {
osSyncPrintf(VT_COL(YELLOW, BLACK) "actor attention demo camera: change mode BOOKEEPON -> NORMAL\n" VT_RST); osSyncPrintf(VT_COL(YELLOW, BLACK) "actor attention demo camera: change mode BOOKEEPON -> NORMAL\n" VT_RST);
Camera_ChangeMode(parentCam, CAM_MODE_NORMAL); Camera_ChangeMode(parentCam, CAM_MODE_NORMAL);
} }

View file

@ -255,7 +255,8 @@ void Play_Init(GameState* thisx) {
this->cameraPtrs[CAM_ID_MAIN] = &this->mainCamera; this->cameraPtrs[CAM_ID_MAIN] = &this->mainCamera;
this->cameraPtrs[CAM_ID_MAIN]->uid = 0; this->cameraPtrs[CAM_ID_MAIN]->uid = 0;
this->activeCamId = CAM_ID_MAIN; this->activeCamId = CAM_ID_MAIN;
func_8005AC48(&this->mainCamera, 0xFF); Camera_OverwriteStateFlags(&this->mainCamera, CAM_STATE_0 | CAM_STATE_1 | CAM_STATE_2 | CAM_STATE_3 | CAM_STATE_4 |
CAM_STATE_5 | CAM_STATE_6 | CAM_STATE_7);
Sram_Init(this, &this->sramCtx); Sram_Init(this, &this->sramCtx);
Regs_InitData(this); Regs_InitData(this);
Message_Init(this); Message_Init(this);
@ -1548,9 +1549,9 @@ s32 Play_CameraSetAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
Camera* camera = this->cameraPtrs[camIdx]; Camera* camera = this->cameraPtrs[camIdx];
Player* player; Player* player;
ret |= Camera_SetParam(camera, 1, at); ret |= Camera_SetViewParam(camera, CAM_VIEW_AT, at);
ret <<= 1; ret <<= 1;
ret |= Camera_SetParam(camera, 2, eye); ret |= Camera_SetViewParam(camera, CAM_VIEW_EYE, eye);
camera->dist = Math3D_Vec3f_DistXYZ(at, eye); camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
@ -1574,11 +1575,11 @@ s32 Play_CameraSetAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
Camera* camera = this->cameraPtrs[camIdx]; Camera* camera = this->cameraPtrs[camIdx];
Player* player; Player* player;
ret |= Camera_SetParam(camera, 1, at); ret |= Camera_SetViewParam(camera, CAM_VIEW_AT, at);
ret <<= 1; ret <<= 1;
ret |= Camera_SetParam(camera, 2, eye); ret |= Camera_SetViewParam(camera, CAM_VIEW_EYE, eye);
ret <<= 1; ret <<= 1;
ret |= Camera_SetParam(camera, 4, up); ret |= Camera_SetViewParam(camera, CAM_VIEW_UP, up);
camera->dist = Math3D_Vec3f_DistXYZ(at, eye); camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
@ -1597,7 +1598,7 @@ s32 Play_CameraSetAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
} }
s32 Play_CameraSetFov(PlayState* this, s16 camId, f32 fov) { s32 Play_CameraSetFov(PlayState* this, s16 camId, f32 fov) {
s32 ret = Camera_SetParam(this->cameraPtrs[camId], 0x20, &fov) & 1; s32 ret = Camera_SetViewParam(this->cameraPtrs[camId], CAM_VIEW_FOV, &fov) & 1;
if (1) {} if (1) {}
return ret; return ret;

View file

@ -624,8 +624,8 @@ void func_8008EEAC(PlayState* play, Actor* actor) {
this->unk_664 = actor; this->unk_664 = actor;
this->unk_684 = actor; this->unk_684 = actor;
this->stateFlags1 |= PLAYER_STATE1_16; this->stateFlags1 |= PLAYER_STATE1_16;
Camera_SetParam(Play_GetCamera(play, CAM_ID_MAIN), 8, actor); Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, actor);
Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_FOLLOWTARGET); Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_Z_TARGET_FRIENDLY);
} }
s32 func_8008EF30(PlayState* play) { s32 func_8008EF30(PlayState* play) {

View file

@ -111,7 +111,7 @@ void* D_8012A2F8[] = {
gYdanTex_00CA18, gYdanTex_00CA18,
}; };
void Scene_DrawConfigYdan(PlayState* play) { void Scene_DrawConfigDekuTree(PlayState* play) {
u32 gameplayFrames = play->gameplayFrames; u32 gameplayFrames = play->gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4763); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4763);
@ -129,7 +129,7 @@ void Scene_DrawConfigYdan(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4783); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4783);
} }
void Scene_DrawConfigYdanBoss(PlayState* play) { void Scene_DrawConfigDekuTreeBoss(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4845); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4845);
@ -154,7 +154,7 @@ void* sDCLavaFloorTextures[] = {
gDCLavaFloor5Tex, gDCLavaFloor6Tex, gDCLavaFloor7Tex, gDCLavaFloor8Tex, gDCLavaFloor5Tex, gDCLavaFloor6Tex, gDCLavaFloor7Tex, gDCLavaFloor8Tex,
}; };
void Scene_DrawConfigDdan(PlayState* play) { void Scene_DrawConfigDodongosCavern(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
s32 pad; s32 pad;
Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 2 * sizeof(Gfx[3])); Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 2 * sizeof(Gfx[3]));
@ -190,7 +190,7 @@ void Scene_DrawConfigDdan(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4956); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4956);
} }
void Scene_DrawConfigTokinoma(PlayState* play) { void Scene_DrawConfigTempleOfTime(PlayState* play) {
f32 temp; f32 temp;
Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 18 * sizeof(Gfx)); Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 18 * sizeof(Gfx));
@ -251,7 +251,7 @@ void Scene_DrawConfigTokinoma(PlayState* play) {
} }
} }
void Scene_DrawConfigKakusiana(PlayState* play) { void Scene_DrawConfigGrottos(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5171); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5171);
@ -282,7 +282,7 @@ void Scene_DrawConfigKakusiana(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5212); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5212);
} }
void Scene_DrawConfigKenjyanoma(PlayState* play) { void Scene_DrawConfigChamberOfTheSages(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5226); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5226);
@ -351,7 +351,7 @@ void Scene_DrawConfigGraveExitLightShining(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5330); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5330);
} }
void Scene_DrawConfigFairyFountain(PlayState* play) { void Scene_DrawConfigFairysFountain(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5346); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5346);
@ -372,7 +372,7 @@ void Scene_DrawConfigFairyFountain(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5367); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5367);
} }
void Scene_DrawConfigHakadan(PlayState* play) { void Scene_DrawConfigShadowTempleAndWell(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5384); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5384);
@ -403,7 +403,7 @@ void* sThievesHideoutEntranceTextures[] = {
gThievesHideoutNightEntranceTex, gThievesHideoutNightEntranceTex,
}; };
void Scene_DrawConfigGerudoway(PlayState* play) { void Scene_DrawConfigThievesHideout(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5490); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5490);
@ -422,7 +422,7 @@ void* D_8012A330[] = {
gWaterTempleNightEntranceTex, gWaterTempleNightEntranceTex,
}; };
void Scene_DrawConfigMizusin(PlayState* play) { void Scene_DrawConfigWaterTemple(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
s32 spB0; s32 spB0;
s32 spAC; s32 spAC;
@ -491,7 +491,7 @@ void Scene_DrawConfigMizusin(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5644); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5644);
} }
void Scene_DrawConfigMizusinBs(PlayState* play) { void Scene_DrawConfigWaterTempleBoss(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5791); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5791);
@ -509,7 +509,7 @@ void Scene_DrawConfigMizusinBs(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5808); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5808);
} }
void Scene_DrawConfigSyatekijyou(PlayState* play) { void Scene_DrawConfigShootingGallery(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5822); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5822);
@ -523,7 +523,7 @@ void Scene_DrawConfigSyatekijyou(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5836); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5836);
} }
void Scene_DrawConfigHairalNiwa(PlayState* play) { void Scene_DrawConfigCastleCourtyardGuards(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5850); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5850);
@ -547,7 +547,7 @@ void Scene_DrawConfigHairalNiwa(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5876); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5876);
} }
void Scene_DrawConfigGanonCastleExterior(PlayState* play) { void Scene_DrawConfigOutsideGanonsCastle(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
s8 sp83; s8 sp83;
@ -603,7 +603,7 @@ void func_8009BEEC(PlayState* play) {
} }
} }
void Scene_DrawConfigGanonFinal(PlayState* play) { void Scene_DrawConfigGanonsTowerCollapseExterior(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
s8 sp7B; s8 sp7B;
@ -650,7 +650,7 @@ void* sIceCavernEntranceTextures[] = {
gIceCavernNightEntranceTex, gIceCavernNightEntranceTex,
}; };
void Scene_DrawConfigIceDoukuto(PlayState* play) { void Scene_DrawConfigIceCavern(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
if (0) {} // Necessary to match if (0) {} // Necessary to match
@ -678,7 +678,7 @@ void Scene_DrawConfigIceDoukuto(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6076); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6076);
} }
void Scene_DrawConfigHakaanaOuke(PlayState* play) { void Scene_DrawConfigRoyalFamilysTomb(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6151); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6151);
@ -704,7 +704,7 @@ void Scene_DrawConfigHakaanaOuke(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6187); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6187);
} }
void Scene_DrawConfigHyliaLabo(PlayState* play) { void Scene_DrawConfigLakesideLaboratory(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6201); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6201);
@ -753,7 +753,7 @@ void* sGTGEntranceTextures[] = {
gGTGNightEntranceTex, gGTGNightEntranceTex,
}; };
void Scene_DrawConfigMen(PlayState* play) { void Scene_DrawConfigGerudoTrainingGround(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
if (0) {} // Necessary to match if (0) {} // Necessary to match
@ -799,7 +799,7 @@ Gfx* Gfx_TwoTexScrollPrimColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y
return displayList; return displayList;
} }
void Scene_DrawConfigTuribori(PlayState* play) { void Scene_DrawConfigFishingPond(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6433); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6433);
@ -819,7 +819,7 @@ void Scene_DrawConfigTuribori(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6449); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6449);
} }
void Scene_DrawConfigBowling(PlayState* play) { void Scene_DrawConfigBombchuBowlingAlley(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6463); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6463);
@ -846,7 +846,7 @@ void* sLonLonHouseEntranceTextures[] = {
gLonLonHouseNightEntranceTex, gLonLonHouseNightEntranceTex,
}; };
void Scene_DrawConfigSouko(PlayState* play) { void Scene_DrawConfigLonLonBuildings(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6515); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6515);
gSPSegment(POLY_XLU_DISP++, 0x08, gSPSegment(POLY_XLU_DISP++, 0x08,
@ -870,7 +870,7 @@ void* sGuardHouseView1Textures[] = {
gGuardHouseOutSideView2NightTex, gGuardHouseOutSideView2NightTex,
}; };
void Scene_DrawConfigMiharigoya(PlayState* play) { void Scene_DrawConfigMarketGuardHouse(PlayState* play) {
s32 var; s32 var;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6560); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6560);
@ -893,7 +893,7 @@ void Scene_DrawConfigMiharigoya(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6581); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6581);
} }
void Scene_DrawConfigMahouya(PlayState* play) { void Scene_DrawConfigPotionShopGranny(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6595); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6595);
@ -918,7 +918,7 @@ void* sForestTempleEntranceTextures[] = {
gForestTempleNightEntranceTex, gForestTempleNightEntranceTex,
}; };
void Scene_DrawConfigBmori1(PlayState* play) { void Scene_DrawConfigForestTemple(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
if (0) {} // Necessary to match if (0) {} // Necessary to match
@ -951,7 +951,7 @@ void* sSpiritTempleEntranceTextures[] = {
gSpiritTempleNightEntranceTex, gSpiritTempleNightEntranceTex,
}; };
void Scene_DrawConfigJyasinzou(PlayState* play) { void Scene_DrawConfigSpiritTemple(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6752); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6752);
gSPSegment(POLY_XLU_DISP++, 0x08, gSPSegment(POLY_XLU_DISP++, 0x08,
@ -960,7 +960,7 @@ void Scene_DrawConfigJyasinzou(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6762); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6762);
} }
void Scene_DrawConfigSpot00(PlayState* play) { void Scene_DrawConfigHyruleField(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
Gfx* displayListHead; Gfx* displayListHead;
@ -1012,7 +1012,7 @@ void* sKakarikoWindowTextures[] = {
gKakarikoVillageNightWindowTex, gKakarikoVillageNightWindowTex,
}; };
void Scene_DrawConfigSpot01(PlayState* play) { void Scene_DrawConfigKakarikoVillage(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6890); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6890);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sKakarikoWindowTextures[((void)0, gSaveContext.nightFlag)])); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sKakarikoWindowTextures[((void)0, gSaveContext.nightFlag)]));
@ -1026,7 +1026,7 @@ void Scene_DrawConfigSpot01(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6903); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6903);
} }
void Scene_DrawConfigSpot03(PlayState* play) { void Scene_DrawConfigZorasRiver(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6917); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6917);
@ -1054,7 +1054,7 @@ void Scene_DrawConfigSpot03(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6948); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 6948);
} }
void Scene_DrawConfigSpot04(PlayState* play) { void Scene_DrawConfigKokiriForest(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
u8 spA3; u8 spA3;
u16 spA0; u16 spA0;
@ -1111,7 +1111,7 @@ void Scene_DrawConfigSpot04(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7044); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7044);
} }
void Scene_DrawConfigSpot06(PlayState* play) { void Scene_DrawConfigLakeHylia(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7058); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7058);
@ -1139,7 +1139,7 @@ void* sZorasDomainEntranceTextures[] = {
gZorasDomainNightEntranceTex, gZorasDomainNightEntranceTex,
}; };
void Scene_DrawConfigSpot07(PlayState* play) { void Scene_DrawConfigZorasDomain(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
u32 var; u32 var;
@ -1162,7 +1162,7 @@ void Scene_DrawConfigSpot07(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7147); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7147);
} }
void Scene_DrawConfigSpot08(PlayState* play) { void Scene_DrawConfigZorasFountain(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7161); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7161);
@ -1187,7 +1187,7 @@ void Scene_DrawConfigSpot08(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7192); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7192);
} }
void Scene_DrawConfigSpot09(PlayState* play) { void Scene_DrawConfigGerudoValley(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7206); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7206);
@ -1221,7 +1221,7 @@ void Scene_DrawConfigSpot09(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7260); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7260);
} }
void Scene_DrawConfigSpot10(PlayState* play) { void Scene_DrawConfigLostWoods(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
if (0) {} // Necessary to match if (0) {} // Necessary to match
@ -1253,7 +1253,7 @@ void Scene_DrawConfigSpot10(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7309); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7309);
} }
void Scene_DrawConfigSpot11(PlayState* play) { void Scene_DrawConfigDesertColossus(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7323); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7323);
@ -1277,7 +1277,7 @@ void* D_8012A380[] = {
gSpot12_00DE78Tex, gSpot12_00DE78Tex,
}; };
void Scene_DrawConfigSpot12(PlayState* play) { void Scene_DrawConfigGerudosFortress(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7363); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7363);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_8012A380[((void)0, gSaveContext.nightFlag)])); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_8012A380[((void)0, gSaveContext.nightFlag)]));
@ -1285,7 +1285,7 @@ void Scene_DrawConfigSpot12(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7371); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7371);
} }
void Scene_DrawConfigSpot13(PlayState* play) { void Scene_DrawConfigHauntedWasteland(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7385); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7385);
@ -1307,7 +1307,7 @@ void Scene_DrawConfigSpot13(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7409); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7409);
} }
void Scene_DrawConfigSpot15(PlayState* play) { void Scene_DrawConfigHyruleCastle(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7423); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7423);
@ -1331,7 +1331,7 @@ void Scene_DrawConfigSpot15(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7443); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7443);
} }
void Scene_DrawConfigSpot16(PlayState* play) { void Scene_DrawConfigDeathMountainTrail(PlayState* play) {
Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 3 * sizeof(Gfx)); Gfx* displayListHead = Graph_Alloc(play->state.gfxCtx, 3 * sizeof(Gfx));
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7461); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7461);
@ -1365,7 +1365,7 @@ void Scene_DrawConfigSpot16(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7495); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7495);
} }
void Scene_DrawConfigSpot17(PlayState* play) { void Scene_DrawConfigDeathMountainCrater(PlayState* play) {
s8 sp6F = coss((play->gameplayFrames * 1500) & 0xFFFF) >> 8; s8 sp6F = coss((play->gameplayFrames * 1500) & 0xFFFF) >> 8;
s8 sp6E = coss((play->gameplayFrames * 1500) & 0xFFFF) >> 8; s8 sp6E = coss((play->gameplayFrames * 1500) & 0xFFFF) >> 8;
u32 gameplayFrames; u32 gameplayFrames;
@ -1394,7 +1394,7 @@ void* sGoronCityEntranceTextures[] = {
gGoronCityNightEntranceTex, gGoronCityNightEntranceTex,
}; };
void Scene_DrawConfigSpot18(PlayState* play) { void Scene_DrawConfigGoronCity(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7555); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7555);
@ -1421,7 +1421,7 @@ void* sLonLonRanchWindowTextures[] = {
gLonLonRangeNightWindowsTex, gLonLonRangeNightWindowsTex,
}; };
void Scene_DrawConfigSpot20(PlayState* play) { void Scene_DrawConfigLonLonRanch(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7602); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7602);
gSPSegment(POLY_OPA_DISP++, 0x08, gSPSegment(POLY_OPA_DISP++, 0x08,
@ -1436,7 +1436,7 @@ void Scene_DrawConfigSpot20(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7615); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7615);
} }
void Scene_DrawConfigHidan(PlayState* play) { void Scene_DrawConfigFireTemple(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7630); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7630);
@ -1461,7 +1461,7 @@ void Scene_DrawConfigHidan(PlayState* play) {
f32 D_8012A398 = 0.0f; f32 D_8012A398 = 0.0f;
void Scene_DrawConfigBdan(PlayState* play) { void Scene_DrawConfigJabuJabu(PlayState* play) {
static s16 D_8012A39C = 538; static s16 D_8012A39C = 538;
static s16 D_8012A3A0 = 4272; static s16 D_8012A3A0 = 4272;
u32 gameplayFrames; u32 gameplayFrames;
@ -1539,7 +1539,7 @@ void Scene_DrawConfigBdan(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7811); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7811);
} }
void Scene_DrawConfigGanontika(PlayState* play) { void Scene_DrawConfigInsideGanonsCastle(PlayState* play) {
u32 gameplayFrames; u32 gameplayFrames;
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7825); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7825);
@ -1567,11 +1567,11 @@ void Scene_DrawConfigGanontika(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7852); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7852);
} }
void Scene_DrawConfigGanontikaSonogo(PlayState* play) { void Scene_DrawConfigInsideGanonsCastleCollapse(PlayState* play) {
func_8009BEEC(play); func_8009BEEC(play);
} }
void Scene_DrawConfigGanonSonogo(PlayState* play) { void Scene_DrawConfigGanonsTowerCollapseInterior(PlayState* play) {
func_8009BEEC(play); func_8009BEEC(play);
} }
@ -1594,59 +1594,59 @@ void Scene_DrawConfigBesitu(PlayState* play) {
} }
void (*sSceneDrawConfigs[SDC_MAX])(PlayState*) = { void (*sSceneDrawConfigs[SDC_MAX])(PlayState*) = {
Scene_DrawConfigDefault, // SDC_DEFAULT Scene_DrawConfigDefault, // SDC_DEFAULT
Scene_DrawConfigSpot00, // SDC_HYRULE_FIELD Scene_DrawConfigHyruleField, // SDC_HYRULE_FIELD
Scene_DrawConfigSpot01, // SDC_KAKARIKO_VILLAGE Scene_DrawConfigKakarikoVillage, // SDC_KAKARIKO_VILLAGE
Scene_DrawConfigSpot03, // SDC_ZORAS_RIVER Scene_DrawConfigZorasRiver, // SDC_ZORAS_RIVER
Scene_DrawConfigSpot04, // SDC_KOKIRI_FOREST Scene_DrawConfigKokiriForest, // SDC_KOKIRI_FOREST
Scene_DrawConfigSpot06, // SDC_LAKE_HYLIA Scene_DrawConfigLakeHylia, // SDC_LAKE_HYLIA
Scene_DrawConfigSpot07, // SDC_ZORAS_DOMAIN Scene_DrawConfigZorasDomain, // SDC_ZORAS_DOMAIN
Scene_DrawConfigSpot08, // SDC_ZORAS_FOUNTAIN Scene_DrawConfigZorasFountain, // SDC_ZORAS_FOUNTAIN
Scene_DrawConfigSpot09, // SDC_GERUDO_VALLEY Scene_DrawConfigGerudoValley, // SDC_GERUDO_VALLEY
Scene_DrawConfigSpot10, // SDC_LOST_WOODS Scene_DrawConfigLostWoods, // SDC_LOST_WOODS
Scene_DrawConfigSpot11, // SDC_DESERT_COLOSSUS Scene_DrawConfigDesertColossus, // SDC_DESERT_COLOSSUS
Scene_DrawConfigSpot12, // SDC_GERUDOS_FORTRESS Scene_DrawConfigGerudosFortress, // SDC_GERUDOS_FORTRESS
Scene_DrawConfigSpot13, // SDC_HAUNTED_WASTELAND Scene_DrawConfigHauntedWasteland, // SDC_HAUNTED_WASTELAND
Scene_DrawConfigSpot15, // SDC_HYRULE_CASTLE Scene_DrawConfigHyruleCastle, // SDC_HYRULE_CASTLE
Scene_DrawConfigSpot16, // SDC_DEATH_MOUNTAIN_TRAIL Scene_DrawConfigDeathMountainTrail, // SDC_DEATH_MOUNTAIN_TRAIL
Scene_DrawConfigSpot17, // SDC_DEATH_MOUNTAIN_CRATER Scene_DrawConfigDeathMountainCrater, // SDC_DEATH_MOUNTAIN_CRATER
Scene_DrawConfigSpot18, // SDC_GORON_CITY Scene_DrawConfigGoronCity, // SDC_GORON_CITY
Scene_DrawConfigSpot20, // SDC_LON_LON_RANCH Scene_DrawConfigLonLonRanch, // SDC_LON_LON_RANCH
Scene_DrawConfigHidan, // SDC_FIRE_TEMPLE Scene_DrawConfigFireTemple, // SDC_FIRE_TEMPLE
Scene_DrawConfigYdan, // SDC_DEKU_TREE Scene_DrawConfigDekuTree, // SDC_DEKU_TREE
Scene_DrawConfigDdan, // SDC_DODONGOS_CAVERN Scene_DrawConfigDodongosCavern, // SDC_DODONGOS_CAVERN
Scene_DrawConfigBdan, // SDC_JABU_JABU Scene_DrawConfigJabuJabu, // SDC_JABU_JABU
Scene_DrawConfigBmori1, // SDC_FOREST_TEMPLE Scene_DrawConfigForestTemple, // SDC_FOREST_TEMPLE
Scene_DrawConfigMizusin, // SDC_WATER_TEMPLE Scene_DrawConfigWaterTemple, // SDC_WATER_TEMPLE
Scene_DrawConfigHakadan, // SDC_SHADOW_TEMPLE Scene_DrawConfigShadowTempleAndWell, // SDC_SHADOW_TEMPLE_AND_WELL
Scene_DrawConfigJyasinzou, // SDC_SPIRIT_TEMPLE Scene_DrawConfigSpiritTemple, // SDC_SPIRIT_TEMPLE
Scene_DrawConfigGanontika, // SDC_INSIDE_GANONS_CASTLE Scene_DrawConfigInsideGanonsCastle, // SDC_INSIDE_GANONS_CASTLE
Scene_DrawConfigMen, // SDC_GERUDO_TRAINING_GROUND Scene_DrawConfigGerudoTrainingGround, // SDC_GERUDO_TRAINING_GROUND
Scene_DrawConfigYdanBoss, // SDC_DEKU_TREE_BOSS Scene_DrawConfigDekuTreeBoss, // SDC_DEKU_TREE_BOSS
Scene_DrawConfigMizusinBs, // SDC_WATER_TEMPLE_BOSS Scene_DrawConfigWaterTempleBoss, // SDC_WATER_TEMPLE_BOSS
Scene_DrawConfigTokinoma, // SDC_TEMPLE_OF_TIME Scene_DrawConfigTempleOfTime, // SDC_TEMPLE_OF_TIME
Scene_DrawConfigKakusiana, // SDC_GROTTOS Scene_DrawConfigGrottos, // SDC_GROTTOS
Scene_DrawConfigKenjyanoma, // SDC_CHAMBER_OF_THE_SAGES Scene_DrawConfigChamberOfTheSages, // SDC_CHAMBER_OF_THE_SAGES
Scene_DrawConfigGreatFairyFountain, // SDC_GREAT_FAIRYS_FOUNTAIN Scene_DrawConfigGreatFairyFountain, // SDC_GREAT_FAIRYS_FOUNTAIN
Scene_DrawConfigSyatekijyou, // SDC_SHOOTING_GALLERY Scene_DrawConfigShootingGallery, // SDC_SHOOTING_GALLERY
Scene_DrawConfigHairalNiwa, // SDC_CASTLE_COURTYARD_GUARDS Scene_DrawConfigCastleCourtyardGuards, // SDC_CASTLE_COURTYARD_GUARDS
Scene_DrawConfigGanonCastleExterior, // SDC_OUTSIDE_GANONS_CASTLE Scene_DrawConfigOutsideGanonsCastle, // SDC_OUTSIDE_GANONS_CASTLE
Scene_DrawConfigIceDoukuto, // SDC_ICE_CAVERN Scene_DrawConfigIceCavern, // SDC_ICE_CAVERN
Scene_DrawConfigGanonFinal, // SDC_GANONS_TOWER_COLLAPSE_EXTERIOR Scene_DrawConfigGanonsTowerCollapseExterior, // SDC_GANONS_TOWER_COLLAPSE_EXTERIOR
Scene_DrawConfigFairyFountain, // SDC_FAIRYS_FOUNTAIN Scene_DrawConfigFairysFountain, // SDC_FAIRYS_FOUNTAIN
Scene_DrawConfigGerudoway, // SDC_THIEVES_HIDEOUT Scene_DrawConfigThievesHideout, // SDC_THIEVES_HIDEOUT
Scene_DrawConfigBowling, // SDC_BOMBCHU_BOWLING_ALLEY Scene_DrawConfigBombchuBowlingAlley, // SDC_BOMBCHU_BOWLING_ALLEY
Scene_DrawConfigHakaanaOuke, // SDC_ROYAL_FAMILYS_TOMB Scene_DrawConfigRoyalFamilysTomb, // SDC_ROYAL_FAMILYS_TOMB
Scene_DrawConfigHyliaLabo, // SDC_LAKESIDE_LABORATORY Scene_DrawConfigLakesideLaboratory, // SDC_LAKESIDE_LABORATORY
Scene_DrawConfigSouko, // SDC_LON_LON_BUILDINGS Scene_DrawConfigLonLonBuildings, // SDC_LON_LON_BUILDINGS
Scene_DrawConfigMiharigoya, // SDC_MARKET_GUARD_HOUSE Scene_DrawConfigMarketGuardHouse, // SDC_MARKET_GUARD_HOUSE
Scene_DrawConfigMahouya, // SDC_POTION_SHOP_GRANNY Scene_DrawConfigPotionShopGranny, // SDC_POTION_SHOP_GRANNY
Scene_DrawConfigCalmWater, // SDC_CALM_WATER Scene_DrawConfigCalmWater, // SDC_CALM_WATER
Scene_DrawConfigGraveExitLightShining, // SDC_GRAVE_EXIT_LIGHT_SHINING Scene_DrawConfigGraveExitLightShining, // SDC_GRAVE_EXIT_LIGHT_SHINING
Scene_DrawConfigBesitu, // SDC_BESITU Scene_DrawConfigBesitu, // SDC_BESITU
Scene_DrawConfigTuribori, // SDC_FISHING_POND Scene_DrawConfigFishingPond, // SDC_FISHING_POND
Scene_DrawConfigGanonSonogo, // SDC_GANONS_TOWER_COLLAPSE_INTERIOR Scene_DrawConfigGanonsTowerCollapseInterior, // SDC_GANONS_TOWER_COLLAPSE_INTERIOR
Scene_DrawConfigGanontikaSonogo, // SDC_INSIDE_GANONS_CASTLE_COLLAPSE Scene_DrawConfigInsideGanonsCastleCollapse, // SDC_INSIDE_GANONS_CASTLE_COLLAPSE
}; };
void Scene_Draw(PlayState* play) { void Scene_Draw(PlayState* play) {

View file

@ -221,7 +221,7 @@ void Sram_InitNewSave(void) {
gSaveContext.horseData.angle = -0x6AD9; gSaveContext.horseData.angle = -0x6AD9;
gSaveContext.magicLevel = 0; gSaveContext.magicLevel = 0;
gSaveContext.infTable[INFTABLE_1DX_INDEX] = 1; gSaveContext.infTable[INFTABLE_1DX_INDEX] = 1;
gSaveContext.sceneFlags[5].swch = 0x40000000; gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch = 0x40000000;
} }
static SavePlayerData sDebugSavePlayerData = { static SavePlayerData sDebugSavePlayerData = {
@ -378,7 +378,7 @@ void Sram_InitDebugSave(void) {
gSaveContext.entranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.entranceIndex = ENTR_HYRULE_FIELD_0;
gSaveContext.magicLevel = 0; gSaveContext.magicLevel = 0;
gSaveContext.sceneFlags[5].swch = 0x40000000; gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch = 0x40000000;
} }
static s16 sDungeonEntrances[] = { static s16 sDungeonEntrances[] = {

View file

@ -355,7 +355,7 @@ void func_8086C874(BgBdanObjects* this, PlayState* play) {
if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) { if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->cameraSetting = play->cameraPtrs[CAM_ID_MAIN]->setting; this->cameraSetting = play->cameraPtrs[CAM_ID_MAIN]->setting;
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_NORMAL2); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_NORMAL2);
func_8005AD1C(play->cameraPtrs[CAM_ID_MAIN], 4); Camera_UnsetStateFlag(play->cameraPtrs[CAM_ID_MAIN], CAM_STATE_2);
this->switchFlag = 10; this->switchFlag = 10;
} }
} else { } else {
@ -368,7 +368,7 @@ void func_8086C874(BgBdanObjects* this, PlayState* play) {
if (this->switchFlag == 0) { if (this->switchFlag == 0) {
if (1) {} if (1) {}
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], this->cameraSetting); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], this->cameraSetting);
func_8005ACFC(play->cameraPtrs[CAM_ID_MAIN], 4); Camera_SetStateFlag(play->cameraPtrs[CAM_ID_MAIN], CAM_STATE_2);
} }
} }
this->dyna.actor.world.pos.y = this->dyna.actor.world.pos.y =

View file

@ -265,7 +265,7 @@ void DemoIk_Type1PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
case 0: case 0:
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inArmer.c", 390), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inArmer.c", 390),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_ik_DL_016BE0); gSPDisplayList(POLY_XLU_DISP++, gIronKnuckleArmorRivetAndSymbolDL);
break; break;
case 2: case 2:
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inArmer.c", 396), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inArmer.c", 396),
@ -432,7 +432,7 @@ void DemoIk_Type2PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
case 5: case 5:
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inFace.c", 286), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inFace.c", 286),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_ik_DL_016BE0); gSPDisplayList(POLY_XLU_DISP++, gIronKnuckleArmorRivetAndSymbolDL);
break; break;
default: default:
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inFace.c", 292), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_demo_ik_inFace.c", 292),

View file

@ -668,7 +668,6 @@ void func_80996EE8(DoorShutter* this, PlayState* play) {
if (DoorShutter_GetPlayerSide(this, play) != 0) { if (DoorShutter_GetPlayerSide(this, play) != 0) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
// Jabu navi text for switch doors is different
player->naviTextId = (play->sceneId == SCENE_JABU_JABU) ? -0x20B : -0x202; player->naviTextId = (play->sceneId == SCENE_JABU_JABU) ? -0x20B : -0x202;
} }
} }

View file

@ -641,7 +641,7 @@ void func_809BE26C(EnBigokuta* this, PlayState* play) {
if (this->unk_198 == 0 && Math_StepToF(&this->actor.scale.y, 0.0f, 0.001f)) { if (this->unk_198 == 0 && Math_StepToF(&this->actor.scale.y, 0.0f, 0.001f)) {
Flags_SetClear(play, this->actor.room); Flags_SetClear(play, this->actor.room);
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_DUNGEON0); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_DUNGEON0);
func_8005ACFC(play->cameraPtrs[CAM_ID_MAIN], 4); Camera_SetStateFlag(play->cameraPtrs[CAM_ID_MAIN], CAM_STATE_2);
SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EN_OCTAROCK_BUBLE); SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EN_OCTAROCK_BUBLE);
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0xB0); Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0xB0);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
@ -778,7 +778,7 @@ void EnBigokuta_Update(Actor* thisx, PlayState* play2) {
func_809BD2E4(this); func_809BD2E4(this);
func_809BE568(this); func_809BE568(this);
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BIG_OCTO); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BIG_OCTO);
func_8005AD1C(play->cameraPtrs[CAM_ID_MAIN], 4); Camera_UnsetStateFlag(play->cameraPtrs[CAM_ID_MAIN], CAM_STATE_2);
if (this->cylinder[0].base.atFlags & AT_ON) { if (this->cylinder[0].base.atFlags & AT_ON) {
if (this->actionFunc != func_809BE058) { if (this->actionFunc != func_809BE058) {

View file

@ -69,7 +69,7 @@ void EnEncount1_Init(Actor* thisx, PlayState* play) {
case SPAWNER_LEEVER: case SPAWNER_LEEVER:
this->timer = 30; this->timer = 30;
this->maxCurSpawns = 5; this->maxCurSpawns = 5;
if (play->sceneId == SCENE_HAUNTED_WASTELAND) { // Haunted Wasteland if (play->sceneId == SCENE_HAUNTED_WASTELAND) {
this->reduceLeevers = true; this->reduceLeevers = true;
this->maxCurSpawns = 3; this->maxCurSpawns = 3;
} }
@ -81,7 +81,7 @@ void EnEncount1_Init(Actor* thisx, PlayState* play) {
break; break;
case SPAWNER_STALCHILDREN: case SPAWNER_STALCHILDREN:
case SPAWNER_WOLFOS: case SPAWNER_WOLFOS:
if (play->sceneId == SCENE_HYRULE_FIELD) { // Hyrule Field if (play->sceneId == SCENE_HYRULE_FIELD) {
this->maxTotalSpawns = 10000; this->maxTotalSpawns = 10000;
} }
this->updateFunc = EnEncount1_SpawnStalchildOrWolfos; this->updateFunc = EnEncount1_SpawnStalchildOrWolfos;

View file

@ -101,7 +101,6 @@ void EnGe1_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 6; this->actor.targetMode = 6;
Actor_SetScale(&this->actor, 0.01f); Actor_SetScale(&this->actor, 0.01f);
// In Gerudo Valley
this->actor.uncullZoneForward = ((play->sceneId == SCENE_GERUDO_VALLEY) ? 1000.0f : 1200.0f); this->actor.uncullZoneForward = ((play->sceneId == SCENE_GERUDO_VALLEY) ? 1000.0f : 1200.0f);
switch (this->actor.params & 0xFF) { switch (this->actor.params & 0xFF) {

View file

@ -1163,10 +1163,10 @@ s32 EnGo2_IsCameraModified(EnGo2* this, PlayState* play) {
if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) { if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) {
if (EnGo2_IsWakingUp(this)) { if (EnGo2_IsWakingUp(this)) {
Camera_ChangeSetting(mainCam, CAM_SET_DIRECTED_YAW); Camera_ChangeSetting(mainCam, CAM_SET_DIRECTED_YAW);
func_8005AD1C(mainCam, 4); Camera_UnsetStateFlag(mainCam, CAM_STATE_2);
} else if (!EnGo2_IsWakingUp(this) && (mainCam->setting == CAM_SET_DIRECTED_YAW)) { } else if (!EnGo2_IsWakingUp(this) && (mainCam->setting == CAM_SET_DIRECTED_YAW)) {
Camera_ChangeSetting(mainCam, CAM_SET_DUNGEON1); Camera_ChangeSetting(mainCam, CAM_SET_DUNGEON1);
func_8005ACFC(mainCam, 4); Camera_SetStateFlag(mainCam, CAM_STATE_2);
} }
} }

View file

@ -154,7 +154,6 @@ typedef struct {
} EnHorseSpawnpoint; } EnHorseSpawnpoint;
static EnHorseSpawnpoint sHorseSpawns[] = { static EnHorseSpawnpoint sHorseSpawns[] = {
// Hyrule Field
{ SCENE_HYRULE_FIELD, 16, 0, 1341, 0 }, { SCENE_HYRULE_FIELD, 16, 0, 1341, 0 },
{ SCENE_HYRULE_FIELD, -1297, 0, 1459, 0 }, { SCENE_HYRULE_FIELD, -1297, 0, 1459, 0 },
{ SCENE_HYRULE_FIELD, -5416, -300, 1296, 0 }, { SCENE_HYRULE_FIELD, -5416, -300, 1296, 0 },
@ -296,12 +295,10 @@ static EnHorseSpawnpoint sHorseSpawns[] = {
{ SCENE_HYRULE_FIELD, -2915, -435, 11334, 0 }, { SCENE_HYRULE_FIELD, -2915, -435, 11334, 0 },
{ SCENE_HYRULE_FIELD, 165, -278, 3352, 0 }, { SCENE_HYRULE_FIELD, 165, -278, 3352, 0 },
// Lake Hylia
{ SCENE_LAKE_HYLIA, -2109, -882, 1724, 0 }, { SCENE_LAKE_HYLIA, -2109, -882, 1724, 0 },
{ SCENE_LAKE_HYLIA, -328, -1238, 2705, 0 }, { SCENE_LAKE_HYLIA, -328, -1238, 2705, 0 },
{ SCENE_LAKE_HYLIA, -3092, -1033, 3527, 0 }, { SCENE_LAKE_HYLIA, -3092, -1033, 3527, 0 },
// Gerudo Valley
{ SCENE_GERUDO_VALLEY, 2687, -269, 753, 0 }, { SCENE_GERUDO_VALLEY, 2687, -269, 753, 0 },
{ SCENE_GERUDO_VALLEY, 2066, -132, 317, 0 }, { SCENE_GERUDO_VALLEY, 2066, -132, 317, 0 },
{ SCENE_GERUDO_VALLEY, 523, -8, 635, 0 }, { SCENE_GERUDO_VALLEY, 523, -8, 635, 0 },
@ -313,7 +310,6 @@ static EnHorseSpawnpoint sHorseSpawns[] = {
{ SCENE_GERUDO_VALLEY, -1666, 58, 378, 0 }, { SCENE_GERUDO_VALLEY, -1666, 58, 378, 0 },
{ SCENE_GERUDO_VALLEY, -3044, 210, -648, 0 }, { SCENE_GERUDO_VALLEY, -3044, 210, -648, 0 },
// Gerudo's Fortress
{ SCENE_GERUDOS_FORTRESS, -678, 21, -623, 0 }, { SCENE_GERUDOS_FORTRESS, -678, 21, -623, 0 },
{ SCENE_GERUDOS_FORTRESS, 149, 333, -2499, 0 }, { SCENE_GERUDOS_FORTRESS, 149, 333, -2499, 0 },
{ SCENE_GERUDOS_FORTRESS, 499, 581, -547, 0 }, { SCENE_GERUDOS_FORTRESS, 499, 581, -547, 0 },
@ -324,7 +320,6 @@ static EnHorseSpawnpoint sHorseSpawns[] = {
{ SCENE_GERUDOS_FORTRESS, -966, 24, -761, 0 }, { SCENE_GERUDOS_FORTRESS, -966, 24, -761, 0 },
{ SCENE_GERUDOS_FORTRESS, -694, 174, -2820, 0 }, { SCENE_GERUDOS_FORTRESS, -694, 174, -2820, 0 },
// Lon Lon Ranch
{ SCENE_LON_LON_RANCH, 1039, 0, 2051, 0 }, { SCENE_LON_LON_RANCH, 1039, 0, 2051, 0 },
{ SCENE_LON_LON_RANCH, -1443, 0, 1429, 0 }, { SCENE_LON_LON_RANCH, -1443, 0, 1429, 0 },
{ SCENE_LON_LON_RANCH, 856, 0, -918, 0 }, // Hardcoded to always load in lon lon { SCENE_LON_LON_RANCH, 856, 0, -918, 0 }, // Hardcoded to always load in lon lon
@ -1752,7 +1747,7 @@ void EnHorse_Inactive(EnHorse* this, PlayState* play2) {
gSaveContext.horseData.sceneId = play->sceneId; gSaveContext.horseData.sceneId = play->sceneId;
// Focus the camera on Epona // Focus the camera on Epona
Camera_SetParam(play->cameraPtrs[CAM_ID_MAIN], 8, this); Camera_SetViewParam(play->cameraPtrs[CAM_ID_MAIN], CAM_VIEW_TARGET, &this->actor);
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_TURN_AROUND); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_TURN_AROUND);
Camera_SetCameraData(play->cameraPtrs[CAM_ID_MAIN], 4, NULL, NULL, 0x51, 0, 0); Camera_SetCameraData(play->cameraPtrs[CAM_ID_MAIN], 4, NULL, NULL, 0x51, 0, 0);
} }
@ -1826,7 +1821,7 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
this->followTimer = 0; this->followTimer = 0;
EnHorse_SetFollowAnimation(this, play); EnHorse_SetFollowAnimation(this, play);
Camera_SetParam(play->cameraPtrs[CAM_ID_MAIN], 8, this); Camera_SetViewParam(play->cameraPtrs[CAM_ID_MAIN], CAM_VIEW_TARGET, &this->actor);
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_TURN_AROUND); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_TURN_AROUND);
Camera_SetCameraData(play->cameraPtrs[CAM_ID_MAIN], 4, NULL, NULL, 0x51, 0, 0); Camera_SetCameraData(play->cameraPtrs[CAM_ID_MAIN], 4, NULL, NULL, 0x51, 0, 0);
} }

File diff suppressed because it is too large Load diff

View file

@ -8,21 +8,102 @@ struct EnIk;
typedef void (*EnIkActionFunc)(struct EnIk*, PlayState*); typedef void (*EnIkActionFunc)(struct EnIk*, PlayState*);
#define IK_GET_UPPER_PARAMS(thisx) ((thisx)->params & 0xFF00)
#define IK_GET_ARMOR_TYPE(thisx) ((thisx)->params & 0xFF)
#define IK_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
typedef enum {
/* 0 */ IK_TYPE_NABOORU,
/* 1 */ IK_TYPE_SILVER,
/* 2 */ IK_TYPE_BLACK,
/* 3 */ IK_TYPE_WHITE
} EnIkType;
typedef enum {
/* 0x00 */ IRON_KNUCKLE_LIMB_NONE,
/* 0x01 */ IRON_KNUCKLE_LIMB_ROOT,
/* 0x02 */ IRON_KNUCKLE_LIMB_LOWER_BODY,
/* 0x03 */ IRON_KNUCKLE_LIMB_RIGHT_THIGH,
/* 0x04 */ IRON_KNUCKLE_LIMB_RIGHT_SHIN,
/* 0x05 */ IRON_KNUCKLE_LIMB_RIGHT_FOOT,
/* 0x06 */ IRON_KNUCKLE_LIMB_LEFT_THIGH,
/* 0x07 */ IRON_KNUCKLE_LIMB_LEFT_SHIN,
/* 0x08 */ IRON_KNUCKLE_LIMB_LEFT_FOOT,
/* 0x09 */ IRON_KNUCKLE_LIMB_UPPER_BODY_ROOT,
/* 0x0A */ IRON_KNUCKLE_LIMB_UPPER_BODY,
/* 0x0B */ IRON_KNUCKLE_LIMB_HEAD_ROOT,
/* 0x0C */ IRON_KNUCKLE_LIMB_HELMET_ARMOR,
/* 0x0D */ IRON_KNUCKLE_LIMB_HEAD,
/* 0x0E */ IRON_KNUCKLE_LIMB_RIGHT_UPPER_ARM,
/* 0x0F */ IRON_KNUCKLE_LIMB_RIGHT_FOREARM,
/* 0x10 */ IRON_KNUCKLE_LIMB_RIGHT_HAND_ROOT,
/* 0x11 */ IRON_KNUCKLE_LIMB_AXE,
/* 0x12 */ IRON_KNUCKLE_LIMB_RIGHT_HAND,
/* 0x13 */ IRON_KNUCKLE_LIMB_LEFT_UPPER_ARM,
/* 0x14 */ IRON_KNUCKLE_LIMB_LEFT_FOREARM,
/* 0x15 */ IRON_KNUCKLE_LIMB_LEFT_HAND,
/* 0x16 */ IRON_KNUCKLE_LIMB_UPPER_LEFT_PAULDRON,
/* 0x17 */ IRON_KNUCKLE_LIMB_LOWER_LEFT_PAULDRON,
/* 0x18 */ IRON_KNUCKLE_LIMB_UPPER_RIGHT_PAULDRON,
/* 0x19 */ IRON_KNUCKLE_LIMB_LOWER_RIGHT_PAULDRON,
/* 0x1A */ IRON_KNUCKLE_LIMB_CHEST_ARMOR_FRONT,
/* 0x1B */ IRON_KNUCKLE_LIMB_CHEST_ARMOR_BACK,
/* 0x1C */ IRON_KNUCKLE_LIMB_TORSO,
/* 0x1D */ IRON_KNUCKLE_LIMB_WAIST,
/* 0x1E */ IRON_KNUCKLE_LIMB_MAX
} IronKnuckleLimb;
// This skeleton is only used in the defeat cutscene that reveals Nabooru under the armor.
// The only difference between this skeleton and the main one is that the head and helmet armor limbs are swapped.
typedef enum {
/* 0x00 */ IRON_KNUCKLE_DEFEAT_LIMB_NONE,
/* 0x01 */ IRON_KNUCKLE_DEFEAT_LIMB_ROOT,
/* 0x02 */ IRON_KNUCKLE_DEFEAT_LIMB_LOWER_BODY,
/* 0x03 */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_THIGH,
/* 0x04 */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_SHIN,
/* 0x05 */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_FOOT,
/* 0x06 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_THIGH,
/* 0x07 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_SHIN,
/* 0x08 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_FOOT,
/* 0x09 */ IRON_KNUCKLE_DEFEAT_LIMB_UPPER_BODY_ROOT,
/* 0x0A */ IRON_KNUCKLE_DEFEAT_LIMB_UPPER_BODY,
/* 0x0B */ IRON_KNUCKLE_DEFEAT_LIMB_HEAD_ROOT,
/* 0x0C */ IRON_KNUCKLE_DEFEAT_LIMB_HEAD,
/* 0x0D */ IRON_KNUCKLE_DEFEAT_LIMB_HELMET_ARMOR,
/* 0x0E */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_UPPER_ARM,
/* 0x0F */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_FOREARM,
/* 0x10 */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_HAND_ROOT,
/* 0x11 */ IRON_KNUCKLE_DEFEAT_LIMB_AXE,
/* 0x12 */ IRON_KNUCKLE_DEFEAT_LIMB_RIGHT_HAND,
/* 0x13 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_UPPER_ARM,
/* 0x14 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_FOREARM,
/* 0x15 */ IRON_KNUCKLE_DEFEAT_LIMB_LEFT_HAND,
/* 0x16 */ IRON_KNUCKLE_DEFEAT_LIMB_UPPER_LEFT_PAULDRON,
/* 0x17 */ IRON_KNUCKLE_DEFEAT_LIMB_LOWER_LEFT_PAULDRON,
/* 0x18 */ IRON_KNUCKLE_DEFEAT_LIMB_UPPER_RIGHT_PAULDRON,
/* 0x19 */ IRON_KNUCKLE_DEFEAT_LIMB_LOWER_RIGHT_PAULDRON,
/* 0x1A */ IRON_KNUCKLE_DEFEAT_LIMB_CHEST_ARMOR_FRONT,
/* 0x1B */ IRON_KNUCKLE_DEFEAT_LIMB_CHEST_ARMOR_BACK,
/* 0x1C */ IRON_KNUCKLE_DEFEAT_LIMB_TORSO,
/* 0x1D */ IRON_KNUCKLE_DEFEAT_LIMB_WAIST,
/* 0x1E */ IRON_KNUCKLE_DEFEAT_LIMB_MAX
} IronKnuckleDefeatLimb;
typedef struct EnIk { typedef struct EnIk {
/* 0x0000 */ Actor actor; /* 0x0000 */ Actor actor;
/* 0x014C */ SkelAnime skelAnime; /* 0x014C */ SkelAnime skelAnime;
/* 0x0190 */ Vec3s jointTable[30]; /* 0x0190 */ Vec3s jointTable[IRON_KNUCKLE_LIMB_MAX];
/* 0x0244 */ Vec3s morphTable[30]; /* 0x0244 */ Vec3s morphTable[IRON_KNUCKLE_LIMB_MAX];
/* 0x02F8 */ u8 unk_2F8; /* 0x02F8 */ u8 unk_2F8;
/* 0x02F9 */ u8 unk_2F9; /* 0x02F9 */ u8 animationTimer;
/* 0x02FA */ u8 unk_2FA; /* 0x02FA */ u8 drawArmorFlag;
/* 0x02FB */ u8 unk_2FB; /* 0x02FB */ u8 armorStatusFlag;
/* 0x02FC */ u8 unk_2FC; /* 0x02FC */ u8 isBreakingProp;
/* 0x02FD */ u8 unk_2FD; /* 0x02FD */ u8 damageEffect;
/* 0x02FE */ s8 unk_2FE; /* 0x02FE */ s8 unk_2FE;
/* 0x02FF */ s8 unk_2FF; /* 0x02FF */ s8 unk_2FF;
/* 0x0300 */ s16 unk_300; /* 0x0300 */ s16 unk_300;
/* 0x0302 */ s16 switchFlags; /* 0x0302 */ s16 switchFlag;
/* 0x0304 */ EnIkActionFunc actionFunc; /* 0x0304 */ EnIkActionFunc actionFunc;
/* 0x0308 */ BodyBreak bodyBreak; /* 0x0308 */ BodyBreak bodyBreak;
/* 0x0320 */ ColliderCylinder bodyCollider; /* 0x0320 */ ColliderCylinder bodyCollider;
@ -30,10 +111,10 @@ typedef struct EnIk {
/* 0x03EC */ ColliderTris shieldCollider; /* 0x03EC */ ColliderTris shieldCollider;
/* 0x040C */ ColliderTrisElement shieldColliderItems[2]; /* 0x040C */ ColliderTrisElement shieldColliderItems[2];
/* 0x04C4 */ s32 blureIdx; /* 0x04C4 */ s32 blureIdx;
/* 0x04C8 */ s32 action; /* 0x04C8 */ s32 csAction;
/* 0x04CC */ s32 drawMode; /* 0x04CC */ s32 csDrawMode;
/* 0x04D0 */ u32 npcAction; /* 0x04D0 */ u32 npcAction;
/* 0x04D4 */ s32 unk_4D4; /* 0x04D4 */ s32 isAxeSummoned;
/* 0x04D8 */ char unk_4D8[0x04]; /* 0x04D8 */ char unk_4D8[0x04];
} EnIk; // size = 0x04DC } EnIk; // size = 0x04DC

View file

@ -60,7 +60,6 @@ u16 EnTg_GetTextId(PlayState* play, Actor* thisx) {
if (temp != 0) { if (temp != 0) {
return temp; return temp;
} }
// Use a different set of dialogue in Kakariko Village (Adult)
if (play->sceneId == SCENE_KAKARIKO_VILLAGE) { if (play->sceneId == SCENE_KAKARIKO_VILLAGE) {
if (this->nextDialogue % 2 != 0) { if (this->nextDialogue % 2 != 0) {
phi = 0x5089; phi = 0x5089;

View file

@ -387,7 +387,7 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
break; break;
} }
} else if (type == ENVIEWER_TYPE_2_ZELDA) { } else if (type == ENVIEWER_TYPE_2_ZELDA) {
if (play->sceneId == SCENE_HYRULE_FIELD) { // Hyrule Field if (play->sceneId == SCENE_HYRULE_FIELD) {
switch (this->state) { switch (this->state) {
case 0: case 0:
if (play->csCtx.state != CS_STATE_IDLE) { if (play->csCtx.state != CS_STATE_IDLE) {
@ -587,7 +587,7 @@ void EnViewer_DrawHorse(EnViewer* this, PlayState* play) {
} }
s32 EnViewer_ZeldaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { s32 EnViewer_ZeldaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
if (play->sceneId == SCENE_HYRULE_FIELD) { // Hyrule Field if (play->sceneId == SCENE_HYRULE_FIELD) {
if (limbIndex == 2) { if (limbIndex == 2) {
*dList = gChildZeldaCutsceneDressDL; *dList = gChildZeldaCutsceneDressDL;
} }
@ -624,7 +624,7 @@ void EnViewer_ZeldaPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnViewer_DrawZelda(EnViewer* this, PlayState* play) { void EnViewer_DrawZelda(EnViewer* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_en_viewer.c", 1583); OPEN_DISPS(play->state.gfxCtx, "../z_en_viewer.c", 1583);
if (play->sceneId == SCENE_HYRULE_FIELD) { // Hyrule Field if (play->sceneId == SCENE_HYRULE_FIELD) {
if (play->csCtx.frames < 771) { if (play->csCtx.frames < 771) {
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gChildZeldaEyeInTex)); gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gChildZeldaEyeInTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(gChildZeldaEyeOutTex)); gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(gChildZeldaEyeOutTex));

View file

@ -752,7 +752,7 @@ void ObjBean_SetupWaitForPlayer(ObjBean* this) {
void ObjBean_WaitForPlayer(ObjBean* this, PlayState* play) { void ObjBean_WaitForPlayer(ObjBean* this, PlayState* play) {
if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) { if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
ObjBean_SetupFly(this); ObjBean_SetupFly(this);
if (play->sceneId == SCENE_LOST_WOODS) { // Lost woods if (play->sceneId == SCENE_LOST_WOODS) {
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BEAN_LOST_WOODS); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BEAN_LOST_WOODS);
} else { } else {
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BEAN_GENERIC); Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_BEAN_GENERIC);

View file

@ -501,7 +501,7 @@ void ObjectKankyo_DrawFairies(Actor* thisx, PlayState* play2) {
Vec3f vec2 = { 0.0f, 0.0f, 0.0f }; Vec3f vec2 = { 0.0f, 0.0f, 0.0f };
s16 i; s16 i;
if (!(play->cameraPtrs[CAM_ID_MAIN]->unk_14C & 0x100)) { if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_8)) {
OPEN_DISPS(play->state.gfxCtx, "../z_object_kankyo.c", 807); OPEN_DISPS(play->state.gfxCtx, "../z_object_kankyo.c", 807);
POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20); POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gSun1Tex)); gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gSun1Tex));
@ -596,7 +596,7 @@ void ObjectKankyo_DrawSnow(Actor* thisx, PlayState* play2) {
s32 pad; s32 pad;
s32 pad2; s32 pad2;
if (!(play->cameraPtrs[CAM_ID_MAIN]->unk_14C & 0x100)) { if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_8)) {
OPEN_DISPS(play->state.gfxCtx, "../z_object_kankyo.c", 958); OPEN_DISPS(play->state.gfxCtx, "../z_object_kankyo.c", 958);
if (play->envCtx.precipitation[PRECIP_SNOW_CUR] < play->envCtx.precipitation[PRECIP_SNOW_MAX]) { if (play->envCtx.precipitation[PRECIP_SNOW_CUR] < play->envCtx.precipitation[PRECIP_SNOW_MAX]) {
if (play->state.frames % 16 == 0) { if (play->state.frames % 16 == 0) {

View file

@ -2701,7 +2701,8 @@ s32 func_80834E7C(PlayState* play) {
s32 func_80834EB8(Player* this, PlayState* play) { s32 func_80834EB8(Player* this, PlayState* play) {
if ((this->unk_6AD == 0) || (this->unk_6AD == 2)) { if ((this->unk_6AD == 0) || (this->unk_6AD == 2)) {
if (func_80833BCC(this) || (Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_BOWARROW) == 0)) { if (func_80833BCC(this) ||
(Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_AIM_ADULT) == 0)) {
return 1; return 1;
} }
this->unk_6AD = 2; this->unk_6AD = 2;
@ -4364,43 +4365,43 @@ s32 func_80838FB8(PlayState* play, Player* this) {
* Note: grottos and normal fairy fountains use `ENTR_RETURN_GROTTO` * Note: grottos and normal fairy fountains use `ENTR_RETURN_GROTTO`
*/ */
s16 sReturnEntranceGroupData[] = { s16 sReturnEntranceGroupData[] = {
// ENTR_RETURN_DAIYOUSEI_IZUMI // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC
/* 0 */ ENTR_DEATH_MOUNTAIN_TRAIL_4, // DMT from Magic Fairy Fountain /* 0 */ ENTR_DEATH_MOUNTAIN_TRAIL_4, // from Magic Fairy Fountain
/* 1 */ ENTR_DEATH_MOUNTAIN_CRATER_3, // DMC from Double Defense Fairy Fountain /* 1 */ ENTR_DEATH_MOUNTAIN_CRATER_3, // from Double Magic Fairy Fountain
/* 2 */ ENTR_HYRULE_CASTLE_2, // Hyrule Castle from Dins Fire Fairy Fountain /* 2 */ ENTR_HYRULE_CASTLE_2, // from Double Defense Fairy Fountain (as adult)
// ENTR_RETURN_2 // ENTR_RETURN_2
/* 3 */ ENTR_KAKARIKO_VILLAGE_9, // Kakariko from Potion Shop /* 3 */ ENTR_KAKARIKO_VILLAGE_9, // from Potion Shop in Kakariko
/* 4 */ ENTR_MARKET_DAY_5, // Market (child day) from Potion Shop /* 4 */ ENTR_MARKET_DAY_5, // from Potion Shop in Market
// ENTR_RETURN_SHOP1 // ENTR_RETURN_BAZAAR
/* 5 */ ENTR_KAKARIKO_VILLAGE_3, // Kakariko from Bazaar /* 5 */ ENTR_KAKARIKO_VILLAGE_3,
/* 6 */ ENTR_MARKET_DAY_6, // Market (child day) from Bazaar /* 6 */ ENTR_MARKET_DAY_6,
// ENTR_RETURN_4 // ENTR_RETURN_4
/* 7 */ ENTR_KAKARIKO_VILLAGE_11, // Kakariko from House of Skulltulas /* 7 */ ENTR_KAKARIKO_VILLAGE_11, // from House of Skulltulas
/* 8 */ ENTR_BACK_ALLEY_DAY_2, // Back Alley (day) from Bombchu Shop /* 8 */ ENTR_BACK_ALLEY_DAY_2, // from Bombchu Shop
// ENTR_RETURN_SYATEKIJYOU // ENTR_RETURN_SHOOTING_GALLERY
/* 9 */ ENTR_KAKARIKO_VILLAGE_10, // Kakariko from Shooting Gallery /* 9 */ ENTR_KAKARIKO_VILLAGE_10,
/* 10 */ ENTR_MARKET_DAY_8, // Market (child day) from Shooting Gallery /* 10 */ ENTR_MARKET_DAY_8,
// ENTR_RETURN_YOUSEI_IZUMI_YOKO // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS
/* 11 */ ENTR_ZORAS_FOUNTAIN_5, // Zoras Fountain from Farores Wind Fairy Fountain /* 11 */ ENTR_ZORAS_FOUNTAIN_5, // from Farores Wind Fairy Fountain
/* 12 */ ENTR_HYRULE_CASTLE_2, // Hyrule Castle from Dins Fire Fairy Fountain /* 12 */ ENTR_HYRULE_CASTLE_2, // from Dins Fire Fairy Fountain (as child)
/* 13 */ ENTR_DESERT_COLOSSUS_7, // Desert Colossus from Nayrus Love Fairy Fountain /* 13 */ ENTR_DESERT_COLOSSUS_7, // from Nayrus Love Fairy Fountain
}; };
/** /**
* The values are indices into `sReturnEntranceGroupData` marking the start of each group * The values are indices into `sReturnEntranceGroupData` marking the start of each group
*/ */
u8 sReturnEntranceGroupIndices[] = { u8 sReturnEntranceGroupIndices[] = {
11, // ENTR_RETURN_YOUSEI_IZUMI_YOKO 11, // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS
9, // ENTR_RETURN_SYATEKIJYOU 9, // ENTR_RETURN_SHOOTING_GALLERY
3, // ENTR_RETURN_2 3, // ENTR_RETURN_2
5, // ENTR_RETURN_SHOP1 5, // ENTR_RETURN_BAZAAR
7, // ENTR_RETURN_4 7, // ENTR_RETURN_4
0, // ENTR_RETURN_DAIYOUSEI_IZUMI 0, // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC
}; };
s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) { s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) {
@ -4436,10 +4437,10 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId)
play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex;
play->transitionType = TRANS_TYPE_FADE_WHITE; play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
} else if (play->nextEntranceIndex >= ENTR_RETURN_YOUSEI_IZUMI_YOKO) { } else if (play->nextEntranceIndex >= ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS) {
play->nextEntranceIndex = play->nextEntranceIndex =
sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex - sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex -
ENTR_RETURN_YOUSEI_IZUMI_YOKO] + ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS] +
play->spawn]; play->spawn];
Scene_SetTransitionForNextEntrance(play); Scene_SetTransitionForNextEntrance(play);
} else { } else {
@ -5100,15 +5101,15 @@ s32 func_8083AD4C(PlayState* play, Player* this) {
if (this->unk_6AD == 2) { if (this->unk_6AD == 2) {
if (func_8002DD6C(this)) { if (func_8002DD6C(this)) {
if (LINK_IS_ADULT) { if (LINK_IS_ADULT) {
cameraMode = CAM_MODE_BOWARROW; cameraMode = CAM_MODE_AIM_ADULT;
} else { } else {
cameraMode = CAM_MODE_SLINGSHOT; cameraMode = CAM_MODE_AIM_CHILD;
} }
} else { } else {
cameraMode = CAM_MODE_BOOMERANG; cameraMode = CAM_MODE_AIM_BOOMERANG;
} }
} else { } else {
cameraMode = CAM_MODE_FIRSTPERSON; cameraMode = CAM_MODE_FIRST_PERSON;
} }
return Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), cameraMode); return Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), cameraMode);
@ -5321,7 +5322,7 @@ s32 func_8083B040(Player* this, PlayState* play) {
func_80835EA4(play, (this->unk_6A8 != NULL) ? 0x5B : 0x5A); func_80835EA4(play, (this->unk_6A8 != NULL) ? 0x5B : 0x5A);
if (this->unk_6A8 != NULL) { if (this->unk_6A8 != NULL) {
this->stateFlags2 |= PLAYER_STATE2_25; this->stateFlags2 |= PLAYER_STATE2_25;
Camera_SetParam(Play_GetCamera(play, CAM_ID_MAIN), 8, this->unk_6A8); Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, this->unk_6A8);
} }
} }
} else if (func_8083AD4C(play, this)) { } else if (func_8083AD4C(play, this)) {
@ -5424,7 +5425,7 @@ s32 func_8083B644(Player* this, PlayState* play) {
s32 func_8083B8F4(Player* this, PlayState* play) { s32 func_8083B8F4(Player* this, PlayState* play) {
if (!(this->stateFlags1 & (PLAYER_STATE1_11 | PLAYER_STATE1_23)) && if (!(this->stateFlags1 & (PLAYER_STATE1_11 | PLAYER_STATE1_23)) &&
Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_FIRSTPERSON)) { Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_FIRST_PERSON)) {
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
(func_808332B8(this) && (this->actor.yDistToWater < this->ageProperties->unk_2C))) { (func_808332B8(this) && (this->actor.yDistToWater < this->ageProperties->unk_2C))) {
this->unk_6AD = 1; this->unk_6AD = 1;
@ -9206,7 +9207,7 @@ void func_80845CA4(Player* this, PlayState* play) {
temp = func_80845BA0(play, this, &sp34, sp30); temp = func_80845BA0(play, this, &sp34, sp30);
if ((this->unk_850 == 0) || ((temp == 0) && (this->linearVelocity == 0.0f) && if ((this->unk_850 == 0) || ((temp == 0) && (this->linearVelocity == 0.0f) &&
(Play_GetCamera(play, CAM_ID_MAIN)->unk_14C & 0x10))) { (Play_GetCamera(play, CAM_ID_MAIN)->stateFlags & CAM_STATE_4))) {
func_8005B1A4(Play_GetCamera(play, CAM_ID_MAIN)); func_8005B1A4(Play_GetCamera(play, CAM_ID_MAIN));
func_80845C68(play, gSaveContext.respawn[RESPAWN_MODE_DOWN].data); func_80845C68(play, gSaveContext.respawn[RESPAWN_MODE_DOWN].data);
@ -10229,52 +10230,52 @@ void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) {
Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_NORMAL); Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_NORMAL);
} else if (!(this->stateFlags1 & PLAYER_STATE1_20)) { } else if (!(this->stateFlags1 & PLAYER_STATE1_20)) {
if ((this->actor.parent != NULL) && (this->stateFlags3 & PLAYER_STATE3_7)) { if ((this->actor.parent != NULL) && (this->stateFlags3 & PLAYER_STATE3_7)) {
camMode = CAM_MODE_HOOKSHOT; camMode = CAM_MODE_HOOKSHOT_FLY;
Camera_SetParam(Play_GetCamera(play, CAM_ID_MAIN), 8, this->actor.parent); Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, this->actor.parent);
} else if (func_8084377C == this->func_674) { } else if (func_8084377C == this->func_674) {
camMode = CAM_MODE_STILL; camMode = CAM_MODE_STILL;
} else if (this->stateFlags2 & PLAYER_STATE2_8) { } else if (this->stateFlags2 & PLAYER_STATE2_8) {
camMode = CAM_MODE_PUSHPULL; camMode = CAM_MODE_PUSH_PULL;
} else if ((unk_664 = this->unk_664) != NULL) { } else if ((unk_664 = this->unk_664) != NULL) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_8)) { if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_8)) {
camMode = CAM_MODE_TALK; camMode = CAM_MODE_TALK;
} else if (this->stateFlags1 & PLAYER_STATE1_16) { } else if (this->stateFlags1 & PLAYER_STATE1_16) {
if (this->stateFlags1 & PLAYER_STATE1_25) { if (this->stateFlags1 & PLAYER_STATE1_25) {
camMode = CAM_MODE_FOLLOWBOOMERANG; camMode = CAM_MODE_FOLLOW_BOOMERANG;
} else { } else {
camMode = CAM_MODE_FOLLOWTARGET; camMode = CAM_MODE_Z_TARGET_FRIENDLY;
} }
} else { } else {
camMode = CAM_MODE_BATTLE; camMode = CAM_MODE_Z_TARGET_UNFRIENDLY;
} }
Camera_SetParam(Play_GetCamera(play, CAM_ID_MAIN), 8, unk_664); Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, unk_664);
} else if (this->stateFlags1 & PLAYER_STATE1_12) { } else if (this->stateFlags1 & PLAYER_STATE1_12) {
camMode = CAM_MODE_CHARGE; camMode = CAM_MODE_CHARGE;
} else if (this->stateFlags1 & PLAYER_STATE1_25) { } else if (this->stateFlags1 & PLAYER_STATE1_25) {
camMode = CAM_MODE_FOLLOWBOOMERANG; camMode = CAM_MODE_FOLLOW_BOOMERANG;
Camera_SetParam(Play_GetCamera(play, CAM_ID_MAIN), 8, this->boomerangActor); Camera_SetViewParam(Play_GetCamera(play, CAM_ID_MAIN), CAM_VIEW_TARGET, this->boomerangActor);
} else if (this->stateFlags1 & (PLAYER_STATE1_13 | PLAYER_STATE1_14)) { } else if (this->stateFlags1 & (PLAYER_STATE1_13 | PLAYER_STATE1_14)) {
if (func_80833B2C(this)) { if (func_80833B2C(this)) {
camMode = CAM_MODE_HANGZ; camMode = CAM_MODE_Z_LEDGE_HANG;
} else { } else {
camMode = CAM_MODE_HANG; camMode = CAM_MODE_LEDGE_HANG;
} }
} else if (this->stateFlags1 & (PLAYER_STATE1_17 | PLAYER_STATE1_30)) { } else if (this->stateFlags1 & (PLAYER_STATE1_17 | PLAYER_STATE1_30)) {
if (func_8002DD78(this) || func_808334B4(this)) { if (func_8002DD78(this) || func_808334B4(this)) {
camMode = CAM_MODE_BOWARROWZ; camMode = CAM_MODE_Z_AIM;
} else if (this->stateFlags1 & PLAYER_STATE1_21) { } else if (this->stateFlags1 & PLAYER_STATE1_21) {
camMode = CAM_MODE_CLIMBZ; camMode = CAM_MODE_Z_WALL_CLIMB;
} else { } else {
camMode = CAM_MODE_TARGET; camMode = CAM_MODE_Z_PARALLEL;
} }
} else if (this->stateFlags1 & (PLAYER_STATE1_18 | PLAYER_STATE1_21)) { } else if (this->stateFlags1 & (PLAYER_STATE1_18 | PLAYER_STATE1_21)) {
if ((func_80845668 == this->func_674) || (this->stateFlags1 & PLAYER_STATE1_21)) { if ((func_80845668 == this->func_674) || (this->stateFlags1 & PLAYER_STATE1_21)) {
camMode = CAM_MODE_CLIMB; camMode = CAM_MODE_WALL_CLIMB;
} else { } else {
camMode = CAM_MODE_JUMP; camMode = CAM_MODE_JUMP;
} }
} else if (this->stateFlags1 & PLAYER_STATE1_19) { } else if (this->stateFlags1 & PLAYER_STATE1_19) {
camMode = CAM_MODE_FREEFALL; camMode = CAM_MODE_FREE_FALL;
} else if ((this->meleeWeaponState != 0) && (this->meleeWeaponAnimation >= PLAYER_MWA_FORWARD_SLASH_1H) && } else if ((this->meleeWeaponState != 0) && (this->meleeWeaponAnimation >= PLAYER_MWA_FORWARD_SLASH_1H) &&
(this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H)) { (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H)) {
camMode = CAM_MODE_STILL; camMode = CAM_MODE_STILL;
@ -12549,7 +12550,7 @@ void func_8084E3C4(Player* this, PlayState* play) {
this->stateFlags1 &= ~PLAYER_STATE1_29; this->stateFlags1 &= ~PLAYER_STATE1_29;
func_80852FFC(play, NULL, 8); func_80852FFC(play, NULL, 8);
play->mainCamera.unk_14C &= ~8; play->mainCamera.stateFlags &= ~CAM_STATE_3;
this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29;
this->stateFlags2 |= PLAYER_STATE2_27; this->stateFlags2 |= PLAYER_STATE2_27;
@ -13169,7 +13170,7 @@ s32 func_8084FCAC(Player* this, PlayState* play) {
D_808535D0 ^= 1; D_808535D0 ^= 1;
if (D_808535D0) { if (D_808535D0) {
Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_BOWARROWZ); Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_Z_AIM);
} }
} }

View file

@ -45,84 +45,65 @@ void MapSelect_LoadGame(MapSelectState* this, s32 entranceIndex) {
// "Translation" (Actual name) // "Translation" (Actual name)
static SceneSelectEntry sScenes[] = { static SceneSelectEntry sScenes[] = {
// "1: SPOT00" (Hyrule Field)
{ " 1:SPOT00", MapSelect_LoadGame, ENTR_HYRULE_FIELD_0 }, { " 1:SPOT00", MapSelect_LoadGame, ENTR_HYRULE_FIELD_0 },
// "2: SPOT01" (Kakariko Village)
{ " 2:SPOT01", MapSelect_LoadGame, ENTR_KAKARIKO_VILLAGE_0 }, { " 2:SPOT01", MapSelect_LoadGame, ENTR_KAKARIKO_VILLAGE_0 },
// "3: SPOT02" (Graveyard)
{ " 3:SPOT02", MapSelect_LoadGame, ENTR_GRAVEYARD_0 }, { " 3:SPOT02", MapSelect_LoadGame, ENTR_GRAVEYARD_0 },
// "4: SPOT03" (Zora's River)
{ " 4:SPOT03", MapSelect_LoadGame, ENTR_ZORAS_RIVER_0 }, { " 4:SPOT03", MapSelect_LoadGame, ENTR_ZORAS_RIVER_0 },
// "5: SPOT04" (Kokiri Forest)
{ " 5:SPOT04", MapSelect_LoadGame, ENTR_KOKIRI_FOREST_0 }, { " 5:SPOT04", MapSelect_LoadGame, ENTR_KOKIRI_FOREST_0 },
// "6: SPOT05" (Sacred Forest Meadow)
{ " 6:SPOT05", MapSelect_LoadGame, ENTR_SACRED_FOREST_MEADOW_0 }, { " 6:SPOT05", MapSelect_LoadGame, ENTR_SACRED_FOREST_MEADOW_0 },
// "7: SPOT06" (Lake Hylia)
{ " 7:SPOT06", MapSelect_LoadGame, ENTR_LAKE_HYLIA_0 }, { " 7:SPOT06", MapSelect_LoadGame, ENTR_LAKE_HYLIA_0 },
// "8: SPOT07" (Zora's Domain)
{ " 8:SPOT07", MapSelect_LoadGame, ENTR_ZORAS_DOMAIN_0 }, { " 8:SPOT07", MapSelect_LoadGame, ENTR_ZORAS_DOMAIN_0 },
// "9: SPOT08" (Zora's Fountain)
{ " 9:SPOT08", MapSelect_LoadGame, ENTR_ZORAS_FOUNTAIN_0 }, { " 9:SPOT08", MapSelect_LoadGame, ENTR_ZORAS_FOUNTAIN_0 },
// "10: SPOT09" (Gerudo Valley)
{ "10:SPOT09", MapSelect_LoadGame, ENTR_GERUDO_VALLEY_0 }, { "10:SPOT09", MapSelect_LoadGame, ENTR_GERUDO_VALLEY_0 },
// "11: SPOT10" (Lost Woods)
{ "11:SPOT10", MapSelect_LoadGame, ENTR_LOST_WOODS_0 }, { "11:SPOT10", MapSelect_LoadGame, ENTR_LOST_WOODS_0 },
// "12: SPOT11" (Desert Colossus)
{ "12:SPOT11", MapSelect_LoadGame, ENTR_DESERT_COLOSSUS_0 }, { "12:SPOT11", MapSelect_LoadGame, ENTR_DESERT_COLOSSUS_0 },
// "13: SPOT12" (Gerudo's Fortress)
{ "13:SPOT12", MapSelect_LoadGame, ENTR_GERUDOS_FORTRESS_0 }, { "13:SPOT12", MapSelect_LoadGame, ENTR_GERUDOS_FORTRESS_0 },
// "14: SPOT13" (Haunted Wasteland)
{ "14:SPOT13", MapSelect_LoadGame, ENTR_HAUNTED_WASTELAND_0 }, { "14:SPOT13", MapSelect_LoadGame, ENTR_HAUNTED_WASTELAND_0 },
// "15: SPOT15" (Hyrule Castle)
{ "15:SPOT15", MapSelect_LoadGame, ENTR_HYRULE_CASTLE_0 }, { "15:SPOT15", MapSelect_LoadGame, ENTR_HYRULE_CASTLE_0 },
// "16: SPOT16" (Death Mountain Trail)
{ "16:SPOT16", MapSelect_LoadGame, ENTR_DEATH_MOUNTAIN_TRAIL_0 }, { "16:SPOT16", MapSelect_LoadGame, ENTR_DEATH_MOUNTAIN_TRAIL_0 },
// "17: SPOT17" (Death Mountain Crater)
{ "17:SPOT17", MapSelect_LoadGame, ENTR_DEATH_MOUNTAIN_CRATER_0 }, { "17:SPOT17", MapSelect_LoadGame, ENTR_DEATH_MOUNTAIN_CRATER_0 },
// "18: SPOT18" (Goron City)
{ "18:SPOT18", MapSelect_LoadGame, ENTR_GORON_CITY_0 }, { "18:SPOT18", MapSelect_LoadGame, ENTR_GORON_CITY_0 },
// "19: SPOT20" (Lon Lon Ranch)
{ "19:SPOT20", MapSelect_LoadGame, ENTR_LON_LON_RANCH_0 }, { "19:SPOT20", MapSelect_LoadGame, ENTR_LON_LON_RANCH_0 },
// "20: Chamber of Time" (Temple Of Time) // "20: Chamber of Time"
{ "20:" GFXP_HIRAGANA "トキノマ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_0 }, { "20:" GFXP_HIRAGANA "トキノマ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_0 },
// "21: Chamber of the Sages" (Chamber of the Sages) // "21: Chamber of the Sages"
{ "21:" GFXP_HIRAGANA "ケンジャノマ", MapSelect_LoadGame, ENTR_CHAMBER_OF_THE_SAGES_0 }, { "21:" GFXP_HIRAGANA "ケンジャノマ", MapSelect_LoadGame, ENTR_CHAMBER_OF_THE_SAGES_0 },
// "22: Target Range" (Shooting Gallery) // "22: Target Range"
{ "22:" GFXP_HIRAGANA "シャテキジョウ", MapSelect_LoadGame, ENTR_SHOOTING_GALLERY_0 }, { "22:" GFXP_HIRAGANA "シャテキジョウ", MapSelect_LoadGame, ENTR_SHOOTING_GALLERY_0 },
// "23: Hyrule Garden Game" (Hyrule Garden Minigame) // "23: Hyrule Garden Game"
{ "23:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", MapSelect_LoadGame, { "23:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", MapSelect_LoadGame,
ENTR_CASTLE_COURTYARD_GUARDS_DAY_0 }, ENTR_CASTLE_COURTYARD_GUARDS_DAY_0 },
// "24: Grave Dive Hole" (Grave (Redead)) // "24: Grave Dive Hole"
{ "24:" GFXP_HIRAGANA "ハカシタトビコミアナ", MapSelect_LoadGame, ENTR_REDEAD_GRAVE_0 }, { "24:" GFXP_HIRAGANA "ハカシタトビコミアナ", MapSelect_LoadGame, ENTR_REDEAD_GRAVE_0 },
// "25: Grave Dive Hole 2" (Grave (Fairy's Fountain)) // "25: Grave Dive Hole 2"
{ "25:" GFXP_HIRAGANA "ハカシタトビコミアナ 2", MapSelect_LoadGame, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, { "25:" GFXP_HIRAGANA "ハカシタトビコミアナ 2", MapSelect_LoadGame, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 },
// "26: Royal Family's Grave" (Royal Family's Tomb) // "26: Royal Family's Grave"
{ "26:" GFXP_HIRAGANA "オウケ ノ ハカアナ", MapSelect_LoadGame, ENTR_ROYAL_FAMILYS_TOMB_0 }, { "26:" GFXP_HIRAGANA "オウケ ノ ハカアナ", MapSelect_LoadGame, ENTR_ROYAL_FAMILYS_TOMB_0 },
// "27: Great Fairy's Fountain" (Great Fairy's Fountain (Upgrades)) // "27: Great Fairy's Fountain"
{ "27:" GFXP_HIRAGANA "ダイヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0 }, { "27:" GFXP_HIRAGANA "ダイヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0 },
// "28: Fairy Dive Hole" (Fairy's Fountain (Healing Fairies)) // "28: Fairy Dive Hole"
{ "28:" GFXP_HIRAGANA "トビコミ ヨウセイ アナ", MapSelect_LoadGame, ENTR_FAIRYS_FOUNTAIN_0 }, { "28:" GFXP_HIRAGANA "トビコミ ヨウセイ アナ", MapSelect_LoadGame, ENTR_FAIRYS_FOUNTAIN_0 },
// "29: Magic Stone Fairy's Fountain" (Great Fairy's Fountain (Spells)) // "29: Magic Stone Fairy's Fountain"
{ "29:" GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0 }, { "29:" GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", MapSelect_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0 },
// "30: Final Battle With Ganon" (Battle With Ganon) // "30: Final Battle With Ganon"
{ "30:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0 }, { "30:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", MapSelect_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0 },
// "31: Hyrule Inner Garden" (Castle Courtyard) // "31: Hyrule Inner Garden"
{ "31:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", MapSelect_LoadGame, ENTR_CASTLE_COURTYARD_ZELDA_0 }, { "31:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", MapSelect_LoadGame, ENTR_CASTLE_COURTYARD_ZELDA_0 },
// "32: Fishing" (Fishing Pond) // "32: Fishing"
{ "32:" GFXP_HIRAGANA "ツリボリ", MapSelect_LoadGame, ENTR_FISHING_POND_0 }, { "32:" GFXP_HIRAGANA "ツリボリ", MapSelect_LoadGame, ENTR_FISHING_POND_0 },
// "33: Bombchu Bowling" (Bombchu Bowling Alley) // "33: Bombchu Bowling"
{ "33:" GFXP_KATAKANA "ボムチュウボーリング", MapSelect_LoadGame, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, { "33:" GFXP_KATAKANA "ボムチュウボーリング", MapSelect_LoadGame, ENTR_BOMBCHU_BOWLING_ALLEY_0 },
// "34: Lon Lon Ranch - Storehouse 1" (Talon's House) // "34: Lon Lon Ranch - Storehouse 1" (Talon's House)
{ "34:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_0 }, { "34:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_0 },
// "35: Lon Lon Ranch - Storehouse 2" (Ranch Silo) // "35: Lon Lon Ranch - Storehouse 2" (Ranch Silo)
{ "35:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_1 }, { "35:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", MapSelect_LoadGame, ENTR_LON_LON_BUILDINGS_1 },
// "36: Lookout Hut" (Guard House) // "36: Lookout Hut"
{ "36:" GFXP_HIRAGANA "ミハリ ゴヤ", MapSelect_LoadGame, ENTR_MARKET_GUARD_HOUSE_0 }, { "36:" GFXP_HIRAGANA "ミハリ ゴヤ", MapSelect_LoadGame, ENTR_MARKET_GUARD_HOUSE_0 },
// "37: Magic Potion Shop" (Granny's Potion Shop) // "37: Magic Potion Shop"
{ "37:" GFXP_HIRAGANA "マホウ ノ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_GRANNY_0 }, { "37:" GFXP_HIRAGANA "マホウ ノ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_GRANNY_0 },
// "38: Treasure Chest Shop" (Treasure Chest Game) // "38: Treasure Chest Shop"
{ "38:" GFXP_HIRAGANA "タカラバコヤ", MapSelect_LoadGame, ENTR_TREASURE_BOX_SHOP_0 }, { "38:" GFXP_HIRAGANA "タカラバコヤ", MapSelect_LoadGame, ENTR_TREASURE_BOX_SHOP_0 },
// "39: Gold Skulltula House" (House of Skulltula) // "39: Gold Skulltula House"
{ "39:" GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", MapSelect_LoadGame, ENTR_HOUSE_OF_SKULLTULA_0 }, { "39:" GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", MapSelect_LoadGame, ENTR_HOUSE_OF_SKULLTULA_0 },
// "40: Castle Town - Entrance" (Market Entrance) // "40: Castle Town - Entrance" (Market Entrance)
{ "40:" GFXP_HIRAGANA "ジョウカマチ イリグチ", MapSelect_LoadGame, ENTR_MARKET_ENTRANCE_DAY_0 }, { "40:" GFXP_HIRAGANA "ジョウカマチ イリグチ", MapSelect_LoadGame, ENTR_MARKET_ENTRANCE_DAY_0 },
@ -132,98 +113,98 @@ static SceneSelectEntry sScenes[] = {
{ "42:" GFXP_HIRAGANA "ウラロジ", MapSelect_LoadGame, ENTR_BACK_ALLEY_DAY_0 }, { "42:" GFXP_HIRAGANA "ウラロジ", MapSelect_LoadGame, ENTR_BACK_ALLEY_DAY_0 },
// "43: In Front of the Temple of Time" (Temple of Time Exterior) // "43: In Front of the Temple of Time" (Temple of Time Exterior)
{ "43:" GFXP_HIRAGANA "トキノシンデン マエ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0 }, { "43:" GFXP_HIRAGANA "トキノシンデン マエ", MapSelect_LoadGame, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0 },
// "44: Link's House" (Link's House) // "44: Link's House"
{ "44:" GFXP_HIRAGANA "リンクノイエ", MapSelect_LoadGame, ENTR_LINKS_HOUSE_0 }, { "44:" GFXP_HIRAGANA "リンクノイエ", MapSelect_LoadGame, ENTR_LINKS_HOUSE_0 },
// "45: Kakariko Village Row House" (Carpenter Boss's House) // "45: Kakariko Village Row House"
{ "45:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", MapSelect_LoadGame, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, { "45:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", MapSelect_LoadGame, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 },
// "46: Back Alley House" (Back Alley House (Man in Green)) // "46: Back Alley House"
{ "46:" GFXP_HIRAGANA "ウラロジノ イエ", MapSelect_LoadGame, ENTR_BACK_ALLEY_HOUSE_0 }, { "46:" GFXP_HIRAGANA "ウラロジノ イエ", MapSelect_LoadGame, ENTR_BACK_ALLEY_HOUSE_0 },
// "47: Kokiri Village - Know-It-All Brothers' House" (Know-It-All Brothers' House) // "47: Kokiri Village - Know-It-All Brothers' House"
{ "47:" GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", MapSelect_LoadGame, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, { "47:" GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", MapSelect_LoadGame, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 },
// "48: Kokiri Village - Twins' House" (Twins' House) // "48: Kokiri Village - Twins' House"
{ "48:" GFXP_HIRAGANA "コキリノムラ フタゴノイエ", MapSelect_LoadGame, ENTR_TWINS_HOUSE_0 }, { "48:" GFXP_HIRAGANA "コキリノムラ フタゴノイエ", MapSelect_LoadGame, ENTR_TWINS_HOUSE_0 },
// "49: Kokiri Village - Mido's House" (Mido's House) // "49: Kokiri Village - Mido's House"
{ "49:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_MIDOS_HOUSE_0 }, { "49:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_MIDOS_HOUSE_0 },
// "50: Kokiri Village - Saria's House" (Saria's House) // "50: Kokiri Village - Saria's House"
{ "50:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_SARIAS_HOUSE_0 }, { "50:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_SARIAS_HOUSE_0 },
// "51: Stable" (Stable) // "51: Stable"
{ "51:" GFXP_HIRAGANA "ウマゴヤ", MapSelect_LoadGame, ENTR_STABLE_0 }, { "51:" GFXP_HIRAGANA "ウマゴヤ", MapSelect_LoadGame, ENTR_STABLE_0 },
// "52: Grave Keeper's House" (Gravekeeper's Hut) // "52: Grave Keeper's House"
{ "52:" GFXP_HIRAGANA "ハカモリノイエ", MapSelect_LoadGame, ENTR_GRAVEKEEPERS_HUT_0 }, { "52:" GFXP_HIRAGANA "ハカモリノイエ", MapSelect_LoadGame, ENTR_GRAVEKEEPERS_HUT_0 },
// "53: Back Alley - Dog Lady's House" (Back Alley House) // "53: Back Alley - Dog Lady's House"
{ "53:" GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", MapSelect_LoadGame, ENTR_DOG_LADY_HOUSE_0 }, { "53:" GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", MapSelect_LoadGame, ENTR_DOG_LADY_HOUSE_0 },
// "54: Kakariko Village - Impa's House" (Impa's House) // "54: Kakariko Village - Impa's House"
{ "54:" GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_IMPAS_HOUSE_0 }, { "54:" GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", MapSelect_LoadGame, ENTR_IMPAS_HOUSE_0 },
// "55: Hylia Laboratory" (Lakeside Laboratory) // "55: Hylia Laboratory"
{ "55:" GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", MapSelect_LoadGame, ENTR_LAKESIDE_LABORATORY_0 }, { "55:" GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", MapSelect_LoadGame, ENTR_LAKESIDE_LABORATORY_0 },
// "56: Tent" (Carpenters' Tent) // "56: Tent"
{ "56:" GFXP_KATAKANA "テント", MapSelect_LoadGame, ENTR_CARPENTERS_TENT_0 }, { "56:" GFXP_KATAKANA "テント", MapSelect_LoadGame, ENTR_CARPENTERS_TENT_0 },
// "57: Shield Shop" (Bazaar) // "57: Shield Shop"
{ "57:" GFXP_HIRAGANA "タテノミセ", MapSelect_LoadGame, ENTR_BAZAAR_0 }, { "57:" GFXP_HIRAGANA "タテノミセ", MapSelect_LoadGame, ENTR_BAZAAR_0 },
// "58: Kokiri Shop" (Kokiri Shop) // "58: Kokiri Shop"
{ "58:" GFXP_HIRAGANA "コキリゾクノミセ", MapSelect_LoadGame, ENTR_KOKIRI_SHOP_0 }, { "58:" GFXP_HIRAGANA "コキリゾクノミセ", MapSelect_LoadGame, ENTR_KOKIRI_SHOP_0 },
// "59: Goron Shop" (Goron Shop) // "59: Goron Shop"
{ "59:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_GORON_SHOP_0 }, { "59:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_GORON_SHOP_0 },
// "60: Zora Shop" (Zora Shop) // "60: Zora Shop"
{ "60:" GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_ZORA_SHOP_0 }, { "60:" GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", MapSelect_LoadGame, ENTR_ZORA_SHOP_0 },
// "61: Kakariko Village - Potion Shop" (Kakariko Potion Shop) // "61: Kakariko Village - Potion Shop"
{ "61:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_KAKARIKO_0 }, { "61:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_KAKARIKO_0 },
// "62: Castle Town - Potion Shop" (Market Potion Shop) // "62: Castle Town - Potion Shop"
{ "62:" GFXP_HIRAGANA "ジョウカマチ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_MARKET_0 }, { "62:" GFXP_HIRAGANA "ジョウカマチ クスリヤ", MapSelect_LoadGame, ENTR_POTION_SHOP_MARKET_0 },
// "63: Back Alley - Night Shop" (Bombchu Shop) // "63: Back Alley - Night Shop"
{ "63:" GFXP_HIRAGANA "ウラロジ ヨルノミセ", MapSelect_LoadGame, ENTR_BOMBCHU_SHOP_0 }, { "63:" GFXP_HIRAGANA "ウラロジ ヨルノミセ", MapSelect_LoadGame, ENTR_BOMBCHU_SHOP_0 },
// "64: Mask Shop" (Happy Mask Shop) // "64: Mask Shop"
{ "64:" GFXP_HIRAGANA "オメンヤ", MapSelect_LoadGame, ENTR_HAPPY_MASK_SHOP_0 }, { "64:" GFXP_HIRAGANA "オメンヤ", MapSelect_LoadGame, ENTR_HAPPY_MASK_SHOP_0 },
// "65: Gerudo Training Area" (Gerudo Training Ground) // "65: Gerudo Training Area"
{ "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", MapSelect_LoadGame, ENTR_GERUDO_TRAINING_GROUND_0 }, { "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", MapSelect_LoadGame, ENTR_GERUDO_TRAINING_GROUND_0 },
// "66: Fairy Tree Dungeon" (Inside the Deku Tree) // "66: Fairy Tree Dungeon"
{ "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_DEKU_TREE_0 }, { "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_DEKU_TREE_0 },
// "67: Fairy Tree Dungeon - Boss" (Gohma's Lair) // "67: Fairy Tree Dungeon - Boss"
{ "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_DEKU_TREE_BOSS_0 }, { "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_DEKU_TREE_BOSS_0 },
// "68: Dondogo Dungeon" (Dodongo's Cavern) // "68: Dondogo Dungeon"
{ "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_0 }, { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_0 },
// "69: Dondogo Dungeon - Boss" (King Dodongo's Lair) // "69: Dondogo Dungeon - Boss"
{ "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_BOSS_0 }, { "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", MapSelect_LoadGame, ENTR_DODONGOS_CAVERN_BOSS_0 },
// "70: Giant Fish Dungeon" (Inside Jabu-Jabu's Belly) // "70: Giant Fish Dungeon"
{ "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_JABU_JABU_0 }, { "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_JABU_JABU_0 },
// "71: Giant Fish Dungeon - Boss" (Barinade's Lair) // "71: Giant Fish Dungeon - Boss"
{ "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_JABU_JABU_BOSS_0 }, { "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_JABU_JABU_BOSS_0 },
// "72: Forest Temple" (Forest Temple) // "72: Forest Temple"
{ "72:" GFXP_HIRAGANA "モリノシンデン", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_0 }, { "72:" GFXP_HIRAGANA "モリノシンデン", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_0 },
// "73: Forest Temple - Boss" (Phantom Ganon's Lair) // "73: Forest Temple - Boss"
{ "73:" GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_BOSS_0 }, { "73:" GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FOREST_TEMPLE_BOSS_0 },
// "74: Dungeon Below the Well" (Bottom of the Well) // "74: Dungeon Below the Well"
{ "74:" GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_BOTTOM_OF_THE_WELL_0 }, { "74:" GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_BOTTOM_OF_THE_WELL_0 },
// "75: Dungeon Beneath the Graves" (Shadow Temple) // "75: Dungeon Beneath the Graves"
{ "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_0 }, { "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_0 },
// "76: Dungeon Beneath the Graves - Boss" (Bongo Bongo's Lair) // "76: Dungeon Beneath the Graves - Boss"
{ "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_BOSS_0 }, { "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SHADOW_TEMPLE_BOSS_0 },
// "77: Fire Temple" (Fire Temple) // "77: Fire Temple"
{ "77:" GFXP_HIRAGANA "ヒノシンデン", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_0 }, { "77:" GFXP_HIRAGANA "ヒノシンデン", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_0 },
// "78: Fire Temple - Boss" (Volvagia's Lair) // "78: Fire Temple - Boss"
{ "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_BOSS_0 }, { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_FIRE_TEMPLE_BOSS_0 },
// "79: Water Temple" (Water Temple) // "79: Water Temple"
{ "79:" GFXP_HIRAGANA "ミズノシンデン", MapSelect_LoadGame, ENTR_WATER_TEMPLE_0 }, { "79:" GFXP_HIRAGANA "ミズノシンデン", MapSelect_LoadGame, ENTR_WATER_TEMPLE_0 },
// "80: Water Temple - Boss" (Morpha's Lair) // "80: Water Temple - Boss"
{ "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_WATER_TEMPLE_BOSS_0 }, { "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_WATER_TEMPLE_BOSS_0 },
// "81: Evil Goddess Statue Dungeon" (Spirit Temple) // "81: Evil Goddess Statue Dungeon"
{ "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_0 }, { "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_0 },
// "82: Evil Goddess Statue Dungeon - Iron Knuckle" (Iron Knuckle's Lair) // "82: Evil Goddess Statue Dungeon - Iron Knuckle" (Iron Knuckle's Lair)
{ "82:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_0 }, { "82:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_0 },
// "83: Evil Goddess Statue Dungeon - Boss" (Twinrova's Lair) // "83: Evil Goddess Statue Dungeon - Boss" (Twinrova's Lair)
{ "83:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_2 }, { "83:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", MapSelect_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_2 },
// "84: Ganon's Tower" (Ganon's Tower) // "84: Ganon's Tower"
{ "84:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", MapSelect_LoadGame, ENTR_GANONS_TOWER_0 }, { "84:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", MapSelect_LoadGame, ENTR_GANONS_TOWER_0 },
// "85: Ganon's Tower - Boss" (Ganondorf's Lair) // "85: Ganon's Tower - Boss"
{ "85:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_GANONDORF_BOSS_0 }, { "85:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", MapSelect_LoadGame, ENTR_GANONDORF_BOSS_0 },
// "86: Ice Cavern" (Ice Cavern) // "86: Ice Cavern"
{ "86:" GFXP_HIRAGANA "コオリノドウクツ", MapSelect_LoadGame, ENTR_ICE_CAVERN_0 }, { "86:" GFXP_HIRAGANA "コオリノドウクツ", MapSelect_LoadGame, ENTR_ICE_CAVERN_0 },
// "87: Relay Beneath the Graves" (Dampé's Grave) // "87: Relay Beneath the Graves" (Dampé's Grave)
{ "87:" GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", MapSelect_LoadGame, ENTR_WINDMILL_AND_DAMPES_GRAVE_0 }, { "87:" GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", MapSelect_LoadGame, ENTR_WINDMILL_AND_DAMPES_GRAVE_0 },
// "88: Ganon's Basement Dungeon" (Inside Ganon's Castle) // "88: Ganon's Basement Dungeon"
{ "88:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame, { "88:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", MapSelect_LoadGame,
ENTR_INSIDE_GANONS_CASTLE_0 }, ENTR_INSIDE_GANONS_CASTLE_0 },
// "89: Final Battle With Ganon - Cutscene & Battle" (Ganondorf's Death Scene & Tower Escape Exterior) // "89: Final Battle With Ganon - Cutscene & Battle"
{ "89:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", MapSelect_LoadGame, { "89:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", MapSelect_LoadGame,
ENTR_GANON_BOSS_0 }, ENTR_GANON_BOSS_0 },
// "90: Ganon's Tower Aftermath 1" (Escaping Ganon's Tower 1) // "90: Ganon's Tower Aftermath 1" (Escaping Ganon's Tower 1)
@ -238,7 +219,7 @@ static SceneSelectEntry sScenes[] = {
// "93: Ganon's Tower Aftermath 4" (Escaping Ganon's Tower 4) // "93: Ganon's Tower Aftermath 4" (Escaping Ganon's Tower 4)
{ "93:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", MapSelect_LoadGame, { "93:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", MapSelect_LoadGame,
ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6 }, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6 },
// "94: Ganon's Basement Aftermath" (Escaping Ganon's Castle) // "94: Ganon's Basement Aftermath"
{ "94:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", MapSelect_LoadGame, ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0 }, { "94:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", MapSelect_LoadGame, ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0 },
// "95: Gerudo Passage 1-2" (Thieves' Hideout 1) // "95: Gerudo Passage 1-2" (Thieves' Hideout 1)
{ "95:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_0 }, { "95:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", MapSelect_LoadGame, ENTR_THIEVES_HIDEOUT_0 },
@ -280,7 +261,7 @@ static SceneSelectEntry sScenes[] = {
{ "113:" GFXP_HIRAGANA "カクシトビコミアナ 12", MapSelect_LoadGame, ENTR_GROTTOS_12 }, { "113:" GFXP_HIRAGANA "カクシトビコミアナ 12", MapSelect_LoadGame, ENTR_GROTTOS_12 },
// "114: Hidden Dive Hole 13" (Grotto 13 - Rupees & Cow) // "114: Hidden Dive Hole 13" (Grotto 13 - Rupees & Cow)
{ "114:" GFXP_HIRAGANA "カクシトビコミアナ 13", MapSelect_LoadGame, ENTR_GROTTOS_13 }, { "114:" GFXP_HIRAGANA "カクシトビコミアナ 13", MapSelect_LoadGame, ENTR_GROTTOS_13 },
// "115: Hyrule Cutscenes" (Cutscene Map) // "115: Hyrule Cutscenes"
{ "115:" GFXP_KATAKANA "ハイラル デモ", MapSelect_LoadGame, ENTR_CUTSCENE_MAP_0 }, { "115:" GFXP_KATAKANA "ハイラル デモ", MapSelect_LoadGame, ENTR_CUTSCENE_MAP_0 },
// "116: Special Room (Treasure Chest Warp)" (Ganondorf Test Room) // "116: Special Room (Treasure Chest Warp)" (Ganondorf Test Room)
{ "116:" GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", MapSelect_LoadGame, ENTR_BESITU_0 }, { "116:" GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", MapSelect_LoadGame, ENTR_BESITU_0 },
@ -296,8 +277,8 @@ static SceneSelectEntry sScenes[] = {
{ "121:" GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", MapSelect_LoadGame, ENTR_SYOTES2_0 }, { "121:" GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", MapSelect_LoadGame, ENTR_SYOTES2_0 },
// "122: Stal" (Sutaru) // "122: Stal" (Sutaru)
{ "122:Sutaru", MapSelect_LoadGame, ENTR_SUTARU_0 }, { "122:Sutaru", MapSelect_LoadGame, ENTR_SUTARU_0 },
// "123: Test Area" (Shooting Gallery) // "123: Test Area"
{ "123:jikkenjyou", MapSelect_LoadGame, ENTR_TEST_SYATEKIJYOU_0 }, { "123:jikkenjyou", MapSelect_LoadGame, ENTR_TEST_SHOOTING_GALLERY_0 },
// "124: Depth Test" (Depth Test) // "124: Depth Test" (Depth Test)
{ "124:depth" GFXP_KATAKANA "テスト", MapSelect_LoadGame, ENTR_DEPTH_TEST_0 }, { "124:depth" GFXP_KATAKANA "テスト", MapSelect_LoadGame, ENTR_DEPTH_TEST_0 },
// "125: Hyrule Garden Game 2" (Early Hyrule Garden Game) // "125: Hyrule Garden Game 2" (Early Hyrule Garden Game)

View file

@ -6,7 +6,7 @@
[subrepo] [subrepo]
remote = https://github.com/zeldaret/ZAPD.git remote = https://github.com/zeldaret/ZAPD.git
branch = master branch = master
commit = f54f2fa96bfc476a15fcc3ebcd6124bc19164fcd commit = dcf56d93ecbd4db3bfd8a4832d7f991467964b98
parent = 0a95d17aa89d6a80d3b23c7e706ec4bf845d48c1 parent = 9bad1d108e6311562c8424eefc92f0f1004551c9
method = merge method = merge
cmdver = 0.4.3 cmdver = 0.4.5

View file

@ -58,9 +58,11 @@ void ExporterExample_Collision::Save(ZResource* res, [[maybe_unused]] fs::path o
writer->Seek(col->polyTypeDefSegmentOffset, SeekOffsetType::Start); writer->Seek(col->polyTypeDefSegmentOffset, SeekOffsetType::Start);
for (uint16_t i = 0; i < col->polygonTypes.size(); i++) for (const auto& poly : col->polygonTypes)
writer->Write(col->polygonTypes[i]); {
writer->Write(poly.data[0]);
writer->Write(poly.data[1]);
}
writer->Seek(col->camDataSegmentOffset, SeekOffsetType::Start); writer->Seek(col->camDataSegmentOffset, SeekOffsetType::Start);
for (auto entry : col->camData->entries) for (auto entry : col->camData->entries)

View file

@ -30,7 +30,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -43,7 +43,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

View file

@ -334,7 +334,7 @@ void ExporterExample_Room::Save(ZResource* res, fs::path outPath, BinaryWriter*
writer->Write(entry.rotX); writer->Write(entry.rotX);
writer->Write(entry.rotY); writer->Write(entry.rotY);
writer->Write(entry.rotZ); writer->Write(entry.rotZ);
writer->Write(entry.initVar); writer->Write(entry.params);
} }
writer->Seek(oldOffset, SeekOffsetType::Start); writer->Seek(oldOffset, SeekOffsetType::Start);

View file

@ -68,6 +68,15 @@ pipeline {
} }
} }
// INSTALL PYTHON DEPENDENCIES, currently MM only
stage('Install Python dependencies') {
steps {
dir('mm') {
sh 'python3 -m pip install -r requirements.txt'
}
}
}
// BUILD THE REPOS // BUILD THE REPOS
stage('Build repos') { stage('Build repos') {
parallel { parallel {
@ -82,7 +91,7 @@ pipeline {
steps { steps {
dir('mm') { dir('mm') {
sh 'make -j disasm' sh 'make -j disasm'
sh 'make -j all' sh 'make -j'
} }
} }
} }

View file

@ -15,7 +15,7 @@ else
CXX := g++ CXX := g++
endif endif
INC := -I ZAPD -I lib/elfio -I lib/libgfxd -I lib/tinyxml2 -I ZAPDUtils INC := -I ZAPD -I lib/libgfxd -I lib/tinyxml2 -I ZAPDUtils
CXXFLAGS := -fpic -std=c++17 -Wall -Wextra -fno-omit-frame-pointer CXXFLAGS := -fpic -std=c++17 -Wall -Wextra -fno-omit-frame-pointer
OPTFLAGS := OPTFLAGS :=

View file

@ -71,9 +71,6 @@ ZAPD needs a _File parsing mode_ to be passed as first parameter. The options ar
- `blb`: "Build blob" mode. - `blb`: "Build blob" mode.
- In this mode, ZAPD expects a BIN file as input and a filename as ouput. - In this mode, ZAPD expects a BIN file as input and a filename as ouput.
- ZAPD will try to convert the given BIN into the contents of a `uint8_t` C array. - ZAPD will try to convert the given BIN into the contents of a `uint8_t` C array.
- `bovl`: "Build overlay" mode.
- In this mode, ZAPD expects an overlay C file as input, a filename as ouput and an overlay configuration path (`-cfg`).
- ZAPD will generate a reloc `.s` file.
ZAPD also accepts the following list of extra parameters: ZAPD also accepts the following list of extra parameters:
@ -102,8 +99,6 @@ ZAPD also accepts the following list of extra parameters:
- `ia16` - `ia16`
- `ci4` - `ci4`
- `ci8` - `ci8`
- `-cfg PATH`: Set cfg path (for overlays).
- Can be used only in `bovl` mode.
- `-rconf PATH` Read Config File. - `-rconf PATH` Read Config File.
- `-eh`: Enable error handler. - `-eh`: Enable error handler.
- Only available in non-Windows environments. - Only available in non-Windows environments.

View file

@ -0,0 +1,205 @@
#include "CrashHandler.h"
#include "Utils/StringHelper.h"
#if __has_include(<unistd.h>)
#define HAS_POSIX 1
#else
#define HAS_POSIX 0
#endif
#include <array>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#if HAS_POSIX == 1
#include <csignal>
#include <cxxabi.h> // for __cxa_demangle
#include <dlfcn.h> // for dladdr
#include <execinfo.h>
#include <unistd.h>
#elif defined(_MSC_VER)
#include <Windows.h>
#include <DbgHelp.h>
#include <inttypes.h>
#pragma comment(lib, "Dbghelp.lib")
#endif
// Feel free to add more crash messages.
static std::array<const char* const, 14> crashEasterEgg = {
"\tYou've met with a terrible fate, haven't you?",
"\tSEA BEARS FOAM. SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY: CRASSSH!",
"\tZAPD has fallen and cannot get up.",
"\tIT'S A SECRET TO EVERYBODY. \n\tBut it shouldn't be, you'd better ask about it!",
"\tI AM ERROR.",
"\tGRUMBLE,GRUMBLE...",
"\tDODONGO DISLIKES SMOKE \n\tAnd ZAPD dislikes whatever you fed it.",
"\tMay the way of the Hero lead \n\tto the debugger.",
"\tTHE WIND FISH SLUMBERS LONG... \n\tTHE HERO'S LIFE GONE... ",
"\tSEA BEARS FOAM, SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY CRASSSH!",
"\tYou've met with a terrible fate, haven't you?",
"\tMaster, I calculate a 100% probability that ZAPD has crashed. \n\tAdditionally, the "
"batteries in your Wii Remote are nearly depleted.",
"\t CONGRATURATIONS! \n"
"\tAll Pages are displayed.\n"
"\t THANK YOU! \n"
"\t You are great debugger!",
"\tRCP is HUNG UP!!\n"
"\tOh! MY GOD!!",
};
#if HAS_POSIX == 1
void ErrorHandler(int sig)
{
std::array<void*, 4096> arr;
constexpr size_t nMaxFrames = arr.size();
size_t size = backtrace(arr.data(), nMaxFrames);
char** symbols = backtrace_symbols(arr.data(), nMaxFrames);
fprintf(stderr, "\nZAPD crashed. (Signal: %i)\n", sig);
srand(time(nullptr));
auto easterIndex = rand() % crashEasterEgg.size();
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
fprintf(stderr, "Traceback:\n");
for (size_t i = 1; i < size; i++)
{
Dl_info info;
uint32_t gotAddress = dladdr(arr[i], &info);
std::string functionName(symbols[i]);
if (gotAddress != 0 && info.dli_sname != nullptr)
{
int32_t status;
char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);
const char* nameFound = info.dli_sname;
if (status == 0)
{
nameFound = demangled;
}
functionName = StringHelper::Sprintf("%s (+0x%X)", nameFound,
(char*)arr[i] - (char*)info.dli_saddr);
free(demangled);
}
fprintf(stderr, "%-3zd %s\n", i, functionName.c_str());
}
fprintf(stderr, "\n");
free(symbols);
exit(1);
}
#elif defined(_MSC_VER)
void printStack(CONTEXT* ctx)
{
BOOL result;
HANDLE process;
HANDLE thread;
HMODULE hModule;
ULONG frame;
DWORD64 displacement;
DWORD disp;
srand(time(nullptr));
auto easterIndex = rand() % crashEasterEgg.size();
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
#if defined(_M_AMD64)
STACKFRAME64 stack;
memset(&stack, 0, sizeof(STACKFRAME64));
#else
STACKFRAME stack;
memset(&stack, 0, sizeof(STACKFRAME));
#endif
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME + sizeof(TCHAR)];
char module[512];
PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
CONTEXT ctx2;
memcpy(&ctx2, ctx, sizeof(CONTEXT));
process = GetCurrentProcess();
thread = GetCurrentThread();
SymInitialize(process, nullptr, TRUE);
constexpr DWORD machineType =
#if defined(_M_AMD64)
IMAGE_FILE_MACHINE_AMD64;
#else
IMAGE_FILE_MACHINE_I386;
#endif
displacement = 0;
for (frame = 0;; frame++)
{
result = StackWalk(machineType, process, thread, &stack, &ctx2, nullptr,
SymFunctionTableAccess, SymGetModuleBase, nullptr);
if (!result)
{
break;
}
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = MAX_SYM_NAME;
SymFromAddr(process, (ULONG64)stack.AddrPC.Offset, &displacement, symbol);
#if defined(_M_AMD64)
IMAGEHLP_LINE64 line;
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
#else
IMAGEHLP_LINE line;
line.SizeOfStruct = sizeof(IMAGEHLP_LINE);
#endif
if (SymGetLineFromAddr(process, stack.AddrPC.Offset, &disp, &line))
{
fprintf(stderr, "%u\t %s in %s: line: %lu: \n", frame, symbol->Name, line.FileName,
line.LineNumber);
}
else
{
fprintf(stderr, "%u\tat % s\n", frame, symbol->Name);
hModule = nullptr;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCTSTR)(stack.AddrPC.Offset), &hModule);
if (hModule != nullptr)
{
GetModuleFileNameA(hModule, module, 512 - 1);
}
fprintf(stderr, "%u\tIn %s\n", frame, module);
}
}
}
LONG seh_filter(_EXCEPTION_POINTERS* ex)
{
fprintf(stderr, "EXCEPTION 0x%x occured\n", ex->ExceptionRecord->ExceptionCode);
printStack(ex->ContextRecord);
return EXCEPTION_EXECUTE_HANDLER;
}
#endif
void CrashHandler_Init()
{
#if HAS_POSIX == 1
signal(SIGSEGV, ErrorHandler);
signal(SIGABRT, ErrorHandler);
#elif defined(_MSC_VER)
SetUnhandledExceptionFilter(seh_filter);
#else
HANDLE_WARNING(WarningType::Always,
"tried to set error handler, but this ZAPD build lacks support for one", "");
#endif
}

View file

@ -0,0 +1,6 @@
#ifndef CRASH_HANDLER_H
#define CRASH_HANDLER_H
void CrashHandler_Init();
#endif

View file

@ -94,6 +94,26 @@ void GameConfig::ConfigFunc_ObjectList(const tinyxml2::XMLElement& element)
objectList.emplace_back(std::move(line)); objectList.emplace_back(std::move(line));
} }
void GameConfig::ConfigFunc_EntranceList(const tinyxml2::XMLElement& element)
{
std::string fileName = element.Attribute("File");
std::vector<std::string> lines =
File::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
for (auto& line : lines)
entranceList.emplace_back(std::move(line));
}
void GameConfig::ConfigFunc_specialEntranceList(const tinyxml2::XMLElement& element)
{
std::string fileName = element.Attribute("File");
std::vector<std::string> lines =
File::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
for (auto& line : lines)
specialEntranceList.emplace_back(std::move(line));
}
void GameConfig::ConfigFunc_TexturePool(const tinyxml2::XMLElement& element) void GameConfig::ConfigFunc_TexturePool(const tinyxml2::XMLElement& element)
{ {
std::string fileName = element.Attribute("File"); std::string fileName = element.Attribute("File");
@ -145,10 +165,12 @@ void GameConfig::ConfigFunc_ExternalFile(const tinyxml2::XMLElement& element)
void GameConfig::ReadConfigFile(const fs::path& argConfigFilePath) void GameConfig::ReadConfigFile(const fs::path& argConfigFilePath)
{ {
static const std::map<std::string, ConfigFunc> ConfigFuncDictionary = { static const std::unordered_map<std::string, ConfigFunc> ConfigFuncDictionary = {
{"SymbolMap", &GameConfig::ConfigFunc_SymbolMap}, {"SymbolMap", &GameConfig::ConfigFunc_SymbolMap},
{"ActorList", &GameConfig::ConfigFunc_ActorList}, {"ActorList", &GameConfig::ConfigFunc_ActorList},
{"ObjectList", &GameConfig::ConfigFunc_ObjectList}, {"ObjectList", &GameConfig::ConfigFunc_ObjectList},
{"EntranceList", &GameConfig::ConfigFunc_EntranceList},
{"SpecialEntranceList", &GameConfig::ConfigFunc_specialEntranceList},
{"TexturePool", &GameConfig::ConfigFunc_TexturePool}, {"TexturePool", &GameConfig::ConfigFunc_TexturePool},
{"BGConfig", &GameConfig::ConfigFunc_BGConfig}, {"BGConfig", &GameConfig::ConfigFunc_BGConfig},
{"ExternalXMLFolder", &GameConfig::ConfigFunc_ExternalXMLFolder}, {"ExternalXMLFolder", &GameConfig::ConfigFunc_ExternalXMLFolder},

View file

@ -31,6 +31,8 @@ public:
std::map<uint32_t, std::string> symbolMap; std::map<uint32_t, std::string> symbolMap;
std::vector<std::string> actorList; std::vector<std::string> actorList;
std::vector<std::string> objectList; std::vector<std::string> objectList;
std::vector<std::string> entranceList;
std::vector<std::string> specialEntranceList;
std::map<uint32_t, TexturePoolEntry> texturePool; // Key = CRC std::map<uint32_t, TexturePoolEntry> texturePool; // Key = CRC
// ZBackground // ZBackground
@ -49,6 +51,8 @@ public:
void ConfigFunc_SymbolMap(const tinyxml2::XMLElement& element); void ConfigFunc_SymbolMap(const tinyxml2::XMLElement& element);
void ConfigFunc_ActorList(const tinyxml2::XMLElement& element); void ConfigFunc_ActorList(const tinyxml2::XMLElement& element);
void ConfigFunc_ObjectList(const tinyxml2::XMLElement& element); void ConfigFunc_ObjectList(const tinyxml2::XMLElement& element);
void ConfigFunc_EntranceList(const tinyxml2::XMLElement& element);
void ConfigFunc_specialEntranceList(const tinyxml2::XMLElement& element);
void ConfigFunc_TexturePool(const tinyxml2::XMLElement& element); void ConfigFunc_TexturePool(const tinyxml2::XMLElement& element);
void ConfigFunc_BGConfig(const tinyxml2::XMLElement& element); void ConfigFunc_BGConfig(const tinyxml2::XMLElement& element);
void ConfigFunc_ExternalXMLFolder(const tinyxml2::XMLElement& element); void ConfigFunc_ExternalXMLFolder(const tinyxml2::XMLElement& element);

View file

@ -1,5 +1,4 @@
#include "Globals.h" #include "Globals.h"
#include "Overlays/ZOverlay.h"
#include "Utils/Directory.h" #include "Utils/Directory.h"
#include "Utils/File.h" #include "Utils/File.h"
#include "Utils/Path.h" #include "Utils/Path.h"
@ -10,22 +9,12 @@
#include "ZFile.h" #include "ZFile.h"
#include "ZTexture.h" #include "ZTexture.h"
#if !defined(_MSC_VER) && !defined(__CYGWIN__) #include "CrashHandler.h"
#include <csignal>
#include <cstdlib>
#include <ctime>
#include <cxxabi.h> // for __cxa_demangle
#include <dlfcn.h> // for dladdr
#include <execinfo.h>
#include <unistd.h>
#endif
#include <string> #include <string>
#include <string_view> #include <string_view>
#include "tinyxml2.h" #include "tinyxml2.h"
extern const char gBuildHash[];
bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath, bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
ZFileMode fileMode); ZFileMode fileMode);
@ -33,61 +22,7 @@ void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const f
void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath); void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath);
void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath); void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath);
#if !defined(_MSC_VER) && !defined(__CYGWIN__) extern const char gBuildHash[];
#define ARRAY_COUNT(arr) (sizeof(arr) / sizeof(arr[0]))
void ErrorHandler(int sig)
{
void* array[4096];
const size_t nMaxFrames = sizeof(array) / sizeof(array[0]);
size_t size = backtrace(array, nMaxFrames);
char** symbols = backtrace_symbols(array, nMaxFrames);
fprintf(stderr, "\nZAPD crashed. (Signal: %i)\n", sig);
// Feel free to add more crash messages.
const char* crashEasterEgg[] = {
"\tYou've met with a terrible fate, haven't you?",
"\tSEA BEARS FOAM. SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY: CRASSSH!",
"\tZAPD has fallen and cannot get up.",
};
srand(time(nullptr));
auto easterIndex = rand() % ARRAY_COUNT(crashEasterEgg);
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
fprintf(stderr, "Traceback:\n");
for (size_t i = 1; i < size; i++)
{
Dl_info info;
uint32_t gotAddress = dladdr(array[i], &info);
std::string functionName(symbols[i]);
if (gotAddress != 0 && info.dli_sname != nullptr)
{
int32_t status;
char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);
const char* nameFound = info.dli_sname;
if (status == 0)
{
nameFound = demangled;
}
functionName = StringHelper::Sprintf("%s (+0x%X)", nameFound,
(char*)array[i] - (char*)info.dli_saddr);
free(demangled);
}
fprintf(stderr, "%-3zd %s\n", i, functionName.c_str());
}
fprintf(stderr, "\n");
free(symbols);
exit(1);
}
#endif
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
@ -175,26 +110,13 @@ int main(int argc, char* argv[])
{ {
Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[++i]); Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[++i]);
} }
else if (arg == "-cfg") // Set cfg path (for overlays)
// TODO: Change the name of this to something else so it doesn't
// get confused with XML config files.
{
Globals::Instance->cfgPath = argv[++i];
}
else if (arg == "-rconf") // Read Config File else if (arg == "-rconf") // Read Config File
{ {
Globals::Instance->cfg.ReadConfigFile(argv[++i]); Globals::Instance->cfg.ReadConfigFile(argv[++i]);
} }
else if (arg == "-eh") // Enable Error Handler else if (arg == "-eh") // Enable Error Handler
{ {
#if !defined(_MSC_VER) && !defined(__CYGWIN__) CrashHandler_Init();
signal(SIGSEGV, ErrorHandler);
signal(SIGABRT, ErrorHandler);
#else
HANDLE_WARNING(WarningType::Always,
"tried to set error handler, but this ZAPD build lacks support for one",
"");
#endif
} }
else if (arg == "-v") // Verbose else if (arg == "-v") // Verbose
{ {
@ -231,8 +153,6 @@ int main(int argc, char* argv[])
fileMode = ZFileMode::BuildTexture; fileMode = ZFileMode::BuildTexture;
else if (buildMode == "bren") else if (buildMode == "bren")
fileMode = ZFileMode::BuildBackground; fileMode = ZFileMode::BuildBackground;
else if (buildMode == "bovl")
fileMode = ZFileMode::BuildOverlay;
else if (buildMode == "bsf") else if (buildMode == "bsf")
fileMode = ZFileMode::BuildSourceFile; fileMode = ZFileMode::BuildSourceFile;
else if (buildMode == "bblb") else if (buildMode == "bblb")
@ -314,16 +234,6 @@ int main(int argc, char* argv[])
{ {
BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath); BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath);
} }
else if (fileMode == ZFileMode::BuildOverlay)
{
ZOverlay* overlay =
ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath),
Path::GetDirectoryName(Globals::Instance->cfgPath));
if (overlay != nullptr)
File::WriteAllText(Globals::Instance->outputPath.string(),
overlay->GetSourceOutputCode(""));
}
delete g; delete g;
return 0; return 0;

View file

@ -54,6 +54,7 @@ CutsceneMMCommand_GenericCmd::CutsceneMMCommand_GenericCmd(const std::vector<uin
commandID = static_cast<uint32_t>(cmdId); commandID = static_cast<uint32_t>(cmdId);
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_GenericMMCmd(rawData, rawDataIndex, cmdId); auto* entry = new CutsceneSubCommandEntry_GenericMMCmd(rawData, rawDataIndex, cmdId);
@ -96,6 +97,7 @@ CutsceneMMCommand_Camera::CutsceneMMCommand_Camera(const std::vector<uint8_t>& r
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries / 4; i++) for (size_t i = 0; i < numEntries / 4; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_Camera(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_Camera(rawData, rawDataIndex);
@ -138,6 +140,7 @@ CutsceneMMCommand_FadeScreen::CutsceneMMCommand_FadeScreen(const std::vector<uin
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_FadeScreen(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_FadeScreen(rawData, rawDataIndex);
@ -174,6 +177,7 @@ CutsceneMMCommand_FadeSeq::CutsceneMMCommand_FadeSeq(const std::vector<uint8_t>&
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_FadeSeq(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_FadeSeq(rawData, rawDataIndex);
@ -199,6 +203,7 @@ CutsceneMMCommand_NonImplemented::CutsceneMMCommand_NonImplemented(
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_NonImplemented(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_NonImplemented(rawData, rawDataIndex);

View file

@ -154,6 +154,7 @@ CutsceneCommand_GenericCmd::CutsceneCommand_GenericCmd(const std::vector<uint8_t
rawDataIndex += 4; rawDataIndex += 4;
commandID = static_cast<uint32_t>(cmdId); commandID = static_cast<uint32_t>(cmdId);
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
@ -320,6 +321,7 @@ CutsceneCommand_Rumble::CutsceneCommand_Rumble(const std::vector<uint8_t>& rawDa
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_Rumble(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_Rumble(rawData, rawDataIndex);
@ -363,6 +365,7 @@ CutsceneCommand_SetTime::CutsceneCommand_SetTime(const std::vector<uint8_t>& raw
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_SetTime(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_SetTime(rawData, rawDataIndex);
@ -438,6 +441,7 @@ CutsceneCommand_TextBox::CutsceneCommand_TextBox(const std::vector<uint8_t>& raw
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_TextBox(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_TextBox(rawData, rawDataIndex);
@ -516,6 +520,7 @@ CutsceneCommand_ActorAction::CutsceneCommand_ActorAction(const std::vector<uint8
{ {
rawDataIndex += 4; rawDataIndex += 4;
entries.reserve(numEntries);
for (size_t i = 0; i < numEntries; i++) for (size_t i = 0; i < numEntries; i++)
{ {
auto* entry = new CutsceneSubCommandEntry_ActorAction(rawData, rawDataIndex); auto* entry = new CutsceneSubCommandEntry_ActorAction(rawData, rawDataIndex);

View file

@ -104,6 +104,8 @@ void Struct_800A598C::ParseRawData()
if (unk_8 != 0 && GETSEGNUM(unk_8) == parent->segment) if (unk_8 != 0 && GETSEGNUM(unk_8) == parent->segment)
{ {
uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress);
unk_8_arr.reserve(unk_0);
for (size_t i = 0; i < unk_0; i++) for (size_t i = 0; i < unk_0; i++)
{ {
Struct_800A57C0 unk8_data(parent); Struct_800A57C0 unk8_data(parent);
@ -117,6 +119,8 @@ void Struct_800A598C::ParseRawData()
if (unk_C != 0 && GETSEGNUM(unk_8) == parent->segment) if (unk_C != 0 && GETSEGNUM(unk_8) == parent->segment)
{ {
uint32_t unk_C_Offset = Seg2Filespace(unk_C, parent->baseAddress); uint32_t unk_C_Offset = Seg2Filespace(unk_C, parent->baseAddress);
unk_C_arr.reserve(unk_2);
for (size_t i = 0; i < unk_2; i++) for (size_t i = 0; i < unk_2; i++)
{ {
Struct_800A598C_2 unkC_data(parent); Struct_800A598C_2 unkC_data(parent);
@ -244,6 +248,8 @@ void Struct_800A5E28::ParseRawData()
if (unk_4 != 0 && GETSEGNUM(unk_4) == parent->segment) if (unk_4 != 0 && GETSEGNUM(unk_4) == parent->segment)
{ {
uint32_t unk_4_Offset = Seg2Filespace(unk_4, parent->baseAddress); uint32_t unk_4_Offset = Seg2Filespace(unk_4, parent->baseAddress);
unk_4_arr.reserve(unk_2);
for (size_t i = 0; i < unk_2; i++) for (size_t i = 0; i < unk_2; i++)
{ {
Struct_800A598C unk_4_data(parent); Struct_800A598C unk_4_data(parent);

View file

@ -1,352 +0,0 @@
#include "ZOverlay.h"
#include <cassert>
#include <unordered_set>
#include "Globals.h"
#include "Utils/Directory.h"
#include "Utils/File.h"
#include "Utils/Path.h"
#include "Utils/StringHelper.h"
#include "WarningHandler.h"
using namespace ELFIO;
const char* RelocationEntry::GetSectionName() const
{
switch (sectionType)
{
case SectionType::Text:
return ".text";
case SectionType::Data:
return ".data";
case SectionType::RoData:
return ".rodata";
case SectionType::Bss:
return ".bss";
case SectionType::ERROR:
return ".ERROR";
}
assert(!"Oh no :c");
}
const char* RelocationEntry::GetRelocTypeName() const
{
switch (relocationType)
{
case RelocationType::R_MIPS_32:
return "R_MIPS_32";
case RelocationType::R_MIPS_26:
return "R_MIPS_26";
case RelocationType::R_MIPS_HI16:
return "R_MIPS_HI16";
case RelocationType::R_MIPS_LO16:
return "R_MIPS_LO16";
}
assert(!"Oh no :c");
}
ZOverlay::ZOverlay()
{
name = "";
entries = std::vector<RelocationEntry*>();
}
ZOverlay::ZOverlay(const std::string& nName) : ZOverlay()
{
name = nName;
}
ZOverlay::~ZOverlay()
{
for (auto entry : entries)
if (entry)
delete entry;
entries.clear();
}
static const std::unordered_set<std::string> sRelSections = {
".rel.text",
".rel.data",
".rel.rodata",
};
static const std::unordered_set<std::string> sSections = {
".text", ".data", ".symtab", ".rodata", ".rodata.str1.4", ".rodata.cst4", ".rodata.cst8",
};
ZOverlay* ZOverlay::FromBuild(fs::path buildPath, fs::path cfgFolderPath)
{
std::string cfgText = File::ReadAllText(cfgFolderPath / "overlay.cfg");
std::vector<std::string> cfgLines = StringHelper::Split(cfgText, "\n");
ZOverlay* ovl = new ZOverlay(StringHelper::Strip(cfgLines[0], "\r"));
ovl->cfgLines = cfgLines;
int32_t sectionOffs[5] = {0};
std::vector<RelocationEntry*> textRelocs;
std::vector<RelocationEntry*> dataRelocs;
std::vector<RelocationEntry*> rodataRelocs;
// get the elf files
std::vector<elfio*> readers;
for (size_t i = 1; i < cfgLines.size(); i++)
{
std::string elfPath =
(buildPath / (cfgLines[i].substr(0, cfgLines[i].size() - 2) + ".o")).string();
elfio* reader = new elfio();
if (!reader->load(elfPath))
{
// not all files were compiled
for (auto r : readers)
delete r;
readers.clear();
delete ovl;
return nullptr;
}
readers.push_back(reader);
}
for (size_t curReaderId = 0; curReaderId < readers.size(); curReaderId++)
{
auto& curReader = readers[curReaderId];
Elf_Half sec_num = curReader->sections.size();
for (int32_t i = 0; i < sec_num; i++)
{
section* pSec = curReader->sections[i];
if (pSec->get_type() != SHT_REL ||
sRelSections.find(pSec->get_name()) == sRelSections.end())
{
continue;
}
symbol_section_accessor currentSymbols(*curReader,
curReader->sections[(Elf_Half)pSec->get_link()]);
SectionType sectionType = GetSectionTypeFromStr(pSec->get_name());
if (sectionType == SectionType::ERROR)
{
HANDLE_WARNING(WarningType::Always, "one of the section types returned ERROR", "");
}
relocation_section_accessor relocs(*curReader, pSec);
for (Elf_Xword j = 0; j < relocs.get_entries_num(); j++)
{
Elf64_Addr offset = 0;
Elf_Word symbol = 0;
Elf_Word type = 0;
{
Elf_Sxword addend = 0;
relocs.get_entry(j, offset, symbol, type, addend);
}
std::string curSymName;
Elf_Half curSymShndx = SHN_UNDEF;
{
Elf64_Addr value;
Elf_Xword size;
unsigned char bind;
unsigned char type;
unsigned char other;
currentSymbols.get_symbol(symbol, curSymName, value, size, bind, type,
curSymShndx, other);
}
// check symbols outside the elf but within the overlay
if (curSymShndx == SHN_UNDEF)
{
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_DEBUG)
{
printf("Symbol '%s' doesn't exist in current .o file (%s). Searching...\n",
curSymName.c_str(), cfgLines[curReaderId + 1].c_str());
}
for (size_t readerId = 0; readerId < readers.size(); readerId++)
{
auto& reader = readers[readerId];
if (curSymShndx != SHN_UNDEF)
break;
if (reader == curReader)
continue;
auto sectionData = reader->sections[(Elf_Half)pSec->get_link()];
curSymShndx =
ovl->FindSymbolInSection(curSymName, sectionData, *reader, readerId);
if (curSymShndx != SHN_UNDEF)
break;
if (Globals::Instance->gccCompat)
{
// Symbol wasn't found, try checking every section
Elf_Half sec_num = reader->sections.size();
for (int32_t otherSectionIdx = 0; otherSectionIdx < sec_num;
otherSectionIdx++)
{
if (curSymShndx != SHN_UNDEF)
{
break;
}
auto sectionDataIter = reader->sections[otherSectionIdx];
curSymShndx = ovl->FindSymbolInSection(curSymName, sectionDataIter,
*reader, readerId);
}
}
}
}
if (curSymShndx != SHN_UNDEF)
{
RelocationType typeConverted = (RelocationType)type;
offset += sectionOffs[static_cast<size_t>(sectionType)];
RelocationEntry* reloc =
new RelocationEntry(sectionType, typeConverted, offset);
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_DEBUG)
{
printf(".word 0x%08X # %s %s 0x%04X\n", reloc->CalcRelocationWord(),
reloc->GetSectionName(), reloc->GetRelocTypeName(), reloc->offset);
}
// this is to keep the correct reloc entry order
if (sectionType == SectionType::Text)
textRelocs.push_back(reloc);
if (sectionType == SectionType::Data)
dataRelocs.push_back(reloc);
if (sectionType == SectionType::RoData)
rodataRelocs.push_back(reloc);
}
}
}
// increase section offsets
for (int32_t i = 0; i < sec_num; i++)
{
section* pSec = curReader->sections[i];
if (pSec->get_type() == SHT_PROGBITS &&
sSections.find(pSec->get_name()) != sSections.end())
{
SectionType sectionType = GetSectionTypeFromStr(pSec->get_name());
sectionOffs[static_cast<size_t>(sectionType)] += pSec->get_size();
}
}
}
ovl->entries.reserve(textRelocs.size() + dataRelocs.size() + rodataRelocs.size());
ovl->entries.insert(ovl->entries.end(), textRelocs.begin(), textRelocs.end());
ovl->entries.insert(ovl->entries.end(), dataRelocs.begin(), dataRelocs.end());
ovl->entries.insert(ovl->entries.end(), rodataRelocs.begin(), rodataRelocs.end());
for (auto r : readers)
delete r;
readers.clear();
return ovl;
}
std::string ZOverlay::GetSourceOutputCode([[maybe_unused]] const std::string& prefix)
{
std::string output;
output += ".section .ovl\n";
output += StringHelper::Sprintf("# %sOverlayInfo\n", name.c_str());
output += StringHelper::Sprintf(".word _%sSegmentTextSize\n", name.c_str());
output += StringHelper::Sprintf(".word _%sSegmentDataSize\n", name.c_str());
output += StringHelper::Sprintf(".word _%sSegmentRoDataSize\n", name.c_str());
output += StringHelper::Sprintf(".word _%sSegmentBssSize\n", name.c_str());
output += "\n";
output += StringHelper::Sprintf(".word %i # reloc_count\n", entries.size());
for (size_t i = 0; i < entries.size(); i++)
{
RelocationEntry* reloc = entries[i];
output += StringHelper::Sprintf(".word 0x%08X # %s %s 0x%04X\n",
reloc->CalcRelocationWord(), reloc->GetSectionName(),
reloc->GetRelocTypeName(), reloc->offset);
}
size_t offset = (entries.size() * 4) + 20;
while (offset % 16 != 12)
{
output += ".word 0\n";
offset += 4;
}
output += "\n";
output +=
StringHelper::Sprintf(".word 0x%08X # %sOverlayInfoOffset\n", offset + 4, name.c_str());
return output;
}
SectionType ZOverlay::GetSectionTypeFromStr(const std::string& sectionName)
{
if (sectionName == ".rel.text" || sectionName == ".text")
return SectionType::Text;
else if (sectionName == ".rel.data" || sectionName == ".data")
return SectionType::Data;
else if (sectionName == ".rel.rodata" || sectionName == ".rodata" ||
sectionName == ".rodata.str1.4" || sectionName == ".rodata.cst4")
return SectionType::RoData;
else if (sectionName == ".rel.bss" || sectionName == ".bss")
return SectionType::Bss;
return SectionType::ERROR;
}
ELFIO::Elf_Half ZOverlay::FindSymbolInSection(const std::string& curSymName,
ELFIO::section* sectionData, ELFIO::elfio& reader,
size_t readerId)
{
if (sectionData == nullptr)
return SHN_UNDEF;
auto sectionDataName = sectionData->get_name();
if (sSections.find(sectionDataName) == sSections.end())
return SHN_UNDEF;
#ifdef DEVELOPMENT
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_DEBUG)
{
printf("\t File '%s' section: %s \n", cfgLines[readerId + 1].c_str(),
sectionDataName.c_str());
}
#endif
symbol_section_accessor symbols(reader, sectionData);
Elf_Xword symbolNum = symbols.get_symbols_num();
for (Elf_Xword symIdx = 0; symIdx < symbolNum; symIdx++)
{
Elf_Half shndx = SHN_UNDEF;
Elf64_Addr value;
std::string name;
Elf_Xword size;
unsigned char bind;
unsigned char type;
unsigned char other;
symbols.get_symbol(symIdx, name, value, size, bind, type, shndx, other);
if (name == curSymName)
{
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_DEBUG)
{
printf("\t Symbol '%s' found in '%s' '%s' \n", curSymName.c_str(),
cfgLines[readerId + 1].c_str(), sectionDataName.c_str());
}
return shndx;
}
}
return SHN_UNDEF;
}

View file

@ -1,75 +0,0 @@
#pragma once
#include "Utils/Directory.h"
#include "ZResource.h"
#include "elfio/elfio.hpp"
#include "tinyxml2.h"
enum class SectionType
{
Text = 1,
Data = 2,
RoData = 3,
Bss = 4,
ERROR = 255
};
enum class RelocationType
{
R_MIPS_32 = 2,
R_MIPS_26 = 4,
R_MIPS_HI16 = 5,
R_MIPS_LO16 = 6,
};
class RelocationEntry
{
public:
SectionType sectionType;
RelocationType relocationType;
int32_t offset;
RelocationEntry(SectionType nSecType, RelocationType nRelType, int32_t nOffset)
{
sectionType = nSecType;
relocationType = nRelType;
offset = nOffset;
}
uint32_t CalcRelocationWord()
{
uint32_t relocationWord = 0;
relocationWord |= static_cast<uint32_t>(sectionType) << 30;
relocationWord |= static_cast<uint32_t>(relocationType) << 24;
relocationWord |= offset;
return relocationWord;
}
const char* GetSectionName() const;
const char* GetRelocTypeName() const;
};
class ZOverlay
{
public:
std::string name;
ZOverlay(const std::string& nName);
~ZOverlay();
static ZOverlay* FromBuild(fs::path buildPath, fs::path cfgFolderPath);
std::string GetSourceOutputCode(const std::string& prefix);
private:
std::vector<RelocationEntry*> entries;
std::vector<std::string> cfgLines;
ZOverlay();
static SectionType GetSectionTypeFromStr(const std::string& sectionName);
// static std::string GetOverlayNameFromElf(ELFIO::elfio& reader);
ELFIO::Elf_Half FindSymbolInSection(const std::string& curSymName, ELFIO::section* sectionData,
ELFIO::elfio& reader, size_t readerId);
};

View file

@ -30,26 +30,26 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
@ -95,10 +95,11 @@
</ClCompile> </ClCompile>
<Link> <Link>
<Profile>true</Profile> <Profile>true</Profile>
<SubSystem>Console</SubSystem>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>cd .. <Command>cd ..
mkdir build\ZAPD mkdir build\ZAPD
python ZAPD/genbuildinfo.py</Command> python ZAPD/genbuildinfo.py</Command>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -119,10 +120,11 @@ mkdir build\ZAPD
<Profile>true</Profile> <Profile>true</Profile>
<AdditionalDependencies>ZAPDUtils.lib;/WHOLEARCHIVE:ExporterExample.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>ZAPDUtils.lib;/WHOLEARCHIVE:ExporterExample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<SubSystem>Console</SubSystem>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>cd .. <Command>cd ..
mkdir build\ZAPD mkdir build\ZAPD
python ZAPD/genbuildinfo.py</Command> python ZAPD/genbuildinfo.py</Command>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -141,8 +143,8 @@ mkdir build\ZAPD
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>cd .. <Command>cd ..
mkdir build\ZAPD mkdir build\ZAPD
python ZAPD/genbuildinfo.py</Command> python ZAPD/genbuildinfo.py</Command>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -163,8 +165,8 @@ mkdir build\ZAPD
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>cd .. <Command>cd ..
mkdir build\ZAPD mkdir build\ZAPD
python ZAPD/genbuildinfo.py</Command> python ZAPD/genbuildinfo.py</Command>
</PreBuildEvent> </PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -177,6 +179,7 @@ mkdir build\ZAPD
<ClCompile Include="..\lib\libgfxd\uc_f3dex.c" /> <ClCompile Include="..\lib\libgfxd\uc_f3dex.c" />
<ClCompile Include="..\lib\libgfxd\uc_f3dex2.c" /> <ClCompile Include="..\lib\libgfxd\uc_f3dex2.c" />
<ClCompile Include="..\lib\libgfxd\uc_f3dexb.c" /> <ClCompile Include="..\lib\libgfxd\uc_f3dexb.c" />
<ClCompile Include="CrashHandler.cpp" />
<ClCompile Include="Declaration.cpp" /> <ClCompile Include="Declaration.cpp" />
<ClCompile Include="GameConfig.cpp" /> <ClCompile Include="GameConfig.cpp" />
<ClCompile Include="Globals.cpp" /> <ClCompile Include="Globals.cpp" />
@ -186,8 +189,8 @@ mkdir build\ZAPD
<ClCompile Include="OtherStructs\Cutscene_Commands.cpp" /> <ClCompile Include="OtherStructs\Cutscene_Commands.cpp" />
<ClCompile Include="OtherStructs\SkinLimbStructs.cpp" /> <ClCompile Include="OtherStructs\SkinLimbStructs.cpp" />
<ClCompile Include="OutputFormatter.cpp" /> <ClCompile Include="OutputFormatter.cpp" />
<ClCompile Include="Overlays\ZOverlay.cpp" />
<ClCompile Include="WarningHandler.cpp" /> <ClCompile Include="WarningHandler.cpp" />
<ClCompile Include="ZActorList.cpp" />
<ClCompile Include="ZArray.cpp" /> <ClCompile Include="ZArray.cpp" />
<ClCompile Include="ZBackground.cpp" /> <ClCompile Include="ZBackground.cpp" />
<ClCompile Include="ZCollisionPoly.cpp" /> <ClCompile Include="ZCollisionPoly.cpp" />
@ -240,6 +243,7 @@ mkdir build\ZAPD
<ClCompile Include="ZRoom\ZRoom.cpp" /> <ClCompile Include="ZRoom\ZRoom.cpp" />
<ClCompile Include="ZRoom\ZRoomCommand.cpp" /> <ClCompile Include="ZRoom\ZRoomCommand.cpp" />
<ClCompile Include="ZString.cpp" /> <ClCompile Include="ZString.cpp" />
<ClCompile Include="ZSurfaceType.cpp" />
<ClCompile Include="ZSymbol.cpp" /> <ClCompile Include="ZSymbol.cpp" />
<ClCompile Include="ZTexture.cpp" /> <ClCompile Include="ZTexture.cpp" />
<ClCompile Include="ZTextureAnimation.cpp" /> <ClCompile Include="ZTextureAnimation.cpp" />
@ -265,6 +269,7 @@ mkdir build\ZAPD
<ClInclude Include="..\lib\stb\stb_image.h" /> <ClInclude Include="..\lib\stb\stb_image.h" />
<ClInclude Include="..\lib\stb\stb_image_write.h" /> <ClInclude Include="..\lib\stb\stb_image_write.h" />
<ClInclude Include="..\lib\stb\tinyxml2.h" /> <ClInclude Include="..\lib\stb\tinyxml2.h" />
<ClInclude Include="CrashHandler.h" />
<ClInclude Include="CRC32.h" /> <ClInclude Include="CRC32.h" />
<ClInclude Include="Declaration.h" /> <ClInclude Include="Declaration.h" />
<ClInclude Include="GameConfig.h" /> <ClInclude Include="GameConfig.h" />
@ -274,8 +279,8 @@ mkdir build\ZAPD
<ClInclude Include="OtherStructs\Cutscene_Commands.h" /> <ClInclude Include="OtherStructs\Cutscene_Commands.h" />
<ClInclude Include="OtherStructs\SkinLimbStructs.h" /> <ClInclude Include="OtherStructs\SkinLimbStructs.h" />
<ClInclude Include="OutputFormatter.h" /> <ClInclude Include="OutputFormatter.h" />
<ClInclude Include="Overlays\ZOverlay.h" />
<ClInclude Include="WarningHandler.h" /> <ClInclude Include="WarningHandler.h" />
<ClInclude Include="ZActorList.h" />
<ClInclude Include="ZAnimation.h" /> <ClInclude Include="ZAnimation.h" />
<ClInclude Include="ZArray.h" /> <ClInclude Include="ZArray.h" />
<ClInclude Include="ZBackground.h" /> <ClInclude Include="ZBackground.h" />
@ -328,6 +333,7 @@ mkdir build\ZAPD
<ClInclude Include="ZRoom\ZRoom.h" /> <ClInclude Include="ZRoom\ZRoom.h" />
<ClInclude Include="ZRoom\ZRoomCommand.h" /> <ClInclude Include="ZRoom\ZRoomCommand.h" />
<ClInclude Include="ZString.h" /> <ClInclude Include="ZString.h" />
<ClInclude Include="ZSurfaceType.h" />
<ClInclude Include="ZSymbol.h" /> <ClInclude Include="ZSymbol.h" />
<ClInclude Include="ZTexture.h" /> <ClInclude Include="ZTexture.h" />
<ClInclude Include="ZTextureAnimation.h" /> <ClInclude Include="ZTextureAnimation.h" />

View file

@ -165,9 +165,6 @@
<ClCompile Include="ZTexture.cpp"> <ClCompile Include="ZTexture.cpp">
<Filter>Source Files\Z64</Filter> <Filter>Source Files\Z64</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Overlays\ZOverlay.cpp">
<Filter>Source Files\Z64</Filter>
</ClCompile>
<ClCompile Include="ZSkeleton.cpp"> <ClCompile Include="ZSkeleton.cpp">
<Filter>Source Files\Z64</Filter> <Filter>Source Files\Z64</Filter>
</ClCompile> </ClCompile>
@ -288,6 +285,12 @@
<ClCompile Include="OtherStructs\CutsceneMM_Commands.cpp"> <ClCompile Include="OtherStructs\CutsceneMM_Commands.cpp">
<Filter>Source Files\Z64</Filter> <Filter>Source Files\Z64</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="CrashHandler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ZSurfaceType.cpp">
<Filter>Source Files\Z64</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="ZRoom\ZRoom.h"> <ClInclude Include="ZRoom\ZRoom.h">
@ -413,9 +416,6 @@
<ClInclude Include="..\lib\stb\stb_image_write.h"> <ClInclude Include="..\lib\stb\stb_image_write.h">
<Filter>Header Files\Libraries</Filter> <Filter>Header Files\Libraries</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Overlays\ZOverlay.h">
<Filter>Header Files\Z64</Filter>
</ClInclude>
<ClInclude Include="ZTexture.h"> <ClInclude Include="ZTexture.h">
<Filter>Header Files\Z64</Filter> <Filter>Header Files\Z64</Filter>
</ClInclude> </ClInclude>
@ -548,6 +548,12 @@
<ClInclude Include="OtherStructs\CutsceneMM_Commands.h"> <ClInclude Include="OtherStructs\CutsceneMM_Commands.h">
<Filter>Header Files\Z64</Filter> <Filter>Header Files\Z64</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CrashHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ZSurfaceType.h">
<Filter>Header Files\Z64</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Text Include="..\SymbolMap_OoTMqDbg.txt"> <Text Include="..\SymbolMap_OoTMqDbg.txt">

View file

@ -0,0 +1,194 @@
#include "ZActorList.h"
#include "Globals.h"
#include "Utils/BitConverter.h"
#include "WarningHandler.h"
#include "ZFile.h"
#include "ZRoom/ZNames.h"
REGISTER_ZFILENODE(ActorList, ZActorList);
ZActorList::ZActorList(ZFile* nParent) : ZResource(nParent)
{
RegisterRequiredAttribute("Count");
}
void ZActorList::ExtractFromBinary(uint32_t nRawDataIndex, uint8_t nNumActors)
{
rawDataIndex = nRawDataIndex;
numActors = nNumActors;
// Don't parse raw data of external files
if (parent->GetMode() == ZFileMode::ExternalFile)
return;
ParseRawData();
}
void ZActorList::ParseXML(tinyxml2::XMLElement* reader)
{
ZResource::ParseXML(reader);
numActors = StringHelper::StrToL(registeredAttributes.at("Count").value);
if (numActors < 1)
{
HANDLE_ERROR_RESOURCE(
WarningType::InvalidAttributeValue, parent, this, rawDataIndex,
StringHelper::Sprintf("invalid value '%d' found for 'NumPaths' attribute", numActors),
"Should be at least '1'");
}
}
void ZActorList::ParseRawData()
{
ZResource::ParseRawData();
offset_t currentPtr = rawDataIndex;
size_t largestlength = 0;
for (size_t i = 0; i < numActors; i++)
{
ActorSpawnEntry entry(parent->GetRawData(), currentPtr);
currentPtr += entry.GetRawDataSize();
actors.push_back(entry);
size_t actorNameLength = ZNames::GetActorName(entry.GetActorId()).size();
if (actorNameLength > largestlength)
largestlength = actorNameLength;
}
for (auto& entry : actors)
{
entry.SetLargestActorName(largestlength);
}
}
Declaration* ZActorList::DeclareVar(const std::string& prefix, const std::string& bodyStr)
{
std::string auxName = name;
if (name == "")
auxName = GetDefaultName(prefix);
Declaration* decl =
parent->AddDeclarationArray(rawDataIndex, GetDeclarationAlignment(), GetRawDataSize(),
GetSourceTypeName(), name, GetActorListArraySize(), bodyStr);
decl->staticConf = staticConf;
return decl;
}
std::string ZActorList::GetBodySourceCode() const
{
std::string declaration;
size_t index = 0;
for (auto& entry : actors)
{
declaration += StringHelper::Sprintf("\t{ %s },", entry.GetBodySourceCode().c_str());
if (index < actors.size() - 1)
declaration += "\n";
index++;
}
return declaration;
}
std::string ZActorList::GetSourceTypeName() const
{
return actors.front().GetSourceTypeName();
}
ZResourceType ZActorList::GetResourceType() const
{
return ZResourceType::ActorList;
}
size_t ZActorList::GetRawDataSize() const
{
return actors.size() * actors.front().GetRawDataSize();
}
size_t ZActorList::GetActorListArraySize() const
{
size_t actorCount = 0;
// Doing an else-if here so we only do the loop when the game is SW97.
// Actor 0x22 is removed from SW97, so we need to ensure that we don't increment the actor count
// for it.
if (Globals::Instance->game == ZGame::OOT_SW97)
{
actorCount = 0;
for (const auto& entry : actors)
if (entry.GetActorId() != 0x22)
actorCount++;
}
else
{
actorCount = actors.size();
}
return actorCount;
}
/* ActorSpawnEntry */
ActorSpawnEntry::ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
{
actorNum = BitConverter::ToInt16BE(rawData, rawDataIndex + 0);
posX = BitConverter::ToInt16BE(rawData, rawDataIndex + 2);
posY = BitConverter::ToInt16BE(rawData, rawDataIndex + 4);
posZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 6);
rotX = BitConverter::ToUInt16BE(rawData, rawDataIndex + 8);
rotY = BitConverter::ToUInt16BE(rawData, rawDataIndex + 10);
rotZ = BitConverter::ToUInt16BE(rawData, rawDataIndex + 12);
params = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
}
std::string ActorSpawnEntry::GetBodySourceCode() const
{
std::string body;
std::string actorNameFmt = StringHelper::Sprintf("%%-%zus ", largestActorName + 1);
body =
StringHelper::Sprintf(actorNameFmt.c_str(), (ZNames::GetActorName(actorNum) + ",").c_str());
body += StringHelper::Sprintf("{ %6i, %6i, %6i }, ", posX, posY, posZ);
if (Globals::Instance->game == ZGame::MM_RETAIL)
body += StringHelper::Sprintf("{ SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
", SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
", SPAWN_ROT_FLAGS(%#5hX, 0x%04X) }, ",
(rotX >> 7) & 0b111111111, rotX & 0b1111111,
(rotY >> 7) & 0b111111111, rotY & 0b1111111,
(rotZ >> 7) & 0b111111111, rotZ & 0b1111111);
else
body += StringHelper::Sprintf("{ %#6hX, %#6hX, %#6hX }, ", rotX, rotY, rotZ);
body += StringHelper::Sprintf("0x%04X", params);
return body;
}
std::string ActorSpawnEntry::GetSourceTypeName() const
{
return "ActorEntry";
}
size_t ActorSpawnEntry::GetRawDataSize() const
{
return 16;
}
uint16_t ActorSpawnEntry::GetActorId() const
{
return actorNum;
}
void ActorSpawnEntry::SetLargestActorName(size_t nameSize)
{
largestActorName = nameSize;
}

View file

@ -0,0 +1,52 @@
#pragma once
#include "ZResource.h"
class ActorSpawnEntry
{
public:
uint16_t actorNum;
int16_t posX;
int16_t posY;
int16_t posZ;
uint16_t rotX;
uint16_t rotY;
uint16_t rotZ;
uint16_t params;
size_t largestActorName = 16;
ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex);
std::string GetBodySourceCode() const;
std::string GetSourceTypeName() const;
size_t GetRawDataSize() const;
uint16_t GetActorId() const;
void SetLargestActorName(size_t nameSize);
};
class ZActorList : public ZResource
{
public:
std::vector<ActorSpawnEntry> actors;
uint32_t numActors = 0;
ZActorList(ZFile* nParent);
void ExtractFromBinary(offset_t nRawDataIndex, uint8_t nNumActors);
void ParseXML(tinyxml2::XMLElement* reader) override;
void ParseRawData() override;
Declaration* DeclareVar(const std::string& prefix, const std::string& bodyStr) override;
std::string GetBodySourceCode() const override;
std::string GetSourceTypeName() const override;
ZResourceType GetResourceType() const override;
size_t GetRawDataSize() const override;
protected:
size_t GetActorListArraySize() const;
};

View file

@ -43,6 +43,7 @@ void ZArray::ParseXML(tinyxml2::XMLElement* reader)
auto nodeMap = ZFile::GetNodeMap(); auto nodeMap = ZFile::GetNodeMap();
size_t childIndex = rawDataIndex; size_t childIndex = rawDataIndex;
resList.reserve(arrayCnt);
for (size_t i = 0; i < arrayCnt; i++) for (size_t i = 0; i < arrayCnt; i++)
{ {
ZResource* res = nodeMap->at(childName)(parent); ZResource* res = nodeMap->at(childName)(parent);
@ -94,7 +95,7 @@ Declaration* ZArray::DeclareVar(const std::string& prefix, const std::string& bo
std::string ZArray::GetBodySourceCode() const std::string ZArray::GetBodySourceCode() const
{ {
std::string output = ""; std::string output;
for (size_t i = 0; i < arrayCnt; i++) for (size_t i = 0; i < arrayCnt; i++)
{ {
@ -107,6 +108,7 @@ std::string ZArray::GetBodySourceCode() const
case ZResourceType::Scalar: case ZResourceType::Scalar:
case ZResourceType::Vertex: case ZResourceType::Vertex:
case ZResourceType::CollisionPoly: case ZResourceType::CollisionPoly:
case ZResourceType::SurfaceType:
output += resList.at(i)->GetBodySourceCode(); output += resList.at(i)->GetBodySourceCode();
break; break;
@ -125,7 +127,7 @@ std::string ZArray::GetBodySourceCode() const
size_t ZArray::GetRawDataSize() const size_t ZArray::GetRawDataSize() const
{ {
size_t size = 0; size_t size = 0;
for (auto res : resList) for (const auto res : resList)
size += res->GetRawDataSize(); size += res->GetRawDataSize();
return size; return size;
} }

View file

@ -51,7 +51,7 @@ void ZCollisionHeader::ParseRawData()
vertices.reserve(numVerts); vertices.reserve(numVerts);
polygons.reserve(numPolygons); polygons.reserve(numPolygons);
uint32_t currentPtr = vtxSegmentOffset; offset_t currentPtr = vtxSegmentOffset;
for (uint16_t i = 0; i < numVerts; i++) for (uint16_t i = 0; i < numVerts; i++)
{ {
@ -72,14 +72,21 @@ void ZCollisionHeader::ParseRawData()
uint16_t highestPolyType = 0; uint16_t highestPolyType = 0;
for (ZCollisionPoly poly : polygons) for (const ZCollisionPoly& poly : polygons)
{ {
if (poly.type > highestPolyType) if (poly.type > highestPolyType)
highestPolyType = poly.type; highestPolyType = poly.type;
} }
for (uint16_t i = 0; i < highestPolyType + 1; i++) for (uint16_t i = 0; i < highestPolyType + 1; i++)
polygonTypes.push_back( {
BitConverter::ToUInt64BE(rawData, polyTypeDefSegmentOffset + (i * 8))); ZSurfaceType surfaceType(parent);
surfaceType.SetRawDataIndex(polyTypeDefSegmentOffset + (i * 8));
surfaceType.ParseRawData();
polygonTypes.push_back(surfaceType);
}
// polygonTypes.push_back(
// BitConverter::ToUInt64BE(rawData, polyTypeDefSegmentOffset + (i * 8)));
if (camDataAddress != SEGMENTED_NULL) if (camDataAddress != SEGMENTED_NULL)
{ {
@ -165,18 +172,15 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix)
} }
declaration.clear(); declaration.clear();
for (size_t i = 0; i < polygonTypes.size(); i++) for (const auto& polyType : polygonTypes)
{ {
declaration += StringHelper::Sprintf("\t{ 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, declaration += StringHelper::Sprintf("\t%s,", polyType.GetBodySourceCode().c_str());
polygonTypes[i] & 0xFFFFFFFF);
if (i < polygonTypes.size() - 1)
declaration += "\n";
} }
if (polyTypeDefAddress != 0) if (polyTypeDefAddress != SEGMENTED_NULL)
parent->AddDeclarationArray(polyTypeDefSegmentOffset, DeclarationAlignment::Align4, parent->AddDeclarationArray(polyTypeDefSegmentOffset, DeclarationAlignment::Align4,
polygonTypes.size() * 8, "SurfaceType", polygonTypes.size() * 8,
polygonTypes[0].GetSourceTypeName().c_str(),
StringHelper::Sprintf("%sSurfaceType", auxName.c_str()), StringHelper::Sprintf("%sSurfaceType", auxName.c_str()),
polygonTypes.size(), declaration); polygonTypes.size(), declaration);

View file

@ -4,20 +4,9 @@
#include "ZFile.h" #include "ZFile.h"
#include "ZResource.h" #include "ZResource.h"
#include "ZRoom/ZRoom.h" #include "ZRoom/ZRoom.h"
#include "ZSurfaceType.h"
#include "ZVector.h" #include "ZVector.h"
#if 0
class PolygonEntry
{
public:
uint16_t type;
uint16_t vtxA, vtxB, vtxC;
uint16_t a, b, c, d;
PolygonEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex);
};
#endif
class WaterBoxHeader class WaterBoxHeader
{ {
public: public:
@ -82,7 +71,7 @@ public:
std::vector<ZVector> vertices; std::vector<ZVector> vertices;
std::vector<ZCollisionPoly> polygons; std::vector<ZCollisionPoly> polygons;
std::vector<uint64_t> polygonTypes; std::vector<ZSurfaceType> polygonTypes;
std::vector<WaterBoxHeader> waterBoxes; std::vector<WaterBoxHeader> waterBoxes;
CameraDataList* camData = nullptr; CameraDataList* camData = nullptr;

View file

@ -76,7 +76,7 @@ void ZCutscene::ParseRawData()
endFrame = BitConverter::ToInt32BE(rawData, rawDataIndex + 4); endFrame = BitConverter::ToInt32BE(rawData, rawDataIndex + 4);
offset_t currentPtr = rawDataIndex + 8; offset_t currentPtr = rawDataIndex + 8;
commands.reserve(numCommands);
for (int32_t i = 0; i < numCommands; i++) for (int32_t i = 0; i < numCommands; i++)
{ {
uint32_t id = BitConverter::ToUInt32BE(rawData, currentPtr); uint32_t id = BitConverter::ToUInt32BE(rawData, currentPtr);

View file

@ -94,6 +94,7 @@ void ZDisplayList::ParseRawData()
instructions.reserve(numInstructions); instructions.reserve(numInstructions);
uint32_t ptr = rawDataIndex; uint32_t ptr = rawDataIndex;
instructions.reserve(numInstructions);
for (size_t i = 0; i < numInstructions; i++) for (size_t i = 0; i < numInstructions; i++)
{ {
instructions.push_back(BitConverter::ToUInt64BE(rawData, ptr)); instructions.push_back(BitConverter::ToUInt64BE(rawData, ptr));
@ -1839,7 +1840,7 @@ void ZDisplayList::DeclareReferences(const std::string& prefix)
// Generate Vertex Declarations // Generate Vertex Declarations
std::vector<int32_t> vtxKeys; std::vector<int32_t> vtxKeys;
vtxKeys.reserve(vertices.size());
for (auto& item : vertices) for (auto& item : vertices)
vtxKeys.push_back(item.first); vtxKeys.push_back(item.first);

View file

@ -213,7 +213,14 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
// Check for repeated attributes. // Check for repeated attributes.
if (offsetXml != nullptr) if (offsetXml != nullptr)
{ {
rawDataIndex = strtol(StringHelper::Split(offsetXml, "0x")[1].c_str(), NULL, 16); std::string offsetStr = StringHelper::Split(offsetXml, "0x")[1];
if (!StringHelper::HasOnlyHexDigits(offsetStr))
{
HANDLE_ERROR(WarningType::InvalidXML,
StringHelper::Sprintf("Invalid offset %s entered", offsetStr.c_str()),
"");
}
rawDataIndex = strtol(offsetStr.c_str(), NULL, 16);
if (offsetSet.find(offsetXml) != offsetSet.end()) if (offsetSet.find(offsetXml) != offsetSet.end())
{ {
@ -420,6 +427,7 @@ ZResource* ZFile::FindResource(offset_t rawDataIndex)
std::vector<ZResource*> ZFile::GetResourcesOfType(ZResourceType resType) std::vector<ZResource*> ZFile::GetResourcesOfType(ZResourceType resType)
{ {
std::vector<ZResource*> resList; std::vector<ZResource*> resList;
resList.reserve(resources.size());
for (ZResource* res : resources) for (ZResource* res : resources)
{ {
@ -776,10 +784,10 @@ void ZFile::GenerateSourceHeaderFiles()
{ {
OutputFormatter formatter; OutputFormatter formatter;
std::string objectNameUpper = StringHelper::ToUpper(GetName()); std::string guard = StringHelper::ToUpper(outName.stem().string());
formatter.Write(StringHelper::Sprintf("#ifndef %s_H\n#define %s_H 1\n\n", formatter.Write(
objectNameUpper.c_str(), objectNameUpper.c_str())); StringHelper::Sprintf("#ifndef %s_H\n#define %s_H 1\n\n", guard.c_str(), guard.c_str()));
for (ZResource* res : resources) for (ZResource* res : resources)
{ {
@ -1169,6 +1177,7 @@ void ZFile::HandleUnaccountedData()
uint32_t lastSize = 0; uint32_t lastSize = 0;
std::vector<offset_t> declsAddresses; std::vector<offset_t> declsAddresses;
declsAddresses.reserve(declarations.size());
for (const auto& item : declarations) for (const auto& item : declarations)
{ {
declsAddresses.push_back(item.first); declsAddresses.push_back(item.first);

View file

@ -31,8 +31,8 @@ class ZFile
{ {
public: public:
std::map<offset_t, Declaration*> declarations; std::map<offset_t, Declaration*> declarations;
std::string defines;
std::vector<ZResource*> resources; std::vector<ZResource*> resources;
std::string defines;
// Default to using virtual addresses // Default to using virtual addresses
uint32_t segment = 0x80; uint32_t segment = 0x80;

View file

@ -35,6 +35,7 @@ void ZPath::ParseRawData()
uint32_t currentPtr = rawDataIndex; uint32_t currentPtr = rawDataIndex;
pathways.reserve(numPaths);
for (size_t pathIndex = 0; pathIndex < numPaths; pathIndex++) for (size_t pathIndex = 0; pathIndex < numPaths; pathIndex++)
{ {
PathwayEntry path(parent); PathwayEntry path(parent);
@ -125,6 +126,7 @@ void PathwayEntry::ParseRawData()
uint32_t currentPtr = GETSEGOFFSET(listSegmentAddress); uint32_t currentPtr = GETSEGOFFSET(listSegmentAddress);
points.reserve(numPoints);
for (int32_t i = 0; i < numPoints; i++) for (int32_t i = 0; i < numPoints; i++)
{ {
ZVector vec(parent); ZVector vec(parent);

View file

@ -25,6 +25,7 @@ class ZFile;
enum class ZResourceType enum class ZResourceType
{ {
Error, Error,
ActorList,
Animation, Animation,
Array, Array,
AltHeader, AltHeader,
@ -46,6 +47,7 @@ enum class ZResourceType
Scene, Scene,
Skeleton, Skeleton,
String, String,
SurfaceType,
Symbol, Symbol,
Texture, Texture,
TextureAnimation, TextureAnimation,

View file

@ -14,8 +14,9 @@ void SetActorCutsceneList::ParseRawData()
{ {
ZRoomCommand::ParseRawData(); ZRoomCommand::ParseRawData();
int numCutscenes = cmdArg1; int numCutscenes = cmdArg1;
int32_t currentPtr = segmentOffset; offset_t currentPtr = segmentOffset;
cutscenes.reserve(numCutscenes);
for (int32_t i = 0; i < numCutscenes; i++) for (int32_t i = 0; i < numCutscenes; i++)
{ {
ActorCutsceneEntry entry(parent->GetRawData(), currentPtr); ActorCutsceneEntry entry(parent->GetRawData(), currentPtr);

View file

@ -1,10 +1,10 @@
#include "SetActorList.h" #include "SetActorList.h"
#include <cassert>
#include "Globals.h" #include "Globals.h"
#include "Utils/BitConverter.h" #include "Utils/BitConverter.h"
#include "Utils/StringHelper.h" #include "Utils/StringHelper.h"
#include "ZFile.h"
#include "ZRoom/ZNames.h"
#include "ZRoom/ZRoom.h" #include "ZRoom/ZRoom.h"
SetActorList::SetActorList(ZFile* nParent) : ZRoomCommand(nParent) SetActorList::SetActorList(ZFile* nParent) : ZRoomCommand(nParent)
@ -15,104 +15,38 @@ void SetActorList::ParseRawData()
{ {
ZRoomCommand::ParseRawData(); ZRoomCommand::ParseRawData();
numActors = cmdArg1; numActors = cmdArg1;
actorList = new ZActorList(parent);
actorList->ExtractFromBinary(segmentOffset, numActors);
} }
void SetActorList::DeclareReferences(const std::string& prefix) void SetActorList::DeclareReferences(const std::string& prefix)
{ {
if (numActors != 0 && cmdArg2 != 0) if (parent->HasDeclaration(segmentOffset))
{ {
std::string varName = delete actorList;
StringHelper::Sprintf("%sActorList_%06X", prefix.c_str(), segmentOffset); actorList = static_cast<ZActorList*>(parent->FindResource(segmentOffset));
parent->AddDeclarationPlaceholder(segmentOffset, varName); assert(actorList != nullptr);
} assert(actorList->GetResourceType() == ZResourceType::ActorList);
}
void SetActorList::ParseRawDataLate()
{
ZRoomCommand::ParseRawDataLate();
size_t actorsAmount = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 0x10;
uint32_t currentPtr = segmentOffset;
for (size_t i = 0; i < actorsAmount; i++)
{
ActorSpawnEntry entry(parent->GetRawData(), currentPtr);
currentPtr += entry.GetRawDataSize();
actors.push_back(entry);
}
}
void SetActorList::DeclareReferencesLate(const std::string& prefix)
{
if (actors.empty())
return; return;
std::string declaration;
size_t largestlength = 0;
for (const auto& entry : actors)
{
size_t actorNameLength = ZNames::GetActorName(entry.GetActorId()).size();
if (actorNameLength > largestlength)
largestlength = actorNameLength;
} }
size_t index = 0; if (actorList->GetName() == "")
for (auto& entry : actors)
{ {
entry.SetLargestActorName(largestlength); actorList->SetName(actorList->GetDefaultName(prefix));
declaration += StringHelper::Sprintf("\t{ %s },", entry.GetBodySourceCode().c_str());
if (index < actors.size() - 1)
declaration += "\n";
index++;
} }
actorList->DeclareVar(prefix, "");
const auto& entry = actors.front(); parent->AddResource(actorList);
std::string varName = StringHelper::Sprintf("%sActorList_%06X", prefix.c_str(), segmentOffset);
parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::Align4,
actors.size() * entry.GetRawDataSize(), entry.GetSourceTypeName(),
varName, GetActorListArraySize(), declaration);
} }
std::string SetActorList::GetBodySourceCode() const std::string SetActorList::GetBodySourceCode() const
{ {
std::string listName; std::string listName;
Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName); Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName);
if (numActors != actors.size())
{
printf("%s: numActors(%i) ~ actors(%li)\n", parent->GetName().c_str(), numActors,
actors.size());
}
return StringHelper::Sprintf("SCENE_CMD_ACTOR_LIST(%i, %s)", numActors, listName.c_str()); return StringHelper::Sprintf("SCENE_CMD_ACTOR_LIST(%i, %s)", numActors, listName.c_str());
} }
size_t SetActorList::GetActorListArraySize() const
{
size_t actorCount = 0;
// Doing an else-if here so we only do the loop when the game is SW97.
// Actor 0x22 is removed from SW97, so we need to ensure that we don't increment the actor count
// for it.
if (Globals::Instance->game == ZGame::OOT_SW97)
{
actorCount = 0;
for (const auto& entry : actors)
if (entry.GetActorId() != 0x22)
actorCount++;
}
else
{
actorCount = actors.size();
}
return actorCount;
}
std::string SetActorList::GetCommandCName() const std::string SetActorList::GetCommandCName() const
{ {
return "SCmdActorList"; return "SCmdActorList";
@ -122,58 +56,3 @@ RoomCommand SetActorList::GetRoomCommand() const
{ {
return RoomCommand::SetActorList; return RoomCommand::SetActorList;
} }
ActorSpawnEntry::ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
{
actorNum = BitConverter::ToInt16BE(rawData, rawDataIndex + 0);
posX = BitConverter::ToInt16BE(rawData, rawDataIndex + 2);
posY = BitConverter::ToInt16BE(rawData, rawDataIndex + 4);
posZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 6);
rotX = BitConverter::ToUInt16BE(rawData, rawDataIndex + 8);
rotY = BitConverter::ToUInt16BE(rawData, rawDataIndex + 10);
rotZ = BitConverter::ToUInt16BE(rawData, rawDataIndex + 12);
initVar = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
}
std::string ActorSpawnEntry::GetBodySourceCode() const
{
std::string body;
std::string actorNameFmt = StringHelper::Sprintf("%%-%zus ", largestActorName + 1);
body =
StringHelper::Sprintf(actorNameFmt.c_str(), (ZNames::GetActorName(actorNum) + ",").c_str());
body += StringHelper::Sprintf("{ %6i, %6i, %6i }, ", posX, posY, posZ);
if (Globals::Instance->game == ZGame::MM_RETAIL)
body += StringHelper::Sprintf("{ SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
", SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
", SPAWN_ROT_FLAGS(%#5hX, 0x%04X) }, ",
(rotX >> 7) & 0b111111111, rotX & 0b1111111,
(rotY >> 7) & 0b111111111, rotY & 0b1111111,
(rotZ >> 7) & 0b111111111, rotZ & 0b1111111);
else
body += StringHelper::Sprintf("{ %#6hX, %#6hX, %#6hX }, ", rotX, rotY, rotZ);
body += StringHelper::Sprintf("0x%04X", initVar);
return body;
}
std::string ActorSpawnEntry::GetSourceTypeName() const
{
return "ActorEntry";
}
int32_t ActorSpawnEntry::GetRawDataSize() const
{
return 16;
}
uint16_t ActorSpawnEntry::GetActorId() const
{
return actorNum;
}
void ActorSpawnEntry::SetLargestActorName(size_t nameSize)
{
largestActorName = nameSize;
}

View file

@ -1,45 +1,19 @@
#pragma once #pragma once
#include "ZActorList.h"
#include "ZRoom/ZRoomCommand.h" #include "ZRoom/ZRoomCommand.h"
class ActorSpawnEntry
{
public:
uint16_t actorNum;
int16_t posX;
int16_t posY;
int16_t posZ;
uint16_t rotX;
uint16_t rotY;
uint16_t rotZ;
uint16_t initVar;
size_t largestActorName = 16;
ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex);
std::string GetBodySourceCode() const;
std::string GetSourceTypeName() const;
int32_t GetRawDataSize() const;
uint16_t GetActorId() const;
void SetLargestActorName(size_t nameSize);
};
class SetActorList : public ZRoomCommand class SetActorList : public ZRoomCommand
{ {
public: public:
uint8_t numActors; uint32_t numActors;
std::vector<ActorSpawnEntry> actors; ZActorList* actorList = nullptr;
SetActorList(ZFile* nParent); SetActorList(ZFile* nParent);
void ParseRawData() override; void ParseRawData() override;
void DeclareReferences(const std::string& prefix) override; void DeclareReferences(const std::string& prefix) override;
void ParseRawDataLate() override;
void DeclareReferencesLate(const std::string& prefix) override;
std::string GetBodySourceCode() const override; std::string GetBodySourceCode() const override;
RoomCommand GetRoomCommand() const override; RoomCommand GetRoomCommand() const override;

View file

@ -21,9 +21,10 @@ void SetAlternateHeaders::DeclareReferences([[maybe_unused]] const std::string&
void SetAlternateHeaders::ParseRawDataLate() void SetAlternateHeaders::ParseRawDataLate()
{ {
int numHeaders = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 4; size_t numHeaders = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 4;
for (int32_t i = 0; i < numHeaders; i++) headers.reserve(numHeaders);
for (uint32_t i = 0; i < numHeaders; i++)
{ {
int32_t address = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + (i * 4)); int32_t address = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + (i * 4));
headers.push_back(address); headers.push_back(address);

View file

@ -18,6 +18,7 @@ void SetCsCamera::ParseRawData()
uint32_t currentPtr = segmentOffset; uint32_t currentPtr = segmentOffset;
int32_t numPoints = 0; int32_t numPoints = 0;
cameras.reserve(numCameras);
for (int32_t i = 0; i < numCameras; i++) for (int32_t i = 0; i < numCameras; i++)
{ {
CsCameraEntry entry(parent->GetRawData(), currentPtr); CsCameraEntry entry(parent->GetRawData(), currentPtr);
@ -31,6 +32,7 @@ void SetCsCamera::ParseRawData()
{ {
uint32_t currentPtr = cameras.at(0).GetSegmentOffset(); uint32_t currentPtr = cameras.at(0).GetSegmentOffset();
points.reserve(numPoints);
for (int32_t i = 0; i < numPoints; i++) for (int32_t i = 0; i < numPoints; i++)
{ {
ZVector vec(parent); ZVector vec(parent);

View file

@ -20,6 +20,7 @@ void SetCutscenes::ParseRawData()
{ {
int32_t currentPtr = segmentOffset; int32_t currentPtr = segmentOffset;
cutsceneEntries.reserve(numCutscenes);
for (uint8_t i = 0; i < numCutscenes; i++) for (uint8_t i = 0; i < numCutscenes; i++)
{ {
CutsceneEntry entry(parent->GetRawData(), currentPtr); CutsceneEntry entry(parent->GetRawData(), currentPtr);

View file

@ -24,10 +24,11 @@ void SetEntranceList::DeclareReferences([[maybe_unused]] const std::string& pref
void SetEntranceList::ParseRawDataLate() void SetEntranceList::ParseRawDataLate()
{ {
// Parse Entrances and Generate Declaration // Parse Entrances and Generate Declaration
int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2;
uint32_t currentPtr = segmentOffset; uint32_t currentPtr = segmentOffset;
for (int32_t i = 0; i < numEntrances; i++) entrances.reserve(numEntrances);
for (uint32_t i = 0; i < numEntrances; i++)
{ {
EntranceEntry entry(parent->GetRawData(), currentPtr); EntranceEntry entry(parent->GetRawData(), currentPtr);
entrances.push_back(entry); entrances.push_back(entry);

View file

@ -4,6 +4,7 @@
#include "Utils/BitConverter.h" #include "Utils/BitConverter.h"
#include "Utils/StringHelper.h" #include "Utils/StringHelper.h"
#include "ZFile.h" #include "ZFile.h"
#include "ZRoom/ZNames.h"
#include "ZRoom/ZRoom.h" #include "ZRoom/ZRoom.h"
SetExitList::SetExitList(ZFile* nParent) : ZRoomCommand(nParent) SetExitList::SetExitList(ZFile* nParent) : ZRoomCommand(nParent)
@ -23,10 +24,11 @@ void SetExitList::DeclareReferences([[maybe_unused]] const std::string& prefix)
void SetExitList::ParseRawDataLate() void SetExitList::ParseRawDataLate()
{ {
// Parse Entrances and Generate Declaration // Parse Entrances and Generate Declaration
int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2;
uint32_t currentPtr = segmentOffset; uint32_t currentPtr = segmentOffset;
for (int32_t i = 0; i < numEntrances; i++) exits.reserve(numEntrances);
for (uint32_t i = 0; i < numEntrances; i++)
{ {
uint16_t exit = BitConverter::ToUInt16BE(parent->GetRawData(), currentPtr); uint16_t exit = BitConverter::ToUInt16BE(parent->GetRawData(), currentPtr);
exits.push_back(exit); exits.push_back(exit);
@ -43,7 +45,8 @@ void SetExitList::DeclareReferencesLate([[maybe_unused]] const std::string& pref
for (size_t i = 0; i < exits.size(); i++) for (size_t i = 0; i < exits.size(); i++)
{ {
declaration += StringHelper::Sprintf(" 0x%04X,", exits.at(i)); declaration +=
StringHelper::Sprintf(" %s,", ZNames::GetEntranceName(exits[i]).c_str());
if (i + 1 < exits.size()) if (i + 1 < exits.size())
declaration += "\n"; declaration += "\n";
} }

View file

@ -15,6 +15,8 @@ void SetLightList::ParseRawData()
numLights = cmdArg1; numLights = cmdArg1;
int32_t currentPtr = segmentOffset; int32_t currentPtr = segmentOffset;
lights.reserve(this->numLights);
for (int i = 0; i < this->numLights; i++) for (int i = 0; i < this->numLights; i++)
{ {
LightInfo light(parent->GetRawData(), currentPtr); LightInfo light(parent->GetRawData(), currentPtr);

View file

@ -15,6 +15,7 @@ void SetLightingSettings::ParseRawData()
ZRoomCommand::ParseRawData(); ZRoomCommand::ParseRawData();
uint8_t numLights = cmdArg1; uint8_t numLights = cmdArg1;
settings.reserve(numLights);
for (int i = 0; i < numLights; i++) for (int i = 0; i < numLights; i++)
settings.push_back(LightingSettings(parent->GetRawData(), segmentOffset + (i * 22))); settings.push_back(LightingSettings(parent->GetRawData(), segmentOffset + (i * 22)));
} }

View file

@ -442,6 +442,8 @@ void PolygonType1::DeclareReferences(const std::string& prefix)
{ {
listAddress = Seg2Filespace(list, parent->baseAddress); listAddress = Seg2Filespace(list, parent->baseAddress);
uint32_t auxPtr = listAddress; uint32_t auxPtr = listAddress;
multiList.reserve(count);
for (size_t i = 0; i < count; ++i) for (size_t i = 0; i < count; ++i)
{ {
BgImage bg(false, prefix, auxPtr, parent); BgImage bg(false, prefix, auxPtr, parent);
@ -545,6 +547,8 @@ void PolygonType2::ParseRawData()
end = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x08); end = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x08);
uint32_t currentPtr = GETSEGOFFSET(start); uint32_t currentPtr = GETSEGOFFSET(start);
polyDLists.reserve(num);
for (size_t i = 0; i < num; i++) for (size_t i = 0; i < num; i++)
{ {
PolygonDlist entry(parent); PolygonDlist entry(parent);

View file

@ -15,8 +15,9 @@ void SetMinimapChests::ParseRawData()
ZRoomCommand::ParseRawData(); ZRoomCommand::ParseRawData();
int numChests = cmdArg1; int numChests = cmdArg1;
int32_t currentPtr = segmentOffset; offset_t currentPtr = segmentOffset;
chests.reserve(numChests);
for (int32_t i = 0; i < numChests; i++) for (int32_t i = 0; i < numChests; i++)
{ {
MinimapChest chest(parent->GetRawData(), currentPtr); MinimapChest chest(parent->GetRawData(), currentPtr);

View file

@ -17,8 +17,9 @@ void SetMinimapList::ParseRawData()
listSegmentOffset = GETSEGOFFSET(listSegmentAddr); listSegmentOffset = GETSEGOFFSET(listSegmentAddr);
unk4 = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + 4); unk4 = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + 4);
int32_t currentPtr = listSegmentOffset; uint32_t currentPtr = listSegmentOffset;
minimaps.reserve(zRoom->roomCount);
for (int32_t i = 0; i < zRoom->roomCount; i++) for (int32_t i = 0; i < zRoom->roomCount; i++)
{ {
MinimapEntry entry(parent->GetRawData(), currentPtr); MinimapEntry entry(parent->GetRawData(), currentPtr);

View file

@ -17,6 +17,7 @@ void SetObjectList::ParseRawData()
uint8_t objectCnt = parent->GetRawData().at(rawDataIndex + 1); uint8_t objectCnt = parent->GetRawData().at(rawDataIndex + 1);
uint32_t currentPtr = segmentOffset; uint32_t currentPtr = segmentOffset;
objects.reserve(objectCnt);
for (uint8_t i = 0; i < objectCnt; i++) for (uint8_t i = 0; i < objectCnt; i++)
{ {
uint16_t objectIndex = BitConverter::ToInt16BE(parent->GetRawData(), currentPtr); uint16_t objectIndex = BitConverter::ToInt16BE(parent->GetRawData(), currentPtr);

View file

@ -69,6 +69,7 @@ void RomFile::ParseRawData()
uint32_t currentPtr = rawDataIndex; uint32_t currentPtr = rawDataIndex;
rooms.reserve(numRooms);
for (int32_t i = 0; i < numRooms; i++) for (int32_t i = 0; i < numRooms; i++)
{ {
RoomEntry entry(parent->GetRawData(), currentPtr); RoomEntry entry(parent->GetRawData(), currentPtr);
@ -104,8 +105,9 @@ std::string RomFile::GetBodySourceCode() const
if (!isFirst) if (!isFirst)
declaration += "\n"; declaration += "\n";
declaration += StringHelper::Sprintf("\t{ _%sSegmentRomStart, _%sSegmentRomEnd },", declaration += StringHelper::Sprintf(
roomName.c_str(), roomName.c_str()); "\t{ (uintptr_t)_%sSegmentRomStart, (uintptr_t)_%sSegmentRomEnd },",
roomName.c_str(), roomName.c_str());
isFirst = false; isFirst = false;
} }
} }

View file

@ -16,9 +16,10 @@ void SetStartPositionList::ParseRawData()
ZRoomCommand::ParseRawData(); ZRoomCommand::ParseRawData();
uint8_t numActors = cmdArg1; uint8_t numActors = cmdArg1;
uint32_t currentPtr = segmentOffset; offset_t currentPtr = segmentOffset;
for (int32_t i = 0; i < numActors; i++) actors.reserve(numActors);
for (uint32_t i = 0; i < numActors; i++)
{ {
actors.push_back(ActorSpawnEntry(parent->GetRawData(), currentPtr)); actors.push_back(ActorSpawnEntry(parent->GetRawData(), currentPtr));
currentPtr += 16; currentPtr += 16;

View file

@ -17,6 +17,7 @@ void SetTransitionActorList::ParseRawData()
int numActors = cmdArg1; int numActors = cmdArg1;
uint32_t currentPtr = segmentOffset; uint32_t currentPtr = segmentOffset;
transitionActors.reserve(numActors);
for (int32_t i = 0; i < numActors; i++) for (int32_t i = 0; i < numActors; i++)
{ {
TransitionActorEntry entry(parent->GetRawData(), currentPtr); TransitionActorEntry entry(parent->GetRawData(), currentPtr);

View file

@ -12,17 +12,17 @@ public:
{ {
if (id >= Globals::Instance->cfg.objectList.size()) if (id >= Globals::Instance->cfg.objectList.size())
return StringHelper::Sprintf("0x%04X", id); return StringHelper::Sprintf("0x%04X", id);
return Globals::Instance->cfg.objectList.at(id); return Globals::Instance->cfg.objectList[id];
} }
static std::string GetActorName(int32_t id) static std::string GetActorName(uint16_t id)
{ {
switch (Globals::Instance->game) switch (Globals::Instance->game)
{ {
case ZGame::OOT_RETAIL: case ZGame::OOT_RETAIL:
case ZGame::OOT_SW97: case ZGame::OOT_SW97:
if (id < ZNames::GetNumActors()) if (id < ZNames::GetNumActors())
return Globals::Instance->cfg.actorList.at(id); return Globals::Instance->cfg.actorList[id];
else else
return StringHelper::Sprintf("0x%04X", id); return StringHelper::Sprintf("0x%04X", id);
case ZGame::MM_RETAIL: case ZGame::MM_RETAIL:
@ -31,7 +31,7 @@ public:
id &= 0xFFF; id &= 0xFFF;
std::string name; std::string name;
if (id < ZNames::GetNumActors()) if (id < ZNames::GetNumActors())
name = Globals::Instance->cfg.actorList.at(id); name = Globals::Instance->cfg.actorList[id];
else else
name = StringHelper::Sprintf("0x%04X", id); name = StringHelper::Sprintf("0x%04X", id);
@ -45,5 +45,20 @@ public:
return ""; return "";
} }
static int32_t GetNumActors() { return Globals::Instance->cfg.actorList.size(); } static std::string GetEntranceName(uint16_t id)
{
if (ZNames::GetNumEntrances() == 0 || ZNames::GetNumSpecialEntrances() == 0)
return StringHelper::Sprintf("0x%04X", id);
if (id < ZNames::GetNumEntrances())
return Globals::Instance->cfg.entranceList[id];
else if ((id >= 0x7FF9 && id <= 0x7FFF) && !((id - 0x7FF9U) > GetNumSpecialEntrances())) // Special entrances
return Globals::Instance->cfg.specialEntranceList[id - 0x7FF9];
else
return StringHelper::Sprintf("0x%04X", id);
}
static size_t GetNumActors() { return Globals::Instance->cfg.actorList.size(); }
static size_t GetNumEntrances() { return Globals::Instance->cfg.entranceList.size(); }
static size_t GetNumSpecialEntrances() { return Globals::Instance->cfg.specialEntranceList.size(); }
}; };

View file

@ -287,6 +287,8 @@ void ZLimbTable::ParseRawData()
const auto& rawData = parent->GetRawData(); const auto& rawData = parent->GetRawData();
uint32_t ptr = rawDataIndex; uint32_t ptr = rawDataIndex;
limbsAddresses.reserve(count);
for (size_t i = 0; i < count; i++) for (size_t i = 0; i < count; i++)
{ {
limbsAddresses.push_back(BitConverter::ToUInt32BE(rawData, ptr)); limbsAddresses.push_back(BitConverter::ToUInt32BE(rawData, ptr));
@ -301,7 +303,7 @@ void ZLimbTable::DeclareReferences(const std::string& prefix)
varPrefix = prefix; varPrefix = prefix;
ZResource::DeclareReferences(varPrefix); ZResource::DeclareReferences(varPrefix);
limbsReferences.reserve(count);
for (size_t i = 0; i < count; i++) for (size_t i = 0; i < count; i++)
{ {
segptr_t limbAddress = limbsAddresses[i]; segptr_t limbAddress = limbsAddresses[i];

View file

@ -0,0 +1,65 @@
#include "ZSurfaceType.h"
#include "Globals.h"
#include "Utils/BitConverter.h"
#include "Utils/StringHelper.h"
REGISTER_ZFILENODE(SurfaceType, ZSurfaceType);
ZSurfaceType::ZSurfaceType(ZFile* nParent) : ZResource(nParent)
{
}
ZSurfaceType::~ZSurfaceType()
{
}
void ZSurfaceType::ParseRawData()
{
const auto& rawData = parent->GetRawData();
data[0] = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0);
data[1] = BitConverter::ToUInt32BE(rawData, rawDataIndex + 4);
}
void ZSurfaceType::DeclareReferences(const std::string& prefix)
{
std::string declaration;
std::string auxName = name;
if (name == "")
auxName = GetDefaultName(prefix);
parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align4, GetRawDataSize(),
GetSourceTypeName(), name.c_str(), GetBodySourceCode());
}
std::string ZSurfaceType::GetBodySourceCode() const
{
return StringHelper::Sprintf("{0x%08X, 0x%08X}", data[0], data[1]);
}
std::string ZSurfaceType::GetDefaultName(const std::string& prefix) const
{
return StringHelper::Sprintf("%sSurfaceType_%06X", prefix.c_str(), rawDataIndex);
}
ZResourceType ZSurfaceType::GetResourceType() const
{
return ZResourceType::SurfaceType;
}
size_t ZSurfaceType::GetRawDataSize() const
{
return 8;
}
std::string ZSurfaceType::GetSourceTypeName() const
{
return "SurfaceType";
}
bool ZSurfaceType::DoesSupportArray() const
{
return true;
}

View file

@ -0,0 +1,27 @@
#pragma once
#include <array>
#include "ZFile.h"
#include "ZResource.h"
class ZSurfaceType : public ZResource
{
public:
std::array<uint32_t, 2> data;
ZSurfaceType(ZFile* nParent);
~ZSurfaceType();
void ParseRawData() override;
void DeclareReferences(const std::string& prefix) override;
std::string GetBodySourceCode() const override;
std::string GetDefaultName(const std::string& prefix) const override;
std::string GetSourceTypeName() const override;
ZResourceType GetResourceType() const override;
bool DoesSupportArray() const override;
size_t GetRawDataSize() const override;
};

View file

@ -48,7 +48,7 @@ void ZVector::ParseRawData()
int32_t currentRawDataIndex = rawDataIndex; int32_t currentRawDataIndex = rawDataIndex;
// TODO: this shouldn't be necessary. // TODO: this shouldn't be necessary.
scalars.clear(); scalars.clear();
scalars.reserve(dimensions);
for (uint32_t i = 0; i < dimensions; i++) for (uint32_t i = 0; i < dimensions; i++)
{ {
ZScalar scalar(parent); ZScalar scalar(parent);

View file

@ -33,6 +33,8 @@ public:
static std::string ReadAllText(const fs::path& filePath) static std::string ReadAllText(const fs::path& filePath)
{ {
std::ifstream file(filePath, std::ios::in | std::ios::binary | std::ios::ate); std::ifstream file(filePath, std::ios::in | std::ios::binary | std::ios::ate);
if (!file.is_open())
return "";
int32_t fileSize = (int32_t)file.tellg(); int32_t fileSize = (int32_t)file.tellg();
file.seekg(0); file.seekg(0);
char* data = new char[fileSize + 1]; char* data = new char[fileSize + 1];

View file

@ -106,6 +106,11 @@ public:
return std::all_of(str.begin(), str.end(), ::isdigit); return std::all_of(str.begin(), str.end(), ::isdigit);
} }
static bool HasOnlyHexDigits(const std::string& str)
{
return std::all_of(str.begin(), str.end(), ::isxdigit);
}
static std::string ToUpper(const std::string& str) static std::string ToUpper(const std::string& str)
{ {
std::string buff = str; std::string buff = str;

View file

@ -29,7 +29,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -42,7 +42,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

View file

@ -149,7 +149,7 @@ u64 gCraterSmokeConeTex[] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Tex`, unless it is a palette, in that case it is suffixed by `TLUT`. - `Name`: Required. Suffixed by `Tex`, unless it is a palette, in that case it is suffixed by `TLUT`.
- `OutName`: Required. The filename of the extracted `.png` file. - `OutName`: Required. The filename of the extracted `.png` file.
- `Format`: Required. The format of the image. Valid values: `rgba32`, `rgba16`, `i4`, `i8`, `ia4`, `ia8`, `ia16`, `ci4` and `ci8`. - `Format`: Required. The format of the image. Valid values: `rgba32`, `rgba16`, `i4`, `i8`, `ia4`, `ia8`, `ia16`, `ci4` and `ci8`.
- `Width`: Required. Width in pixels of the image. - `Width`: Required. Width in pixels of the image.
@ -188,7 +188,7 @@ If you want to know more about this formats, you can check [`gsDPLoadTextureBloc
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Background`. - `Name`: Required. Suffixed by `Background`.
- `OutName`: Required. The filename of the extracted `.jpg` file. - `OutName`: Required. The filename of the extracted `.jpg` file.
※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element. You can use this to name them if you don't like the autogenerated name. ※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element. You can use this to name them if you don't like the autogenerated name.
@ -216,7 +216,7 @@ u8 gFireTempleBlob_00CCC0[] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Blob`. - `Name`: Required. Suffixed by `Blob`.
- `Size`: Required. Amount of bytes to extract. Hex. - `Size`: Required. Amount of bytes to extract. Hex.
※ We usually use blobs when we can't figure out the content's type of chunk of data. ※ We usually use blobs when we can't figure out the content's type of chunk of data.
@ -235,7 +235,7 @@ A.k.a. Display list, or Gfx.
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `DL`. - `Name`: Required. Suffixed by `DL`.
------------------------- -------------------------
@ -249,7 +249,7 @@ A data type exclusive to Majora's Mask, that has scrolling, color changing, and
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `TexAnim`. - `Name`: Required. Suffixed by `TexAnim`.
------------------------- -------------------------
@ -309,7 +309,7 @@ Like `Scene`s and `Room`s, `AltHeader`s is special too. It should always be decl
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `AltHeader`. - `Name`: Required. Suffixed by `AltHeader`.
------------------------- -------------------------
@ -323,7 +323,7 @@ Like `Scene`s and `Room`s, `AltHeader`s is special too. It should always be decl
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Anim`. - `Name`: Required. Suffixed by `Anim`.
------------------------- -------------------------
@ -337,7 +337,7 @@ Like `Scene`s and `Room`s, `AltHeader`s is special too. It should always be decl
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Anim`. - `Name`: Required. Suffixed by `Anim`.
------------------------- -------------------------
@ -351,7 +351,7 @@ Like `Scene`s and `Room`s, `AltHeader`s is special too. It should always be decl
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Anim`. - `Name`: Required. Suffixed by `Anim`.
- `SkelOffset`: Required. Offset of the `CurveSkeleton` (I.e. a [`Skeleton`](#skeleton) resource with `Type="Curve"`) related to this animation. - `SkelOffset`: Required. Offset of the `CurveSkeleton` (I.e. a [`Skeleton`](#skeleton) resource with `Type="Curve"`) related to this animation.
------------------------- -------------------------
@ -368,7 +368,7 @@ Useful only for the unused `object_human`'s animation data.
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Anim`. - `Name`: Required. Suffixed by `Anim`.
------------------------- -------------------------
@ -382,7 +382,7 @@ Useful only for the unused `object_human`'s animation data.
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Skel`. - `Name`: Required. Suffixed by `Skel`.
- `Type`: Required. Valid values: `Normal`, `Flex` and `Curve`. - `Type`: Required. Valid values: `Normal`, `Flex` and `Curve`.
- `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`. - `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`.
- `EnumName`: Optional. The name of `typedef`'d limb enum. - `EnumName`: Optional. The name of `typedef`'d limb enum.
@ -407,7 +407,7 @@ The required data is providing the `EnumName`, `LimbNone` and `LimbMax` attribut
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Skel`. - `Name`: Required. Suffixed by `Skel`.
- `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`. - `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`.
- `Count`: Required. Amount of limbs. Integer. - `Count`: Required. Amount of limbs. Integer.
- `EnumName`: Optional. The name of `typedef`'d limb enum. - `EnumName`: Optional. The name of `typedef`'d limb enum.
@ -428,7 +428,7 @@ See [Skeleton](#skeleton) for info on the limb enum generation.
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Limb`. - `Name`: Required. Suffixed by `Limb`.
- `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`. - `LimbType`: Required. Valid values: `Standard`, `LOD`, `Skin`, `Curve` and `Legacy`.
- `EnumName`: Optional. The name used for this limb in the limbs enum. It must be either present in every limb or in none. - `EnumName`: Optional. The name used for this limb in the limbs enum. It must be either present in every limb or in none.
@ -471,7 +471,7 @@ extern u8 gJsjutanShadowTex[2048];
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Col`. - `Name`: Required. Suffixed by `Col`.
------------------------- -------------------------
@ -493,7 +493,7 @@ u64 pad34F8 = { 0 };
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by ~~`TBD`~~. - `Name`: Required. Suffixed by ~~`TBD`~~.
- `Type`: Required. Valid values: `s8`, `u8`, `x8`, `s16`, `u16`, `x16`, `s32`, `u32`, `x32`, `s64`, `u64`, `x64`, `f32` and `f64`. - `Type`: Required. Valid values: `s8`, `u8`, `x8`, `s16`, `u16`, `x16`, `s32`, `u32`, `x32`, `s64`, `u64`, `x64`, `f32` and `f64`.
※ Can be wrapped in an [`Array`](#array) tag. ※ Can be wrapped in an [`Array`](#array) tag.
@ -547,7 +547,7 @@ Vec3s D_04002040[24] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by ~~`TBD`~~. - `Name`: Required. Suffixed by ~~`TBD`~~.
- `Type`: Required. Specifies the vector's type (`Vec3s`, `Vec3i` and `Vec3f`). Valid values: `s16`, `s32` and `f32`. - `Type`: Required. Specifies the vector's type (`Vec3s`, `Vec3i` and `Vec3f`). Valid values: `s16`, `s32` and `f32`.
- `Dimensions`: Required. The amount of dimensions of the vector. Valid values: `3`. - `Dimensions`: Required. The amount of dimensions of the vector. Valid values: `3`.
@ -567,7 +567,7 @@ Vec3s D_04002040[24] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Vtx`. - `Name`: Required. Suffixed by `Vtx`.
※ Can be wrapped in an [`Array`](#array) tag. ※ Can be wrapped in an [`Array`](#array) tag.
@ -583,7 +583,7 @@ Vec3s D_04002040[24] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Mtx`. - `Name`: Required. Suffixed by `Mtx`.
※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element. ※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element.
@ -599,7 +599,7 @@ Vec3s D_04002040[24] = {
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Cs`. - `Name`: Required. Suffixed by `Cs`.
※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element. ※ Explicit use of this tag isn't often necesary because it would probably be extracted automatically by another extracted element.
@ -636,7 +636,7 @@ Currently, only [`Pointer`](#pointer), [`Scalar`](#scalar), [`Vector`](#vector)
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `Path`. - `Name`: Required. Suffixed by `Path`.
- `NumPaths`: Optional. The amount of paths contained in the array. It must be a positive integer. - `NumPaths`: Optional. The amount of paths contained in the array. It must be a positive integer.
------------------------- -------------------------
@ -653,7 +653,7 @@ Allows the extraction of the specific data of the player animations which are fo
- Attributes: - Attributes:
- `Name`: Required. Suxffixed by `AnimData`. - `Name`: Required. Suffixed by `AnimData`.
- `FrameCount`: Required. The length of the animation in frames. It must be a positive integer. - `FrameCount`: Required. The length of the animation in frames. It must be a positive integer.
------------------------- -------------------------

View file

@ -1,851 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFTYPES_H
#define ELFTYPES_H
#ifndef ELFIO_NO_OWN_TYPES
#if !defined(ELFIO_NO_CSTDINT) && !defined(ELFIO_NO_INTTYPES)
#include <stdint.h>
#else
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
#ifdef _MSC_VER
typedef unsigned __int32 uint32_t;
typedef signed __int32 int32_t;
typedef unsigned __int64 uint64_t;
typedef signed __int64 int64_t;
#else
typedef unsigned int uint32_t;
typedef signed int int32_t;
typedef unsigned long long uint64_t;
typedef signed long long int64_t;
#endif // _MSC_VER
#endif // ELFIO_NO_CSTDINT
#endif // ELFIO_NO_OWN_TYPES
namespace ELFIO {
// Attention! Platform depended definitions.
typedef uint16_t Elf_Half;
typedef uint32_t Elf_Word;
typedef int32_t Elf_Sword;
typedef uint64_t Elf_Xword;
typedef int64_t Elf_Sxword;
typedef uint32_t Elf32_Addr;
typedef uint32_t Elf32_Off;
typedef uint64_t Elf64_Addr;
typedef uint64_t Elf64_Off;
#define Elf32_Half Elf_Half
#define Elf64_Half Elf_Half
#define Elf32_Word Elf_Word
#define Elf64_Word Elf_Word
#define Elf32_Sword Elf_Sword
#define Elf64_Sword Elf_Sword
///////////////////////
// ELF Header Constants
// File type
#define ET_NONE 0
#define ET_REL 1
#define ET_EXEC 2
#define ET_DYN 3
#define ET_CORE 4
#define ET_LOOS 0xFE00
#define ET_HIOS 0xFEFF
#define ET_LOPROC 0xFF00
#define ET_HIPROC 0xFFFF
#define EM_NONE 0 // No machine
#define EM_M32 1 // AT&T WE 32100
#define EM_SPARC 2 // SUN SPARC
#define EM_386 3 // Intel 80386
#define EM_68K 4 // Motorola m68k family
#define EM_88K 5 // Motorola m88k family
#define EM_486 6 // Intel 80486// Reserved for future use
#define EM_860 7 // Intel 80860
#define EM_MIPS 8 // MIPS R3000 (officially, big-endian only)
#define EM_S370 9 // IBM System/370
#define EM_MIPS_RS3_LE 10 // MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated
#define EM_res011 11 // Reserved
#define EM_res012 12 // Reserved
#define EM_res013 13 // Reserved
#define EM_res014 14 // Reserved
#define EM_PARISC 15 // HPPA
#define EM_res016 16 // Reserved
#define EM_VPP550 17 // Fujitsu VPP500
#define EM_SPARC32PLUS 18 // Sun's "v8plus"
#define EM_960 19 // Intel 80960
#define EM_PPC 20 // PowerPC
#define EM_PPC64 21 // 64-bit PowerPC
#define EM_S390 22 // IBM S/390
#define EM_SPU 23 // Sony/Toshiba/IBM SPU
#define EM_res024 24 // Reserved
#define EM_res025 25 // Reserved
#define EM_res026 26 // Reserved
#define EM_res027 27 // Reserved
#define EM_res028 28 // Reserved
#define EM_res029 29 // Reserved
#define EM_res030 30 // Reserved
#define EM_res031 31 // Reserved
#define EM_res032 32 // Reserved
#define EM_res033 33 // Reserved
#define EM_res034 34 // Reserved
#define EM_res035 35 // Reserved
#define EM_V800 36 // NEC V800 series
#define EM_FR20 37 // Fujitsu FR20
#define EM_RH32 38 // TRW RH32
#define EM_MCORE 39 // Motorola M*Core // May also be taken by Fujitsu MMA
#define EM_RCE 39 // Old name for MCore
#define EM_ARM 40 // ARM
#define EM_OLD_ALPHA 41 // Digital Alpha
#define EM_SH 42 // Renesas (formerly Hitachi) / SuperH SH
#define EM_SPARCV9 43 // SPARC v9 64-bit
#define EM_TRICORE 44 // Siemens Tricore embedded processor
#define EM_ARC 45 // ARC Cores
#define EM_H8_300 46 // Renesas (formerly Hitachi) H8/300
#define EM_H8_300H 47 // Renesas (formerly Hitachi) H8/300H
#define EM_H8S 48 // Renesas (formerly Hitachi) H8S
#define EM_H8_500 49 // Renesas (formerly Hitachi) H8/500
#define EM_IA_64 50 // Intel IA-64 Processor
#define EM_MIPS_X 51 // Stanford MIPS-X
#define EM_COLDFIRE 52 // Motorola Coldfire
#define EM_68HC12 53 // Motorola M68HC12
#define EM_MMA 54 // Fujitsu Multimedia Accelerator
#define EM_PCP 55 // Siemens PCP
#define EM_NCPU 56 // Sony nCPU embedded RISC processor
#define EM_NDR1 57 // Denso NDR1 microprocesspr
#define EM_STARCORE 58 // Motorola Star*Core processor
#define EM_ME16 59 // Toyota ME16 processor
#define EM_ST100 60 // STMicroelectronics ST100 processor
#define EM_TINYJ 61 // Advanced Logic Corp. TinyJ embedded processor
#define EM_X86_64 62 // Advanced Micro Devices X86-64 processor
#define EM_PDSP 63 // Sony DSP Processor
#define EM_PDP10 64 // Digital Equipment Corp. PDP-10
#define EM_PDP11 65 // Digital Equipment Corp. PDP-11
#define EM_FX66 66 // Siemens FX66 microcontroller
#define EM_ST9PLUS 67 // STMicroelectronics ST9+ 8/16 bit microcontroller
#define EM_ST7 68 // STMicroelectronics ST7 8-bit microcontroller
#define EM_68HC16 69 // Motorola MC68HC16 Microcontroller
#define EM_68HC11 70 // Motorola MC68HC11 Microcontroller
#define EM_68HC08 71 // Motorola MC68HC08 Microcontroller
#define EM_68HC05 72 // Motorola MC68HC05 Microcontroller
#define EM_SVX 73 // Silicon Graphics SVx
#define EM_ST19 74 // STMicroelectronics ST19 8-bit cpu
#define EM_VAX 75 // Digital VAX
#define EM_CRIS 76 // Axis Communications 32-bit embedded processor
#define EM_JAVELIN 77 // Infineon Technologies 32-bit embedded cpu
#define EM_FIREPATH 78 // Element 14 64-bit DSP processor
#define EM_ZSP 79 // LSI Logic's 16-bit DSP processor
#define EM_MMIX 80 // Donald Knuth's educational 64-bit processor
#define EM_HUANY 81 // Harvard's machine-independent format
#define EM_PRISM 82 // SiTera Prism
#define EM_AVR 83 // Atmel AVR 8-bit microcontroller
#define EM_FR30 84 // Fujitsu FR30
#define EM_D10V 85 // Mitsubishi D10V
#define EM_D30V 86 // Mitsubishi D30V
#define EM_V850 87 // NEC v850
#define EM_M32R 88 // Renesas M32R (formerly Mitsubishi M32R)
#define EM_MN10300 89 // Matsushita MN10300
#define EM_MN10200 90 // Matsushita MN10200
#define EM_PJ 91 // picoJava
#define EM_OPENRISC 92 // OpenRISC 32-bit embedded processor
#define EM_ARC_A5 93 // ARC Cores Tangent-A5
#define EM_XTENSA 94 // Tensilica Xtensa Architecture
#define EM_VIDEOCORE 95 // Alphamosaic VideoCore processor
#define EM_TMM_GPP 96 // Thompson Multimedia General Purpose Processor
#define EM_NS32K 97 // National Semiconductor 32000 series
#define EM_TPC 98 // Tenor Network TPC processor
#define EM_SNP1K 99 // Trebia SNP 1000 processor
#define EM_ST200 100 // STMicroelectronics ST200 microcontroller
#define EM_IP2K 101 // Ubicom IP2022 micro controller
#define EM_MAX 102 // MAX Processor
#define EM_CR 103 // National Semiconductor CompactRISC
#define EM_F2MC16 104 // Fujitsu F2MC16
#define EM_MSP430 105 // TI msp430 micro controller
#define EM_BLACKFIN 106 // ADI Blackfin
#define EM_SE_C33 107 // S1C33 Family of Seiko Epson processors
#define EM_SEP 108 // Sharp embedded microprocessor
#define EM_ARCA 109 // Arca RISC Microprocessor
#define EM_UNICORE 110 // Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University
#define EM_EXCESS 111 // eXcess: 16/32/64-bit configurable embedded CPU
#define EM_DXP 112 // Icera Semiconductor Inc. Deep Execution Processor
#define EM_ALTERA_NIOS2 113 // Altera Nios II soft-core processor
#define EM_CRX 114 // National Semiconductor CRX
#define EM_XGATE 115 // Motorola XGATE embedded processor
#define EM_C166 116 // Infineon C16x/XC16x processor
#define EM_M16C 117 // Renesas M16C series microprocessors
#define EM_DSPIC30F 118 // Microchip Technology dsPIC30F Digital Signal Controller
#define EM_CE 119 // Freescale Communication Engine RISC core
#define EM_M32C 120 // Renesas M32C series microprocessors
#define EM_res121 121 // Reserved
#define EM_res122 122 // Reserved
#define EM_res123 123 // Reserved
#define EM_res124 124 // Reserved
#define EM_res125 125 // Reserved
#define EM_res126 126 // Reserved
#define EM_res127 127 // Reserved
#define EM_res128 128 // Reserved
#define EM_res129 129 // Reserved
#define EM_res130 130 // Reserved
#define EM_TSK3000 131 // Altium TSK3000 core
#define EM_RS08 132 // Freescale RS08 embedded processor
#define EM_res133 133 // Reserved
#define EM_ECOG2 134 // Cyan Technology eCOG2 microprocessor
#define EM_SCORE 135 // Sunplus Score
#define EM_SCORE7 135 // Sunplus S+core7 RISC processor
#define EM_DSP24 136 // New Japan Radio (NJR) 24-bit DSP Processor
#define EM_VIDEOCORE3 137 // Broadcom VideoCore III processor
#define EM_LATTICEMICO32 138 // RISC processor for Lattice FPGA architecture
#define EM_SE_C17 139 // Seiko Epson C17 family
#define EM_TI_C6000 140 // Texas Instruments TMS320C6000 DSP family
#define EM_TI_C2000 141 // Texas Instruments TMS320C2000 DSP family
#define EM_TI_C5500 142 // Texas Instruments TMS320C55x DSP family
#define EM_res143 143 // Reserved
#define EM_res144 144 // Reserved
#define EM_res145 145 // Reserved
#define EM_res146 146 // Reserved
#define EM_res147 147 // Reserved
#define EM_res148 148 // Reserved
#define EM_res149 149 // Reserved
#define EM_res150 150 // Reserved
#define EM_res151 151 // Reserved
#define EM_res152 152 // Reserved
#define EM_res153 153 // Reserved
#define EM_res154 154 // Reserved
#define EM_res155 155 // Reserved
#define EM_res156 156 // Reserved
#define EM_res157 157 // Reserved
#define EM_res158 158 // Reserved
#define EM_res159 159 // Reserved
#define EM_MMDSP_PLUS 160 // STMicroelectronics 64bit VLIW Data Signal Processor
#define EM_CYPRESS_M8C 161 // Cypress M8C microprocessor
#define EM_R32C 162 // Renesas R32C series microprocessors
#define EM_TRIMEDIA 163 // NXP Semiconductors TriMedia architecture family
#define EM_QDSP6 164 // QUALCOMM DSP6 Processor
#define EM_8051 165 // Intel 8051 and variants
#define EM_STXP7X 166 // STMicroelectronics STxP7x family
#define EM_NDS32 167 // Andes Technology compact code size embedded RISC processor family
#define EM_ECOG1 168 // Cyan Technology eCOG1X family
#define EM_ECOG1X 168 // Cyan Technology eCOG1X family
#define EM_MAXQ30 169 // Dallas Semiconductor MAXQ30 Core Micro-controllers
#define EM_XIMO16 170 // New Japan Radio (NJR) 16-bit DSP Processor
#define EM_MANIK 171 // M2000 Reconfigurable RISC Microprocessor
#define EM_CRAYNV2 172 // Cray Inc. NV2 vector architecture
#define EM_RX 173 // Renesas RX family
#define EM_METAG 174 // Imagination Technologies META processor architecture
#define EM_MCST_ELBRUS 175 // MCST Elbrus general purpose hardware architecture
#define EM_ECOG16 176 // Cyan Technology eCOG16 family
#define EM_CR16 177 // National Semiconductor CompactRISC 16-bit processor
#define EM_ETPU 178 // Freescale Extended Time Processing Unit
#define EM_SLE9X 179 // Infineon Technologies SLE9X core
#define EM_L1OM 180 // Intel L1OM
#define EM_INTEL181 181 // Reserved by Intel
#define EM_INTEL182 182 // Reserved by Intel
#define EM_res183 183 // Reserved by ARM
#define EM_res184 184 // Reserved by ARM
#define EM_AVR32 185 // Atmel Corporation 32-bit microprocessor family
#define EM_STM8 186 // STMicroeletronics STM8 8-bit microcontroller
#define EM_TILE64 187 // Tilera TILE64 multicore architecture family
#define EM_TILEPRO 188 // Tilera TILEPro multicore architecture family
#define EM_MICROBLAZE 189 // Xilinx MicroBlaze 32-bit RISC soft processor core
#define EM_CUDA 190 // NVIDIA CUDA architecture
#define EM_TILEGX 191 // Tilera TILE-Gx multicore architecture family
#define EM_CLOUDSHIELD 192 // CloudShield architecture family
#define EM_COREA_1ST 193 // KIPO-KAIST Core-A 1st generation processor family
#define EM_COREA_2ND 194 // KIPO-KAIST Core-A 2nd generation processor family
#define EM_ARC_COMPACT2 195 // Synopsys ARCompact V2
#define EM_OPEN8 196 // Open8 8-bit RISC soft processor core
#define EM_RL78 197 // Renesas RL78 family
#define EM_VIDEOCORE5 198 // Broadcom VideoCore V processor
#define EM_78KOR 199 // Renesas 78KOR family
#define EM_56800EX 200 // Freescale 56800EX Digital Signal Controller (DSC)
#define EM_BA1 201 // Beyond BA1 CPU architecture
#define EM_BA2 202 // Beyond BA2 CPU architecture
#define EM_XCORE 203 // XMOS xCORE processor family
#define EM_MCHP_PIC 204 // Microchip 8-bit PIC(r) family
#define EM_INTEL205 205 // Reserved by Intel
#define EM_INTEL206 206 // Reserved by Intel
#define EM_INTEL207 207 // Reserved by Intel
#define EM_INTEL208 208 // Reserved by Intel
#define EM_INTEL209 209 // Reserved by Intel
#define EM_KM32 210 // KM211 KM32 32-bit processor
#define EM_KMX32 211 // KM211 KMX32 32-bit processor
#define EM_KMX16 212 // KM211 KMX16 16-bit processor
#define EM_KMX8 213 // KM211 KMX8 8-bit processor
#define EM_KVARC 214 // KM211 KVARC processor
#define EM_CDP 215 // Paneve CDP architecture family
#define EM_COGE 216 // Cognitive Smart Memory Processor
#define EM_COOL 217 // iCelero CoolEngine
#define EM_NORC 218 // Nanoradio Optimized RISC
#define EM_CSR_KALIMBA 219 // CSR Kalimba architecture family
#define EM_Z80 220 // Zilog Z80
#define EM_VISIUM 221 // Controls and Data Services VISIUMcore processor
#define EM_FT32 222 // FTDI Chip FT32 high performance 32-bit RISC architecture
#define EM_MOXIE 223 // Moxie processor family
#define EM_AMDGPU 224 // AMD GPU architecture
#define EM_RISCV 243 // RISC-V
#define EM_LANAI 244 // Lanai processor
#define EM_CEVA 245 // CEVA Processor Architecture Family
#define EM_CEVA_X2 246 // CEVA X2 Processor Family
#define EM_BPF 247 // Linux BPF in-kernel virtual machine
// File version
#define EV_NONE 0
#define EV_CURRENT 1
// Identification index
#define EI_MAG0 0
#define EI_MAG1 1
#define EI_MAG2 2
#define EI_MAG3 3
#define EI_CLASS 4
#define EI_DATA 5
#define EI_VERSION 6
#define EI_OSABI 7
#define EI_ABIVERSION 8
#define EI_PAD 9
#define EI_NIDENT 16
// Magic number
#define ELFMAG0 0x7F
#define ELFMAG1 'E'
#define ELFMAG2 'L'
#define ELFMAG3 'F'
// File class
#define ELFCLASSNONE 0
#define ELFCLASS32 1
#define ELFCLASS64 2
// Encoding
#define ELFDATANONE 0
#define ELFDATA2LSB 1
#define ELFDATA2MSB 2
// OS extensions
#define ELFOSABI_NONE 0 // No extensions or unspecified
#define ELFOSABI_HPUX 1 // Hewlett-Packard HP-UX
#define ELFOSABI_NETBSD 2 // NetBSD
#define ELFOSABI_LINUX 3 // Linux
#define ELFOSABI_SOLARIS 6 // Sun Solaris
#define ELFOSABI_AIX 7 // AIX
#define ELFOSABI_IRIX 8 // IRIX
#define ELFOSABI_FREEBSD 9 // FreeBSD
#define ELFOSABI_TRU64 10 // Compaq TRU64 UNIX
#define ELFOSABI_MODESTO 11 // Novell Modesto
#define ELFOSABI_OPENBSD 12 // Open BSD
#define ELFOSABI_OPENVMS 13 // Open VMS
#define ELFOSABI_NSK 14 // Hewlett-Packard Non-Stop Kernel
#define ELFOSABI_AROS 15 // Amiga Research OS
#define ELFOSABI_FENIXOS 16 // The FenixOS highly scalable multi-core OS
// 64-255 Architecture-specific value range
#define ELFOSABI_AMDGPU_HSA 64 // AMDGPU OS for HSA compatible compute
// kernels.
#define ELFOSABI_AMDGPU_PAL 65 // AMDGPU OS for AMD PAL compatible graphics
// shaders and compute kernels.
#define ELFOSABI_AMDGPU_MESA3D 66 // AMDGPU OS for Mesa3D compatible graphics
// shaders and compute kernels.
// AMDGPU specific e_flags
#define EF_AMDGPU_MACH 0x0ff // AMDGPU processor selection mask.
#define EF_AMDGPU_XNACK 0x100 // Indicates if the XNACK target feature is
// enabled for all code contained in the ELF.
// AMDGPU processors
#define EF_AMDGPU_MACH_NONE 0x000 // Unspecified processor.
#define EF_AMDGPU_MACH_R600_R600 0x001
#define EF_AMDGPU_MACH_R600_R630 0x002
#define EF_AMDGPU_MACH_R600_RS880 0x003
#define EF_AMDGPU_MACH_R600_RV670 0x004
#define EF_AMDGPU_MACH_R600_RV710 0x005
#define EF_AMDGPU_MACH_R600_RV730 0x006
#define EF_AMDGPU_MACH_R600_RV770 0x007
#define EF_AMDGPU_MACH_R600_CEDAR 0x008
#define EF_AMDGPU_MACH_R600_CYPRESS 0x009
#define EF_AMDGPU_MACH_R600_JUNIPER 0x00a
#define EF_AMDGPU_MACH_R600_REDWOOD 0x00b
#define EF_AMDGPU_MACH_R600_SUMO 0x00c
#define EF_AMDGPU_MACH_R600_BARTS 0x00d
#define EF_AMDGPU_MACH_R600_CAICOS 0x00e
#define EF_AMDGPU_MACH_R600_CAYMAN 0x00f
#define EF_AMDGPU_MACH_R600_TURKS 0x010
#define EF_AMDGPU_MACH_R600_RESERVED_FIRST 0x011
#define EF_AMDGPU_MACH_R600_RESERVED_LAST 0x01f
#define EF_AMDGPU_MACH_R600_FIRST EF_AMDGPU_MACH_R600_R600
#define EF_AMDGPU_MACH_R600_LAST EF_AMDGPU_MACH_R600_TURKS
#define EF_AMDGPU_MACH_AMDGCN_GFX600 0x020
#define EF_AMDGPU_MACH_AMDGCN_GFX601 0x021
#define EF_AMDGPU_MACH_AMDGCN_GFX700 0x022
#define EF_AMDGPU_MACH_AMDGCN_GFX701 0x023
#define EF_AMDGPU_MACH_AMDGCN_GFX702 0x024
#define EF_AMDGPU_MACH_AMDGCN_GFX703 0x025
#define EF_AMDGPU_MACH_AMDGCN_GFX704 0x026
#define EF_AMDGPU_MACH_AMDGCN_GFX801 0x028
#define EF_AMDGPU_MACH_AMDGCN_GFX802 0x029
#define EF_AMDGPU_MACH_AMDGCN_GFX803 0x02a
#define EF_AMDGPU_MACH_AMDGCN_GFX810 0x02b
#define EF_AMDGPU_MACH_AMDGCN_GFX900 0x02c
#define EF_AMDGPU_MACH_AMDGCN_GFX902 0x02d
#define EF_AMDGPU_MACH_AMDGCN_GFX904 0x02e
#define EF_AMDGPU_MACH_AMDGCN_GFX906 0x02f
#define EF_AMDGPU_MACH_AMDGCN_RESERVED0 0x027
#define EF_AMDGPU_MACH_AMDGCN_RESERVED1 0x030
#define EF_AMDGPU_MACH_AMDGCN_FIRST EF_AMDGPU_MACH_AMDGCN_GFX600
#define EF_AMDGPU_MACH_AMDGCN_LAST EF_AMDGPU_MACH_AMDGCN_GFX906
/////////////////////
// Sections constants
// Section indexes
#define SHN_UNDEF 0
#define SHN_LORESERVE 0xFF00
#define SHN_LOPROC 0xFF00
#define SHN_HIPROC 0xFF1F
#define SHN_LOOS 0xFF20
#define SHN_HIOS 0xFF3F
#define SHN_ABS 0xFFF1
#define SHN_COMMON 0xFFF2
#define SHN_XINDEX 0xFFFF
#define SHN_HIRESERVE 0xFFFF
// Section types
#define SHT_NULL 0
#define SHT_PROGBITS 1
#define SHT_SYMTAB 2
#define SHT_STRTAB 3
#define SHT_RELA 4
#define SHT_HASH 5
#define SHT_DYNAMIC 6
#define SHT_NOTE 7
#define SHT_NOBITS 8
#define SHT_REL 9
#define SHT_SHLIB 10
#define SHT_DYNSYM 11
#define SHT_INIT_ARRAY 14
#define SHT_FINI_ARRAY 15
#define SHT_PREINIT_ARRAY 16
#define SHT_GROUP 17
#define SHT_SYMTAB_SHNDX 18
#define SHT_LOOS 0x60000000
#define SHT_HIOS 0x6fffffff
#define SHT_LOPROC 0x70000000
#define SHT_HIPROC 0x7FFFFFFF
#define SHT_LOUSER 0x80000000
#define SHT_HIUSER 0xFFFFFFFF
// Section attribute flags
#define SHF_WRITE 0x1
#define SHF_ALLOC 0x2
#define SHF_EXECINSTR 0x4
#define SHF_MERGE 0x10
#define SHF_STRINGS 0x20
#define SHF_INFO_LINK 0x40
#define SHF_LINK_ORDER 0x80
#define SHF_OS_NONCONFORMING 0x100
#define SHF_GROUP 0x200
#define SHF_TLS 0x400
#define SHF_MASKOS 0x0ff00000
#define SHF_MASKPROC 0xF0000000
// Section group flags
#define GRP_COMDAT 0x1
#define GRP_MASKOS 0x0ff00000
#define GRP_MASKPROC 0xf0000000
// Symbol binding
#define STB_LOCAL 0
#define STB_GLOBAL 1
#define STB_WEAK 2
#define STB_LOOS 10
#define STB_HIOS 12
#define STB_MULTIDEF 13
#define STB_LOPROC 13
#define STB_HIPROC 15
// Note types
#define NT_AMDGPU_METADATA 1
#define NT_AMD_AMDGPU_HSA_METADATA 10
#define NT_AMD_AMDGPU_ISA 11
#define NT_AMD_AMDGPU_PAL_METADATA 12
// Symbol types
#define STT_NOTYPE 0
#define STT_OBJECT 1
#define STT_FUNC 2
#define STT_SECTION 3
#define STT_FILE 4
#define STT_COMMON 5
#define STT_TLS 6
#define STT_LOOS 10
#define STT_AMDGPU_HSA_KERNEL 10
#define STT_HIOS 12
#define STT_LOPROC 13
#define STT_HIPROC 15
// Symbol visibility
#define STV_DEFAULT 0
#define STV_INTERNAL 1
#define STV_HIDDEN 2
#define STV_PROTECTED 3
// Undefined name
#define STN_UNDEF 0
// Relocation types
#define R_386_NONE 0
#define R_X86_64_NONE 0
#define R_AMDGPU_NONE 0
#define R_386_32 1
#define R_X86_64_64 1
#define R_AMDGPU_ABS32_LO 1
#define R_386_PC32 2
#define R_X86_64_PC32 2
#define R_AMDGPU_ABS32_HI 2
#define R_386_GOT32 3
#define R_X86_64_GOT32 3
#define R_AMDGPU_ABS64 3
#define R_386_PLT32 4
#define R_X86_64_PLT32 4
#define R_AMDGPU_REL32 4
#define R_386_COPY 5
#define R_X86_64_COPY 5
#define R_AMDGPU_REL64 5
#define R_386_GLOB_DAT 6
#define R_X86_64_GLOB_DAT 6
#define R_AMDGPU_ABS32 6
#define R_386_JMP_SLOT 7
#define R_X86_64_JUMP_SLOT 7
#define R_AMDGPU_GOTPCREL 7
#define R_386_RELATIVE 8
#define R_X86_64_RELATIVE 8
#define R_AMDGPU_GOTPCREL32_LO 8
#define R_386_GOTOFF 9
#define R_X86_64_GOTPCREL 9
#define R_AMDGPU_GOTPCREL32_HI 9
#define R_386_GOTPC 10
#define R_X86_64_32 10
#define R_AMDGPU_REL32_LO 10
#define R_386_32PLT 11
#define R_X86_64_32S 11
#define R_AMDGPU_REL32_HI 11
#define R_X86_64_16 12
#define R_X86_64_PC16 13
#define R_AMDGPU_RELATIVE64 13
#define R_386_TLS_TPOFF 14
#define R_X86_64_8 14
#define R_386_TLS_IE 15
#define R_X86_64_PC8 15
#define R_386_TLS_GOTIE 16
#define R_X86_64_DTPMOD64 16
#define R_386_TLS_LE 17
#define R_X86_64_DTPOFF64 17
#define R_386_TLS_GD 18
#define R_X86_64_TPOFF64 18
#define R_386_TLS_LDM 19
#define R_X86_64_TLSGD 19
#define R_386_16 20
#define R_X86_64_TLSLD 20
#define R_386_PC16 21
#define R_X86_64_DTPOFF32 21
#define R_386_8 22
#define R_X86_64_GOTTPOFF 22
#define R_386_PC8 23
#define R_X86_64_TPOFF32 23
#define R_386_TLS_GD_32 24
#define R_X86_64_PC64 24
#define R_386_TLS_GD_PUSH 25
#define R_X86_64_GOTOFF64 25
#define R_386_TLS_GD_CALL 26
#define R_X86_64_GOTPC32 26
#define R_386_TLS_GD_POP 27
#define R_X86_64_GOT64 27
#define R_386_TLS_LDM_32 28
#define R_X86_64_GOTPCREL64 28
#define R_386_TLS_LDM_PUSH 29
#define R_X86_64_GOTPC64 29
#define R_386_TLS_LDM_CALL 30
#define R_X86_64_GOTPLT64 30
#define R_386_TLS_LDM_POP 31
#define R_X86_64_PLTOFF64 31
#define R_386_TLS_LDO_32 32
#define R_386_TLS_IE_32 33
#define R_386_TLS_LE_32 34
#define R_X86_64_GOTPC32_TLSDESC 34
#define R_386_TLS_DTPMOD32 35
#define R_X86_64_TLSDESC_CALL 35
#define R_386_TLS_DTPOFF32 36
#define R_X86_64_TLSDESC 36
#define R_386_TLS_TPOFF32 37
#define R_X86_64_IRELATIVE 37
#define R_386_SIZE32 38
#define R_386_TLS_GOTDESC 39
#define R_386_TLS_DESC_CALL 40
#define R_386_TLS_DESC 41
#define R_386_IRELATIVE 42
#define R_386_GOT32X 43
#define R_X86_64_GNU_VTINHERIT 250
#define R_X86_64_GNU_VTENTRY 251
// Segment types
#define PT_NULL 0
#define PT_LOAD 1
#define PT_DYNAMIC 2
#define PT_INTERP 3
#define PT_NOTE 4
#define PT_SHLIB 5
#define PT_PHDR 6
#define PT_TLS 7
#define PT_LOOS 0x60000000
#define PT_HIOS 0x6fffffff
#define PT_LOPROC 0x70000000
#define PT_HIPROC 0x7FFFFFFF
// Segment flags
#define PF_X 1 // Execute
#define PF_W 2 // Write
#define PF_R 4 // Read
#define PF_MASKOS 0x0ff00000 // Unspecified
#define PF_MASKPROC 0xf0000000 // Unspecified
// Dynamic Array Tags
#define DT_NULL 0
#define DT_NEEDED 1
#define DT_PLTRELSZ 2
#define DT_PLTGOT 3
#define DT_HASH 4
#define DT_STRTAB 5
#define DT_SYMTAB 6
#define DT_RELA 7
#define DT_RELASZ 8
#define DT_RELAENT 9
#define DT_STRSZ 10
#define DT_SYMENT 11
#define DT_INIT 12
#define DT_FINI 13
#define DT_SONAME 14
#define DT_RPATH 15
#define DT_SYMBOLIC 16
#define DT_REL 17
#define DT_RELSZ 18
#define DT_RELENT 19
#define DT_PLTREL 20
#define DT_DEBUG 21
#define DT_TEXTREL 22
#define DT_JMPREL 23
#define DT_BIND_NOW 24
#define DT_INIT_ARRAY 25
#define DT_FINI_ARRAY 26
#define DT_INIT_ARRAYSZ 27
#define DT_FINI_ARRAYSZ 28
#define DT_RUNPATH 29
#define DT_FLAGS 30
#define DT_ENCODING 32
#define DT_PREINIT_ARRAY 32
#define DT_PREINIT_ARRAYSZ 33
#define DT_MAXPOSTAGS 34
#define DT_LOOS 0x6000000D
#define DT_HIOS 0x6ffff000
#define DT_LOPROC 0x70000000
#define DT_HIPROC 0x7FFFFFFF
// DT_FLAGS values
#define DF_ORIGIN 0x1
#define DF_SYMBOLIC 0x2
#define DF_TEXTREL 0x4
#define DF_BIND_NOW 0x8
#define DF_STATIC_TLS 0x10
// ELF file header
struct Elf32_Ehdr {
unsigned char e_ident[EI_NIDENT];
Elf_Half e_type;
Elf_Half e_machine;
Elf_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf_Word e_flags;
Elf_Half e_ehsize;
Elf_Half e_phentsize;
Elf_Half e_phnum;
Elf_Half e_shentsize;
Elf_Half e_shnum;
Elf_Half e_shstrndx;
};
struct Elf64_Ehdr {
unsigned char e_ident[EI_NIDENT];
Elf_Half e_type;
Elf_Half e_machine;
Elf_Word e_version;
Elf64_Addr e_entry;
Elf64_Off e_phoff;
Elf64_Off e_shoff;
Elf_Word e_flags;
Elf_Half e_ehsize;
Elf_Half e_phentsize;
Elf_Half e_phnum;
Elf_Half e_shentsize;
Elf_Half e_shnum;
Elf_Half e_shstrndx;
};
// Section header
struct Elf32_Shdr {
Elf_Word sh_name;
Elf_Word sh_type;
Elf_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf_Word sh_size;
Elf_Word sh_link;
Elf_Word sh_info;
Elf_Word sh_addralign;
Elf_Word sh_entsize;
};
struct Elf64_Shdr {
Elf_Word sh_name;
Elf_Word sh_type;
Elf_Xword sh_flags;
Elf64_Addr sh_addr;
Elf64_Off sh_offset;
Elf_Xword sh_size;
Elf_Word sh_link;
Elf_Word sh_info;
Elf_Xword sh_addralign;
Elf_Xword sh_entsize;
};
// Segment header
struct Elf32_Phdr {
Elf_Word p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf_Word p_filesz;
Elf_Word p_memsz;
Elf_Word p_flags;
Elf_Word p_align;
};
struct Elf64_Phdr {
Elf_Word p_type;
Elf_Word p_flags;
Elf64_Off p_offset;
Elf64_Addr p_vaddr;
Elf64_Addr p_paddr;
Elf_Xword p_filesz;
Elf_Xword p_memsz;
Elf_Xword p_align;
};
// Symbol table entry
struct Elf32_Sym {
Elf_Word st_name;
Elf32_Addr st_value;
Elf_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf_Half st_shndx;
};
struct Elf64_Sym {
Elf_Word st_name;
unsigned char st_info;
unsigned char st_other;
Elf_Half st_shndx;
Elf64_Addr st_value;
Elf_Xword st_size;
};
#define ELF_ST_BIND(i) ((i)>>4)
#define ELF_ST_TYPE(i) ((i)&0xf)
#define ELF_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
#define ELF_ST_VISIBILITY(o) ((o)&0x3)
// Relocation entries
struct Elf32_Rel {
Elf32_Addr r_offset;
Elf_Word r_info;
};
struct Elf32_Rela {
Elf32_Addr r_offset;
Elf_Word r_info;
Elf_Sword r_addend;
};
struct Elf64_Rel {
Elf64_Addr r_offset;
Elf_Xword r_info;
};
struct Elf64_Rela {
Elf64_Addr r_offset;
Elf_Xword r_info;
Elf_Sxword r_addend;
};
#define ELF32_R_SYM(i) ((i)>>8)
#define ELF32_R_TYPE(i) ((unsigned char)(i))
#define ELF32_R_INFO(s,t) (((s)<<8 )+(unsigned char)(t))
#define ELF64_R_SYM(i) ((i)>>32)
#define ELF64_R_TYPE(i) ((i)&0xffffffffL)
#define ELF64_R_INFO(s,t) ((((int64_t)(s))<<32)+((t)&0xffffffffL))
// Dynamic structure
struct Elf32_Dyn {
Elf_Sword d_tag;
union {
Elf_Word d_val;
Elf32_Addr d_ptr;
} d_un;
};
struct Elf64_Dyn {
Elf_Sxword d_tag;
union {
Elf_Xword d_val;
Elf64_Addr d_ptr;
} d_un;
};
} // namespace ELFIO
#endif // ELFTYPES_H

View file

@ -1,955 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_HPP
#define ELFIO_HPP
#ifdef _MSC_VER
#pragma warning ( push )
#pragma warning(disable:4996)
#pragma warning(disable:4355)
#pragma warning(disable:4244)
#endif
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>
#include <iterator>
#include <typeinfo>
#include <elfio/elf_types.hpp>
#include <elfio/elfio_utils.hpp>
#include <elfio/elfio_header.hpp>
#include <elfio/elfio_section.hpp>
#include <elfio/elfio_segment.hpp>
#include <elfio/elfio_strings.hpp>
#define ELFIO_HEADER_ACCESS_GET( TYPE, FNAME ) \
TYPE \
get_##FNAME() const \
{ \
return header? header->get_##FNAME() : 0; \
}
#define ELFIO_HEADER_ACCESS_GET_SET( TYPE, FNAME ) \
TYPE \
get_##FNAME() const \
{ \
return header? header->get_##FNAME() : 0; \
} \
void \
set_##FNAME( TYPE val ) \
{ \
if (header) { \
header->set_##FNAME( val ); \
} \
} \
namespace ELFIO {
//------------------------------------------------------------------------------
class elfio
{
public:
//------------------------------------------------------------------------------
elfio() : sections( this ), segments( this )
{
header = 0;
current_file_pos = 0;
create( ELFCLASS32, ELFDATA2LSB );
}
//------------------------------------------------------------------------------
~elfio()
{
clean();
}
//------------------------------------------------------------------------------
void create( unsigned char file_class, unsigned char encoding )
{
clean();
convertor.setup( encoding );
header = create_header( file_class, encoding );
create_mandatory_sections();
}
//------------------------------------------------------------------------------
bool load( const std::string& file_name )
{
std::ifstream stream;
stream.open( file_name.c_str(), std::ios::in | std::ios::binary );
if ( !stream ) {
return false;
}
return load(stream);
}
//------------------------------------------------------------------------------
bool load( std::istream &stream )
{
clean();
unsigned char e_ident[EI_NIDENT];
// Read ELF file signature
stream.read( reinterpret_cast<char*>( &e_ident ), sizeof( e_ident ) );
// Is it ELF file?
if ( stream.gcount() != sizeof( e_ident ) ||
e_ident[EI_MAG0] != ELFMAG0 ||
e_ident[EI_MAG1] != ELFMAG1 ||
e_ident[EI_MAG2] != ELFMAG2 ||
e_ident[EI_MAG3] != ELFMAG3 ) {
return false;
}
if ( ( e_ident[EI_CLASS] != ELFCLASS64 ) &&
( e_ident[EI_CLASS] != ELFCLASS32 )) {
return false;
}
convertor.setup( e_ident[EI_DATA] );
header = create_header( e_ident[EI_CLASS], e_ident[EI_DATA] );
if ( 0 == header ) {
return false;
}
if ( !header->load( stream ) ) {
return false;
}
load_sections( stream );
bool is_still_good = load_segments( stream );
return is_still_good;
}
//------------------------------------------------------------------------------
bool save( const std::string& file_name )
{
std::ofstream stream;
stream.open( file_name.c_str(), std::ios::out | std::ios::binary );
if ( !stream ) {
return false;
}
return save(stream);
}
//------------------------------------------------------------------------------
bool save( std::ostream &stream )
{
if ( !stream || !header) {
return false;
}
bool is_still_good = true;
// Define layout specific header fields
// The position of the segment table is fixed after the header.
// The position of the section table is variable and needs to be fixed
// before saving.
header->set_segments_num( segments.size() );
header->set_segments_offset( segments.size() ? header->get_header_size() : 0 );
header->set_sections_num( sections.size() );
header->set_sections_offset( 0 );
// Layout the first section right after the segment table
current_file_pos = header->get_header_size() +
header->get_segment_entry_size() * header->get_segments_num();
calc_segment_alignment();
is_still_good = layout_segments_and_their_sections();
is_still_good = is_still_good && layout_sections_without_segments();
is_still_good = is_still_good && layout_section_table();
is_still_good = is_still_good && save_header( stream );
is_still_good = is_still_good && save_sections( stream );
is_still_good = is_still_good && save_segments( stream );
return is_still_good;
}
//------------------------------------------------------------------------------
// ELF header access functions
ELFIO_HEADER_ACCESS_GET( unsigned char, class );
ELFIO_HEADER_ACCESS_GET( unsigned char, elf_version );
ELFIO_HEADER_ACCESS_GET( unsigned char, encoding );
ELFIO_HEADER_ACCESS_GET( Elf_Word, version );
ELFIO_HEADER_ACCESS_GET( Elf_Half, header_size );
ELFIO_HEADER_ACCESS_GET( Elf_Half, section_entry_size );
ELFIO_HEADER_ACCESS_GET( Elf_Half, segment_entry_size );
ELFIO_HEADER_ACCESS_GET_SET( unsigned char, os_abi );
ELFIO_HEADER_ACCESS_GET_SET( unsigned char, abi_version );
ELFIO_HEADER_ACCESS_GET_SET( Elf_Half, type );
ELFIO_HEADER_ACCESS_GET_SET( Elf_Half, machine );
ELFIO_HEADER_ACCESS_GET_SET( Elf_Word, flags );
ELFIO_HEADER_ACCESS_GET_SET( Elf64_Addr, entry );
ELFIO_HEADER_ACCESS_GET_SET( Elf64_Off, sections_offset );
ELFIO_HEADER_ACCESS_GET_SET( Elf64_Off, segments_offset );
ELFIO_HEADER_ACCESS_GET_SET( Elf_Half, section_name_str_index );
//------------------------------------------------------------------------------
const endianess_convertor& get_convertor() const
{
return convertor;
}
//------------------------------------------------------------------------------
Elf_Xword get_default_entry_size( Elf_Word section_type ) const
{
switch( section_type ) {
case SHT_RELA:
if ( header->get_class() == ELFCLASS64 ) {
return sizeof( Elf64_Rela );
}
else {
return sizeof( Elf32_Rela );
}
case SHT_REL:
if ( header->get_class() == ELFCLASS64 ) {
return sizeof( Elf64_Rel );
}
else {
return sizeof( Elf32_Rel );
}
case SHT_SYMTAB:
if ( header->get_class() == ELFCLASS64 ) {
return sizeof( Elf64_Sym );
}
else {
return sizeof( Elf32_Sym );
}
case SHT_DYNAMIC:
if ( header->get_class() == ELFCLASS64 ) {
return sizeof( Elf64_Dyn );
}
else {
return sizeof( Elf32_Dyn );
}
default:
return 0;
}
}
//------------------------------------------------------------------------------
private:
bool is_offset_in_section( Elf64_Off offset, const section* sec ) const {
return offset >= sec->get_offset() && offset < sec->get_offset()+sec->get_size();
}
//------------------------------------------------------------------------------
public:
//! returns an empty string if no problems are detected,
//! or a string containing an error message if problems are found
std::string validate() const {
// check for overlapping sections in the file
for ( int i = 0; i < sections.size(); ++i) {
for ( int j = i+1; j < sections.size(); ++j ) {
const section* a = sections[i];
const section* b = sections[j];
if ( !(a->get_type() & SHT_NOBITS)
&& !(b->get_type() & SHT_NOBITS)
&& (a->get_size() > 0)
&& (b->get_size() > 0)
&& (a->get_offset() > 0)
&& (b->get_offset() > 0)) {
if ( is_offset_in_section( a->get_offset(), b )
|| is_offset_in_section( a->get_offset()+a->get_size()-1, b )
|| is_offset_in_section( b->get_offset(), a )
|| is_offset_in_section( b->get_offset()+b->get_size()-1, a )) {
return "Sections " + a->get_name() + " and " + b->get_name() + " overlap in file";
}
}
}
}
// more checks to be added here...
return "";
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
void clean()
{
delete header;
header = 0;
std::vector<section*>::const_iterator it;
for ( it = sections_.begin(); it != sections_.end(); ++it ) {
delete *it;
}
sections_.clear();
std::vector<segment*>::const_iterator it1;
for ( it1 = segments_.begin(); it1 != segments_.end(); ++it1 ) {
delete *it1;
}
segments_.clear();
}
//------------------------------------------------------------------------------
elf_header* create_header( unsigned char file_class, unsigned char encoding )
{
elf_header* new_header = 0;
if ( file_class == ELFCLASS64 ) {
new_header = new elf_header_impl< Elf64_Ehdr >( &convertor,
encoding );
}
else if ( file_class == ELFCLASS32 ) {
new_header = new elf_header_impl< Elf32_Ehdr >( &convertor,
encoding );
}
else {
return 0;
}
return new_header;
}
//------------------------------------------------------------------------------
section* create_section()
{
section* new_section;
unsigned char file_class = get_class();
if ( file_class == ELFCLASS64 ) {
new_section = new section_impl<Elf64_Shdr>( &convertor );
}
else if ( file_class == ELFCLASS32 ) {
new_section = new section_impl<Elf32_Shdr>( &convertor );
}
else {
return 0;
}
new_section->set_index( (Elf_Half)sections_.size() );
sections_.push_back( new_section );
return new_section;
}
//------------------------------------------------------------------------------
segment* create_segment()
{
segment* new_segment;
unsigned char file_class = header->get_class();
if ( file_class == ELFCLASS64 ) {
new_segment = new segment_impl<Elf64_Phdr>( &convertor );
}
else if ( file_class == ELFCLASS32 ) {
new_segment = new segment_impl<Elf32_Phdr>( &convertor );
}
else {
return 0;
}
new_segment->set_index( (Elf_Half)segments_.size() );
segments_.push_back( new_segment );
return new_segment;
}
//------------------------------------------------------------------------------
void create_mandatory_sections()
{
// Create null section without calling to 'add_section' as no string
// section containing section names exists yet
section* sec0 = create_section();
sec0->set_index( 0 );
sec0->set_name( "" );
sec0->set_name_string_offset( 0 );
set_section_name_str_index( 1 );
section* shstrtab = sections.add( ".shstrtab" );
shstrtab->set_type( SHT_STRTAB );
shstrtab->set_addr_align( 1 );
}
//------------------------------------------------------------------------------
Elf_Half load_sections( std::istream& stream )
{
Elf_Half entry_size = header->get_section_entry_size();
Elf_Half num = header->get_sections_num();
Elf64_Off offset = header->get_sections_offset();
for ( Elf_Half i = 0; i < num; ++i ) {
section* sec = create_section();
sec->load( stream, (std::streamoff)offset + i * entry_size );
sec->set_index( i );
// To mark that the section is not permitted to reassign address
// during layout calculation
sec->set_address( sec->get_address() );
}
Elf_Half shstrndx = get_section_name_str_index();
if ( SHN_UNDEF != shstrndx ) {
string_section_accessor str_reader( sections[shstrndx] );
for ( Elf_Half i = 0; i < num; ++i ) {
Elf_Word section_offset = sections[i]->get_name_string_offset();
const char* p = str_reader.get_string( section_offset );
if ( p != 0 ) {
sections[i]->set_name( p );
}
}
}
return num;
}
//------------------------------------------------------------------------------
//! Checks whether the addresses of the section entirely fall within the given segment.
//! It doesn't matter if the addresses are memory addresses, or file offsets,
//! they just need to be in the same address space
bool is_sect_in_seg ( Elf64_Off sect_begin, Elf_Xword sect_size, Elf64_Off seg_begin, Elf64_Off seg_end ) {
return seg_begin <= sect_begin
&& sect_begin + sect_size <= seg_end
&& sect_begin < seg_end; // this is important criteria when sect_size == 0
// Example: seg_begin=10, seg_end=12 (-> covering the bytes 10 and 11)
// sect_begin=12, sect_size=0 -> shall return false!
}
//------------------------------------------------------------------------------
bool load_segments( std::istream& stream )
{
Elf_Half entry_size = header->get_segment_entry_size();
Elf_Half num = header->get_segments_num();
Elf64_Off offset = header->get_segments_offset();
for ( Elf_Half i = 0; i < num; ++i ) {
segment* seg;
unsigned char file_class = header->get_class();
if ( file_class == ELFCLASS64 ) {
seg = new segment_impl<Elf64_Phdr>( &convertor );
}
else if ( file_class == ELFCLASS32 ) {
seg = new segment_impl<Elf32_Phdr>( &convertor );
}
else {
return false;
}
seg->load( stream, (std::streamoff)offset + i * entry_size );
seg->set_index( i );
// Add sections to the segments (similar to readelfs algorithm)
Elf64_Off segBaseOffset = seg->get_offset();
Elf64_Off segEndOffset = segBaseOffset + seg->get_file_size();
Elf64_Off segVBaseAddr = seg->get_virtual_address();
Elf64_Off segVEndAddr = segVBaseAddr + seg->get_memory_size();
for( Elf_Half j = 0; j < sections.size(); ++j ) {
const section* psec = sections[j];
// SHF_ALLOC sections are matched based on the virtual address
// otherwise the file offset is matched
if( psec->get_flags() & SHF_ALLOC
? is_sect_in_seg( psec->get_address(), psec->get_size(), segVBaseAddr, segVEndAddr )
: is_sect_in_seg( psec->get_offset(), psec->get_size(), segBaseOffset, segEndOffset )) {
// Alignment of segment shall not be updated, to preserve original value
// It will be re-calculated on saving.
seg->add_section_index( psec->get_index(), 0 );
}
}
// Add section into the segments' container
segments_.push_back( seg );
}
return true;
}
//------------------------------------------------------------------------------
bool save_header( std::ostream& stream )
{
return header->save( stream );
}
//------------------------------------------------------------------------------
bool save_sections( std::ostream& stream )
{
for ( unsigned int i = 0; i < sections_.size(); ++i ) {
section *sec = sections_.at(i);
std::streampos headerPosition =
(std::streamoff)header->get_sections_offset() +
header->get_section_entry_size() * sec->get_index();
sec->save(stream,headerPosition,sec->get_offset());
}
return true;
}
//------------------------------------------------------------------------------
bool save_segments( std::ostream& stream )
{
for ( unsigned int i = 0; i < segments_.size(); ++i ) {
segment *seg = segments_.at(i);
std::streampos headerPosition = header->get_segments_offset() +
header->get_segment_entry_size()*seg->get_index();
seg->save( stream, headerPosition, seg->get_offset() );
}
return true;
}
//------------------------------------------------------------------------------
bool is_section_without_segment( unsigned int section_index )
{
bool found = false;
for ( unsigned int j = 0; !found && ( j < segments.size() ); ++j ) {
for ( unsigned int k = 0;
!found && ( k < segments[j]->get_sections_num() );
++k ) {
found = segments[j]->get_section_index_at( k ) == section_index;
}
}
return !found;
}
//------------------------------------------------------------------------------
bool is_subsequence_of( segment* seg1, segment* seg2 )
{
// Return 'true' if sections of seg1 are a subset of sections in seg2
const std::vector<Elf_Half>& sections1 = seg1->get_sections();
const std::vector<Elf_Half>& sections2 = seg2->get_sections();
bool found = false;
if ( sections1.size() < sections2.size() ) {
found = std::includes( sections2.begin(), sections2.end(),
sections1.begin(), sections1.end() );
}
return found;
}
//------------------------------------------------------------------------------
std::vector<segment*> get_ordered_segments( )
{
std::vector<segment*> res;
std::deque<segment*> worklist;
res.reserve(segments.size());
std::copy( segments_.begin(), segments_.end(),
std::back_inserter( worklist )) ;
// Bring the segments which start at address 0 to the front
size_t nextSlot = 0;
for( size_t i = 0; i < worklist.size(); ++i ) {
if( i != nextSlot && worklist[i]->is_offset_initialized()
&& worklist[i]->get_offset() == 0 ) {
if (worklist[nextSlot]->get_offset() == 0) {
++nextSlot;
}
std::swap(worklist[i],worklist[nextSlot]);
++nextSlot;
}
}
while ( !worklist.empty() ) {
segment *seg = worklist.front();
worklist.pop_front();
size_t i = 0;
for ( ; i < worklist.size(); ++i ) {
if ( is_subsequence_of( seg, worklist[i] ) ) {
break;
}
}
if ( i < worklist.size() )
worklist.push_back(seg);
else
res.push_back(seg);
}
return res;
}
//------------------------------------------------------------------------------
bool layout_sections_without_segments( )
{
for ( unsigned int i = 0; i < sections_.size(); ++i ) {
if ( is_section_without_segment( i ) ) {
section *sec = sections_[i];
Elf_Xword section_align = sec->get_addr_align();
if ( section_align > 1 && current_file_pos % section_align != 0 ) {
current_file_pos += section_align -
current_file_pos % section_align;
}
if ( 0 != sec->get_index() )
sec->set_offset(current_file_pos);
if ( SHT_NOBITS != sec->get_type() &&
SHT_NULL != sec->get_type() ) {
current_file_pos += sec->get_size();
}
}
}
return true;
}
//------------------------------------------------------------------------------
void calc_segment_alignment( )
{
for( std::vector<segment*>::iterator s = segments_.begin(); s != segments_.end(); ++s ) {
segment* seg = *s;
for ( int i = 0; i < seg->get_sections_num(); ++i ) {
section* sect = sections_[ seg->get_section_index_at(i) ];
if ( sect->get_addr_align() > seg->get_align() ) {
seg->set_align( sect->get_addr_align() );
}
}
}
}
//------------------------------------------------------------------------------
bool layout_segments_and_their_sections( )
{
std::vector<segment*> worklist;
std::vector<bool> section_generated(sections.size(),false);
// Get segments in a order in where segments which contain a
// sub sequence of other segments are located at the end
worklist = get_ordered_segments();
for ( unsigned int i = 0; i < worklist.size(); ++i ) {
Elf_Xword segment_memory = 0;
Elf_Xword segment_filesize = 0;
Elf_Xword seg_start_pos = current_file_pos;
segment* seg = worklist[i];
// Special case: PHDR segment
// This segment contains the program headers but no sections
if ( seg->get_type() == PT_PHDR && seg->get_sections_num() == 0 ) {
seg_start_pos = header->get_segments_offset();
segment_memory = segment_filesize =
header->get_segment_entry_size() * header->get_segments_num();
}
// Special case:
// Segments which start with the NULL section and have further sections
else if ( seg->get_sections_num() > 1
&& sections[seg->get_section_index_at( 0 )]->get_type() == SHT_NULL ) {
seg_start_pos = 0;
if ( seg->get_sections_num() ) {
segment_memory = segment_filesize = current_file_pos;
}
}
// New segments with not generated sections
// have to be aligned
else if ( seg->get_sections_num()
&& !section_generated[seg->get_section_index_at( 0 )] ) {
Elf_Xword align = seg->get_align() > 0 ? seg->get_align() : 1;
Elf64_Off cur_page_alignment = current_file_pos % align;
Elf64_Off req_page_alignment = seg->get_virtual_address() % align;
Elf64_Off error = req_page_alignment - cur_page_alignment;
current_file_pos += ( seg->get_align() + error ) % align;
seg_start_pos = current_file_pos;
}
else if ( seg->get_sections_num() ) {
seg_start_pos = sections[seg->get_section_index_at( 0 )]->get_offset();
}
// Write segment's data
for ( unsigned int j = 0; j < seg->get_sections_num(); ++j ) {
Elf_Half index = seg->get_section_index_at( j );
section* sec = sections[ index ];
// The NULL section is always generated
if ( SHT_NULL == sec->get_type()) {
section_generated[index] = true;
continue;
}
Elf_Xword secAlign = 0;
// Fix up the alignment
if ( !section_generated[index] && sec->is_address_initialized()
&& SHT_NOBITS != sec->get_type()
&& SHT_NULL != sec->get_type()
&& 0 != sec->get_size() ) {
// Align the sections based on the virtual addresses
// when possible (this is what matters for execution)
Elf64_Off req_offset = sec->get_address() - seg->get_virtual_address();
Elf64_Off cur_offset = current_file_pos - seg_start_pos;
if ( req_offset < cur_offset) {
// something has gone awfully wrong, abort!
// secAlign would turn out negative, seeking backwards and overwriting previous data
return false;
}
secAlign = req_offset - cur_offset;
}
else if (!section_generated[index] && !sec->is_address_initialized() ) {
// If no address has been specified then only the section
// alignment constraint has to be matched
Elf_Xword align = sec->get_addr_align();
if (align == 0) {
align = 1;
}
Elf64_Off error = current_file_pos % align;
secAlign = ( align - error ) % align;
}
else if (section_generated[index] ) {
// Alignment for already generated sections
secAlign = sec->get_offset() - seg_start_pos - segment_filesize;
}
// Determine the segment file and memory sizes
// Special case .tbss section (NOBITS) in non TLS segment
if ( (sec->get_flags() & SHF_ALLOC)
&& !( (sec->get_flags() & SHF_TLS) && (seg->get_type() != PT_TLS)
&& ( SHT_NOBITS == sec->get_type())) )
segment_memory += sec->get_size() + secAlign;
if ( SHT_NOBITS != sec->get_type() && SHT_NULL != sec->get_type() )
segment_filesize += sec->get_size() + secAlign;
// Nothing to be done when generating nested segments
if(section_generated[index]) {
continue;
}
current_file_pos += secAlign;
// Set the section addresses when missing
if ( !sec->is_address_initialized() )
sec->set_address( seg->get_virtual_address()
+ current_file_pos - seg_start_pos);
if ( 0 != sec->get_index() )
sec->set_offset(current_file_pos);
if ( SHT_NOBITS != sec->get_type() && SHT_NULL != sec->get_type() )
current_file_pos += sec->get_size();
section_generated[index] = true;
}
seg->set_file_size( segment_filesize );
// If we already have a memory size from loading an elf file (value > 0),
// it must not shrink!
// Memory size may be bigger than file size and it is the loader's job to do something
// with the surplus bytes in memory, like initializing them with a defined value.
if ( seg->get_memory_size() < segment_memory ) {
seg->set_memory_size( segment_memory );
}
seg->set_offset(seg_start_pos);
}
return true;
}
//------------------------------------------------------------------------------
bool layout_section_table()
{
// Simply place the section table at the end for now
Elf64_Off alignmentError = current_file_pos % 4;
current_file_pos += ( 4 - alignmentError ) % 4;
header->set_sections_offset(current_file_pos);
return true;
}
//------------------------------------------------------------------------------
public:
friend class Sections;
class Sections {
public:
//------------------------------------------------------------------------------
Sections( elfio* parent_ ) :
parent( parent_ )
{
}
//------------------------------------------------------------------------------
Elf_Half size() const
{
return (Elf_Half)parent->sections_.size();
}
//------------------------------------------------------------------------------
section* operator[]( unsigned int index ) const
{
section* sec = 0;
if ( index < parent->sections_.size() ) {
sec = parent->sections_[index];
}
return sec;
}
//------------------------------------------------------------------------------
section* operator[]( const std::string& name ) const
{
section* sec = 0;
std::vector<section*>::const_iterator it;
for ( it = parent->sections_.begin();
it != parent->sections_.end();
++it ) {
if ( (*it)->get_name() == name ) {
sec = *it;
break;
}
}
return sec;
}
//------------------------------------------------------------------------------
section* add( const std::string& name )
{
section* new_section = parent->create_section();
new_section->set_name( name );
Elf_Half str_index = parent->get_section_name_str_index();
section* string_table( parent->sections_[str_index] );
string_section_accessor str_writer( string_table );
Elf_Word pos = str_writer.add_string( name );
new_section->set_name_string_offset( pos );
return new_section;
}
//------------------------------------------------------------------------------
std::vector<section*>::iterator begin() {
return parent->sections_.begin();
}
//------------------------------------------------------------------------------
std::vector<section*>::iterator end() {
return parent->sections_.end();
}
//------------------------------------------------------------------------------
std::vector<section*>::const_iterator begin() const {
return parent->sections_.cbegin();
}
//------------------------------------------------------------------------------
std::vector<section*>::const_iterator end() const {
return parent->sections_.cend();
}
//------------------------------------------------------------------------------
private:
elfio* parent;
} sections;
//------------------------------------------------------------------------------
public:
friend class Segments;
class Segments {
public:
//------------------------------------------------------------------------------
Segments( elfio* parent_ ) :
parent( parent_ )
{
}
//------------------------------------------------------------------------------
Elf_Half size() const
{
return (Elf_Half)parent->segments_.size();
}
//------------------------------------------------------------------------------
segment* operator[]( unsigned int index ) const
{
return parent->segments_[index];
}
//------------------------------------------------------------------------------
segment* add()
{
return parent->create_segment();
}
//------------------------------------------------------------------------------
std::vector<segment*>::iterator begin() {
return parent->segments_.begin();
}
//------------------------------------------------------------------------------
std::vector<segment*>::iterator end() {
return parent->segments_.end();
}
//------------------------------------------------------------------------------
std::vector<segment*>::const_iterator begin() const {
return parent->segments_.cbegin();
}
//------------------------------------------------------------------------------
std::vector<segment*>::const_iterator end() const {
return parent->segments_.cend();
}
//------------------------------------------------------------------------------
private:
elfio* parent;
} segments;
//------------------------------------------------------------------------------
private:
elf_header* header;
std::vector<section*> sections_;
std::vector<segment*> segments_;
endianess_convertor convertor;
Elf_Xword current_file_pos;
};
} // namespace ELFIO
#include <elfio/elfio_symbols.hpp>
#include <elfio/elfio_note.hpp>
#include <elfio/elfio_relocation.hpp>
#include <elfio/elfio_dynamic.hpp>
#ifdef _MSC_VER
#pragma warning ( pop )
#endif
#endif // ELFIO_HPP

View file

@ -1,976 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_DUMP_HPP
#define ELFIO_DUMP_HPP
#include <algorithm>
#include <string>
#include <ostream>
#include <sstream>
#include <iomanip>
#include <elfio/elfio.hpp>
namespace ELFIO {
static struct class_table_t {
const char key;
const char* str;
} class_table [] =
{
{ ELFCLASS32, "ELF32" },
{ ELFCLASS64, "ELF64" },
};
static struct endian_table_t {
const char key;
const char* str;
} endian_table [] =
{
{ ELFDATANONE, "None" },
{ ELFDATA2LSB, "Little endian" },
{ ELFDATA2MSB, "Big endian" },
};
static struct version_table_t {
const Elf64_Word key;
const char* str;
} version_table [] =
{
{ EV_NONE , "None" },
{ EV_CURRENT, "Current" },
};
static struct type_table_t {
const Elf32_Half key;
const char* str;
} type_table [] =
{
{ ET_NONE, "No file type" },
{ ET_REL , "Relocatable file" },
{ ET_EXEC, "Executable file" },
{ ET_DYN , "Shared object file" },
{ ET_CORE, "Core file" },
};
static struct machine_table_t {
const Elf64_Half key;
const char* str;
} machine_table [] =
{
{ EM_NONE , "No machine" },
{ EM_M32 , "AT&T WE 32100" },
{ EM_SPARC , "SUN SPARC" },
{ EM_386 , "Intel 80386" },
{ EM_68K , "Motorola m68k family" },
{ EM_88K , "Motorola m88k family" },
{ EM_486 , "Intel 80486// Reserved for future use" },
{ EM_860 , "Intel 80860" },
{ EM_MIPS , "MIPS R3000 (officially, big-endian only)" },
{ EM_S370 , "IBM System/370" },
{ EM_MIPS_RS3_LE , "MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated" },
{ EM_res011 , "Reserved" },
{ EM_res012 , "Reserved" },
{ EM_res013 , "Reserved" },
{ EM_res014 , "Reserved" },
{ EM_PARISC , "HPPA" },
{ EM_res016 , "Reserved" },
{ EM_VPP550 , "Fujitsu VPP500" },
{ EM_SPARC32PLUS , "Sun's v8plus" },
{ EM_960 , "Intel 80960" },
{ EM_PPC , "PowerPC" },
{ EM_PPC64 , "64-bit PowerPC" },
{ EM_S390 , "IBM S/390" },
{ EM_SPU , "Sony/Toshiba/IBM SPU" },
{ EM_res024 , "Reserved" },
{ EM_res025 , "Reserved" },
{ EM_res026 , "Reserved" },
{ EM_res027 , "Reserved" },
{ EM_res028 , "Reserved" },
{ EM_res029 , "Reserved" },
{ EM_res030 , "Reserved" },
{ EM_res031 , "Reserved" },
{ EM_res032 , "Reserved" },
{ EM_res033 , "Reserved" },
{ EM_res034 , "Reserved" },
{ EM_res035 , "Reserved" },
{ EM_V800 , "NEC V800 series" },
{ EM_FR20 , "Fujitsu FR20" },
{ EM_RH32 , "TRW RH32" },
{ EM_MCORE , "Motorola M*Core // May also be taken by Fujitsu MMA" },
{ EM_RCE , "Old name for MCore" },
{ EM_ARM , "ARM" },
{ EM_OLD_ALPHA , "Digital Alpha" },
{ EM_SH , "Renesas (formerly Hitachi) / SuperH SH" },
{ EM_SPARCV9 , "SPARC v9 64-bit" },
{ EM_TRICORE , "Siemens Tricore embedded processor" },
{ EM_ARC , "ARC Cores" },
{ EM_H8_300 , "Renesas (formerly Hitachi) H8/300" },
{ EM_H8_300H , "Renesas (formerly Hitachi) H8/300H" },
{ EM_H8S , "Renesas (formerly Hitachi) H8S" },
{ EM_H8_500 , "Renesas (formerly Hitachi) H8/500" },
{ EM_IA_64 , "Intel IA-64 Processor" },
{ EM_MIPS_X , "Stanford MIPS-X" },
{ EM_COLDFIRE , "Motorola Coldfire" },
{ EM_68HC12 , "Motorola M68HC12" },
{ EM_MMA , "Fujitsu Multimedia Accelerator" },
{ EM_PCP , "Siemens PCP" },
{ EM_NCPU , "Sony nCPU embedded RISC processor" },
{ EM_NDR1 , "Denso NDR1 microprocesspr" },
{ EM_STARCORE , "Motorola Star*Core processor" },
{ EM_ME16 , "Toyota ME16 processor" },
{ EM_ST100 , "STMicroelectronics ST100 processor" },
{ EM_TINYJ , "Advanced Logic Corp. TinyJ embedded processor" },
{ EM_X86_64 , "Advanced Micro Devices X86-64 processor" },
{ EM_PDSP , "Sony DSP Processor" },
{ EM_PDP10 , "Digital Equipment Corp. PDP-10" },
{ EM_PDP11 , "Digital Equipment Corp. PDP-11" },
{ EM_FX66 , "Siemens FX66 microcontroller" },
{ EM_ST9PLUS , "STMicroelectronics ST9+ 8/16 bit microcontroller" },
{ EM_ST7 , "STMicroelectronics ST7 8-bit microcontroller" },
{ EM_68HC16 , "Motorola MC68HC16 Microcontroller" },
{ EM_68HC11 , "Motorola MC68HC11 Microcontroller" },
{ EM_68HC08 , "Motorola MC68HC08 Microcontroller" },
{ EM_68HC05 , "Motorola MC68HC05 Microcontroller" },
{ EM_SVX , "Silicon Graphics SVx" },
{ EM_ST19 , "STMicroelectronics ST19 8-bit cpu" },
{ EM_VAX , "Digital VAX" },
{ EM_CRIS , "Axis Communications 32-bit embedded processor" },
{ EM_JAVELIN , "Infineon Technologies 32-bit embedded cpu" },
{ EM_FIREPATH , "Element 14 64-bit DSP processor" },
{ EM_ZSP , "LSI Logic's 16-bit DSP processor" },
{ EM_MMIX , "Donald Knuth's educational 64-bit processor" },
{ EM_HUANY , "Harvard's machine-independent format" },
{ EM_PRISM , "SiTera Prism" },
{ EM_AVR , "Atmel AVR 8-bit microcontroller" },
{ EM_FR30 , "Fujitsu FR30" },
{ EM_D10V , "Mitsubishi D10V" },
{ EM_D30V , "Mitsubishi D30V" },
{ EM_V850 , "NEC v850" },
{ EM_M32R , "Renesas M32R (formerly Mitsubishi M32R)" },
{ EM_MN10300 , "Matsushita MN10300" },
{ EM_MN10200 , "Matsushita MN10200" },
{ EM_PJ , "picoJava" },
{ EM_OPENRISC , "OpenRISC 32-bit embedded processor" },
{ EM_ARC_A5 , "ARC Cores Tangent-A5" },
{ EM_XTENSA , "Tensilica Xtensa Architecture" },
{ EM_VIDEOCORE , "Alphamosaic VideoCore processor" },
{ EM_TMM_GPP , "Thompson Multimedia General Purpose Processor" },
{ EM_NS32K , "National Semiconductor 32000 series" },
{ EM_TPC , "Tenor Network TPC processor" },
{ EM_SNP1K , "Trebia SNP 1000 processor" },
{ EM_ST200 , "STMicroelectronics ST200 microcontroller" },
{ EM_IP2K , "Ubicom IP2022 micro controller" },
{ EM_MAX , "MAX Processor" },
{ EM_CR , "National Semiconductor CompactRISC" },
{ EM_F2MC16 , "Fujitsu F2MC16" },
{ EM_MSP430 , "TI msp430 micro controller" },
{ EM_BLACKFIN , "ADI Blackfin" },
{ EM_SE_C33 , "S1C33 Family of Seiko Epson processors" },
{ EM_SEP , "Sharp embedded microprocessor" },
{ EM_ARCA , "Arca RISC Microprocessor" },
{ EM_UNICORE , "Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University" },
{ EM_EXCESS , "eXcess: 16/32/64-bit configurable embedded CPU" },
{ EM_DXP , "Icera Semiconductor Inc. Deep Execution Processor" },
{ EM_ALTERA_NIOS2 , "Altera Nios II soft-core processor" },
{ EM_CRX , "National Semiconductor CRX" },
{ EM_XGATE , "Motorola XGATE embedded processor" },
{ EM_C166 , "Infineon C16x/XC16x processor" },
{ EM_M16C , "Renesas M16C series microprocessors" },
{ EM_DSPIC30F , "Microchip Technology dsPIC30F Digital Signal Controller" },
{ EM_CE , "Freescale Communication Engine RISC core" },
{ EM_M32C , "Renesas M32C series microprocessors" },
{ EM_res121 , "Reserved" },
{ EM_res122 , "Reserved" },
{ EM_res123 , "Reserved" },
{ EM_res124 , "Reserved" },
{ EM_res125 , "Reserved" },
{ EM_res126 , "Reserved" },
{ EM_res127 , "Reserved" },
{ EM_res128 , "Reserved" },
{ EM_res129 , "Reserved" },
{ EM_res130 , "Reserved" },
{ EM_TSK3000 , "Altium TSK3000 core" },
{ EM_RS08 , "Freescale RS08 embedded processor" },
{ EM_res133 , "Reserved" },
{ EM_ECOG2 , "Cyan Technology eCOG2 microprocessor" },
{ EM_SCORE , "Sunplus Score" },
{ EM_SCORE7 , "Sunplus S+core7 RISC processor" },
{ EM_DSP24 , "New Japan Radio (NJR) 24-bit DSP Processor" },
{ EM_VIDEOCORE3 , "Broadcom VideoCore III processor" },
{ EM_LATTICEMICO32, "RISC processor for Lattice FPGA architecture" },
{ EM_SE_C17 , "Seiko Epson C17 family" },
{ EM_TI_C6000 , "Texas Instruments TMS320C6000 DSP family" },
{ EM_TI_C2000 , "Texas Instruments TMS320C2000 DSP family" },
{ EM_TI_C5500 , "Texas Instruments TMS320C55x DSP family" },
{ EM_res143 , "Reserved" },
{ EM_res144 , "Reserved" },
{ EM_res145 , "Reserved" },
{ EM_res146 , "Reserved" },
{ EM_res147 , "Reserved" },
{ EM_res148 , "Reserved" },
{ EM_res149 , "Reserved" },
{ EM_res150 , "Reserved" },
{ EM_res151 , "Reserved" },
{ EM_res152 , "Reserved" },
{ EM_res153 , "Reserved" },
{ EM_res154 , "Reserved" },
{ EM_res155 , "Reserved" },
{ EM_res156 , "Reserved" },
{ EM_res157 , "Reserved" },
{ EM_res158 , "Reserved" },
{ EM_res159 , "Reserved" },
{ EM_MMDSP_PLUS , "STMicroelectronics 64bit VLIW Data Signal Processor" },
{ EM_CYPRESS_M8C , "Cypress M8C microprocessor" },
{ EM_R32C , "Renesas R32C series microprocessors" },
{ EM_TRIMEDIA , "NXP Semiconductors TriMedia architecture family" },
{ EM_QDSP6 , "QUALCOMM DSP6 Processor" },
{ EM_8051 , "Intel 8051 and variants" },
{ EM_STXP7X , "STMicroelectronics STxP7x family" },
{ EM_NDS32 , "Andes Technology compact code size embedded RISC processor family" },
{ EM_ECOG1 , "Cyan Technology eCOG1X family" },
{ EM_ECOG1X , "Cyan Technology eCOG1X family" },
{ EM_MAXQ30 , "Dallas Semiconductor MAXQ30 Core Micro-controllers" },
{ EM_XIMO16 , "New Japan Radio (NJR) 16-bit DSP Processor" },
{ EM_MANIK , "M2000 Reconfigurable RISC Microprocessor" },
{ EM_CRAYNV2 , "Cray Inc. NV2 vector architecture" },
{ EM_RX , "Renesas RX family" },
{ EM_METAG , "Imagination Technologies META processor architecture" },
{ EM_MCST_ELBRUS , "MCST Elbrus general purpose hardware architecture" },
{ EM_ECOG16 , "Cyan Technology eCOG16 family" },
{ EM_CR16 , "National Semiconductor CompactRISC 16-bit processor" },
{ EM_ETPU , "Freescale Extended Time Processing Unit" },
{ EM_SLE9X , "Infineon Technologies SLE9X core" },
{ EM_L1OM , "Intel L1OM" },
{ EM_INTEL181 , "Reserved by Intel" },
{ EM_INTEL182 , "Reserved by Intel" },
{ EM_res183 , "Reserved by ARM" },
{ EM_res184 , "Reserved by ARM" },
{ EM_AVR32 , "Atmel Corporation 32-bit microprocessor family" },
{ EM_STM8 , "STMicroeletronics STM8 8-bit microcontroller" },
{ EM_TILE64 , "Tilera TILE64 multicore architecture family" },
{ EM_TILEPRO , "Tilera TILEPro multicore architecture family" },
{ EM_MICROBLAZE , "Xilinx MicroBlaze 32-bit RISC soft processor core" },
{ EM_CUDA , "NVIDIA CUDA architecture " },
};
static struct section_type_table_t {
const Elf64_Half key;
const char* str;
} section_type_table [] =
{
{ SHT_NULL , "NULL" },
{ SHT_PROGBITS , "PROGBITS" },
{ SHT_SYMTAB , "SYMTAB" },
{ SHT_STRTAB , "STRTAB" },
{ SHT_RELA , "RELA" },
{ SHT_HASH , "HASH" },
{ SHT_DYNAMIC , "DYNAMIC" },
{ SHT_NOTE , "NOTE" },
{ SHT_NOBITS , "NOBITS" },
{ SHT_REL , "REL" },
{ SHT_SHLIB , "SHLIB" },
{ SHT_DYNSYM , "DYNSYM" },
{ SHT_INIT_ARRAY , "INIT_ARRAY" },
{ SHT_FINI_ARRAY , "FINI_ARRAY" },
{ SHT_PREINIT_ARRAY, "PREINIT_ARRAY" },
{ SHT_GROUP , "GROUP" },
{ SHT_SYMTAB_SHNDX , "SYMTAB_SHNDX " },
};
static struct segment_type_table_t {
const Elf_Word key;
const char* str;
} segment_type_table [] =
{
{ PT_NULL , "NULL" },
{ PT_LOAD , "LOAD" },
{ PT_DYNAMIC, "DYNAMIC" },
{ PT_INTERP , "INTERP" },
{ PT_NOTE , "NOTE" },
{ PT_SHLIB , "SHLIB" },
{ PT_PHDR , "PHDR" },
{ PT_TLS , "TLS" },
};
static struct segment_flag_table_t {
const Elf_Word key;
const char* str;
} segment_flag_table [] =
{
{ 0, "" },
{ 1, "X" },
{ 2, "W" },
{ 3, "WX" },
{ 4, "R" },
{ 5, "RX" },
{ 6, "RW" },
{ 7, "RWX" },
};
static struct symbol_bind_t {
const Elf_Word key;
const char* str;
} symbol_bind_table [] =
{
{ STB_LOCAL , "LOCAL" },
{ STB_GLOBAL , "GLOBAL" },
{ STB_WEAK , "WEAK" },
{ STB_LOOS , "LOOS" },
{ STB_HIOS , "HIOS" },
{ STB_MULTIDEF, "MULTIDEF" },
{ STB_LOPROC , "LOPROC" },
{ STB_HIPROC , "HIPROC" },
};
static struct symbol_type_t {
const Elf_Word key;
const char* str;
} symbol_type_table [] =
{
{ STT_NOTYPE , "NOTYPE" },
{ STT_OBJECT , "OBJECT" },
{ STT_FUNC , "FUNC" },
{ STT_SECTION, "SECTION" },
{ STT_FILE , "FILE" },
{ STT_COMMON , "COMMON" },
{ STT_TLS , "TLS" },
{ STT_LOOS , "LOOS" },
{ STT_HIOS , "HIOS" },
{ STT_LOPROC , "LOPROC" },
{ STT_HIPROC , "HIPROC" },
};
static struct dynamic_tag_t {
const Elf_Word key;
const char* str;
} dynamic_tag_table [] =
{
{ DT_NULL , "NULL" },
{ DT_NEEDED , "NEEDED" },
{ DT_PLTRELSZ , "PLTRELSZ" },
{ DT_PLTGOT , "PLTGOT" },
{ DT_HASH , "HASH" },
{ DT_STRTAB , "STRTAB" },
{ DT_SYMTAB , "SYMTAB" },
{ DT_RELA , "RELA" },
{ DT_RELASZ , "RELASZ" },
{ DT_RELAENT , "RELAENT" },
{ DT_STRSZ , "STRSZ" },
{ DT_SYMENT , "SYMENT" },
{ DT_INIT , "INIT" },
{ DT_FINI , "FINI" },
{ DT_SONAME , "SONAME" },
{ DT_RPATH , "RPATH" },
{ DT_SYMBOLIC , "SYMBOLIC" },
{ DT_REL , "REL" },
{ DT_RELSZ , "RELSZ" },
{ DT_RELENT , "RELENT" },
{ DT_PLTREL , "PLTREL" },
{ DT_DEBUG , "DEBUG" },
{ DT_TEXTREL , "TEXTREL" },
{ DT_JMPREL , "JMPREL" },
{ DT_BIND_NOW , "BIND_NOW" },
{ DT_INIT_ARRAY , "INIT_ARRAY" },
{ DT_FINI_ARRAY , "FINI_ARRAY" },
{ DT_INIT_ARRAYSZ , "INIT_ARRAYSZ" },
{ DT_FINI_ARRAYSZ , "FINI_ARRAYSZ" },
{ DT_RUNPATH , "RUNPATH" },
{ DT_FLAGS , "FLAGS" },
{ DT_ENCODING , "ENCODING" },
{ DT_PREINIT_ARRAY , "PREINIT_ARRAY" },
{ DT_PREINIT_ARRAYSZ, "PREINIT_ARRAYSZ" },
{ DT_MAXPOSTAGS , "MAXPOSTAGS" },
};
static const ELFIO::Elf_Xword MAX_DATA_ENTRIES = 64;
//------------------------------------------------------------------------------
class dump
{
#define DUMP_DEC_FORMAT( width ) std::setw(width) << std::setfill( ' ' ) << \
std::dec << std::right
#define DUMP_HEX_FORMAT( width ) std::setw(width) << std::setfill( '0' ) << \
std::hex << std::right
#define DUMP_STR_FORMAT( width ) std::setw(width) << std::setfill( ' ' ) << \
std::hex << std::left
public:
//------------------------------------------------------------------------------
static void
header( std::ostream& out, const elfio& reader )
{
if (!reader.get_header_size())
{
return;
}
out << "ELF Header" << std::endl << std::endl
<< " Class: " << str_class( reader.get_class() ) << std::endl
<< " Encoding: " << str_endian( reader.get_encoding() ) << std::endl
<< " ELFVersion: " << str_version( reader.get_elf_version() ) << std::endl
<< " Type: " << str_type( reader.get_type() ) << std::endl
<< " Machine: " << str_machine( reader.get_machine() ) << std::endl
<< " Version: " << str_version( reader.get_version() ) << std::endl
<< " Entry: " << "0x" << std::hex << reader.get_entry() << std::endl
<< " Flags: " << "0x" << std::hex << reader.get_flags() << std::endl
<< std::endl;
}
//------------------------------------------------------------------------------
static void
section_headers( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.sections.size();
if ( n == 0 ) {
return;
}
out << "Section Headers:" << std::endl;
if ( reader.get_class() == ELFCLASS32 ) { // Output for 32-bit
out << "[ Nr ] Type Addr Size ES Flg Lk Inf Al Name" << std::endl;
}
else { // Output for 64-bit
out << "[ Nr ] Type Addr Size ES Flg" << std::endl
<< " Lk Inf Al Name" << std::endl;
}
for ( Elf_Half i = 0; i < n; ++i ) { // For all sections
section* sec = reader.sections[i];
section_header( out, i, sec, reader.get_class() );
}
out << "Key to Flags: W (write), A (alloc), X (execute)\n\n"
<< std::endl;
}
//------------------------------------------------------------------------------
static void
section_header( std::ostream& out, Elf_Half no, const section* sec,
unsigned char elf_class )
{
std::ios_base::fmtflags original_flags = out.flags();
if ( elf_class == ELFCLASS32 ) { // Output for 32-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_STR_FORMAT( 17 ) << str_section_type( sec->get_type() ) << " "
<< DUMP_HEX_FORMAT( 8 ) << sec->get_address() << " "
<< DUMP_HEX_FORMAT( 8 ) << sec->get_size() << " "
<< DUMP_HEX_FORMAT( 2 ) << sec->get_entry_size() << " "
<< DUMP_STR_FORMAT( 3 ) << section_flags( sec->get_flags() ) << " "
<< DUMP_HEX_FORMAT( 2 ) << sec->get_link() << " "
<< DUMP_HEX_FORMAT( 3 ) << sec->get_info() << " "
<< DUMP_HEX_FORMAT( 2 ) << sec->get_addr_align() << " "
<< DUMP_STR_FORMAT( 17 ) << sec->get_name() << " "
<< std::endl;
}
else { // Output for 64-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_STR_FORMAT( 17 ) << str_section_type( sec->get_type() ) << " "
<< DUMP_HEX_FORMAT( 16 ) << sec->get_address() << " "
<< DUMP_HEX_FORMAT( 16 ) << sec->get_size() << " "
<< DUMP_HEX_FORMAT( 4 ) << sec->get_entry_size() << " "
<< DUMP_STR_FORMAT( 3 ) << section_flags( sec->get_flags() ) << " "
<< std::endl
<< " "
<< DUMP_HEX_FORMAT( 4 ) << sec->get_link() << " "
<< DUMP_HEX_FORMAT( 4 ) << sec->get_info() << " "
<< DUMP_HEX_FORMAT( 4 ) << sec->get_addr_align() << " "
<< DUMP_STR_FORMAT( 17 ) << sec->get_name() << " "
<< std::endl;
}
out.flags(original_flags);
return;
}
//------------------------------------------------------------------------------
static void
segment_headers( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.segments.size();
if ( n == 0 ) {
return;
}
out << "Segment headers:" << std::endl;
if ( reader.get_class() == ELFCLASS32 ) { // Output for 32-bit
out << "[ Nr ] Type VirtAddr PhysAddr FileSize Mem.Size Flags Align"
<< std::endl;
}
else { // Output for 64-bit
out << "[ Nr ] Type VirtAddr PhysAddr Flags" << std::endl
<< " FileSize Mem.Size Align"
<< std::endl;
}
for ( Elf_Half i = 0; i < n; ++i ) {
segment* seg = reader.segments[i];
segment_header( out, i, seg, reader.get_class() );
}
out << std::endl;
}
//------------------------------------------------------------------------------
static void
segment_header( std::ostream& out, Elf_Half no, const segment* seg,
unsigned int elf_class )
{
std::ios_base::fmtflags original_flags = out.flags();
if ( elf_class == ELFCLASS32 ) { // Output for 32-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_STR_FORMAT( 14 ) << str_segment_type( seg->get_type() ) << " "
<< DUMP_HEX_FORMAT( 8 ) << seg->get_virtual_address() << " "
<< DUMP_HEX_FORMAT( 8 ) << seg->get_physical_address() << " "
<< DUMP_HEX_FORMAT( 8 ) << seg->get_file_size() << " "
<< DUMP_HEX_FORMAT( 8 ) << seg->get_memory_size() << " "
<< DUMP_STR_FORMAT( 8 ) << str_segment_flag( seg->get_flags() ) << " "
<< DUMP_HEX_FORMAT( 8 ) << seg->get_align() << " "
<< std::endl;
}
else { // Output for 64-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_STR_FORMAT( 14 ) << str_segment_type( seg->get_type() ) << " "
<< DUMP_HEX_FORMAT( 16 ) << seg->get_virtual_address() << " "
<< DUMP_HEX_FORMAT( 16 ) << seg->get_physical_address() << " "
<< DUMP_STR_FORMAT( 16 ) << str_segment_flag( seg->get_flags() ) << " "
<< std::endl
<< " "
<< DUMP_HEX_FORMAT( 16 ) << seg->get_file_size() << " "
<< DUMP_HEX_FORMAT( 16 ) << seg->get_memory_size() << " "
<< DUMP_HEX_FORMAT( 16 ) << seg->get_align() << " "
<< std::endl;
}
out.flags(original_flags);
}
//------------------------------------------------------------------------------
static void
symbol_tables( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.sections.size();
for ( Elf_Half i = 0; i < n; ++i ) { // For all sections
section* sec = reader.sections[i];
if ( SHT_SYMTAB == sec->get_type() || SHT_DYNSYM == sec->get_type() ) {
symbol_section_accessor symbols( reader, sec );
Elf_Xword sym_no = symbols.get_symbols_num();
if ( sym_no > 0 ) {
out << "Symbol table (" << sec->get_name() << ")" << std::endl;
if ( reader.get_class() == ELFCLASS32 ) { // Output for 32-bit
out << "[ Nr ] Value Size Type Bind Sect Name"
<< std::endl;
}
else { // Output for 64-bit
out << "[ Nr ] Value Size Type Bind Sect" << std::endl
<< " Name"
<< std::endl;
}
for ( Elf_Half i = 0; i < sym_no; ++i ) {
std::string name;
Elf64_Addr value = 0;
Elf_Xword size = 0;
unsigned char bind = 0;
unsigned char type = 0;
Elf_Half section = 0;
unsigned char other = 0;
symbols.get_symbol( i, name, value, size, bind, type, section, other );
symbol_table( out, i, name, value, size, bind, type, section, reader.get_class() );
}
out << std::endl;
}
}
}
}
//------------------------------------------------------------------------------
static void
symbol_table( std::ostream& out,
Elf_Half no,
std::string& name,
Elf64_Addr value,
Elf_Xword size,
unsigned char bind,
unsigned char type,
Elf_Half section,
unsigned int elf_class )
{
std::ios_base::fmtflags original_flags = out.flags();
if ( elf_class == ELFCLASS32 ) { // Output for 32-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_HEX_FORMAT( 8 ) << value << " "
<< DUMP_HEX_FORMAT( 8 ) << size << " "
<< DUMP_STR_FORMAT( 7 ) << str_symbol_type( type ) << " "
<< DUMP_STR_FORMAT( 8 ) << str_symbol_bind( bind ) << " "
<< DUMP_DEC_FORMAT( 5 ) << section << " "
<< DUMP_STR_FORMAT( 1 ) << name << " "
<< std::endl;
}
else { // Output for 64-bit
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_HEX_FORMAT( 16 ) << value << " "
<< DUMP_HEX_FORMAT( 16 ) << size << " "
<< DUMP_STR_FORMAT( 7 ) << str_symbol_type( type ) << " "
<< DUMP_STR_FORMAT( 8 ) << str_symbol_bind( bind ) << " "
<< DUMP_DEC_FORMAT( 5 ) << section << " "
<< std::endl
<< " "
<< DUMP_STR_FORMAT( 1 ) << name << " "
<< std::endl;
}
out.flags(original_flags);
}
//------------------------------------------------------------------------------
static void
notes( std::ostream& out, const elfio& reader )
{
Elf_Half no = reader.sections.size();
for ( Elf_Half i = 0; i < no; ++i ) { // For all sections
section* sec = reader.sections[i];
if ( SHT_NOTE == sec->get_type() ) { // Look at notes
note_section_accessor notes( reader, sec );
int no_notes = notes.get_notes_num();
if ( no > 0 ) {
out << "Note section (" << sec->get_name() << ")" << std::endl
<< " No Type Name"
<< std::endl;
for ( int j = 0; j < no_notes; ++j ) { // For all notes
Elf_Word type;
std::string name;
void* desc;
Elf_Word descsz;
if ( notes.get_note(j, type, name, desc, descsz) ) {
// 'name' usually contains \0 at the end. Try to fix it
name = name.c_str();
note( out, j, type, name );
}
}
out << std::endl;
}
}
}
}
//------------------------------------------------------------------------------
static void
note( std::ostream& out,
int no,
Elf_Word type,
const std::string& name )
{
out << " ["
<< DUMP_DEC_FORMAT( 2 ) << no
<< "] "
<< DUMP_HEX_FORMAT( 8 ) << type << " "
<< DUMP_STR_FORMAT( 1 ) << name
<< std::endl;
}
//------------------------------------------------------------------------------
static void
dynamic_tags( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.sections.size();
for ( Elf_Half i = 0; i < n; ++i ) { // For all sections
section* sec = reader.sections[i];
if ( SHT_DYNAMIC == sec->get_type() ) {
dynamic_section_accessor dynamic( reader, sec );
Elf_Xword dyn_no = dynamic.get_entries_num();
if ( dyn_no > 0 ) {
out << "Dynamic section (" << sec->get_name() << ")" << std::endl;
out << "[ Nr ] Tag Name/Value" << std::endl;
for ( Elf_Xword i = 0; i < dyn_no; ++i ) {
Elf_Xword tag = 0;
Elf_Xword value = 0;
std::string str;
dynamic.get_entry( i, tag, value, str );
dynamic_tag( out, i, tag, value, str, reader.get_class() );
if ( DT_NULL == tag ) {
break;
}
}
out << std::endl;
}
}
}
}
//------------------------------------------------------------------------------
static void
dynamic_tag( std::ostream& out,
Elf_Xword no,
Elf_Xword tag,
Elf_Xword value,
std::string str,
unsigned int /*elf_class*/ )
{
out << "["
<< DUMP_DEC_FORMAT( 5 ) << no
<< "] "
<< DUMP_STR_FORMAT( 16 ) << str_dynamic_tag( tag ) << " ";
if ( str.empty() ) {
out << DUMP_HEX_FORMAT( 16 ) << value << " ";
}
else {
out << DUMP_STR_FORMAT( 32 ) << str << " ";
}
out << std::endl;
}
//------------------------------------------------------------------------------
static void
section_data( std::ostream& out, const section* sec )
{
std::ios_base::fmtflags original_flags = out.flags();
out << sec->get_name() << std::endl;
const char* pdata = sec->get_data();
if ( pdata ){
ELFIO::Elf_Xword i;
for ( i = 0; i < std::min( sec->get_size(), MAX_DATA_ENTRIES ); ++i ) {
if ( i % 16 == 0 ) {
out << "[" << DUMP_HEX_FORMAT( 8 ) << i << "]";
}
out << " " << DUMP_HEX_FORMAT( 2 ) << ( pdata[i] & 0x000000FF );
if ( i % 16 == 15 ) {
out << std::endl;
}
}
if ( i % 16 != 0 ) {
out << std::endl;
}
out.flags(original_flags);
}
return;
}
//------------------------------------------------------------------------------
static void
section_datas( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.sections.size();
if ( n == 0 ) {
return;
}
out << "Section Data:" << std::endl;
for ( Elf_Half i = 1; i < n; ++i ) { // For all sections
section* sec = reader.sections[i];
if ( sec->get_type() == SHT_NOBITS ) {
continue;
}
section_data( out, sec );
}
out << std::endl;
}
//------------------------------------------------------------------------------
static void
segment_data( std::ostream& out, Elf_Half no, const segment* seg )
{
std::ios_base::fmtflags original_flags = out.flags();
out << "Segment # " << no << std::endl;
const char* pdata = seg->get_data();
if ( pdata ) {
ELFIO::Elf_Xword i;
for ( i = 0; i < std::min( seg->get_file_size(), MAX_DATA_ENTRIES ); ++i ) {
if ( i % 16 == 0 ) {
out << "[" << DUMP_HEX_FORMAT( 8 ) << i << "]";
}
out << " " << DUMP_HEX_FORMAT( 2 ) << ( pdata[i] & 0x000000FF );
if ( i % 16 == 15 ) {
out << std::endl;
}
}
if ( i % 16 != 0 ) {
out << std::endl;
}
out.flags(original_flags);
}
return;
}
//------------------------------------------------------------------------------
static void
segment_datas( std::ostream& out, const elfio& reader )
{
Elf_Half n = reader.segments.size();
if ( n == 0 ) {
return;
}
out << "Segment Data:" << std::endl;
for ( Elf_Half i = 0; i < n; ++i ) { // For all sections
segment* seg = reader.segments[i];
segment_data( out, i, seg );
}
out << std::endl;
}
private:
//------------------------------------------------------------------------------
template< typename T, typename K >
std::string
static
find_value_in_table( const T& table, const K& key )
{
std::string res = "?";
for ( unsigned int i = 0; i < sizeof( table )/sizeof( table[0] ); ++i ) {
if ( table[i].key == key ) {
res = table[i].str;
break;
}
}
return res;
}
//------------------------------------------------------------------------------
template< typename T, typename K >
static
std::string
format_assoc( const T& table, const K& key )
{
std::string str = find_value_in_table( table, key );
if ( str == "?" ) {
std::ostringstream oss;
oss << str << " (0x" << std::hex << key << ")";
str = oss.str();
}
return str;
}
//------------------------------------------------------------------------------
template< typename T >
static
std::string
format_assoc( const T& table, const char key )
{
return format_assoc( table, (const int)key );
}
//------------------------------------------------------------------------------
static
std::string
section_flags( Elf_Xword flags )
{
std::string ret = "";
if ( flags & SHF_WRITE ) {
ret += "W";
}
if ( flags & SHF_ALLOC ) {
ret += "A";
}
if ( flags & SHF_EXECINSTR ) {
ret += "X";
}
return ret;
}
//------------------------------------------------------------------------------
#define STR_FUNC_TABLE( name ) \
template< typename T > \
static \
std::string \
str_##name( const T key ) \
{ \
return format_assoc( name##_table, key ); \
}
STR_FUNC_TABLE( class )
STR_FUNC_TABLE( endian )
STR_FUNC_TABLE( version )
STR_FUNC_TABLE( type )
STR_FUNC_TABLE( machine )
STR_FUNC_TABLE( section_type )
STR_FUNC_TABLE( segment_type )
STR_FUNC_TABLE( segment_flag )
STR_FUNC_TABLE( symbol_bind )
STR_FUNC_TABLE( symbol_type )
STR_FUNC_TABLE( dynamic_tag )
#undef STR_FUNC_TABLE
#undef DUMP_DEC_FORMAT
#undef DUMP_HEX_FORMAT
#undef DUMP_STR_FORMAT
}; // class dump
}; // namespace ELFIO
#endif // ELFIO_DUMP_HPP

View file

@ -1,257 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_DYNAMIC_HPP
#define ELFIO_DYNAMIC_HPP
namespace ELFIO {
//------------------------------------------------------------------------------
template< class S >
class dynamic_section_accessor_template
{
public:
//------------------------------------------------------------------------------
dynamic_section_accessor_template( const elfio& elf_file_, S* section_ ) :
elf_file( elf_file_ ),
dynamic_section( section_ )
{
}
//------------------------------------------------------------------------------
Elf_Xword
get_entries_num() const
{
Elf_Xword nRet = 0;
if ( 0 != dynamic_section->get_entry_size() ) {
nRet = dynamic_section->get_size() / dynamic_section->get_entry_size();
}
return nRet;
}
//------------------------------------------------------------------------------
bool
get_entry( Elf_Xword index,
Elf_Xword& tag,
Elf_Xword& value,
std::string& str ) const
{
if ( index >= get_entries_num() ) { // Is index valid
return false;
}
if ( elf_file.get_class() == ELFCLASS32 ) {
generic_get_entry_dyn< Elf32_Dyn >( index, tag, value );
}
else {
generic_get_entry_dyn< Elf64_Dyn >( index, tag, value );
}
// If the tag may have a string table reference, prepare the string
if ( tag == DT_NEEDED ||
tag == DT_SONAME ||
tag == DT_RPATH ||
tag == DT_RUNPATH ) {
string_section_accessor strsec =
elf_file.sections[ get_string_table_index() ];
const char* result = strsec.get_string( value );
if ( 0 == result ) {
str.clear();
return false;
}
str = result;
}
else {
str.clear();
}
return true;
}
//------------------------------------------------------------------------------
void
add_entry( Elf_Xword tag,
Elf_Xword value )
{
if ( elf_file.get_class() == ELFCLASS32 ) {
generic_add_entry< Elf32_Dyn >( tag, value );
}
else {
generic_add_entry< Elf64_Dyn >( tag, value );
}
}
//------------------------------------------------------------------------------
void
add_entry( Elf_Xword tag,
const std::string& str )
{
string_section_accessor strsec =
elf_file.sections[ get_string_table_index() ];
Elf_Xword value = strsec.add_string( str );
add_entry( tag, value );
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
Elf_Half
get_string_table_index() const
{
return (Elf_Half)dynamic_section->get_link();
}
//------------------------------------------------------------------------------
template< class T >
void
generic_get_entry_dyn( Elf_Xword index,
Elf_Xword& tag,
Elf_Xword& value ) const
{
const endianess_convertor& convertor = elf_file.get_convertor();
// Check unusual case when dynamic section has no data
if( dynamic_section->get_data() == 0 ||
( index + 1 ) * dynamic_section->get_entry_size() > dynamic_section->get_size() ) {
tag = DT_NULL;
value = 0;
return;
}
const T* pEntry = reinterpret_cast<const T*>(
dynamic_section->get_data() +
index * dynamic_section->get_entry_size() );
tag = convertor( pEntry->d_tag );
switch ( tag ) {
case DT_NULL:
case DT_SYMBOLIC:
case DT_TEXTREL:
case DT_BIND_NOW:
value = 0;
break;
case DT_NEEDED:
case DT_PLTRELSZ:
case DT_RELASZ:
case DT_RELAENT:
case DT_STRSZ:
case DT_SYMENT:
case DT_SONAME:
case DT_RPATH:
case DT_RELSZ:
case DT_RELENT:
case DT_PLTREL:
case DT_INIT_ARRAYSZ:
case DT_FINI_ARRAYSZ:
case DT_RUNPATH:
case DT_FLAGS:
case DT_PREINIT_ARRAYSZ:
value = convertor( pEntry->d_un.d_val );
break;
case DT_PLTGOT:
case DT_HASH:
case DT_STRTAB:
case DT_SYMTAB:
case DT_RELA:
case DT_INIT:
case DT_FINI:
case DT_REL:
case DT_DEBUG:
case DT_JMPREL:
case DT_INIT_ARRAY:
case DT_FINI_ARRAY:
case DT_PREINIT_ARRAY:
default:
value = convertor( pEntry->d_un.d_ptr );
break;
}
}
//------------------------------------------------------------------------------
template< class T >
void
generic_add_entry( Elf_Xword tag, Elf_Xword value )
{
const endianess_convertor& convertor = elf_file.get_convertor();
T entry;
switch ( tag ) {
case DT_NULL:
case DT_SYMBOLIC:
case DT_TEXTREL:
case DT_BIND_NOW:
value = 0;
case DT_NEEDED:
case DT_PLTRELSZ:
case DT_RELASZ:
case DT_RELAENT:
case DT_STRSZ:
case DT_SYMENT:
case DT_SONAME:
case DT_RPATH:
case DT_RELSZ:
case DT_RELENT:
case DT_PLTREL:
case DT_INIT_ARRAYSZ:
case DT_FINI_ARRAYSZ:
case DT_RUNPATH:
case DT_FLAGS:
case DT_PREINIT_ARRAYSZ:
entry.d_un.d_val = convertor( value );
break;
case DT_PLTGOT:
case DT_HASH:
case DT_STRTAB:
case DT_SYMTAB:
case DT_RELA:
case DT_INIT:
case DT_FINI:
case DT_REL:
case DT_DEBUG:
case DT_JMPREL:
case DT_INIT_ARRAY:
case DT_FINI_ARRAY:
case DT_PREINIT_ARRAY:
default:
entry.d_un.d_ptr = convertor( value );
break;
}
entry.d_tag = convertor( tag );
dynamic_section->append_data( reinterpret_cast<char*>( &entry ), sizeof( entry ) );
}
//------------------------------------------------------------------------------
private:
const elfio& elf_file;
S* dynamic_section;
};
using dynamic_section_accessor = dynamic_section_accessor_template<section>;
using const_dynamic_section_accessor = dynamic_section_accessor_template<const section>;
} // namespace ELFIO
#endif // ELFIO_DYNAMIC_HPP

View file

@ -1,145 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELF_HEADER_HPP
#define ELF_HEADER_HPP
#include <iostream>
namespace ELFIO {
class elf_header
{
public:
virtual ~elf_header() {};
virtual bool load( std::istream& stream ) = 0;
virtual bool save( std::ostream& stream ) const = 0;
// ELF header functions
ELFIO_GET_ACCESS_DECL( unsigned char, class );
ELFIO_GET_ACCESS_DECL( unsigned char, elf_version );
ELFIO_GET_ACCESS_DECL( unsigned char, encoding );
ELFIO_GET_ACCESS_DECL( Elf_Half, header_size );
ELFIO_GET_ACCESS_DECL( Elf_Half, section_entry_size );
ELFIO_GET_ACCESS_DECL( Elf_Half, segment_entry_size );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, version );
ELFIO_GET_SET_ACCESS_DECL( unsigned char, os_abi );
ELFIO_GET_SET_ACCESS_DECL( unsigned char, abi_version );
ELFIO_GET_SET_ACCESS_DECL( Elf_Half, type );
ELFIO_GET_SET_ACCESS_DECL( Elf_Half, machine );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, flags );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Addr, entry );
ELFIO_GET_SET_ACCESS_DECL( Elf_Half, sections_num );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Off, sections_offset );
ELFIO_GET_SET_ACCESS_DECL( Elf_Half, segments_num );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Off, segments_offset );
ELFIO_GET_SET_ACCESS_DECL( Elf_Half, section_name_str_index );
};
template< class T > struct elf_header_impl_types;
template<> struct elf_header_impl_types<Elf32_Ehdr> {
typedef Elf32_Phdr Phdr_type;
typedef Elf32_Shdr Shdr_type;
static const unsigned char file_class = ELFCLASS32;
};
template<> struct elf_header_impl_types<Elf64_Ehdr> {
typedef Elf64_Phdr Phdr_type;
typedef Elf64_Shdr Shdr_type;
static const unsigned char file_class = ELFCLASS64;
};
template< class T > class elf_header_impl : public elf_header
{
public:
elf_header_impl( endianess_convertor* convertor_,
unsigned char encoding )
{
convertor = convertor_;
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ), '\0' );
header.e_ident[EI_MAG0] = ELFMAG0;
header.e_ident[EI_MAG1] = ELFMAG1;
header.e_ident[EI_MAG2] = ELFMAG2;
header.e_ident[EI_MAG3] = ELFMAG3;
header.e_ident[EI_CLASS] = elf_header_impl_types<T>::file_class;
header.e_ident[EI_DATA] = encoding;
header.e_ident[EI_VERSION] = EV_CURRENT;
header.e_version = (*convertor)( (Elf_Word)EV_CURRENT );
header.e_ehsize = ( sizeof( header ) );
header.e_ehsize = (*convertor)( header.e_ehsize );
header.e_shstrndx = (*convertor)( (Elf_Half)1 );
header.e_phentsize = sizeof( typename elf_header_impl_types<T>::Phdr_type );
header.e_shentsize = sizeof( typename elf_header_impl_types<T>::Shdr_type );
header.e_phentsize = (*convertor)( header.e_phentsize );
header.e_shentsize = (*convertor)( header.e_shentsize );
}
bool
load( std::istream& stream )
{
stream.seekg( 0 );
stream.read( reinterpret_cast<char*>( &header ), sizeof( header ) );
return (stream.gcount() == sizeof( header ) );
}
bool
save( std::ostream& stream ) const
{
stream.seekp( 0 );
stream.write( reinterpret_cast<const char*>( &header ), sizeof( header ) );
return stream.good();
}
// ELF header functions
ELFIO_GET_ACCESS( unsigned char, class, header.e_ident[EI_CLASS] );
ELFIO_GET_ACCESS( unsigned char, elf_version, header.e_ident[EI_VERSION] );
ELFIO_GET_ACCESS( unsigned char, encoding, header.e_ident[EI_DATA] );
ELFIO_GET_ACCESS( Elf_Half, header_size, header.e_ehsize );
ELFIO_GET_ACCESS( Elf_Half, section_entry_size, header.e_shentsize );
ELFIO_GET_ACCESS( Elf_Half, segment_entry_size, header.e_phentsize );
ELFIO_GET_SET_ACCESS( Elf_Word, version, header.e_version);
ELFIO_GET_SET_ACCESS( unsigned char, os_abi, header.e_ident[EI_OSABI] );
ELFIO_GET_SET_ACCESS( unsigned char, abi_version, header.e_ident[EI_ABIVERSION] );
ELFIO_GET_SET_ACCESS( Elf_Half, type, header.e_type );
ELFIO_GET_SET_ACCESS( Elf_Half, machine, header.e_machine );
ELFIO_GET_SET_ACCESS( Elf_Word, flags, header.e_flags );
ELFIO_GET_SET_ACCESS( Elf_Half, section_name_str_index, header.e_shstrndx );
ELFIO_GET_SET_ACCESS( Elf64_Addr, entry, header.e_entry );
ELFIO_GET_SET_ACCESS( Elf_Half, sections_num, header.e_shnum );
ELFIO_GET_SET_ACCESS( Elf64_Off, sections_offset, header.e_shoff );
ELFIO_GET_SET_ACCESS( Elf_Half, segments_num, header.e_phnum );
ELFIO_GET_SET_ACCESS( Elf64_Off, segments_offset, header.e_phoff );
private:
T header;
endianess_convertor* convertor;
};
} // namespace ELFIO
#endif // ELF_HEADER_HPP

View file

@ -1,170 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_NOTE_HPP
#define ELFIO_NOTE_HPP
namespace ELFIO {
//------------------------------------------------------------------------------
// There are discrepancies in documentations. SCO documentation
// (http://www.sco.com/developers/gabi/latest/ch5.pheader.html#note_section)
// requires 8 byte entries alignment for 64-bit ELF file,
// but Oracle's definition uses the same structure
// for 32-bit and 64-bit formats.
// (https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-18048.html)
//
// It looks like EM_X86_64 Linux implementation is similar to Oracle's
// definition. Therefore, the same alignment works for both formats
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
template< class S >
class note_section_accessor_template
{
public:
//------------------------------------------------------------------------------
note_section_accessor_template( const elfio& elf_file_, S* section_ ) :
elf_file( elf_file_ ), note_section( section_ )
{
process_section();
}
//------------------------------------------------------------------------------
Elf_Word
get_notes_num() const
{
return (Elf_Word)note_start_positions.size();
}
//------------------------------------------------------------------------------
bool
get_note( Elf_Word index,
Elf_Word& type,
std::string& name,
void*& desc,
Elf_Word& descSize ) const
{
if ( index >= note_section->get_size() ) {
return false;
}
const char* pData = note_section->get_data() + note_start_positions[index];
int align = sizeof( Elf_Word );
const endianess_convertor& convertor = elf_file.get_convertor();
type = convertor( *(const Elf_Word*)( pData + 2*align ) );
Elf_Word namesz = convertor( *(const Elf_Word*)( pData ) );
descSize = convertor( *(const Elf_Word*)( pData + sizeof( namesz ) ) );
Elf_Xword max_name_size = note_section->get_size() - note_start_positions[index];
if ( namesz > max_name_size ||
namesz + descSize > max_name_size ) {
return false;
}
name.assign( pData + 3*align, namesz - 1);
if ( 0 == descSize ) {
desc = 0;
}
else {
desc = const_cast<char*> ( pData + 3*align +
( ( namesz + align - 1 )/align )*align );
}
return true;
}
//------------------------------------------------------------------------------
void add_note( Elf_Word type,
const std::string& name,
const void* desc,
Elf_Word descSize )
{
const endianess_convertor& convertor = elf_file.get_convertor();
int align = sizeof( Elf_Word );
Elf_Word nameLen = (Elf_Word)name.size() + 1;
Elf_Word nameLenConv = convertor( nameLen );
std::string buffer( reinterpret_cast<char*>( &nameLenConv ), align );
Elf_Word descSizeConv = convertor( descSize );
buffer.append( reinterpret_cast<char*>( &descSizeConv ), align );
type = convertor( type );
buffer.append( reinterpret_cast<char*>( &type ), align );
buffer.append( name );
buffer.append( 1, '\x00' );
const char pad[] = { '\0', '\0', '\0', '\0' };
if ( nameLen % align != 0 ) {
buffer.append( pad, align - nameLen % align );
}
if ( desc != 0 && descSize != 0 ) {
buffer.append( reinterpret_cast<const char*>( desc ), descSize );
if ( descSize % align != 0 ) {
buffer.append( pad, align - descSize % align );
}
}
note_start_positions.push_back( note_section->get_size() );
note_section->append_data( buffer );
}
private:
//------------------------------------------------------------------------------
void process_section()
{
const endianess_convertor& convertor = elf_file.get_convertor();
const char* data = note_section->get_data();
Elf_Xword size = note_section->get_size();
Elf_Xword current = 0;
note_start_positions.clear();
// Is it empty?
if ( 0 == data || 0 == size ) {
return;
}
int align = sizeof( Elf_Word );
while ( current + 3*align <= size ) {
note_start_positions.push_back( current );
Elf_Word namesz = convertor(
*(const Elf_Word*)( data + current ) );
Elf_Word descsz = convertor(
*(const Elf_Word*)( data + current + sizeof( namesz ) ) );
current += 3*sizeof( Elf_Word ) +
( ( namesz + align - 1 ) / align ) * align +
( ( descsz + align - 1 ) / align ) * align;
}
}
//------------------------------------------------------------------------------
private:
const elfio& elf_file;
S* note_section;
std::vector<Elf_Xword> note_start_positions;
};
using note_section_accessor = note_section_accessor_template<section>;
using const_note_section_accessor = note_section_accessor_template<const section>;
} // namespace ELFIO
#endif // ELFIO_NOTE_HPP

View file

@ -1,373 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_RELOCATION_HPP
#define ELFIO_RELOCATION_HPP
namespace ELFIO {
template<typename T> struct get_sym_and_type;
template<> struct get_sym_and_type< Elf32_Rel >
{
static int get_r_sym( Elf_Xword info )
{
return ELF32_R_SYM( (Elf_Word)info );
}
static int get_r_type( Elf_Xword info )
{
return ELF32_R_TYPE( (Elf_Word)info );
}
};
template<> struct get_sym_and_type< Elf32_Rela >
{
static int get_r_sym( Elf_Xword info )
{
return ELF32_R_SYM( (Elf_Word)info );
}
static int get_r_type( Elf_Xword info )
{
return ELF32_R_TYPE( (Elf_Word)info );
}
};
template<> struct get_sym_and_type< Elf64_Rel >
{
static int get_r_sym( Elf_Xword info )
{
return ELF64_R_SYM( info );
}
static int get_r_type( Elf_Xword info )
{
return ELF64_R_TYPE( info );
}
};
template<> struct get_sym_and_type< Elf64_Rela >
{
static int get_r_sym( Elf_Xword info )
{
return ELF64_R_SYM( info );
}
static int get_r_type( Elf_Xword info )
{
return ELF64_R_TYPE( info );
}
};
//------------------------------------------------------------------------------
template< class S >
class relocation_section_accessor_template
{
public:
//------------------------------------------------------------------------------
relocation_section_accessor_template( const elfio& elf_file_, S* section_ ) :
elf_file( elf_file_ ),
relocation_section( section_ )
{
}
//------------------------------------------------------------------------------
Elf_Xword
get_entries_num() const
{
Elf_Xword nRet = 0;
if ( 0 != relocation_section->get_entry_size() ) {
nRet = relocation_section->get_size() / relocation_section->get_entry_size();
}
return nRet;
}
//------------------------------------------------------------------------------
bool
get_entry( Elf_Xword index,
Elf64_Addr& offset,
Elf_Word& symbol,
Elf_Word& type,
Elf_Sxword& addend ) const
{
if ( index >= get_entries_num() ) { // Is index valid
return false;
}
if ( elf_file.get_class() == ELFCLASS32 ) {
if ( SHT_REL == relocation_section->get_type() ) {
generic_get_entry_rel< Elf32_Rel >( index, offset, symbol,
type, addend );
}
else if ( SHT_RELA == relocation_section->get_type() ) {
generic_get_entry_rela< Elf32_Rela >( index, offset, symbol,
type, addend );
}
}
else {
if ( SHT_REL == relocation_section->get_type() ) {
generic_get_entry_rel< Elf64_Rel >( index, offset, symbol,
type, addend );
}
else if ( SHT_RELA == relocation_section->get_type() ) {
generic_get_entry_rela< Elf64_Rela >( index, offset, symbol,
type, addend );
}
}
return true;
}
//------------------------------------------------------------------------------
bool
get_entry( Elf_Xword index,
Elf64_Addr& offset,
Elf64_Addr& symbolValue,
std::string& symbolName,
Elf_Word& type,
Elf_Sxword& addend,
Elf_Sxword& calcValue ) const
{
// Do regular job
Elf_Word symbol;
bool ret = get_entry( index, offset, symbol, type, addend );
// Find the symbol
Elf_Xword size;
unsigned char bind;
unsigned char symbolType;
Elf_Half section;
unsigned char other;
symbol_section_accessor symbols( elf_file, elf_file.sections[get_symbol_table_index()] );
ret = ret && symbols.get_symbol( symbol, symbolName, symbolValue,
size, bind, symbolType, section, other );
if ( ret ) { // Was it successful?
switch ( type ) {
case R_386_NONE: // none
calcValue = 0;
break;
case R_386_32: // S + A
calcValue = symbolValue + addend;
break;
case R_386_PC32: // S + A - P
calcValue = symbolValue + addend - offset;
break;
case R_386_GOT32: // G + A - P
calcValue = 0;
break;
case R_386_PLT32: // L + A - P
calcValue = 0;
break;
case R_386_COPY: // none
calcValue = 0;
break;
case R_386_GLOB_DAT: // S
case R_386_JMP_SLOT: // S
calcValue = symbolValue;
break;
case R_386_RELATIVE: // B + A
calcValue = addend;
break;
case R_386_GOTOFF: // S + A - GOT
calcValue = 0;
break;
case R_386_GOTPC: // GOT + A - P
calcValue = 0;
break;
default: // Not recognized symbol!
calcValue = 0;
break;
}
}
return ret;
}
//------------------------------------------------------------------------------
void
add_entry( Elf64_Addr offset, Elf_Xword info )
{
if ( elf_file.get_class() == ELFCLASS32 ) {
generic_add_entry< Elf32_Rel >( offset, info );
}
else {
generic_add_entry< Elf64_Rel >( offset, info );
}
}
//------------------------------------------------------------------------------
void
add_entry( Elf64_Addr offset, Elf_Word symbol, unsigned char type )
{
Elf_Xword info;
if ( elf_file.get_class() == ELFCLASS32 ) {
info = ELF32_R_INFO( (Elf_Xword)symbol, type );
}
else {
info = ELF64_R_INFO((Elf_Xword)symbol, type );
}
add_entry( offset, info );
}
//------------------------------------------------------------------------------
void
add_entry( Elf64_Addr offset, Elf_Xword info, Elf_Sxword addend )
{
if ( elf_file.get_class() == ELFCLASS32 ) {
generic_add_entry< Elf32_Rela >( offset, info, addend );
}
else {
generic_add_entry< Elf64_Rela >( offset, info, addend );
}
}
//------------------------------------------------------------------------------
void
add_entry( Elf64_Addr offset, Elf_Word symbol, unsigned char type,
Elf_Sxword addend )
{
Elf_Xword info;
if ( elf_file.get_class() == ELFCLASS32 ) {
info = ELF32_R_INFO( (Elf_Xword)symbol, type );
}
else {
info = ELF64_R_INFO( (Elf_Xword)symbol, type );
}
add_entry( offset, info, addend );
}
//------------------------------------------------------------------------------
void
add_entry( string_section_accessor str_writer,
const char* str,
symbol_section_accessor sym_writer,
Elf64_Addr value,
Elf_Word size,
unsigned char sym_info,
unsigned char other,
Elf_Half shndx,
Elf64_Addr offset,
unsigned char type )
{
Elf_Word str_index = str_writer.add_string( str );
Elf_Word sym_index = sym_writer.add_symbol( str_index, value, size,
sym_info, other, shndx );
add_entry( offset, sym_index, type );
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
Elf_Half
get_symbol_table_index() const
{
return (Elf_Half)relocation_section->get_link();
}
//------------------------------------------------------------------------------
template< class T >
void
generic_get_entry_rel( Elf_Xword index,
Elf64_Addr& offset,
Elf_Word& symbol,
Elf_Word& type,
Elf_Sxword& addend ) const
{
const endianess_convertor& convertor = elf_file.get_convertor();
const T* pEntry = reinterpret_cast<const T*>(
relocation_section->get_data() +
index * relocation_section->get_entry_size() );
offset = convertor( pEntry->r_offset );
Elf_Xword tmp = convertor( pEntry->r_info );
symbol = get_sym_and_type<T>::get_r_sym( tmp );
type = get_sym_and_type<T>::get_r_type( tmp );
addend = 0;
}
//------------------------------------------------------------------------------
template< class T >
void
generic_get_entry_rela( Elf_Xword index,
Elf64_Addr& offset,
Elf_Word& symbol,
Elf_Word& type,
Elf_Sxword& addend ) const
{
const endianess_convertor& convertor = elf_file.get_convertor();
const T* pEntry = reinterpret_cast<const T*>(
relocation_section->get_data() +
index * relocation_section->get_entry_size() );
offset = convertor( pEntry->r_offset );
Elf_Xword tmp = convertor( pEntry->r_info );
symbol = get_sym_and_type<T>::get_r_sym( tmp );
type = get_sym_and_type<T>::get_r_type( tmp );
addend = convertor( pEntry->r_addend );
}
//------------------------------------------------------------------------------
template< class T >
void
generic_add_entry( Elf64_Addr offset, Elf_Xword info )
{
const endianess_convertor& convertor = elf_file.get_convertor();
T entry;
entry.r_offset = offset;
entry.r_info = info;
entry.r_offset = convertor( entry.r_offset );
entry.r_info = convertor( entry.r_info );
relocation_section->append_data( reinterpret_cast<char*>( &entry ), sizeof( entry ) );
}
//------------------------------------------------------------------------------
template< class T >
void
generic_add_entry( Elf64_Addr offset, Elf_Xword info, Elf_Sxword addend )
{
const endianess_convertor& convertor = elf_file.get_convertor();
T entry;
entry.r_offset = offset;
entry.r_info = info;
entry.r_addend = addend;
entry.r_offset = convertor( entry.r_offset );
entry.r_info = convertor( entry.r_info );
entry.r_addend = convertor( entry.r_addend );
relocation_section->append_data( reinterpret_cast<char*>( &entry ), sizeof( entry ) );
}
//------------------------------------------------------------------------------
private:
const elfio& elf_file;
S* relocation_section;
};
using relocation_section_accessor = relocation_section_accessor_template<section>;
using const_relocation_section_accessor = relocation_section_accessor_template<const section>;
} // namespace ELFIO
#endif // ELFIO_RELOCATION_HPP

View file

@ -1,314 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_SECTION_HPP
#define ELFIO_SECTION_HPP
#include <string>
#include <iostream>
namespace ELFIO {
class section
{
friend class elfio;
public:
virtual ~section() {};
ELFIO_GET_ACCESS_DECL ( Elf_Half, index );
ELFIO_GET_SET_ACCESS_DECL( std::string, name );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, type );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, flags );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, info );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, link );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, addr_align );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, entry_size );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Addr, address );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, size );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, name_string_offset );
ELFIO_GET_ACCESS_DECL ( Elf64_Off, offset );
size_t stream_size;
size_t get_stream_size() const
{
return stream_size;
}
void set_stream_size(size_t value)
{
stream_size = value;
}
virtual const char* get_data() const = 0;
virtual void set_data( const char* pData, Elf_Word size ) = 0;
virtual void set_data( const std::string& data ) = 0;
virtual void append_data( const char* pData, Elf_Word size ) = 0;
virtual void append_data( const std::string& data ) = 0;
protected:
ELFIO_SET_ACCESS_DECL( Elf64_Off, offset );
ELFIO_SET_ACCESS_DECL( Elf_Half, index );
virtual void load( std::istream& stream,
std::streampos header_offset ) = 0;
virtual void save( std::ostream& stream,
std::streampos header_offset,
std::streampos data_offset ) = 0;
virtual bool is_address_initialized() const = 0;
};
template< class T >
class section_impl : public section
{
public:
//------------------------------------------------------------------------------
section_impl( const endianess_convertor* convertor_ ) : convertor( convertor_ )
{
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ), '\0' );
is_address_set = false;
data = 0;
data_size = 0;
}
//------------------------------------------------------------------------------
~section_impl()
{
delete [] data;
}
//------------------------------------------------------------------------------
// Section info functions
ELFIO_GET_SET_ACCESS( Elf_Word, type, header.sh_type );
ELFIO_GET_SET_ACCESS( Elf_Xword, flags, header.sh_flags );
ELFIO_GET_SET_ACCESS( Elf_Xword, size, header.sh_size );
ELFIO_GET_SET_ACCESS( Elf_Word, link, header.sh_link );
ELFIO_GET_SET_ACCESS( Elf_Word, info, header.sh_info );
ELFIO_GET_SET_ACCESS( Elf_Xword, addr_align, header.sh_addralign );
ELFIO_GET_SET_ACCESS( Elf_Xword, entry_size, header.sh_entsize );
ELFIO_GET_SET_ACCESS( Elf_Word, name_string_offset, header.sh_name );
ELFIO_GET_ACCESS ( Elf64_Addr, address, header.sh_addr );
//------------------------------------------------------------------------------
Elf_Half
get_index() const
{
return index;
}
//------------------------------------------------------------------------------
std::string
get_name() const
{
return name;
}
//------------------------------------------------------------------------------
void
set_name( std::string name_ )
{
name = name_;
}
//------------------------------------------------------------------------------
void
set_address( Elf64_Addr value )
{
header.sh_addr = value;
header.sh_addr = (*convertor)( header.sh_addr );
is_address_set = true;
}
//------------------------------------------------------------------------------
bool
is_address_initialized() const
{
return is_address_set;
}
//------------------------------------------------------------------------------
const char*
get_data() const
{
return data;
}
//------------------------------------------------------------------------------
void
set_data( const char* raw_data, Elf_Word size )
{
if ( get_type() != SHT_NOBITS ) {
delete [] data;
try {
data = new char[size];
} catch (const std::bad_alloc&) {
data = 0;
data_size = 0;
size = 0;
}
if ( 0 != data && 0 != raw_data ) {
data_size = size;
std::copy( raw_data, raw_data + size, data );
}
}
set_size( size );
}
//------------------------------------------------------------------------------
void
set_data( const std::string& str_data )
{
return set_data( str_data.c_str(), (Elf_Word)str_data.size() );
}
//------------------------------------------------------------------------------
void
append_data( const char* raw_data, Elf_Word size )
{
if ( get_type() != SHT_NOBITS ) {
if ( get_size() + size < data_size ) {
std::copy( raw_data, raw_data + size, data + get_size() );
}
else {
data_size = 2*( data_size + size);
char* new_data;
try {
new_data = new char[data_size];
} catch (const std::bad_alloc&) {
new_data = 0;
size = 0;
}
if ( 0 != new_data ) {
std::copy( data, data + get_size(), new_data );
std::copy( raw_data, raw_data + size, new_data + get_size() );
delete [] data;
data = new_data;
}
}
set_size( get_size() + size );
}
}
//------------------------------------------------------------------------------
void
append_data( const std::string& str_data )
{
return append_data( str_data.c_str(), (Elf_Word)str_data.size() );
}
//------------------------------------------------------------------------------
protected:
//------------------------------------------------------------------------------
ELFIO_GET_SET_ACCESS( Elf64_Off, offset, header.sh_offset );
//------------------------------------------------------------------------------
void
set_index( Elf_Half value )
{
index = value;
}
//------------------------------------------------------------------------------
void
load( std::istream& stream,
std::streampos header_offset )
{
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ), '\0' );
stream.seekg ( 0, stream.end );
set_stream_size ( stream.tellg() );
stream.seekg( header_offset );
stream.read( reinterpret_cast<char*>( &header ), sizeof( header ) );
Elf_Xword size = get_size();
if ( 0 == data && SHT_NULL != get_type() && SHT_NOBITS != get_type() && size < get_stream_size()) {
try {
data = new char[size + 1];
} catch (const std::bad_alloc&) {
data = 0;
data_size = 0;
}
if ( ( 0 != size ) && ( 0 != data ) ) {
stream.seekg( (*convertor)( header.sh_offset ) );
stream.read( data, size );
data[size] = 0; // Ensure data is ended with 0 to avoid oob read
data_size = size;
}
}
}
//------------------------------------------------------------------------------
void
save( std::ostream& stream,
std::streampos header_offset,
std::streampos data_offset )
{
if ( 0 != get_index() ) {
header.sh_offset = data_offset;
header.sh_offset = (*convertor)( header.sh_offset );
}
save_header( stream, header_offset );
if ( get_type() != SHT_NOBITS && get_type() != SHT_NULL &&
get_size() != 0 && data != 0 ) {
save_data( stream, data_offset );
}
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
void
save_header( std::ostream& stream,
std::streampos header_offset ) const
{
stream.seekp( header_offset );
stream.write( reinterpret_cast<const char*>( &header ), sizeof( header ) );
}
//------------------------------------------------------------------------------
void
save_data( std::ostream& stream,
std::streampos data_offset ) const
{
stream.seekp( data_offset );
stream.write( get_data(), get_size() );
}
//------------------------------------------------------------------------------
private:
T header;
Elf_Half index;
std::string name;
char* data;
Elf_Word data_size;
const endianess_convertor* convertor;
bool is_address_set;
};
} // namespace ELFIO
#endif // ELFIO_SECTION_HPP

View file

@ -1,246 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_SEGMENT_HPP
#define ELFIO_SEGMENT_HPP
#include <iostream>
#include <vector>
namespace ELFIO {
class segment
{
friend class elfio;
public:
virtual ~segment() {};
ELFIO_GET_ACCESS_DECL ( Elf_Half, index );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, type );
ELFIO_GET_SET_ACCESS_DECL( Elf_Word, flags );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, align );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Addr, virtual_address );
ELFIO_GET_SET_ACCESS_DECL( Elf64_Addr, physical_address );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, file_size );
ELFIO_GET_SET_ACCESS_DECL( Elf_Xword, memory_size );
ELFIO_GET_ACCESS_DECL( Elf64_Off, offset );
virtual const char* get_data() const = 0;
virtual Elf_Half add_section_index( Elf_Half index, Elf_Xword addr_align ) = 0;
virtual Elf_Half get_sections_num() const = 0;
virtual Elf_Half get_section_index_at( Elf_Half num ) const = 0;
virtual bool is_offset_initialized() const = 0;
protected:
ELFIO_SET_ACCESS_DECL( Elf64_Off, offset );
ELFIO_SET_ACCESS_DECL( Elf_Half, index );
virtual const std::vector<Elf_Half>& get_sections() const = 0;
virtual void load( std::istream& stream, std::streampos header_offset ) = 0;
virtual void save( std::ostream& stream, std::streampos header_offset,
std::streampos data_offset ) = 0;
};
//------------------------------------------------------------------------------
template< class T >
class segment_impl : public segment
{
public:
//------------------------------------------------------------------------------
segment_impl( endianess_convertor* convertor_ ) :
stream_size( 0 ), index( 0 ), data( 0 ), convertor( convertor_ )
{
is_offset_set = false;
std::fill_n( reinterpret_cast<char*>( &ph ), sizeof( ph ), '\0' );
}
//------------------------------------------------------------------------------
virtual ~segment_impl()
{
delete [] data;
}
//------------------------------------------------------------------------------
// Section info functions
ELFIO_GET_SET_ACCESS( Elf_Word, type, ph.p_type );
ELFIO_GET_SET_ACCESS( Elf_Word, flags, ph.p_flags );
ELFIO_GET_SET_ACCESS( Elf_Xword, align, ph.p_align );
ELFIO_GET_SET_ACCESS( Elf64_Addr, virtual_address, ph.p_vaddr );
ELFIO_GET_SET_ACCESS( Elf64_Addr, physical_address, ph.p_paddr );
ELFIO_GET_SET_ACCESS( Elf_Xword, file_size, ph.p_filesz );
ELFIO_GET_SET_ACCESS( Elf_Xword, memory_size, ph.p_memsz );
ELFIO_GET_ACCESS( Elf64_Off, offset, ph.p_offset );
size_t stream_size;
//------------------------------------------------------------------------------
size_t
get_stream_size() const
{
return stream_size;
}
//------------------------------------------------------------------------------
void
set_stream_size(size_t value)
{
stream_size = value;
}
//------------------------------------------------------------------------------
Elf_Half
get_index() const
{
return index;
}
//------------------------------------------------------------------------------
const char*
get_data() const
{
return data;
}
//------------------------------------------------------------------------------
Elf_Half
add_section_index( Elf_Half sec_index, Elf_Xword addr_align )
{
sections.push_back( sec_index );
if ( addr_align > get_align() ) {
set_align( addr_align );
}
return (Elf_Half)sections.size();
}
//------------------------------------------------------------------------------
Elf_Half
get_sections_num() const
{
return (Elf_Half)sections.size();
}
//------------------------------------------------------------------------------
Elf_Half
get_section_index_at( Elf_Half num ) const
{
if ( num < sections.size() ) {
return sections[num];
}
return Elf_Half(-1);
}
//------------------------------------------------------------------------------
protected:
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void
set_offset( Elf64_Off value )
{
ph.p_offset = value;
ph.p_offset = (*convertor)( ph.p_offset );
is_offset_set = true;
}
//------------------------------------------------------------------------------
bool
is_offset_initialized() const
{
return is_offset_set;
}
//------------------------------------------------------------------------------
const std::vector<Elf_Half>&
get_sections() const
{
return sections;
}
//------------------------------------------------------------------------------
void
set_index( Elf_Half value )
{
index = value;
}
//------------------------------------------------------------------------------
void
load( std::istream& stream,
std::streampos header_offset )
{
stream.seekg ( 0, stream.end );
set_stream_size ( stream.tellg() );
stream.seekg( header_offset );
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
is_offset_set = true;
if ( PT_NULL != get_type() && 0 != get_file_size() ) {
stream.seekg( (*convertor)( ph.p_offset ) );
Elf_Xword size = get_file_size();
if ( size > get_stream_size() ) {
data = 0;
}
else {
try {
data = new char[size + 1];
} catch (const std::bad_alloc&) {
data = 0;
}
if ( 0 != data ) {
stream.read( data, size );
data[size] = 0;
}
}
}
}
//------------------------------------------------------------------------------
void save( std::ostream& stream,
std::streampos header_offset,
std::streampos data_offset )
{
ph.p_offset = data_offset;
ph.p_offset = (*convertor)(ph.p_offset);
stream.seekp( header_offset );
stream.write( reinterpret_cast<const char*>( &ph ), sizeof( ph ) );
}
//------------------------------------------------------------------------------
private:
T ph;
Elf_Half index;
char* data;
std::vector<Elf_Half> sections;
endianess_convertor* convertor;
bool is_offset_set;
};
} // namespace ELFIO
#endif // ELFIO_SEGMENT_HPP

View file

@ -1,100 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_STRINGS_HPP
#define ELFIO_STRINGS_HPP
#include <cstdlib>
#include <cstring>
#include <string>
namespace ELFIO {
//------------------------------------------------------------------------------
template< class S >
class string_section_accessor_template
{
public:
//------------------------------------------------------------------------------
string_section_accessor_template( S* section_ ) :
string_section( section_ )
{
}
//------------------------------------------------------------------------------
const char*
get_string( Elf_Word index ) const
{
if ( string_section ) {
if ( index < string_section->get_size() ) {
const char* data = string_section->get_data();
if ( 0 != data ) {
return data + index;
}
}
}
return 0;
}
//------------------------------------------------------------------------------
Elf_Word
add_string( const char* str )
{
Elf_Word current_position = 0;
if (string_section) {
// Strings are addeded to the end of the current section data
current_position = (Elf_Word)string_section->get_size();
if ( current_position == 0 ) {
char empty_string = '\0';
string_section->append_data( &empty_string, 1 );
current_position++;
}
string_section->append_data( str, (Elf_Word)std::strlen( str ) + 1 );
}
return current_position;
}
//------------------------------------------------------------------------------
Elf_Word
add_string( const std::string& str )
{
return add_string( str.c_str() );
}
//------------------------------------------------------------------------------
private:
S* string_section;
};
using string_section_accessor = string_section_accessor_template<section>;
using const_string_section_accessor = string_section_accessor_template<const section>;
} // namespace ELFIO
#endif // ELFIO_STRINGS_HPP

View file

@ -1,282 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_SYMBOLS_HPP
#define ELFIO_SYMBOLS_HPP
namespace ELFIO {
//------------------------------------------------------------------------------
template< class S >
class symbol_section_accessor_template
{
public:
//------------------------------------------------------------------------------
symbol_section_accessor_template( const elfio& elf_file_, S* symbol_section_ ) :
elf_file( elf_file_ ),
symbol_section( symbol_section_ )
{
find_hash_section();
}
//------------------------------------------------------------------------------
Elf_Xword
get_symbols_num() const
{
Elf_Xword nRet = 0;
if ( 0 != symbol_section->get_entry_size() ) {
nRet = symbol_section->get_size() / symbol_section->get_entry_size();
}
return nRet;
}
//------------------------------------------------------------------------------
bool
get_symbol( Elf_Xword index,
std::string& name,
Elf64_Addr& value,
Elf_Xword& size,
unsigned char& bind,
unsigned char& type,
Elf_Half& section_index,
unsigned char& other ) const
{
bool ret = false;
if ( elf_file.get_class() == ELFCLASS32 ) {
ret = generic_get_symbol<Elf32_Sym>( index, name, value, size, bind,
type, section_index, other );
}
else {
ret = generic_get_symbol<Elf64_Sym>( index, name, value, size, bind,
type, section_index, other );
}
return ret;
}
//------------------------------------------------------------------------------
bool
get_symbol( const std::string& name,
Elf64_Addr& value,
Elf_Xword& size,
unsigned char& bind,
unsigned char& type,
Elf_Half& section_index,
unsigned char& other ) const
{
bool ret = false;
if ( 0 != get_hash_table_index() ) {
Elf_Word nbucket = *(const Elf_Word*)hash_section->get_data();
Elf_Word nchain = *(const Elf_Word*)( hash_section->get_data() +
sizeof( Elf_Word ) );
Elf_Word val = elf_hash( (const unsigned char*)name.c_str() );
Elf_Word y = *(const Elf_Word*)( hash_section->get_data() +
( 2 + val % nbucket ) * sizeof( Elf_Word ) );
std::string str;
get_symbol( y, str, value, size, bind, type, section_index, other );
while ( str != name && STN_UNDEF != y && y < nchain ) {
y = *(const Elf_Word*)( hash_section->get_data() +
( 2 + nbucket + y ) * sizeof( Elf_Word ) );
get_symbol( y, str, value, size, bind, type, section_index, other );
}
if ( str == name ) {
ret = true;
}
}
return ret;
}
//------------------------------------------------------------------------------
Elf_Word
add_symbol( Elf_Word name, Elf64_Addr value, Elf_Xword size,
unsigned char info, unsigned char other,
Elf_Half shndx )
{
Elf_Word nRet;
if ( symbol_section->get_size() == 0 ) {
if ( elf_file.get_class() == ELFCLASS32 ) {
nRet = generic_add_symbol<Elf32_Sym>( 0, 0, 0, 0, 0, 0 );
}
else {
nRet = generic_add_symbol<Elf64_Sym>( 0, 0, 0, 0, 0, 0 );
}
}
if ( elf_file.get_class() == ELFCLASS32 ) {
nRet = generic_add_symbol<Elf32_Sym>( name, value, size, info, other,
shndx );
}
else {
nRet = generic_add_symbol<Elf64_Sym>( name, value, size, info, other,
shndx );
}
return nRet;
}
//------------------------------------------------------------------------------
Elf_Word
add_symbol( Elf_Word name, Elf64_Addr value, Elf_Xword size,
unsigned char bind, unsigned char type, unsigned char other,
Elf_Half shndx )
{
return add_symbol( name, value, size, ELF_ST_INFO( bind, type ), other, shndx );
}
//------------------------------------------------------------------------------
Elf_Word
add_symbol( string_section_accessor& pStrWriter, const char* str,
Elf64_Addr value, Elf_Xword size,
unsigned char info, unsigned char other,
Elf_Half shndx )
{
Elf_Word index = pStrWriter.add_string( str );
return add_symbol( index, value, size, info, other, shndx );
}
//------------------------------------------------------------------------------
Elf_Word
add_symbol( string_section_accessor& pStrWriter, const char* str,
Elf64_Addr value, Elf_Xword size,
unsigned char bind, unsigned char type, unsigned char other,
Elf_Half shndx )
{
return add_symbol( pStrWriter, str, value, size, ELF_ST_INFO( bind, type ), other, shndx );
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
void
find_hash_section()
{
hash_section = 0;
hash_section_index = 0;
Elf_Half nSecNo = elf_file.sections.size();
for ( Elf_Half i = 0; i < nSecNo && 0 == hash_section_index; ++i ) {
const section* sec = elf_file.sections[i];
if ( sec->get_link() == symbol_section->get_index() ) {
hash_section = sec;
hash_section_index = i;
}
}
}
//------------------------------------------------------------------------------
Elf_Half
get_string_table_index() const
{
return (Elf_Half)symbol_section->get_link();
}
//------------------------------------------------------------------------------
Elf_Half
get_hash_table_index() const
{
return hash_section_index;
}
//------------------------------------------------------------------------------
template< class T >
bool
generic_get_symbol( Elf_Xword index,
std::string& name, Elf64_Addr& value,
Elf_Xword& size,
unsigned char& bind, unsigned char& type,
Elf_Half& section_index,
unsigned char& other ) const
{
bool ret = false;
if ( index < get_symbols_num() ) {
const T* pSym = reinterpret_cast<const T*>(
symbol_section->get_data() +
index * symbol_section->get_entry_size() );
const endianess_convertor& convertor = elf_file.get_convertor();
section* string_section = elf_file.sections[get_string_table_index()];
string_section_accessor str_reader( string_section );
const char* pStr = str_reader.get_string( convertor( pSym->st_name ) );
if ( 0 != pStr ) {
name = pStr;
}
value = convertor( pSym->st_value );
size = convertor( pSym->st_size );
bind = ELF_ST_BIND( pSym->st_info );
type = ELF_ST_TYPE( pSym->st_info );
section_index = convertor( pSym->st_shndx );
other = pSym->st_other;
ret = true;
}
return ret;
}
//------------------------------------------------------------------------------
template< class T >
Elf_Word
generic_add_symbol( Elf_Word name, Elf64_Addr value, Elf_Xword size,
unsigned char info, unsigned char other,
Elf_Half shndx )
{
const endianess_convertor& convertor = elf_file.get_convertor();
T entry;
entry.st_name = convertor( name );
entry.st_value = value;
entry.st_value = convertor( entry.st_value );
entry.st_size = size;
entry.st_size = convertor( entry.st_size );
entry.st_info = convertor( info );
entry.st_other = convertor( other );
entry.st_shndx = convertor( shndx );
symbol_section->append_data( reinterpret_cast<char*>( &entry ),
sizeof( entry ) );
Elf_Word nRet = symbol_section->get_size() / sizeof( entry ) - 1;
return nRet;
}
//------------------------------------------------------------------------------
private:
const elfio& elf_file;
S* symbol_section;
Elf_Half hash_section_index;
const section* hash_section;
};
using symbol_section_accessor = symbol_section_accessor_template<section>;
using const_symbol_section_accessor = symbol_section_accessor_template<const section>;
} // namespace ELFIO
#endif // ELFIO_SYMBOLS_HPP

View file

@ -1,209 +0,0 @@
/*
Copyright (C) 2001-2015 by Serge Lamikhov-Center
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef ELFIO_UTILS_HPP
#define ELFIO_UTILS_HPP
#define ELFIO_GET_ACCESS( TYPE, NAME, FIELD ) \
TYPE get_##NAME() const \
{ \
return (*convertor)( FIELD ); \
}
#define ELFIO_SET_ACCESS( TYPE, NAME, FIELD ) \
void set_##NAME( TYPE value ) \
{ \
FIELD = value; \
FIELD = (*convertor)( FIELD ); \
}
#define ELFIO_GET_SET_ACCESS( TYPE, NAME, FIELD ) \
TYPE get_##NAME() const \
{ \
return (*convertor)( FIELD ); \
} \
void set_##NAME( TYPE value ) \
{ \
FIELD = value; \
FIELD = (*convertor)( FIELD ); \
}
#define ELFIO_GET_ACCESS_DECL( TYPE, NAME ) \
virtual TYPE get_##NAME() const = 0
#define ELFIO_SET_ACCESS_DECL( TYPE, NAME ) \
virtual void set_##NAME( TYPE value ) = 0
#define ELFIO_GET_SET_ACCESS_DECL( TYPE, NAME ) \
virtual TYPE get_##NAME() const = 0; \
virtual void set_##NAME( TYPE value ) = 0
namespace ELFIO {
//------------------------------------------------------------------------------
class endianess_convertor {
public:
//------------------------------------------------------------------------------
endianess_convertor()
{
need_conversion = false;
}
//------------------------------------------------------------------------------
void
setup( unsigned char elf_file_encoding )
{
need_conversion = ( elf_file_encoding != get_host_encoding() );
}
//------------------------------------------------------------------------------
uint64_t
operator()( uint64_t value ) const
{
if ( !need_conversion ) {
return value;
}
value =
( ( value & 0x00000000000000FFull ) << 56 ) |
( ( value & 0x000000000000FF00ull ) << 40 ) |
( ( value & 0x0000000000FF0000ull ) << 24 ) |
( ( value & 0x00000000FF000000ull ) << 8 ) |
( ( value & 0x000000FF00000000ull ) >> 8 ) |
( ( value & 0x0000FF0000000000ull ) >> 24 ) |
( ( value & 0x00FF000000000000ull ) >> 40 ) |
( ( value & 0xFF00000000000000ull ) >> 56 );
return value;
}
//------------------------------------------------------------------------------
int64_t
operator()( int64_t value ) const
{
if ( !need_conversion ) {
return value;
}
return (int64_t)(*this)( (uint64_t)value );
}
//------------------------------------------------------------------------------
uint32_t
operator()( uint32_t value ) const
{
if ( !need_conversion ) {
return value;
}
value =
( ( value & 0x000000FF ) << 24 ) |
( ( value & 0x0000FF00 ) << 8 ) |
( ( value & 0x00FF0000 ) >> 8 ) |
( ( value & 0xFF000000 ) >> 24 );
return value;
}
//------------------------------------------------------------------------------
int32_t
operator()( int32_t value ) const
{
if ( !need_conversion ) {
return value;
}
return (int32_t)(*this)( (uint32_t)value );
}
//------------------------------------------------------------------------------
uint16_t
operator()( uint16_t value ) const
{
if ( !need_conversion ) {
return value;
}
value =
( ( value & 0x00FF ) << 8 ) |
( ( value & 0xFF00 ) >> 8 );
return value;
}
//------------------------------------------------------------------------------
int16_t
operator()( int16_t value ) const
{
if ( !need_conversion ) {
return value;
}
return (int16_t)(*this)( (uint16_t)value );
}
//------------------------------------------------------------------------------
int8_t
operator()( int8_t value ) const
{
return value;
}
//------------------------------------------------------------------------------
uint8_t
operator()( uint8_t value ) const
{
return value;
}
//------------------------------------------------------------------------------
private:
//------------------------------------------------------------------------------
unsigned char
get_host_encoding() const
{
static const int tmp = 1;
if ( 1 == *(const char*)&tmp ) {
return ELFDATA2LSB;
}
else {
return ELFDATA2MSB;
}
}
//------------------------------------------------------------------------------
private:
bool need_conversion;
};
//------------------------------------------------------------------------------
inline
uint32_t
elf_hash( const unsigned char *name )
{
uint32_t h = 0, g;
while ( *name ) {
h = (h << 4) + *name++;
g = h & 0xf0000000;
if ( g != 0 )
h ^= g >> 24;
h &= ~g;
}
return h;
}
} // namespace ELFIO
#endif // ELFIO_UTILS_HPP

View file

@ -2,5 +2,7 @@
<SymbolMap File="SymbolMap_OoTMqDbg.txt"/> <SymbolMap File="SymbolMap_OoTMqDbg.txt"/>
<ActorList File="ActorList_OoTMqDbg.txt"/> <ActorList File="ActorList_OoTMqDbg.txt"/>
<ObjectList File="ObjectList_OoTMqDbg.txt"/> <ObjectList File="ObjectList_OoTMqDbg.txt"/>
<EntranceList File="EntranceList_OoTMqDbg.txt"/>
<SpecialEntranceList File="SpecialEntranceList_OoTMqDbg.txt"/>
<ExternalXMLFolder Path="assets/xml/"/> <ExternalXMLFolder Path="assets/xml/"/>
</Root> </Root>

Some files were not shown because too many files have changed in this diff Show more