diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index e57f796..a56f4f5 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -9,7 +9,9 @@ "_DEBUG", "UNICODE", "_UNICODE", - "_LANGUAGE_C" + "_LANGUAGE_C", + "DVERSION_US", + "DTARGET_N64" ] } ], diff --git a/patches/debug.c b/patches/debug.c index 70dcabb..d1dcc69 100644 --- a/patches/debug.c +++ b/patches/debug.c @@ -828,4 +828,72 @@ RECOMP_PATCH int MusHandleAsk(musHandle handle) { } return (count); } -#endif \ No newline at end of file +#endif + +#if DEBUG_SKIP_INTRO_CUTSCENES == 1 +/*80001D44*/ +RECOMP_PATCH void func_80001D44(void) +{ + s16 i; + s16 width; + s16 height; + + cache1d_8002AAC0(); + MusStop(1 | 2, 0); + switch (gGraphicsOption) + { + case 0: + width = 320; + height = 240; + break; + case 1: + width = 320; + height = 240*2; + break; + case 2: + width = 512; + height = 384; + break; + } + D_8012C470 = D_801CDC64.unk1; + if (D_801CDC64.unk1 == 0) + { + D_8012C470 = 1; + } + for (i = 0; i < D_8012C470; i++) + { + func_80000F68(i); + func_80095390(i); + } + D_800DEEA0 = 0; + if ((u32)osMemSize > 0x400000U) + { + D_800DEEA0 = 1; + gDisplayListMaxSize = 0xA000; + gVertexN64MaxSize = 0x6000; + } + else if (D_8012C470 < 2) + { + gDisplayListMaxSize = DISPLAY_LIST_SIZE*2; + gVertexN64MaxSize = 0x1800; + } + else + { + gDisplayListMaxSize = DISPLAY_LIST_SIZE*3; + gVertexN64MaxSize = 0x2400; + } + allocMemory(width, height, gDisplayListMaxSize, gVertexN64MaxSize); + func_8001F928(width, height); + _red_000BDFEC = 0; + _green_000BDFED = 0; + _blue_000BDFEE = 0; + D_800BD3E8 = 1; + D_801A1970 = 1; + func_80000DDC(); + _clearDepthBuffer(); + + // @recomp: skip level intro cutscenes + // D_800DF585 = 0; + D_800DF585 = 1; +} +#endif diff --git a/patches/debug.h b/patches/debug.h index 3d6b34e..17a33dd 100644 --- a/patches/debug.h +++ b/patches/debug.h @@ -5,5 +5,6 @@ // Not working #define DEBUG_SKIP_INTRO 0 +#define DEBUG_SKIP_INTRO_CUTSCENES 0 #endif \ No newline at end of file diff --git a/patches/externs.h b/patches/externs.h index 2b54c60..07cf8db 100644 --- a/patches/externs.h +++ b/patches/externs.h @@ -1887,12 +1887,146 @@ extern s32 _arg6_0000FC17; // s32 *file_no extern s32 D_800FE408; extern u8 D_800FA2FC_0000FBFB; extern OSContStatus _statusData_0000F62F[4]; -extern channel_t *mus_channels_0000FCCB; +extern channel_t* mus_channels_0000FCCB; extern int max_channels_0000FCC3; +extern OSMesg _dmaMessages[256]; +extern OSMesgQueue gDmaMessageQ; +extern Addr code1_VRAM; +extern u8* D_80197D4C; +extern u8* D_8010571C; +extern u32 D_80138818; +extern u8* gStaticSegment; +extern Addr code1_VRAM_END; +extern Addr static_ROM_END; +extern Addr static_ROM_START; +extern u8* gCacheMemStart; +extern Addr code1_TEXT_START; +extern Addr code1_ROM_END; +extern Addr code1_TEXT_END; +extern Addr code1_ROM_START; +extern Addr code1_BSS_START; +extern Addr code1_BSS_END; +extern TileInfo* gpTileInfo; +extern TileInfo gTileInfo[1976]; +extern char*** gpKeyStrInfo; +extern ObjectiveStrInfo* gpObjectiveStrInfo; +extern char** gKeyStrInfo[24]; +extern ObjectiveStrInfo gObjectiveStrInfo[24]; +extern u8 gTileInfo_STATIC_START[]; +extern u8 gKeyStrInfo_STATIC_START[]; +extern u8 gObjectiveStrInfo_STATIC_START[]; +extern u8 gWeaponStrInfoCount_STATIC_START[]; +extern u8 gWeaponStrInfo_STATIC_START[]; +extern u8 gSinTable_STATIC_START[]; +extern u8 gRadarang_STATIC_START[]; +extern u8 gMapInfo_STATIC_START[]; +extern u8 gAlphaPalette_STATIC_START[]; +extern u8 gGlobalPalette_STATIC_START[]; +extern u8 D_01025BA0_STATIC_START[]; +extern u8 D_01025CFC_STATIC_START[]; +extern u8 gActionStrInfoCount_STATIC_START[]; +extern u8 gMapStrInfo_STATIC_START[]; +extern u8 gActionStrInfo_STATIC_START[]; +extern u8 D_01026910_STATIC_START[]; +extern u8 D_0102583C_STATIC_START[]; +extern u8 D_01024590_STATIC_START[]; +extern u8 D_010245E8_STATIC_START[]; +extern u8 D_0102464C_STATIC_START[]; +extern u8 D_0102578C_STATIC_START[]; +extern u8 gLicenceStrInfoCount_STATIC_START[]; +extern u8 D_010247AC_STATIC_START[]; +extern u8 D_01025734_STATIC_START[]; +extern u8 D_01025840_STATIC_START[]; +extern u8 D_010258D8_STATIC_START[]; +extern u8 D_01025908_STATIC_START[]; +extern u8 D_01025968_STATIC_START[]; +extern u8 D_01022510_STATIC_START[]; +extern u8 D_01022790_STATIC_START[]; +extern u8 gLicenceStrInfo_STATIC_START[]; +extern u8 gCreditStrInfoCount_STATIC_START[]; +extern u8 gCreditStrInfo_STATIC_START[]; +extern u8 gControlPreset_STATIC_START[]; +extern /*80137DE4*/ char** gpWeaponStrInfo; +extern /*801A68CC*/ char** gpMapStrInfo; +extern char* gMapStrInfo[24]; +extern s16* gpSinTable; +extern s16* gpRadaRang; +extern s16 D_01025CFC; +extern _11B300UnkStruct1 D_01025BA0[0x1D]; +extern MapInfo* gpMapInfo; +extern char** gpActionStrInfo; +extern _11D520UnkStruct1* D_801ACBD8; +extern _11D520UnkStruct1 D_01026910[31]; +extern code1UnkStruct4 D_801CDC64; +extern s32 D_800DEEA0; +extern s32 D_801A1970; +extern u8 D_800DF585; +extern s16* D_801AE8F0; +extern s16* D_80197DE8; +extern _11B300UnkStruct2* D_801C0D70; +extern s16** D_80129808; +extern s16* D_801AD474; +extern s16* D_80105550; +extern s16* D_800FF528; +extern s16* D_8013F920; +extern s16* D_8012DF00; +extern s16* D_8012E150; +extern char** gpLicenceStrInfo; +extern char** gpCreditStrInfo; +extern _119280UnkStruct1* D_801CE5E8; +extern u8* D_80138778; +extern ControlMapping* gpControlPreset; +extern OSSched gScheduler; +extern u64 _schedulerStack_0000A50F[1024]; +extern u8 _viMode_0000C937; +extern s32 _framebufferCount_000BDFD0; +extern s32 D_800BD3FC_000BDFFC; +extern s32 D_80119A5C; +extern s32 gGfxTaskIndex; +extern s32 D_800BD428_000BE028; +extern s64 D_80138788; +extern volatile s64 D_800FE9E0; +extern s64 D_801AE498; +extern s32 D_800BD3F0_000BDFF0; +extern u8 D_801B0815; +extern OSMesgQueue D_8010A920; +extern OSMesg D_801C0D64; +extern OSMesgQueue _retraceMsgQ; +extern OSMesg _retraceMessages[256]; +extern OSScClient _retraceClient_0000C50F; +extern u8 D_800DEDE0; +extern OSThread _viLoopThread_0000935F; +extern u64 _viLoopThreadStack_0000950F[512]; +extern code1UnkStruct7 D_801CC930 __attribute__((aligned(16))); +extern s64 D_800BD3E0_000BDFE0; float sinf(float angle); float cosf(float angle); +void func_80000F00(void); +void func_80001AF8(void); +void func_800017AC(void); +void loadMap(s32 mapnum); +void func_801C9E7C(void); +void func_801C9B48(void); +void func_80002494(void); +void func_8000071C(void); +void main_80001CFC(void); +void engine_8002B680(void); +void func_800356EC(void); +void main_80000A94(void); +void controller_8008A3EC(char*, code1UnkStruct3*, s32); +u8 controller_8008AD94(void); +void configInitialize(void); +void readRom(u8* segStart, u8* romStart, s32 size); +void _viLoop(void*); +void _createGfxTask(void); +void func_80095390(s16 playernum); +void func_80000F68(s16 playernum); +void func_8001F928(s32, s32); +void func_80000DDC(void); +void _clearDepthBuffer(void); +void main_80000450(void); void func_80087A90(u8 contnum); void func_80087B00(u8 contnum); void func_80087B9C(u8 contnum); diff --git a/patches/gfx_patches.c b/patches/gfx_patches.c index 6c60464..11c0a6c 100644 --- a/patches/gfx_patches.c +++ b/patches/gfx_patches.c @@ -38,3 +38,557 @@ RECOMP_PATCH void func_80000DDC(void) { } } #endif + +// recomp_load_overlays(0xEB300, (u32*) 0x801C0D80, 0xBA70); + +#if 0 +/*80002548*/ +/* @theboy181 - 60fps render, fixed 30fps logic (frame-rate independent) */ +RECOMP_PATCH void mainLoop(void *arg) +{ + s16 i, j; + s16 *count; + s16 count2; + s32 *addr_; + s32 size; + ObjectiveStrInfo *msg_; + s32 offset_; + u8 *temp; + + recomp_load_overlays(0xEB300, (u32*) 0x801C0D80, 0xBA70); + + osCreateMesgQueue(&gDmaMessageQ, _dmaMessages, NUM_DMA_MSGS); + + D_80197D4C = code1_VRAM; + D_8010571C = (u8 *)main_80000450; + D_80138818 = (u32)(code1_VRAM - (u8 *)main_80000450) >> 10; + gStaticSegment = (u8 *)code1_VRAM_END; + size = static_ROM_END - static_ROM_START; + gCacheMemStart = (u8 *)((s32)(&gStaticSegment[size] + 0x3F) & ~0x3F); + + // osInvalICache(code1_TEXT_START, code1_TEXT_END - code1_TEXT_START); + readRom(code1_VRAM, code1_ROM_START, code1_ROM_END - code1_ROM_START); + Bmemset(code1_BSS_START, 0, code1_BSS_END - code1_BSS_START); + readRom(code1_VRAM_END, static_ROM_START, size); + + gpTileInfo = (TileInfo *)GET_STATIC_SEG_SYM(gTileInfo); + gpKeyStrInfo = (char ***)GET_STATIC_SEG_SYM(gKeyStrInfo); + gpObjectiveStrInfo = (ObjectiveStrInfo *)GET_STATIC_SEG_SYM(gObjectiveStrInfo); + + count = (s16 *)GET_STATIC_SEG_SYM(gWeaponStrInfoCount); + gpWeaponStrInfo = (char **)GET_STATIC_SEG_SYM(gWeaponStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpWeaponStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + gpMapStrInfo = (char **)GET_STATIC_SEG_SYM(gMapStrInfo); + + for (i = 0; i < ARRAY_COUNT(gMapStrInfo); i++) + { + s32 *addr = (s32 *)gpMapStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + i = 0; + addr_ = (s32 *)gpKeyStrInfo; + msg_ = gpObjectiveStrInfo; + offset_ = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + while (i < ARRAY_COUNT(gMapStrInfo)) + { + ObjectiveStrInfo *msg; + addr_[i] += offset_; + *(s32 *)&msg_[i].addr += offset_; + + for (j = 0; j < 17 - 1; j++) + { + s32 *addr = (s32 *)addr_[i]; + addr[j] += offset_; + } + + if (i) + { + } + msg = msg_; + for (j = 0; j < msg[i].count; j++) + { + s32 *addr = (s32 *)msg[i].addr; + addr[j] += offset_; + } + + i++; + } + + gpSinTable = (s16 *)GET_STATIC_SEG_SYM(gSinTable); + gpRadaRang = (s16 *)GET_STATIC_SEG_SYM(gRadarang); + gpGlobalPalette = (GlobalPalette *)GET_STATIC_SEG_SYM(gGlobalPalette); + gpAlphaPalette = (AlphaPalette *)GET_STATIC_SEG_SYM(gAlphaPalette); + D_8012F6E4 = (_11B300UnkStruct1 *)GET_STATIC_SEG_SYM(D_01025BA0); + count2 = *(s16 *)GET_STATIC_SEG_SYM(D_01025CFC); + D_80138780 = count2; + + temp = gStaticSegment; + for (i = 0; i < count2; i++) + { + _11B300UnkStruct1 *unk = (_11B300UnkStruct1 *)(temp + (s32)D_01025BA0_STATIC_START); + s32 offset = (s32)temp - STATIC_SEGMENT_VRAM; + *(s32 *)&unk[i].actor += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gActionStrInfoCount); + gpMapInfo = (MapInfo *)GET_STATIC_SEG_SYM(gMapInfo); + gpActionStrInfo = (char **)GET_STATIC_SEG_SYM(gActionStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpActionStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + D_801ACBD8 = (_11D520UnkStruct1 *)GET_STATIC_SEG_SYM(D_01026910); + + for (i = 0; i < ARRAY_COUNT(D_01026910); i++) + { + s32 *addr = (s32 *)D_801ACBD8; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i * 2] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(D_0102583C); + D_801AE8F0 = (s16 *)GET_STATIC_SEG_SYM(D_01024590); + D_80197DE8 = (s16 *)GET_STATIC_SEG_SYM(D_010245E8); + D_801C0D70 = (_11B300UnkStruct2 *)GET_STATIC_SEG_SYM(D_0102464C); + D_80129808 = (s16 **)GET_STATIC_SEG_SYM(D_0102578C); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)D_80129808; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gLicenceStrInfoCount); + D_801AD474 = (s16 *)GET_STATIC_SEG_SYM(D_010247AC); + D_80105550 = (s16 *)GET_STATIC_SEG_SYM(D_01025734); + D_800FF528 = (s32 *)GET_STATIC_SEG_SYM(D_01025840); + D_8013F920 = (s16 *)GET_STATIC_SEG_SYM(D_010258D8); + D_8012DF00 = (s16 *)GET_STATIC_SEG_SYM(D_01025908); + D_8012E150 = (s16 *)GET_STATIC_SEG_SYM(D_01025968); + gpLicenceStrInfo = (char **)GET_STATIC_SEG_SYM(gLicenceStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpLicenceStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gCreditStrInfoCount); + gpCreditStrInfo = (char **)GET_STATIC_SEG_SYM(gCreditStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpCreditStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + D_801CE5E8 = (_119280UnkStruct1 *)GET_STATIC_SEG_SYM(D_01022510); + D_80138778 = (u8 *)GET_STATIC_SEG_SYM(D_01022790); + gpControlPreset = (ControlMapping *)GET_STATIC_SEG_SYM(gControlPreset); + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 16; j++) + { + s32 *addr = (s32 *)gpControlPreset; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + *(addr + (i * 16) + j) += offset; + } + } + + allocMemory(SCREEN_WIDTH, SCREEN_HEIGHT, DISPLAY_LIST_SIZE * 2, 0); + osCreateScheduler(&gScheduler, &_schedulerStack_0000A50F[SCHEDULER_STACKSIZE / sizeof(u64)], 40, _viMode_0000C937, (u8)1); + osViBlack(1U); + osCreateThread(&_viLoopThread_0000935F, 7, _viLoop, arg, &_viLoopThreadStack_0000950F[VILOOP_STACKSIZE / sizeof(u64)], 20); + initAudio(); + configInitialize(); + controller_8008AD94(); + controller_8008A3EC("DUKE ZERO HOUR.A", &D_801CC930.unk0, sizeof(code1UnkStruct3)); + + switch (osTvType) + { + case OS_TV_PAL: D_801B0815 = 0; break; + case OS_TV_NTSC: D_801B0815 = 1; break; + case OS_TV_MPAL: D_801B0815 = 1; break; + } + + osCreateMesgQueue(&D_8010A920, &D_801C0D64, 1); + osCreateMesgQueue(&_retraceMsgQ, _retraceMessages, NUM_DMA_MSGS); + osScAddClient(&gScheduler, &_retraceClient_0000C50F, &_retraceMsgQ); + osStartThread(&_viLoopThread_0000935F); + main_80000A94(); + func_800356EC(); + engine_8002B680(); + main_80001CFC(); + main_80000450(); + func_8000071C(); + func_80002494(); + gLoadMapNum = 0; + + /* -------------------------------------------------------------- + Dynamic frame pacing: 60 Hz render, fixed 30 Hz logic + -------------------------------------------------------------- */ + { + const s32 LOGIC_HZ = 30; + s32 viHz = 60; + s32 viDelta; + s32 accumulator = 0; /* counts VI ticks */ + s32 ticksPerLogic = viHz / LOGIC_HZ; + + do + { + if (D_800DEDE0) + { + if (D_800DEDE0 == 2) + func_801C9B48(); + if (D_800DEDE0 == 3) + func_801C9E7C(); + if (D_800DEDE0 == 4) + { + D_800BD3E8 = 0; + main_80000610(); + D_800BD3F0_000BDFF0 = 0; + func_801C9B48(); + } + loadMap(gLoadMapNum); + D_800DEDE0 = 0; + D_801A1970 = 1; + } + + D_80138788 = D_800FE9E0; + viDelta = D_800FE9E0 - D_801AE498; + if (viDelta < 0) + viDelta = 0; + + accumulator += viDelta; + D_801AE498 = D_80138788; + + /* catch up logic if we fell behind */ + while (accumulator >= ticksPerLogic) + { + func_800017AC(); /* game logic @30Hz */ + accumulator -= ticksPerLogic; + } + + func_80001AF8(); + func_80000F00(); + + if (D_800BD3FC_000BDFFC != 0) + { + osRecvMesg(&D_8010A920, NULL, OS_MESG_BLOCK); + D_800BD3FC_000BDFFC = 0; + + if (D_80119A5C != 0) + D_80119A5C--; + + if (_framebufferCount_000BDFD0 < 3) + { + if (_retraceMsgQ.validCount >= _retraceMsgQ.msgCount) + osRecvMesg(&_retraceMsgQ, NULL, OS_MESG_BLOCK); + osRecvMesg(&_retraceMsgQ, NULL, OS_MESG_BLOCK); + } + } + + _createGfxTask(); + D_800BD3FC_000BDFFC = 1; + D_800BD428_000BE028 = gGfxTaskIndex; + gGfxTaskIndex ^= 1; + _framebufferIndex_000BE020++; + if (_framebufferIndex_000BE020 == _framebufferCount_000BDFD0) + _framebufferIndex_000BE020 = 0; + + } while (1); + } +} +#endif + +// Original function +#if 0 +RECOMP_PATCH void mainLoop(void *arg) +{ + s16 i, j; + s16 *count; + s16 count2; + s32 *addr_; + s32 size; + ObjectiveStrInfo *msg_; + s32 offset_; + u8 *temp; + + recomp_load_overlays(0xEB300, (u32*) 0x801C0D80, 0xBA70); + + osCreateMesgQueue(&gDmaMessageQ, _dmaMessages, NUM_DMA_MSGS); + + D_80197D4C = code1_VRAM; + D_8010571C = (u8 *)main_80000450; + D_80138818 = (u32)(code1_VRAM - (u8 *)main_80000450) >> 10; + gStaticSegment = (u8 *)code1_VRAM_END; + size = static_ROM_END - static_ROM_START; + gCacheMemStart = (u8 *)((s32)(&gStaticSegment[size] + 0x3F) & ~0x3F); + + osInvalICache(code1_TEXT_START, code1_TEXT_END - code1_TEXT_START); + readRom(code1_VRAM, code1_ROM_START, code1_ROM_END - code1_ROM_START); + Bmemset(code1_BSS_START, 0, code1_BSS_END - code1_BSS_START); + readRom(code1_VRAM_END, static_ROM_START, size); + + gpTileInfo = (TileInfo *)GET_STATIC_SEG_SYM(gTileInfo); + gpKeyStrInfo = (char ***)GET_STATIC_SEG_SYM(gKeyStrInfo); + gpObjectiveStrInfo = (ObjectiveStrInfo *)GET_STATIC_SEG_SYM(gObjectiveStrInfo); + + count = (s16 *)GET_STATIC_SEG_SYM(gWeaponStrInfoCount); + gpWeaponStrInfo = (char **)GET_STATIC_SEG_SYM(gWeaponStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpWeaponStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + gpMapStrInfo = (char **)GET_STATIC_SEG_SYM(gMapStrInfo); + + for (i = 0; i < ARRAY_COUNT(gMapStrInfo); i++) + { + s32 *addr = (s32 *)gpMapStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + i = 0; + addr_ = (s32 *)gpKeyStrInfo; + msg_ = gpObjectiveStrInfo; + offset_ = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + while (i < ARRAY_COUNT(gMapStrInfo)) + { + ObjectiveStrInfo *msg; + addr_[i] += offset_; + *(s32 *)&msg_[i].addr += offset_; + + for (j = 0; j < 17-1; j++) + { + s32 *addr = (s32 *)addr_[i]; + addr[j] += offset_; + } + + /*FAKEMATCH*/ + if (i) + { + } + msg = msg_; + for (j = 0; j < msg[i].count; j++) + { + s32 *addr = (s32 *)msg[i].addr; + addr[j] += offset_; + } + + i++; + } + + gpSinTable = (s16 *)GET_STATIC_SEG_SYM(gSinTable); + gpRadaRang = (s16 *)GET_STATIC_SEG_SYM(gRadarang); + gpGlobalPalette = (GlobalPalette *)GET_STATIC_SEG_SYM(gGlobalPalette); + gpAlphaPalette = (AlphaPalette *)GET_STATIC_SEG_SYM(gAlphaPalette); + D_8012F6E4 = (_11B300UnkStruct1 *)GET_STATIC_SEG_SYM(D_01025BA0); + count2 = *(s16 *)GET_STATIC_SEG_SYM(D_01025CFC); + D_80138780 = count2; + + temp = gStaticSegment; + for (i = 0; i < count2; i++) + { + /*FAKEMATCH*/ + _11B300UnkStruct1 *unk = (_11B300UnkStruct1 *)(temp + (s32)D_01025BA0_STATIC_START); + s32 offset = (s32)temp - STATIC_SEGMENT_VRAM; + *(s32 *)&unk[i].actor += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gActionStrInfoCount); + gpMapInfo = (MapInfo *)GET_STATIC_SEG_SYM(gMapInfo); + gpActionStrInfo = (char **)GET_STATIC_SEG_SYM(gActionStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpActionStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + D_801ACBD8 = (_11D520UnkStruct1 *)GET_STATIC_SEG_SYM(D_01026910); + + for (i = 0; i < ARRAY_COUNT(D_01026910); i++) + { + s32 *addr = (s32 *)D_801ACBD8; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i*2] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(D_0102583C); + D_801AE8F0 = (s16 *)GET_STATIC_SEG_SYM(D_01024590); + D_80197DE8 = (s16 *)GET_STATIC_SEG_SYM(D_010245E8); + D_801C0D70 = (_11B300UnkStruct2 *)GET_STATIC_SEG_SYM(D_0102464C); + D_80129808 = (s16 **)GET_STATIC_SEG_SYM(D_0102578C); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)D_80129808; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gLicenceStrInfoCount); + D_801AD474 = (s16 *)GET_STATIC_SEG_SYM(D_010247AC); + D_80105550 = (s16 *)GET_STATIC_SEG_SYM(D_01025734); + D_800FF528 = (s32 *)GET_STATIC_SEG_SYM(D_01025840); + D_8013F920 = (s16 *)GET_STATIC_SEG_SYM(D_010258D8); + D_8012DF00 = (s16 *)GET_STATIC_SEG_SYM(D_01025908); + D_8012E150 = (s16 *)GET_STATIC_SEG_SYM(D_01025968); + gpLicenceStrInfo = (char **)GET_STATIC_SEG_SYM(gLicenceStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpLicenceStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + count = (s16 *)GET_STATIC_SEG_SYM(gCreditStrInfoCount); + gpCreditStrInfo = (char **)GET_STATIC_SEG_SYM(gCreditStrInfo); + + for (i = 0; i < *count; i++) + { + s32 *addr = (s32 *)gpCreditStrInfo; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + addr[i] += offset; + } + + D_801CE5E8 = (_119280UnkStruct1 *)GET_STATIC_SEG_SYM(D_01022510); + D_80138778 = (u8 *)GET_STATIC_SEG_SYM(D_01022790); + gpControlPreset = (ControlMapping *)GET_STATIC_SEG_SYM(gControlPreset); + + for (i = 0; i < CONTROL_PRESET_NUM; i++) + { + for (j = 0; j < CONTROL_MAPPING_NUM; j++) + { + s32 *addr = (s32 *)gpControlPreset; + s32 offset = (s32)gStaticSegment - STATIC_SEGMENT_VRAM; + *(addr + (i*CONTROL_MAPPING_NUM) + j) += offset; + } + } + + allocMemory(SCREEN_WIDTH, SCREEN_HEIGHT, DISPLAY_LIST_SIZE*2, 0); + osCreateScheduler(&gScheduler, &_schedulerStack_0000A50F[SCHEDULER_STACKSIZE / sizeof(u64)], 40, _viMode_0000C937, (u8)1); + osViBlack(1U); + osCreateThread(&_viLoopThread_0000935F, 7, _viLoop, arg, &_viLoopThreadStack_0000950F[VILOOP_STACKSIZE / sizeof(u64)], 20); + initAudio(); + configInitialize(); + controller_8008AD94(); + controller_8008A3EC("DUKE ZERO HOUR.A", &D_801CC930.unk0, sizeof(code1UnkStruct3)); + switch (osTvType) + { + case OS_TV_PAL: + D_801B0815 = 0; + break; + case OS_TV_NTSC: + D_801B0815 = 1; + break; + case OS_TV_MPAL: + D_801B0815 = 1; + break; + } + + osCreateMesgQueue(&D_8010A920, &D_801C0D64, 1); + osCreateMesgQueue(&_retraceMsgQ, _retraceMessages, NUM_DMA_MSGS); + osScAddClient(&gScheduler, &_retraceClient_0000C50F, &_retraceMsgQ); + osStartThread(&_viLoopThread_0000935F); + main_80000A94(); + func_800356EC(); + engine_8002B680(); + main_80001CFC(); + main_80000450(); + func_8000071C(); + func_80002494(); + gLoadMapNum = 0; + + do + { + if (D_800DEDE0) + { + if (D_800DEDE0 == 2) + func_801C9B48(); + if (D_800DEDE0 == 3) + func_801C9E7C(); + if (D_800DEDE0 == 4) + { + D_800BD3E8 = 0; + main_80000610(); + D_800BD3F0_000BDFF0 = 0; + func_801C9B48(); + } + loadMap(gLoadMapNum); + D_800DEDE0 = 0; + D_801A1970 = 1; + } + + D_80138788 = D_800FE9E0; + D_800BD3E0_000BDFE0 += D_800FE9E0 - D_801AE498; + D_801CE5D8 += D_800FE9E0 - D_801AE498; + + if (D_800BD3E0_000BDFE0 > 8LL) + D_800BD3E0_000BDFE0 = 8LL; + + D_801AE498 = D_80138788; + + for (; D_800BD3E0_000BDFE0 > 2; D_800BD3E0_000BDFE0 -= 2) + func_800017AC(); + + if (D_800BD3E0_000BDFE0 >= 0) + { + func_800017AC(); + func_80001AF8(); + func_80000F00(); + + D_800BD3E0_000BDFE0 -= 2; + + if (D_800BD3FC_000BDFFC != 0) + { + osRecvMesg(&D_8010A920, NULL, OS_MESG_BLOCK); + D_800BD3FC_000BDFFC = 0; + + if (D_80119A5C != 0) + D_80119A5C--; + + if (_framebufferCount_000BDFD0 < 3) + { + if (_retraceMsgQ.validCount >= _retraceMsgQ.msgCount) + osRecvMesg(&_retraceMsgQ, NULL, OS_MESG_BLOCK); + + osRecvMesg(&_retraceMsgQ, NULL, OS_MESG_BLOCK); + } + } + _createGfxTask(); + D_800BD3FC_000BDFFC = 1; + D_800BD428_000BE028 = gGfxTaskIndex; + gGfxTaskIndex ^= 1; + _framebufferIndex_000BE020++; + if (_framebufferIndex_000BE020 == _framebufferCount_000BDFD0) + _framebufferIndex_000BE020 = 0; + } + yield_self(); + } while (1); +} +#endif \ No newline at end of file diff --git a/patches/misc_funcs.h b/patches/misc_funcs.h index 5066472..eaf41d5 100644 --- a/patches/misc_funcs.h +++ b/patches/misc_funcs.h @@ -4,6 +4,7 @@ #include "patch_helpers.h" DECLARE_FUNC(void, yield_self_1ms, void); +DECLARE_FUNC(void, yield_self, void); DECLARE_FUNC(void, recomp_load_overlays, u32 rom, void* ram, u32 size); DECLARE_FUNC(void, recomp_puts, const char* data, u32 size); DECLARE_FUNC(void, recomp_exit); diff --git a/patches/patches.h b/patches/patches.h index 27f354c..bf4d50c 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -14,6 +14,7 @@ #define osFlashWriteBuffer osFlashWriteBuffer_recomp #define osWritebackDCache osWritebackDCache_recomp #define osInvalICache osInvalICache_recomp +#define osCreateThread osCreateThread_recomp #define osGetTime osGetTime_recomp #define osContStartReadData osContStartReadData_recomp @@ -47,6 +48,7 @@ #include "PR/gbi.h" #include "PR/os.h" #include "PR/mbi.h" +#include "PR/sched.h" #include "libaudio.h" #include "misc_funcs.h" // #include "PR/os_thread.h" diff --git a/patches/structs.h b/patches/structs.h index 569a539..4ce62b1 100644 --- a/patches/structs.h +++ b/patches/structs.h @@ -5,14 +5,11 @@ #define klabs(A) (((A) > 0) ? (A) : -(A)) -#define CLAMP_MAX(A, B) \ - (((A) > B) ? B : A) +#define CLAMP_MAX(A, B) (((A) > B) ? B : A) -#define CLAMP_MIN(A, B) \ - (((A) < B) ? B : A) +#define CLAMP_MIN(A, B) (((A) < B) ? B : A) -#define ARRAY_COUNT(arr) \ - (s32)(sizeof(arr) / sizeof(arr[0])) +#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0])) #define PI 3.14159265359 @@ -20,9 +17,20 @@ #define DEG2RAD(x) ((x) * (PI / 180.f)) +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 +#define ASPECT_RATIO (4.0f / 3.0f) + +#define GFX_TASKS 2 +#define DISPLAY_LIST_SIZE 0x1400 + #define MAXWALLS 3912 #define MAXSECTORS 657 #define MAXPLAYERS 4 +#define NUM_DMA_MSGS 256 + +#define CONTROL_PRESET_NUM 8 +#define CONTROL_MAPPING_NUM 16 #define CONTROLLER_EEPROM_LONG_READ 1 #define CONTROLLER_EEPROM_LONG_WRITE 2 @@ -42,15 +50,32 @@ #define __C__ 0xFF #define GAMECODE 0x4E445A45 /*NDZE*/ +#define DECL_STATIC_SEG_SYM(A) extern u8 A##_STATIC_START[] + +#define GET_STATIC_SEG_SYM(A) ((s32) gStaticSegment + (s32) A##_STATIC_START) + +#define IDLELOOP_STACKSIZE 0x1000 +#define VILOOP_STACKSIZE 0x1000 +#define MAINLOOP_STACKSIZE 0x8000 +#define SCHEDULER_STACKSIZE 0x2000 +#define NUM_DMA_MSGS 256 +#define PHYSICAL_SEGMENT 0 +#define STATIC_SEGMENT 1 +#define FRAMEBUFFER_SEGMENT 2 +#define OUTPUT_BUFFER_SIZE 65536 +#define STATIC_SEGMENT_VRAM (STATIC_SEGMENT << 24) +#define FRAMEBUFFER_ALIGN 16 +#define DEPTHBUFFER_ALIGN 256 + #define FORNEXT_DEPTH 4 typedef f32 Matrix4f[4][4]; typedef f32 Vec4f[4]; +typedef u8 Addr[]; typedef void (*ProcPointer)(void); -typedef struct -{ +typedef struct { /*0x00*/ s16 dimx; /*0x02*/ s16 dimy; /*0x04*/ s32 offset; @@ -58,14 +83,14 @@ typedef struct typedef struct { /*0x00*/ s32 fileoff; - /*0x04*/ u8 *ramaddr; + /*0x04*/ u8* ramaddr; /*0x08*/ s16 unused; /*0x0A*/ s16 size; } ModelVertexInfo; typedef struct { /*0x00*/ s32 fileoff; - /*0x04*/ u8 *ramaddr; + /*0x04*/ u8* ramaddr; /*0x08*/ u16 unk8; /*0x0A*/ u16 unkA; /*0x0C*/ u16 texture_info_off; @@ -73,7 +98,7 @@ typedef struct { /*0x10*/ u16 lights_off; /*0x12*/ u16 vertex_size; /*0x14*/ u8 pad2[4]; - /*0x18*/ ModelVertexInfo *vertex_info; + /*0x18*/ ModelVertexInfo* vertex_info; /*0x1C*/ u8 pad3[4]; /*0x20*/ s8 lock; /*0x21*/ u8 pad4[3]; @@ -90,8 +115,7 @@ typedef struct { /*0x03*/ s8 unused[3]; } ModelLight; -typedef struct -{ +typedef struct { /*0x00*/ s32 ceilingz; /*0x04*/ s32 floorz; /*0x08*/ s16 wallptr; @@ -119,8 +143,7 @@ typedef struct /*0x2D*/ u8 pad3[3]; } SectorType; -typedef struct -{ +typedef struct { /*0x0000*/ Mtx mtx1[MAXPLAYERS]; /*0x0100*/ Mtx mtx2[MAXPLAYERS]; /*0x0200*/ LookAt lookat[MAXPLAYERS][2]; @@ -142,17 +165,15 @@ typedef struct { u8 r, g, b; } Color; -typedef struct -{ - Color primary; - Color env; +typedef struct { + Color primary; + Color env; } AlphaPalette; -typedef struct -{ - u16 r; - u16 g; - u16 b; +typedef struct { + u16 r; + u16 g; + u16 b; } GlobalPalette; typedef struct { @@ -166,8 +187,7 @@ typedef struct { s16 fr; } FogScale; -typedef struct -{ +typedef struct { FogColor color[3]; FogScale scale[3]; s16 unk1E; @@ -175,330 +195,318 @@ typedef struct u8 pad; } Fog; -typedef struct -{ - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s16 picnum; - s32 height; - Color fog; +typedef struct { + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; + s16 picnum; + s32 height; + Color fog; } Cloud; -typedef struct -{ - s32 xpos; - s32 ypos; - s32 zpos; - s32 xvect; - s32 yvect; - s32 zvect; - s32 unk18; - s32 unk1C; - s32 unk20; - s32 unk24; - s32 unk28; - s32 unk2C; - s32 unk30; - s16 cursectnum; - s16 unk36; - s16 ang; - s16 unk3A; - s16 unk3C; - s16 unk3E; - s32 unk40; - u8 unk44; - u8 unk45; - s16 unk46; - s16 unk48; - s16 unk4A; - s16 skin; - s16 unk4E; - s16 unk50; - s16 unk52; - u8 unk54; - u8 unk55; - u8 unk56; - u8 unk57; - u8 unk58; - u8 unk59; - u8 unk5A; - u8 unk5B; - u8 unk5C; - s16 unk5E; - u8 third_person; - u8 unk61; - f32 unk64; - s16 unk68; - s16 unk6A; - u8 unk6C; - s16 unk6E; - s16 unk70; - s16 unk72; - s16 unk74; - s16 unk76; - f32 unk78; - f32 unk7C; - u8 unk80; - s16 unk82; - s16 unk84; - s16 unk86; - u8 keys[17]; - u8 pad[2]; +typedef struct { + s32 xpos; + s32 ypos; + s32 zpos; + s32 xvect; + s32 yvect; + s32 zvect; + s32 unk18; + s32 unk1C; + s32 unk20; + s32 unk24; + s32 unk28; + s32 unk2C; + s32 unk30; + s16 cursectnum; + s16 unk36; + s16 ang; + s16 unk3A; + s16 unk3C; + s16 unk3E; + s32 unk40; + u8 unk44; + u8 unk45; + s16 unk46; + s16 unk48; + s16 unk4A; + s16 skin; + s16 unk4E; + s16 unk50; + s16 unk52; + u8 unk54; + u8 unk55; + u8 unk56; + u8 unk57; + u8 unk58; + u8 unk59; + u8 unk5A; + u8 unk5B; + u8 unk5C; + s16 unk5E; + u8 third_person; + u8 unk61; + f32 unk64; + s16 unk68; + s16 unk6A; + u8 unk6C; + s16 unk6E; + s16 unk70; + s16 unk72; + s16 unk74; + s16 unk76; + f32 unk78; + f32 unk7C; + u8 unk80; + s16 unk82; + s16 unk84; + s16 unk86; + u8 keys[17]; + u8 pad[2]; } Player; -typedef struct -{ - s16 picnum; - s16 sfxnum; - char *actor; - u8 unk8; - u8 unk9; - u8 unkA; - u8 unkB; +typedef struct { + s16 picnum; + s16 sfxnum; + char* actor; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; } _11B300UnkStruct1; -typedef struct -{ - s32 x; - s32 y; - s32 z; - s16 cstat; - s16 picnum; - s16 sectnum; - s16 statnum; - s16 ang; - s16 unk16; - s16 unk18; - s16 unk1A; - s16 unk1C; - s16 lotag; - s16 hitag; - s16 unk22; - u8 unk24; - u8 unk25; - u8 clipdist; - u8 xrepeat; - u8 yrepeat; - u8 unk29; - u8 unk2A; - u8 unk2B; +typedef struct { + s32 x; + s32 y; + s32 z; + s16 cstat; + s16 picnum; + s16 sectnum; + s16 statnum; + s16 ang; + s16 unk16; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 lotag; + s16 hitag; + s16 unk22; + u8 unk24; + u8 unk25; + u8 clipdist; + u8 xrepeat; + u8 yrepeat; + u8 unk29; + u8 unk2A; + u8 unk2B; } SpriteType; -typedef struct -{ +typedef struct { struct { - u8 main; - u8 options_2P; - u8 select_single_multi_player; - u8 multiplayer_options; - u8 unk4; - u8 unk5; - u8 controller_config; - u8 options_1P; - u8 select_difficulty; - u8 select_multiplayer_gametype; - u8 unkA; - u8 unkB; - u8 unkC; - u8 unkD; - u8 select_player; - u8 unkF; - u8 player_setup; - u8 unk11; - u8 cheats; - u8 cheats_others; - u8 cheats_game_type; - u8 cheats_weapons; + u8 main; + u8 options_2P; + u8 select_single_multi_player; + u8 multiplayer_options; + u8 unk4; + u8 unk5; + u8 controller_config; + u8 options_1P; + u8 select_difficulty; + u8 select_multiplayer_gametype; + u8 unkA; + u8 unkB; + u8 unkC; + u8 unkD; + u8 select_player; + u8 unkF; + u8 player_setup; + u8 unk11; + u8 cheats; + u8 cheats_others; + u8 cheats_game_type; + u8 cheats_weapons; } menuIndex; - u16 sound; - u16 mastervol; - u16 musicvol; - u16 rumblepak; + u16 sound; + u16 mastervol; + u16 musicvol; + u16 rumblepak; struct { - u16 radar; - u16 time_limit; - u16 frag_count; - u16 split_2P; - u16 split_3P; - u16 friendly_fire; - u16 players; + u16 radar; + u16 time_limit; + u16 frag_count; + u16 split_2P; + u16 split_3P; + u16 friendly_fire; + u16 players; } multiplayer; - u16 unused; - u16 controller_preset[4]; - u16 crosshair[4]; - u16 autoaim[4]; - u16 autocenter[4]; - u16 difficulty; - u8 unk50; + u16 unused; + u16 controller_preset[4]; + u16 crosshair[4]; + u16 autoaim[4]; + u16 autocenter[4]; + u16 difficulty; + u8 unk50; } Config; -typedef struct -{ - u16 enemies_killed; - u16 enemies_total; - u16 babes_saved; - u16 babes_total; - u16 secrets_found; - u16 secrets_total; - s32 unkC; - u8 unk10; +typedef struct { + u16 enemies_killed; + u16 enemies_total; + u16 babes_saved; + u16 babes_total; + u16 secrets_found; + u16 secrets_total; + s32 unkC; + u8 unk10; } code0UnkStruct4; typedef unsigned long musHandle; typedef struct { - u16 chapter; - char *mapname; + u16 chapter; + char* mapname; } MapChapter; -typedef struct -{ - s32 flag; - s32 unk4; - s16 unk8; - u16 unkA; - s32 *exec_ptr; - s32 *unk10; - s32 *unk14; - s32 *unk18; - s32 *unk1C; - s32 *unk20; - s32 *unk24; - s16 unk28; - s16 unk2A; - s16 unk2C; - s16 unk2E; - s16 unk30; - s16 unk32; - s16 unk34; - s16 unk36; - s32 unk38; - s32 unk3C; - s32 unk40; - s32 unk44; - s32 unk48; - s32 unk4C; - s32 unk50; - s32 unk54; - s32 unk58; - s32 unk5C; - s32 unk60; - s32 unk64; - s32 unk68; - musHandle unk6C; - musHandle unk70; - s32 unk74; - s32 unk78; - s16 unk7C; - s16 unk7E; - s16 unk80; - s16 unk82; - s16 unk84; - s16 unk86; - s16 unk88; - s16 unk8A; - s16 unk8C; - s16 unk8E; - s16 unk90; - u8 unk92; - u8 unk93; - u8 unk94; - u8 unk95; - u8 unk96; - u8 unk97; - u8 unk98; - u8 unk99; - u8 unk9A; - u8 unk9B; - u8 unk9C; - u8 unk9D; - u8 unk9E; - u8 unk9F; - u8 unkA0; - u8 unkA1; - u8 unkA2; - u8 unkA3; +typedef struct { + s32 flag; + s32 unk4; + s16 unk8; + u16 unkA; + s32* exec_ptr; + s32* unk10; + s32* unk14; + s32* unk18; + s32* unk1C; + s32* unk20; + s32* unk24; + s16 unk28; + s16 unk2A; + s16 unk2C; + s16 unk2E; + s16 unk30; + s16 unk32; + s16 unk34; + s16 unk36; + s32 unk38; + s32 unk3C; + s32 unk40; + s32 unk44; + s32 unk48; + s32 unk4C; + s32 unk50; + s32 unk54; + s32 unk58; + s32 unk5C; + s32 unk60; + s32 unk64; + s32 unk68; + musHandle unk6C; + musHandle unk70; + s32 unk74; + s32 unk78; + s16 unk7C; + s16 unk7E; + s16 unk80; + s16 unk82; + s16 unk84; + s16 unk86; + s16 unk88; + s16 unk8A; + s16 unk8C; + s16 unk8E; + s16 unk90; + u8 unk92; + u8 unk93; + u8 unk94; + u8 unk95; + u8 unk96; + u8 unk97; + u8 unk98; + u8 unk99; + u8 unk9A; + u8 unk9B; + u8 unk9C; + u8 unk9D; + u8 unk9E; + u8 unk9F; + u8 unkA0; + u8 unkA1; + u8 unkA2; + u8 unkA3; } Actor; -typedef struct -{ - s16 unk0; - u8 unk2[8]; - s16 unkA[8]; +typedef struct { + s16 unk0; + u8 unk2[8]; + s16 unkA[8]; } code0UnkStruct2; -typedef struct -{ - u8 *texture; - u8 *palette; - s32 texoff; - s32 paloff; - s16 width; - s16 height; +typedef struct { + u8* texture; + u8* palette; + s32 texoff; + s32 paloff; + s16 width; + s16 height; } _E0640UnkStruct; -typedef struct -{ - s16 x; - s16 y; - s16 z; +typedef struct { + s16 x; + s16 y; + s16 z; } code0UnkStruct18; -typedef struct -{ - s8 unk0; - s32 unk4; - u32 unk8; - s32 unkC; - u8 unk10; - u8 unk11; - u8 unk12; - u8 pad2[1]; - s32 unk14; - u8 pad3[28]; - f32 unk34; - f32 unk38; - f32 unk3C; - f32 unk40; - f32 unk44; - f32 unk48; - f32 unk4C; - f32 unk50; - f32 unk54; - f32 unk58; - f32 unk5C; - f32 unk60; - f32 unk64; - Color unk68; - Color unk6B; - u8 pad7[2]; - void *unk70; - s32 unk74; - s32 unk78; - void *unk7C; - void *unk80; - code0UnkStruct18 *unk84; - s32 unk88; - u8 *unk8C; - s32 unk90; - s32 unk94; - s32 unk98; - s32 unk9C; - s32 unkA0; - Gfx *unkA4; - u8 pad9[4]; - Lights1 *unkAC; +typedef struct { + s8 unk0; + s32 unk4; + u32 unk8; + s32 unkC; + u8 unk10; + u8 unk11; + u8 unk12; + u8 pad2[1]; + s32 unk14; + u8 pad3[28]; + f32 unk34; + f32 unk38; + f32 unk3C; + f32 unk40; + f32 unk44; + f32 unk48; + f32 unk4C; + f32 unk50; + f32 unk54; + f32 unk58; + f32 unk5C; + f32 unk60; + f32 unk64; + Color unk68; + Color unk6B; + u8 pad7[2]; + void* unk70; + s32 unk74; + s32 unk78; + void* unk7C; + void* unk80; + code0UnkStruct18* unk84; + s32 unk88; + u8* unk8C; + s32 unk90; + s32 unk94; + s32 unk98; + s32 unk9C; + s32 unkA0; + Gfx* unkA4; + u8 pad9[4]; + Lights1* unkAC; } code0UnkStruct16; -typedef struct -{ +typedef struct { u16 unk0; u16 id; u16 offset; @@ -513,207 +521,316 @@ typedef struct { /*0x6*/ s16 stick_y; } Controller; -typedef struct -{ - unsigned short wave; /* wave number */ - unsigned short adsr; /* envelope number */ - unsigned char pan; /* pan position */ - unsigned char pitch; /* semitone */ +typedef struct { + unsigned short wave; /* wave number */ + unsigned short adsr; /* envelope number */ + unsigned char pan; /* pan position */ + unsigned char pitch; /* semitone */ } drum_t; -typedef struct -{ - unsigned long version; /* 16.16 version number */ - long num_channels; /* number of channels in this song */ - long num_waves; /* number of waves in table */ +typedef struct { + unsigned long version; /* 16.16 version number */ + long num_channels; /* number of channels in this song */ + long num_waves; /* number of waves in table */ /* offsets converted to pointers go here - changing these requires MusStartSong() to be changed! */ -#define SONGHDR_COUNT 7 /* number of pointers to convert */ -#define SONGHDR_ADR(x) (&(x)->data_list) /* start address of pointer list */ +#define SONGHDR_COUNT 7 /* number of pointers to convert */ +#define SONGHDR_ADR(x) (&(x)->data_list) /* start address of pointer list */ - /* channel pointers */ - unsigned char **data_list; /* channel data address list */ - unsigned char **volume_list; /* channel volume address list */ - unsigned char **pbend_list; /* pitchbend address list */ + /* channel pointers */ + unsigned char** data_list; /* channel data address list */ + unsigned char** volume_list; /* channel volume address list */ + unsigned char** pbend_list; /* pitchbend address list */ /* table pointers */ - unsigned char *env_table; /* address of envelope table */ - drum_t *drum_table; /* address of drum map table */ - unsigned short *wave_table; /* address of waveform lookup table */ + unsigned char* env_table; /* address of envelope table */ + drum_t* drum_table; /* address of drum map table */ + unsigned short* wave_table; /* address of waveform lookup table */ /* master track */ - unsigned char *master_track; /* address of master track */ + unsigned char* master_track; /* address of master track */ /* library workspace */ - unsigned long flags; - unsigned long reserved1; - unsigned long reserved2; - unsigned long reserved3; + unsigned long flags; + unsigned long reserved1; + unsigned long reserved2; + unsigned long reserved3; } song_t; -typedef struct -{ - unsigned char header_name[16]; /* "Nu64 pointer bank" (or something like that) */ - unsigned long flags; /* 32 bit flags */ - unsigned long wbk_name[3]; /* 12 byte ASCII name (currently unused) */ - int count; /* number of samples contained in sample bank */ - /* the three pointers below must be consecutive */ - unsigned char *basenote; /* address of corse tune array */ - float *detune; /* address of fine tune array */ - ALWaveTable **wave_list; /* address of wave table pointer array */ +typedef struct { + unsigned char header_name[16]; /* "Nu64 pointer bank" (or something like that) */ + unsigned long flags; /* 32 bit flags */ + unsigned long wbk_name[3]; /* 12 byte ASCII name (currently unused) */ + int count; /* number of samples contained in sample bank */ + /* the three pointers below must be consecutive */ + unsigned char* basenote; /* address of corse tune array */ + float* detune; /* address of fine tune array */ + ALWaveTable** wave_list; /* address of wave table pointer array */ } ptr_bank_t; -typedef struct -{ - unsigned char *fxdata; - int priority; +typedef struct { + unsigned char* fxdata; + int priority; } fx_t; -typedef struct -{ - int number_of_components; - int number_of_effects; - int num_waves; - unsigned long flags; - ptr_bank_t *ptr_addr; - unsigned short *wave_table; - fx_t effects[1]; /* "number_of_components" sized array */ +typedef struct { + int number_of_components; + int number_of_effects; + int num_waves; + unsigned long flags; + ptr_bank_t* ptr_addr; + unsigned short* wave_table; + fx_t effects[1]; /* "number_of_components" sized array */ } fx_header_t; - -typedef struct -{ +typedef struct { /* 32bit values... */ - unsigned long channel_flag; /* new flag for overall channel control */ - unsigned char *pdata; - ALWaveTable *pending; - unsigned long channel_frame; + unsigned long channel_flag; /* new flag for overall channel control */ + unsigned char* pdata; + ALWaveTable* pending; + unsigned long channel_frame; - int stopping; - unsigned long volume_frame; - unsigned long pitchbend_frame; - int stopping_speed; + int stopping; + unsigned long volume_frame; + unsigned long pitchbend_frame; + int stopping_speed; - float vib_amount; - float pitchbend_precalc; - float old_frequency; - float base_note; + float vib_amount; + float pitchbend_precalc; + float old_frequency; + float base_note; - float freqoffset; - unsigned char *ppitchbend; - unsigned char *pvolume; - unsigned long note_end_frame; + float freqoffset; + unsigned char* ppitchbend; + unsigned char* pvolume; + unsigned long note_end_frame; - unsigned long note_start_frame; - unsigned long handle; - int priority; - float last_note; + unsigned long note_start_frame; + unsigned long handle; + int priority; + float last_note; - float port_base; - unsigned long release_frame; - float env_attack_calc; - float env_decay_calc; + float port_base; + unsigned long release_frame; + float env_attack_calc; + float env_decay_calc; - float env_release_calc; - int env_speed_calc; - float vibrato; - float bendrange; + float env_release_calc; + int env_speed_calc; + float vibrato; + float bendrange; - float pitchbend; - song_t *song_addr; - fx_header_t *fx_addr; - ptr_bank_t *sample_bank; + float pitchbend; + song_t* song_addr; + fx_header_t* fx_addr; + ptr_bank_t* sample_bank; - unsigned char *pbase; - drum_t *pdrums; - unsigned char *ppitchbendbase; - unsigned char *pvolumebase; + unsigned char* pbase; + drum_t* pdrums; + unsigned char* ppitchbendbase; + unsigned char* pvolumebase; - float distort; - unsigned long sweep_frame; + float distort; + unsigned long sweep_frame; // 16bit values... - short temscale; - unsigned short length; - unsigned short channel_tempo; - short volscale; + short temscale; + unsigned short length; + unsigned short channel_tempo; + short volscale; - unsigned short old_volume; - unsigned short cont_vol_repeat_count; - unsigned short cont_pb_repeat_count; - unsigned short fx_number; - unsigned short channel_tempo_save; - unsigned short count; - unsigned short fixed_length; - unsigned short wave; + unsigned short old_volume; + unsigned short cont_vol_repeat_count; + unsigned short cont_pb_repeat_count; + unsigned short fx_number; + unsigned short channel_tempo_save; + unsigned short count; + unsigned short fixed_length; + unsigned short wave; - short panscale; - unsigned short cutoff; - unsigned short endit; + short panscale; + unsigned short cutoff; + unsigned short endit; // 8bit values... - unsigned char vib_delay; - unsigned char ignore; + unsigned char vib_delay; + unsigned char ignore; - unsigned char port; - unsigned char transpose; - unsigned char ignore_transpose; - unsigned char velocity; - unsigned char volume; - unsigned char pan; - unsigned char old_pan; - unsigned char env_speed; - unsigned char env_init_vol; - unsigned char env_max_vol; - unsigned char env_sustain_vol; - unsigned char env_phase; - unsigned char env_current; - unsigned char env_count; - unsigned char env_attack_speed; - unsigned char env_decay_speed; + unsigned char port; + unsigned char transpose; + unsigned char ignore_transpose; + unsigned char velocity; + unsigned char volume; + unsigned char pan; + unsigned char old_pan; + unsigned char env_speed; + unsigned char env_init_vol; + unsigned char env_max_vol; + unsigned char env_sustain_vol; + unsigned char env_phase; + unsigned char env_current; + unsigned char env_count; + unsigned char env_attack_speed; + unsigned char env_decay_speed; - unsigned char env_release_speed; - unsigned char playing; - unsigned char reverb; // wet/dry mix for alSynSetMix() - unsigned char reverb_base; - unsigned char old_reverb; - unsigned char release_start_vol; - unsigned char wobble_on_speed; - unsigned char wobble_off_speed; - unsigned char wobble_count; - signed char wobble_current; - unsigned char velocity_on; - unsigned char default_velocity; - unsigned char sweep_speed; - unsigned char vib_speed;/* zero if not active*/ - unsigned char env_trigger_off; - unsigned char trigger_off; + unsigned char env_release_speed; + unsigned char playing; + unsigned char reverb; // wet/dry mix for alSynSetMix() + unsigned char reverb_base; + unsigned char old_reverb; + unsigned char release_start_vol; + unsigned char wobble_on_speed; + unsigned char wobble_off_speed; + unsigned char wobble_count; + signed char wobble_current; + unsigned char velocity_on; + unsigned char default_velocity; + unsigned char sweep_speed; + unsigned char vib_speed; /* zero if not active*/ + unsigned char env_trigger_off; + unsigned char trigger_off; - signed char wobble_amount; - unsigned char sweep_timer; - unsigned char sweep_dir; - unsigned char for_stack_count; + signed char wobble_amount; + unsigned char sweep_timer; + unsigned char sweep_dir; + unsigned char for_stack_count; - float vib_precalc; + float vib_precalc; /* for-next stuff all together */ - unsigned char *for_stack[FORNEXT_DEPTH]; - unsigned char *for_stackvol[FORNEXT_DEPTH]; - unsigned char *for_stackpb[FORNEXT_DEPTH]; - unsigned short for_vol_count[FORNEXT_DEPTH]; - unsigned short for_pb_count[FORNEXT_DEPTH]; - unsigned char for_count[FORNEXT_DEPTH]; - unsigned char for_volume[FORNEXT_DEPTH]; - float for_pitchbend[FORNEXT_DEPTH]; + unsigned char* for_stack[FORNEXT_DEPTH]; + unsigned char* for_stackvol[FORNEXT_DEPTH]; + unsigned char* for_stackpb[FORNEXT_DEPTH]; + unsigned short for_vol_count[FORNEXT_DEPTH]; + unsigned short for_pb_count[FORNEXT_DEPTH]; + unsigned char for_count[FORNEXT_DEPTH]; + unsigned char for_volume[FORNEXT_DEPTH]; + float for_pitchbend[FORNEXT_DEPTH]; #ifndef SUPPORT_EFFECTS unsigned char padding[4]; /* pad for data cache */ #else - unsigned long effect_type; - float specialvib_amount; - unsigned char specialvib_speed; - unsigned char specialvib_delay; - unsigned char last_volume; - unsigned char vol_effect[4]; - unsigned char pitch_effect[4]; + unsigned long effect_type; + float specialvib_amount; + unsigned char specialvib_speed; + unsigned char specialvib_delay; + unsigned char last_volume; + unsigned char vol_effect[4]; + unsigned char pitch_effect[4]; #endif } channel_t; +typedef struct { + s16 count; + char** addr; +} ObjectiveStrInfo; + +typedef struct { + /*0x00*/ s32 fileoff; + /*0x04*/ u8* ramaddr; + /*0x08*/ s32 picanm; + /*0x0C*/ s16 sizex; + /*0x0E*/ s16 sizey; + /*0x10*/ u16 filesize; + /*0x12*/ u16 dimx; + /*0x14*/ u16 dimy; + /*0x16*/ u8 flags; + /*0x18*/ u16 tile; +} TileInfo; + +typedef struct { + /*0x00*/ u8* rom_start; + /*0x04*/ u8* rom_end; + /*0x08*/ s32 sector_offset; + /*0x0C*/ s32 wall_offset; + /*0x10*/ s32 sprite_offset; + /*0x14*/ s32 sectors; + /*0x18*/ s32 sprites; + /*0x1C*/ s32 walls; + /*0x20*/ s32 xpos; + /*0x24*/ s32 ypos; + /*0x28*/ s32 zpos; + /*0x2C*/ s32 ang; + /*0x30*/ f32 skytop_r; + /*0x34*/ f32 skytop_g; + /*0x38*/ f32 skytop_b; + /*0x3C*/ f32 skybottom_r; + /*0x40*/ f32 skybottom_g; + /*0x44*/ f32 skybottom_b; +} MapInfo; + +typedef struct { + /*0x00*/ s16* unk0; + /*0x04*/ s16 unk4; + /*0x06*/ s16 unk6; +} _11D520UnkStruct1; + +typedef struct { + /*0x00*/ u8 unk0; + /*0x01*/ u8 unk1; + /*0x02*/ u8 unk2; +} code1UnkStruct4; + +typedef struct { + /*0x00*/ s16 unk0; + /*0x02*/ s16 unk2; + /*0x04*/ s16 unk4; + /*0x06*/ s16 unk6; +} _11B300UnkStruct2; + +typedef union { + struct { + char* turn_left; + char* turn_right; + char* move_forward; + char* move_back; + char* move_left; + char* move_right; + char* look_up; + char* look_down; + char* jump; + char* fire; + char* open; + char* next_weapon; + char* last_weapon; + char* next_item; + char* previous_item; + char* activate_item; + } u; + char* mapping[16]; +} ControlMapping; + +typedef struct { + /*0x000*/ u16 unk0; + /*0x002*/ u16 unk2; + /*0x004*/ u16 unk4[24][3]; + /*0x148*/ u16 unk148[8]; + /*0x164*/ u16 enemies_total; + /*0x166*/ u16 babes_total; + /*0x168*/ u16 secrets_total; + /*0x172*/ s32 unk172; /*time_taken*/ + /*0x176*/ u16 enemies_killed; + /*0x178*/ u16 babes_saved; + /*0x180*/ u16 secrets_found; + /*0x182*/ u8 unk182; +} code1UnkStruct2; + +typedef struct { + /*0x0000*/ u16 unk0; + /*0x0002*/ u16 unk2; + /*0x0004*/ code1UnkStruct2 unk4[22]; + /*0x0FD4*/ u8 unkFD4; + /*0x0FD5*/ u8 unkFD5; /*mapnum*/ + /*0x0FD6*/ u8 unkFD6; + /*0x0FD7*/ u8 unkFD7; + /*0x0FD8*/ s32 unlocked_skin; + /*0x0FDC*/ s32 unlocked_cheat; + /*0x0FE0*/ u16 unlocked_cheat_weapons; + /*0x0FE4*/ s32 time_machine_part; + /*0x0FE8*/ Config unkFE8; + /*0x103A*/ u8 unk103A; + /*0x103C*/ u8 pad2; +} code1UnkStruct3; +typedef struct { + code1UnkStruct3 unk0; + +} code1UnkStruct7; + #endif \ No newline at end of file diff --git a/patches/syms.ld b/patches/syms.ld index 9453fd6..8930103 100644 --- a/patches/syms.ld +++ b/patches/syms.ld @@ -82,4 +82,6 @@ osPfsRepairId_recomp = 0x8F000118; osPfsInitPak_recomp = 0x8F00011C; osEepromLongRead_recomp = 0x8F000120; osEepromLongWrite_recomp = 0x8F000124; -yield_self_1ms = 0x8F000128; \ No newline at end of file +yield_self_1ms = 0x8F000128; +osCreateThread_recomp = 0x8F00012C; +yield_self = 0x8F000130; \ No newline at end of file