From a9138a7c0f924861743e0d6946d257b40af99485 Mon Sep 17 00:00:00 2001 From: fullgrowngaming <42490167+fullgrowngaming@users.noreply.github.com> Date: Mon, 26 Oct 2020 16:00:02 -0700 Subject: [PATCH] ending_hero5 OK (#40) * ending_hero5 OK * Formatting * Fixed formatting and changed colors to decimal --- include/PR/gbi.h | 139 +++++++++--------- linker_scripts/code_script.txt | 5 +- linker_scripts/object_script.txt | 9 ++ .../ovl_En_Ending_Hero5/z_en_ending_hero5.c | 93 ++++++++++-- .../ovl_En_Ending_Hero5/z_en_ending_hero5.h | 9 +- 5 files changed, 173 insertions(+), 82 deletions(-) diff --git a/include/PR/gbi.h b/include/PR/gbi.h index 49f03b6da..5f5890400 100644 --- a/include/PR/gbi.h +++ b/include/PR/gbi.h @@ -7,6 +7,8 @@ /* Types */ +/* Private macro to wrap other macros in do {...} while (0) */ +#define _DW(macro) do {macro} while (0) #define F3DEX_GBI_2 @@ -1259,16 +1261,6 @@ typedef struct { char pad3; } Light_t; -// Added for Zelda decomp -typedef struct { - unsigned char col[3]; /* diffuse light value (rgba) */ - char pad1; - unsigned char colc[3]; /* copy of diffuse light value (rgba) */ - char pad2; - signed short pos[3]; - char unkE; -} LightPos_t; - typedef struct { unsigned char col[3]; /* ambient light value (rgba) */ char pad1; @@ -1282,7 +1274,6 @@ typedef struct { typedef union { Light_t l; - LightPos_t lPos; long long int force_structure_alignment[2]; } Light; @@ -1693,12 +1684,12 @@ _DW({ \ * +-+---+-----------------------------+ */ # define gSPVertex(pkt, v, n, v0) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ _g->words.w0 = \ _SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7); \ _g->words.w1 = (unsigned int)(v); \ -} +}) # define gsSPVertex(v, n, v0) \ { \ (_SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7)), \ @@ -1763,12 +1754,12 @@ _DW({ \ } #define gImmp1(pkt, c, p0) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL((c), 24, 8); \ _g->words.w1 = (unsigned int)(p0); \ -} +}) #define gsImmp1(c, p0) \ { \ @@ -1804,13 +1795,13 @@ _DW({ \ } #define gImmp21(pkt, c, p0, p1, dat) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | \ _SHIFTL((p1), 0, 8)); \ _g->words.w1 = (unsigned int) (dat); \ -} +}) #define gsImmp21(c, p0, p1, dat) \ { \ @@ -1909,13 +1900,13 @@ _DW({ \ *** 1 Triangle ***/ #define gSP1Triangle(pkt, v0, v1, v2, flag) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL(G_TRI1, 24, 8)| \ __gsSP1Triangle_w1f(v0, v1, v2, flag); \ _g->words.w1 = 0; \ -} +}) #define gsSP1Triangle(v0, v1, v2, flag) \ { \ _SHIFTL(G_TRI1, 24, 8)|__gsSP1Triangle_w1f(v0, v1, v2, flag), \ @@ -1966,13 +1957,13 @@ _DW({ \ *** 1 Quadrangle ***/ #define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = (_SHIFTL(G_QUAD, 24, 8)| \ __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ -} +}) #define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ { \ @@ -2061,13 +2052,13 @@ _DW({ \ *** 2 Triangles ***/ #define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8)| \ __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \ _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \ -} +}) #define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ { \ @@ -2303,7 +2294,7 @@ _DW({ \ * uc_dstart = ucode data section start */ #define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ _g->words.w1 = (unsigned int)(uc_dstart); \ @@ -2311,7 +2302,7 @@ _DW({ \ _g->words.w0 = (_SHIFTL(G_LOAD_UCODE,24,8)| \ _SHIFTL((int)(uc_dsize)-1,0,16)); \ _g->words.w1 = (unsigned int)(uc_start); \ -} +}) #define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \ { _SHIFTL(G_RDPHALF_1,24,8), \ @@ -2585,10 +2576,10 @@ _DW({ \ #endif /* F3DEX_GBI_2 */ #define gSPLookAt(pkt, la) \ -{ \ - gSPLookAtX(pkt,la) \ - gSPLookAtY(pkt,(char *)(la)+16) \ -} +_DW({ \ + gSPLookAtX(pkt,la); \ + gSPLookAtY(pkt,(char *)(la)+16); \ +}) #define gsSPLookAt(la) \ gsSPLookAtX(la), \ gsSPLookAtY((char *)(la)+16) @@ -2643,7 +2634,7 @@ _DW({ \ * Macros to turn texture on/off */ # define gSPTexture(pkt, s, t, level, tile, on) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8) | \ @@ -2651,7 +2642,7 @@ _DW({ \ _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | \ _SHIFTL((on),1,7)); \ _g->words.w1 = (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)); \ -} +}) # define gsSPTexture(s, t, level, tile, on) \ { \ (_SHIFTL(G_TEXTURE,24,8) | _SHIFTL(BOWTIE_VAL,16,8) | \ @@ -2754,11 +2745,11 @@ _DW({ \ * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly. */ #define gSPGeometryMode(pkt, c, s) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ _g->words.w0 = _SHIFTL(G_GEOMETRYMODE,24,8)|_SHIFTL(~(u32)(c),0,24);\ _g->words.w1 = (u32)(s); \ -} +}) #define gsSPGeometryMode(c, s) \ { \ @@ -2948,7 +2939,7 @@ _DW({ \ #define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i) #define gsDPSetMaskImage(i) gsDPSetDepthImage(i) -#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i) +#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i) #define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i) /* @@ -2987,7 +2978,7 @@ _DW({ \ #define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | \ @@ -3005,7 +2996,7 @@ _DW({ \ G_CCMUX_##d1, \ G_ACMUX_##Ab1, \ G_ACMUX_##Ad1)); \ -} +}) #define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ @@ -3127,12 +3118,12 @@ _DW({ \ * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2; */ #define gDPSetOtherMode(pkt, mode0, mode1) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE,24,8)|_SHIFTL(mode0,0,24);\ _g->words.w1 = (unsigned int)(mode1); \ -} +}) #define gsDPSetOtherMode(mode0, mode1) \ { \ @@ -3201,14 +3192,14 @@ _DW({ \ TXL2WORDS_4b(width)) #define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | \ _SHIFTL(ult, 0, 12); \ _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | \ _SHIFTL(lrt, 0, 12); \ -} +}) #define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \ { \ @@ -3227,7 +3218,7 @@ _DW({ \ #define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, \ maskt, shiftt, cms, masks, shifts) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) |\ @@ -3237,7 +3228,7 @@ _DW({ \ _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \ _SHIFTL(shiftt, 10, 4) |_SHIFTL(cms, 8, 2) | \ _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \ -} +}) #define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, \ maskt, shiftt, cms, masks, shifts) \ @@ -3261,7 +3252,7 @@ _DW({ \ * tile manipulation yourself. RJM. */ #define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)(pkt); \ \ _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | \ @@ -3269,7 +3260,7 @@ _DW({ \ _g->words.w1 = (_SHIFTL(tile, 24, 3) | \ _SHIFTL((MIN(lrs,G_TX_LDBLK_MAX_TXL)), 12, 12) |\ _SHIFTL(dxt, 0, 12)); \ -} +}) #define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \ { \ @@ -3281,12 +3272,12 @@ _DW({ \ } #define gDPLoadTLUTCmd(pkt, tile, count) \ -{ \ +_DW({ \ Gfx *_g = (Gfx *)pkt; \ \ _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \ _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10);\ -} +}) #define gsDPLoadTLUTCmd(tile, count) \ { \ @@ -3311,7 +3302,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } #define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, \ @@ -3331,7 +3322,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* Load fix rww 27jun95 */ @@ -3353,7 +3344,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3376,7 +3367,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, rtile, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } @@ -3396,7 +3387,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3418,7 +3409,7 @@ _DW({ \ maskt, shiftt, cms, masks, shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3440,7 +3431,7 @@ _DW({ \ maskt, shiftt, cms, masks, shifts); \ gDPSetTileSize(pkt, rtile, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3462,7 +3453,7 @@ _DW({ \ maskt, shiftt, cms, masks, shifts); \ gDPSetTileSize(pkt, rtile, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } #define gsDPLoadTextureBlock(timg, fmt, siz, width, height, \ @@ -3617,7 +3608,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* Load fix rww 27jun95 */ @@ -3638,7 +3629,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3660,7 +3651,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, rtile, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } /* @@ -3682,7 +3673,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, rtile, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } @@ -3702,7 +3693,7 @@ _DW({ \ shifts); \ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ - ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } #define gsDPLoadTextureBlock_4b(timg, fmt, width, height, \ @@ -3827,7 +3818,7 @@ _DW({ \ (uls)<words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ @@ -4419,7 +4410,7 @@ _DW({ \ _SHIFTL(yl, 0, 12)); \ gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\ -} +}) /* like gSPTextureRectangle but accepts negative position arguments */ #define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ @@ -4493,9 +4484,17 @@ _DW({ \ #define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag) #define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag) +#define gDPNoOpHere(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 1) +#define gDPNoOpString(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 2) +#define gDPNoOpWord(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 3) +#define gDPNoOpFloat(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 4) +#define gDPNoOpQuiet(pkt) gDma1p(pkt, G_NOOP, 0, 0, 5) +#define gDPNoOpVerbose(pkt, n) gDma1p(pkt, G_NOOP, 0, n, 5) +#define gDPNoOpCallBack(pkt, callback, arg) gDma1p(pkt, G_NOOP, callback, arg, 6) +#define gDPNoOpOpenDisp(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 7) +#define gDPNoOpCloseDisp(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 8) +#define gDPNoOpTag3(pkt, type, data, n) gDma1p(pkt, G_NOOP, data, n, type) + #endif - -/* Private macro to wrap other macros in do {...} while (0) */ -#define _DW(macro) do {macro} while (0) #endif diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index ac10e0620..b39255f0c 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -8684,8 +8684,9 @@ SECTIONS ovl_En_Ending_Hero5 : AT(RomLocation) { build/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.o(.text) - build/asm/ovl_En_Ending_Hero5_data.o(.data) - build/asm/ovl_En_Ending_Hero5_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.o(.data) + build/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.o(.rodata) + build/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index e79920d10..4740bf809 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -28,6 +28,15 @@ D_060011E0 = 0x060011E0; D_06000288 = 0x06000288; D_060019B4 = 0x060019B4; +/* z_en_ending_hero5 */ +D_0600A850 = 0x0600A850; +D_06002FA0 = 0x06002FA0; +D_060070C0 = 0x060070C0; +D_06006FB0 = 0x06006FB0; +D_06006E80 = 0x06006E80; +D_06006D70 = 0x06006D70; +D_0600A390 = 0x0600A390; + /* z_bg_market_step */ D_0601F050 = 0x0601F050; D_06018DA0 = 0x06018DA0; diff --git a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c index 65c71594c..f9ad9caa1 100644 --- a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c +++ b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c @@ -9,7 +9,9 @@ void EnEndingHero5_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnEndingHero5_Update(Actor* thisx, GlobalContext* globalCtx); void EnEndingHero5_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void func_80C23980(EnEndingHero5* this); +void func_80C2399C(EnEndingHero5* this, GlobalContext* globalCtx); + const ActorInit En_Ending_Hero5_InitVars = { ACTOR_EN_ENDING_HERO5, ACTORTYPE_NPC, @@ -21,18 +23,91 @@ const ActorInit En_Ending_Hero5_InitVars = { (ActorFunc)EnEndingHero5_Update, (ActorFunc)EnEndingHero5_Draw }; -*/ -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/EnEndingHero5_Init.asm") +extern SkeletonHeader D_0600A850; +extern AnimationHeader D_06002FA0; -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/EnEndingHero5_Destroy.asm") +extern Gfx D_060070C0[]; +extern Gfx D_06006FB0[]; +extern Gfx D_06006E80[]; +extern Gfx D_06006D70[]; +extern Gfx D_0600A390[]; -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/func_80C23980.asm") +void EnEndingHero5_Init(Actor* thisx, GlobalContext* globalCtx) { + EnEndingHero5* this = THIS; -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/func_80C2399C.asm") + this->actor.unkA0.mass = 0xFF; + Actor_SetScale(&this->actor, 0.01f); + this->actor.unk1F = 6; + this->actor.gravity = -3.0f; + SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_0600A850, &D_06002FA0, this->limbDrawTable, + this->transitionDrawTable, 17); + Actor_SetDrawParams(&this->actor.shape, 0.0f, func_800B3FC0, 25.0f); + this->unk25C = this->actor.params; + func_80C23980(this); +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/EnEndingHero5_Update.asm") +void EnEndingHero5_Destroy(Actor* thisx, GlobalContext* globalCtx) { +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/func_80C23A30.asm") +void func_80C23980(EnEndingHero5* this) { + this->unk258 = 1; + this->actionFunc = func_80C2399C; +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Ending_Hero5_0x80C238C0/EnEndingHero5_Draw.asm") +void func_80C2399C(EnEndingHero5* this, GlobalContext* globalCtx) { + SkelAnime_FrameUpdateMatrix(&this->skelAnime); +} + +void EnEndingHero5_Update(Actor* thisx, GlobalContext* globalCtx) { + EnEndingHero5* this = THIS; + + this->actionFunc(this, globalCtx); + Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor); + func_800B78B8(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D); +} + +Gfx* D_80C23BF0[] = { D_060070C0, D_06006FB0, D_06006E80, D_06006D70, D_0600A390 }; + +void func_80C23A30(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + EnEndingHero5* this = THIS; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + if (limbIndex == 15) { + gSPDisplayList(oGfxCtx->polyOpa.p++, D_80C23BF0[this->unk25C]); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void EnEndingHero5_Draw(Actor* thisx, GlobalContext* globalCtx) { + EnEndingHero5* this = THIS; + + func_8012C28C(globalCtx->state.gfxCtx); + func_8012C2DC(globalCtx->state.gfxCtx); + OPEN_DISPS(globalCtx->state.gfxCtx); + + switch (this->unk25C) { + case 0: + gDPSetEnvColor(oGfxCtx->polyOpa.p++, 170, 10, 70, 255); + break; + case 1: + gDPSetEnvColor(oGfxCtx->polyOpa.p++, 170, 200, 255, 255); + break; + case 2: + gDPSetEnvColor(oGfxCtx->polyOpa.p++, 0, 230, 70, 255); + break; + case 3: + gDPSetEnvColor(oGfxCtx->polyOpa.p++, 200, 0, 150, 255); + break; + case 4: + gDPSetEnvColor(oGfxCtx->polyOpa.p++, 245, 155, 0, 255); + break; + } + + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount, NULL, + func_80C23A30, &this->actor); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h index 110db38f4..4c809d8d9 100644 --- a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h +++ b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.h @@ -5,9 +5,16 @@ struct EnEndingHero5; +typedef void (*EnEndingHero5ActionFunc)(struct BgHakaCurtain*, GlobalContext*); + typedef struct EnEndingHero5 { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x11C]; + /* 0x144 */ SkelAnime skelAnime; + /* 0x188 */ Vec3s limbDrawTable[17]; + /* 0x1EE */ Vec3s transitionDrawTable[17]; + /* 0x254 */ EnEndingHero5ActionFunc actionFunc; + /* 0x258 */ u16 unk258; + /* 0x25C */ s32 unk25C; } EnEndingHero5; // size = 0x260 extern const ActorInit En_Ending_Hero5_InitVars;