From a5425e4ffc87b6cdc65200c703b6ce94383cfa90 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Thu, 8 Dec 2022 16:47:03 -0300 Subject: [PATCH] Import `EnAObj`'s data and a few cleanups (#1111) * try to import data * bss * spec * name actionfuncs * macros for params * review Co-authored-by: Derek Hensley Co-authored-by: EllipticEllipsis Co-authored-by: Derek Hensley Co-authored-by: EllipticEllipsis --- include/variables.h | 4 +- include/z64actor.h | 13 +++++- spec | 3 +- src/code/z_en_a_keep.c | 75 ++++++++++++++++++++++++++++------ tools/disasm/files.txt | 2 +- tools/disasm/functions.txt | 4 +- tools/sizes/code_functions.csv | 4 +- 7 files changed, 80 insertions(+), 25 deletions(-) diff --git a/include/variables.h b/include/variables.h index 70874a1ecb..3aaefebd53 100644 --- a/include/variables.h +++ b/include/variables.h @@ -358,9 +358,7 @@ extern u16 viRetrace; extern DmaEntry dmadata[1568]; // extern UNK_TYPE1 D_80186028; extern u64 aspMainTextStart[]; -extern ColliderCylinderInit enAObjCylinderInit; -extern InitChainEntry enAObjInitVar; -extern Gfx* enAObjDisplayLists[2]; + extern u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER]; extern u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER]; extern s32 D_801AE194[32]; diff --git a/include/z64actor.h b/include/z64actor.h index ce6cfe321b..370b49e753 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -289,8 +289,17 @@ typedef struct EnAObj { /* 0x000 */ Actor actor; /* 0x144 */ EnAObjActionFunc actionFunc; /* 0x148 */ ColliderCylinder collision; - /* 0x194 */ UNK_TYPE1 pad194[0x14]; -} EnAObj; // size = 0x1A8 +} EnAObj; // size = 0x194 + +typedef enum { + /* 0 */ AOBJ_SIGNPOST_OBLONG, + /* 1 */ AOBJ_SIGNPOST_ARROW, +} AObjType; + +#define AOBJ_GET_TEXTID(thisx) ((((thisx)->params >> 8) & 0xFF) | 0x300) +#define AOBJ_GET_TYPE(thisx) (((thisx)->params & 0xFF) - 9) + +#define AOBJ_PARAMS(textId, type) ((((textId - 0x300) & 0xFF) << 8) | (type + 9)) typedef enum { /* 0x00 */ ACTORCAT_SWITCH, diff --git a/spec b/spec index 9a29b7fcfe..540fb47473 100644 --- a/spec +++ b/spec @@ -424,11 +424,10 @@ beginseg name "code" compress after "dmadata" - include "build/src/code/z_en_a_keep.o" include "build/data/code/aspMain.data.o" include "build/data/code/gspS2DEX2.fifo.data.o" include "build/data/code/njpgdspMain.data.o" - include "build/data/code/code_801ADE60.data.o" + include "build/src/code/z_en_a_keep.o" include "build/data/code/code_801E3FA0.bss.o" include "build/src/code/z_en_item00.o" include "build/src/code/z_eff_blure.o" diff --git a/src/code/z_en_a_keep.c b/src/code/z_en_a_keep.c index 267da4e40f..a9bd49f6ff 100644 --- a/src/code/z_en_a_keep.c +++ b/src/code/z_en_a_keep.c @@ -1,21 +1,65 @@ #include "global.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" + +#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8) #define THIS ((EnAObj*)thisx) -void EnAObj_Update1(EnAObj* this, PlayState* play); -void EnAObj_Update2(EnAObj* this, PlayState* play); +void EnAObj_Init(Actor* thisx, PlayState* play); +void EnAObj_Destroy(Actor* thisx, PlayState* play); +void EnAObj_Update(Actor* thisx, PlayState* play); +void EnAObj_Draw(Actor* thisx, PlayState* play); + +void EnAObj_Idle(EnAObj* this, PlayState* play); +void EnAObj_Talk(EnAObj* this, PlayState* play); + +ActorInit En_A_Obj_InitVars = { + ACTOR_EN_A_OBJ, + ACTORCAT_PROP, + FLAGS, + GAMEPLAY_KEEP, + sizeof(EnAObj), + (ActorFunc)EnAObj_Init, + (ActorFunc)EnAObj_Destroy, + (ActorFunc)EnAObj_Update, + (ActorFunc)EnAObj_Draw, +}; + +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_NONE, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_NONE, + BUMP_NONE, + OCELEM_ON, + }, + { 25, 60, 0, { 0, 0, 0 } }, +}; + +static InitChainEntry sInitChain[] = { + ICHAIN_U8(targetMode, 0, ICHAIN_STOP), +}; void EnAObj_Init(Actor* thisx, PlayState* play) { EnAObj* this = THIS; - this->actor.textId = ((this->actor.params >> 8) & 0xFF) | 0x300; - this->actor.params = (this->actor.params & 0xFF) - 9; - Actor_ProcessInitChain(&this->actor, &enAObjInitVar); + this->actor.textId = AOBJ_GET_TEXTID(&this->actor); + this->actor.params = AOBJ_GET_TYPE(&this->actor); + Actor_ProcessInitChain(&this->actor, sInitChain); ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 12); - Collider_InitAndSetCylinder(play, &this->collision, &this->actor, &enAObjCylinderInit); + Collider_InitAndSetCylinder(play, &this->collision, &this->actor, &sCylinderInit); Collider_UpdateCylinder(&this->actor, &this->collision); this->actor.colChkInfo.mass = MASS_IMMOVABLE; - this->actionFunc = EnAObj_Update1; + this->actionFunc = EnAObj_Idle; } void EnAObj_Destroy(Actor* thisx, PlayState* play) { @@ -24,23 +68,23 @@ void EnAObj_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collision); } -void EnAObj_Update1(EnAObj* this, PlayState* play) { +void EnAObj_Idle(EnAObj* this, PlayState* play) { s32 yawDiff; if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - this->actionFunc = EnAObj_Update2; + this->actionFunc = EnAObj_Talk; } else { yawDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)); - if ((yawDiff < 0x2800) || ((this->actor.params == 1) && (yawDiff > 0x5800))) { + if ((yawDiff < 0x2800) || ((this->actor.params == AOBJ_SIGNPOST_ARROW) && (yawDiff > 0x5800))) { func_800B863C(&this->actor, play); } } } -void EnAObj_Update2(EnAObj* this, PlayState* play) { +void EnAObj_Talk(EnAObj* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { - this->actionFunc = EnAObj_Update1; + this->actionFunc = EnAObj_Idle; } } @@ -52,6 +96,11 @@ void EnAObj_Update(Actor* thisx, PlayState* play) { CollisionCheck_SetOC(play, &play->colChkCtx, &this->collision.base); } +static Gfx* sDLists[] = { + gSignRectangularDL, // AOBJ_SIGNPOST_OBLONG + gSignDirectionalDL, // AOBJ_SIGNPOST_ARROW +}; + void EnAObj_Draw(Actor* thisx, PlayState* play) { - Gfx_DrawDListOpa(play, enAObjDisplayLists[thisx->params]); + Gfx_DrawDListOpa(play, sDLists[thisx->params]); } diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt index 3f2d082775..fdea3aa4a8 100644 --- a/tools/disasm/files.txt +++ b/tools/disasm/files.txt @@ -508,7 +508,7 @@ 0x801AAAB0 : "aspMain", 0x801ABAB0 : "gspS2DEX2.fifo", 0x801AD370 : "njpgdspMain", - 0x801ADE60 : "", + 0x801ADE60 : "z_en_a_keep", 0x801ADEC0 : "z_en_item00", 0x801AE240 : "z_eff_blure", 0x801AE2F0 : "z_eff_shield_particle", diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 988fbde6bb..8012e26cb1 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -486,8 +486,8 @@ 0x80096930:("__osMemcpy",), 0x800A5AC0:("EnAObj_Init",), 0x800A5B6C:("EnAObj_Destroy",), - 0x800A5B98:("EnAObj_Update1",), - 0x800A5C28:("EnAObj_Update2",), + 0x800A5B98:("EnAObj_Idle",), + 0x800A5C28:("EnAObj_Talk",), 0x800A5C60:("EnAObj_Update",), 0x800A5CB8:("EnAObj_Draw",), 0x800A5D00:("EnItem00_SetObject",), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index b6c9bb9148..b9cef18ddb 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1,7 +1,7 @@ asm/non_matchings/code/z_en_a_keep/EnAObj_Init.s,EnAObj_Init,0x800A5AC0,0x2B asm/non_matchings/code/z_en_a_keep/EnAObj_Destroy.s,EnAObj_Destroy,0x800A5B6C,0xB -asm/non_matchings/code/z_en_a_keep/EnAObj_Update1.s,EnAObj_Update1,0x800A5B98,0x24 -asm/non_matchings/code/z_en_a_keep/EnAObj_Update2.s,EnAObj_Update2,0x800A5C28,0xE +asm/non_matchings/code/z_en_a_keep/EnAObj_Idle.s,EnAObj_Idle,0x800A5B98,0x24 +asm/non_matchings/code/z_en_a_keep/EnAObj_Talk.s,EnAObj_Talk,0x800A5C28,0xE asm/non_matchings/code/z_en_a_keep/EnAObj_Update.s,EnAObj_Update,0x800A5C60,0x16 asm/non_matchings/code/z_en_a_keep/EnAObj_Draw.s,EnAObj_Draw,0x800A5CB8,0x12 asm/non_matchings/code/z_en_item00/EnItem00_SetObject.s,EnItem00_SetObject,0x800A5D00,0x1C