En_Giant OK and mostly documented (#346)

* Migrate data to C

* EnGiant_Destroy OK

* EnGiant_Init OK

* func_80B01A74 OK

* Comment what each of the quest items are

* Put a little comment for myself on func_80B01A74 because it was confusing me lol

* Very early names (they're all bad)

* func_80B01990 OK

* EnGiant_Update OK

* func_80B024AC OK

* func_80B023D0 OK

* func_80B024D8 OK

* func_80B02354 OK (this function is bad!)

* func_80B020A0 OK

* func_80B01EE8 OK

* func_80B01E84 OK

* func_80B0211C OK

* func_80B02234 OK

* unk_250 -> sfxId and label SFX

* func_80B02688 OK

* func_80B026C4 OK

* EnGiant_Draw OK

* Update spec

* Fix up the static data

* unk_24E -> alpha

* Document some of the animation stuff

* Name EnGiant_IsNotFreed

* Document the giant types better

* Minor cleanup

* Add explanatory comment

* Rename the functions in functions.txt too, whoops

* Document sFaceTextures and blink routine

* Document all the various animations

* Name EnGiant_PlaySound

* Document some functions and change an unknown to action

* Add an SFX id I missed

* Name all the action funcs

* Name last two functions

* Mark one case as unused

* Change func_800F5A8C to use arg0, arg1, arg2, etc.

* Move sFaceTextures to EnGiant_Draw and comment what they are

* EnGiant_IsNotFreed -> EnGiant_IsImprisoned

* Use booleans in EnGiant_IsImprisoned

* **/ -> */

* action -> csAction

* Make macros for all type conditional checks

* Add warning about inconsistency

* Document the cs actions

* Add some documentation to animation-changing functions

* Update the function name in functions.txt too

* Improve GIANT_TYPE macros

* Remove an unncessary early return

* Incorporate animation changes
This commit is contained in:
Tom Overton
2021-10-25 09:22:17 -03:00
committed by GitHub
parent 4129e86882
commit bfd1ab28a6
7 changed files with 579 additions and 45 deletions
+1 -1
View File
@@ -1736,7 +1736,7 @@ void Font_LoadOrderedFont(Font* font);
// void func_800F50D4(void);
void Kankyo_Init(GlobalContext* globalCtx, EnvironmentContext* envCtx);
u32 func_800F5954(u8* param_1, u32 param_2, u32 param_3, u8 param_4, u8 param_5);
// void func_800F5A8C(void);
f32 func_800F5A8C(u16 arg0, u16 arg1, u16 arg2, GlobalContext* globalContext);
// void func_800F5B10(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5);
// void func_800F5CD0(void);
// void func_800F6834(void);
+5 -1
View File
@@ -29,7 +29,11 @@ typedef struct {
/* 0x00 */ u16 unk0; // action; // "dousa"
/* 0x02 */ u16 startFrame;
/* 0x04 */ u16 endFrame;
/* 0x06 */ UNK_TYPE1 pad6[0x2A];
/* 0x06 */ UNK_TYPE1 pad6[0xA];
/* 0x10 */ s32 unk10;
/* 0x14 */ UNK_TYPE1 pad14[0x8];
/* 0x1C */ s32 unk1C;
/* 0x20 */ UNK_TYPE1 pad20[0x10];
} CsCmdActorAction; // size = 0x30
typedef struct {
+1 -2
View File
@@ -3889,8 +3889,7 @@ beginseg
name "ovl_En_Giant"
compress
include "build/src/overlays/actors/ovl_En_Giant/z_en_giant.o"
include "build/data/ovl_En_Giant/ovl_En_Giant.data.o"
include "build/data/ovl_En_Giant/ovl_En_Giant.reloc.o"
include "build/src/overlays/actors/ovl_En_Giant/ovl_En_Giant_reloc.o"
endseg
beginseg
File diff suppressed because it is too large Load Diff
+96 -3
View File
@@ -3,14 +3,107 @@
#include "global.h"
#define GIANT_TYPE(thisx) ((thisx)->params & 0xF)
#define GIANT_TYPE_IS_NOT_TERMINA_FIELD(type) (type > GIANT_TYPE_OCEAN_TERMINA_FIELD)
#define GIANT_TYPE_IS_TERMINA_FIELD(type) (type <= GIANT_TYPE_OCEAN_TERMINA_FIELD)
#define GIANT_TYPE_IS_CLOCK_TOWER_SUCCESS(type) (type >= GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_SUCCESS && type <= GIANT_TYPE_OCEAN_CLOCK_TOWER_SUCCESS)
#define GIANT_TYPE_IS_CHAMBER_OR_ENDING(type) (type >= GIANT_TYPE_MOUNTAIN_GIANTS_CHAMBER_AND_ENDING && type <= GIANT_TYPE_OCEAN_GIANTS_CHAMBER_AND_ENDING)
#define GIANT_TYPE_IS_CLOCK_TOWER_FAILURE(type) (type >= GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE && type <= GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE)
/**
* The giants are divided into types based on where in the game they appear.
* - TERMINA_FIELD: These appear in all non-ending cutscenes that take place in Termina Field.
* - CLOCK_TOWER_SUCCESS: These appear in the Clock Tower when the Oath to Order is played and all giants are freed.
* - GIANTS_CHAMBER_AND_ENDING: These giants appear in the Giant's Chamber or in all cutscenes that play after defeating Majora.
* - CLOCK_TOWER_FAILURE: These appear in the Clock Tower when the Oath to Order is played and all giants are NOT freed.
*
* The SWAMP, MOUNTAIN, OCEAN, and CANYON signifiers are used to identify which of the four giants it is,
* but the devs were not always consistent about this. For example, the giants in the Giant's Chamber are
* always GIANT_TYPE_MOUNTAIN_GIANTS_CHAMBER_AND_ENDING, regardless of which boss was just defeated. These
* are named such that EnGiant_IsImprisoned has the expected behavior; the devs were only inconsistent in
* the cases where they weren't calling this function.
*/
typedef enum {
/* 0 */ GIANT_TYPE_MOUNTAIN_TERMINA_FIELD,
/* 1 */ GIANT_TYPE_CANYON_TERMINA_FIELD,
/* 2 */ GIANT_TYPE_SWAMP_TERMINA_FIELD,
/* 3 */ GIANT_TYPE_OCEAN_TERMINA_FIELD,
/* 4 */ GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_SUCCESS,
/* 5 */ GIANT_TYPE_CANYON_CLOCK_TOWER_SUCCESS,
/* 6 */ GIANT_TYPE_SWAMP_CLOCK_TOWER_SUCCESS,
/* 7 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_SUCCESS,
/* 8 */ GIANT_TYPE_MOUNTAIN_GIANTS_CHAMBER_AND_ENDING,
/* 9 */ GIANT_TYPE_CANYON_GIANTS_CHAMBER_AND_ENDING,
/* 10 */ GIANT_TYPE_SWAMP_GIANTS_CHAMBER_AND_ENDING,
/* 11 */ GIANT_TYPE_OCEAN_GIANTS_CHAMBER_AND_ENDING,
/* 12 */ GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE,
/* 13 */ GIANT_TYPE_CANYON_CLOCK_TOWER_FAILURE,
/* 14 */ GIANT_TYPE_SWAMP_CLOCK_TOWER_FAILURE,
/* 15 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE,
} GiantType;
/**
* These values are used to index into sAnimationTable to pick the appropriate animation.
*/
typedef enum {
/* 0 */ GIANT_ANIMATION_LOOK_UP_START,
/* 1 */ GIANT_ANIMATION_LOOK_UP_LOOP,
/* 2 */ GIANT_ANIMATION_FALLING_OVER,
/* 3 */ GIANT_ANIMATION_RAISED_ARMS_START,
/* 4 */ GIANT_ANIMATION_RAISED_ARMS_LOOP,
/* 5 */ GIANT_ANIMATION_STRUGGLE_START,
/* 6 */ GIANT_ANIMATION_STRUGGLE_LOOP,
/* 7 */ GIANT_ANIMATION_IDLE_LOOP,
/* 8 */ GIANT_ANIMATION_WALKING_LOOP,
/* 9 */ GIANT_ANIMATION_BIG_CALL_START,
/* 10 */ GIANT_ANIMATION_BIG_CALL_LOOP,
/* 11 */ GIANT_ANIMATION_BIG_CALL_END,
/* 12 */ GIANT_ANIMATION_SMALL_CALL_START,
/* 13 */ GIANT_ANIMATION_SMALL_CALL_LOOP,
/* 14 */ GIANT_ANIMATION_SMALL_CALL_END,
/* 15 */ GIANT_ANIMATION_MAX
} GiantAnimationIndex;
/**
* Used as values for csAction. The UNKNOWN ones are never used in-game.
*/
typedef enum {
/* 0 */ GIANT_CS_ACTION_NONE,
/* 1 */ GIANT_CS_ACTION_IDLE,
/* 2 */ GIANT_CS_ACTION_WALKING,
/* 3 */ GIANT_CS_ACTION_LOOKING_UP,
/* 4 */ GIANT_CS_ACTION_RAISING_ARMS,
/* 5 */ GIANT_CS_ACTION_STRUGGLING,
/* 6 */ GIANT_CS_ACTION_FALLING_OVER,
/* 7 */ GIANT_CS_ACTION_IDLE_FADE_IN,
/* 8 */ GIANT_CS_ACTION_TALKING,
/* 9 */ GIANT_CS_ACTION_DONE_TALKING,
/* 10 */ GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER,
/* 11 */ GIANT_CS_ACTION_PLAYER_LEARNED_OATH_TO_ORDER,
/* 12 */ GIANT_CS_ACTION_UNKNOWN_12,
/* 13 */ GIANT_CS_ACTION_UNKNOWN_13,
/* 14 */ GIANT_CS_ACTION_UNKNOWN_14,
/* 15 */ GIANT_CS_ACTION_HOLDING_UP_MOON_IN_CLOCK_TOWER
} GiantCsActionIndex;
struct EnGiant;
typedef void (*EnGiantActionFunc)(struct EnGiant*, GlobalContext*);
typedef struct EnGiant {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x154];
/* 0x0298 */ EnGiantActionFunc actionFunc;
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[16];
/* 0x1E8 */ Vec3s morphTable[16];
/* 0x248 */ s16 animationId;
/* 0x24A */ u16 unk_24A;
/* 0x24C */ u16 csAction;
/* 0x24E */ s16 alpha;
/* 0x250 */ u16 sfxId;
/* 0x254 */ MtxF unk_254;
/* 0x294 */ s16 faceIndex;
/* 0x296 */ s16 blinkTimer;
/* 0x298 */ EnGiantActionFunc actionFunc;
} EnGiant; // size = 0x29C
extern const ActorInit En_Giant_InitVars;
+13 -13
View File
@@ -12869,22 +12869,22 @@
0x80B00F08:("func_80B00F08",),
0x80B00F64:("func_80B00F64",),
0x80B01040:("EnTalkGibud_Draw",),
0x80B01990:("func_80B01990",),
0x80B01A74:("func_80B01A74",),
0x80B01990:("EnGiant_ChangeAnimation",),
0x80B01A74:("EnGiant_IsImprisoned",),
0x80B01B30:("EnGiant_Init",),
0x80B01E74:("EnGiant_Destroy",),
0x80B01E84:("func_80B01E84",),
0x80B01EE8:("func_80B01EE8",),
0x80B020A0:("func_80B020A0",),
0x80B0211C:("func_80B0211C",),
0x80B02234:("func_80B02234",),
0x80B02354:("func_80B02354",),
0x80B023D0:("func_80B023D0",),
0x80B024AC:("func_80B024AC",),
0x80B024D8:("func_80B024D8",),
0x80B01E84:("EnGiant_ChangeToStartOrLoopAnimation",),
0x80B01EE8:("EnGiant_ChangeAnimationBasedOnCsAction",),
0x80B020A0:("EnGiant_UpdateAlpha",),
0x80B0211C:("EnGiant_PlayAndUpdateAnimation",),
0x80B02234:("EnGiant_PlaySound",),
0x80B02354:("EnGiant_UpdatePosition",),
0x80B023D0:("EnGiant_PerformClockTowerSuccessActions",),
0x80B024AC:("EnGiant_PlayClockTowerFailureAnimation",),
0x80B024D8:("EnGiant_PerformCutsceneActions",),
0x80B025CC:("EnGiant_Update",),
0x80B02688:("func_80B02688",),
0x80B026C4:("func_80B026C4",),
0x80B02688:("EnGiant_PostLimbDrawOpa",),
0x80B026C4:("EnGiant_PostLimbDrawXlu",),
0x80B026FC:("EnGiant_Draw",),
0x80B02CD0:("func_80B02CD0",),
0x80B02D58:("func_80B02D58",),
+15
View File
@@ -2321,11 +2321,26 @@ D_0600F6C0 = 0x0600F6C0;
// ovl_En_Giant
D_06002168 = 0x06002168;
D_06005A80 = 0x06005A80;
D_06006280 = 0x06006280;
D_06006A80 = 0x06006A80;
D_06007610 = 0x06007610;
D_060079B0 = 0x060079B0;
D_06008394 = 0x06008394;
D_060096E4 = 0x060096E4;
D_0600A1C4 = 0x0600A1C4;
D_0600ACA4 = 0x0600ACA4;
D_0600B784 = 0x0600B784;
D_0600C5D4 = 0x0600C5D4;
D_0600D040 = 0x0600D040;
D_0600DE84 = 0x0600DE84;
D_060102A4 = 0x060102A4;
D_060116E4 = 0x060116E4;
D_06012A38 = 0x06012A38;
D_06013004 = 0x06013004;
D_06013FE8 = 0x06013FE8;
D_06015334 = 0x06015334;
D_06017944 = 0x06017944;
// ovl_En_Ginko_Man