From f383e269290dcc3a795eef0c38974a39d58b6f2d Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Tue, 26 Dec 2023 12:31:14 -0600 Subject: [PATCH] Decompile wipe.c --- config/GMPE01_00/splits.txt | 7 +- config/GMPE01_00/symbols.txt | 16 +- configure.py | 2 +- include/common_structs.h | 10 - include/dolphin/gx/GXVert.h | 5 + include/functions.h | 3 - include/game/wipe.h | 42 ++++ include/variables.h | 1 - src/REL/subchrselDll/subchrselDll.c | 1 + src/REL/w10Dll/w10Dll4.c | 1 + src/game/audio.c | 6 +- src/game/wipe.c | 327 ++++++++++++++++++++++++++++ 12 files changed, 390 insertions(+), 31 deletions(-) create mode 100644 include/game/wipe.h create mode 100644 src/game/wipe.c diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index 8129c895..2b6aaec9 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -225,16 +225,17 @@ game/ShapeExec.c: .text start:0x80040D60 end:0x80041170 .sdata2 start:0x801D4ED0 end:0x801D4EE0 +dolphin/os/__start.c: + .init start:0x80003100 end:0x80003354 + game/wipe.c: .text start:0x80041170 end:0x8004207C .data start:0x80130120 end:0x80130138 .bss start:0x80192360 end:0x801923C0 .sdata start:0x801D35E0 end:0x801D35E8 + .sbss start:0x801D3DA8 end:0x801D3DB0 .sdata2 start:0x801D4EE0 end:0x801D4F08 -dolphin/os/__start.c: - .init start:0x80003100 end:0x80003354 - game/window.c: .text start:0x8004207C end:0x800483A0 .data start:0x80130140 end:0x80130688 diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 8886b70d..b38ae2cf 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5047,8 +5047,8 @@ lbl_8012FDBF = .data:0x8012FDBF; // type:object size:0xF data:string lbl_8012FDCE = .data:0x8012FDCE; // type:object size:0x12 _ovltbl = .data:0x8012FDE0; // type:object size:0x320 lbl_80130100 = .data:0x80130100; // type:object size:0x20 -lbl_80130120 = .data:0x80130120; // type:object size:0xC -lbl_8013012C = .data:0x8013012C; // type:object size:0xC +fadeInFunc = .data:0x80130120; // type:object size:0xC scope:local +fadeOutFunc = .data:0x8013012C; // type:object size:0xC scope:local spcFontTbl = .data:0x80130140; // type:object size:0x170 scope:local charWETbl = .data:0x801302B0; // type:object size:0x130 charWJTbl = .data:0x801303E0; // type:object size:0x140 @@ -5737,14 +5737,8 @@ lbl_801D35C0 = .sdata:0x801D35C0; // type:object size:0x8 lbl_801D35C8 = .sdata:0x801D35C8; // type:object size:0x8 lbl_801D35D0 = .sdata:0x801D35D0; // type:object size:0x8 lbl_801D35D8 = .sdata:0x801D35D8; // type:object size:0x8 -lbl_801D35E0 = .sdata:0x801D35E0; // type:object size:0x1 data:byte -lbl_801D35E1 = .sdata:0x801D35E1; // type:object size:0x1 data:byte -lbl_801D35E2 = .sdata:0x801D35E2; // type:object size:0x1 data:byte -lbl_801D35E3 = .sdata:0x801D35E3; // type:object size:0x1 data:byte -lbl_801D35E4 = .sdata:0x801D35E4; // type:object size:0x1 data:byte -lbl_801D35E5 = .sdata:0x801D35E5; // type:object size:0x1 data:byte -lbl_801D35E6 = .sdata:0x801D35E6; // type:object size:0x1 data:byte -lbl_801D35E7 = .sdata:0x801D35E7; // type:object size:0x1 data:byte +colorN$400 = .sdata:0x801D35E0; // type:object size:0x4 data:byte +colorN$444 = .sdata:0x801D35E4; // type:object size:0x4 data:byte winPrio = .sdata:0x801D35E8; // type:object size:0x8 data:2byte lbl_801D35F0 = .sdata:0x801D35F0; // type:object size:0x8 lbl_801D35F8 = .sdata:0x801D35F8; // type:object size:0x8 @@ -6173,7 +6167,7 @@ SeqDone = .sbss:0x801D3D95; // type:object size:0x1 scope:local data:byte SeqTimer = .sbss:0x801D3D96; // type:object size:0x2 scope:local data:2byte gid = .sbss:0x801D3D98; // type:object size:0x8 scope:local data:2byte lbl_801D3DA0 = .sbss:0x801D3DA0; // type:object size:0x8 -lbl_801D3DA8 = .sbss:0x801D3DA8; // type:object size:0x8 data:4byte +wipeFadeInF = .sbss:0x801D3DA8; // type:object size:0x8 data:4byte fontAnim = .sbss:0x801D3DB0; // type:object size:0x4 data:4byte LanguageNo = .sbss:0x801D3DB4; // type:object size:0x1 scope:local data:byte comKeyIdx = .sbss:0x801D3DB6; // type:object size:0x2 scope:local data:2byte diff --git a/configure.py b/configure.py index 40f39796..694a9610 100644 --- a/configure.py +++ b/configure.py @@ -266,7 +266,7 @@ config.libs = [ Object(NonMatching, "game/code_8003FF68.c"), Object(NonMatching, "game/ClusterExec.c"), Object(NonMatching, "game/ShapeExec.c"), - Object(NonMatching, "game/wipe.c"), + Object(Matching, "game/wipe.c"), Object(Matching, "game/window.c"), Object(Matching, "game/messdata.c"), Object(NonMatching, "game/card.c"), diff --git a/include/common_structs.h b/include/common_structs.h index 07f38d61..e4db9271 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -12,16 +12,6 @@ typedef struct player_config { s16 iscom; } PlayerConfig; -typedef struct wipe_state { - char unk00[0x30]; - float unk30; - float duration; - char unk38[0x11]; - u8 unk49; - char unk4A[2]; -} WipeState; - - typedef struct system_state { /* 0x00 */ struct { u16 story : 1; diff --git a/include/dolphin/gx/GXVert.h b/include/dolphin/gx/GXVert.h index 91edb229..e3ababdd 100644 --- a/include/dolphin/gx/GXVert.h +++ b/include/dolphin/gx/GXVert.h @@ -86,6 +86,11 @@ static inline void GXPosition2f32(const f32 x, const f32 y) { GXWGFifo.f32 = y; } +static inline void GXPosition2u16(const u16 x, const u16 y) { + GXWGFifo.u16 = x; + GXWGFifo.u16 = y; +} + static inline void GXPosition2s16(const s16 x, const s16 y) { GXWGFifo.s16 = x; GXWGFifo.s16 = y; diff --git a/include/functions.h b/include/functions.h index ba2d1180..91099844 100644 --- a/include/functions.h +++ b/include/functions.h @@ -13,9 +13,6 @@ void Hu3DCameraPerspectiveSet(s32, f32, f32, f32, f32); void Hu3DCameraViewportSet(s32, f32, f32, f32, f32, f32, f32); void HuAudFadeOut(s32 arg0); -void WipeCreate(char dir, char type, short duration); -u8 WipeStatGet(void); - void Hu3DModelPosSet(s16 index, float x, float y, float z); void Hu3DModelRotSet(s16 index, float x, float y, float z); void Hu3DModelScaleSet(s16 index, float x, float y, float z); diff --git a/include/game/wipe.h b/include/game/wipe.h new file mode 100644 index 00000000..7d45a8cb --- /dev/null +++ b/include/game/wipe.h @@ -0,0 +1,42 @@ +#ifndef _GAME_WIPE_H +#define _GAME_WIPE_H + +#include "dolphin.h" + +#define WIPE_TYPE_NORMAL 0 +#define WIPE_TYPE_CROSS 1 +#define WIPE_TYPE_DUMMY 2 +#define WIPE_MODE_IN 1 +#define WIPE_MODE_OUT 2 +#define WIPE_MODE_BLANK 3 + +typedef struct wipe_state { + u32 unk00; + u32 unk04; + void *copy_data; + u32 unk0C; + void *unk10[8]; + float time; + float duration; + u32 unk38; + u16 w; + u16 h; + u16 x; + u16 y; + GXColor color; + volatile u8 type; + u8 mode; + u8 stat; + u8 keep_copy; +} WipeState; + +void WipeInit(GXRenderModeObj *rmode); +void WipeExecAlways(void); +void WipeCreate(s16 mode, s16 type, s16 duration); +void WipeColorSet(u8 r, u8 g, u8 b); +u8 WipeStatGet(void); + +extern WipeState wipeData; +extern BOOL wipeFadeInF; + +#endif \ No newline at end of file diff --git a/include/variables.h b/include/variables.h index 4bd9c0ca..fdb9b433 100644 --- a/include/variables.h +++ b/include/variables.h @@ -4,7 +4,6 @@ #include "dolphin.h" #include "common_structs.h" -extern WipeState wipeData; extern PlayerConfig GWPlayerCfg[4]; diff --git a/src/REL/subchrselDll/subchrselDll.c b/src/REL/subchrselDll/subchrselDll.c index e945bf6f..bf25b9c5 100644 --- a/src/REL/subchrselDll/subchrselDll.c +++ b/src/REL/subchrselDll/subchrselDll.c @@ -2,6 +2,7 @@ #include "game/object.h" #include "game/printfunc.h" #include "game/pad.h" +#include "game/wipe.h" #include "math.h" diff --git a/src/REL/w10Dll/w10Dll4.c b/src/REL/w10Dll/w10Dll4.c index 180ca388..4f0376d9 100644 --- a/src/REL/w10Dll/w10Dll4.c +++ b/src/REL/w10Dll/w10Dll4.c @@ -1,6 +1,7 @@ #include "REL/w10Dll.h" #include "game/pad.h" #include "game/data.h" +#include "game/wipe.h" char lbl_1_data_98[] = "@@@@@@@@@@@@@@ Tutorial Exit @@@@@@@@@@@@@@\n\000"; diff --git a/src/game/audio.c b/src/game/audio.c index c5347cb0..07a75580 100644 --- a/src/game/audio.c +++ b/src/game/audio.c @@ -2,6 +2,8 @@ #include "game/memory.h" #include "game/msm.h" #include "game/object.h" +#include "game/wipe.h" + typedef struct { /* 0x00 */ s16 unk00; @@ -109,9 +111,9 @@ void HuAudFadeOut(s32 arg0) { } s32 HuAudFXPlay(s32 arg0) { - WipeState *temp_r31 = &wipeData; + WipeState *wipe = &wipeData; - if (omSysExitReq != 0 || (wipeData.unk49 == 2 && temp_r31->unk30 / temp_r31->duration > 0.5)) { + if (omSysExitReq != 0 || (wipeData.mode == WIPE_MODE_OUT && wipe->time / wipe->duration > 0.5)) { return 0; } return HuAudFXPlayVolPan(arg0, 0x7F, 0x40); diff --git a/src/game/wipe.c b/src/game/wipe.c new file mode 100644 index 00000000..087c1260 --- /dev/null +++ b/src/game/wipe.c @@ -0,0 +1,327 @@ +#include "dolphin.h" +#include "game/wipe.h" +#include "game/memory.h" + +extern s8 lbl_801D429C; + +s16 HuSysVWaitGet(s16 old); + +typedef int (*fadeFunc)(void); + +WipeState wipeData; +BOOL wipeFadeInF; + +static void WipeColorFill(GXColor color); +static void WipeFrameStill(GXColor color); + + +static int WipeNormalFade(void); +static int WipeCrossFade(void); +static int WipeDummyFade(void); + +static fadeFunc fadeInFunc[3] = { WipeNormalFade, WipeCrossFade, WipeDummyFade }; +static fadeFunc fadeOutFunc[3] = { WipeNormalFade, WipeCrossFade, WipeDummyFade }; + +void WipeInit(GXRenderModeObj *rmode) +{ + WipeState *wipe; + int i; + wipe = &wipeData; + wipe->unk00 = 0; + wipe->unk04 = 0; + wipe->copy_data = NULL; + wipe->stat = WIPE_TYPE_NORMAL; + wipe->mode = WIPE_MODE_BLANK; + wipe->type = 0; + wipe->keep_copy = 0; + for(i=0; i<8; i++) { + wipe->unk10[i] = NULL; + } + wipe->color.r = wipe->color.g = wipe->color.b = wipe->color.a = 0; + wipe->w = rmode->fbWidth; + wipe->h = rmode->efbHeight; + wipe->x = 0; + wipe->y = 0; +} + +void WipeExecAlways(void) +{ + int i; + WipeState *wipe; + wipe = &wipeData; + switch(wipe->mode) { + case WIPE_MODE_BLANK: + wipe->type; + wipe->color.a = 255; + if(wipe->copy_data) { + WipeFrameStill(wipe->color); + } else { + WipeColorFill(wipe->color); + } + break; + + case WIPE_MODE_IN: + if(wipe->type < WIPE_TYPE_DUMMY) { + wipe->stat = fadeInFunc[wipe->type](); + } else { + wipe->stat = 0; + } + wipe->time += HuSysVWaitGet(0); + if(wipe->stat) { + return; + } + if(wipe->copy_data) { + if(!wipe->keep_copy) { + HuMemDirectFree(wipe->copy_data); + } + wipe->copy_data = NULL; + } + + for(i=0; i<8; i++) { + if(wipe->unk10[i] != NULL) { + HuMemDirectFree(wipe->unk10[i]); + wipe->unk10[i] = NULL; + } + } + wipe->unk0C = 0; + wipe->time = 0; + wipe->mode = 0; + break; + + case WIPE_MODE_OUT: + if(wipe->type < WIPE_TYPE_DUMMY) { + wipe->stat = fadeOutFunc[wipe->type](); + } else { + wipe->stat = 0; + } + wipe->time += HuSysVWaitGet(0); + if(wipe->stat) { + return; + } + wipe->time = 0; + wipe->mode = WIPE_MODE_BLANK; + break; + + case 0: + break; + } +} + +void WipeCreate(s16 mode, s16 type, s16 duration) +{ + WipeState *wipe; + if(_CheckFlag(0x1000B) && lbl_801D429C) { + return; + } + wipe = &wipeData; + if(wipe->stat) { + return; + } + if(mode == WIPE_MODE_IN || mode == WIPE_MODE_OUT) { + if(mode == WIPE_MODE_IN) { + wipeFadeInF = TRUE; + } + wipe->mode = mode; + wipe->stat = 1; + if(type >= 0) { + wipe->type = type; + } + if(duration > 0) { + wipe->duration = duration; + } else { + if(mode == WIPE_MODE_IN) { + wipe->duration = 30.0f; + } else { + wipe->duration = 30.0f; + } + } + wipe->time = 0; + } +} + +void WipeColorSet(u8 r, u8 g, u8 b) +{ + wipeData.color.r = r; + wipeData.color.g = g; + wipeData.color.b = b; +} + +u8 WipeStatGet(void) +{ + return wipeData.stat; +} + +static int WipeDummyFade(void) +{ + return 0; +} + +static int WipeNormalFade(void) +{ + u8 alpha; + WipeState *wipe = &wipeData; + if(wipe->duration == 0) { + return 0; + } + alpha = (wipe->time/wipe->duration)*255.0f; + switch(wipe->mode) { + case WIPE_MODE_IN: + wipe->color.a = 255-alpha; + break; + + case WIPE_MODE_OUT: + wipe->color.a = alpha; + break; + + default: + return 0; + } + WipeColorFill(wipe->color); + if(wipe->time >= wipe->duration) { + return 0; + } else { + return 1; + } +} + +static void WipeColorFill(GXColor color) +{ + static GXColor colorN = { 0xFF, 0xFF, 0xFF, 0xFF }; + Mtx44 proj; + Mtx modelview; + WipeState *wipe; + u16 ulx, lrx, uly, lry; + wipe = &wipeData; + ulx = (int)wipe->x; + lrx = wipe->x+wipe->w; + uly = (int)wipe->y; + lry = wipe->x+wipe->h+1; + MTXOrtho(proj, uly, lry, ulx, lrx, 0, 10); + GXSetProjection(proj, GX_ORTHOGRAPHIC); + MTXIdentity(modelview); + GXLoadPosMtxImm(modelview, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + GXSetViewport(0, 0, wipe->w, wipe->h+1, 0, 1); + GXSetScissor(0, 0, wipe->w, wipe->h+1); + GXClearVtxDesc(); + GXSetChanMatColor(GX_COLOR0A0, color); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_U16, 0); + GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); + GXSetAlphaUpdate(GX_FALSE); + GXSetColorUpdate(GX_TRUE); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition2u16(ulx, uly); + GXPosition2u16(lrx, uly); + GXPosition2u16(lrx, lry); + GXPosition2u16(ulx, lry); + GXEnd(); + GXSetChanMatColor(GX_COLOR0A0, colorN); +} + +static int WipeCrossFade(void) +{ + u32 size; + u8 alpha; + WipeState *wipe = &wipeData; + if(wipe->duration == 0) { + return 0; + } + if(wipe->copy_data == NULL) { + size = GXGetTexBufferSize(wipe->w, wipe->h, GX_TF_RGB565, GX_FALSE, 0); + wipe->copy_data = HuMemDirectMallocNum(HEAP_DATA, size, 0x20000000); + GXSetTexCopySrc(wipe->x, wipe->y, wipe->w, wipe->h); + GXSetTexCopyDst(wipe->w, wipe->h, GX_TF_RGB565, GX_FALSE); + GXCopyTex(wipe->copy_data, GX_FALSE); + DCStoreRangeNoSync(wipe->copy_data, size); + } + alpha = (wipe->time/wipe->duration)*255.0f; + switch(wipe->mode) { + case WIPE_MODE_IN: + wipe->color.a = 255-alpha; + break; + + case WIPE_MODE_OUT: + wipe->color.a = alpha; + break; + + default: + return 0; + } + WipeFrameStill(wipe->color); + if(wipe->time >= wipe->duration) { + return 0; + } else { + return 1; + } +} + +static void WipeFrameStill(GXColor color) +{ + GXTexObj tex; + static GXColor colorN = { 0xFF, 0xFF, 0xFF, 0xFF }; + Mtx44 proj; + Mtx modelview, temp; + WipeState *wipe; + u16 ulx, lrx, uly, lry; + wipe = &wipeData; + ulx = (int)wipe->x; + lrx = wipe->x+wipe->w; + uly = (int)wipe->y; + lry = wipe->x+wipe->h+1; + MTXOrtho(proj, uly, lry, ulx, lrx, 0, 10); + GXSetProjection(proj, GX_ORTHOGRAPHIC); + MTXIdentity(modelview); + GXLoadPosMtxImm(modelview, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + GXSetViewport(0, 0, wipe->w, wipe->h+1, 0, 1); + GXSetScissor(0, 0, wipe->w, wipe->h+1); + GXClearVtxDesc(); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, 1, GX_DF_CLAMP, GX_AF_SPOT); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE); + + GXSetNumTevStages(2); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_C0, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_APREV, GX_CA_A0, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevColor(GX_TEVSTAGE1, color); + GXSetChanAmbColor(GX_COLOR0A0, colorN); + GXSetChanMatColor(GX_COLOR0A0, colorN); + GXInitTexObj(&tex, wipe->copy_data, wipe->w, wipe->h, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); + GXLoadTexObj(&tex, GX_TEXMAP0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_U16, 0); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + MTXIdentity(temp); + GXLoadPosMtxImm(temp, GX_PNMTX0); + GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); + GXSetAlphaUpdate(GX_FALSE); + GXSetColorUpdate(GX_TRUE); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition2u16(ulx, uly); + GXTexCoord2f32(0, 0); + GXPosition2u16(lrx, uly); + GXTexCoord2f32(1, 0); + GXPosition2u16(lrx, lry); + GXTexCoord2f32(1, 1); + GXPosition2u16(ulx, lry); + GXTexCoord2f32(0, 1); + GXEnd(); + GXSetChanMatColor(GX_COLOR0A0, colorN); +} \ No newline at end of file