From b7237dd41a51afa1d080ed7e4f7994ebd575e023 Mon Sep 17 00:00:00 2001 From: Aiden Date: Sat, 9 Jul 2022 04:43:50 -0400 Subject: [PATCH 01/37] [FAIL] RaceConfig: initial slice --- pack/rel_objects.txt | 4 +- pack/rel_slices.csv | 1 + source/game/system/RaceConfig.cpp | 5334 +++++++++++++++++++++++++++++ source/game/system/RaceConfig.hpp | 131 + sources.py | 1 + 5 files changed, 5470 insertions(+), 1 deletion(-) create mode 100644 source/game/system/RaceConfig.cpp diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index 6dab0276f..213799b7c 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -16,7 +16,9 @@ out/rel/text_8051d4d4_8052a098.o out/rel/data_808b2d50_808b3188.o out/LocalizedArchive.o out/MultiDvdArchive.o -out/rel/text_8052ae5c_8053fc4c.o +out/rel/text_8052ae5c_8052d96c.o +out/RaceConfig.o +out/rel/text_80532084_8053fc4c.o out/rel/rodata_8088fe28_80890490.o out/rel/data_808b31e8_808b3960.o out/ResourceManager.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index 552cdc386..b0e15d021 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -4,6 +4,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/system/GhostFile.cpp,0x8051c088,0x8051d4d4,,,,,,,0x808b2d38,0x808b2d50,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, +1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,,,,,, 1,source/game/system/ResourceManager.cpp,0x8053FC4C,0x80542878,,,,,0x80890490,0x80890d0c,0x808b3960,0x808b3c2c,, 1,source/game/util/Random.cpp,0x80555464,0x8055572c,,,,,0x80891370,0x80891380,0x808b42e0,0x808b42ec,, 1,source/game/kart/KartComponent.cpp,0x80590128,0x805901d0,,,,,,,,,0x809c1900,0x809c1910 diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp new file mode 100644 index 000000000..5f3bf76db --- /dev/null +++ b/source/game/system/RaceConfig.cpp @@ -0,0 +1,5334 @@ +#include "RaceConfig.hpp" + +// Extern function references. +// PAL: 0x8051c088 +extern UNKNOWN_FUNCTION(RawGhostFile_reset); +// PAL: 0x8051c120 +extern UNKNOWN_FUNCTION(RawGhostFile_isValid); +// PAL: 0x8051c270 +extern UNKNOWN_FUNCTION(GhostFile_construct); +// PAL: 0x8051c790 +extern UNKNOWN_FUNCTION(GhostFile_read); +// PAL: 0x80524500 +extern UNKNOWN_FUNCTION(unk_80524500); +// PAL: 0x8052453c +extern UNKNOWN_FUNCTION(InputMgr_setGhostController); +// PAL: 0x80524558 +extern UNKNOWN_FUNCTION(unk_80524558); +// PAL: 0x80525f88 +extern UNKNOWN_FUNCTION(SomethingMiis_construct); +// PAL: 0x8052d118 +extern UNKNOWN_FUNCTION(unk_8052d118); +// PAL: 0x8052d1c0 +extern UNKNOWN_FUNCTION(unk_8052d1c0); +// PAL: 0x8052d270 +extern UNKNOWN_FUNCTION(unk_8052d270); +// PAL: 0x805368f8 +extern UNKNOWN_FUNCTION(RaceinfoPlayer_updateGpRankScore); +// PAL: 0x805419ac +extern UNKNOWN_FUNCTION(ResourceManager_preloadCourseAsync); +// PAL: 0x805553b0 +extern UNKNOWN_FUNCTION(unk_805553b0); +// PAL: 0x8066c8d8 +extern UNKNOWN_FUNCTION(unk_8066c8d8); + +// Symbol: RacedataPlayer_construct +// PAL: 0x8052d96c..0x8052da10 +MARK_BINARY_BLOB(RacedataPlayer_construct, 0x8052d96c, 0x8052da10); +asm UNKNOWN_FUNCTION(RacedataPlayer_construct) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + lis r4, 0; + lis r5, 0; + stw r0, 0x14(r1); + li r6, 0; + addi r4, r4, 0; + addi r5, r5, 0; + stw r31, 0xc(r1); + li r31, -1; + li r0, 1; + stw r30, 8(r1); + mr r30, r3; + stw r4, 0(r3); + li r4, 7; + stb r6, 4(r3); + stb r31, 5(r3); + stb r31, 6(r3); + stw r0, 8(r3); + stw r6, 0xc(r3); + stw r6, 0x10(r3); + stwu r5, 0x14(r3); + bl SomethingMiis_construct; + lbz r0, 0xec(r30); + lis r5, 0; + addi r5, r5, 0; + li r6, 8; + rlwinm r0, r0, 0, 0x19, 0x17; + li r4, 0x1388; + stw r31, 0xd0(r30); + mr r3, r30; + stw r6, 0xd4(r30); + stw r5, 0xe4(r30); + sth r4, 0xe8(r30); + stb r0, 0xec(r30); + lwz r31, 0xc(r1); + lwz r30, 8(r1); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: unk_8052da10 +// PAL: 0x8052da10..0x8052da50 +MARK_BINARY_BLOB(unk_8052da10, 0x8052da10, 0x8052da50); +asm UNKNOWN_FUNCTION(unk_8052da10) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + cmpwi r3, 0; + stw r0, 0x14(r1); + stw r31, 0xc(r1); + mr r31, r3; + beq lbl_8052da38; + cmpwi r4, 0; + ble lbl_8052da38; + bl unk_805553b0; +lbl_8052da38: + mr r3, r31; + lwz r31, 0xc(r1); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: unk_8052da50 +// PAL: 0x8052da50..0x8052daf0 +MARK_BINARY_BLOB(unk_8052da50, 0x8052da50, 0x8052daf0); +asm UNKNOWN_FUNCTION(unk_8052da50) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + stw r0, 0x24(r1); + stw r31, 0x1c(r1); + lis r31, 0; + stw r30, 0x18(r1); + mr r30, r4; + stw r29, 0x14(r1); + mr r29, r3; + mr r3, r30; + lwz r5, 0(r31); + addi r4, r29, 8; + lwz r6, 0x34(r5); + li r5, 4; + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r30; + addi r4, r29, 0xc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r30; + addi r4, r29, 0x10; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r30; + addi r4, r29, 0xcc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r0, 0x24(r1); + lwz r31, 0x1c(r1); + lwz r30, 0x18(r1); + lwz r29, 0x14(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: RacedataPlayer_computeGpRank +// PAL: 0x8052daf0..0x8052dbc8 +MARK_BINARY_BLOB(RacedataPlayer_computeGpRank, 0x8052daf0, 0x8052dbc8); +asm UNKNOWN_FUNCTION(RacedataPlayer_computeGpRank) { + // clang-format off + nofralloc; + lis r4, 0; + lha r5, 0xde(r3); + lwzu r0, 0(r4); + li r6, 5; + cmpw r5, r0; + blt lbl_8052db10; + li r6, 0; + b lbl_8052db5c; +lbl_8052db10: + lwz r0, 4(r4); + cmpw r5, r0; + blt lbl_8052db24; + li r6, 1; + b lbl_8052db5c; +lbl_8052db24: + lwz r0, 8(r4); + cmpw r5, r0; + blt lbl_8052db38; + li r6, 2; + b lbl_8052db5c; +lbl_8052db38: + lwz r0, 0xc(r4); + cmpw r5, r0; + blt lbl_8052db4c; + li r6, 3; + b lbl_8052db5c; +lbl_8052db4c: + lwz r0, 0x10(r4); + cmpw r5, r0; + blt lbl_8052db5c; + li r6, 4; +lbl_8052db5c: + lis r4, 0; + lhz r3, 0xda(r3); + lhzu r0, 0(r4); + li r5, 4; + cmplw r3, r0; + blt lbl_8052db7c; + li r5, 0; + b lbl_8052dbb4; +lbl_8052db7c: + lhz r0, 2(r4); + cmplw r3, r0; + blt lbl_8052db90; + li r5, 1; + b lbl_8052dbb4; +lbl_8052db90: + lhz r0, 4(r4); + cmplw r3, r0; + blt lbl_8052dba4; + li r5, 2; + b lbl_8052dbb4; +lbl_8052dba4: + lhz r0, 6(r4); + cmplw r3, r0; + blt lbl_8052dbb4; + li r5, 3; +lbl_8052dbb4: + add r3, r6, r5; + cmpwi r3, 8; + bltlr; + li r3, 7; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_construct +// PAL: 0x8052dbc8..0x8052dc68 +MARK_BINARY_BLOB(RacedataScenario_construct, 0x8052dbc8, 0x8052dc68); +asm UNKNOWN_FUNCTION(RacedataScenario_construct) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + lis r6, 0; + lis r5, 0; + stw r0, 0x24(r1); + addi r6, r6, 0; + addi r5, r5, 0; + li r7, 0xc; + stw r31, 0x1c(r1); + li r31, 0; + stw r30, 0x18(r1); + mr r30, r4; + stw r29, 0x14(r1); + mr r29, r3; + stw r6, 0(r3); + lis r6, 0; + addi r4, r6, 0; + stb r31, 4(r3); + li r6, 0xf0; + stb r31, 5(r3); + addi r3, r3, 8; + bl unk_805553b0; + li r0, 0x11; + stw r0, 0xb48(r29); + addi r3, r29, 0xb7c; + li r4, 0; + stw r31, 0xb50(r29); + li r5, 0x70; + stw r31, 0xb54(r29); + stw r31, 0xb68(r29); + bl unk_805553b0; + stw r30, 0xbec(r29); + mr r3, r29; + lwz r31, 0x1c(r1); + lwz r30, 0x18(r1); + lwz r29, 0x14(r1); + lwz r0, 0x24(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: RacedataPlayer_destroy +// PAL: 0x8052dc68..0x8052dca8 +MARK_BINARY_BLOB(RacedataPlayer_destroy, 0x8052dc68, 0x8052dca8); +asm UNKNOWN_FUNCTION(RacedataPlayer_destroy) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + cmpwi r3, 0; + stw r0, 0x14(r1); + stw r31, 0xc(r1); + mr r31, r3; + beq lbl_8052dc90; + cmpwi r4, 0; + ble lbl_8052dc90; + bl unk_805553b0; +lbl_8052dc90: + mr r3, r31; + lwz r31, 0xc(r1); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: unk_8052dca8 +// PAL: 0x8052dca8..0x8052dd18 +MARK_BINARY_BLOB(unk_8052dca8, 0x8052dca8, 0x8052dd18); +asm UNKNOWN_FUNCTION(unk_8052dca8) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + lis r4, 0; + li r0, 0; + li r8, 0; + stw r0, 8(r1); + addi r5, r1, 8; + lwz r7, 0(r4); + b lbl_8052dcf0; +lbl_8052dcc8: + clrlwi r0, r8, 0x18; + addi r8, r8, 1; + mulli r0, r0, 0xf0; + add r4, r3, r0; + lwz r6, 0xd4(r4); + lhz r0, 0xe0(r4); + slwi r6, r6, 1; + lhzx r4, r5, r6; + add r0, r4, r0; + sthx r0, r5, r6; +lbl_8052dcf0: + lbz r0, 0x24(r7); + clrlwi r4, r8, 0x18; + cmplw r4, r0; + blt lbl_8052dcc8; + lhz r3, 8(r1); + lhz r0, 0xa(r1); + subf r0, r0, r3; + srwi r3, r0, 0x1f; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: unk_8052dd18 +// PAL: 0x8052dd18..0x8052dd20 +MARK_BINARY_BLOB(unk_8052dd18, 0x8052dd18, 0x8052dd20); +asm UNKNOWN_FUNCTION(unk_8052dd18) { + // clang-format off + nofralloc; + lwz r3, 0xcc(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052dd20 +// PAL: 0x8052dd20..0x8052dd30 +MARK_BINARY_BLOB(unk_8052dd20, 0x8052dd20, 0x8052dd30); +asm UNKNOWN_FUNCTION(unk_8052dd20) { + // clang-format off + nofralloc; + mulli r0, r4, 0xf0; + add r3, r3, r0; + addi r3, r3, 8; + blr; + // clang-format on +} + +// Symbol: unk_8052dd30 +// PAL: 0x8052dd30..0x8052dd40 +MARK_BINARY_BLOB(unk_8052dd30, 0x8052dd30, 0x8052dd40); +asm UNKNOWN_FUNCTION(unk_8052dd30) { + // clang-format off + nofralloc; + lis r3, 0; + lwz r3, 0(r3); + lbz r3, 0x24(r3); + blr; + // clang-format on +} + +// Symbol: Racedata_init +// PAL: 0x8052dd40..0x8052e42c +MARK_BINARY_BLOB(Racedata_init, 0x8052dd40, 0x8052e42c); +asm UNKNOWN_FUNCTION(Racedata_init) { + // clang-format off + nofralloc; + stwu r1, -0x30(r1); + mflr r0; + li r10, 0; + li r5, 0x11; + stw r0, 0x34(r1); + li r0, 3; + li r9, 2; + li r8, 1; + stmw r22, 8(r1); + mr r31, r3; + li r11, 0; + lwz r4, 0x1780(r3); + stw r5, 0x1758(r3); + rlwinm r4, r4, 0, 0, 0x1c; + stw r10, 0x1760(r3); + stw r10, 0x1764(r3); + stw r10, 0x1778(r3); + stw r9, 0x175c(r3); + stw r8, 0x176c(r3); + stw r4, 0x1780(r3); + mtctr r0; +lbl_8052dd94: + clrlwi r4, r11, 0x18; + addi r11, r11, 1; + mulli r7, r4, 0xf0; + neg r5, r4; + clrlwi r0, r11, 0x18; + add r6, r3, r7; + or r5, r5, r4; + stw r10, 0xc24(r6); + srwi r4, r5, 0x1f; + neg r5, r0; + addi r11, r11, 1; + stw r8, 0xc20(r6); + mulli r7, r0, 0xf0; + or r5, r5, r0; + stw r4, 0xc28(r6); + clrlwi r0, r11, 0x18; + srwi r4, r5, 0x1f; + addi r11, r11, 1; + stw r9, 0xce4(r6); + add r6, r3, r7; + neg r5, r0; + stw r10, 0xc24(r6); + mulli r7, r0, 0xf0; + or r5, r5, r0; + stw r8, 0xc20(r6); + clrlwi r0, r11, 0x18; + addi r11, r11, 1; + stw r4, 0xc28(r6); + srwi r4, r5, 0x1f; + neg r5, r0; + stw r9, 0xce4(r6); + add r6, r3, r7; + mulli r7, r0, 0xf0; + or r5, r5, r0; + stw r10, 0xc24(r6); + stw r8, 0xc20(r6); + stw r4, 0xc28(r6); + srwi r4, r5, 0x1f; + stw r9, 0xce4(r6); + add r6, r3, r7; + stw r10, 0xc24(r6); + stw r8, 0xc20(r6); + stw r4, 0xc28(r6); + stw r9, 0xce4(r6); + bdnz lbl_8052dd94; + lwz r4, 0x1780(r3); + li r6, 1; + li r0, 2; + li r11, 0; + rlwinm r4, r4, 0, 0, 0x1c; + li r5, 3; + stw r11, 0x1770(r3); + li r12, 0; + stw r6, 0x176c(r3); + stb r5, 0x177d(r3); + stw r6, 0x175c(r3); + stw r4, 0x1780(r3); + mtctr r0; +lbl_8052de7c: + clrlwi r10, r12, 0x18; + addi r0, r12, 2; + mulli r5, r10, 0xf0; + addi r4, r12, 1; + clrlwi r7, r0, 0x18; + addi r0, r12, 3; + add r9, r3, r5; + clrlwi r8, r4, 0x18; + sth r11, 0xcf0(r9); + clrlwi r6, r0, 0x18; + addi r4, r12, 4; + addi r0, r12, 5; + sth r11, 0xcf6(r9); + clrlwi r5, r4, 0x18; + addi r10, r10, 1; + clrlwi r4, r0, 0x18; + stb r10, 0xcf9(r9); + addi r0, r8, 1; + addi r7, r7, 1; + addi r6, r6, 1; + stb r10, 0xcf8(r9); + addi r5, r5, 1; + addi r4, r4, 1; + addi r12, r12, 6; + sth r11, 0xde0(r9); + sth r11, 0xde6(r9); + stb r0, 0xde9(r9); + stb r0, 0xde8(r9); + sth r11, 0xed0(r9); + sth r11, 0xed6(r9); + stb r7, 0xed9(r9); + stb r7, 0xed8(r9); + sth r11, 0xfc0(r9); + sth r11, 0xfc6(r9); + stb r6, 0xfc9(r9); + stb r6, 0xfc8(r9); + sth r11, 0x10b0(r9); + sth r11, 0x10b6(r9); + stb r5, 0x10b9(r9); + stb r5, 0x10b8(r9); + sth r11, 0x11a0(r9); + sth r11, 0x11a6(r9); + stb r4, 0x11a9(r9); + stb r4, 0x11a8(r9); + bdnz lbl_8052de7c; + lwz r4, 0x2370(r3); + li r11, 0; + li r0, 2; + li r6, 3; + li r5, 1; + rlwinm r4, r4, 0, 0, 0x1c; + stb r11, 0x177c(r3); + li r12, 0; + stb r6, 0x177d(r3); + stw r11, 0x2360(r3); + stw r5, 0x235c(r3); + stb r6, 0x236d(r3); + stw r5, 0x234c(r3); + stw r4, 0x2370(r3); + mtctr r0; +lbl_8052df6c: + clrlwi r10, r12, 0x18; + addi r0, r12, 2; + mulli r5, r10, 0xf0; + addi r4, r12, 1; + clrlwi r7, r0, 0x18; + addi r0, r12, 3; + add r9, r3, r5; + clrlwi r8, r4, 0x18; + sth r11, 0x18e0(r9); + clrlwi r6, r0, 0x18; + addi r4, r12, 4; + addi r0, r12, 5; + sth r11, 0x18e6(r9); + clrlwi r5, r4, 0x18; + addi r10, r10, 1; + clrlwi r4, r0, 0x18; + stb r10, 0x18e9(r9); + addi r0, r8, 1; + addi r7, r7, 1; + addi r6, r6, 1; + stb r10, 0x18e8(r9); + addi r5, r5, 1; + addi r4, r4, 1; + addi r12, r12, 6; + sth r11, 0x19d0(r9); + sth r11, 0x19d6(r9); + stb r0, 0x19d9(r9); + stb r0, 0x19d8(r9); + sth r11, 0x1ac0(r9); + sth r11, 0x1ac6(r9); + stb r7, 0x1ac9(r9); + stb r7, 0x1ac8(r9); + sth r11, 0x1bb0(r9); + sth r11, 0x1bb6(r9); + stb r6, 0x1bb9(r9); + stb r6, 0x1bb8(r9); + sth r11, 0x1ca0(r9); + sth r11, 0x1ca6(r9); + stb r5, 0x1ca9(r9); + stb r5, 0x1ca8(r9); + sth r11, 0x1d90(r9); + sth r11, 0x1d96(r9); + stb r4, 0x1d99(r9); + stb r4, 0x1d98(r9); + bdnz lbl_8052df6c; + li r4, 0; + li r0, 3; + stb r4, 0x236c(r3); + lis r22, 0; + addi r4, r31, 0x1758; + li r5, 4; + stb r0, 0x236d(r3); + mr r3, r31; + lwz r6, 0(r22); + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r31, 0x175c; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r31, 0x1760; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r31, 0xc14; + li r5, 1; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r31, 0xc16; + li r5, 1; + lwz r6, 0x34(r6); + bl unk_805553b0; + addi r24, r31, 0xc18; + li r23, 0; +lbl_8052e0b4: + lwz r6, 0(r22); + mr r3, r31; + addi r4, r24, 8; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r24, 0xc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r24, 0x10; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r22); + mr r3, r31; + addi r4, r24, 0xcc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + addi r23, r23, 1; + addi r24, r24, 0xf0; + cmpwi r23, 0xc; + blt lbl_8052e0b4; + mr r3, r31; + addi r4, r31, 0x1780; + li r5, 4; + li r6, 0; + bl unk_805553b0; + lwz r12, 0(r31); + lis r4, 0; + lwz r4, 0(r4); + mr r3, r31; + lwz r12, 0xc(r12); + lwz r4, 0x34(r4); + mtctr r12; + bctrl; + addi r3, r31, 0xc10; + addi r4, r31, 0x20; + bl RacedataScenario_initRace; + lbz r9, 0xc14(r31); + addi r3, r31, 0x28; + lbz r8, 0xc15(r31); + addi r4, r31, 0xc18; + lbz r7, 0xc16(r31); + addi r5, r31, 0xb68; + lbz r6, 0xc17(r31); + li r0, 0x26; + stb r9, 0x24(r31); + stb r8, 0x25(r31); + stb r7, 0x26(r31); + stb r6, 0x27(r31); +lbl_8052e194: + lbz r6, 4(r4); + addi r9, r3, 0x23; + stb r6, 4(r3); + addi r8, r4, 0x23; + lbz r6, 5(r4); + stb r6, 5(r3); + lbz r6, 6(r4); + stb r6, 6(r3); + lwz r6, 8(r4); + stw r6, 8(r3); + lwz r6, 0xc(r4); + stw r6, 0xc(r3); + lwz r6, 0x10(r4); + stw r6, 0x10(r3); + lwz r6, 0x18(r4); + stw r6, 0x18(r3); + lbz r6, 0x1c(r4); + stb r6, 0x1c(r3); + lbz r6, 0x1d(r4); + stb r6, 0x1d(r3); + lwz r6, 0x20(r4); + stw r6, 0x20(r3); + mtctr r0; +lbl_8052e1f0: + lbz r7, 1(r8); + lbzu r6, 2(r8); + stb r7, 1(r9); + stbu r6, 2(r9); + bdnz lbl_8052e1f0; + lwz r6, 0x70(r4); + stw r6, 0x70(r3); + lbz r6, 0x74(r4); + stb r6, 0x74(r3); + lbz r6, 0x75(r4); + stb r6, 0x75(r3); + lbz r6, 0x76(r4); + stb r6, 0x76(r3); + lbz r6, 0x77(r4); + stb r6, 0x77(r3); + lwz r6, 0x78(r4); + stw r6, 0x78(r3); + lwz r6, 0x80(r4); + lwz r7, 0x7c(r4); + stw r7, 0x7c(r3); + stw r6, 0x80(r3); + lwz r6, 0x88(r4); + lwz r7, 0x84(r4); + stw r7, 0x84(r3); + stw r6, 0x88(r3); + lwz r6, 0x90(r4); + lwz r7, 0x8c(r4); + stw r7, 0x8c(r3); + stw r6, 0x90(r3); + lwz r6, 0x98(r4); + lwz r7, 0x94(r4); + stw r7, 0x94(r3); + stw r6, 0x98(r3); + lwz r6, 0xa0(r4); + lwz r7, 0x9c(r4); + stw r7, 0x9c(r3); + stw r6, 0xa0(r3); + lwz r6, 0xa8(r4); + lwz r7, 0xa4(r4); + stw r7, 0xa4(r3); + stw r6, 0xa8(r3); + lwz r6, 0xb0(r4); + lwz r7, 0xac(r4); + stw r7, 0xac(r3); + stw r6, 0xb0(r3); + lwz r6, 0xb4(r4); + stw r6, 0xb4(r3); + lbz r6, 0xb8(r4); + stb r6, 0xb8(r3); + lbz r6, 0xb9(r4); + stb r6, 0xb9(r3); + lbz r6, 0xba(r4); + stb r6, 0xba(r3); + lwz r6, 0xbc(r4); + stw r6, 0xbc(r3); + lbz r6, 0xc0(r4); + stb r6, 0xc0(r3); + lbz r6, 0xc1(r4); + stb r6, 0xc1(r3); + lbz r6, 0xc2(r4); + stb r6, 0xc2(r3); + lwz r6, 0xc4(r4); + stw r6, 0xc4(r3); + lwz r6, 0xc8(r4); + stw r6, 0xc8(r3); + lwz r6, 0xcc(r4); + stw r6, 0xcc(r3); + lwz r6, 0xd0(r4); + stw r6, 0xd0(r3); + lwz r6, 0xd4(r4); + stw r6, 0xd4(r3); + lhz r6, 0xd8(r4); + sth r6, 0xd8(r3); + lhz r6, 0xda(r4); + sth r6, 0xda(r3); + lhz r6, 0xdc(r4); + sth r6, 0xdc(r3); + lha r6, 0xde(r4); + sth r6, 0xde(r3); + lbz r6, 0xe0(r4); + stb r6, 0xe0(r3); + lbz r6, 0xe1(r4); + stb r6, 0xe1(r3); + lbz r6, 0xe2(r4); + stb r6, 0xe2(r3); + lhz r6, 0xe8(r4); + sth r6, 0xe8(r3); + lbz r6, 0xec(r4); + addi r4, r4, 0xf0; + stb r6, 0xec(r3); + addi r3, r3, 0xf0; + cmplw r3, r5; + blt lbl_8052e194; + lwz r22, 0x1758(r31); + li r0, 0xe; + lwz r23, 0x175c(r31); + addi r5, r31, 0xb98; + lwz r24, 0x1760(r31); + addi r4, r31, 0x1788; + lwz r25, 0x1764(r31); + lwz r26, 0x1768(r31); + lwz r27, 0x176c(r31); + lwz r28, 0x1770(r31); + lbz r29, 0x1774(r31); + lbz r30, 0x1775(r31); + lbz r12, 0x1776(r31); + lbz r11, 0x1777(r31); + lwz r10, 0x1778(r31); + lbz r9, 0x177c(r31); + lbz r8, 0x177d(r31); + lwz r7, 0x1780(r31); + lwz r6, 0x1784(r31); + lwz r3, 0x1788(r31); + stw r22, 0xb68(r31); + stw r23, 0xb6c(r31); + stw r24, 0xb70(r31); + stw r25, 0xb74(r31); + stw r26, 0xb78(r31); + stw r27, 0xb7c(r31); + stw r28, 0xb80(r31); + stb r29, 0xb84(r31); + stb r30, 0xb85(r31); + stb r12, 0xb86(r31); + stb r11, 0xb87(r31); + stw r10, 0xb88(r31); + stb r9, 0xb8c(r31); + stb r8, 0xb8d(r31); + stw r7, 0xb90(r31); + stw r6, 0xb94(r31); + stw r3, 0xb98(r31); + mtctr r0; +lbl_8052e3fc: + lwz r3, 4(r4); + lwzu r0, 8(r4); + stw r3, 4(r5); + stwu r0, 8(r5); + bdnz lbl_8052e3fc; + lwz r0, 0x17fc(r31); + stw r0, 0xc0c(r31); + lmw r22, 8(r1); + lwz r0, 0x34(r1); + mtlr r0; + addi r1, r1, 0x30; + blr; + // clang-format on +} + +// Symbol: unk_8052e42c +// PAL: 0x8052e42c..0x8052e434 +MARK_BINARY_BLOB(unk_8052e42c, 0x8052e42c, 0x8052e434); +asm UNKNOWN_FUNCTION(unk_8052e42c) { + // clang-format off + nofralloc; + stw r4, 0xc(r3); + blr; + // clang-format on +} + +// Symbol: RacedataScenario_getPlayer +// PAL: 0x8052e434..0x8052e444 +MARK_BINARY_BLOB(RacedataScenario_getPlayer, 0x8052e434, 0x8052e444); +asm UNKNOWN_FUNCTION(RacedataScenario_getPlayer) { + // clang-format off + nofralloc; + mulli r0, r4, 0xf0; + add r3, r3, r0; + addi r3, r3, 8; + blr; + // clang-format on +} + +// Symbol: unk_8052e444 +// PAL: 0x8052e444..0x8052e44c +MARK_BINARY_BLOB(unk_8052e444, 0x8052e444, 0x8052e44c); +asm UNKNOWN_FUNCTION(unk_8052e444) { + // clang-format off + nofralloc; + stw r4, 8(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052e44c +// PAL: 0x8052e44c..0x8052e454 +MARK_BINARY_BLOB(unk_8052e44c, 0x8052e44c, 0x8052e454); +asm UNKNOWN_FUNCTION(unk_8052e44c) { + // clang-format off + nofralloc; + stw r4, 0x10(r3); + blr; + // clang-format on +} + +// Symbol: Racedata_resetSomeStuff +// PAL: 0x8052e454..0x8052e658 +MARK_BINARY_BLOB(Racedata_resetSomeStuff, 0x8052e454, 0x8052e658); +asm UNKNOWN_FUNCTION(Racedata_resetSomeStuff) { + // clang-format off + nofralloc; + lwz r4, 0x1780(r3); + li r6, 1; + li r0, 2; + li r11, 0; + rlwinm r4, r4, 0, 0, 0x1c; + li r5, 3; + stw r11, 0x1770(r3); + li r12, 0; + stw r6, 0x176c(r3); + stb r5, 0x177d(r3); + stw r6, 0x175c(r3); + stw r4, 0x1780(r3); + mtctr r0; +lbl_8052e488: + clrlwi r10, r12, 0x18; + addi r0, r12, 2; + mulli r5, r10, 0xf0; + addi r4, r12, 1; + clrlwi r7, r0, 0x18; + addi r0, r12, 3; + add r9, r3, r5; + clrlwi r8, r4, 0x18; + sth r11, 0xcf0(r9); + clrlwi r6, r0, 0x18; + addi r4, r12, 4; + addi r0, r12, 5; + sth r11, 0xcf6(r9); + clrlwi r5, r4, 0x18; + addi r10, r10, 1; + clrlwi r4, r0, 0x18; + stb r10, 0xcf9(r9); + addi r0, r8, 1; + addi r7, r7, 1; + addi r6, r6, 1; + stb r10, 0xcf8(r9); + addi r5, r5, 1; + addi r4, r4, 1; + addi r12, r12, 6; + sth r11, 0xde0(r9); + sth r11, 0xde6(r9); + stb r0, 0xde9(r9); + stb r0, 0xde8(r9); + sth r11, 0xed0(r9); + sth r11, 0xed6(r9); + stb r7, 0xed9(r9); + stb r7, 0xed8(r9); + sth r11, 0xfc0(r9); + sth r11, 0xfc6(r9); + stb r6, 0xfc9(r9); + stb r6, 0xfc8(r9); + sth r11, 0x10b0(r9); + sth r11, 0x10b6(r9); + stb r5, 0x10b9(r9); + stb r5, 0x10b8(r9); + sth r11, 0x11a0(r9); + sth r11, 0x11a6(r9); + stb r4, 0x11a9(r9); + stb r4, 0x11a8(r9); + bdnz lbl_8052e488; + lwz r4, 0x2370(r3); + li r11, 0; + li r0, 2; + li r6, 3; + li r5, 1; + rlwinm r4, r4, 0, 0, 0x1c; + stb r11, 0x177c(r3); + li r12, 0; + stb r6, 0x177d(r3); + stw r11, 0x2360(r3); + stw r5, 0x235c(r3); + stb r6, 0x236d(r3); + stw r5, 0x234c(r3); + stw r4, 0x2370(r3); + mtctr r0; +lbl_8052e578: + clrlwi r10, r12, 0x18; + addi r0, r12, 2; + mulli r5, r10, 0xf0; + addi r4, r12, 1; + clrlwi r7, r0, 0x18; + addi r0, r12, 3; + add r9, r3, r5; + clrlwi r8, r4, 0x18; + sth r11, 0x18e0(r9); + clrlwi r6, r0, 0x18; + addi r4, r12, 4; + addi r0, r12, 5; + sth r11, 0x18e6(r9); + clrlwi r5, r4, 0x18; + addi r10, r10, 1; + clrlwi r4, r0, 0x18; + stb r10, 0x18e9(r9); + addi r0, r8, 1; + addi r7, r7, 1; + addi r6, r6, 1; + stb r10, 0x18e8(r9); + addi r5, r5, 1; + addi r4, r4, 1; + addi r12, r12, 6; + sth r11, 0x19d0(r9); + sth r11, 0x19d6(r9); + stb r0, 0x19d9(r9); + stb r0, 0x19d8(r9); + sth r11, 0x1ac0(r9); + sth r11, 0x1ac6(r9); + stb r7, 0x1ac9(r9); + stb r7, 0x1ac8(r9); + sth r11, 0x1bb0(r9); + sth r11, 0x1bb6(r9); + stb r6, 0x1bb9(r9); + stb r6, 0x1bb8(r9); + sth r11, 0x1ca0(r9); + sth r11, 0x1ca6(r9); + stb r5, 0x1ca9(r9); + stb r5, 0x1ca8(r9); + sth r11, 0x1d90(r9); + sth r11, 0x1d96(r9); + stb r4, 0x1d99(r9); + stb r4, 0x1d98(r9); + bdnz lbl_8052e578; + li r4, 0; + li r0, 3; + stb r4, 0x236c(r3); + stb r0, 0x236d(r3); + blr; + li r0, 0; + sth r0, 0xd8(r3); + sth r0, 0xde(r3); + stb r4, 0xe1(r3); + stb r4, 0xe0(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052e658 +// PAL: 0x8052e658..0x8052e660 +MARK_BINARY_BLOB(unk_8052e658, 0x8052e658, 0x8052e660); +asm UNKNOWN_FUNCTION(unk_8052e658) { + // clang-format off + nofralloc; + stb r4, 0xe1(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052e660 +// PAL: 0x8052e660..0x8052e668 +MARK_BINARY_BLOB(unk_8052e660, 0x8052e660, 0x8052e668); +asm UNKNOWN_FUNCTION(unk_8052e660) { + // clang-format off + nofralloc; + stb r4, 0xe0(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052e668 +// PAL: 0x8052e668..0x8052e870 +MARK_BINARY_BLOB(unk_8052e668, 0x8052e668, 0x8052e870); +asm UNKNOWN_FUNCTION(unk_8052e668) { + // clang-format off + nofralloc; + lwz r4, 0xb70(r3); + li r6, 1; + li r0, 2; + li r11, 0; + rlwinm r4, r4, 0, 0, 0x1c; + li r5, 3; + stw r11, 0xb60(r3); + li r12, 0; + stw r6, 0xb5c(r3); + stb r5, 0xb6d(r3); + stw r6, 0xb4c(r3); + stw r4, 0xb70(r3); + mtctr r0; +lbl_8052e69c: + clrlwi r10, r12, 0x18; + addi r0, r12, 2; + mulli r5, r10, 0xf0; + addi r4, r12, 1; + clrlwi r7, r0, 0x18; + addi r0, r12, 3; + add r9, r3, r5; + clrlwi r8, r4, 0x18; + sth r11, 0xe0(r9); + clrlwi r6, r0, 0x18; + addi r4, r12, 4; + addi r0, r12, 5; + sth r11, 0xe6(r9); + clrlwi r5, r4, 0x18; + addi r10, r10, 1; + clrlwi r4, r0, 0x18; + stb r10, 0xe9(r9); + addi r0, r8, 1; + addi r7, r7, 1; + addi r6, r6, 1; + stb r10, 0xe8(r9); + addi r5, r5, 1; + addi r4, r4, 1; + addi r12, r12, 6; + sth r11, 0x1d0(r9); + sth r11, 0x1d6(r9); + stb r0, 0x1d9(r9); + stb r0, 0x1d8(r9); + sth r11, 0x2c0(r9); + sth r11, 0x2c6(r9); + stb r7, 0x2c9(r9); + stb r7, 0x2c8(r9); + sth r11, 0x3b0(r9); + sth r11, 0x3b6(r9); + stb r6, 0x3b9(r9); + stb r6, 0x3b8(r9); + sth r11, 0x4a0(r9); + sth r11, 0x4a6(r9); + stb r5, 0x4a9(r9); + stb r5, 0x4a8(r9); + sth r11, 0x590(r9); + sth r11, 0x596(r9); + stb r4, 0x599(r9); + stb r4, 0x598(r9); + bdnz lbl_8052e69c; + li r4, 0; + li r0, 3; + stb r4, 0xb6c(r3); + stb r0, 0xb6d(r3); + blr; + blr; + blr; + blr; + lbz r4, 0xb6c(r3); + cmplwi r4, 0x64; + bge lbl_8052e788; + addi r0, r4, 1; + stb r0, 0xb6c(r3); + b lbl_8052e790; +lbl_8052e788: + li r0, 0; + stb r0, 0xb6c(r3); +lbl_8052e790: + li r6, 0; + mulli r5, r6, 0xf0; + li r6, 6; + add r4, r3, r5; + lbz r0, 0xea(r4); + mulli r5, r6, 0xf0; + stb r0, 0xe9(r4); + lhz r0, 0xe2(r4); + sth r0, 0xe0(r4); + lbz r0, 0x1da(r4); + stb r0, 0x1d9(r4); + lhz r0, 0x1d2(r4); + sth r0, 0x1d0(r4); + lbz r0, 0x2ca(r4); + stb r0, 0x2c9(r4); + lhz r0, 0x2c2(r4); + sth r0, 0x2c0(r4); + lbz r0, 0x3ba(r4); + stb r0, 0x3b9(r4); + lhz r0, 0x3b2(r4); + sth r0, 0x3b0(r4); + lbz r0, 0x4aa(r4); + stb r0, 0x4a9(r4); + lhz r0, 0x4a2(r4); + sth r0, 0x4a0(r4); + lbz r0, 0x59a(r4); + stb r0, 0x599(r4); + lhz r0, 0x592(r4); + sth r0, 0x590(r4); + add r4, r3, r5; + lbz r0, 0xea(r4); + stb r0, 0xe9(r4); + lhz r0, 0xe2(r4); + sth r0, 0xe0(r4); + lbz r0, 0x1da(r4); + stb r0, 0x1d9(r4); + lhz r0, 0x1d2(r4); + sth r0, 0x1d0(r4); + lbz r0, 0x2ca(r4); + stb r0, 0x2c9(r4); + lhz r0, 0x2c2(r4); + sth r0, 0x2c0(r4); + lbz r0, 0x3ba(r4); + stb r0, 0x3b9(r4); + lhz r0, 0x3b2(r4); + sth r0, 0x3b0(r4); + lbz r0, 0x4aa(r4); + stb r0, 0x4a9(r4); + lhz r0, 0x4a2(r4); + sth r0, 0x4a0(r4); + lbz r0, 0x59a(r4); + stb r0, 0x599(r4); + lhz r0, 0x592(r4); + sth r0, 0x590(r4); + lbz r3, 0xb6c(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052e870 +// PAL: 0x8052e870..0x8052e950 +MARK_BINARY_BLOB(unk_8052e870, 0x8052e870, 0x8052e950); +asm UNKNOWN_FUNCTION(unk_8052e870) { + // clang-format off + nofralloc; + stwu r1, -0x50(r1); + mflr r0; + stw r0, 0x54(r1); + stfd f31, 0x40(r1); + psq_st f31, 72(r1), 0, qr0; + stfd f30, 0x30(r1); + psq_st f30, 56(r1), 0, qr0; + addi r11, r1, 0x30; + bl unk_805553b0; + lis r29, 0; + lis r5, 0; + lwz r6, 0(r29); + lis r3, 0; + mulli r28, r4, 0xf0; + lfs f30, 0(r5); + lbz r30, 0x24(r6); + mr r26, r4; + lfd f31, 0(r3); + li r27, 0; + lis r31, 0x4330; + b lbl_8052e910; +lbl_8052e8c4: + clrlwi r0, r27, 0x18; + cmplw r26, r0; + beq lbl_8052e90c; + lwz r3, 0(r29); + mulli r0, r0, 0xf0; + addi r4, r3, 0x28; + add r3, r4, r28; + add r4, r4, r0; + addi r4, r4, 0xe4; + addi r3, r3, 0xe4; + bl unk_8052d1c0; + extsh r0, r3; + stw r31, 8(r1); + xoris r0, r0, 0x8000; + stw r0, 0xc(r1); + lfd f0, 8(r1); + fsubs f0, f0, f31; + fadds f30, f30, f0; +lbl_8052e90c: + addi r27, r27, 1; +lbl_8052e910: + clrlwi r0, r27, 0x18; + cmplw r0, r30; + blt lbl_8052e8c4; + fctiwz f0, f30; + stfd f0, 8(r1); + lwz r3, 0xc(r1); + psq_l f31, 72(r1), 0, qr0; + lfd f31, 0x40(r1); + psq_l f30, 56(r1), 0, qr0; + lfd f30, 0x30(r1); + addi r11, r1, 0x30; + bl unk_805553b0; + lwz r0, 0x54(r1); + mtlr r0; + addi r1, r1, 0x50; + blr; + // clang-format on +} + +// Symbol: unk_8052e950 +// PAL: 0x8052e950..0x8052ed18 +MARK_BINARY_BLOB(unk_8052e950, 0x8052e950, 0x8052ed18); +asm UNKNOWN_FUNCTION(unk_8052e950) { + // clang-format off + nofralloc; + stwu r1, -0x90(r1); + mflr r0; + stw r0, 0x94(r1); + stfd f31, 0x80(r1); + psq_st f31, 136(r1), 0, qr0; + stfd f30, 0x70(r1); + psq_st f30, 120(r1), 0, qr0; + addi r11, r1, 0x70; + bl unk_805553b0; + lwz r0, 0xb54(r3); + lis r21, 0; + lwz r4, 0(r21); + mr r15, r3; + cmpwi r0, 0; + lbz r22, 0x24(r4); + bne lbl_8052ecf0; + addi r0, r22, -1; + lis r3, 0; + mulli r0, r0, 0xc; + lis r4, 0; + lfd f31, 0(r3); + addi r18, r1, 8; + addi r4, r4, 0; + add r20, r4, r0; + li r17, 0; + lis r30, 0; + li r29, 1; + lis r31, 0x4330; + li r26, 0; + lis r14, 0; + b lbl_8052ec4c; +lbl_8052e9cc: + lwz r3, 0(r30); + rlwinm r19, r17, 2, 0x16, 0x1d; + lwz r6, 0(r21); + li r4, 0; + lwz r5, 0xc(r3); + lwz r3, 0xb70(r6); + lwzx r5, r5, r19; + addi r0, r3, -3; + cmplwi r0, 7; + lbz r23, 0x20(r5); + bgt lbl_8052ea08; + slw r0, r29, r0; + andi. r0, r0, 0xc1; + beq lbl_8052ea08; + li r4, 1; +lbl_8052ea08: + cmpwi r4, 0; + beq lbl_8052ea18; + lhz r24, 0x22(r5); + b lbl_8052ea1c; +lbl_8052ea18: + li r24, 0; +lbl_8052ea1c: + lwz r3, 0xb50(r15); + rlwinm r25, r17, 1, 0x17, 0x1e; + sthx r26, r18, r25; + li r0, 0; + cmpwi r3, 7; + blt lbl_8052ea40; + cmpwi r3, 0xa; + bgt lbl_8052ea40; + li r0, 1; +lbl_8052ea40: + cmpwi r0, 0; + beq lbl_8052ebe4; + clrlwi r27, r17, 0x18; + lfs f30, 0(r14); + mulli r0, r27, 0xf0; + li r16, 0; + add r28, r15, r0; + b lbl_8052eb80; +lbl_8052ea60: + clrlwi r0, r16, 0x18; + cmplw r27, r0; + beq lbl_8052eb7c; + lwz r4, 0(r21); + li r0, 0; + li r3, 0; + li r5, 0; + lwz r4, 0xb70(r4); + addi r4, r4, -3; + cmplwi r4, 7; + bgt lbl_8052ea9c; + slw r4, r29, r4; + andi. r4, r4, 0xc1; + beq lbl_8052ea9c; + li r5, 1; +lbl_8052ea9c: + cmpwi r5, 0; + beq lbl_8052ead4; + lwz r5, 0(r30); + rlwinm r4, r16, 2, 0x16, 0x1d; + lwz r5, 0xc(r5); + lwzx r4, r5, r4; + lhz r4, 0x22(r4); + cmplw r24, r4; + ble lbl_8052eac8; + li r0, 1; + b lbl_8052eb00; +lbl_8052eac8: + bge lbl_8052eb00; + li r3, 1; + b lbl_8052eb00; +lbl_8052ead4: + lwz r5, 0(r30); + rlwinm r4, r16, 2, 0x16, 0x1d; + lwz r5, 0xc(r5); + lwzx r4, r5, r4; + lbz r4, 0x20(r4); + cmplw r23, r4; + bge lbl_8052eaf8; + li r0, 1; + b lbl_8052eb00; +lbl_8052eaf8: + ble lbl_8052eb00; + li r3, 1; +lbl_8052eb00: + cmpwi r0, 0; + beq lbl_8052eb40; + clrlwi r0, r16, 0x18; + addi r3, r28, 0xec; + mulli r0, r0, 0xf0; + add r4, r15, r0; + addi r4, r4, 0xec; + bl unk_8052d118; + extsh r0, r3; + stw r31, 0x20(r1); + xoris r0, r0, 0x8000; + stw r0, 0x24(r1); + lfd f0, 0x20(r1); + fsubs f0, f0, f31; + fadds f30, f30, f0; + b lbl_8052eb7c; +lbl_8052eb40: + cmpwi r3, 0; + beq lbl_8052eb7c; + clrlwi r0, r16, 0x18; + addi r3, r28, 0xec; + mulli r0, r0, 0xf0; + add r4, r15, r0; + addi r4, r4, 0xec; + bl unk_8052d1c0; + extsh r0, r3; + stw r31, 0x20(r1); + xoris r0, r0, 0x8000; + stw r0, 0x24(r1); + lfd f0, 0x20(r1); + fsubs f0, f0, f31; + fadds f30, f30, f0; +lbl_8052eb7c: + addi r16, r16, 1; +lbl_8052eb80: + clrlwi r0, r16, 0x18; + cmplw r0, r22; + blt lbl_8052ea60; + lwz r3, 0(r21); + fctiwz f0, f30; + li r4, 0; + lwz r3, 0xb70(r3); + stfd f0, 0x20(r1); + addi r0, r3, -3; + cmplwi r0, 7; + lwz r3, 0x24(r1); + bgt lbl_8052ebc0; + slw r0, r29, r0; + andi. r0, r0, 0xc1; + beq lbl_8052ebc0; + li r4, 1; +lbl_8052ebc0: + cmpwi r4, 0; + bne lbl_8052ebe0; + cmplwi r23, 1; + bne lbl_8052ebe0; + extsh r0, r3; + cmpwi r0, 1; + bge lbl_8052ebe0; + li r3, 1; +lbl_8052ebe0: + sthx r3, r18, r25; +lbl_8052ebe4: + cmpwi r23, 0; + beq lbl_8052ec48; + cmpwi r22, 0; + beq lbl_8052ec48; + clrlwi r0, r17, 0x18; + mulli r0, r0, 0xf0; + add r4, r15, r0; + stb r23, 0xea(r4); + lwz r0, 0xb50(r15); + cmpwi r0, 9; + blt lbl_8052ec18; + cmpwi r0, 0xa; + ble lbl_8052ec20; +lbl_8052ec18: + cmpwi r0, 3; + bne lbl_8052ec34; +lbl_8052ec20: + lwz r3, 0(r30); + lwz r3, 0xc(r3); + lwzx r3, r3, r19; + lhz r3, 0x22(r3); + b lbl_8052ec3c; +lbl_8052ec34: + add r3, r20, r23; + lbz r3, -1(r3); +lbl_8052ec3c: + lhz r0, 0xe0(r4); + add r0, r0, r3; + sth r0, 0xe2(r4); +lbl_8052ec48: + addi r17, r17, 1; +lbl_8052ec4c: + clrlwi r0, r17, 0x18; + cmplw r0, r22; + blt lbl_8052e9cc; + addi r14, r1, 8; + li r16, 0; + b lbl_8052ec84; +lbl_8052ec64: + clrlwi r3, r16, 0x18; + rlwinm r0, r16, 1, 0x17, 0x1e; + mulli r3, r3, 0xf0; + lhax r4, r14, r0; + add r3, r15, r3; + addi r3, r3, 0xec; + bl unk_8052d270; + addi r16, r16, 1; +lbl_8052ec84: + clrlwi r0, r16, 0x18; + cmplw r0, r22; + blt lbl_8052ec64; + lwz r0, 0xb50(r15); + cmpwi r0, 0; + bne lbl_8052ecf0; + lis r3, 0; + li r16, 0; + lwz r15, 0(r3); + lis r14, 0; + b lbl_8052ecdc; +lbl_8052ecb0: + clrlwi r0, r16, 0x18; + mulli r0, r0, 0xf0; + add r3, r4, r0; + lwz r0, 0x38(r3); + cmpwi r0, 0; + bne lbl_8052ecd8; + lwz r3, 0xc(r15); + rlwinm r0, r16, 2, 0x16, 0x1d; + lwzx r3, r3, r0; + bl RaceinfoPlayer_updateGpRankScore; +lbl_8052ecd8: + addi r16, r16, 1; +lbl_8052ecdc: + lwz r4, 0(r14); + clrlwi r3, r16, 0x18; + lbz r0, 0x24(r4); + cmplw r3, r0; + blt lbl_8052ecb0; +lbl_8052ecf0: + psq_l f31, 136(r1), 0, qr0; + lfd f31, 0x80(r1); + psq_l f30, 120(r1), 0, qr0; + addi r11, r1, 0x70; + lfd f30, 0x70(r1); + bl unk_805553b0; + lwz r0, 0x94(r1); + mtlr r0; + addi r1, r1, 0x90; + blr; + // clang-format on +} + +// Symbol: unk_8052ed18 +// PAL: 0x8052ed18..0x8052ed20 +MARK_BINARY_BLOB(unk_8052ed18, 0x8052ed18, 0x8052ed20); +asm UNKNOWN_FUNCTION(unk_8052ed18) { + // clang-format off + nofralloc; + lwz r3, 0xb54(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052ed20 +// PAL: 0x8052ed20..0x8052ed28 +MARK_BINARY_BLOB(unk_8052ed20, 0x8052ed20, 0x8052ed28); +asm UNKNOWN_FUNCTION(unk_8052ed20) { + // clang-format off + nofralloc; + lwz r3, 0x10(r3); + blr; + // clang-format on +} + +// Symbol: RacedataScenario_postInitControllers +// PAL: 0x8052ed28..0x8052eef0 +MARK_BINARY_BLOB(RacedataScenario_postInitControllers, 0x8052ed28, 0x8052eef0); +asm UNKNOWN_FUNCTION(RacedataScenario_postInitControllers) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + stw r0, 0x24(r1); + stw r31, 0x1c(r1); + mr r31, r3; + stw r30, 0x18(r1); + stw r29, 0x14(r1); + lwz r0, 0xb54(r3); + cmpwi r0, 5; + beq lbl_8052ed64; + cmpwi r0, 0; + beq lbl_8052edac; + cmpwi r0, 1; + beq lbl_8052ee84; + b lbl_8052eed4; +lbl_8052ed64: + li r29, 0; + lis r30, 0; +lbl_8052ed6c: + clrlwi r0, r29, 0x18; + mulli r0, r0, 0xf0; + add r3, r31, r0; + lwz r0, 0x18(r3); + cmpwi r0, 0; + bne lbl_8052ed9c; + lbz r0, 0xe(r3); + extsb. r0, r0; + blt lbl_8052ed9c; + lwz r3, 0(r30); + clrlwi r4, r0, 0x18; + bl unk_80524558; +lbl_8052ed9c: + addi r29, r29, 1; + cmplwi r29, 0xc; + blt lbl_8052ed6c; + b lbl_8052eed4; +lbl_8052edac: + li r0, 4; + li r6, 0; + lis r5, 0; + mtctr r0; +lbl_8052edbc: + clrlwi r0, r6, 0x18; + mulli r0, r0, 0xf0; + add r4, r3, r0; + lwz r0, 0x18(r4); + cmpwi r0, 0; + bne lbl_8052edf8; + lbz r0, 0xe(r4); + extsb. r0, r0; + blt lbl_8052edf8; + clrlwi r0, r0, 0x18; + lwz r4, 0(r5); + mulli r0, r0, 0xec; + add r4, r4, r0; + lwz r0, 0x10(r4); + stw r0, 8(r4); +lbl_8052edf8: + addi r6, r6, 1; + clrlwi r0, r6, 0x18; + mulli r0, r0, 0xf0; + add r4, r3, r0; + lwz r0, 0x18(r4); + cmpwi r0, 0; + bne lbl_8052ee38; + lbz r0, 0xe(r4); + extsb. r0, r0; + blt lbl_8052ee38; + clrlwi r0, r0, 0x18; + lwz r4, 0(r5); + mulli r0, r0, 0xec; + add r4, r4, r0; + lwz r0, 0x10(r4); + stw r0, 8(r4); +lbl_8052ee38: + addi r6, r6, 1; + clrlwi r0, r6, 0x18; + mulli r0, r0, 0xf0; + add r4, r3, r0; + lwz r0, 0x18(r4); + cmpwi r0, 0; + bne lbl_8052ee78; + lbz r0, 0xe(r4); + extsb. r0, r0; + blt lbl_8052ee78; + clrlwi r0, r0, 0x18; + lwz r4, 0(r5); + mulli r0, r0, 0xec; + add r4, r4, r0; + lwz r0, 0x10(r4); + stw r0, 8(r4); +lbl_8052ee78: + addi r6, r6, 1; + bdnz lbl_8052edbc; + b lbl_8052eed4; +lbl_8052ee84: + lwz r0, 0xb54(r4); + cmpwi r0, 0; + bne lbl_8052eed4; + li r29, 0; + lis r30, 0; +lbl_8052ee98: + clrlwi r0, r29, 0x18; + mulli r0, r0, 0xf0; + add r3, r31, r0; + lwz r0, 0x18(r3); + cmpwi r0, 0; + bne lbl_8052eec8; + lbz r0, 0xe(r3); + extsb. r0, r0; + blt lbl_8052eec8; + lwz r3, 0(r30); + clrlwi r4, r0, 0x18; + bl unk_80524500; +lbl_8052eec8: + addi r29, r29, 1; + cmplwi r29, 0xc; + blt lbl_8052ee98; +lbl_8052eed4: + lwz r0, 0x24(r1); + lwz r31, 0x1c(r1); + lwz r30, 0x18(r1); + lwz r29, 0x14(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: unk_8052eef0 +// PAL: 0x8052eef0..0x8052efd4 +MARK_BINARY_BLOB(unk_8052eef0, 0x8052eef0, 0x8052efd4); +asm UNKNOWN_FUNCTION(unk_8052eef0) { + // clang-format off + nofralloc; + stwu r1, -0xf0(r1); + mflr r0; + stw r0, 0xf4(r1); + stw r31, 0xec(r1); + li r31, 0; + stw r30, 0xe8(r1); + mr r30, r5; + stw r29, 0xe4(r1); + mr r29, r4; + stw r28, 0xe0(r1); + mr r28, r3; + lwz r3, 0xbec(r3); + bl RawGhostFile_isValid; + cmpwi r3, 0; + beq lbl_8052efb0; + addi r3, r1, 8; + bl GhostFile_construct; + lwz r4, 0xbec(r28); + addi r3, r1, 8; + bl GhostFile_read; + lwz r3, 0xc0(r1); + lwz r0, 0xb48(r28); + cmpw r3, r0; + bne lbl_8052ef98; + extsb. r0, r30; + blt lbl_8052ef70; + lis r3, 0; + lwz r5, 0xdc(r1); + lwz r3, 0(r3); + clrlwi r4, r30, 0x18; + lbz r6, 0xd0(r1); + bl InputMgr_setGhostController; +lbl_8052ef70: + mulli r3, r29, 0xf0; + lwz r0, 0xb8(r1); + li r31, 1; + add r3, r28, r3; + stw r0, 0x14(r3); + lwz r0, 0xbc(r1); + stw r0, 0x10(r3); + stb r30, 0xe(r3); + lwz r0, 0xc4(r1); + stw r0, 0xd8(r3); +lbl_8052ef98: + lis r4, 0; + addi r3, r1, 0x70; + addi r4, r4, 0; + li r5, 0xc; + li r6, 5; + bl unk_805553b0; +lbl_8052efb0: + mr r3, r31; + lwz r31, 0xec(r1); + lwz r30, 0xe8(r1); + lwz r29, 0xe4(r1); + lwz r28, 0xe0(r1); + lwz r0, 0xf4(r1); + mtlr r0; + addi r1, r1, 0xf0; + blr; + // clang-format on +} + +// Symbol: unk_8052efd4 +// PAL: 0x8052efd4..0x8052f064 +MARK_BINARY_BLOB(unk_8052efd4, 0x8052efd4, 0x8052f064); +asm UNKNOWN_FUNCTION(unk_8052efd4) { + // clang-format off + nofralloc; + li r6, 0; + li r0, -1; + mulli r5, r6, 0xf0; + li r6, 6; + add r4, r3, r5; + stb r0, 0xd(r4); + mulli r5, r6, 0xf0; + stb r0, 0xe(r4); + stb r0, 0xfd(r4); + stb r0, 0xfe(r4); + stb r0, 0x1ed(r4); + stb r0, 0x1ee(r4); + stb r0, 0x2dd(r4); + stb r0, 0x2de(r4); + stb r0, 0x3cd(r4); + stb r0, 0x3ce(r4); + stb r0, 0x4bd(r4); + stb r0, 0x4be(r4); + add r4, r3, r5; + stb r0, 0xd(r4); + stb r0, 0xe(r4); + stb r0, 0xfd(r4); + stb r0, 0xfe(r4); + stb r0, 0x1ed(r4); + stb r0, 0x1ee(r4); + stb r0, 0x2dd(r4); + stb r0, 0x2de(r4); + stb r0, 0x3cd(r4); + stb r0, 0x3ce(r4); + stb r0, 0x4bd(r4); + stb r0, 0x4be(r4); + stb r0, 0xb64(r3); + stb r0, 0xb65(r3); + stb r0, 0xb66(r3); + stb r0, 0xb67(r3); + blr; + // clang-format on +} + +// Symbol: unk_8052f064 +// PAL: 0x8052f064..0x8052f1e0 +MARK_BINARY_BLOB(unk_8052f064, 0x8052f064, 0x8052f1e0); +asm UNKNOWN_FUNCTION(unk_8052f064) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + li r0, 0; + stw r31, 0xc(r1); + stw r30, 8(r1); + lwz r5, 0xb50(r3); + cmpwi r5, 7; + blt lbl_8052f08c; + cmpwi r5, 0xa; + bgt lbl_8052f08c; + li r0, 1; +lbl_8052f08c: + cmpwi r0, 0; + bne lbl_8052f1d0; + cmpwi r4, 0; + li r5, 0; + beq lbl_8052f1d0; + cmplwi r4, 8; + addi r0, r4, 0xf8; + ble lbl_8052f194; + clrlwi r6, r0, 0x18; + li r12, 0; + addi r0, r6, 7; + srwi r0, r0, 3; + mtctr r0; + cmplwi r6, 0; + ble lbl_8052f194; +lbl_8052f0c8: + clrlwi r8, r5, 0x18; + addi r6, r5, 1; + mulli r7, r8, 0xf0; + addi r0, r5, 2; + clrlwi r11, r6, 0x18; + clrlwi r10, r0, 0x18; + add r31, r3, r7; + addi r0, r5, 3; + sth r12, 0xe0(r31); + clrlwi r9, r0, 0x18; + subf r30, r8, r4; + addi r0, r5, 4; + stb r30, 0xe9(r31); + clrlwi r8, r0, 0x18; + addi r7, r5, 5; + addi r6, r5, 6; + stb r30, 0xe8(r31); + addi r0, r5, 7; + clrlwi r7, r7, 0x18; + clrlwi r6, r6, 0x18; + sth r12, 0x1d0(r31); + subf r11, r11, r4; + clrlwi r0, r0, 0x18; + subf r10, r10, r4; + stb r11, 0x1d9(r31); + subf r9, r9, r4; + subf r8, r8, r4; + subf r7, r7, r4; + stb r11, 0x1d8(r31); + subf r6, r6, r4; + subf r0, r0, r4; + addi r5, r5, 8; + sth r12, 0x2c0(r31); + stb r10, 0x2c9(r31); + stb r10, 0x2c8(r31); + sth r12, 0x3b0(r31); + stb r9, 0x3b9(r31); + stb r9, 0x3b8(r31); + sth r12, 0x4a0(r31); + stb r8, 0x4a9(r31); + stb r8, 0x4a8(r31); + sth r12, 0x590(r31); + stb r7, 0x599(r31); + stb r7, 0x598(r31); + sth r12, 0x680(r31); + stb r6, 0x689(r31); + stb r6, 0x688(r31); + sth r12, 0x770(r31); + stb r0, 0x779(r31); + stb r0, 0x778(r31); + bdnz lbl_8052f0c8; +lbl_8052f194: + clrlwi r6, r5, 0x18; + li r7, 0; + subf r0, r6, r4; + mtctr r0; + cmplw r6, r4; + bge lbl_8052f1d0; +lbl_8052f1ac: + clrlwi r6, r5, 0x18; + addi r5, r5, 1; + mulli r0, r6, 0xf0; + subf r8, r6, r4; + add r6, r3, r0; + sth r7, 0xe0(r6); + stb r8, 0xe9(r6); + stb r8, 0xe8(r6); + bdnz lbl_8052f1ac; +lbl_8052f1d0: + lwz r31, 0xc(r1); + lwz r30, 8(r1); + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_copyPrevPositions +// PAL: 0x8052f1e0..0x8052f4e8 +MARK_BINARY_BLOB(RacedataScenario_copyPrevPositions, 0x8052f1e0, 0x8052f4e8); +asm UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + lwz r0, 0xb50(r3); + cmpwi r0, 0; + bne lbl_8052f228; + lbz r4, 0xb6c(r3); + cmplwi r4, 4; + bgt lbl_8052f228; + lwz r0, 0xb54(r3); + cmpwi r0, 1; + beq lbl_8052f228; + lwz r0, 0xb68(r3); + lis r5, 0; + addi r5, r5, 0; + rlwinm r4, r4, 2, 0x16, 0x1d; + slwi r0, r0, 4; + add r0, r5, r0; + lwzx r0, r4, r0; + stw r0, 0xb48(r3); +lbl_8052f228: + lwz r4, 0xb50(r3); + li r0, 0; + cmpwi r4, 7; + blt lbl_8052f244; + cmpwi r4, 0xa; + bgt lbl_8052f244; + li r0, 1; +lbl_8052f244: + cmpwi r0, 0; + beq lbl_8052f4e0; + li r11, 1; + li r9, 2; + stb r9, 9(r1); + li r8, 3; + li r7, 4; + li r6, 5; + stb r8, 0xa(r1); + li r4, 6; + li r10, 7; + li r9, 8; + stb r7, 0xb(r1); + li r8, 9; + li r7, 0xa; + addi r5, r1, 8; + stb r6, 0xc(r1); + li r6, 0xb; + li r12, 1; + li r0, 3; + stb r4, 0xd(r1); + li r4, 0xc; + stb r11, 8(r1); + stb r10, 0xe(r1); + stb r9, 0xf(r1); + stb r8, 0x10(r1); + stb r7, 0x11(r1); + stb r6, 0x12(r1); + stb r4, 0x13(r1); +lbl_8052f2b8: + clrlwi r7, r12, 0x18; + li r9, 0; + mtctr r0; +lbl_8052f2c4: + clrlwi r4, r9, 0x18; + mulli r6, r4, 0xf0; + add r6, r3, r6; + lwz r8, 0x18(r6); + cmpwi r8, 5; + beq lbl_8052f2f0; + lbz r6, 0xe9(r6); + cmplw r7, r6; + bne lbl_8052f2f0; + stbx r11, r5, r4; + addi r11, r11, 1; +lbl_8052f2f0: + addi r9, r9, 1; + clrlwi r4, r9, 0x18; + mulli r6, r4, 0xf0; + add r6, r3, r6; + lwz r8, 0x18(r6); + cmpwi r8, 5; + beq lbl_8052f320; + lbz r6, 0xe9(r6); + cmplw r7, r6; + bne lbl_8052f320; + stbx r11, r5, r4; + addi r11, r11, 1; +lbl_8052f320: + addi r9, r9, 1; + clrlwi r4, r9, 0x18; + mulli r6, r4, 0xf0; + add r6, r3, r6; + lwz r8, 0x18(r6); + cmpwi r8, 5; + beq lbl_8052f350; + lbz r6, 0xe9(r6); + cmplw r7, r6; + bne lbl_8052f350; + stbx r11, r5, r4; + addi r11, r11, 1; +lbl_8052f350: + addi r9, r9, 1; + clrlwi r4, r9, 0x18; + mulli r6, r4, 0xf0; + add r6, r3, r6; + lwz r8, 0x18(r6); + cmpwi r8, 5; + beq lbl_8052f380; + lbz r6, 0xe9(r6); + cmplw r7, r6; + bne lbl_8052f380; + stbx r11, r5, r4; + addi r11, r11, 1; +lbl_8052f380: + addi r9, r9, 1; + bdnz lbl_8052f2c4; + addi r12, r12, 1; + cmplwi r12, 0xc; + ble lbl_8052f2b8; + li r0, 3; + addi r4, r1, 8; + li r7, 0; + mtctr r0; +lbl_8052f3a4: + clrlwi r0, r7, 0x18; + mulli r5, r0, 0xf0; + add r5, r3, r5; + lwz r6, 0x18(r5); + cmpwi r6, 5; + beq lbl_8052f3d0; + lbz r5, 0xe9(r5); + cmpwi r5, 0; + bne lbl_8052f3d0; + stbx r11, r4, r0; + addi r11, r11, 1; +lbl_8052f3d0: + addi r7, r7, 1; + clrlwi r0, r7, 0x18; + mulli r5, r0, 0xf0; + add r5, r3, r5; + lwz r6, 0x18(r5); + cmpwi r6, 5; + beq lbl_8052f400; + lbz r5, 0xe9(r5); + cmpwi r5, 0; + bne lbl_8052f400; + stbx r11, r4, r0; + addi r11, r11, 1; +lbl_8052f400: + addi r7, r7, 1; + clrlwi r0, r7, 0x18; + mulli r5, r0, 0xf0; + add r5, r3, r5; + lwz r6, 0x18(r5); + cmpwi r6, 5; + beq lbl_8052f430; + lbz r5, 0xe9(r5); + cmpwi r5, 0; + bne lbl_8052f430; + stbx r11, r4, r0; + addi r11, r11, 1; +lbl_8052f430: + addi r7, r7, 1; + clrlwi r0, r7, 0x18; + mulli r5, r0, 0xf0; + add r5, r3, r5; + lwz r6, 0x18(r5); + cmpwi r6, 5; + beq lbl_8052f460; + lbz r5, 0xe9(r5); + cmpwi r5, 0; + bne lbl_8052f460; + stbx r11, r4, r0; + addi r11, r11, 1; +lbl_8052f460: + addi r7, r7, 1; + bdnz lbl_8052f3a4; + li r0, 0; + lbz r8, 8(r1); + mulli r10, r0, 0xf0; + lbz r7, 9(r1); + lbz r6, 0xa(r1); + li r0, 6; + lbz r5, 0xb(r1); + add r9, r3, r10; + stb r8, 0xe9(r9); + mulli r10, r0, 0xf0; + lbz r4, 0xc(r1); + stb r7, 0x1d9(r9); + lbz r0, 0xd(r1); + stb r6, 0x2c9(r9); + lbz r8, 0xe(r1); + stb r5, 0x3b9(r9); + lbz r7, 0xf(r1); + stb r4, 0x4a9(r9); + lbz r6, 0x10(r1); + stb r0, 0x599(r9); + add r9, r3, r10; + lbz r5, 0x11(r1); + stb r8, 0xe9(r9); + lbz r4, 0x12(r1); + stb r7, 0x1d9(r9); + lbz r0, 0x13(r1); + stb r6, 0x2c9(r9); + stb r5, 0x3b9(r9); + stb r4, 0x4a9(r9); + stb r0, 0x599(r9); +lbl_8052f4e0: + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_initControllers +// PAL: 0x8052f4e8..0x8052f788 +MARK_BINARY_BLOB(RacedataScenario_initControllers, 0x8052f4e8, 0x8052f788); +asm UNKNOWN_FUNCTION(RacedataScenario_initControllers) { + // clang-format off + nofralloc; + stwu r1, -0x110(r1); + mflr r0; + stw r0, 0x114(r1); + stmw r21, 0xe4(r1); + li r29, -1; + mr r24, r3; + mr r25, r4; + li r28, 0; + li r27, 0; + li r26, 0; + lis r31, 0; + lis r22, 0; + li r23, 5; + stb r29, 0xb64(r3); + stb r29, 0xb65(r3); + stb r29, 0xb66(r3); + stb r29, 0xb67(r3); +lbl_8052f52c: + clrlwi r0, r26, 0x18; + mulli r0, r0, 0xf0; + add r30, r24, r0; + lwz r0, 0x18(r30); + cmpwi r0, 0; + beq lbl_8052f558; + cmpwi r0, 3; + beq lbl_8052f5c0; + cmpwi r0, 1; + beq lbl_8052f664; + b lbl_8052f668; +lbl_8052f558: + stb r28, 0xd(r30); + clrlwi r0, r27, 0x18; + mulli r0, r0, 0xec; + stb r27, 0xe(r30); + lwz r3, 0(r31); + add r3, r3, r0; + lwz r3, 8(r3); + cmpwi r3, 0; + beq lbl_8052f590; + lwz r12, 0(r3); + lwz r12, 0x10(r12); + mtctr r12; + bctrl; + b lbl_8052f594; +lbl_8052f590: + li r3, -1; +lbl_8052f594: + extsb r0, r28; + stw r3, 0xd8(r30); + add r3, r24, r0; + lbz r0, 0xb64(r3); + extsb r0, r0; + cmpwi r0, -1; + bne lbl_8052f5b4; + stb r26, 0xb64(r3); +lbl_8052f5b4: + addi r28, r28, 1; + addi r27, r27, 1; + b lbl_8052f668; +lbl_8052f5c0: + lwz r3, 0xbec(r24); + li r21, 0; + bl RawGhostFile_isValid; + cmpwi r3, 0; + beq lbl_8052f648; + addi r3, r1, 8; + bl GhostFile_construct; + lwz r4, 0xbec(r24); + addi r3, r1, 8; + bl GhostFile_read; + lwz r3, 0xc0(r1); + lwz r0, 0xb48(r24); + cmpw r3, r0; + bne lbl_8052f634; + extsb. r0, r27; + blt lbl_8052f614; + lwz r3, 0(r31); + clrlwi r4, r27, 0x18; + lwz r5, 0xdc(r1); + lbz r6, 0xd0(r1); + bl InputMgr_setGhostController; +lbl_8052f614: + lwz r0, 0xb8(r1); + li r21, 1; + stw r0, 0x14(r30); + lwz r0, 0xbc(r1); + stw r0, 0x10(r30); + stb r27, 0xe(r30); + lwz r0, 0xc4(r1); + stw r0, 0xd8(r30); +lbl_8052f634: + addi r3, r1, 0x70; + addi r4, r22, 0; + li r5, 0xc; + li r6, 5; + bl unk_805553b0; +lbl_8052f648: + cmpwi r21, 0; + beq lbl_8052f658; + addi r27, r27, 1; + b lbl_8052f668; +lbl_8052f658: + stw r23, 0x18(r30); + stw r29, 0xd8(r30); + b lbl_8052f668; +lbl_8052f664: + stw r29, 0xd8(r30); +lbl_8052f668: + addi r26, r26, 1; + cmplwi r26, 0xc; + blt lbl_8052f52c; + extsb r0, r28; + cmpw r0, r25; + bge lbl_8052f774; + li r0, 4; + li r5, 0; + mtctr r0; +lbl_8052f68c: + clrlwi r0, r5, 0x18; + mulli r0, r0, 0xf0; + add r4, r24, r0; + lwz r0, 0x18(r4); + cmpwi r0, 5; + beq lbl_8052f6d4; + lbz r0, 0xd(r4); + extsb r0, r0; + cmpwi r0, -1; + bne lbl_8052f6d4; + extsb r3, r28; + stb r28, 0xd(r4); + addi r28, r28, 1; + extsb r0, r28; + add r3, r24, r3; + cmpw r0, r25; + stb r5, 0xb64(r3); + bge lbl_8052f774; +lbl_8052f6d4: + addi r5, r5, 1; + clrlwi r0, r5, 0x18; + mulli r0, r0, 0xf0; + add r4, r24, r0; + lwz r0, 0x18(r4); + cmpwi r0, 5; + beq lbl_8052f720; + lbz r0, 0xd(r4); + extsb r0, r0; + cmpwi r0, -1; + bne lbl_8052f720; + extsb r3, r28; + stb r28, 0xd(r4); + addi r28, r28, 1; + extsb r0, r28; + add r3, r24, r3; + cmpw r0, r25; + stb r5, 0xb64(r3); + bge lbl_8052f774; +lbl_8052f720: + addi r5, r5, 1; + clrlwi r0, r5, 0x18; + mulli r0, r0, 0xf0; + add r4, r24, r0; + lwz r0, 0x18(r4); + cmpwi r0, 5; + beq lbl_8052f76c; + lbz r0, 0xd(r4); + extsb r0, r0; + cmpwi r0, -1; + bne lbl_8052f76c; + extsb r3, r28; + stb r28, 0xd(r4); + addi r28, r28, 1; + extsb r0, r28; + add r3, r24, r3; + cmpw r0, r25; + stb r5, 0xb64(r3); + bge lbl_8052f774; +lbl_8052f76c: + addi r5, r5, 1; + bdnz lbl_8052f68c; +lbl_8052f774: + lmw r21, 0xe4(r1); + lwz r0, 0x114(r1); + mtlr r0; + addi r1, r1, 0x110; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_computePlayerCounts +// PAL: 0x8052f788..0x8052f924 +MARK_BINARY_BLOB(RacedataScenario_computePlayerCounts, 0x8052f788, 0x8052f924); +asm UNKNOWN_FUNCTION(RacedataScenario_computePlayerCounts) { + // clang-format off + nofralloc; + li r0, 3; + li r8, 0; + li r9, 0; + li r10, 0; + li r11, 0; + mtctr r0; +lbl_8052f7a0: + clrlwi r0, r11, 0x18; + mulli r0, r0, 0xf0; + add r7, r3, r0; + lwz r0, 0x18(r7); + cmpwi r0, 5; + beq lbl_8052f7d8; + cmpwi r0, 0; + addi r8, r8, 1; + bne lbl_8052f7d8; + cmplwi r9, 4; + bge lbl_8052f7d4; + addi r0, r9, 1; + clrlwi r9, r0, 0x18; +lbl_8052f7d4: + addi r10, r10, 1; +lbl_8052f7d8: + addi r11, r11, 1; + clrlwi r0, r11, 0x18; + mulli r0, r0, 0xf0; + add r7, r3, r0; + lwz r0, 0x18(r7); + cmpwi r0, 5; + beq lbl_8052f814; + cmpwi r0, 0; + addi r8, r8, 1; + bne lbl_8052f814; + cmplwi r9, 4; + bge lbl_8052f810; + addi r0, r9, 1; + clrlwi r9, r0, 0x18; +lbl_8052f810: + addi r10, r10, 1; +lbl_8052f814: + addi r11, r11, 1; + clrlwi r0, r11, 0x18; + mulli r0, r0, 0xf0; + add r7, r3, r0; + lwz r0, 0x18(r7); + cmpwi r0, 5; + beq lbl_8052f850; + cmpwi r0, 0; + addi r8, r8, 1; + bne lbl_8052f850; + cmplwi r9, 4; + bge lbl_8052f84c; + addi r0, r9, 1; + clrlwi r9, r0, 0x18; +lbl_8052f84c: + addi r10, r10, 1; +lbl_8052f850: + addi r11, r11, 1; + clrlwi r0, r11, 0x18; + mulli r0, r0, 0xf0; + add r7, r3, r0; + lwz r0, 0x18(r7); + cmpwi r0, 5; + beq lbl_8052f88c; + cmpwi r0, 0; + addi r8, r8, 1; + bne lbl_8052f88c; + cmplwi r9, 4; + bge lbl_8052f888; + addi r0, r9, 1; + clrlwi r9, r0, 0x18; +lbl_8052f888: + addi r10, r10, 1; +lbl_8052f88c: + addi r11, r11, 1; + bdnz lbl_8052f7a0; + cmpwi r9, 0; + bne lbl_8052f8a0; + li r9, 1; +lbl_8052f8a0: + cmplwi r9, 3; + bne lbl_8052f8ac; + li r9, 4; +lbl_8052f8ac: + lwz r7, 0xb54(r3); + cmpwi r7, 2; + bne lbl_8052f8c0; + li r9, 1; + b lbl_8052f8dc; +lbl_8052f8c0: + cmpwi r7, 3; + bne lbl_8052f8d0; + li r9, 2; + b lbl_8052f8dc; +lbl_8052f8d0: + cmpwi r7, 4; + bne lbl_8052f8dc; + li r9, 4; +lbl_8052f8dc: + lwz r0, 0xb50(r3); + cmpwi r0, 0xb; + bne lbl_8052f914; + cmpwi r7, 7; + bne lbl_8052f904; + clrlwi r0, r8, 0x18; + cmplwi r0, 3; + ble lbl_8052f914; + li r8, 3; + b lbl_8052f914; +lbl_8052f904: + clrlwi r0, r8, 0x18; + cmplwi r0, 6; + ble lbl_8052f914; + li r8, 6; +lbl_8052f914: + stb r8, 0(r4); + stb r9, 0(r5); + stb r10, 0(r6); + blr; + // clang-format on +} + +// Symbol: RacedataScenario_initRng +// PAL: 0x8052f924..0x8052fa0c +MARK_BINARY_BLOB(RacedataScenario_initRng, 0x8052f924, 0x8052fa0c); +asm UNKNOWN_FUNCTION(RacedataScenario_initRng) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + stw r0, 0x14(r1); + stw r31, 0xc(r1); + mr r31, r3; + lwz r4, 0xb50(r3); + cmpwi r4, 4; + blt lbl_8052f94c; + cmpwi r4, 5; + ble lbl_8052f954; +lbl_8052f94c: + cmpwi r4, 2; + bne lbl_8052f974; +lbl_8052f954: + lis r4, 0x74a2; + addi r0, r4, -20331; + stw r0, 0xb74(r3); + bl unk_805553b0; + rlwinm r0, r3, 0x1d, 3, 0xf; + rlwimi r0, r3, 5, 0x1b, 0x1f; + stw r0, 0xb78(r31); + b lbl_8052f9f8; +lbl_8052f974: + lwz r0, 0xb70(r3); + rlwinm. r0, r0, 0, 0x1d, 0x1d; + beq lbl_8052f9a0; + lis r4, 0x92bc; + addi r0, r4, 0x7d03; + stw r0, 0xb74(r3); + bl unk_805553b0; + rlwinm r0, r3, 0x1d, 3, 0xf; + rlwimi r0, r3, 5, 0x1b, 0x1f; + stw r0, 0xb78(r31); + b lbl_8052f9f8; +lbl_8052f9a0: + lwz r0, 0xb54(r3); + cmpwi r0, 1; + beq lbl_8052f9f8; + cmpwi r4, 7; + li r0, 0; + blt lbl_8052f9c4; + cmpwi r4, 0xa; + bgt lbl_8052f9c4; + li r0, 1; +lbl_8052f9c4: + cmpwi r0, 0; + bne lbl_8052f9f8; + bl unk_805553b0; + srwi r0, r3, 0x14; + rlwinm r5, r3, 0x19, 7, 7; + rlwinm r4, r3, 0xc, 0x18, 0x1f; + rotlwi r6, r3, 0x18; + rlwinm r0, r0, 0, 8, 0xf; + rlwimi r5, r3, 0x19, 0x10, 0x17; + or r0, r4, r0; + stw r6, 0xb74(r31); + or r0, r5, r0; + stw r0, 0xb78(r31); +lbl_8052f9f8: + lwz r0, 0x14(r1); + lwz r31, 0xc(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: unk_8052fa0c +// PAL: 0x8052fa0c..0x8052fb90 +MARK_BINARY_BLOB(unk_8052fa0c, 0x8052fa0c, 0x8052fb90); +asm UNKNOWN_FUNCTION(unk_8052fa0c) { + // clang-format off + nofralloc; + stwu r1, -0xa0(r1); + mflr r0; + li r4, 0; + li r5, 0x70; + stw r0, 0xa4(r1); + stw r31, 0x9c(r1); + mr r31, r3; + addi r3, r1, 0x28; + bl unk_805553b0; + lis r3, 0; + li r0, 0; + stb r0, 8(r1); + addi r4, r1, 8; + lwz r3, 0(r3); + stw r0, 0xc(r1); + bl unk_8066c8d8; + lwz r5, 0xc(r1); + lhz r0, 0x14(r5); + cmpwi r0, 0; + beq lbl_8052fb7c; + cmpwi r0, 1; + bne lbl_8052fa68; + b lbl_8052fb7c; +lbl_8052fa68: + lis r3, 0; + rlwinm r4, r0, 2, 0xe, 0x1d; + addi r3, r3, 0; + li r0, 0xb; + lwzx r3, r3, r4; + sth r3, 0x2a(r1); + lbz r3, 0x16(r5); + stb r3, 0x2c(r1); + lbz r3, 0x17(r5); + stb r3, 0x2f(r1); + lbz r3, 0x3e(r5); + stb r3, 0x57(r1); + lhz r3, 0x42(r5); + stw r3, 0x58(r1); + lhz r3, 0x42(r5); + stw r3, 0x5c(r1); + lhz r3, 0x42(r5); + stw r3, 0x60(r1); + lhz r3, 0x42(r5); + stw r3, 0x64(r1); + lhz r3, 0x42(r5); + stw r3, 0x68(r1); + lhz r3, 0x42(r5); + stw r3, 0x6c(r1); + lhz r3, 0x1c(r5); + sth r3, 0x70(r1); + lhz r3, 0x1e(r5); + sth r3, 0x72(r1); + lhz r3, 0x20(r5); + sth r3, 0x74(r1); + lhz r3, 0x22(r5); + sth r3, 0x76(r1); + lhz r3, 0x24(r5); + sth r3, 0x78(r1); + lhz r3, 0x26(r5); + cmplwi r3, 0xb; + bge lbl_8052fb00; + mr r0, r3; +lbl_8052fb00: + sth r0, 0x80(r1); + li r6, 0; + lwz r4, 0xc(r1); + b lbl_8052fb34; +lbl_8052fb10: + rlwinm r0, r6, 1, 0x17, 0x1e; + addi r5, r1, 0x28; + add r3, r4, r0; + addi r6, r6, 1; + add r5, r5, r0; + lbz r0, 0x28(r3); + stb r0, 0x5a(r5); + lbz r0, 0x29(r3); + stb r0, 0x5b(r5); +lbl_8052fb34: + lhz r5, 0x26(r4); + clrlwi r3, r6, 0x18; + li r0, 0xb; + cmplwi r5, 0xb; + bge lbl_8052fb4c; + mr r0, r5; +lbl_8052fb4c: + clrlwi r0, r0, 0x10; + cmpw r3, r0; + blt lbl_8052fb10; + li r0, 0xe; + addi r5, r31, 0xb78; + addi r4, r1, 0x24; + mtctr r0; +lbl_8052fb68: + lwz r3, 4(r4); + lwzu r0, 8(r4); + stw r3, 4(r5); + stwu r0, 8(r5); + bdnz lbl_8052fb68; +lbl_8052fb7c: + lwz r0, 0xa4(r1); + lwz r31, 0x9c(r1); + mtlr r0; + addi r1, r1, 0xa0; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_initRace +// PAL: 0x8052fb90..0x8052fe58 +MARK_BINARY_BLOB(RacedataScenario_initRace, 0x8052fb90, 0x8052fe58); +asm UNKNOWN_FUNCTION(RacedataScenario_initRace) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + stw r0, 0x24(r1); + li r0, 0; + stw r31, 0x1c(r1); + stw r30, 0x18(r1); + mr r30, r4; + stw r29, 0x14(r1); + mr r29, r3; + stw r28, 0x10(r1); + stb r0, 0xa(r1); + stb r0, 9(r1); + stb r0, 8(r1); + lwz r0, 0xb70(r3); + rlwinm. r0, r0, 0, 0x1d, 0x1d; + beq lbl_8052fbd4; + bl unk_8052fa0c; +lbl_8052fbd4: + mr r3, r29; + bl RacedataScenario_copyPrevPositions; + li r5, 0; + li r0, -1; + mulli r8, r5, 0xf0; + mr r3, r29; + li r5, 6; + addi r4, r1, 0xa; + add r7, r29, r8; + addi r6, r1, 8; + stb r0, 0xd(r7); + mulli r8, r5, 0xf0; + addi r5, r1, 9; + stb r0, 0xe(r7); + stb r0, 0xfd(r7); + stb r0, 0xfe(r7); + stb r0, 0x1ed(r7); + stb r0, 0x1ee(r7); + stb r0, 0x2dd(r7); + stb r0, 0x2de(r7); + stb r0, 0x3cd(r7); + stb r0, 0x3ce(r7); + stb r0, 0x4bd(r7); + stb r0, 0x4be(r7); + add r7, r29, r8; + stb r0, 0xd(r7); + stb r0, 0xe(r7); + stb r0, 0xfd(r7); + stb r0, 0xfe(r7); + stb r0, 0x1ed(r7); + stb r0, 0x1ee(r7); + stb r0, 0x2dd(r7); + stb r0, 0x2de(r7); + stb r0, 0x3cd(r7); + stb r0, 0x3ce(r7); + stb r0, 0x4bd(r7); + stb r0, 0x4be(r7); + stb r0, 0xb64(r29); + stb r0, 0xb65(r29); + stb r0, 0xb66(r29); + stb r0, 0xb67(r29); + bl RacedataScenario_computePlayerCounts; + lwz r0, 0xb54(r29); + lbz r31, 9(r1); + cmpwi r0, 5; + bne lbl_8052fc94; + li r0, 1; + stb r0, 9(r1); +lbl_8052fc94: + lbz r0, 0xb6c(r29); + cmpwi r0, 0; + bne lbl_8052fdfc; + lwz r4, 0xb50(r29); + li r0, 0; + lbz r3, 0xa(r1); + cmpwi r4, 7; + blt lbl_8052fcc0; + cmpwi r4, 0xa; + bgt lbl_8052fcc0; + li r0, 1; +lbl_8052fcc0: + cmpwi r0, 0; + bne lbl_8052fdfc; + cmpwi r3, 0; + li r4, 0; + beq lbl_8052fdfc; + cmplwi r3, 8; + addi r0, r3, 0xf8; + ble lbl_8052fdc8; + clrlwi r5, r0, 0x18; + li r11, 0; + addi r0, r5, 7; + srwi r0, r0, 3; + mtctr r0; + cmplwi r5, 0; + ble lbl_8052fdc8; +lbl_8052fcfc: + clrlwi r7, r4, 0x18; + addi r5, r4, 1; + mulli r6, r7, 0xf0; + addi r0, r4, 2; + clrlwi r10, r5, 0x18; + clrlwi r9, r0, 0x18; + add r12, r29, r6; + addi r0, r4, 3; + sth r11, 0xe0(r12); + clrlwi r8, r0, 0x18; + subf r28, r7, r3; + addi r0, r4, 4; + stb r28, 0xe9(r12); + clrlwi r7, r0, 0x18; + addi r6, r4, 5; + addi r5, r4, 6; + stb r28, 0xe8(r12); + addi r0, r4, 7; + clrlwi r6, r6, 0x18; + clrlwi r5, r5, 0x18; + sth r11, 0x1d0(r12); + subf r10, r10, r3; + clrlwi r0, r0, 0x18; + subf r9, r9, r3; + stb r10, 0x1d9(r12); + subf r8, r8, r3; + subf r7, r7, r3; + subf r6, r6, r3; + stb r10, 0x1d8(r12); + subf r5, r5, r3; + subf r0, r0, r3; + addi r4, r4, 8; + sth r11, 0x2c0(r12); + stb r9, 0x2c9(r12); + stb r9, 0x2c8(r12); + sth r11, 0x3b0(r12); + stb r8, 0x3b9(r12); + stb r8, 0x3b8(r12); + sth r11, 0x4a0(r12); + stb r7, 0x4a9(r12); + stb r7, 0x4a8(r12); + sth r11, 0x590(r12); + stb r6, 0x599(r12); + stb r6, 0x598(r12); + sth r11, 0x680(r12); + stb r5, 0x689(r12); + stb r5, 0x688(r12); + sth r11, 0x770(r12); + stb r0, 0x779(r12); + stb r0, 0x778(r12); + bdnz lbl_8052fcfc; +lbl_8052fdc8: + li r5, 0; + b lbl_8052fdf0; +lbl_8052fdd0: + clrlwi r6, r4, 0x18; + addi r4, r4, 1; + mulli r0, r6, 0xf0; + subf r7, r6, r3; + add r6, r29, r0; + sth r5, 0xe0(r6); + stb r7, 0xe9(r6); + stb r7, 0xe8(r6); +lbl_8052fdf0: + clrlwi r0, r4, 0x18; + cmplw r0, r3; + blt lbl_8052fdd0; +lbl_8052fdfc: + lbz r4, 9(r1); + mr r3, r29; + bl RacedataScenario_initControllers; + mr r3, r29; + mr r4, r30; + bl RacedataScenario_postInitControllers; + mr r3, r29; + bl RacedataScenario_initRng; + lbz r0, 0xa(r1); + stb r0, 4(r29); + lbz r0, 9(r1); + stb r0, 5(r29); + stb r31, 7(r29); + lbz r0, 8(r1); + stb r0, 6(r29); + lwz r31, 0x1c(r1); + lwz r30, 0x18(r1); + lwz r29, 0x14(r1); + lwz r28, 0x10(r1); + lwz r0, 0x24(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: Racedata_initStaticInstance +// PAL: 0x8052fe58..0x8052ffe8 +MARK_BINARY_BLOB(Racedata_initStaticInstance, 0x8052fe58, 0x8052ffe8); +asm UNKNOWN_FUNCTION(Racedata_initStaticInstance) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + lis r3, 0; + stw r0, 0x24(r1); + stmw r26, 8(r1); + lwz r0, 0(r3); + cmpwi r0, 0; + bne lbl_8052ffcc; + li r3, 0x73f0; + bl unk_805553b0; + cmpwi r3, 0; + mr r26, r3; + beq lbl_8052ffc4; + lis r4, 0; + li r5, 0; + addi r4, r4, 0; + bl unk_805553b0; + lis r3, 0; + lis r27, 0; + addi r3, r3, 0; + stw r3, 0x1c(r26); + addi r0, r3, 8; + lis r29, 0; + stw r0, 0(r26); + addi r27, r27, 0; + lis r30, 0; + li r28, 0; + stw r27, 0x20(r26); + addi r3, r26, 0x28; + addi r4, r29, 0; + addi r5, r30, 0; + stb r28, 0x24(r26); + li r6, 0xf0; + li r7, 0xc; + stb r28, 0x25(r26); + bl unk_805553b0; + li r31, 0x11; + stw r31, 0xb68(r26); + addi r3, r26, 0xb9c; + li r4, 0; + stw r28, 0xb70(r26); + li r5, 0x70; + stw r28, 0xb74(r26); + stw r28, 0xb88(r26); + bl unk_805553b0; + addi r0, r26, 0x23f0; + stw r0, 0xc0c(r26); + addi r3, r26, 0xc18; + addi r4, r29, 0; + stw r27, 0xc10(r26); + addi r5, r30, 0; + li r6, 0xf0; + li r7, 0xc; + stb r28, 0xc14(r26); + stb r28, 0xc15(r26); + bl unk_805553b0; + stw r31, 0x1758(r26); + addi r3, r26, 0x178c; + li r4, 0; + li r5, 0x70; + stw r28, 0x1760(r26); + stw r28, 0x1764(r26); + stw r28, 0x1778(r26); + bl unk_805553b0; + addi r0, r26, 0x4bf0; + stw r0, 0x17fc(r26); + addi r3, r26, 0x1808; + addi r4, r29, 0; + stw r27, 0x1800(r26); + addi r5, r30, 0; + li r6, 0xf0; + li r7, 0xc; + stb r28, 0x1804(r26); + stb r28, 0x1805(r26); + bl unk_805553b0; + stw r31, 0x2348(r26); + addi r3, r26, 0x237c; + li r4, 0; + li r5, 0x70; + stw r28, 0x2350(r26); + stw r28, 0x2354(r26); + stw r28, 0x2368(r26); + bl unk_805553b0; + stw r28, 0x23ec(r26); + addi r27, r26, 0x23f0; + addi r31, r26, 0x73f0; +lbl_8052ffb0: + mr r3, r27; + bl RawGhostFile_reset; + addi r27, r27, 0x2800; + cmplw r27, r31; + blt lbl_8052ffb0; +lbl_8052ffc4: + lis r3, 0; + stw r26, 0(r3); +lbl_8052ffcc: + lmw r26, 8(r1); + lis r3, 0; + lwz r0, 0x24(r1); + lwz r3, 0(r3); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: Racedata_destroyStaticInstance +// PAL: 0x8052ffe8..0x80530038 +MARK_BINARY_BLOB(Racedata_destroyStaticInstance, 0x8052ffe8, 0x80530038); +asm UNKNOWN_FUNCTION(Racedata_destroyStaticInstance) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + lis r3, 0; + stw r0, 0x14(r1); + lwz r3, 0(r3); + cmpwi r3, 0; + beq lbl_8053001c; + beq lbl_8053001c; + lwz r12, 0x1c(r3); + li r4, 1; + lwz r12, 0x24(r12); + mtctr r12; + bctrl; +lbl_8053001c: + lis r3, 0; + li r0, 0; + stw r0, 0(r3); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: Racedata_destroy +// PAL: 0x80530038..0x805300f4 +MARK_BINARY_BLOB(Racedata_destroy, 0x80530038, 0x805300f4); +asm UNKNOWN_FUNCTION(Racedata_destroy) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + cmpwi r3, 0; + stw r0, 0x14(r1); + stw r31, 0xc(r1); + mr r31, r4; + stw r30, 8(r1); + mr r30, r3; + beq lbl_805300d8; + addic. r3, r3, 0x1800; + beq lbl_8053007c; + lis r4, 0; + addi r3, r3, 8; + addi r4, r4, 0; + li r5, 0xf0; + li r6, 0xc; + bl unk_805553b0; +lbl_8053007c: + addic. r3, r30, 0xc10; + beq lbl_8053009c; + lis r4, 0; + addi r3, r3, 8; + addi r4, r4, 0; + li r5, 0xf0; + li r6, 0xc; + bl unk_805553b0; +lbl_8053009c: + addic. r3, r30, 0x20; + beq lbl_805300bc; + lis r4, 0; + addi r3, r3, 8; + addi r4, r4, 0; + li r5, 0xf0; + li r6, 0xc; + bl unk_805553b0; +lbl_805300bc: + mr r3, r30; + li r4, 0; + bl unk_805553b0; + cmpwi r31, 0; + ble lbl_805300d8; + mr r3, r30; + bl unk_805553b0; +lbl_805300d8: + mr r3, r30; + lwz r31, 0xc(r1); + lwz r30, 8(r1); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_destroy +// PAL: 0x805300f4..0x8053015c +MARK_BINARY_BLOB(RacedataScenario_destroy, 0x805300f4, 0x8053015c); +asm UNKNOWN_FUNCTION(RacedataScenario_destroy) { + // clang-format off + nofralloc; + stwu r1, -0x10(r1); + mflr r0; + cmpwi r3, 0; + stw r0, 0x14(r1); + stw r31, 0xc(r1); + mr r31, r4; + stw r30, 8(r1); + mr r30, r3; + beq lbl_80530140; + lis r4, 0; + li r5, 0xf0; + addi r4, r4, 0; + li r6, 0xc; + addi r3, r3, 8; + bl unk_805553b0; + cmpwi r31, 0; + ble lbl_80530140; + mr r3, r30; + bl unk_805553b0; +lbl_80530140: + mr r3, r30; + lwz r31, 0xc(r1); + lwz r30, 8(r1); + lwz r0, 0x14(r1); + mtlr r0; + addi r1, r1, 0x10; + blr; + // clang-format on +} + +// Symbol: Racedata_construct +// PAL: 0x8053015c..0x805302c4 +MARK_BINARY_BLOB(Racedata_construct, 0x8053015c, 0x805302c4); +asm UNKNOWN_FUNCTION(Racedata_construct) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + lis r4, 0; + li r5, 0; + stw r0, 0x24(r1); + addi r4, r4, 0; + addi r4, r4, 0x12; + stmw r26, 8(r1); + mr r26, r3; + bl unk_805553b0; + lis r3, 0; + li r28, 0; + addi r3, r3, 0; + lis r27, 0; + addi r0, r3, 8; + lis r29, 0; + addi r27, r27, 0; + lis r30, 0; + stw r3, 0x1c(r26); + addi r3, r26, 0x28; + addi r4, r29, 0; + addi r5, r30, 0; + stw r0, 0(r26); + li r6, 0xf0; + li r7, 0xc; + stw r27, 0x20(r26); + stb r28, 0x24(r26); + stb r28, 0x25(r26); + bl unk_805553b0; + li r31, 0x11; + stw r31, 0xb68(r26); + addi r3, r26, 0xb9c; + li r4, 0; + stw r28, 0xb70(r26); + li r5, 0x70; + stw r28, 0xb74(r26); + stw r28, 0xb88(r26); + bl unk_805553b0; + addi r0, r26, 0x23f0; + stw r0, 0xc0c(r26); + addi r3, r26, 0xc18; + addi r4, r29, 0; + stw r27, 0xc10(r26); + addi r5, r30, 0; + li r6, 0xf0; + li r7, 0xc; + stb r28, 0xc14(r26); + stb r28, 0xc15(r26); + bl unk_805553b0; + stw r31, 0x1758(r26); + addi r3, r26, 0x178c; + li r4, 0; + li r5, 0x70; + stw r28, 0x1760(r26); + stw r28, 0x1764(r26); + stw r28, 0x1778(r26); + bl unk_805553b0; + addi r0, r26, 0x4bf0; + stw r0, 0x17fc(r26); + addi r3, r26, 0x1808; + addi r4, r29, 0; + stw r27, 0x1800(r26); + addi r5, r30, 0; + li r6, 0xf0; + li r7, 0xc; + stb r28, 0x1804(r26); + stb r28, 0x1805(r26); + bl unk_805553b0; + stw r31, 0x2348(r26); + addi r3, r26, 0x237c; + li r4, 0; + li r5, 0x70; + stw r28, 0x2350(r26); + stw r28, 0x2354(r26); + stw r28, 0x2368(r26); + bl unk_805553b0; + stw r28, 0x23ec(r26); + addi r27, r26, 0x23f0; + addi r31, r26, 0x73f0; +lbl_80530298: + mr r3, r27; + bl RawGhostFile_reset; + addi r27, r27, 0x2800; + cmplw r27, r31; + blt lbl_80530298; + mr r3, r26; + lmw r26, 8(r1); + lwz r0, 0x24(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: Racedata_initRace +// PAL: 0x805302c4..0x805305ac +MARK_BINARY_BLOB(Racedata_initRace, 0x805302c4, 0x805305ac); +asm UNKNOWN_FUNCTION(Racedata_initRace) { + // clang-format off + nofralloc; + stwu r1, -0x30(r1); + mflr r0; + stw r0, 0x34(r1); + stmw r22, 8(r1); + mr r31, r3; + addi r3, r3, 0xc10; + addi r4, r31, 0x20; + bl RacedataScenario_initRace; + lbz r9, 0xc14(r31); + addi r4, r31, 0x28; + lbz r8, 0xc15(r31); + addi r3, r31, 0xc18; + lbz r7, 0xc16(r31); + addi r5, r31, 0xb68; + lbz r6, 0xc17(r31); + li r0, 0x26; + stb r9, 0x24(r31); + stb r8, 0x25(r31); + stb r7, 0x26(r31); + stb r6, 0x27(r31); +lbl_80530314: + lbz r6, 4(r3); + addi r9, r4, 0x23; + stb r6, 4(r4); + addi r8, r3, 0x23; + lbz r6, 5(r3); + stb r6, 5(r4); + lbz r6, 6(r3); + stb r6, 6(r4); + lwz r6, 8(r3); + stw r6, 8(r4); + lwz r6, 0xc(r3); + stw r6, 0xc(r4); + lwz r6, 0x10(r3); + stw r6, 0x10(r4); + lwz r6, 0x18(r3); + stw r6, 0x18(r4); + lbz r6, 0x1c(r3); + stb r6, 0x1c(r4); + lbz r6, 0x1d(r3); + stb r6, 0x1d(r4); + lwz r6, 0x20(r3); + stw r6, 0x20(r4); + mtctr r0; +lbl_80530370: + lbz r7, 1(r8); + lbzu r6, 2(r8); + stb r7, 1(r9); + stbu r6, 2(r9); + bdnz lbl_80530370; + lwz r6, 0x70(r3); + stw r6, 0x70(r4); + lbz r6, 0x74(r3); + stb r6, 0x74(r4); + lbz r6, 0x75(r3); + stb r6, 0x75(r4); + lbz r6, 0x76(r3); + stb r6, 0x76(r4); + lbz r6, 0x77(r3); + stb r6, 0x77(r4); + lwz r6, 0x78(r3); + stw r6, 0x78(r4); + lwz r6, 0x80(r3); + lwz r7, 0x7c(r3); + stw r7, 0x7c(r4); + stw r6, 0x80(r4); + lwz r6, 0x88(r3); + lwz r7, 0x84(r3); + stw r7, 0x84(r4); + stw r6, 0x88(r4); + lwz r6, 0x90(r3); + lwz r7, 0x8c(r3); + stw r7, 0x8c(r4); + stw r6, 0x90(r4); + lwz r6, 0x98(r3); + lwz r7, 0x94(r3); + stw r7, 0x94(r4); + stw r6, 0x98(r4); + lwz r6, 0xa0(r3); + lwz r7, 0x9c(r3); + stw r7, 0x9c(r4); + stw r6, 0xa0(r4); + lwz r6, 0xa8(r3); + lwz r7, 0xa4(r3); + stw r7, 0xa4(r4); + stw r6, 0xa8(r4); + lwz r6, 0xb0(r3); + lwz r7, 0xac(r3); + stw r7, 0xac(r4); + stw r6, 0xb0(r4); + lwz r6, 0xb4(r3); + stw r6, 0xb4(r4); + lbz r6, 0xb8(r3); + stb r6, 0xb8(r4); + lbz r6, 0xb9(r3); + stb r6, 0xb9(r4); + lbz r6, 0xba(r3); + stb r6, 0xba(r4); + lwz r6, 0xbc(r3); + stw r6, 0xbc(r4); + lbz r6, 0xc0(r3); + stb r6, 0xc0(r4); + lbz r6, 0xc1(r3); + stb r6, 0xc1(r4); + lbz r6, 0xc2(r3); + stb r6, 0xc2(r4); + lwz r6, 0xc4(r3); + stw r6, 0xc4(r4); + lwz r6, 0xc8(r3); + stw r6, 0xc8(r4); + lwz r6, 0xcc(r3); + stw r6, 0xcc(r4); + lwz r6, 0xd0(r3); + stw r6, 0xd0(r4); + lwz r6, 0xd4(r3); + stw r6, 0xd4(r4); + lhz r6, 0xd8(r3); + sth r6, 0xd8(r4); + lhz r6, 0xda(r3); + sth r6, 0xda(r4); + lhz r6, 0xdc(r3); + sth r6, 0xdc(r4); + lha r6, 0xde(r3); + sth r6, 0xde(r4); + lbz r6, 0xe0(r3); + stb r6, 0xe0(r4); + lbz r6, 0xe1(r3); + stb r6, 0xe1(r4); + lbz r6, 0xe2(r3); + stb r6, 0xe2(r4); + lhz r6, 0xe8(r3); + sth r6, 0xe8(r4); + lbz r6, 0xec(r3); + addi r3, r3, 0xf0; + stb r6, 0xec(r4); + addi r4, r4, 0xf0; + cmplw r4, r5; + blt lbl_80530314; + lwz r22, 0x1758(r31); + li r0, 0xe; + lwz r23, 0x175c(r31); + addi r5, r31, 0xb98; + lwz r24, 0x1760(r31); + addi r4, r31, 0x1788; + lwz r25, 0x1764(r31); + lwz r26, 0x1768(r31); + lwz r27, 0x176c(r31); + lwz r28, 0x1770(r31); + lbz r29, 0x1774(r31); + lbz r30, 0x1775(r31); + lbz r12, 0x1776(r31); + lbz r11, 0x1777(r31); + lwz r10, 0x1778(r31); + lbz r9, 0x177c(r31); + lbz r8, 0x177d(r31); + lwz r7, 0x1780(r31); + lwz r6, 0x1784(r31); + lwz r3, 0x1788(r31); + stw r22, 0xb68(r31); + stw r23, 0xb6c(r31); + stw r24, 0xb70(r31); + stw r25, 0xb74(r31); + stw r26, 0xb78(r31); + stw r27, 0xb7c(r31); + stw r28, 0xb80(r31); + stb r29, 0xb84(r31); + stb r30, 0xb85(r31); + stb r12, 0xb86(r31); + stb r11, 0xb87(r31); + stw r10, 0xb88(r31); + stb r9, 0xb8c(r31); + stb r8, 0xb8d(r31); + stw r7, 0xb90(r31); + stw r6, 0xb94(r31); + stw r3, 0xb98(r31); + mtctr r0; +lbl_8053057c: + lwz r3, 4(r4); + lwzu r0, 8(r4); + stw r3, 4(r5); + stwu r0, 8(r5); + bdnz lbl_8053057c; + lwz r0, 0x17fc(r31); + stw r0, 0xc0c(r31); + lmw r22, 8(r1); + lwz r0, 0x34(r1); + mtlr r0; + addi r1, r1, 0x30; + blr; + // clang-format on +} + +// Symbol: RacedataScenario_copy +// PAL: 0x805305ac..0x80530864 +MARK_BINARY_BLOB(RacedataScenario_copy, 0x805305ac, 0x80530864); +asm UNKNOWN_FUNCTION(RacedataScenario_copy) { + // clang-format off + nofralloc; + lbz r0, 4(r4); + addi r5, r3, 8; + stb r0, 4(r3); + addi r6, r4, 8; + addi r7, r3, 0xb48; + li r0, 0x26; + lbz r8, 5(r4); + stb r8, 5(r3); + lbz r8, 6(r4); + stb r8, 6(r3); + lbz r8, 7(r4); + stb r8, 7(r3); +lbl_805305dc: + lbz r8, 4(r6); + addi r11, r5, 0x23; + stb r8, 4(r5); + addi r10, r6, 0x23; + lbz r8, 5(r6); + stb r8, 5(r5); + lbz r8, 6(r6); + stb r8, 6(r5); + lwz r8, 8(r6); + stw r8, 8(r5); + lwz r8, 0xc(r6); + stw r8, 0xc(r5); + lwz r8, 0x10(r6); + stw r8, 0x10(r5); + lwz r8, 0x18(r6); + stw r8, 0x18(r5); + lbz r8, 0x1c(r6); + stb r8, 0x1c(r5); + lbz r8, 0x1d(r6); + stb r8, 0x1d(r5); + lwz r8, 0x20(r6); + stw r8, 0x20(r5); + mtctr r0; +lbl_80530638: + lbz r9, 1(r10); + lbzu r8, 2(r10); + stb r9, 1(r11); + stbu r8, 2(r11); + bdnz lbl_80530638; + lwz r8, 0x70(r6); + stw r8, 0x70(r5); + lbz r8, 0x74(r6); + stb r8, 0x74(r5); + lbz r8, 0x75(r6); + stb r8, 0x75(r5); + lbz r8, 0x76(r6); + stb r8, 0x76(r5); + lbz r8, 0x77(r6); + stb r8, 0x77(r5); + lwz r8, 0x78(r6); + stw r8, 0x78(r5); + lwz r8, 0x80(r6); + lwz r9, 0x7c(r6); + stw r9, 0x7c(r5); + stw r8, 0x80(r5); + lwz r8, 0x88(r6); + lwz r9, 0x84(r6); + stw r9, 0x84(r5); + stw r8, 0x88(r5); + lwz r8, 0x90(r6); + lwz r9, 0x8c(r6); + stw r9, 0x8c(r5); + stw r8, 0x90(r5); + lwz r8, 0x98(r6); + lwz r9, 0x94(r6); + stw r9, 0x94(r5); + stw r8, 0x98(r5); + lwz r8, 0xa0(r6); + lwz r9, 0x9c(r6); + stw r9, 0x9c(r5); + stw r8, 0xa0(r5); + lwz r8, 0xa8(r6); + lwz r9, 0xa4(r6); + stw r9, 0xa4(r5); + stw r8, 0xa8(r5); + lwz r8, 0xb0(r6); + lwz r9, 0xac(r6); + stw r9, 0xac(r5); + stw r8, 0xb0(r5); + lwz r8, 0xb4(r6); + stw r8, 0xb4(r5); + lbz r8, 0xb8(r6); + stb r8, 0xb8(r5); + lbz r8, 0xb9(r6); + stb r8, 0xb9(r5); + lbz r8, 0xba(r6); + stb r8, 0xba(r5); + lwz r8, 0xbc(r6); + stw r8, 0xbc(r5); + lbz r8, 0xc0(r6); + stb r8, 0xc0(r5); + lbz r8, 0xc1(r6); + stb r8, 0xc1(r5); + lbz r8, 0xc2(r6); + stb r8, 0xc2(r5); + lwz r8, 0xc4(r6); + stw r8, 0xc4(r5); + lwz r8, 0xc8(r6); + stw r8, 0xc8(r5); + lwz r8, 0xcc(r6); + stw r8, 0xcc(r5); + lwz r8, 0xd0(r6); + stw r8, 0xd0(r5); + lwz r8, 0xd4(r6); + stw r8, 0xd4(r5); + lhz r8, 0xd8(r6); + sth r8, 0xd8(r5); + lhz r8, 0xda(r6); + sth r8, 0xda(r5); + lhz r8, 0xdc(r6); + sth r8, 0xdc(r5); + lha r8, 0xde(r6); + sth r8, 0xde(r5); + lbz r8, 0xe0(r6); + stb r8, 0xe0(r5); + lbz r8, 0xe1(r6); + stb r8, 0xe1(r5); + lbz r8, 0xe2(r6); + stb r8, 0xe2(r5); + lhz r8, 0xe8(r6); + sth r8, 0xe8(r5); + lbz r8, 0xec(r6); + addi r6, r6, 0xf0; + stb r8, 0xec(r5); + addi r5, r5, 0xf0; + cmplw r5, r7; + blt lbl_805305dc; + lwz r5, 0xb48(r4); + li r0, 0xe; + stw r5, 0xb48(r3); + addi r7, r3, 0xb78; + addi r6, r4, 0xb78; + lwz r5, 0xb4c(r4); + stw r5, 0xb4c(r3); + lwz r5, 0xb50(r4); + stw r5, 0xb50(r3); + lwz r5, 0xb54(r4); + stw r5, 0xb54(r3); + lwz r5, 0xb58(r4); + stw r5, 0xb58(r3); + lwz r5, 0xb5c(r4); + stw r5, 0xb5c(r3); + lwz r5, 0xb60(r4); + stw r5, 0xb60(r3); + lbz r5, 0xb64(r4); + stb r5, 0xb64(r3); + lbz r5, 0xb65(r4); + stb r5, 0xb65(r3); + lbz r5, 0xb66(r4); + stb r5, 0xb66(r3); + lbz r5, 0xb67(r4); + stb r5, 0xb67(r3); + lwz r5, 0xb68(r4); + stw r5, 0xb68(r3); + lbz r5, 0xb6c(r4); + stb r5, 0xb6c(r3); + lbz r5, 0xb6d(r4); + stb r5, 0xb6d(r3); + lwz r5, 0xb70(r4); + stw r5, 0xb70(r3); + lwz r5, 0xb74(r4); + stw r5, 0xb74(r3); + lwz r5, 0xb78(r4); + stw r5, 0xb78(r3); + mtctr r0; +lbl_80530844: + lwz r5, 4(r6); + lwzu r0, 8(r6); + stw r5, 4(r7); + stwu r0, 8(r7); + bdnz lbl_80530844; + lwz r0, 0xbec(r4); + stw r0, 0xbec(r3); + blr; + // clang-format on +} + +// Symbol: Racedata_initAwards +// PAL: 0x80530864..0x80530f0c +MARK_BINARY_BLOB(Racedata_initAwards, 0x80530864, 0x80530f0c); +asm UNKNOWN_FUNCTION(Racedata_initAwards) { + // clang-format off + nofralloc; + stwu r1, -0x30(r1); + mflr r0; + stw r0, 0x34(r1); + stmw r25, 0x14(r1); + mr r31, r3; + bl Racedata_initRace; + addi r3, r31, 0x1800; + addi r4, r31, 0x20; + bl RacedataScenario_copy; + li r30, 0; +lbl_8053088c: + addi r3, r31, 0xc10; + clrlwi r4, r30, 0x18; + bl RacedataScenario_getPlayer; + li r4, 5; + bl unk_8052e44c; + clrlwi r4, r30, 0x18; + addi r3, r31, 0xc10; + addi r29, r4, 1; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e658; + addi r3, r31, 0xc10; + clrlwi r4, r30, 0x18; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e660; + addi r30, r30, 1; + cmplwi r30, 0xc; + blt lbl_8053088c; + addi r3, r31, 0xc10; + bl unk_8052ed18; + addi r0, r3, -7; + addi r3, r31, 0xc10; + cntlzw r0, r0; + srwi r29, r0, 5; + bl unk_8052ed18; + addi r0, r3, -12; + addi r3, r31, 0xc10; + cntlzw r0, r0; + srwi r30, r0, 5; + bl unk_80530f0c; + cmpwi r29, 0; + beq lbl_80530a2c; + li r30, 1; +lbl_80530914: + clrlwi r29, r30, 0x18; + li r28, 0; +lbl_8053091c: + addi r3, r31, 0x20; + clrlwi r4, r28, 0x18; + bl unk_8052dd20; + bl unk_80530f18; + clrlwi r0, r3, 0x18; + cmplw r29, r0; + bne lbl_80530a10; + addi r3, r31, 0x20; + clrlwi r4, r28, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 5; + beq lbl_80530a10; + addi r0, r30, -1; + addi r3, r31, 0x20; + clrlwi r27, r0, 0x18; + clrlwi r4, r28, 0x18; + bl unk_8052dd20; + bl unk_80530f20; + mr r29, r3; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e42c; + addi r3, r31, 0x20; + clrlwi r4, r28, 0x18; + bl unk_8052dd20; + bl unk_80530f28; + mr r29, r3; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e444; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e44c; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + clrlwi r4, r30, 0x18; + bl unk_8052e658; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + clrlwi r4, r30, 0x18; + bl unk_8052e660; + addi r3, r31, 0x20; + clrlwi r4, r28, 0x18; + bl unk_8052dd20; + bl unk_80531068; + mr r29, r3; + mr r4, r27; + addi r3, r31, 0xc10; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_80530f30; + b lbl_80530a1c; +lbl_80530a10: + addi r28, r28, 1; + cmplwi r28, 0xc; + blt lbl_8053091c; +lbl_80530a1c: + addi r30, r30, 1; + cmplwi r30, 3; + ble lbl_80530914; + b lbl_80530ef0; +lbl_80530a2c: + cmpwi r3, 0; + beq lbl_80530d18; + addi r3, r31, 0x20; + bl unk_8052dca8; + cntlzw r0, r3; + mr r27, r3; + srwi r28, r0, 5; + li r29, 0; + b lbl_80530a8c; +lbl_80530a50: + addi r3, r31, 0x20; + clrlwi r4, r29, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 0; + bne lbl_80530a88; + addi r3, r31, 0x20; + clrlwi r4, r29, 0x18; + bl unk_8052dd20; + bl unk_8052dd18; + cmpw r27, r3; + bne lbl_80530a88; + mr r28, r27; + b lbl_80530aa0; +lbl_80530a88: + addi r29, r29, 1; +lbl_80530a8c: + bl unk_8052dd30; + clrlwi r3, r3, 0x18; + clrlwi r0, r29, 0x18; + cmplw r0, r3; + blt lbl_80530a50; +lbl_80530aa0: + li r27, 0; + li r26, 1; +lbl_80530aa8: + clrlwi r30, r26, 0x18; + li r25, 0; +lbl_80530ab0: + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_80530f18; + clrlwi r0, r3, 0x18; + cmplw r30, r0; + bne lbl_80530bb8; + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 0; + bne lbl_80530bb8; + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_8052dd18; + cmpw r28, r3; + bne lbl_80530bb8; + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_80530f20; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e42c; + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_80530f28; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e444; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e44c; + clrlwi r4, r27, 0x18; + addi r3, r31, 0xc10; + addi r29, r4, 1; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e658; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e660; + addi r3, r31, 0x20; + clrlwi r4, r25, 0x18; + bl unk_8052dd20; + bl unk_80531068; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_80530f30; + addi r27, r27, 1; +lbl_80530bb8: + addi r25, r25, 1; + cmplwi r25, 0xc; + blt lbl_80530ab0; + addi r26, r26, 1; + cmplwi r26, 0xc; + ble lbl_80530aa8; + li r25, 1; +lbl_80530bd4: + clrlwi r30, r25, 0x18; + li r26, 0; +lbl_80530bdc: + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_80530f18; + clrlwi r0, r3, 0x18; + cmplw r30, r0; + bne lbl_80530cfc; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 5; + beq lbl_80530cfc; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 0; + beq lbl_80530cfc; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_8052dd18; + cmpw r28, r3; + bne lbl_80530cfc; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_80530f20; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e42c; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_80530f28; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_8052e444; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e44c; + clrlwi r4, r27, 0x18; + addi r3, r31, 0xc10; + addi r29, r4, 1; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e658; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + clrlwi r4, r29, 0x18; + bl unk_8052e660; + addi r3, r31, 0x20; + clrlwi r4, r26, 0x18; + bl unk_8052dd20; + bl unk_80531068; + mr r29, r3; + addi r3, r31, 0xc10; + clrlwi r4, r27, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r29; + bl unk_80530f30; + addi r27, r27, 1; +lbl_80530cfc: + addi r26, r26, 1; + cmplwi r26, 0xc; + blt lbl_80530bdc; + addi r25, r25, 1; + cmplwi r25, 0xc; + ble lbl_80530bd4; + b lbl_80530ef0; +lbl_80530d18: + cmpwi r30, 0; + beq lbl_80530e3c; + li r25, 0; + li r26, 1; +lbl_80530d28: + clrlwi r29, r26, 0x18; + li r27, 0; +lbl_80530d30: + addi r3, r31, 0x20; + clrlwi r4, r27, 0x18; + bl unk_8052dd20; + bl unk_80530f18; + clrlwi r0, r3, 0x18; + cmplw r29, r0; + bne lbl_80530e20; + addi r3, r31, 0x20; + clrlwi r4, r27, 0x18; + bl unk_8052dd20; + bl unk_8052ed20; + cmpwi r3, 0; + bne lbl_80530e20; + addi r3, r31, 0x20; + clrlwi r4, r27, 0x18; + bl unk_8052dd20; + bl unk_80530f20; + mr r30, r3; + addi r3, r31, 0xc10; + clrlwi r4, r25, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_8052e42c; + addi r3, r31, 0x20; + clrlwi r4, r27, 0x18; + bl unk_8052dd20; + bl unk_80530f28; + mr r30, r3; + addi r3, r31, 0xc10; + clrlwi r4, r25, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_8052e444; + addi r3, r31, 0xc10; + clrlwi r4, r25, 0x18; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e44c; + clrlwi r4, r25, 0x18; + addi r3, r31, 0xc10; + addi r30, r4, 1; + bl RacedataScenario_getPlayer; + clrlwi r4, r30, 0x18; + bl unk_8052e658; + addi r3, r31, 0xc10; + clrlwi r4, r25, 0x18; + bl RacedataScenario_getPlayer; + clrlwi r4, r30, 0x18; + bl unk_8052e660; + addi r3, r31, 0x20; + clrlwi r4, r27, 0x18; + bl unk_8052dd20; + bl unk_80531068; + mr r30, r3; + addi r3, r31, 0xc10; + clrlwi r4, r25, 0x18; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_80530f30; + addi r25, r25, 1; +lbl_80530e20: + addi r27, r27, 1; + cmplwi r27, 0xc; + blt lbl_80530d30; + addi r26, r26, 1; + cmplwi r26, 0xc; + ble lbl_80530d28; + b lbl_80530ef0; +lbl_80530e3c: + addi r3, r31, 0x20; + li r4, 0; + bl unk_8052dd20; + bl unk_80530f20; + mr r30, r3; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_8052e42c; + addi r3, r31, 0x20; + li r4, 0; + bl unk_8052dd20; + bl unk_80530f28; + mr r30, r3; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_8052e444; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e44c; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e658; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + li r4, 1; + bl unk_8052e660; + addi r3, r31, 0x20; + li r4, 0; + bl unk_8052dd20; + bl unk_80531068; + mr r30, r3; + addi r3, r31, 0xc10; + li r4, 0; + bl RacedataScenario_getPlayer; + mr r4, r30; + bl unk_80530f30; +lbl_80530ef0: + mr r3, r31; + bl Racedata_initRace; + lmw r25, 0x14(r1); + lwz r0, 0x34(r1); + mtlr r0; + addi r1, r1, 0x30; + blr; + // clang-format on +} + +// Symbol: unk_80530f0c +// PAL: 0x80530f0c..0x80530f18 +MARK_BINARY_BLOB(unk_80530f0c, 0x80530f0c, 0x80530f18); +asm UNKNOWN_FUNCTION(unk_80530f0c) { + // clang-format off + nofralloc; + lwz r0, 0xb70(r3); + rlwinm r3, r0, 0x1f, 0x1f, 0x1f; + blr; + // clang-format on +} + +// Symbol: unk_80530f18 +// PAL: 0x80530f18..0x80530f20 +MARK_BINARY_BLOB(unk_80530f18, 0x80530f18, 0x80530f20); +asm UNKNOWN_FUNCTION(unk_80530f18) { + // clang-format off + nofralloc; + lbz r3, 0xe0(r3); + blr; + // clang-format on +} + +// Symbol: unk_80530f20 +// PAL: 0x80530f20..0x80530f28 +MARK_BINARY_BLOB(unk_80530f20, 0x80530f20, 0x80530f28); +asm UNKNOWN_FUNCTION(unk_80530f20) { + // clang-format off + nofralloc; + lwz r3, 0xc(r3); + blr; + // clang-format on +} + +// Symbol: unk_80530f28 +// PAL: 0x80530f28..0x80530f30 +MARK_BINARY_BLOB(unk_80530f28, 0x80530f28, 0x80530f30); +asm UNKNOWN_FUNCTION(unk_80530f28) { + // clang-format off + nofralloc; + lwz r3, 8(r3); + blr; + // clang-format on +} + +// Symbol: unk_80530f30 +// PAL: 0x80530f30..0x80531068 +MARK_BINARY_BLOB(unk_80530f30, 0x80530f30, 0x80531068); +asm UNKNOWN_FUNCTION(unk_80530f30) { + // clang-format off + nofralloc; + lwz r5, 4(r4); + li r0, 0x26; + stw r5, 0x18(r3); + addi r7, r3, 0x23; + addi r6, r4, 0xf; + lbz r5, 8(r4); + stb r5, 0x1c(r3); + lbz r5, 9(r4); + stb r5, 0x1d(r3); + lwz r5, 0xc(r4); + stw r5, 0x20(r3); + mtctr r0; +lbl_80530f60: + lbz r5, 1(r6); + lbzu r0, 2(r6); + stb r5, 1(r7); + stbu r0, 2(r7); + bdnz lbl_80530f60; + lwz r0, 0x5c(r4); + stw r0, 0x70(r3); + lbz r0, 0x60(r4); + stb r0, 0x74(r3); + lbz r0, 0x61(r4); + stb r0, 0x75(r3); + lbz r0, 0x62(r4); + stb r0, 0x76(r3); + lbz r0, 0x63(r4); + stb r0, 0x77(r3); + lwz r0, 0x64(r4); + stw r0, 0x78(r3); + lwz r5, 0x68(r4); + lwz r0, 0x6c(r4); + stw r0, 0x80(r3); + stw r5, 0x7c(r3); + lwz r5, 0x70(r4); + lwz r0, 0x74(r4); + stw r0, 0x88(r3); + stw r5, 0x84(r3); + lwz r5, 0x78(r4); + lwz r0, 0x7c(r4); + stw r0, 0x90(r3); + stw r5, 0x8c(r3); + lwz r5, 0x80(r4); + lwz r0, 0x84(r4); + stw r0, 0x98(r3); + stw r5, 0x94(r3); + lwz r5, 0x88(r4); + lwz r0, 0x8c(r4); + stw r0, 0xa0(r3); + stw r5, 0x9c(r3); + lwz r5, 0x90(r4); + lwz r0, 0x94(r4); + stw r0, 0xa8(r3); + stw r5, 0xa4(r3); + lwz r5, 0x98(r4); + lwz r0, 0x9c(r4); + stw r0, 0xb0(r3); + stw r5, 0xac(r3); + lwz r0, 0xa0(r4); + stw r0, 0xb4(r3); + lbz r0, 0xa4(r4); + stb r0, 0xb8(r3); + lbz r0, 0xa5(r4); + stb r0, 0xb9(r3); + lbz r0, 0xa6(r4); + stb r0, 0xba(r3); + lwz r0, 0xa8(r4); + stw r0, 0xbc(r3); + lbz r0, 0xac(r4); + stb r0, 0xc0(r3); + lbz r0, 0xad(r4); + stb r0, 0xc1(r3); + lbz r0, 0xae(r4); + stb r0, 0xc2(r3); + lwz r0, 0xb0(r4); + stw r0, 0xc4(r3); + lwz r0, 0xb4(r4); + stw r0, 0xc8(r3); + blr; + // clang-format on +} + +// Symbol: unk_80531068 +// PAL: 0x80531068..0x80531070 +MARK_BINARY_BLOB(unk_80531068, 0x80531068, 0x80531070); +asm UNKNOWN_FUNCTION(unk_80531068) { + // clang-format off + nofralloc; + addi r3, r3, 0x14; + blr; + // clang-format on +} + +// Symbol: Racedata_initCredits +// PAL: 0x80531070..0x80531ce4 +MARK_BINARY_BLOB(Racedata_initCredits, 0x80531070, 0x80531ce4); +asm UNKNOWN_FUNCTION(Racedata_initCredits) { + // clang-format off + nofralloc; + stwu r1, -0x40(r1); + mflr r0; + addi r5, r3, 0xc18; + addi r4, r3, 0x1808; + stw r0, 0x44(r1); + addi r6, r3, 0x1758; + stmw r21, 0x14(r1); + mr r31, r3; + lbz r0, 0x1804(r3); + lbz r9, 0x1805(r3); + lbz r8, 0x1806(r3); + lbz r7, 0x1807(r3); + stb r0, 0xc14(r3); + li r0, 0x26; + stb r9, 0xc15(r3); + stb r8, 0xc16(r3); + stb r7, 0xc17(r3); +lbl_805310b4: + lbz r7, 4(r4); + addi r10, r5, 0x23; + stb r7, 4(r5); + addi r9, r4, 0x23; + lbz r7, 5(r4); + stb r7, 5(r5); + lbz r7, 6(r4); + stb r7, 6(r5); + lwz r7, 8(r4); + stw r7, 8(r5); + lwz r7, 0xc(r4); + stw r7, 0xc(r5); + lwz r7, 0x10(r4); + stw r7, 0x10(r5); + lwz r7, 0x18(r4); + stw r7, 0x18(r5); + lbz r7, 0x1c(r4); + stb r7, 0x1c(r5); + lbz r7, 0x1d(r4); + stb r7, 0x1d(r5); + lwz r7, 0x20(r4); + stw r7, 0x20(r5); + mtctr r0; +lbl_80531110: + lbz r8, 1(r9); + lbzu r7, 2(r9); + stb r8, 1(r10); + stbu r7, 2(r10); + bdnz lbl_80531110; + lwz r7, 0x70(r4); + stw r7, 0x70(r5); + lbz r7, 0x74(r4); + stb r7, 0x74(r5); + lbz r7, 0x75(r4); + stb r7, 0x75(r5); + lbz r7, 0x76(r4); + stb r7, 0x76(r5); + lbz r7, 0x77(r4); + stb r7, 0x77(r5); + lwz r7, 0x78(r4); + stw r7, 0x78(r5); + lwz r7, 0x80(r4); + lwz r8, 0x7c(r4); + stw r8, 0x7c(r5); + stw r7, 0x80(r5); + lwz r7, 0x88(r4); + lwz r8, 0x84(r4); + stw r8, 0x84(r5); + stw r7, 0x88(r5); + lwz r7, 0x90(r4); + lwz r8, 0x8c(r4); + stw r8, 0x8c(r5); + stw r7, 0x90(r5); + lwz r7, 0x98(r4); + lwz r8, 0x94(r4); + stw r8, 0x94(r5); + stw r7, 0x98(r5); + lwz r7, 0xa0(r4); + lwz r8, 0x9c(r4); + stw r8, 0x9c(r5); + stw r7, 0xa0(r5); + lwz r7, 0xa8(r4); + lwz r8, 0xa4(r4); + stw r8, 0xa4(r5); + stw r7, 0xa8(r5); + lwz r7, 0xb0(r4); + lwz r8, 0xac(r4); + stw r8, 0xac(r5); + stw r7, 0xb0(r5); + lwz r7, 0xb4(r4); + stw r7, 0xb4(r5); + lbz r7, 0xb8(r4); + stb r7, 0xb8(r5); + lbz r7, 0xb9(r4); + stb r7, 0xb9(r5); + lbz r7, 0xba(r4); + stb r7, 0xba(r5); + lwz r7, 0xbc(r4); + stw r7, 0xbc(r5); + lbz r7, 0xc0(r4); + stb r7, 0xc0(r5); + lbz r7, 0xc1(r4); + stb r7, 0xc1(r5); + lbz r7, 0xc2(r4); + stb r7, 0xc2(r5); + lwz r7, 0xc4(r4); + stw r7, 0xc4(r5); + lwz r7, 0xc8(r4); + stw r7, 0xc8(r5); + lwz r7, 0xcc(r4); + stw r7, 0xcc(r5); + lwz r7, 0xd0(r4); + stw r7, 0xd0(r5); + lwz r7, 0xd4(r4); + stw r7, 0xd4(r5); + lhz r7, 0xd8(r4); + sth r7, 0xd8(r5); + lhz r7, 0xda(r4); + sth r7, 0xda(r5); + lhz r7, 0xdc(r4); + sth r7, 0xdc(r5); + lha r7, 0xde(r4); + sth r7, 0xde(r5); + lbz r7, 0xe0(r4); + stb r7, 0xe0(r5); + lbz r7, 0xe1(r4); + stb r7, 0xe1(r5); + lbz r7, 0xe2(r4); + stb r7, 0xe2(r5); + lhz r7, 0xe8(r4); + sth r7, 0xe8(r5); + lbz r7, 0xec(r4); + addi r4, r4, 0xf0; + stb r7, 0xec(r5); + addi r5, r5, 0xf0; + cmplw r5, r6; + blt lbl_805310b4; + lwz r21, 0x2348(r3); + li r0, 0xe; + lwz r30, 0x234c(r3); + addi r6, r3, 0x1788; + lwz r29, 0x2350(r3); + addi r5, r3, 0x2378; + lwz r28, 0x2354(r3); + lwz r27, 0x2358(r3); + lwz r26, 0x235c(r3); + lwz r25, 0x2360(r3); + lbz r24, 0x2364(r3); + lbz r23, 0x2365(r3); + lbz r22, 0x2366(r3); + lbz r12, 0x2367(r3); + lwz r11, 0x2368(r3); + lbz r10, 0x236c(r3); + lbz r9, 0x236d(r3); + lwz r8, 0x2370(r3); + lwz r7, 0x2374(r3); + lwz r4, 0x2378(r3); + stw r21, 0x1758(r3); + stw r30, 0x175c(r3); + stw r29, 0x1760(r3); + stw r28, 0x1764(r3); + stw r27, 0x1768(r3); + stw r26, 0x176c(r3); + stw r25, 0x1770(r3); + stb r24, 0x1774(r3); + stb r23, 0x1775(r3); + stb r22, 0x1776(r3); + stb r12, 0x1777(r3); + stw r11, 0x1778(r3); + stb r10, 0x177c(r3); + stb r9, 0x177d(r3); + stw r8, 0x1780(r3); + stw r7, 0x1784(r3); + stw r4, 0x1788(r3); + mtctr r0; +lbl_8053131c: + lwz r4, 4(r5); + lwzu r0, 8(r5); + stw r4, 4(r6); + stwu r0, 8(r6); + bdnz lbl_8053131c; + lwz r0, 0x23ec(r3); + addi r4, r31, 0x20; + stw r0, 0x17fc(r3); + addi r3, r3, 0xc10; + bl RacedataScenario_initRace; + lbz r9, 0xc14(r31); + addi r3, r31, 0x28; + lbz r8, 0xc15(r31); + addi r4, r31, 0xc18; + lbz r7, 0xc16(r31); + addi r5, r31, 0xb68; + lbz r6, 0xc17(r31); + li r0, 0x26; + stb r9, 0x24(r31); + stb r8, 0x25(r31); + stb r7, 0x26(r31); + stb r6, 0x27(r31); +lbl_80531374: + lbz r6, 4(r4); + addi r9, r3, 0x23; + stb r6, 4(r3); + addi r8, r4, 0x23; + lbz r6, 5(r4); + stb r6, 5(r3); + lbz r6, 6(r4); + stb r6, 6(r3); + lwz r6, 8(r4); + stw r6, 8(r3); + lwz r6, 0xc(r4); + stw r6, 0xc(r3); + lwz r6, 0x10(r4); + stw r6, 0x10(r3); + lwz r6, 0x18(r4); + stw r6, 0x18(r3); + lbz r6, 0x1c(r4); + stb r6, 0x1c(r3); + lbz r6, 0x1d(r4); + stb r6, 0x1d(r3); + lwz r6, 0x20(r4); + stw r6, 0x20(r3); + mtctr r0; +lbl_805313d0: + lbz r7, 1(r8); + lbzu r6, 2(r8); + stb r7, 1(r9); + stbu r6, 2(r9); + bdnz lbl_805313d0; + lwz r6, 0x70(r4); + stw r6, 0x70(r3); + lbz r6, 0x74(r4); + stb r6, 0x74(r3); + lbz r6, 0x75(r4); + stb r6, 0x75(r3); + lbz r6, 0x76(r4); + stb r6, 0x76(r3); + lbz r6, 0x77(r4); + stb r6, 0x77(r3); + lwz r6, 0x78(r4); + stw r6, 0x78(r3); + lwz r6, 0x80(r4); + lwz r7, 0x7c(r4); + stw r7, 0x7c(r3); + stw r6, 0x80(r3); + lwz r6, 0x88(r4); + lwz r7, 0x84(r4); + stw r7, 0x84(r3); + stw r6, 0x88(r3); + lwz r6, 0x90(r4); + lwz r7, 0x8c(r4); + stw r7, 0x8c(r3); + stw r6, 0x90(r3); + lwz r6, 0x98(r4); + lwz r7, 0x94(r4); + stw r7, 0x94(r3); + stw r6, 0x98(r3); + lwz r6, 0xa0(r4); + lwz r7, 0x9c(r4); + stw r7, 0x9c(r3); + stw r6, 0xa0(r3); + lwz r6, 0xa8(r4); + lwz r7, 0xa4(r4); + stw r7, 0xa4(r3); + stw r6, 0xa8(r3); + lwz r6, 0xb0(r4); + lwz r7, 0xac(r4); + stw r7, 0xac(r3); + stw r6, 0xb0(r3); + lwz r6, 0xb4(r4); + stw r6, 0xb4(r3); + lbz r6, 0xb8(r4); + stb r6, 0xb8(r3); + lbz r6, 0xb9(r4); + stb r6, 0xb9(r3); + lbz r6, 0xba(r4); + stb r6, 0xba(r3); + lwz r6, 0xbc(r4); + stw r6, 0xbc(r3); + lbz r6, 0xc0(r4); + stb r6, 0xc0(r3); + lbz r6, 0xc1(r4); + stb r6, 0xc1(r3); + lbz r6, 0xc2(r4); + stb r6, 0xc2(r3); + lwz r6, 0xc4(r4); + stw r6, 0xc4(r3); + lwz r6, 0xc8(r4); + stw r6, 0xc8(r3); + lwz r6, 0xcc(r4); + stw r6, 0xcc(r3); + lwz r6, 0xd0(r4); + stw r6, 0xd0(r3); + lwz r6, 0xd4(r4); + stw r6, 0xd4(r3); + lhz r6, 0xd8(r4); + sth r6, 0xd8(r3); + lhz r6, 0xda(r4); + sth r6, 0xda(r3); + lhz r6, 0xdc(r4); + sth r6, 0xdc(r3); + lha r6, 0xde(r4); + sth r6, 0xde(r3); + lbz r6, 0xe0(r4); + stb r6, 0xe0(r3); + lbz r6, 0xe1(r4); + stb r6, 0xe1(r3); + lbz r6, 0xe2(r4); + stb r6, 0xe2(r3); + lhz r6, 0xe8(r4); + sth r6, 0xe8(r3); + lbz r6, 0xec(r4); + addi r4, r4, 0xf0; + stb r6, 0xec(r3); + addi r3, r3, 0xf0; + cmplw r3, r5; + blt lbl_80531374; + lwz r30, 0x1758(r31); + li r0, 0xe; + lwz r29, 0x175c(r31); + addi r5, r31, 0xb98; + lwz r28, 0x1760(r31); + addi r4, r31, 0x1788; + lwz r27, 0x1764(r31); + lwz r26, 0x1768(r31); + lwz r25, 0x176c(r31); + lwz r24, 0x1770(r31); + lbz r23, 0x1774(r31); + lbz r22, 0x1775(r31); + lbz r12, 0x1776(r31); + lbz r11, 0x1777(r31); + lwz r10, 0x1778(r31); + lbz r9, 0x177c(r31); + lbz r8, 0x177d(r31); + lwz r7, 0x1780(r31); + lwz r6, 0x1784(r31); + lwz r3, 0x1788(r31); + stw r30, 0xb68(r31); + stw r29, 0xb6c(r31); + stw r28, 0xb70(r31); + stw r27, 0xb74(r31); + stw r26, 0xb78(r31); + stw r25, 0xb7c(r31); + stw r24, 0xb80(r31); + stb r23, 0xb84(r31); + stb r22, 0xb85(r31); + stb r12, 0xb86(r31); + stb r11, 0xb87(r31); + stw r10, 0xb88(r31); + stb r9, 0xb8c(r31); + stb r8, 0xb8d(r31); + stw r7, 0xb90(r31); + stw r6, 0xb94(r31); + stw r3, 0xb98(r31); + mtctr r0; +lbl_805315dc: + lwz r3, 4(r4); + lwzu r0, 8(r4); + stw r3, 4(r5); + stwu r0, 8(r5); + bdnz lbl_805315dc; + lwz r5, 0x17fc(r31); + li r0, 2; + li r4, 0xc; + li r3, 0x3a; + stw r5, 0xc0c(r31); + li r11, 0; + li r8, 5; + stw r4, 0x1760(r31); + stw r3, 0x1758(r31); + mtctr r0; +lbl_80531618: + clrlwi r5, r11, 0x18; + addi r0, r11, 2; + mulli r4, r5, 0xf0; + addi r3, r11, 1; + clrlwi r6, r0, 0x18; + clrlwi r7, r3, 0x18; + add r9, r31, r4; + addi r3, r11, 4; + stw r8, 0xc28(r9); + addi r10, r5, 1; + addi r0, r11, 3; + clrlwi r4, r3, 0x18; + stb r10, 0xcf9(r9); + clrlwi r5, r0, 0x18; + addi r0, r11, 5; + addi r6, r6, 1; + stb r10, 0xcf8(r9); + clrlwi r3, r0, 0x18; + addi r0, r7, 1; + addi r5, r5, 1; + stw r8, 0xd18(r9); + addi r4, r4, 1; + addi r3, r3, 1; + addi r11, r11, 6; + stb r0, 0xde9(r9); + stb r0, 0xde8(r9); + stw r8, 0xe08(r9); + stb r6, 0xed9(r9); + stb r6, 0xed8(r9); + stw r8, 0xef8(r9); + stb r5, 0xfc9(r9); + stb r5, 0xfc8(r9); + stw r8, 0xfe8(r9); + stb r4, 0x10b9(r9); + stb r4, 0x10b8(r9); + stw r8, 0x10d8(r9); + stb r3, 0x11a9(r9); + stb r3, 0x11a8(r9); + bdnz lbl_80531618; + li r8, 0; + li r7, 0; + li r3, 1; + li r0, 0x26; + lis r6, 0; +lbl_805316c8: + clrlwi r5, r7, 0x18; + lwz r4, 0(r6); + mulli r5, r5, 0xf0; + add r4, r4, r5; + lwz r4, 0x38(r4); + cmpwi r4, 0; + bne lbl_80531848; + clrlwi r10, r8, 0x18; + add r5, r31, r5; + mulli r4, r10, 0xf0; + lwz r9, 0x34(r5); + addi r10, r10, 1; + addi r11, r5, 0x4b; + add r4, r31, r4; + stw r9, 0xc24(r4); + addi r12, r4, 0xc3b; + lwz r9, 0x30(r5); + stw r9, 0xc20(r4); + stb r10, 0xcf9(r4); + stb r10, 0xcf8(r4); + stw r3, 0xc28(r4); + lwz r9, 0x40(r5); + stw r9, 0xc30(r4); + lbz r9, 0x44(r5); + stb r9, 0xc34(r4); + lbz r9, 0x45(r5); + stb r9, 0xc35(r4); + lwz r9, 0x48(r5); + stw r9, 0xc38(r4); + mtctr r0; +lbl_80531740: + lbz r10, 1(r11); + lbzu r9, 2(r11); + stb r10, 1(r12); + stbu r9, 2(r12); + bdnz lbl_80531740; + lwz r9, 0x98(r5); + addi r8, r8, 1; + stw r9, 0xc88(r4); + lbz r9, 0x9c(r5); + stb r9, 0xc8c(r4); + lbz r9, 0x9d(r5); + stb r9, 0xc8d(r4); + lbz r9, 0x9e(r5); + stb r9, 0xc8e(r4); + lbz r9, 0x9f(r5); + stb r9, 0xc8f(r4); + lwz r9, 0xa0(r5); + stw r9, 0xc90(r4); + lwz r9, 0xa8(r5); + lwz r10, 0xa4(r5); + stw r10, 0xc94(r4); + stw r9, 0xc98(r4); + lwz r9, 0xb0(r5); + lwz r10, 0xac(r5); + stw r10, 0xc9c(r4); + stw r9, 0xca0(r4); + lwz r9, 0xb8(r5); + lwz r10, 0xb4(r5); + stw r10, 0xca4(r4); + stw r9, 0xca8(r4); + lwz r9, 0xc0(r5); + lwz r10, 0xbc(r5); + stw r10, 0xcac(r4); + stw r9, 0xcb0(r4); + lwz r9, 0xc8(r5); + lwz r10, 0xc4(r5); + stw r10, 0xcb4(r4); + stw r9, 0xcb8(r4); + lwz r9, 0xd0(r5); + lwz r10, 0xcc(r5); + stw r10, 0xcbc(r4); + stw r9, 0xcc0(r4); + lwz r9, 0xd8(r5); + lwz r10, 0xd4(r5); + stw r10, 0xcc4(r4); + stw r9, 0xcc8(r4); + lwz r9, 0xdc(r5); + stw r9, 0xccc(r4); + lbz r9, 0xe0(r5); + stb r9, 0xcd0(r4); + lbz r9, 0xe1(r5); + stb r9, 0xcd1(r4); + lbz r9, 0xe2(r5); + stb r9, 0xcd2(r4); + lwz r9, 0xe4(r5); + stw r9, 0xcd4(r4); + lbz r9, 0xe8(r5); + stb r9, 0xcd8(r4); + lbz r9, 0xe9(r5); + stb r9, 0xcd9(r4); + lbz r9, 0xea(r5); + stb r9, 0xcda(r4); + lwz r9, 0xec(r5); + stw r9, 0xcdc(r4); + lwz r5, 0xf0(r5); + stw r5, 0xce0(r4); +lbl_80531848: + addi r7, r7, 1; + cmplwi r7, 0xc; + blt lbl_805316c8; + li r9, 1; + li r3, 1; + li r0, 0x26; + lis r7, 0; +lbl_80531864: + clrlwi r6, r9, 0x18; + li r10, 0; +lbl_8053186c: + clrlwi r5, r10, 0x18; + lwz r4, 0(r7); + mulli r11, r5, 0xf0; + add r5, r4, r11; + lbz r4, 0x108(r5); + cmplw r6, r4; + bne lbl_805319f8; + lwz r4, 0x38(r5); + cmpwi r4, 0; + beq lbl_805319f8; + clrlwi r12, r8, 0x18; + add r5, r31, r11; + mulli r4, r12, 0xf0; + lwz r11, 0x34(r5); + addi r12, r12, 1; + addi r22, r5, 0x4b; + add r4, r31, r4; + stw r11, 0xc24(r4); + addi r23, r4, 0xc3b; + lwz r11, 0x30(r5); + stw r11, 0xc20(r4); + stb r12, 0xcf9(r4); + stb r12, 0xcf8(r4); + stw r3, 0xc28(r4); + lwz r11, 0x40(r5); + stw r11, 0xc30(r4); + lbz r11, 0x44(r5); + stb r11, 0xc34(r4); + lbz r11, 0x45(r5); + stb r11, 0xc35(r4); + lwz r11, 0x48(r5); + stw r11, 0xc38(r4); + mtctr r0; +lbl_805318f0: + lbz r12, 1(r22); + lbzu r11, 2(r22); + stb r12, 1(r23); + stbu r11, 2(r23); + bdnz lbl_805318f0; + lwz r11, 0x98(r5); + addi r8, r8, 1; + stw r11, 0xc88(r4); + lbz r11, 0x9c(r5); + stb r11, 0xc8c(r4); + lbz r11, 0x9d(r5); + stb r11, 0xc8d(r4); + lbz r11, 0x9e(r5); + stb r11, 0xc8e(r4); + lbz r11, 0x9f(r5); + stb r11, 0xc8f(r4); + lwz r11, 0xa0(r5); + stw r11, 0xc90(r4); + lwz r11, 0xa8(r5); + lwz r12, 0xa4(r5); + stw r12, 0xc94(r4); + stw r11, 0xc98(r4); + lwz r11, 0xb0(r5); + lwz r12, 0xac(r5); + stw r12, 0xc9c(r4); + stw r11, 0xca0(r4); + lwz r11, 0xb8(r5); + lwz r12, 0xb4(r5); + stw r12, 0xca4(r4); + stw r11, 0xca8(r4); + lwz r11, 0xc0(r5); + lwz r12, 0xbc(r5); + stw r12, 0xcac(r4); + stw r11, 0xcb0(r4); + lwz r11, 0xc8(r5); + lwz r12, 0xc4(r5); + stw r12, 0xcb4(r4); + stw r11, 0xcb8(r4); + lwz r11, 0xd0(r5); + lwz r12, 0xcc(r5); + stw r12, 0xcbc(r4); + stw r11, 0xcc0(r4); + lwz r11, 0xd8(r5); + lwz r12, 0xd4(r5); + stw r12, 0xcc4(r4); + stw r11, 0xcc8(r4); + lwz r11, 0xdc(r5); + stw r11, 0xccc(r4); + lbz r11, 0xe0(r5); + stb r11, 0xcd0(r4); + lbz r11, 0xe1(r5); + stb r11, 0xcd1(r4); + lbz r11, 0xe2(r5); + stb r11, 0xcd2(r4); + lwz r11, 0xe4(r5); + stw r11, 0xcd4(r4); + lbz r11, 0xe8(r5); + stb r11, 0xcd8(r4); + lbz r11, 0xe9(r5); + stb r11, 0xcd9(r4); + lbz r11, 0xea(r5); + stb r11, 0xcda(r4); + lwz r11, 0xec(r5); + stw r11, 0xcdc(r4); + lwz r5, 0xf0(r5); + stw r5, 0xce0(r4); +lbl_805319f8: + addi r10, r10, 1; + cmplwi r10, 0xc; + blt lbl_8053186c; + addi r9, r9, 1; + cmplwi r9, 0xc; + ble lbl_80531864; + addi r3, r31, 0xc10; + addi r4, r31, 0x20; + bl RacedataScenario_initRace; + lbz r9, 0xc14(r31); + addi r3, r31, 0x28; + lbz r8, 0xc15(r31); + addi r4, r31, 0xc18; + lbz r7, 0xc16(r31); + addi r5, r31, 0xb68; + lbz r6, 0xc17(r31); + li r0, 0x26; + stb r9, 0x24(r31); + stb r8, 0x25(r31); + stb r7, 0x26(r31); + stb r6, 0x27(r31); +lbl_80531a4c: + lbz r6, 4(r4); + addi r9, r3, 0x23; + stb r6, 4(r3); + addi r8, r4, 0x23; + lbz r6, 5(r4); + stb r6, 5(r3); + lbz r6, 6(r4); + stb r6, 6(r3); + lwz r6, 8(r4); + stw r6, 8(r3); + lwz r6, 0xc(r4); + stw r6, 0xc(r3); + lwz r6, 0x10(r4); + stw r6, 0x10(r3); + lwz r6, 0x18(r4); + stw r6, 0x18(r3); + lbz r6, 0x1c(r4); + stb r6, 0x1c(r3); + lbz r6, 0x1d(r4); + stb r6, 0x1d(r3); + lwz r6, 0x20(r4); + stw r6, 0x20(r3); + mtctr r0; +lbl_80531aa8: + lbz r7, 1(r8); + lbzu r6, 2(r8); + stb r7, 1(r9); + stbu r6, 2(r9); + bdnz lbl_80531aa8; + lwz r6, 0x70(r4); + stw r6, 0x70(r3); + lbz r6, 0x74(r4); + stb r6, 0x74(r3); + lbz r6, 0x75(r4); + stb r6, 0x75(r3); + lbz r6, 0x76(r4); + stb r6, 0x76(r3); + lbz r6, 0x77(r4); + stb r6, 0x77(r3); + lwz r6, 0x78(r4); + stw r6, 0x78(r3); + lwz r6, 0x80(r4); + lwz r7, 0x7c(r4); + stw r7, 0x7c(r3); + stw r6, 0x80(r3); + lwz r6, 0x88(r4); + lwz r7, 0x84(r4); + stw r7, 0x84(r3); + stw r6, 0x88(r3); + lwz r6, 0x90(r4); + lwz r7, 0x8c(r4); + stw r7, 0x8c(r3); + stw r6, 0x90(r3); + lwz r6, 0x98(r4); + lwz r7, 0x94(r4); + stw r7, 0x94(r3); + stw r6, 0x98(r3); + lwz r6, 0xa0(r4); + lwz r7, 0x9c(r4); + stw r7, 0x9c(r3); + stw r6, 0xa0(r3); + lwz r6, 0xa8(r4); + lwz r7, 0xa4(r4); + stw r7, 0xa4(r3); + stw r6, 0xa8(r3); + lwz r6, 0xb0(r4); + lwz r7, 0xac(r4); + stw r7, 0xac(r3); + stw r6, 0xb0(r3); + lwz r6, 0xb4(r4); + stw r6, 0xb4(r3); + lbz r6, 0xb8(r4); + stb r6, 0xb8(r3); + lbz r6, 0xb9(r4); + stb r6, 0xb9(r3); + lbz r6, 0xba(r4); + stb r6, 0xba(r3); + lwz r6, 0xbc(r4); + stw r6, 0xbc(r3); + lbz r6, 0xc0(r4); + stb r6, 0xc0(r3); + lbz r6, 0xc1(r4); + stb r6, 0xc1(r3); + lbz r6, 0xc2(r4); + stb r6, 0xc2(r3); + lwz r6, 0xc4(r4); + stw r6, 0xc4(r3); + lwz r6, 0xc8(r4); + stw r6, 0xc8(r3); + lwz r6, 0xcc(r4); + stw r6, 0xcc(r3); + lwz r6, 0xd0(r4); + stw r6, 0xd0(r3); + lwz r6, 0xd4(r4); + stw r6, 0xd4(r3); + lhz r6, 0xd8(r4); + sth r6, 0xd8(r3); + lhz r6, 0xda(r4); + sth r6, 0xda(r3); + lhz r6, 0xdc(r4); + sth r6, 0xdc(r3); + lha r6, 0xde(r4); + sth r6, 0xde(r3); + lbz r6, 0xe0(r4); + stb r6, 0xe0(r3); + lbz r6, 0xe1(r4); + stb r6, 0xe1(r3); + lbz r6, 0xe2(r4); + stb r6, 0xe2(r3); + lhz r6, 0xe8(r4); + sth r6, 0xe8(r3); + lbz r6, 0xec(r4); + addi r4, r4, 0xf0; + stb r6, 0xec(r3); + addi r3, r3, 0xf0; + cmplw r3, r5; + blt lbl_80531a4c; + lwz r22, 0x1758(r31); + li r0, 0xe; + lwz r23, 0x175c(r31); + addi r5, r31, 0xb98; + lwz r24, 0x1760(r31); + addi r4, r31, 0x1788; + lwz r25, 0x1764(r31); + lwz r26, 0x1768(r31); + lwz r27, 0x176c(r31); + lwz r28, 0x1770(r31); + lbz r29, 0x1774(r31); + lbz r30, 0x1775(r31); + lbz r12, 0x1776(r31); + lbz r11, 0x1777(r31); + lwz r10, 0x1778(r31); + lbz r9, 0x177c(r31); + lbz r8, 0x177d(r31); + lwz r7, 0x1780(r31); + lwz r6, 0x1784(r31); + lwz r3, 0x1788(r31); + stw r22, 0xb68(r31); + stw r23, 0xb6c(r31); + stw r24, 0xb70(r31); + stw r25, 0xb74(r31); + stw r26, 0xb78(r31); + stw r27, 0xb7c(r31); + stw r28, 0xb80(r31); + stb r29, 0xb84(r31); + stb r30, 0xb85(r31); + stb r12, 0xb86(r31); + stb r11, 0xb87(r31); + stw r10, 0xb88(r31); + stb r9, 0xb8c(r31); + stb r8, 0xb8d(r31); + stw r7, 0xb90(r31); + stw r6, 0xb94(r31); + stw r3, 0xb98(r31); + mtctr r0; +lbl_80531cb4: + lwz r3, 4(r4); + lwzu r0, 8(r4); + stw r3, 4(r5); + stwu r0, 8(r5); + bdnz lbl_80531cb4; + lwz r0, 0x17fc(r31); + stw r0, 0xc0c(r31); + lmw r21, 0x14(r1); + lwz r0, 0x44(r1); + mtlr r0; + addi r1, r1, 0x40; + blr; + // clang-format on +} + +// Symbol: Racedata_updateEndOfRace +// PAL: 0x80531ce4..0x80531de4 +MARK_BINARY_BLOB(Racedata_updateEndOfRace, 0x80531ce4, 0x80531de4); +asm UNKNOWN_FUNCTION(Racedata_updateEndOfRace) { + // clang-format off + nofralloc; + lbz r4, 0x177c(r3); + cmplwi r4, 0x64; + bge lbl_80531cfc; + addi r0, r4, 1; + stb r0, 0x177c(r3); + b lbl_80531d04; +lbl_80531cfc: + li r0, 0; + stb r0, 0x177c(r3); +lbl_80531d04: + li r6, 0; + mulli r5, r6, 0xf0; + li r6, 6; + add r4, r3, r5; + lbz r0, 0xcfa(r4); + mulli r5, r6, 0xf0; + stb r0, 0xcf9(r4); + lhz r0, 0xcf2(r4); + sth r0, 0xcf0(r4); + lbz r0, 0xdea(r4); + stb r0, 0xde9(r4); + lhz r0, 0xde2(r4); + sth r0, 0xde0(r4); + lbz r0, 0xeda(r4); + stb r0, 0xed9(r4); + lhz r0, 0xed2(r4); + sth r0, 0xed0(r4); + lbz r0, 0xfca(r4); + stb r0, 0xfc9(r4); + lhz r0, 0xfc2(r4); + sth r0, 0xfc0(r4); + lbz r0, 0x10ba(r4); + stb r0, 0x10b9(r4); + lhz r0, 0x10b2(r4); + sth r0, 0x10b0(r4); + lbz r0, 0x11aa(r4); + stb r0, 0x11a9(r4); + lhz r0, 0x11a2(r4); + sth r0, 0x11a0(r4); + add r4, r3, r5; + lbz r0, 0xcfa(r4); + stb r0, 0xcf9(r4); + lhz r0, 0xcf2(r4); + sth r0, 0xcf0(r4); + lbz r0, 0xdea(r4); + stb r0, 0xde9(r4); + lhz r0, 0xde2(r4); + sth r0, 0xde0(r4); + lbz r0, 0xeda(r4); + stb r0, 0xed9(r4); + lhz r0, 0xed2(r4); + sth r0, 0xed0(r4); + lbz r0, 0xfca(r4); + stb r0, 0xfc9(r4); + lhz r0, 0xfc2(r4); + sth r0, 0xfc0(r4); + lbz r0, 0x10ba(r4); + stb r0, 0x10b9(r4); + lhz r0, 0x10b2(r4); + sth r0, 0x10b0(r4); + lbz r0, 0x11aa(r4); + stb r0, 0x11a9(r4); + lhz r0, 0x11a2(r4); + sth r0, 0x11a0(r4); + lbz r3, 0x177c(r3); + blr; + // clang-format on +} + +// Symbol: unk_80531de4 +// PAL: 0x80531de4..0x80531f18 +MARK_BINARY_BLOB(unk_80531de4, 0x80531de4, 0x80531f18); +asm UNKNOWN_FUNCTION(unk_80531de4) { + // clang-format off + nofralloc; + stwu r1, -0x20(r1); + mflr r0; + stw r0, 0x24(r1); + stmw r27, 0xc(r1); + lis r31, 0; + mr r27, r3; + mr r28, r4; + mr r3, r28; + addi r4, r27, 0xb48; + lwz r5, 0(r31); + lwz r6, 0x34(r5); + li r5, 4; + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r27, 0xb4c; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r27, 0xb50; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r27, 4; + li r5, 1; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r27, 6; + li r5, 1; + lwz r6, 0x34(r6); + bl unk_805553b0; + addi r30, r27, 8; + li r29, 0; +lbl_80531e80: + lwz r6, 0(r31); + mr r3, r28; + addi r4, r30, 8; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r30, 0xc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r30, 0x10; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + lwz r6, 0(r31); + mr r3, r28; + addi r4, r30, 0xcc; + li r5, 4; + lwz r6, 0x34(r6); + bl unk_805553b0; + addi r29, r29, 1; + addi r30, r30, 0xf0; + cmpwi r29, 0xc; + blt lbl_80531e80; + mr r3, r28; + addi r4, r27, 0xb70; + li r5, 4; + li r6, 0; + bl unk_805553b0; + lmw r27, 0xc(r1); + lwz r0, 0x24(r1); + mtlr r0; + addi r1, r1, 0x20; + blr; + // clang-format on +} + +// Symbol: Racedata_getLocalPlayerNum +// PAL: 0x80531f18..0x80531f2c +MARK_BINARY_BLOB(Racedata_getLocalPlayerNum, 0x80531f18, 0x80531f2c); +asm UNKNOWN_FUNCTION(Racedata_getLocalPlayerNum) { + // clang-format off + nofralloc; + mulli r0, r4, 0xf0; + add r3, r3, r0; + lbz r0, 0x2d(r3); + extsb r3, r0; + blr; + // clang-format on +} + +// Symbol: Racedata_setGhost +// PAL: 0x80531f2c..0x80531f70 +MARK_BINARY_BLOB(Racedata_setGhost, 0x80531f2c, 0x80531f70); +asm UNKNOWN_FUNCTION(Racedata_setGhost) { + // clang-format off + nofralloc; + lwz r6, 0xc0c(r3); + lwz r0, 0x17fc(r3); + cmplw r6, r0; + bne lbl_80531f64; + addi r5, r3, 0x23f0; + cmplw r6, r5; + bne lbl_80531f54; + addi r0, r3, 0x4bf0; + stw r0, 0x17fc(r3); + b lbl_80531f64; +lbl_80531f54: + addi r0, r3, 0x4bf0; + cmplw r6, r0; + bne lbl_80531f64; + stw r5, 0x17fc(r3); +lbl_80531f64: + lwz r3, 0x17fc(r3); + li r5, 0x2800; + b unk_805553b0; + // clang-format on +} + +// Symbol: Racedata_getHudPlayerId +// PAL: 0x80531f70..0x80531f80 +MARK_BINARY_BLOB(Racedata_getHudPlayerId, 0x80531f70, 0x80531f80); +asm UNKNOWN_FUNCTION(Racedata_getHudPlayerId) { + // clang-format off + nofralloc; + add r3, r3, r4; + lbz r0, 0xb84(r3); + extsb r3, r0; + blr; + // clang-format on +} + +// Symbol: unk_80531f80 +// PAL: 0x80531f80..0x80531fc8 +MARK_BINARY_BLOB(unk_80531f80, 0x80531f80, 0x80531fc8); +asm UNKNOWN_FUNCTION(unk_80531f80) { + // clang-format off + nofralloc; + lwz r0, 0xb70(r3); + cmpwi r0, 0; + bnelr; + lbz r4, 0xb8c(r3); + cmplwi r4, 3; + bgelr; + lwz r3, 0xb88(r3); + lis r5, 0; + addi r0, r4, 1; + lis r7, 0; + slwi r6, r3, 4; + addi r5, r5, 0; + slwi r4, r0, 2; + lwz r3, 0(r7); + add r0, r5, r6; + lwzx r4, r4, r0; + b ResourceManager_preloadCourseAsync; + blr; + // clang-format on +} + +// Symbol: unk_80531fc8 +// PAL: 0x80531fc8..0x80532030 +MARK_BINARY_BLOB(unk_80531fc8, 0x80531fc8, 0x80532030); +asm UNKNOWN_FUNCTION(unk_80531fc8) { + // clang-format off + nofralloc; + lwz r5, 0xb74(r3); + addi r0, r5, -2; + cmplwi r0, 2; + bgt lbl_80531fe0; + li r3, 1; + blr; +lbl_80531fe0: + cmpwi r5, 1; + bne lbl_80531ff0; + li r3, 1; + blr; +lbl_80531ff0: + add r4, r3, r4; + lbz r0, 0xb84(r4); + extsb. r0, r0; + blt lbl_80532028; + clrlwi r0, r0, 0x18; + mulli r0, r0, 0xf0; + add r3, r3, r0; + lwz r0, 0x38(r3); + cmpwi r0, 0; + beq lbl_80532028; + cmpwi r0, 3; + beq lbl_80532028; + li r3, 1; + blr; +lbl_80532028: + li r3, 0; + blr; + // clang-format on +} + +// Symbol: Racedata_isTimeAttackReplay +// PAL: 0x80532030..0x80532070 +MARK_BINARY_BLOB(Racedata_isTimeAttackReplay, 0x80532030, 0x80532070); +asm UNKNOWN_FUNCTION(Racedata_isTimeAttackReplay) { + // clang-format off + nofralloc; + lwz r0, 0xb70(r3); + li r3, 0; + cmpwi r0, 2; + beq lbl_80532048; + cmpwi r0, 5; + bnelr; +lbl_80532048: + lis r4, 0; + lwz r4, 0(r4); + lbz r0, 0x24(r4); + cmpwi r0, 0; + beqlr; + lwz r0, 0x38(r4); + cmpwi r0, 3; + bnelr; + li r3, 1; + blr; + // clang-format on +} + +// Symbol: unk_80532070 +// PAL: 0x80532070..0x80532074 +MARK_BINARY_BLOB(unk_80532070, 0x80532070, 0x80532074); +asm UNKNOWN_FUNCTION(unk_80532070) { + // clang-format off + nofralloc; + blr; + // clang-format on +} + +// Symbol: unk_80532074 +// PAL: 0x80532074..0x80532078 +MARK_BINARY_BLOB(unk_80532074, 0x80532074, 0x80532078); +asm UNKNOWN_FUNCTION(unk_80532074) { + // clang-format off + nofralloc; + blr; + // clang-format on +} + +// Symbol: unk_80532078 +// PAL: 0x80532078..0x8053207c +MARK_BINARY_BLOB(unk_80532078, 0x80532078, 0x8053207c); +asm UNKNOWN_FUNCTION(unk_80532078) { + // clang-format off + nofralloc; + blr; + // clang-format on +} + +// Symbol: unk_8053207c +// PAL: 0x8053207c..0x80532084 +MARK_BINARY_BLOB(unk_8053207c, 0x8053207c, 0x80532084); +asm UNKNOWN_FUNCTION(unk_8053207c) { + // clang-format off + nofralloc; + li r3, 0; + blr; + // clang-format on +} + diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 30f756a36..4f1d54a43 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -2,6 +2,137 @@ #include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// PAL: 0x8052d96c..0x8052da10 +UNKNOWN_FUNCTION(RacedataPlayer_construct); +// PAL: 0x8052da10..0x8052da50 +UNKNOWN_FUNCTION(unk_8052da10); +// PAL: 0x8052da50..0x8052daf0 +UNKNOWN_FUNCTION(unk_8052da50); +// PAL: 0x8052daf0..0x8052dbc8 +UNKNOWN_FUNCTION(RacedataPlayer_computeGpRank); +// PAL: 0x8052dbc8..0x8052dc68 +UNKNOWN_FUNCTION(RacedataScenario_construct); +// PAL: 0x8052dc68..0x8052dca8 +UNKNOWN_FUNCTION(RacedataPlayer_destroy); +// PAL: 0x8052dca8..0x8052dd18 +UNKNOWN_FUNCTION(unk_8052dca8); +// PAL: 0x8052dd18..0x8052dd20 +UNKNOWN_FUNCTION(unk_8052dd18); +// PAL: 0x8052dd20..0x8052dd30 +UNKNOWN_FUNCTION(unk_8052dd20); +// PAL: 0x8052dd30..0x8052dd40 +UNKNOWN_FUNCTION(unk_8052dd30); +// PAL: 0x8052dd40..0x8052e42c +UNKNOWN_FUNCTION(Racedata_init); +// PAL: 0x8052e42c..0x8052e434 +UNKNOWN_FUNCTION(unk_8052e42c); +// PAL: 0x8052e434..0x8052e444 +UNKNOWN_FUNCTION(RacedataScenario_getPlayer); +// PAL: 0x8052e444..0x8052e44c +UNKNOWN_FUNCTION(unk_8052e444); +// PAL: 0x8052e44c..0x8052e454 +UNKNOWN_FUNCTION(unk_8052e44c); +// PAL: 0x8052e454..0x8052e658 +UNKNOWN_FUNCTION(Racedata_resetSomeStuff); +// PAL: 0x8052e658..0x8052e660 +UNKNOWN_FUNCTION(unk_8052e658); +// PAL: 0x8052e660..0x8052e668 +UNKNOWN_FUNCTION(unk_8052e660); +// PAL: 0x8052e668..0x8052e870 +UNKNOWN_FUNCTION(unk_8052e668); +// PAL: 0x8052e870..0x8052e950 +UNKNOWN_FUNCTION(unk_8052e870); +// PAL: 0x8052e950..0x8052ed18 +UNKNOWN_FUNCTION(unk_8052e950); +// PAL: 0x8052ed18..0x8052ed20 +UNKNOWN_FUNCTION(unk_8052ed18); +// PAL: 0x8052ed20..0x8052ed28 +UNKNOWN_FUNCTION(unk_8052ed20); +// PAL: 0x8052ed28..0x8052eef0 +UNKNOWN_FUNCTION(RacedataScenario_postInitControllers); +// PAL: 0x8052eef0..0x8052efd4 +UNKNOWN_FUNCTION(unk_8052eef0); +// PAL: 0x8052efd4..0x8052f064 +UNKNOWN_FUNCTION(unk_8052efd4); +// PAL: 0x8052f064..0x8052f1e0 +UNKNOWN_FUNCTION(unk_8052f064); +// PAL: 0x8052f1e0..0x8052f4e8 +UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions); +// PAL: 0x8052f4e8..0x8052f788 +UNKNOWN_FUNCTION(RacedataScenario_initControllers); +// PAL: 0x8052f788..0x8052f924 +UNKNOWN_FUNCTION(RacedataScenario_computePlayerCounts); +// PAL: 0x8052f924..0x8052fa0c +UNKNOWN_FUNCTION(RacedataScenario_initRng); +// PAL: 0x8052fa0c..0x8052fb90 +UNKNOWN_FUNCTION(unk_8052fa0c); +// PAL: 0x8052fb90..0x8052fe58 +UNKNOWN_FUNCTION(RacedataScenario_initRace); +// PAL: 0x8052fe58..0x8052ffe8 +UNKNOWN_FUNCTION(Racedata_initStaticInstance); +// PAL: 0x8052ffe8..0x80530038 +UNKNOWN_FUNCTION(Racedata_destroyStaticInstance); +// PAL: 0x80530038..0x805300f4 +UNKNOWN_FUNCTION(Racedata_destroy); +// PAL: 0x805300f4..0x8053015c +UNKNOWN_FUNCTION(RacedataScenario_destroy); +// PAL: 0x8053015c..0x805302c4 +UNKNOWN_FUNCTION(Racedata_construct); +// PAL: 0x805302c4..0x805305ac +UNKNOWN_FUNCTION(Racedata_initRace); +// PAL: 0x805305ac..0x80530864 +UNKNOWN_FUNCTION(RacedataScenario_copy); +// PAL: 0x80530864..0x80530f0c +UNKNOWN_FUNCTION(Racedata_initAwards); +// PAL: 0x80530f0c..0x80530f18 +UNKNOWN_FUNCTION(unk_80530f0c); +// PAL: 0x80530f18..0x80530f20 +UNKNOWN_FUNCTION(unk_80530f18); +// PAL: 0x80530f20..0x80530f28 +UNKNOWN_FUNCTION(unk_80530f20); +// PAL: 0x80530f28..0x80530f30 +UNKNOWN_FUNCTION(unk_80530f28); +// PAL: 0x80530f30..0x80531068 +UNKNOWN_FUNCTION(unk_80530f30); +// PAL: 0x80531068..0x80531070 +UNKNOWN_FUNCTION(unk_80531068); +// PAL: 0x80531070..0x80531ce4 +UNKNOWN_FUNCTION(Racedata_initCredits); +// PAL: 0x80531ce4..0x80531de4 +UNKNOWN_FUNCTION(Racedata_updateEndOfRace); +// PAL: 0x80531de4..0x80531f18 +UNKNOWN_FUNCTION(unk_80531de4); +// PAL: 0x80531f18..0x80531f2c +UNKNOWN_FUNCTION(Racedata_getLocalPlayerNum); +// PAL: 0x80531f2c..0x80531f70 +UNKNOWN_FUNCTION(Racedata_setGhost); +// PAL: 0x80531f70..0x80531f80 +UNKNOWN_FUNCTION(Racedata_getHudPlayerId); +// PAL: 0x80531f80..0x80531fc8 +UNKNOWN_FUNCTION(unk_80531f80); +// PAL: 0x80531fc8..0x80532030 +UNKNOWN_FUNCTION(unk_80531fc8); +// PAL: 0x80532030..0x80532070 +UNKNOWN_FUNCTION(Racedata_isTimeAttackReplay); +// PAL: 0x80532070..0x80532074 +UNKNOWN_FUNCTION(unk_80532070); +// PAL: 0x80532074..0x80532078 +UNKNOWN_FUNCTION(unk_80532074); +// PAL: 0x80532078..0x8053207c +UNKNOWN_FUNCTION(unk_80532078); +// PAL: 0x8053207c..0x80532084 +UNKNOWN_FUNCTION(unk_8053207c); + +#ifdef __cplusplus +} +#endif + struct RaceConfigPlayer { u8 _00[0x08 - 0x00]; u32 vehicleId; diff --git a/sources.py b/sources.py index 43f3f5271..a98ccc355 100644 --- a/sources.py +++ b/sources.py @@ -323,6 +323,7 @@ class Source: Source(src="source/game/system/GhostFile.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/LocalizedArchive.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/MultiDvdArchive.cpp", cc='4201_127', opts=REL_OPTS), + Source(src="source/game/system/RaceConfig.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/ResourceManager.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/util/Random.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/kart/KartComponent.cpp", cc='4201_127', opts=REL_OPTS), From a5da108fa8c6f9358dc5468d9e431e986c9ef386 Mon Sep 17 00:00:00 2001 From: Aiden Date: Sat, 9 Jul 2022 05:11:21 -0400 Subject: [PATCH 02/37] RaceConfig: complete slice --- pack/symbols.txt | 10 +++---- source/game/system/RaceConfig.cpp | 46 ++++++++++++++++--------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index becaf89ff..45bb30bb6 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9316,16 +9316,16 @@ 0x8051c028 unk_8051c028 0x8051c02c unk_8051c02c 0x8051c030 unk_8051c030 -0x8051c088 RawGhostFile_reset +0x8051c088 reset__Q26System12RawGhostFileFv 0x8051c094 RawGhostFile_isHeaderValid -0x8051c120 RawGhostFile_isValid +0x8051c120 isValid__Q26System12RawGhostFileCFv 0x8051c23c unk_8051c23c -0x8051c270 GhostFile_construct +0x8051c270 __ct__Q26System9GhostFileFv 0x8051c334 Timer_destroy 0x8051c374 Timer_construct 0x8051c4a0 GhostFile_reset 0x8051c52c GhostFile_readHeader -0x8051c790 GhostFile_read +0x8051c790 read__Q26System9GhostFileFRCQ26System12RawGhostFile 0x8051c7f4 writeHeader__Q26System9GhostFileCFRQ26System12RawGhostFile 0x8051ca0c writeHeaderUncompressed__Q26System9GhostFileCFRQ26System12RawGhostFile 0x8051ca80 writeUncompressed__Q26System9GhostFileCFRQ26System12RawGhostFile @@ -10006,7 +10006,7 @@ 0x805417a4 unk_805417a4 0x80541878 ResourceManager_attachLayoutDir 0x80541998 ResourceManager_preloadCourseTask -0x805419ac ResourceManager_preloadCourseAsync +0x805419ac preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId 0x805419c8 getCharacterName__6SystemF11CharacterId 0x805419ec getKartName__6SystemF11CharacterId 0x80541a10 unk_80541a10 diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 5f3bf76db..24a0427fc 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -1,14 +1,15 @@ #include "RaceConfig.hpp" +extern "C" { // Extern function references. // PAL: 0x8051c088 -extern UNKNOWN_FUNCTION(RawGhostFile_reset); +extern UNKNOWN_FUNCTION(reset__Q26System12RawGhostFileFv); // PAL: 0x8051c120 -extern UNKNOWN_FUNCTION(RawGhostFile_isValid); +extern UNKNOWN_FUNCTION(isValid__Q26System12RawGhostFileCFv); // PAL: 0x8051c270 -extern UNKNOWN_FUNCTION(GhostFile_construct); +extern UNKNOWN_FUNCTION(__ct__Q26System9GhostFileFv); // PAL: 0x8051c790 -extern UNKNOWN_FUNCTION(GhostFile_read); +extern UNKNOWN_FUNCTION(read__Q26System9GhostFileFRCQ26System12RawGhostFile); // PAL: 0x80524500 extern UNKNOWN_FUNCTION(unk_80524500); // PAL: 0x8052453c @@ -26,11 +27,12 @@ extern UNKNOWN_FUNCTION(unk_8052d270); // PAL: 0x805368f8 extern UNKNOWN_FUNCTION(RaceinfoPlayer_updateGpRankScore); // PAL: 0x805419ac -extern UNKNOWN_FUNCTION(ResourceManager_preloadCourseAsync); +extern UNKNOWN_FUNCTION(preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId); // PAL: 0x805553b0 extern UNKNOWN_FUNCTION(unk_805553b0); // PAL: 0x8066c8d8 extern UNKNOWN_FUNCTION(unk_8066c8d8); +} // Symbol: RacedataPlayer_construct // PAL: 0x8052d96c..0x8052da10 @@ -1199,9 +1201,9 @@ asm UNKNOWN_FUNCTION(unk_8052e870) { mflr r0; stw r0, 0x54(r1); stfd f31, 0x40(r1); - psq_st f31, 72(r1), 0, qr0; + psq_st f31, 72(r1), 0, 0; stfd f30, 0x30(r1); - psq_st f30, 56(r1), 0, qr0; + psq_st f30, 56(r1), 0, 0; addi r11, r1, 0x30; bl unk_805553b0; lis r29, 0; @@ -1244,9 +1246,9 @@ asm UNKNOWN_FUNCTION(unk_8052e870) { fctiwz f0, f30; stfd f0, 8(r1); lwz r3, 0xc(r1); - psq_l f31, 72(r1), 0, qr0; + psq_l f31, 72(r1), 0, 0; lfd f31, 0x40(r1); - psq_l f30, 56(r1), 0, qr0; + psq_l f30, 56(r1), 0, 0; lfd f30, 0x30(r1); addi r11, r1, 0x30; bl unk_805553b0; @@ -1267,9 +1269,9 @@ asm UNKNOWN_FUNCTION(unk_8052e950) { mflr r0; stw r0, 0x94(r1); stfd f31, 0x80(r1); - psq_st f31, 136(r1), 0, qr0; + psq_st f31, 136(r1), 0, 0; stfd f30, 0x70(r1); - psq_st f30, 120(r1), 0, qr0; + psq_st f30, 120(r1), 0, 0; addi r11, r1, 0x70; bl unk_805553b0; lwz r0, 0xb54(r3); @@ -1524,9 +1526,9 @@ asm UNKNOWN_FUNCTION(unk_8052e950) { cmplw r3, r0; blt lbl_8052ecb0; lbl_8052ecf0: - psq_l f31, 136(r1), 0, qr0; + psq_l f31, 136(r1), 0, 0; lfd f31, 0x80(r1); - psq_l f30, 120(r1), 0, qr0; + psq_l f30, 120(r1), 0, 0; addi r11, r1, 0x70; lfd f30, 0x70(r1); bl unk_805553b0; @@ -1712,14 +1714,14 @@ asm UNKNOWN_FUNCTION(unk_8052eef0) { stw r28, 0xe0(r1); mr r28, r3; lwz r3, 0xbec(r3); - bl RawGhostFile_isValid; + bl isValid__Q26System12RawGhostFileCFv; cmpwi r3, 0; beq lbl_8052efb0; addi r3, r1, 8; - bl GhostFile_construct; + bl __ct__Q26System9GhostFileFv; lwz r4, 0xbec(r28); addi r3, r1, 8; - bl GhostFile_read; + bl read__Q26System9GhostFileFRCQ26System12RawGhostFile; lwz r3, 0xc0(r1); lwz r0, 0xb48(r28); cmpw r3, r0; @@ -2202,14 +2204,14 @@ asm UNKNOWN_FUNCTION(RacedataScenario_initControllers) { lbl_8052f5c0: lwz r3, 0xbec(r24); li r21, 0; - bl RawGhostFile_isValid; + bl isValid__Q26System12RawGhostFileCFv; cmpwi r3, 0; beq lbl_8052f648; addi r3, r1, 8; - bl GhostFile_construct; + bl __ct__Q26System9GhostFileFv; lwz r4, 0xbec(r24); addi r3, r1, 8; - bl GhostFile_read; + bl read__Q26System9GhostFileFRCQ26System12RawGhostFile; lwz r3, 0xc0(r1); lwz r0, 0xb48(r24); cmpw r3, r0; @@ -2931,7 +2933,7 @@ asm UNKNOWN_FUNCTION(Racedata_initStaticInstance) { addi r31, r26, 0x73f0; lbl_8052ffb0: mr r3, r27; - bl RawGhostFile_reset; + bl reset__Q26System12RawGhostFileFv; addi r27, r27, 0x2800; cmplw r27, r31; blt lbl_8052ffb0; @@ -3162,7 +3164,7 @@ asm UNKNOWN_FUNCTION(Racedata_construct) { addi r31, r26, 0x73f0; lbl_80530298: mr r3, r27; - bl RawGhostFile_reset; + bl reset__Q26System12RawGhostFileFv; addi r27, r27, 0x2800; cmplw r27, r31; blt lbl_80530298; @@ -5222,7 +5224,7 @@ asm UNKNOWN_FUNCTION(unk_80531f80) { lwz r3, 0(r7); add r0, r5, r6; lwzx r4, r4, r0; - b ResourceManager_preloadCourseAsync; + b preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId; blr; // clang-format on } From cb719822e5ddb4eaf814fe98fcab422958c70938 Mon Sep 17 00:00:00 2001 From: Aiden Date: Sat, 9 Jul 2022 11:32:22 -0400 Subject: [PATCH 03/37] [FAIL] RaceConfig: initial class definitions --- source/game/system/RaceConfig.cpp | 4 +- source/game/system/RaceConfig.hpp | 105 ++++++++++++++++++++++++------ 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 24a0427fc..0f0b4c95d 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -27,7 +27,8 @@ extern UNKNOWN_FUNCTION(unk_8052d270); // PAL: 0x805368f8 extern UNKNOWN_FUNCTION(RaceinfoPlayer_updateGpRankScore); // PAL: 0x805419ac -extern UNKNOWN_FUNCTION(preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId); +extern UNKNOWN_FUNCTION( + preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId); // PAL: 0x805553b0 extern UNKNOWN_FUNCTION(unk_805553b0); // PAL: 0x8066c8d8 @@ -5333,4 +5334,3 @@ asm UNKNOWN_FUNCTION(unk_8053207c) { blr; // clang-format on } - diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 4f1d54a43..ee2c7775e 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -1,5 +1,9 @@ #pragma once +#include +#include +#include + #include #include @@ -133,27 +137,90 @@ UNKNOWN_FUNCTION(unk_8053207c); } #endif -struct RaceConfigPlayer { - u8 _00[0x08 - 0x00]; - u32 vehicleId; - u32 characterId; - u32 type; - u8 _14[0xd0 - 0x14]; - s32 controllerId; - u8 _d4[0xf0 - 0xd4]; +// NOTE: anything marked u8, u16, or u32 could be signed +namespace System { + +class RaceConfigPlayer { +public: + RaceConfigPlayer(); + virtual ~RaceConfigPlayer(); + +private: + unk8 _04; + u8 mLocalPlayerNum; + u8 mPlayerInputIdx; + VehicleId mVehicleId; + CharacterId mCharacterId; + s32 mPlayerType; // TODO: create enum + unk8 _mMii[0xcc - 0x14]; // TODO: this is a class that isn't decompiled yet + // (Mii.hpp is 0x4c, this is 0xb8) + BattleTeam mTeam; + u32 mControllerId; + unk32 _d4; + u16 mPreviousScore; + u16 mGpScore; + unk16 _dc; + u16 mGpRankScore; + unk8 _e0; + u8 mPrevFinishPos; + u8 mFinishPos; + unk8 mRating[0xec - 0xe4]; + unk32 _ec; }; -struct RaceConfigScenario { - u8 _000[0x004 - 0x000]; - u8 playerCount; - u8 _005[0x008 - 0x005]; - RaceConfigPlayer players[12]; - // ... +struct RaceConfigSettings { + CourseId mCourseId; + u32 mEngineClass; // probably an enum + s32 mGameMode; // TODO: create enum + s32 mGameType; // TODO: create enum + u32 mBattleType; + u32 mCpuMode; + u32 mItemMode; + u8 mHudPlayerIds[4]; + s32 mCupId; // TODO: create enum + u8 mRaceNumber; + u8 mLapCount; + s32 mModeFlags; // TODO: create enum + u32 mSeed1; + u32 mSeed2; }; -struct RaceConfig { - static RaceConfig* spInstance; - u8 _0000[0x0020 - 0x0000]; - RaceConfigScenario raceScenario; - // ... +class RaceConfigScenario { +public: + RaceConfigScenario(); + virtual ~RaceConfigScenario(); +private: + u8 mPlayerCount; + u8 mHudCount; + u8 mLocalPlayerCount; + u8 mHudCount2; // ? + RaceConfigPlayer mPlayers[12]; + RaceConfigSettings mSettings; + unk8 _b7c[0xbec - 0xb7c]; + RawGhostFile mGhost; }; + +// These will be important later +class RaceScenario : RaceConfigScenario {}; +class MenuScenario : RaceConfigScenario {}; +class AwardsScenario : RaceConfigScenario {}; + +class RaceConfigMain { +public: + RaceConfigMain(); +private: + // Things get tricky here - we have a vtable with no virtual functions + void* vtable; + RaceScenario mRaceScenario; + MenuScenario mMenuScenario; + AwardsScenario mAwardsScenario; + RawGhostFile mGhosts[2]; +}; + +class RaceConfig : ParameterFile, RaceConfigMain { +public: + RaceConfig(); + virtual ~RaceConfig(); +}; + +} // namespace System From bef95bd29d31dfe49fb521a8ee88dfdf02197f44 Mon Sep 17 00:00:00 2001 From: Aiden Date: Sat, 9 Jul 2022 12:08:51 -0400 Subject: [PATCH 04/37] RaceConfig: fix class definitions When in doubt, make everything public. TODO: this is bad --- source/game/system/RaceConfig.hpp | 17 +++++++++-------- source/game/system/ResourceManager.cpp | 5 +++-- source/game/system/ResourceManager.hpp | 1 - 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index ee2c7775e..952e8d70c 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -144,8 +144,7 @@ class RaceConfigPlayer { public: RaceConfigPlayer(); virtual ~RaceConfigPlayer(); - -private: +// private: unk8 _04; u8 mLocalPlayerNum; u8 mPlayerInputIdx; @@ -189,7 +188,7 @@ class RaceConfigScenario { public: RaceConfigScenario(); virtual ~RaceConfigScenario(); -private: +// private: u8 mPlayerCount; u8 mHudCount; u8 mLocalPlayerCount; @@ -201,14 +200,14 @@ class RaceConfigScenario { }; // These will be important later -class RaceScenario : RaceConfigScenario {}; -class MenuScenario : RaceConfigScenario {}; -class AwardsScenario : RaceConfigScenario {}; +class RaceScenario : public RaceConfigScenario {}; +class MenuScenario : public RaceConfigScenario {}; +class AwardsScenario : public RaceConfigScenario {}; class RaceConfigMain { public: RaceConfigMain(); -private: + // Things get tricky here - we have a vtable with no virtual functions void* vtable; RaceScenario mRaceScenario; @@ -217,10 +216,12 @@ class RaceConfigMain { RawGhostFile mGhosts[2]; }; -class RaceConfig : ParameterFile, RaceConfigMain { +class RaceConfig : ParameterFile, public RaceConfigMain { public: RaceConfig(); virtual ~RaceConfig(); + + static RaceConfig* spInstance; }; } // namespace System diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index 9b337c1c2..d7d96e31b 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -702,8 +703,8 @@ void* ResourceManager::getBspFile(s32 playerIdx, size_t* size) { char buffer[32]; const char* vehicle = getVehicleName( - (VehicleId)RaceConfig::spInstance->raceScenario.players[playerIdx] - .vehicleId); + (VehicleId)RaceConfig::spInstance->mRaceScenario.mPlayers[playerIdx] + .mVehicleId); snprintf(buffer, sizeof(buffer), "/bsp/%s.bsp", vehicle); return (isSceneArchiveLoaded(0)) ? mppSceneArchives[0]->getFile(buffer, size) diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index 01d28e7d2..a514ca321 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #ifdef __cplusplus From 41d31eea94a6a0078dffc83e5461cc79a3f1d99b Mon Sep 17 00:00:00 2001 From: vabold Date: Mon, 11 Jul 2022 06:25:53 -0400 Subject: [PATCH 05/37] RaceConfigPlayer: ctor And it only took 10 changed files! --- pack/rel_objects.txt | 7 ++- pack/rel_slices.csv | 1 + pack/symbols.txt | 2 +- source/game/system/GhostFile.hpp | 4 +- source/game/system/Mii.cpp | 17 ++++++++ source/game/system/Mii.hpp | 28 +++++++++++- source/game/system/RaceConfig.cpp | 68 ++++++++---------------------- source/game/system/RaceConfig.hpp | 23 +++++----- source/game/system/SaveManager.hpp | 17 ++++++++ sources.py | 1 + 10 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 source/game/system/Mii.cpp create mode 100644 source/game/system/SaveManager.hpp diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index 213799b7c..b74273b59 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -9,10 +9,13 @@ out/rel/text_805127ec_80518cc0.o out/rel/data_808b2c3c_808b2c78.o out/DvdArchive.o out/rel/text_80519670_8051c088.o -out/rel/rodata_8088fab7_8088fdc0.o +out/rel/rodata_8088fab7_8088fd60.o out/rel/data_808b2c88_808b2d38.o out/GhostFile.o -out/rel/text_8051d4d4_8052a098.o +out/rel/text_8051d4d4_80525f88.o +out/Mii.o +out/rel/text_80525ff4_8052a098.o +out/rel/rodata_8088fd64_8088fdc0.o out/rel/data_808b2d50_808b3188.o out/LocalizedArchive.o out/MultiDvdArchive.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index b0e15d021..d9802b311 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -2,6 +2,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/jmap/CourseMap.cpp,0x80512694,0x805127ec,,,,,,,0x808B2C30,0x808B2C3C,0x809BD6E8,0x809BD6EC 1,source/game/system/DvdArchive.cpp,0x80518CC0,0x80519670,,,,,0x8088FAA0,0x8088FAB7,0x808B2C78,0x808B2C88,, 1,source/game/system/GhostFile.cpp,0x8051c088,0x8051d4d4,,,,,,,0x808b2d38,0x808b2d50,, +1,source/game/system/Mii.cpp,0x80525f88,0x80525ff4,,,,,0x8088fd60,0x8088fd64,,,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, 1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,,,,,, diff --git a/pack/symbols.txt b/pack/symbols.txt index 45bb30bb6..d9ea5b320 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9562,7 +9562,7 @@ 0x80525db8 unk_80525db8 0x80525e00 unk_80525e00 0x80525e60 unk_80525e60 -0x80525f88 SomethingMiis_construct +0x80525f88 init__Q26System3MiiFl 0x80525ff4 unk_80525ff4 0x80526020 unk_80526020 0x805263bc unk_805263bc diff --git a/source/game/system/GhostFile.hpp b/source/game/system/GhostFile.hpp index 5c397f1ef..ffafa2270 100644 --- a/source/game/system/GhostFile.hpp +++ b/source/game/system/GhostFile.hpp @@ -162,7 +162,7 @@ struct RawGhostFile { wchar_t userData[10]; u32 location; u32 _38; - Mii mii; + RawMii mii; u32 compressedInputsSize; }; @@ -201,7 +201,7 @@ class GhostFile { bool mHeaderIsValid; wchar_t mUserData[11]; - Mii mMii; + RawMii mMii; u8 mLapCount; Time mLapTimes[5]; Time mRaceTime; diff --git a/source/game/system/Mii.cpp b/source/game/system/Mii.cpp new file mode 100644 index 000000000..23b430dc9 --- /dev/null +++ b/source/game/system/Mii.cpp @@ -0,0 +1,17 @@ +#include "Mii.hpp" + +namespace System { + +void Mii::init(s32 num) { + this->_4 = num; + this->_8 = 0; + this->_9 = -1; + this->_A4 = 0; + this->_60 = (unkStruct) {0xB8, 0x40, 0x30, 0xFF}; + this->_64 = 0; + this->_C = 6; + this->_A5 = 0; + this->_A6 = 0; +} + +} // namespace System diff --git a/source/game/system/Mii.hpp b/source/game/system/Mii.hpp index ea2c5b7bd..1e18b25c2 100644 --- a/source/game/system/Mii.hpp +++ b/source/game/system/Mii.hpp @@ -6,7 +6,7 @@ namespace System { -class Mii { +class RawMii { public: void reset() { memset(mBuffer, 0, sizeof(mBuffer)); } @@ -14,4 +14,30 @@ class Mii { u8 mBuffer[0x4c]; }; +struct unkStruct { + u8 x0; + u8 x1; + u8 x2; + u8 x3; +}; + +class Mii { +public: + Mii(s32 num) { init(num); } + virtual ~Mii(); + void init(s32); + s32 _4; + u8 _8; + s8 _9; + s32 _C; + unk8 _10[0x60 - 0x10]; + unkStruct _60; + s32 _64; + u8 _68[0xa4 - 0x68]; + u8 _A4; + u8 _A5; + u8 _A6; + unk8 _[0xb8 - 0xA7]; +}; + } // namespace System diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 0f0b4c95d..cf21e9eff 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -17,7 +17,7 @@ extern UNKNOWN_FUNCTION(InputMgr_setGhostController); // PAL: 0x80524558 extern UNKNOWN_FUNCTION(unk_80524558); // PAL: 0x80525f88 -extern UNKNOWN_FUNCTION(SomethingMiis_construct); +extern UNKNOWN_FUNCTION(init__Q26System3MiiFl); // PAL: 0x8052d118 extern UNKNOWN_FUNCTION(unk_8052d118); // PAL: 0x8052d1c0 @@ -35,55 +35,23 @@ extern UNKNOWN_FUNCTION(unk_805553b0); extern UNKNOWN_FUNCTION(unk_8066c8d8); } -// Symbol: RacedataPlayer_construct -// PAL: 0x8052d96c..0x8052da10 -MARK_BINARY_BLOB(RacedataPlayer_construct, 0x8052d96c, 0x8052da10); -asm UNKNOWN_FUNCTION(RacedataPlayer_construct) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - mflr r0; - lis r4, 0; - lis r5, 0; - stw r0, 0x14(r1); - li r6, 0; - addi r4, r4, 0; - addi r5, r5, 0; - stw r31, 0xc(r1); - li r31, -1; - li r0, 1; - stw r30, 8(r1); - mr r30, r3; - stw r4, 0(r3); - li r4, 7; - stb r6, 4(r3); - stb r31, 5(r3); - stb r31, 6(r3); - stw r0, 8(r3); - stw r6, 0xc(r3); - stw r6, 0x10(r3); - stwu r5, 0x14(r3); - bl SomethingMiis_construct; - lbz r0, 0xec(r30); - lis r5, 0; - addi r5, r5, 0; - li r6, 8; - rlwinm r0, r0, 0, 0x19, 0x17; - li r4, 0x1388; - stw r31, 0xd0(r30); - mr r3, r30; - stw r6, 0xd4(r30); - stw r5, 0xe4(r30); - sth r4, 0xe8(r30); - stb r0, 0xec(r30); - lwz r31, 0xc(r1); - lwz r30, 8(r1); - lwz r0, 0x14(r1); - mtlr r0; - addi r1, r1, 0x10; - blr; - // clang-format on -} +namespace System { + +RaceConfigPlayer::RaceConfigPlayer() : + _04(0), + mLocalPlayerNum(-1), + mPlayerInputIdx(-1), + mVehicleId(STANDARD_KART_M), + mCharacterId(MARIO), + mPlayerType(0), + mMii(7), + mControllerId(-1), + _d4(8), + mRating(), + _ec(_ec & ~0x80) +{} + +} // namespace System // Symbol: unk_8052da10 // PAL: 0x8052da10..0x8052da50 diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 952e8d70c..7d501e558 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -2,7 +2,9 @@ #include #include +#include #include +#include #include @@ -144,15 +146,14 @@ class RaceConfigPlayer { public: RaceConfigPlayer(); virtual ~RaceConfigPlayer(); -// private: + // private: unk8 _04; - u8 mLocalPlayerNum; - u8 mPlayerInputIdx; + s8 mLocalPlayerNum; + s8 mPlayerInputIdx; VehicleId mVehicleId; CharacterId mCharacterId; - s32 mPlayerType; // TODO: create enum - unk8 _mMii[0xcc - 0x14]; // TODO: this is a class that isn't decompiled yet - // (Mii.hpp is 0x4c, this is 0xb8) + s32 mPlayerType; // TODO: create enum + Mii mMii; BattleTeam mTeam; u32 mControllerId; unk32 _d4; @@ -163,15 +164,15 @@ class RaceConfigPlayer { unk8 _e0; u8 mPrevFinishPos; u8 mFinishPos; - unk8 mRating[0xec - 0xe4]; - unk32 _ec; + Rating mRating; + s8 _ec; }; struct RaceConfigSettings { CourseId mCourseId; u32 mEngineClass; // probably an enum - s32 mGameMode; // TODO: create enum - s32 mGameType; // TODO: create enum + s32 mGameMode; // TODO: create enum + s32 mGameType; // TODO: create enum u32 mBattleType; u32 mCpuMode; u32 mItemMode; @@ -188,7 +189,7 @@ class RaceConfigScenario { public: RaceConfigScenario(); virtual ~RaceConfigScenario(); -// private: + // private: u8 mPlayerCount; u8 mHudCount; u8 mLocalPlayerCount; diff --git a/source/game/system/SaveManager.hpp b/source/game/system/SaveManager.hpp new file mode 100644 index 000000000..384b81fdd --- /dev/null +++ b/source/game/system/SaveManager.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace System { + +class Rating { +public: + Rating() { + mPoints = 5000; + } + virtual ~Rating(); + + u16 mPoints; +}; + +} // namespace System \ No newline at end of file diff --git a/sources.py b/sources.py index a98ccc355..d4b0a4cb5 100644 --- a/sources.py +++ b/sources.py @@ -321,6 +321,7 @@ class Source: Source(src="source/game/jmap/CourseMap.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/DvdArchive.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/GhostFile.cpp", cc='4201_127', opts=REL_OPTS), + Source(src="source/game/system/Mii.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/LocalizedArchive.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/MultiDvdArchive.cpp", cc='4201_127', opts=REL_OPTS), Source(src="source/game/system/RaceConfig.cpp", cc='4201_127', opts=REL_OPTS), From 01e851625a351500f1b1e187c327e42099b3ef8b Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 12 Jul 2022 04:49:26 -0400 Subject: [PATCH 06/37] RaceConfigPlayer: computeGpRank --- pack/rel_objects.txt | 3 ++- pack/rel_slices.csv | 2 +- source/game/system/RaceConfig.cpp | 26 +++++++++++++++++++++++++- source/game/system/RaceConfig.hpp | 8 +++++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index b74273b59..0d059f162 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -20,9 +20,10 @@ out/rel/data_808b2d50_808b3188.o out/LocalizedArchive.o out/MultiDvdArchive.o out/rel/text_8052ae5c_8052d96c.o +out/rel/rodata_8088fe28_808900c0.o out/RaceConfig.o out/rel/text_80532084_8053fc4c.o -out/rel/rodata_8088fe28_80890490.o +out/rel/rodata_808900e0_80890490.o out/rel/data_808b31e8_808b3960.o out/ResourceManager.o out/rel/text_80542878_80555464.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index d9802b311..b0731e6db 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -5,7 +5,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/system/Mii.cpp,0x80525f88,0x80525ff4,,,,,0x8088fd60,0x8088fd64,,,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, -1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,,,,,, +1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x808900c0,0x808900e0,,,, 1,source/game/system/ResourceManager.cpp,0x8053FC4C,0x80542878,,,,,0x80890490,0x80890d0c,0x808b3960,0x808b3c2c,, 1,source/game/util/Random.cpp,0x80555464,0x8055572c,,,,,0x80891370,0x80891380,0x808b42e0,0x808b42ec,, 1,source/game/kart/KartComponent.cpp,0x80590128,0x805901d0,,,,,,,,,0x809c1900,0x809c1910 diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index cf21e9eff..9ef360240 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -55,6 +55,7 @@ RaceConfigPlayer::RaceConfigPlayer() : // Symbol: unk_8052da10 // PAL: 0x8052da10..0x8052da50 +// Notes: Rating's dtor, not sure what it's doing here MARK_BINARY_BLOB(unk_8052da10, 0x8052da10, 0x8052da50); asm UNKNOWN_FUNCTION(unk_8052da10) { // clang-format off @@ -128,6 +129,29 @@ asm UNKNOWN_FUNCTION(unk_8052da50) { // clang-format on } +// #ifdef NON_MATCHING +namespace System { + +s32 RaceConfigPlayer::computeGpRank() const { + s8 weightedRankScore = 5; + for (u8 i = 0; i < sizeof(RANK_SCORES) / 4; i++) { + if (mGpRankScore >= RANK_SCORES[i]) { weightedRankScore = i; break; } + } + + s8 weightedScore = 4; + for (u8 i = 0; i < sizeof(SCORES) / 2; i++) { + if (mGpScore >= SCORES[i]) { weightedScore = i; break; } + } + + if (weightedRankScore + weightedScore >= 8) { + return 7; + } + + return weightedRankScore + weightedScore; +} + +} // namespace System +/* #else // Symbol: RacedataPlayer_computeGpRank // PAL: 0x8052daf0..0x8052dbc8 MARK_BINARY_BLOB(RacedataPlayer_computeGpRank, 0x8052daf0, 0x8052dbc8); @@ -198,7 +222,7 @@ asm UNKNOWN_FUNCTION(RacedataPlayer_computeGpRank) { li r3, 7; blr; // clang-format on -} +}*/ // Symbol: RacedataScenario_construct // PAL: 0x8052dbc8..0x8052dc68 diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 7d501e558..686f47c07 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -1,5 +1,7 @@ #pragma once +#pragma legacy_struct_alignment off + #include #include #include @@ -139,6 +141,9 @@ UNKNOWN_FUNCTION(unk_8053207c); } #endif +const s32 RANK_SCORES[] = {1000, 700, 400, 200, 0}; +const u16 SCORES[] = {60, 52, 40, 20}; + // NOTE: anything marked u8, u16, or u32 could be signed namespace System { @@ -146,6 +151,7 @@ class RaceConfigPlayer { public: RaceConfigPlayer(); virtual ~RaceConfigPlayer(); + s32 computeGpRank() const; // private: unk8 _04; s8 mLocalPlayerNum; @@ -160,7 +166,7 @@ class RaceConfigPlayer { u16 mPreviousScore; u16 mGpScore; unk16 _dc; - u16 mGpRankScore; + s16 mGpRankScore; unk8 _e0; u8 mPrevFinishPos; u8 mFinishPos; From 951ba2002f7b258ec8bf43f1849fc78a4df02d2e Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 12 Jul 2022 05:15:01 -0400 Subject: [PATCH 07/37] Rating: dtor Includes minor cleanup, since I've forgotten to run pre-commit before committing. --- pack/rel_objects.txt | 3 +- pack/rel_slices.csv | 2 +- source/game/system/Mii.cpp | 2 +- source/game/system/RaceConfig.cpp | 143 ++++------------------------- source/game/system/SaveManager.hpp | 8 +- 5 files changed, 27 insertions(+), 131 deletions(-) diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index 0d059f162..b5dc73ea8 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -21,10 +21,11 @@ out/LocalizedArchive.o out/MultiDvdArchive.o out/rel/text_8052ae5c_8052d96c.o out/rel/rodata_8088fe28_808900c0.o +out/rel/data_808b31e8_808b32a0.o out/RaceConfig.o out/rel/text_80532084_8053fc4c.o out/rel/rodata_808900e0_80890490.o -out/rel/data_808b31e8_808b3960.o +out/rel/data_808b32ac_808b3960.o out/ResourceManager.o out/rel/text_80542878_80555464.o out/rel/rodata_80890d0c_80891370.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index b0731e6db..7c35b1789 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -5,7 +5,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/system/Mii.cpp,0x80525f88,0x80525ff4,,,,,0x8088fd60,0x8088fd64,,,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, -1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x808900c0,0x808900e0,,,, +1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x808900c0,0x808900e0,0x808b32a0,0x808b32ac,, 1,source/game/system/ResourceManager.cpp,0x8053FC4C,0x80542878,,,,,0x80890490,0x80890d0c,0x808b3960,0x808b3c2c,, 1,source/game/util/Random.cpp,0x80555464,0x8055572c,,,,,0x80891370,0x80891380,0x808b42e0,0x808b42ec,, 1,source/game/kart/KartComponent.cpp,0x80590128,0x805901d0,,,,,,,,,0x809c1900,0x809c1910 diff --git a/source/game/system/Mii.cpp b/source/game/system/Mii.cpp index 23b430dc9..6e2fd42bb 100644 --- a/source/game/system/Mii.cpp +++ b/source/game/system/Mii.cpp @@ -7,7 +7,7 @@ void Mii::init(s32 num) { this->_8 = 0; this->_9 = -1; this->_A4 = 0; - this->_60 = (unkStruct) {0xB8, 0x40, 0x30, 0xFF}; + this->_60 = (unkStruct){0xB8, 0x40, 0x30, 0xFF}; this->_64 = 0; this->_C = 6; this->_A5 = 0; diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 9ef360240..5effe84a2 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -37,49 +37,13 @@ extern UNKNOWN_FUNCTION(unk_8066c8d8); namespace System { -RaceConfigPlayer::RaceConfigPlayer() : - _04(0), - mLocalPlayerNum(-1), - mPlayerInputIdx(-1), - mVehicleId(STANDARD_KART_M), - mCharacterId(MARIO), - mPlayerType(0), - mMii(7), - mControllerId(-1), - _d4(8), - mRating(), - _ec(_ec & ~0x80) -{} +RaceConfigPlayer::RaceConfigPlayer() + : _04(0), mLocalPlayerNum(-1), mPlayerInputIdx(-1), + mVehicleId(STANDARD_KART_M), mCharacterId(MARIO), mPlayerType(0), mMii(7), + mControllerId(-1), _d4(8), mRating(), _ec(_ec & ~0x80) {} } // namespace System -// Symbol: unk_8052da10 -// PAL: 0x8052da10..0x8052da50 -// Notes: Rating's dtor, not sure what it's doing here -MARK_BINARY_BLOB(unk_8052da10, 0x8052da10, 0x8052da50); -asm UNKNOWN_FUNCTION(unk_8052da10) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - mflr r0; - cmpwi r3, 0; - stw r0, 0x14(r1); - stw r31, 0xc(r1); - mr r31, r3; - beq lbl_8052da38; - cmpwi r4, 0; - ble lbl_8052da38; - bl unk_805553b0; -lbl_8052da38: - mr r3, r31; - lwz r31, 0xc(r1); - lwz r0, 0x14(r1); - mtlr r0; - addi r1, r1, 0x10; - blr; - // clang-format on -} - // Symbol: unk_8052da50 // PAL: 0x8052da50..0x8052daf0 MARK_BINARY_BLOB(unk_8052da50, 0x8052da50, 0x8052daf0); @@ -129,100 +93,33 @@ asm UNKNOWN_FUNCTION(unk_8052da50) { // clang-format on } -// #ifdef NON_MATCHING namespace System { s32 RaceConfigPlayer::computeGpRank() const { - s8 weightedRankScore = 5; - for (u8 i = 0; i < sizeof(RANK_SCORES) / 4; i++) { - if (mGpRankScore >= RANK_SCORES[i]) { weightedRankScore = i; break; } + s8 weightedRankScore = 5; + for (u8 i = 0; i < sizeof(RANK_SCORES) / 4; i++) { + if (mGpRankScore >= RANK_SCORES[i]) { + weightedRankScore = i; + break; } + } - s8 weightedScore = 4; - for (u8 i = 0; i < sizeof(SCORES) / 2; i++) { - if (mGpScore >= SCORES[i]) { weightedScore = i; break; } + s8 weightedScore = 4; + for (u8 i = 0; i < sizeof(SCORES) / 2; i++) { + if (mGpScore >= SCORES[i]) { + weightedScore = i; + break; } + } - if (weightedRankScore + weightedScore >= 8) { - return 7; - } + if (weightedRankScore + weightedScore >= 8) { + return 7; + } - return weightedRankScore + weightedScore; + return weightedRankScore + weightedScore; } } // namespace System -/* #else -// Symbol: RacedataPlayer_computeGpRank -// PAL: 0x8052daf0..0x8052dbc8 -MARK_BINARY_BLOB(RacedataPlayer_computeGpRank, 0x8052daf0, 0x8052dbc8); -asm UNKNOWN_FUNCTION(RacedataPlayer_computeGpRank) { - // clang-format off - nofralloc; - lis r4, 0; - lha r5, 0xde(r3); - lwzu r0, 0(r4); - li r6, 5; - cmpw r5, r0; - blt lbl_8052db10; - li r6, 0; - b lbl_8052db5c; -lbl_8052db10: - lwz r0, 4(r4); - cmpw r5, r0; - blt lbl_8052db24; - li r6, 1; - b lbl_8052db5c; -lbl_8052db24: - lwz r0, 8(r4); - cmpw r5, r0; - blt lbl_8052db38; - li r6, 2; - b lbl_8052db5c; -lbl_8052db38: - lwz r0, 0xc(r4); - cmpw r5, r0; - blt lbl_8052db4c; - li r6, 3; - b lbl_8052db5c; -lbl_8052db4c: - lwz r0, 0x10(r4); - cmpw r5, r0; - blt lbl_8052db5c; - li r6, 4; -lbl_8052db5c: - lis r4, 0; - lhz r3, 0xda(r3); - lhzu r0, 0(r4); - li r5, 4; - cmplw r3, r0; - blt lbl_8052db7c; - li r5, 0; - b lbl_8052dbb4; -lbl_8052db7c: - lhz r0, 2(r4); - cmplw r3, r0; - blt lbl_8052db90; - li r5, 1; - b lbl_8052dbb4; -lbl_8052db90: - lhz r0, 4(r4); - cmplw r3, r0; - blt lbl_8052dba4; - li r5, 2; - b lbl_8052dbb4; -lbl_8052dba4: - lhz r0, 6(r4); - cmplw r3, r0; - blt lbl_8052dbb4; - li r5, 3; -lbl_8052dbb4: - add r3, r6, r5; - cmpwi r3, 8; - bltlr; - li r3, 7; - blr; - // clang-format on -}*/ // Symbol: RacedataScenario_construct // PAL: 0x8052dbc8..0x8052dc68 diff --git a/source/game/system/SaveManager.hpp b/source/game/system/SaveManager.hpp index 384b81fdd..9d699c1cc 100644 --- a/source/game/system/SaveManager.hpp +++ b/source/game/system/SaveManager.hpp @@ -6,12 +6,10 @@ namespace System { class Rating { public: - Rating() { - mPoints = 5000; - } - virtual ~Rating(); + Rating() { mPoints = 5000; } + virtual ~Rating() {} u16 mPoints; }; -} // namespace System \ No newline at end of file +} // namespace System From 83f61a3ef7e6eb2978af9f1089f48a33ff178d41 Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 12 Jul 2022 06:11:39 -0400 Subject: [PATCH 08/37] RaceConfigScenario: ctor --- source/game/system/RaceConfig.cpp | 60 +++++++------------------------ source/game/system/RaceConfig.hpp | 4 +-- 2 files changed, 14 insertions(+), 50 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 5effe84a2..936890b7e 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -119,57 +119,21 @@ s32 RaceConfigPlayer::computeGpRank() const { return weightedRankScore + weightedScore; } -} // namespace System +RaceConfigScenario::RaceConfigScenario(RawGhostFile* ghost) + : mPlayerCount(0), mHudCount(0), mPlayers() { + mSettings.mCourseId = GCN_MARIO_CIRCUIT; + mSettings.mGameMode = 0; + mSettings.mGameType = 0; + mSettings.mCupId = 0; -// Symbol: RacedataScenario_construct -// PAL: 0x8052dbc8..0x8052dc68 -MARK_BINARY_BLOB(RacedataScenario_construct, 0x8052dbc8, 0x8052dc68); -asm UNKNOWN_FUNCTION(RacedataScenario_construct) { - // clang-format off - nofralloc; - stwu r1, -0x20(r1); - mflr r0; - lis r6, 0; - lis r5, 0; - stw r0, 0x24(r1); - addi r6, r6, 0; - addi r5, r5, 0; - li r7, 0xc; - stw r31, 0x1c(r1); - li r31, 0; - stw r30, 0x18(r1); - mr r30, r4; - stw r29, 0x14(r1); - mr r29, r3; - stw r6, 0(r3); - lis r6, 0; - addi r4, r6, 0; - stb r31, 4(r3); - li r6, 0xf0; - stb r31, 5(r3); - addi r3, r3, 8; - bl unk_805553b0; - li r0, 0x11; - stw r0, 0xb48(r29); - addi r3, r29, 0xb7c; - li r4, 0; - stw r31, 0xb50(r29); - li r5, 0x70; - stw r31, 0xb54(r29); - stw r31, 0xb68(r29); - bl unk_805553b0; - stw r30, 0xbec(r29); - mr r3, r29; - lwz r31, 0x1c(r1); - lwz r30, 0x18(r1); - lwz r29, 0x14(r1); - lwz r0, 0x24(r1); - mtlr r0; - addi r1, r1, 0x20; - blr; - // clang-format on + // seems dubious + memset(&this->_b7c, 0, 0x70); + + mGhost = ghost; } +} // namespace System + // Symbol: RacedataPlayer_destroy // PAL: 0x8052dc68..0x8052dca8 MARK_BINARY_BLOB(RacedataPlayer_destroy, 0x8052dc68, 0x8052dca8); diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 686f47c07..f4e4fe0ca 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -193,7 +193,7 @@ struct RaceConfigSettings { class RaceConfigScenario { public: - RaceConfigScenario(); + RaceConfigScenario(RawGhostFile* ghost); virtual ~RaceConfigScenario(); // private: u8 mPlayerCount; @@ -203,7 +203,7 @@ class RaceConfigScenario { RaceConfigPlayer mPlayers[12]; RaceConfigSettings mSettings; unk8 _b7c[0xbec - 0xb7c]; - RawGhostFile mGhost; + RawGhostFile* mGhost; }; // These will be important later From cfef62a96a2a80215e1f64ab33e01caa8349baac Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 12 Jul 2022 08:54:58 -0400 Subject: [PATCH 09/37] [WIP] RaceConfig: appendParamFile Non-matching due to ParamFile_append not existing yet. --- pack/symbols.txt | 2 +- source/game/system/InitScene.hpp | 13 +++++++++++++ source/game/system/RaceConfig.cpp | 23 +++++++++++++++++++++++ source/game/system/RaceConfig.hpp | 4 ++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 source/game/system/InitScene.hpp diff --git a/pack/symbols.txt b/pack/symbols.txt index d9ea5b320..f1e3c74a4 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -104,7 +104,7 @@ 0x80009c24 unk_80009c24 0x80009c8c unk_80009c8c 0x80009ce0 unk_80009ce0 -0x80009d6c unk_80009d6c +0x80009d6c ParamFile_append 0x80009ddc unk_80009ddc 0x80009ef8 RamStream_destroy 0x80009f5c ModuleSlots_destroy diff --git a/source/game/system/InitScene.hpp b/source/game/system/InitScene.hpp new file mode 100644 index 000000000..f15356f5c --- /dev/null +++ b/source/game/system/InitScene.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace System { + +// Incorrect name, but is a placeholder for RaceConfigPlayer::appendParamFile +class InitScene : public RKScene { +public: + static InitScene* spInstance; +}; + +} // namespace System diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 936890b7e..bb4b76ec9 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -2,6 +2,8 @@ extern "C" { // Extern function references. +// PAL: 0x80009d6c +extern UNKNOWN_FUNCTION(ParamFile_append); // PAL: 0x8051c088 extern UNKNOWN_FUNCTION(reset__Q26System12RawGhostFileFv); // PAL: 0x8051c120 @@ -44,6 +46,26 @@ RaceConfigPlayer::RaceConfigPlayer() } // namespace System +#ifdef NON_MATCHING +namespace System { + +void RaceConfigPlayer::appendParamFile(RaceConfig* raceConfig) { + ParamFile_append(raceConfig, &mVehicleId, 4, + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + ParamFile_append(raceConfig, &mCharacterId, 4, + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + ParamFile_append(raceConfig, &mPlayerType, 4, + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + ParamFile_append(raceConfig, &mTeam, 4, + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); +} + +} // namespace System +#else // Symbol: unk_8052da50 // PAL: 0x8052da50..0x8052daf0 MARK_BINARY_BLOB(unk_8052da50, 0x8052da50, 0x8052daf0); @@ -92,6 +114,7 @@ asm UNKNOWN_FUNCTION(unk_8052da50) { blr; // clang-format on } +#endif namespace System { diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index f4e4fe0ca..3b6165c64 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -147,10 +148,13 @@ const u16 SCORES[] = {60, 52, 40, 20}; // NOTE: anything marked u8, u16, or u32 could be signed namespace System { +class RaceConfig; + class RaceConfigPlayer { public: RaceConfigPlayer(); virtual ~RaceConfigPlayer(); + void appendParamFile(RaceConfig* raceConfig); s32 computeGpRank() const; // private: unk8 _04; From 7349f2d8406574066f9b427160d727c9d909c3bc Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 12 Jul 2022 15:05:21 -0400 Subject: [PATCH 10/37] RaceConfig: a ton of functions --- pack/symbols.txt | 36 +- source/game/system/InputManager.hpp | 13 + source/game/system/RaceConfig.cpp | 659 +++++++++++++--------------- source/game/system/RaceConfig.hpp | 70 ++- 4 files changed, 396 insertions(+), 382 deletions(-) create mode 100644 source/game/system/InputManager.hpp diff --git a/pack/symbols.txt b/pack/symbols.txt index f1e3c74a4..f205965a0 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9721,25 +9721,25 @@ 0x8052dbc8 RacedataScenario_construct 0x8052dc68 RacedataPlayer_destroy 0x8052dca8 unk_8052dca8 -0x8052dd18 unk_8052dd18 -0x8052dd20 unk_8052dd20 -0x8052dd30 unk_8052dd30 +0x8052dd18 getTeam__Q26System16RaceConfigPlayerFv +0x8052dd20 getPlayer__Q26System12RaceScenarioFUc +0x8052dd30 getRacePlayerCount__Q26System10RaceConfigFv 0x8052dd40 Racedata_init -0x8052e42c unk_8052e42c -0x8052e434 RacedataScenario_getPlayer -0x8052e444 unk_8052e444 -0x8052e44c unk_8052e44c +0x8052e42c setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId +0x8052e434 getPlayer__Q26System12MenuScenarioFUc +0x8052e444 setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId +0x8052e44c setPlayerType__Q26System16RaceConfigPlayerFl 0x8052e454 Racedata_resetSomeStuff -0x8052e658 unk_8052e658 -0x8052e660 unk_8052e660 +0x8052e658 setPrevFinishPos__Q26System16RaceConfigPlayerFSc +0x8052e660 setUnkPos__Q26System16RaceConfigPlayerFSc 0x8052e668 unk_8052e668 0x8052e870 unk_8052e870 0x8052e950 unk_8052e950 -0x8052ed18 unk_8052ed18 -0x8052ed20 unk_8052ed20 +0x8052ed18 getGametype__Q26System12MenuScenarioFv +0x8052ed20 getPlayerType__Q26System16RaceConfigPlayerFv 0x8052ed28 RacedataScenario_postInitControllers 0x8052eef0 unk_8052eef0 -0x8052efd4 unk_8052efd4 +0x8052efd4 resetPlayers__Q26System18RaceConfigScenarioFv 0x8052f064 unk_8052f064 0x8052f1e0 RacedataScenario_copyPrevPositions 0x8052f4e8 RacedataScenario_initControllers @@ -9755,16 +9755,16 @@ 0x805302c4 Racedata_initRace 0x805305ac RacedataScenario_copy 0x80530864 Racedata_initAwards -0x80530f0c unk_80530f0c -0x80530f18 unk_80530f18 -0x80530f20 unk_80530f20 -0x80530f28 unk_80530f28 +0x80530f0c getModeFlag__Q26System12MenuScenarioFv +0x80530f18 getUnkPos__Q26System16RaceConfigPlayerFv +0x80530f20 getCharacter__Q26System16RaceConfigPlayerFv +0x80530f28 getVehicle__Q26System16RaceConfigPlayerFv 0x80530f30 unk_80530f30 -0x80531068 unk_80531068 +0x80531068 getMii__Q26System16RaceConfigPlayerFv 0x80531070 Racedata_initCredits 0x80531ce4 Racedata_updateEndOfRace 0x80531de4 unk_80531de4 -0x80531f18 Racedata_getLocalPlayerNum +0x80531f18 getLocalPlayerCount__Q26System10RaceConfigFUc 0x80531f2c Racedata_setGhost 0x80531f70 Racedata_getHudPlayerId 0x80531f80 unk_80531f80 diff --git a/source/game/system/InputManager.hpp b/source/game/system/InputManager.hpp new file mode 100644 index 000000000..e5625f96d --- /dev/null +++ b/source/game/system/InputManager.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +// Placeholder class for RaceConfig +class InputManager { +public: + InputManager(); + virtual ~InputManager(); + void setGhostController(u8 playerInputIdx, const u8* inputs, bool driftIsAuto); + + static InputManager* spInstance; +}; diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index bb4b76ec9..fc3aa4e0b 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -222,43 +222,18 @@ asm UNKNOWN_FUNCTION(unk_8052dca8) { // clang-format on } -// Symbol: unk_8052dd18 -// PAL: 0x8052dd18..0x8052dd20 -MARK_BINARY_BLOB(unk_8052dd18, 0x8052dd18, 0x8052dd20); -asm UNKNOWN_FUNCTION(unk_8052dd18) { - // clang-format off - nofralloc; - lwz r3, 0xcc(r3); - blr; - // clang-format on -} +namespace System { -// Symbol: unk_8052dd20 -// PAL: 0x8052dd20..0x8052dd30 -MARK_BINARY_BLOB(unk_8052dd20, 0x8052dd20, 0x8052dd30); -asm UNKNOWN_FUNCTION(unk_8052dd20) { - // clang-format off - nofralloc; - mulli r0, r4, 0xf0; - add r3, r3, r0; - addi r3, r3, 8; - blr; - // clang-format on -} +BattleTeam RaceConfigPlayer::getTeam() { return mTeam; } -// Symbol: unk_8052dd30 -// PAL: 0x8052dd30..0x8052dd40 -MARK_BINARY_BLOB(unk_8052dd30, 0x8052dd30, 0x8052dd40); -asm UNKNOWN_FUNCTION(unk_8052dd30) { - // clang-format off - nofralloc; - lis r3, 0; - lwz r3, 0(r3); - lbz r3, 0x24(r3); - blr; - // clang-format on +RaceConfigPlayer* RaceScenario::getPlayer(u8 idx) { return &mPlayers[idx]; } + +u8 RaceConfig::getRacePlayerCount() { + return RaceConfig::spInstance->mRaceScenario.mPlayerCount; } +} // namespace System + // Symbol: Racedata_init // PAL: 0x8052dd40..0x8052e42c MARK_BINARY_BLOB(Racedata_init, 0x8052dd40, 0x8052e42c); @@ -718,55 +693,25 @@ asm UNKNOWN_FUNCTION(Racedata_init) { // clang-format on } -// Symbol: unk_8052e42c -// PAL: 0x8052e42c..0x8052e434 -MARK_BINARY_BLOB(unk_8052e42c, 0x8052e42c, 0x8052e434); -asm UNKNOWN_FUNCTION(unk_8052e42c) { - // clang-format off - nofralloc; - stw r4, 0xc(r3); - blr; - // clang-format on -} +namespace System { -// Symbol: RacedataScenario_getPlayer -// PAL: 0x8052e434..0x8052e444 -MARK_BINARY_BLOB(RacedataScenario_getPlayer, 0x8052e434, 0x8052e444); -asm UNKNOWN_FUNCTION(RacedataScenario_getPlayer) { - // clang-format off - nofralloc; - mulli r0, r4, 0xf0; - add r3, r3, r0; - addi r3, r3, 8; - blr; - // clang-format on +void RaceConfigPlayer::setCharacter(CharacterId character) { + mCharacterId = character; } -// Symbol: unk_8052e444 -// PAL: 0x8052e444..0x8052e44c -MARK_BINARY_BLOB(unk_8052e444, 0x8052e444, 0x8052e44c); -asm UNKNOWN_FUNCTION(unk_8052e444) { - // clang-format off - nofralloc; - stw r4, 8(r3); - blr; - // clang-format on -} +RaceConfigPlayer* MenuScenario::getPlayer(u8 idx) { return &mPlayers[idx]; } -// Symbol: unk_8052e44c -// PAL: 0x8052e44c..0x8052e454 -MARK_BINARY_BLOB(unk_8052e44c, 0x8052e44c, 0x8052e454); -asm UNKNOWN_FUNCTION(unk_8052e44c) { - // clang-format off - nofralloc; - stw r4, 0x10(r3); - blr; - // clang-format on +void RaceConfigPlayer::setVehicle(VehicleId vehicle) { mVehicleId = vehicle; } + +void RaceConfigPlayer::setPlayerType(s32 playerType) { + mPlayerType = playerType; } +} // namespace System + // Symbol: Racedata_resetSomeStuff // PAL: 0x8052e454..0x8052e658 -MARK_BINARY_BLOB(Racedata_resetSomeStuff, 0x8052e454, 0x8052e658); +MARK_BINARY_BLOB(Racedata_resetSomeStuff, 0x8052e454, 0x8052e640); asm UNKNOWN_FUNCTION(Racedata_resetSomeStuff) { // clang-format off nofralloc; @@ -895,40 +840,48 @@ asm UNKNOWN_FUNCTION(Racedata_resetSomeStuff) { stb r4, 0x236c(r3); stb r0, 0x236d(r3); blr; - li r0, 0; - sth r0, 0xd8(r3); - sth r0, 0xde(r3); - stb r4, 0xe1(r3); - stb r4, 0xe0(r3); - blr; // clang-format on } -// Symbol: unk_8052e658 -// PAL: 0x8052e658..0x8052e660 -MARK_BINARY_BLOB(unk_8052e658, 0x8052e658, 0x8052e660); -asm UNKNOWN_FUNCTION(unk_8052e658) { - // clang-format off - nofralloc; - stb r4, 0xe1(r3); - blr; - // clang-format on +namespace System { + +void RaceConfigPlayer::reset(s8 pos) { + mPreviousScore = 0; + mGpRankScore = 0; + mPrevFinishPos = pos; + this->_e0 = pos; } -// Symbol: unk_8052e660 -// PAL: 0x8052e660..0x8052e668 -MARK_BINARY_BLOB(unk_8052e660, 0x8052e660, 0x8052e668); -asm UNKNOWN_FUNCTION(unk_8052e660) { - // clang-format off - nofralloc; - stb r4, 0xe0(r3); - blr; - // clang-format on +void RaceConfigPlayer::setPrevFinishPos(s8 pos) { mPrevFinishPos = pos; } + +void RaceConfigPlayer::setUnkPos(s8 pos) { this->_e0 = pos; } + +} // namespace System + +// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +#ifdef NON_MATCHING +namespace System { + +void RaceConfigScenario::reset() { + mSettings.mItemMode = 0; + mSettings.mCpuMode = 1; + mSettings.mLapCount = 3; + mSettings.mEngineClass = 1; + mSettings.mModeFlags = mSettings.mModeFlags & 0xFFFFFFF8; + + for (u8 i = 0; i < 12; i++) { + mPlayers[i].reset(i + 1); + } + + mSettings.mRaceNumber = 0; + mSettings.mLapCount = 3; } +} // namespace System +#else // Symbol: unk_8052e668 -// PAL: 0x8052e668..0x8052e870 -MARK_BINARY_BLOB(unk_8052e668, 0x8052e668, 0x8052e870); +// PAL: 0x8052e668..0x8052e764 +MARK_BINARY_BLOB(unk_8052e668, 0x8052e668, 0x8052e764); asm UNKNOWN_FUNCTION(unk_8052e668) { // clang-format off nofralloc; @@ -996,9 +949,47 @@ asm UNKNOWN_FUNCTION(unk_8052e668) { stb r4, 0xb6c(r3); stb r0, 0xb6d(r3); blr; + // clang-format on +} +#endif + +// Symbol: unk_8052e764 +// PAL: 0x8052e764..0x8052e770 +MARK_BINARY_BLOB(unk_8052e764, 0x8052e764, 0x8052e770); +asm UNKNOWN_FUNCTION(unk_8052e764) { + // clang-format off blr; blr; blr; + // clang-format on +} + +// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +#ifdef NON_MATCHING +namespace System { + +u8 RaceConfigScenario::update() { + if (mSettings.mRaceNumber < 100) { + mSettings.mRaceNumber++; + } else { + mSettings.mRaceNumber = 0; + } + + for (u8 i = 0; i < 12; i++) { + mPlayers[i].mPrevFinishPos = mPlayers[i].mFinishPos; + mPlayers[i].mPreviousScore = mPlayers[i].mGpScore; + } + + return mSettings.mRaceNumber; +} + +} // namespace System +#else +// Symbol: unk_8052e770 +// PAL: 0x8052e770..0x8052e870 +MARK_BINARY_BLOB(unk_8052e770, 0x8052e770, 0x8052e870); +asm UNKNOWN_FUNCTION(unk_8052e770) { + // clang-format off lbz r4, 0xb6c(r3); cmplwi r4, 0x64; bge lbl_8052e788; @@ -1067,6 +1058,7 @@ asm UNKNOWN_FUNCTION(unk_8052e668) { blr; // clang-format on } +#endif // Symbol: unk_8052e870 // PAL: 0x8052e870..0x8052e950 @@ -1416,27 +1408,13 @@ asm UNKNOWN_FUNCTION(unk_8052e950) { // clang-format on } -// Symbol: unk_8052ed18 -// PAL: 0x8052ed18..0x8052ed20 -MARK_BINARY_BLOB(unk_8052ed18, 0x8052ed18, 0x8052ed20); -asm UNKNOWN_FUNCTION(unk_8052ed18) { - // clang-format off - nofralloc; - lwz r3, 0xb54(r3); - blr; - // clang-format on -} +namespace System { -// Symbol: unk_8052ed20 -// PAL: 0x8052ed20..0x8052ed28 -MARK_BINARY_BLOB(unk_8052ed20, 0x8052ed20, 0x8052ed28); -asm UNKNOWN_FUNCTION(unk_8052ed20) { - // clang-format off - nofralloc; - lwz r3, 0x10(r3); - blr; - // clang-format on -} +s32 MenuScenario::getGametype() { return mSettings.mGameType; } + +s32 RaceConfigPlayer::getPlayerType() { return mPlayerType; } + +} // namespace System // Symbol: RacedataScenario_postInitControllers // PAL: 0x8052ed28..0x8052eef0 @@ -1573,6 +1551,38 @@ asm UNKNOWN_FUNCTION(RacedataScenario_postInitControllers) { // clang-format on } +// This has never built due to GhostFile access problems +// This should give a rough idea of how the function works +#ifdef NON_MATCHING +namespace System { + +bool MenuScenario::initGhost(u8 playerIdx, u8 playerInputIdx) { + if (!mGhost->isValid()) { + return false; + } + + GhostFile ghost; + ghost.read(*mGhost); + + if (!ghost.mCourseId == mCourseId) { + return false; + } + + if (-1 < playerInputIdx) { + InputManager::setGhostController(InputManager::spInstance, playerInputIdx, + ghost.mInputs, ghost.mDriftIsAuto); + } + + mPlayers[playerIdx].mCharacterId = ghost.mCharacterId; + mPlayers[playerIdx].mVehicleId = ghost.mVehicleId; + mPlayers[playerIdx].mPlayerInputIdx = playerInputIdx; + mPlayers[playerIdx].mControllerId = ghost.mControllerId; + + return true; +} + +} // namespace System +#else // Symbol: unk_8052eef0 // PAL: 0x8052eef0..0x8052efd4 MARK_BINARY_BLOB(unk_8052eef0, 0x8052eef0, 0x8052efd4); @@ -1641,11 +1651,31 @@ asm UNKNOWN_FUNCTION(unk_8052eef0) { blr; // clang-format on } +#endif + +// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +#ifdef NON_MATCHING +namespace System { + +void RaceConfigScenario::resetPlayers() { + for (u8 i = 0; i < 12; i++) { + mPlayers[i].mLocalPlayerNum = -1; + mPlayers[i].mPlayerInputIdx = -1; + } + + mSettings.mHudPlayerIds[0] = -1; + mSettings.mHudPlayerIds[1] = -1; + mSettings.mHudPlayerIds[2] = -1; + mSettings.mHudPlayerIds[3] = -1; +} -// Symbol: unk_8052efd4 +} // namespace System +#else +// Symbol: resetPlayers__Q26System18RaceConfigScenarioFv // PAL: 0x8052efd4..0x8052f064 -MARK_BINARY_BLOB(unk_8052efd4, 0x8052efd4, 0x8052f064); -asm UNKNOWN_FUNCTION(unk_8052efd4) { +MARK_BINARY_BLOB(resetPlayers__Q26System18RaceConfigScenarioFv, 0x8052efd4, + 0x8052f064); +asm UNKNOWN_FUNCTION(resetPlayers__Q26System18RaceConfigScenarioFv) { // clang-format off nofralloc; li r6, 0; @@ -1686,6 +1716,7 @@ asm UNKNOWN_FUNCTION(unk_8052efd4) { blr; // clang-format on } +#endif // Symbol: unk_8052f064 // PAL: 0x8052f064..0x8052f1e0 @@ -3457,35 +3488,35 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_8053088c: addi r3, r31, 0xc10; clrlwi r4, r30, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 5; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; clrlwi r4, r30, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0xc10; clrlwi r4, r30, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r30, r30, 1; cmplwi r30, 0xc; blt lbl_8053088c; addi r3, r31, 0xc10; - bl unk_8052ed18; + bl getGametype__Q26System12MenuScenarioFv; addi r0, r3, -7; addi r3, r31, 0xc10; cntlzw r0, r0; srwi r29, r0, 5; - bl unk_8052ed18; + bl getGametype__Q26System12MenuScenarioFv; addi r0, r3, -12; addi r3, r31, 0xc10; cntlzw r0, r0; srwi r30, r0, 5; - bl unk_80530f0c; + bl getModeFlag__Q26System12MenuScenarioFv; cmpwi r29, 0; beq lbl_80530a2c; li r30, 1; @@ -3495,62 +3526,62 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_8053091c: addi r3, r31, 0x20; clrlwi r4, r28, 0x18; - bl unk_8052dd20; - bl unk_80530f18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getUnkPos__Q26System16RaceConfigPlayerFv; clrlwi r0, r3, 0x18; cmplw r29, r0; bne lbl_80530a10; addi r3, r31, 0x20; clrlwi r4, r28, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 5; beq lbl_80530a10; addi r0, r30, -1; addi r3, r31, 0x20; clrlwi r27, r0, 0x18; clrlwi r4, r28, 0x18; - bl unk_8052dd20; - bl unk_80530f20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getCharacter__Q26System16RaceConfigPlayerFv; mr r29, r3; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e42c; + bl setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId; addi r3, r31, 0x20; clrlwi r4, r28, 0x18; - bl unk_8052dd20; - bl unk_80530f28; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getVehicle__Q26System16RaceConfigPlayerFv; mr r29, r3; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e444; + bl setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r30, 0x18; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r30, 0x18; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0x20; clrlwi r4, r28, 0x18; - bl unk_8052dd20; - bl unk_80531068; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getMii__Q26System16RaceConfigPlayerFv; mr r29, r3; mr r4, r27; addi r3, r31, 0xc10; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; bl unk_80530f30; b lbl_80530a1c; @@ -3576,14 +3607,14 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530a50: addi r3, r31, 0x20; clrlwi r4, r29, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 0; bne lbl_80530a88; addi r3, r31, 0x20; clrlwi r4, r29, 0x18; - bl unk_8052dd20; - bl unk_8052dd18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getTeam__Q26System16RaceConfigPlayerFv; cmpw r27, r3; bne lbl_80530a88; mr r28, r27; @@ -3591,7 +3622,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530a88: addi r29, r29, 1; lbl_80530a8c: - bl unk_8052dd30; + bl getRacePlayerCount__Q26System10RaceConfigFv; clrlwi r3, r3, 0x18; clrlwi r0, r29, 0x18; cmplw r0, r3; @@ -3605,67 +3636,67 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530ab0: addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_80530f18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getUnkPos__Q26System16RaceConfigPlayerFv; clrlwi r0, r3, 0x18; cmplw r30, r0; bne lbl_80530bb8; addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 0; bne lbl_80530bb8; addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_8052dd18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getTeam__Q26System16RaceConfigPlayerFv; cmpw r28, r3; bne lbl_80530bb8; addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_80530f20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getCharacter__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e42c; + bl setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId; addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_80530f28; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getVehicle__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e444; + bl setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; clrlwi r4, r27, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0x20; clrlwi r4, r25, 0x18; - bl unk_8052dd20; - bl unk_80531068; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getMii__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; bl unk_80530f30; addi r27, r27, 1; @@ -3683,73 +3714,73 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530bdc: addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_80530f18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getUnkPos__Q26System16RaceConfigPlayerFv; clrlwi r0, r3, 0x18; cmplw r30, r0; bne lbl_80530cfc; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 5; beq lbl_80530cfc; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 0; beq lbl_80530cfc; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_8052dd18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getTeam__Q26System16RaceConfigPlayerFv; cmpw r28, r3; bne lbl_80530cfc; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_80530f20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getCharacter__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e42c; + bl setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_80530f28; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getVehicle__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_8052e444; + bl setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; clrlwi r4, r27, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r29, 0x18; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0x20; clrlwi r4, r26, 0x18; - bl unk_8052dd20; - bl unk_80531068; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getMii__Q26System16RaceConfigPlayerFv; mr r29, r3; addi r3, r31, 0xc10; clrlwi r4, r27, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; bl unk_80530f30; addi r27, r27, 1; @@ -3772,61 +3803,61 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530d30: addi r3, r31, 0x20; clrlwi r4, r27, 0x18; - bl unk_8052dd20; - bl unk_80530f18; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getUnkPos__Q26System16RaceConfigPlayerFv; clrlwi r0, r3, 0x18; cmplw r29, r0; bne lbl_80530e20; addi r3, r31, 0x20; clrlwi r4, r27, 0x18; - bl unk_8052dd20; - bl unk_8052ed20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getPlayerType__Q26System16RaceConfigPlayerFv; cmpwi r3, 0; bne lbl_80530e20; addi r3, r31, 0x20; clrlwi r4, r27, 0x18; - bl unk_8052dd20; - bl unk_80530f20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getCharacter__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; clrlwi r4, r25, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_8052e42c; + bl setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId; addi r3, r31, 0x20; clrlwi r4, r27, 0x18; - bl unk_8052dd20; - bl unk_80530f28; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getVehicle__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; clrlwi r4, r25, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_8052e444; + bl setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId; addi r3, r31, 0xc10; clrlwi r4, r25, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; clrlwi r4, r25, 0x18; addi r3, r31, 0xc10; addi r30, r4, 1; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r30, 0x18; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0xc10; clrlwi r4, r25, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; clrlwi r4, r30, 0x18; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0x20; clrlwi r4, r27, 0x18; - bl unk_8052dd20; - bl unk_80531068; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getMii__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; clrlwi r4, r25, 0x18; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; bl unk_80530f30; addi r25, r25, 1; @@ -3841,47 +3872,47 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { lbl_80530e3c: addi r3, r31, 0x20; li r4, 0; - bl unk_8052dd20; - bl unk_80530f20; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getCharacter__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_8052e42c; + bl setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId; addi r3, r31, 0x20; li r4, 0; - bl unk_8052dd20; - bl unk_80530f28; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getVehicle__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_8052e444; + bl setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e44c; + bl setPlayerType__Q26System16RaceConfigPlayerFl; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e658; + bl setPrevFinishPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl unk_8052e660; + bl setUnkPos__Q26System16RaceConfigPlayerFSc; addi r3, r31, 0x20; li r4, 0; - bl unk_8052dd20; - bl unk_80531068; + bl getPlayer__Q26System12RaceScenarioFUc; + bl getMii__Q26System16RaceConfigPlayerFv; mr r30, r3; addi r3, r31, 0xc10; li r4, 0; - bl RacedataScenario_getPlayer; + bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; bl unk_80530f30; lbl_80530ef0: @@ -3895,50 +3926,17 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { // clang-format on } -// Symbol: unk_80530f0c -// PAL: 0x80530f0c..0x80530f18 -MARK_BINARY_BLOB(unk_80530f0c, 0x80530f0c, 0x80530f18); -asm UNKNOWN_FUNCTION(unk_80530f0c) { - // clang-format off - nofralloc; - lwz r0, 0xb70(r3); - rlwinm r3, r0, 0x1f, 0x1f, 0x1f; - blr; - // clang-format on -} +namespace System { -// Symbol: unk_80530f18 -// PAL: 0x80530f18..0x80530f20 -MARK_BINARY_BLOB(unk_80530f18, 0x80530f18, 0x80530f20); -asm UNKNOWN_FUNCTION(unk_80530f18) { - // clang-format off - nofralloc; - lbz r3, 0xe0(r3); - blr; - // clang-format on -} +u32 MenuScenario::getModeFlag() { return mSettings.mModeFlags >> 1 & 1; } -// Symbol: unk_80530f20 -// PAL: 0x80530f20..0x80530f28 -MARK_BINARY_BLOB(unk_80530f20, 0x80530f20, 0x80530f28); -asm UNKNOWN_FUNCTION(unk_80530f20) { - // clang-format off - nofralloc; - lwz r3, 0xc(r3); - blr; - // clang-format on -} +u8 RaceConfigPlayer::getUnkPos() { return this->_e0; } -// Symbol: unk_80530f28 -// PAL: 0x80530f28..0x80530f30 -MARK_BINARY_BLOB(unk_80530f28, 0x80530f28, 0x80530f30); -asm UNKNOWN_FUNCTION(unk_80530f28) { - // clang-format off - nofralloc; - lwz r3, 8(r3); - blr; - // clang-format on -} +CharacterId RaceConfigPlayer::getCharacter() { return mCharacterId; } + +VehicleId RaceConfigPlayer::getVehicle() { return mVehicleId; } + +} // namespace System // Symbol: unk_80530f30 // PAL: 0x80530f30..0x80531068 @@ -4028,16 +4026,11 @@ asm UNKNOWN_FUNCTION(unk_80530f30) { // clang-format on } -// Symbol: unk_80531068 -// PAL: 0x80531068..0x80531070 -MARK_BINARY_BLOB(unk_80531068, 0x80531068, 0x80531070); -asm UNKNOWN_FUNCTION(unk_80531068) { - // clang-format off - nofralloc; - addi r3, r3, 0x14; - blr; - // clang-format on -} +namespace System { + +Mii* RaceConfigPlayer::getMii() { return &mMii; } + +} // namespace System // Symbol: Racedata_initCredits // PAL: 0x80531070..0x80531ce4 @@ -4862,6 +4855,14 @@ asm UNKNOWN_FUNCTION(Racedata_initCredits) { // clang-format on } +// Relies on regswap fix for RaceConfigScenario::update() +#ifdef NON_MATCHING +namespace System { + +u8 RaceConfig::update() { return mMenuScenario.update(); } + +} // namespace System +#else // Symbol: Racedata_updateEndOfRace // PAL: 0x80531ce4..0x80531de4 MARK_BINARY_BLOB(Racedata_updateEndOfRace, 0x80531ce4, 0x80531de4); @@ -4936,6 +4937,7 @@ asm UNKNOWN_FUNCTION(Racedata_updateEndOfRace) { blr; // clang-format on } +#endif // Symbol: unk_80531de4 // PAL: 0x80531de4..0x80531f18 @@ -5024,61 +5026,30 @@ asm UNKNOWN_FUNCTION(unk_80531de4) { // clang-format on } -// Symbol: Racedata_getLocalPlayerNum -// PAL: 0x80531f18..0x80531f2c -MARK_BINARY_BLOB(Racedata_getLocalPlayerNum, 0x80531f18, 0x80531f2c); -asm UNKNOWN_FUNCTION(Racedata_getLocalPlayerNum) { - // clang-format off - nofralloc; - mulli r0, r4, 0xf0; - add r3, r3, r0; - lbz r0, 0x2d(r3); - extsb r3, r0; - blr; - // clang-format on +namespace System { + +// This is so stupid, Nintendo just HAD to use r0 +s32 RaceConfig::getLocalPlayerCount(u8 playerIdx) { + return (s8)(u8)mRaceScenario.mPlayers[playerIdx].mLocalPlayerNum; } -// Symbol: Racedata_setGhost -// PAL: 0x80531f2c..0x80531f70 -MARK_BINARY_BLOB(Racedata_setGhost, 0x80531f2c, 0x80531f70); -asm UNKNOWN_FUNCTION(Racedata_setGhost) { - // clang-format off - nofralloc; - lwz r6, 0xc0c(r3); - lwz r0, 0x17fc(r3); - cmplw r6, r0; - bne lbl_80531f64; - addi r5, r3, 0x23f0; - cmplw r6, r5; - bne lbl_80531f54; - addi r0, r3, 0x4bf0; - stw r0, 0x17fc(r3); - b lbl_80531f64; -lbl_80531f54: - addi r0, r3, 0x4bf0; - cmplw r6, r0; - bne lbl_80531f64; - stw r5, 0x17fc(r3); -lbl_80531f64: - lwz r3, 0x17fc(r3); - li r5, 0x2800; - b unk_805553b0; - // clang-format on +void RaceConfig::setGhost(RawGhostFile* ghost) { + if (mRaceScenario.mGhost == mMenuScenario.mGhost) { + if (mRaceScenario.mGhost == &mGhosts[0]) { + mMenuScenario.mGhost = &mGhosts[1]; + } else if (mRaceScenario.mGhost == &mGhosts[1]) { + mMenuScenario.mGhost = &mGhosts[0]; + } + } + memcpy(mMenuScenario.mGhost, ghost, 0x2800); } -// Symbol: Racedata_getHudPlayerId -// PAL: 0x80531f70..0x80531f80 -MARK_BINARY_BLOB(Racedata_getHudPlayerId, 0x80531f70, 0x80531f80); -asm UNKNOWN_FUNCTION(Racedata_getHudPlayerId) { - // clang-format off - nofralloc; - add r3, r3, r4; - lbz r0, 0xb84(r3); - extsb r3, r0; - blr; - // clang-format on +s32 RaceConfig::getHudPlayerId(u8 playerIdx) { + return (s8)mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; } +} // namespace System + // Symbol: unk_80531f80 // PAL: 0x80531f80..0x80531fc8 MARK_BINARY_BLOB(unk_80531f80, 0x80531f80, 0x80531fc8); diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 3b6165c64..0b1e817eb 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -32,27 +32,28 @@ UNKNOWN_FUNCTION(RacedataPlayer_destroy); // PAL: 0x8052dca8..0x8052dd18 UNKNOWN_FUNCTION(unk_8052dca8); // PAL: 0x8052dd18..0x8052dd20 -UNKNOWN_FUNCTION(unk_8052dd18); +UNKNOWN_FUNCTION(getTeam__Q26System16RaceConfigPlayerFv); // PAL: 0x8052dd20..0x8052dd30 -UNKNOWN_FUNCTION(unk_8052dd20); +UNKNOWN_FUNCTION(getPlayer__Q26System12RaceScenarioFUc); // PAL: 0x8052dd30..0x8052dd40 -UNKNOWN_FUNCTION(unk_8052dd30); +UNKNOWN_FUNCTION(getRacePlayerCount__Q26System10RaceConfigFv); // PAL: 0x8052dd40..0x8052e42c UNKNOWN_FUNCTION(Racedata_init); // PAL: 0x8052e42c..0x8052e434 -UNKNOWN_FUNCTION(unk_8052e42c); +UNKNOWN_FUNCTION( + setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId); // PAL: 0x8052e434..0x8052e444 -UNKNOWN_FUNCTION(RacedataScenario_getPlayer); +UNKNOWN_FUNCTION(getPlayer__Q26System12MenuScenarioFUc); // PAL: 0x8052e444..0x8052e44c -UNKNOWN_FUNCTION(unk_8052e444); +UNKNOWN_FUNCTION(setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId); // PAL: 0x8052e44c..0x8052e454 -UNKNOWN_FUNCTION(unk_8052e44c); +UNKNOWN_FUNCTION(setPlayerType__Q26System16RaceConfigPlayerFl); // PAL: 0x8052e454..0x8052e658 UNKNOWN_FUNCTION(Racedata_resetSomeStuff); // PAL: 0x8052e658..0x8052e660 -UNKNOWN_FUNCTION(unk_8052e658); +UNKNOWN_FUNCTION(setPrevFinishPos__Q26System16RaceConfigPlayerFSc); // PAL: 0x8052e660..0x8052e668 -UNKNOWN_FUNCTION(unk_8052e660); +UNKNOWN_FUNCTION(setUnkPos__Q26System16RaceConfigPlayerFSc); // PAL: 0x8052e668..0x8052e870 UNKNOWN_FUNCTION(unk_8052e668); // PAL: 0x8052e870..0x8052e950 @@ -60,15 +61,15 @@ UNKNOWN_FUNCTION(unk_8052e870); // PAL: 0x8052e950..0x8052ed18 UNKNOWN_FUNCTION(unk_8052e950); // PAL: 0x8052ed18..0x8052ed20 -UNKNOWN_FUNCTION(unk_8052ed18); +UNKNOWN_FUNCTION(getGametype__Q26System12MenuScenarioFv); // PAL: 0x8052ed20..0x8052ed28 -UNKNOWN_FUNCTION(unk_8052ed20); +UNKNOWN_FUNCTION(getPlayerType__Q26System16RaceConfigPlayerFv); // PAL: 0x8052ed28..0x8052eef0 UNKNOWN_FUNCTION(RacedataScenario_postInitControllers); // PAL: 0x8052eef0..0x8052efd4 UNKNOWN_FUNCTION(unk_8052eef0); // PAL: 0x8052efd4..0x8052f064 -UNKNOWN_FUNCTION(unk_8052efd4); +UNKNOWN_FUNCTION(resetPlayers__Q26System18RaceConfigScenarioFv); // PAL: 0x8052f064..0x8052f1e0 UNKNOWN_FUNCTION(unk_8052f064); // PAL: 0x8052f1e0..0x8052f4e8 @@ -100,17 +101,17 @@ UNKNOWN_FUNCTION(RacedataScenario_copy); // PAL: 0x80530864..0x80530f0c UNKNOWN_FUNCTION(Racedata_initAwards); // PAL: 0x80530f0c..0x80530f18 -UNKNOWN_FUNCTION(unk_80530f0c); +UNKNOWN_FUNCTION(getModeFlag__Q26System12MenuScenarioFv); // PAL: 0x80530f18..0x80530f20 -UNKNOWN_FUNCTION(unk_80530f18); +UNKNOWN_FUNCTION(getUnkPos__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f20..0x80530f28 -UNKNOWN_FUNCTION(unk_80530f20); +UNKNOWN_FUNCTION(getCharacter__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f28..0x80530f30 -UNKNOWN_FUNCTION(unk_80530f28); +UNKNOWN_FUNCTION(getVehicle__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f30..0x80531068 UNKNOWN_FUNCTION(unk_80530f30); // PAL: 0x80531068..0x80531070 -UNKNOWN_FUNCTION(unk_80531068); +UNKNOWN_FUNCTION(getMii__Q26System16RaceConfigPlayerFv); // PAL: 0x80531070..0x80531ce4 UNKNOWN_FUNCTION(Racedata_initCredits); // PAL: 0x80531ce4..0x80531de4 @@ -118,7 +119,7 @@ UNKNOWN_FUNCTION(Racedata_updateEndOfRace); // PAL: 0x80531de4..0x80531f18 UNKNOWN_FUNCTION(unk_80531de4); // PAL: 0x80531f18..0x80531f2c -UNKNOWN_FUNCTION(Racedata_getLocalPlayerNum); +UNKNOWN_FUNCTION(getLocalPlayerCount__Q26System10RaceConfigFUc); // PAL: 0x80531f2c..0x80531f70 UNKNOWN_FUNCTION(Racedata_setGhost); // PAL: 0x80531f70..0x80531f80 @@ -156,6 +157,18 @@ class RaceConfigPlayer { virtual ~RaceConfigPlayer(); void appendParamFile(RaceConfig* raceConfig); s32 computeGpRank() const; + BattleTeam getTeam(); + void setCharacter(CharacterId character); + void setVehicle(VehicleId vehicle); + void setPlayerType(s32 playerType); + void reset(s8 pos); + void setPrevFinishPos(s8 pos); + void setUnkPos(s8 pos); + s32 getPlayerType(); + u8 getUnkPos(); + CharacterId getCharacter(); + VehicleId getVehicle(); + Mii* getMii(); // private: unk8 _04; s8 mLocalPlayerNum; @@ -199,6 +212,9 @@ class RaceConfigScenario { public: RaceConfigScenario(RawGhostFile* ghost); virtual ~RaceConfigScenario(); + void reset(); + u8 update(); + void resetPlayers(); // private: u8 mPlayerCount; u8 mHudCount; @@ -211,8 +227,17 @@ class RaceConfigScenario { }; // These will be important later -class RaceScenario : public RaceConfigScenario {}; -class MenuScenario : public RaceConfigScenario {}; +class RaceScenario : public RaceConfigScenario { +public: + RaceConfigPlayer* getPlayer(u8 idx); +}; +class MenuScenario : public RaceConfigScenario { +public: + RaceConfigPlayer* getPlayer(u8 idx); + s32 getGametype(); + bool initGhost(u8 playerIdx, u8 playerInputIdx); + u32 getModeFlag(); +}; class AwardsScenario : public RaceConfigScenario {}; class RaceConfigMain { @@ -231,6 +256,11 @@ class RaceConfig : ParameterFile, public RaceConfigMain { public: RaceConfig(); virtual ~RaceConfig(); + static u8 getRacePlayerCount(); + u8 update(); + s32 getLocalPlayerCount(u8 playerIdx); + void setGhost(RawGhostFile* ghost); + s32 getHudPlayerId(u8 playerIdx); static RaceConfig* spInstance; }; From 846d4287f896a154f28ce78cb96ed7f66c684688 Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 12 Jul 2022 16:23:05 -0400 Subject: [PATCH 11/37] RaceConfigPlayer: appendParamFile Includes minor cleanup. --- source/game/system/InputManager.hpp | 3 +- source/game/system/RaceConfig.cpp | 87 +++++------------------------ source/game/system/RaceConfig.hpp | 4 +- 3 files changed, 18 insertions(+), 76 deletions(-) diff --git a/source/game/system/InputManager.hpp b/source/game/system/InputManager.hpp index e5625f96d..752664189 100644 --- a/source/game/system/InputManager.hpp +++ b/source/game/system/InputManager.hpp @@ -7,7 +7,8 @@ class InputManager { public: InputManager(); virtual ~InputManager(); - void setGhostController(u8 playerInputIdx, const u8* inputs, bool driftIsAuto); + void setGhostController(u8 playerInputIdx, const u8* inputs, + bool driftIsAuto); static InputManager* spInstance; }; diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index fc3aa4e0b..a53bdbc2e 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -44,80 +44,21 @@ RaceConfigPlayer::RaceConfigPlayer() mVehicleId(STANDARD_KART_M), mCharacterId(MARIO), mPlayerType(0), mMii(7), mControllerId(-1), _d4(8), mRating(), _ec(_ec & ~0x80) {} -} // namespace System - -#ifdef NON_MATCHING -namespace System { - void RaceConfigPlayer::appendParamFile(RaceConfig* raceConfig) { - ParamFile_append(raceConfig, &mVehicleId, 4, - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - ParamFile_append(raceConfig, &mCharacterId, 4, - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - ParamFile_append(raceConfig, &mPlayerType, 4, - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - ParamFile_append(raceConfig, &mTeam, 4, - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->appendData((char*)&mVehicleId, sizeof(mVehicleId), + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->appendData((char*)&mCharacterId, sizeof(mCharacterId), + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->appendData((char*)&mPlayerType, sizeof(mPlayerType), + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->appendData((char*)&mTeam, sizeof(mTeam), + InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); } -} // namespace System -#else -// Symbol: unk_8052da50 -// PAL: 0x8052da50..0x8052daf0 -MARK_BINARY_BLOB(unk_8052da50, 0x8052da50, 0x8052daf0); -asm UNKNOWN_FUNCTION(unk_8052da50) { - // clang-format off - nofralloc; - stwu r1, -0x20(r1); - mflr r0; - stw r0, 0x24(r1); - stw r31, 0x1c(r1); - lis r31, 0; - stw r30, 0x18(r1); - mr r30, r4; - stw r29, 0x14(r1); - mr r29, r3; - mr r3, r30; - lwz r5, 0(r31); - addi r4, r29, 8; - lwz r6, 0x34(r5); - li r5, 4; - bl unk_805553b0; - lwz r6, 0(r31); - mr r3, r30; - addi r4, r29, 0xc; - li r5, 4; - lwz r6, 0x34(r6); - bl unk_805553b0; - lwz r6, 0(r31); - mr r3, r30; - addi r4, r29, 0x10; - li r5, 4; - lwz r6, 0x34(r6); - bl unk_805553b0; - lwz r6, 0(r31); - mr r3, r30; - addi r4, r29, 0xcc; - li r5, 4; - lwz r6, 0x34(r6); - bl unk_805553b0; - lwz r0, 0x24(r1); - lwz r31, 0x1c(r1); - lwz r30, 0x18(r1); - lwz r29, 0x14(r1); - mtlr r0; - addi r1, r1, 0x20; - blr; - // clang-format on -} -#endif - -namespace System { - s32 RaceConfigPlayer::computeGpRank() const { s8 weightedRankScore = 5; for (u8 i = 0; i < sizeof(RANK_SCORES) / 4; i++) { @@ -5044,8 +4985,8 @@ void RaceConfig::setGhost(RawGhostFile* ghost) { memcpy(mMenuScenario.mGhost, ghost, 0x2800); } -s32 RaceConfig::getHudPlayerId(u8 playerIdx) { - return (s8)mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; +s8 RaceConfig::getHudPlayerId(u8 playerIdx) { + return mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; } } // namespace System diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 0b1e817eb..6c2350a96 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -252,7 +252,7 @@ class RaceConfigMain { RawGhostFile mGhosts[2]; }; -class RaceConfig : ParameterFile, public RaceConfigMain { +class RaceConfig : public ParameterFile, public RaceConfigMain { public: RaceConfig(); virtual ~RaceConfig(); @@ -260,7 +260,7 @@ class RaceConfig : ParameterFile, public RaceConfigMain { u8 update(); s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); - s32 getHudPlayerId(u8 playerIdx); + s8 getHudPlayerId(u8 playerIdx); static RaceConfig* spInstance; }; From b5457de022752410bafdded04bc3f5572d4eca4f Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 12 Jul 2022 16:33:53 -0400 Subject: [PATCH 12/37] [FAIL] RaceConfig: cleaner implementation --- source/game/host_system/ParameterFile.hpp | 4 ++++ source/game/system/RaceConfig.cpp | 20 ++++++++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/source/game/host_system/ParameterFile.hpp b/source/game/host_system/ParameterFile.hpp index 9cdc515a2..6f6cd2aa1 100644 --- a/source/game/host_system/ParameterFile.hpp +++ b/source/game/host_system/ParameterFile.hpp @@ -23,6 +23,10 @@ class ParameterFile { void appendData(char* str, u32 str_size, EGG::Heap* heap); + template void append(const T& obj, EGG::Heap* heap) { + appendData(reinterpret_cast(&obj), sizeof(obj), heap); + } + private: class StringView { public: diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index a53bdbc2e..3b270d7bd 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -45,18 +45,14 @@ RaceConfigPlayer::RaceConfigPlayer() mControllerId(-1), _d4(8), mRating(), _ec(_ec & ~0x80) {} void RaceConfigPlayer::appendParamFile(RaceConfig* raceConfig) { - raceConfig->appendData((char*)&mVehicleId, sizeof(mVehicleId), - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - raceConfig->appendData((char*)&mCharacterId, sizeof(mCharacterId), - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - raceConfig->appendData((char*)&mPlayerType, sizeof(mPlayerType), - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); - raceConfig->appendData((char*)&mTeam, sizeof(mTeam), - InitScene::spInstance->mHeapCollection - .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->append(mVehicleId, InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->append(mCharacterId, InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->append(mPlayerType, InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); + raceConfig->append(mTeam, InitScene::spInstance->mHeapCollection + .mpHeaps[HeapCollection::HEAP_ID_MEM2]); } s32 RaceConfigPlayer::computeGpRank() const { From 1c1a3d80257a000edc77f0a38e557c365804b73f Mon Sep 17 00:00:00 2001 From: vabold Date: Wed, 13 Jul 2022 03:50:23 -0400 Subject: [PATCH 13/37] ParameterFile: fix template Co-Authored-By: riidefi <34194588+riidefi@users.noreply.github.com> --- source/game/host_system/ParameterFile.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/game/host_system/ParameterFile.hpp b/source/game/host_system/ParameterFile.hpp index 6f6cd2aa1..c9698eba8 100644 --- a/source/game/host_system/ParameterFile.hpp +++ b/source/game/host_system/ParameterFile.hpp @@ -23,7 +23,7 @@ class ParameterFile { void appendData(char* str, u32 str_size, EGG::Heap* heap); - template void append(const T& obj, EGG::Heap* heap) { + template void append(T& obj, EGG::Heap* heap) { appendData(reinterpret_cast(&obj), sizeof(obj), heap); } From ca1a1f85213335dd24ce6e41bd9c5c88535f47bc Mon Sep 17 00:00:00 2001 From: Aiden Date: Wed, 13 Jul 2022 16:43:03 -0400 Subject: [PATCH 14/37] RaceScenario: computeWinningTeam --- pack/symbols.txt | 4 +-- source/game/system/RaceConfig.cpp | 54 ++++++++----------------------- source/game/system/RaceConfig.hpp | 5 ++- 3 files changed, 18 insertions(+), 45 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index f205965a0..62178da31 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9600,7 +9600,7 @@ 0x80528598 unk_80528598 0x805287bc unk_805287bc 0x80528ea8 unk_80528ea8 -0x80529034 unk_80529034 +0x80529034 __dt__Q26System3MiiFv 0x80529074 unk_80529074 0x80529330 unk_80529330 0x80529420 unk_80529420 @@ -9720,7 +9720,7 @@ 0x8052daf0 RacedataPlayer_computeGpRank 0x8052dbc8 RacedataScenario_construct 0x8052dc68 RacedataPlayer_destroy -0x8052dca8 unk_8052dca8 +0x8052dca8 computeWinningTeam__Q26System12RaceScenarioFv 0x8052dd18 getTeam__Q26System16RaceConfigPlayerFv 0x8052dd20 getPlayer__Q26System12RaceScenarioFUc 0x8052dd30 getRacePlayerCount__Q26System10RaceConfigFv diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 3b270d7bd..32ff6d0d0 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -1,5 +1,7 @@ #include "RaceConfig.hpp" +#pragma legacy_struct_alignment off + extern "C" { // Extern function references. // PAL: 0x80009d6c @@ -120,47 +122,19 @@ asm UNKNOWN_FUNCTION(RacedataPlayer_destroy) { // clang-format on } -// Symbol: unk_8052dca8 -// PAL: 0x8052dca8..0x8052dd18 -MARK_BINARY_BLOB(unk_8052dca8, 0x8052dca8, 0x8052dd18); -asm UNKNOWN_FUNCTION(unk_8052dca8) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - lis r4, 0; - li r0, 0; - li r8, 0; - stw r0, 8(r1); - addi r5, r1, 8; - lwz r7, 0(r4); - b lbl_8052dcf0; -lbl_8052dcc8: - clrlwi r0, r8, 0x18; - addi r8, r8, 1; - mulli r0, r0, 0xf0; - add r4, r3, r0; - lwz r6, 0xd4(r4); - lhz r0, 0xe0(r4); - slwi r6, r6, 1; - lhzx r4, r5, r6; - add r0, r4, r0; - sthx r0, r5, r6; -lbl_8052dcf0: - lbz r0, 0x24(r7); - clrlwi r4, r8, 0x18; - cmplw r4, r0; - blt lbl_8052dcc8; - lhz r3, 8(r1); - lhz r0, 0xa(r1); - subf r0, r0, r3; - srwi r3, r0, 0x1f; - addi r1, r1, 0x10; - blr; - // clang-format on -} - namespace System { +BattleTeam RaceScenario::computeWinningTeam() { + u16 results[] = {0, 0}; + + for (u8 i = 0; i < RaceConfig::spInstance->mRaceScenario.mPlayerCount; i++) { + const BattleTeam team = mPlayers[i].mTeam; + results[team] += mPlayers[i].mPreviousScore; + } + + return (results[0] < results[1]) ? BATTLE_TEAM_BLUE : BATTLE_TEAM_RED; +} + BattleTeam RaceConfigPlayer::getTeam() { return mTeam; } RaceConfigPlayer* RaceScenario::getPlayer(u8 idx) { return &mPlayers[idx]; } @@ -3535,7 +3509,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { cmpwi r3, 0; beq lbl_80530d18; addi r3, r31, 0x20; - bl unk_8052dca8; + bl computeWinningTeam__Q26System12RaceScenarioFv; cntlzw r0, r3; mr r27, r3; srwi r28, r0, 5; diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 6c2350a96..1231e4ebd 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -1,7 +1,5 @@ #pragma once -#pragma legacy_struct_alignment off - #include #include #include @@ -30,7 +28,7 @@ UNKNOWN_FUNCTION(RacedataScenario_construct); // PAL: 0x8052dc68..0x8052dca8 UNKNOWN_FUNCTION(RacedataPlayer_destroy); // PAL: 0x8052dca8..0x8052dd18 -UNKNOWN_FUNCTION(unk_8052dca8); +UNKNOWN_FUNCTION(computeWinningTeam__Q26System12RaceScenarioFv); // PAL: 0x8052dd18..0x8052dd20 UNKNOWN_FUNCTION(getTeam__Q26System16RaceConfigPlayerFv); // PAL: 0x8052dd20..0x8052dd30 @@ -230,6 +228,7 @@ class RaceConfigScenario { class RaceScenario : public RaceConfigScenario { public: RaceConfigPlayer* getPlayer(u8 idx); + BattleTeam computeWinningTeam(); }; class MenuScenario : public RaceConfigScenario { public: From 44fc1f8ac74ec389deb8a59dbeb080193e83e854 Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 14 Jul 2022 05:27:27 -0400 Subject: [PATCH 15/37] RaceConfigScenario: Add decomp.me scratch comments --- source/game/system/RaceConfig.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 32ff6d0d0..7fbd8ed8c 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -770,6 +770,7 @@ void RaceConfigPlayer::setUnkPos(s8 pos) { this->_e0 = pos; } } // namespace System // https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +// Scratch: https://decomp.me/scratch/T0McN #ifdef NON_MATCHING namespace System { @@ -876,6 +877,7 @@ asm UNKNOWN_FUNCTION(unk_8052e764) { } // https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +// Scratch: https://decomp.me/scratch/NxTL1 #ifdef NON_MATCHING namespace System { @@ -1565,6 +1567,7 @@ asm UNKNOWN_FUNCTION(unk_8052eef0) { #endif // https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif +// Scratch: https://decomp.me/scratch/U5rl1 #ifdef NON_MATCHING namespace System { From 665de341f4fc2660a1c0346cb34798350cf54128 Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 14 Jul 2022 13:56:49 -0400 Subject: [PATCH 16/37] RaceConfigScenario: reset, update, resetPlayers --- source/game/system/RaceConfig.cpp | 230 ++---------------------------- source/game/system/RaceConfig.hpp | 3 +- 2 files changed, 13 insertions(+), 220 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 7fbd8ed8c..9a21324d1 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -767,13 +767,6 @@ void RaceConfigPlayer::setPrevFinishPos(s8 pos) { mPrevFinishPos = pos; } void RaceConfigPlayer::setUnkPos(s8 pos) { this->_e0 = pos; } -} // namespace System - -// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif -// Scratch: https://decomp.me/scratch/T0McN -#ifdef NON_MATCHING -namespace System { - void RaceConfigScenario::reset() { mSettings.mItemMode = 0; mSettings.mCpuMode = 1; @@ -782,7 +775,7 @@ void RaceConfigScenario::reset() { mSettings.mModeFlags = mSettings.mModeFlags & 0xFFFFFFF8; for (u8 i = 0; i < 12; i++) { - mPlayers[i].reset(i + 1); + getPlayer(i)->reset(i + 1); } mSettings.mRaceNumber = 0; @@ -790,80 +783,6 @@ void RaceConfigScenario::reset() { } } // namespace System -#else -// Symbol: unk_8052e668 -// PAL: 0x8052e668..0x8052e764 -MARK_BINARY_BLOB(unk_8052e668, 0x8052e668, 0x8052e764); -asm UNKNOWN_FUNCTION(unk_8052e668) { - // clang-format off - nofralloc; - lwz r4, 0xb70(r3); - li r6, 1; - li r0, 2; - li r11, 0; - rlwinm r4, r4, 0, 0, 0x1c; - li r5, 3; - stw r11, 0xb60(r3); - li r12, 0; - stw r6, 0xb5c(r3); - stb r5, 0xb6d(r3); - stw r6, 0xb4c(r3); - stw r4, 0xb70(r3); - mtctr r0; -lbl_8052e69c: - clrlwi r10, r12, 0x18; - addi r0, r12, 2; - mulli r5, r10, 0xf0; - addi r4, r12, 1; - clrlwi r7, r0, 0x18; - addi r0, r12, 3; - add r9, r3, r5; - clrlwi r8, r4, 0x18; - sth r11, 0xe0(r9); - clrlwi r6, r0, 0x18; - addi r4, r12, 4; - addi r0, r12, 5; - sth r11, 0xe6(r9); - clrlwi r5, r4, 0x18; - addi r10, r10, 1; - clrlwi r4, r0, 0x18; - stb r10, 0xe9(r9); - addi r0, r8, 1; - addi r7, r7, 1; - addi r6, r6, 1; - stb r10, 0xe8(r9); - addi r5, r5, 1; - addi r4, r4, 1; - addi r12, r12, 6; - sth r11, 0x1d0(r9); - sth r11, 0x1d6(r9); - stb r0, 0x1d9(r9); - stb r0, 0x1d8(r9); - sth r11, 0x2c0(r9); - sth r11, 0x2c6(r9); - stb r7, 0x2c9(r9); - stb r7, 0x2c8(r9); - sth r11, 0x3b0(r9); - sth r11, 0x3b6(r9); - stb r6, 0x3b9(r9); - stb r6, 0x3b8(r9); - sth r11, 0x4a0(r9); - sth r11, 0x4a6(r9); - stb r5, 0x4a9(r9); - stb r5, 0x4a8(r9); - sth r11, 0x590(r9); - sth r11, 0x596(r9); - stb r4, 0x599(r9); - stb r4, 0x598(r9); - bdnz lbl_8052e69c; - li r4, 0; - li r0, 3; - stb r4, 0xb6c(r3); - stb r0, 0xb6d(r3); - blr; - // clang-format on -} -#endif // Symbol: unk_8052e764 // PAL: 0x8052e764..0x8052e770 @@ -876,9 +795,6 @@ asm UNKNOWN_FUNCTION(unk_8052e764) { // clang-format on } -// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif -// Scratch: https://decomp.me/scratch/NxTL1 -#ifdef NON_MATCHING namespace System { u8 RaceConfigScenario::update() { @@ -889,89 +805,15 @@ u8 RaceConfigScenario::update() { } for (u8 i = 0; i < 12; i++) { - mPlayers[i].mPrevFinishPos = mPlayers[i].mFinishPos; - mPlayers[i].mPreviousScore = mPlayers[i].mGpScore; + RaceConfigPlayer* player = getPlayer(i); + player->mPrevFinishPos = player->mFinishPos; + player->mPreviousScore = player->mGpScore; } return mSettings.mRaceNumber; } } // namespace System -#else -// Symbol: unk_8052e770 -// PAL: 0x8052e770..0x8052e870 -MARK_BINARY_BLOB(unk_8052e770, 0x8052e770, 0x8052e870); -asm UNKNOWN_FUNCTION(unk_8052e770) { - // clang-format off - lbz r4, 0xb6c(r3); - cmplwi r4, 0x64; - bge lbl_8052e788; - addi r0, r4, 1; - stb r0, 0xb6c(r3); - b lbl_8052e790; -lbl_8052e788: - li r0, 0; - stb r0, 0xb6c(r3); -lbl_8052e790: - li r6, 0; - mulli r5, r6, 0xf0; - li r6, 6; - add r4, r3, r5; - lbz r0, 0xea(r4); - mulli r5, r6, 0xf0; - stb r0, 0xe9(r4); - lhz r0, 0xe2(r4); - sth r0, 0xe0(r4); - lbz r0, 0x1da(r4); - stb r0, 0x1d9(r4); - lhz r0, 0x1d2(r4); - sth r0, 0x1d0(r4); - lbz r0, 0x2ca(r4); - stb r0, 0x2c9(r4); - lhz r0, 0x2c2(r4); - sth r0, 0x2c0(r4); - lbz r0, 0x3ba(r4); - stb r0, 0x3b9(r4); - lhz r0, 0x3b2(r4); - sth r0, 0x3b0(r4); - lbz r0, 0x4aa(r4); - stb r0, 0x4a9(r4); - lhz r0, 0x4a2(r4); - sth r0, 0x4a0(r4); - lbz r0, 0x59a(r4); - stb r0, 0x599(r4); - lhz r0, 0x592(r4); - sth r0, 0x590(r4); - add r4, r3, r5; - lbz r0, 0xea(r4); - stb r0, 0xe9(r4); - lhz r0, 0xe2(r4); - sth r0, 0xe0(r4); - lbz r0, 0x1da(r4); - stb r0, 0x1d9(r4); - lhz r0, 0x1d2(r4); - sth r0, 0x1d0(r4); - lbz r0, 0x2ca(r4); - stb r0, 0x2c9(r4); - lhz r0, 0x2c2(r4); - sth r0, 0x2c0(r4); - lbz r0, 0x3ba(r4); - stb r0, 0x3b9(r4); - lhz r0, 0x3b2(r4); - sth r0, 0x3b0(r4); - lbz r0, 0x4aa(r4); - stb r0, 0x4a9(r4); - lhz r0, 0x4a2(r4); - sth r0, 0x4a0(r4); - lbz r0, 0x59a(r4); - stb r0, 0x599(r4); - lhz r0, 0x592(r4); - sth r0, 0x590(r4); - lbz r3, 0xb6c(r3); - blr; - // clang-format on -} -#endif // Symbol: unk_8052e870 // PAL: 0x8052e870..0x8052e950 @@ -1566,71 +1408,21 @@ asm UNKNOWN_FUNCTION(unk_8052eef0) { } #endif -// https://media.discordapp.net/attachments/727908905828483073/991961345715077190/regswap.gif -// Scratch: https://decomp.me/scratch/U5rl1 -#ifdef NON_MATCHING namespace System { void RaceConfigScenario::resetPlayers() { for (u8 i = 0; i < 12; i++) { - mPlayers[i].mLocalPlayerNum = -1; - mPlayers[i].mPlayerInputIdx = -1; + RaceConfigPlayer* player = getPlayer(i); + player->mLocalPlayerNum = -1; + player->mPlayerInputIdx = -1; } - mSettings.mHudPlayerIds[0] = -1; - mSettings.mHudPlayerIds[1] = -1; - mSettings.mHudPlayerIds[2] = -1; - mSettings.mHudPlayerIds[3] = -1; + for (u8 i = 0; i < 4; i++) { + mSettings.mHudPlayerIds[i] = -1; + } } } // namespace System -#else -// Symbol: resetPlayers__Q26System18RaceConfigScenarioFv -// PAL: 0x8052efd4..0x8052f064 -MARK_BINARY_BLOB(resetPlayers__Q26System18RaceConfigScenarioFv, 0x8052efd4, - 0x8052f064); -asm UNKNOWN_FUNCTION(resetPlayers__Q26System18RaceConfigScenarioFv) { - // clang-format off - nofralloc; - li r6, 0; - li r0, -1; - mulli r5, r6, 0xf0; - li r6, 6; - add r4, r3, r5; - stb r0, 0xd(r4); - mulli r5, r6, 0xf0; - stb r0, 0xe(r4); - stb r0, 0xfd(r4); - stb r0, 0xfe(r4); - stb r0, 0x1ed(r4); - stb r0, 0x1ee(r4); - stb r0, 0x2dd(r4); - stb r0, 0x2de(r4); - stb r0, 0x3cd(r4); - stb r0, 0x3ce(r4); - stb r0, 0x4bd(r4); - stb r0, 0x4be(r4); - add r4, r3, r5; - stb r0, 0xd(r4); - stb r0, 0xe(r4); - stb r0, 0xfd(r4); - stb r0, 0xfe(r4); - stb r0, 0x1ed(r4); - stb r0, 0x1ee(r4); - stb r0, 0x2dd(r4); - stb r0, 0x2de(r4); - stb r0, 0x3cd(r4); - stb r0, 0x3ce(r4); - stb r0, 0x4bd(r4); - stb r0, 0x4be(r4); - stb r0, 0xb64(r3); - stb r0, 0xb65(r3); - stb r0, 0xb66(r3); - stb r0, 0xb67(r3); - blr; - // clang-format on -} -#endif // Symbol: unk_8052f064 // PAL: 0x8052f064..0x8052f1e0 @@ -4959,7 +4751,7 @@ void RaceConfig::setGhost(RawGhostFile* ghost) { } s8 RaceConfig::getHudPlayerId(u8 playerIdx) { - return mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; + return (s8)(u8)mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; } } // namespace System diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 1231e4ebd..d0f1d5696 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -197,7 +197,7 @@ struct RaceConfigSettings { u32 mBattleType; u32 mCpuMode; u32 mItemMode; - u8 mHudPlayerIds[4]; + s8 mHudPlayerIds[4]; s32 mCupId; // TODO: create enum u8 mRaceNumber; u8 mLapCount; @@ -210,6 +210,7 @@ class RaceConfigScenario { public: RaceConfigScenario(RawGhostFile* ghost); virtual ~RaceConfigScenario(); + RaceConfigPlayer* getPlayer(u8 idx) { return &mPlayers[idx]; } void reset(); u8 update(); void resetPlayers(); From 6af0548195813c26f2de274517355cd327f7aab2 Mon Sep 17 00:00:00 2001 From: vabold Date: Fri, 15 Jul 2022 14:46:59 -0400 Subject: [PATCH 17/37] RaceConfig: update, class inheritence fix --- source/game/system/RaceConfig.cpp | 123 +++++------------------------- source/game/system/RaceConfig.hpp | 31 +++++--- 2 files changed, 39 insertions(+), 115 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 9a21324d1..564331038 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -2691,6 +2691,16 @@ asm UNKNOWN_FUNCTION(RacedataScenario_destroy) { // clang-format on } +// Requires rodata from unk_8052e870 and unk_8052fa0c first +#ifdef NON_MATCHING +namespace System { + +RaceConfig::RaceConfig() + : ParameterFile("/boot/menuset.prm", 0), mRaceScenario(&mGhosts[0]), + mMenuScenario(&mGhosts[1]), mAwardsScenario(nullptr) {} + +} // namespace System +#else // Symbol: Racedata_construct // PAL: 0x8053015c..0x805302c4 MARK_BINARY_BLOB(Racedata_construct, 0x8053015c, 0x805302c4); @@ -2790,6 +2800,7 @@ asm UNKNOWN_FUNCTION(Racedata_construct) { blr; // clang-format on } +#endif // Symbol: Racedata_initRace // PAL: 0x805302c4..0x805305ac @@ -4561,89 +4572,11 @@ asm UNKNOWN_FUNCTION(Racedata_initCredits) { // clang-format on } -// Relies on regswap fix for RaceConfigScenario::update() -#ifdef NON_MATCHING namespace System { u8 RaceConfig::update() { return mMenuScenario.update(); } } // namespace System -#else -// Symbol: Racedata_updateEndOfRace -// PAL: 0x80531ce4..0x80531de4 -MARK_BINARY_BLOB(Racedata_updateEndOfRace, 0x80531ce4, 0x80531de4); -asm UNKNOWN_FUNCTION(Racedata_updateEndOfRace) { - // clang-format off - nofralloc; - lbz r4, 0x177c(r3); - cmplwi r4, 0x64; - bge lbl_80531cfc; - addi r0, r4, 1; - stb r0, 0x177c(r3); - b lbl_80531d04; -lbl_80531cfc: - li r0, 0; - stb r0, 0x177c(r3); -lbl_80531d04: - li r6, 0; - mulli r5, r6, 0xf0; - li r6, 6; - add r4, r3, r5; - lbz r0, 0xcfa(r4); - mulli r5, r6, 0xf0; - stb r0, 0xcf9(r4); - lhz r0, 0xcf2(r4); - sth r0, 0xcf0(r4); - lbz r0, 0xdea(r4); - stb r0, 0xde9(r4); - lhz r0, 0xde2(r4); - sth r0, 0xde0(r4); - lbz r0, 0xeda(r4); - stb r0, 0xed9(r4); - lhz r0, 0xed2(r4); - sth r0, 0xed0(r4); - lbz r0, 0xfca(r4); - stb r0, 0xfc9(r4); - lhz r0, 0xfc2(r4); - sth r0, 0xfc0(r4); - lbz r0, 0x10ba(r4); - stb r0, 0x10b9(r4); - lhz r0, 0x10b2(r4); - sth r0, 0x10b0(r4); - lbz r0, 0x11aa(r4); - stb r0, 0x11a9(r4); - lhz r0, 0x11a2(r4); - sth r0, 0x11a0(r4); - add r4, r3, r5; - lbz r0, 0xcfa(r4); - stb r0, 0xcf9(r4); - lhz r0, 0xcf2(r4); - sth r0, 0xcf0(r4); - lbz r0, 0xdea(r4); - stb r0, 0xde9(r4); - lhz r0, 0xde2(r4); - sth r0, 0xde0(r4); - lbz r0, 0xeda(r4); - stb r0, 0xed9(r4); - lhz r0, 0xed2(r4); - sth r0, 0xed0(r4); - lbz r0, 0xfca(r4); - stb r0, 0xfc9(r4); - lhz r0, 0xfc2(r4); - sth r0, 0xfc0(r4); - lbz r0, 0x10ba(r4); - stb r0, 0x10b9(r4); - lhz r0, 0x10b2(r4); - sth r0, 0x10b0(r4); - lbz r0, 0x11aa(r4); - stb r0, 0x11a9(r4); - lhz r0, 0x11a2(r4); - sth r0, 0x11a0(r4); - lbz r3, 0x177c(r3); - blr; - // clang-format on -} -#endif // Symbol: unk_80531de4 // PAL: 0x80531de4..0x80531f18 @@ -4847,35 +4780,15 @@ asm UNKNOWN_FUNCTION(Racedata_isTimeAttackReplay) { // clang-format on } -// Symbol: unk_80532070 -// PAL: 0x80532070..0x80532074 -MARK_BINARY_BLOB(unk_80532070, 0x80532070, 0x80532074); -asm UNKNOWN_FUNCTION(unk_80532070) { - // clang-format off - nofralloc; - blr; - // clang-format on -} +namespace System { -// Symbol: unk_80532074 -// PAL: 0x80532074..0x80532078 -MARK_BINARY_BLOB(unk_80532074, 0x80532074, 0x80532078); -asm UNKNOWN_FUNCTION(unk_80532074) { - // clang-format off - nofralloc; - blr; - // clang-format on -} +void RaceConfig::vf18() {} -// Symbol: unk_80532078 -// PAL: 0x80532078..0x8053207c -MARK_BINARY_BLOB(unk_80532078, 0x80532078, 0x8053207c); -asm UNKNOWN_FUNCTION(unk_80532078) { - // clang-format off - nofralloc; - blr; - // clang-format on -} +void RaceConfig::vf14() {} + +void RaceConfig::vf10() {} + +} // namespace System // Symbol: unk_8053207c // PAL: 0x8053207c..0x80532084 diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index d0f1d5696..bf1949fb7 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -228,34 +228,40 @@ class RaceConfigScenario { // These will be important later class RaceScenario : public RaceConfigScenario { public: + RaceScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} RaceConfigPlayer* getPlayer(u8 idx); BattleTeam computeWinningTeam(); }; class MenuScenario : public RaceConfigScenario { public: + MenuScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} RaceConfigPlayer* getPlayer(u8 idx); s32 getGametype(); bool initGhost(u8 playerIdx, u8 playerInputIdx); u32 getModeFlag(); }; -class AwardsScenario : public RaceConfigScenario {}; +class AwardsScenario : public RaceConfigScenario { +public: + AwardsScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} +}; -class RaceConfigMain { +class RaceConfigEx { public: - RaceConfigMain(); + inline RaceConfigEx() {} +}; - // Things get tricky here - we have a vtable with no virtual functions - void* vtable; - RaceScenario mRaceScenario; - MenuScenario mMenuScenario; - AwardsScenario mAwardsScenario; - RawGhostFile mGhosts[2]; +class RaceConfigEx2 { +public: + inline RaceConfigEx2() {} }; -class RaceConfig : public ParameterFile, public RaceConfigMain { +class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { public: RaceConfig(); virtual ~RaceConfig(); + virtual void vf10(); + virtual void vf14(); + virtual void vf18(); static u8 getRacePlayerCount(); u8 update(); s32 getLocalPlayerCount(u8 playerIdx); @@ -263,6 +269,11 @@ class RaceConfig : public ParameterFile, public RaceConfigMain { s8 getHudPlayerId(u8 playerIdx); static RaceConfig* spInstance; + + RaceScenario mRaceScenario; + MenuScenario mMenuScenario; + AwardsScenario mAwardsScenario; + RawGhostFile mGhosts[2]; }; } // namespace System From 53567f8173fb61fb0388ccee459545c0b74c0d78 Mon Sep 17 00:00:00 2001 From: vabold Date: Sat, 16 Jul 2022 17:04:53 -0400 Subject: [PATCH 18/37] MenuScenario: computePlayerCounts --- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 193 ++++++++++-------------------- source/game/system/RaceConfig.hpp | 3 +- 3 files changed, 69 insertions(+), 129 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 62178da31..ff62ba2d9 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9743,7 +9743,7 @@ 0x8052f064 unk_8052f064 0x8052f1e0 RacedataScenario_copyPrevPositions 0x8052f4e8 RacedataScenario_initControllers -0x8052f788 RacedataScenario_computePlayerCounts +0x8052f788 computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc 0x8052f924 RacedataScenario_initRng 0x8052fa0c unk_8052fa0c 0x8052fb90 RacedataScenario_initRace diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 564331038..77563465e 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -1944,134 +1944,73 @@ asm UNKNOWN_FUNCTION(RacedataScenario_initControllers) { // clang-format on } -// Symbol: RacedataScenario_computePlayerCounts -// PAL: 0x8052f788..0x8052f924 -MARK_BINARY_BLOB(RacedataScenario_computePlayerCounts, 0x8052f788, 0x8052f924); -asm UNKNOWN_FUNCTION(RacedataScenario_computePlayerCounts) { - // clang-format off - nofralloc; - li r0, 3; - li r8, 0; - li r9, 0; - li r10, 0; - li r11, 0; - mtctr r0; -lbl_8052f7a0: - clrlwi r0, r11, 0x18; - mulli r0, r0, 0xf0; - add r7, r3, r0; - lwz r0, 0x18(r7); - cmpwi r0, 5; - beq lbl_8052f7d8; - cmpwi r0, 0; - addi r8, r8, 1; - bne lbl_8052f7d8; - cmplwi r9, 4; - bge lbl_8052f7d4; - addi r0, r9, 1; - clrlwi r9, r0, 0x18; -lbl_8052f7d4: - addi r10, r10, 1; -lbl_8052f7d8: - addi r11, r11, 1; - clrlwi r0, r11, 0x18; - mulli r0, r0, 0xf0; - add r7, r3, r0; - lwz r0, 0x18(r7); - cmpwi r0, 5; - beq lbl_8052f814; - cmpwi r0, 0; - addi r8, r8, 1; - bne lbl_8052f814; - cmplwi r9, 4; - bge lbl_8052f810; - addi r0, r9, 1; - clrlwi r9, r0, 0x18; -lbl_8052f810: - addi r10, r10, 1; -lbl_8052f814: - addi r11, r11, 1; - clrlwi r0, r11, 0x18; - mulli r0, r0, 0xf0; - add r7, r3, r0; - lwz r0, 0x18(r7); - cmpwi r0, 5; - beq lbl_8052f850; - cmpwi r0, 0; - addi r8, r8, 1; - bne lbl_8052f850; - cmplwi r9, 4; - bge lbl_8052f84c; - addi r0, r9, 1; - clrlwi r9, r0, 0x18; -lbl_8052f84c: - addi r10, r10, 1; -lbl_8052f850: - addi r11, r11, 1; - clrlwi r0, r11, 0x18; - mulli r0, r0, 0xf0; - add r7, r3, r0; - lwz r0, 0x18(r7); - cmpwi r0, 5; - beq lbl_8052f88c; - cmpwi r0, 0; - addi r8, r8, 1; - bne lbl_8052f88c; - cmplwi r9, 4; - bge lbl_8052f888; - addi r0, r9, 1; - clrlwi r9, r0, 0x18; -lbl_8052f888: - addi r10, r10, 1; -lbl_8052f88c: - addi r11, r11, 1; - bdnz lbl_8052f7a0; - cmpwi r9, 0; - bne lbl_8052f8a0; - li r9, 1; -lbl_8052f8a0: - cmplwi r9, 3; - bne lbl_8052f8ac; - li r9, 4; -lbl_8052f8ac: - lwz r7, 0xb54(r3); - cmpwi r7, 2; - bne lbl_8052f8c0; - li r9, 1; - b lbl_8052f8dc; -lbl_8052f8c0: - cmpwi r7, 3; - bne lbl_8052f8d0; - li r9, 2; - b lbl_8052f8dc; -lbl_8052f8d0: - cmpwi r7, 4; - bne lbl_8052f8dc; - li r9, 4; -lbl_8052f8dc: - lwz r0, 0xb50(r3); - cmpwi r0, 0xb; - bne lbl_8052f914; - cmpwi r7, 7; - bne lbl_8052f904; - clrlwi r0, r8, 0x18; - cmplwi r0, 3; - ble lbl_8052f914; - li r8, 3; - b lbl_8052f914; -lbl_8052f904: - clrlwi r0, r8, 0x18; - cmplwi r0, 6; - ble lbl_8052f914; - li r8, 6; -lbl_8052f914: - stb r8, 0(r4); - stb r9, 0(r5); - stb r10, 0(r6); - blr; - // clang-format on +namespace System { + +void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, + u8* localPlayerCount) { + u8 playerCount_ = 0; + u8 hudCount_ = 0; + u8 localPlayerCount_ = 0; + + for (u8 i = 0; i < 12; i++) { + const s32 playerType = mPlayers[i].mPlayerType; + + // Check if player exists + if (playerType == 5) { + continue; + } + playerCount_++; + + // Check if player is local + if (playerType != 0) { + continue; + } + + // Increment HUD count + if (hudCount_ < 4) { + hudCount_++; + } + + localPlayerCount_++; + } + + // Correct HUD counts + if (hudCount_ == 0) { + hudCount_ = 1; + } + if (hudCount_ == 3) { + hudCount_ = 4; + } + + // Set HUD count based on menu game type + const s32 gameType = mSettings.mGameType; + if (gameType == 2) { + hudCount_ = 1; + } else if (gameType == 3) { + hudCount_ = 2; + } else if (gameType == 4) { + hudCount_ = 4; + } + + // Cap player count on awards + if (mSettings.mGameMode == 11) { + if (gameType == 7) { + // Cap player count on GP win + if (3 < playerCount_) { + playerCount_ = 3; + } + } else if (6 < playerCount_) { + playerCount_ = 6; + } + } + + *playerCount = playerCount_; + *hudCount = hudCount_; + *localPlayerCount = localPlayerCount_; } +} // namespace System + // Symbol: RacedataScenario_initRng // PAL: 0x8052f924..0x8052fa0c MARK_BINARY_BLOB(RacedataScenario_initRng, 0x8052f924, 0x8052fa0c); @@ -2323,7 +2262,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_initRace) { stb r0, 0xb65(r29); stb r0, 0xb66(r29); stb r0, 0xb67(r29); - bl RacedataScenario_computePlayerCounts; + bl computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc; lwz r0, 0xb54(r29); lbz r31, 9(r1); cmpwi r0, 5; diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index bf1949fb7..a1da89662 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -75,7 +75,7 @@ UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions); // PAL: 0x8052f4e8..0x8052f788 UNKNOWN_FUNCTION(RacedataScenario_initControllers); // PAL: 0x8052f788..0x8052f924 -UNKNOWN_FUNCTION(RacedataScenario_computePlayerCounts); +UNKNOWN_FUNCTION(computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc); // PAL: 0x8052f924..0x8052fa0c UNKNOWN_FUNCTION(RacedataScenario_initRng); // PAL: 0x8052fa0c..0x8052fb90 @@ -238,6 +238,7 @@ class MenuScenario : public RaceConfigScenario { RaceConfigPlayer* getPlayer(u8 idx); s32 getGametype(); bool initGhost(u8 playerIdx, u8 playerInputIdx); + void computePlayerCounts(u8* playerCount, u8* hudCount, u8* localPlayerCount); u32 getModeFlag(); }; class AwardsScenario : public RaceConfigScenario { From b7adf349901294b908715f412ea01901aeb80f34 Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 19 Jul 2022 12:23:49 -0400 Subject: [PATCH 19/37] Mii: better infrastructure --- source/game/system/Mii.hpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/source/game/system/Mii.hpp b/source/game/system/Mii.hpp index 1e18b25c2..5c7b25811 100644 --- a/source/game/system/Mii.hpp +++ b/source/game/system/Mii.hpp @@ -21,6 +21,10 @@ struct unkStruct { u8 x3; }; +struct MiiId { + u8 _00[0x8 - 0x0]; +}; + class Mii { public: Mii(s32 num) { init(num); } @@ -30,14 +34,29 @@ class Mii { u8 _8; s8 _9; s32 _C; - unk8 _10[0x60 - 0x10]; - unkStruct _60; + RawMii mRaw; + unk32 _5C; + unkStruct _60; // almost certainly a color struct s32 _64; - u8 _68[0xa4 - 0x68]; + char mName[20]; + unk32 _7C; + unk32 _80; + unk32 _84; + unk32 _88; + unk32 _8C; + unk32 _90; + MiiId mId; + unk32 _9C; + unk32 _A0; u8 _A4; u8 _A5; u8 _A6; - unk8 _[0xb8 - 0xA7]; + unk32 _A8; + unk8 _AC; + unk8 _AD; + unk8 _AE; + unk32 _B0; + unk32 _B4; }; } // namespace System From 07bce3866f664621463bb58782d4fdc6a476ee45 Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 19 Jul 2022 21:36:49 -0400 Subject: [PATCH 20/37] RaceConfig: reset, scratches --- source/game/system/RaceConfig.cpp | 172 +++++++----------------------- source/game/system/RaceConfig.hpp | 1 + 2 files changed, 37 insertions(+), 136 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 77563465e..d19db0f70 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -147,6 +147,7 @@ u8 RaceConfig::getRacePlayerCount() { // Symbol: Racedata_init // PAL: 0x8052dd40..0x8052e42c +// Scratch: https://decomp.me/scratch/c7cMM MARK_BINARY_BLOB(Racedata_init, 0x8052dd40, 0x8052e42c); asm UNKNOWN_FUNCTION(Racedata_init) { // clang-format off @@ -618,144 +619,11 @@ void RaceConfigPlayer::setPlayerType(s32 playerType) { mPlayerType = playerType; } -} // namespace System - -// Symbol: Racedata_resetSomeStuff -// PAL: 0x8052e454..0x8052e658 -MARK_BINARY_BLOB(Racedata_resetSomeStuff, 0x8052e454, 0x8052e640); -asm UNKNOWN_FUNCTION(Racedata_resetSomeStuff) { - // clang-format off - nofralloc; - lwz r4, 0x1780(r3); - li r6, 1; - li r0, 2; - li r11, 0; - rlwinm r4, r4, 0, 0, 0x1c; - li r5, 3; - stw r11, 0x1770(r3); - li r12, 0; - stw r6, 0x176c(r3); - stb r5, 0x177d(r3); - stw r6, 0x175c(r3); - stw r4, 0x1780(r3); - mtctr r0; -lbl_8052e488: - clrlwi r10, r12, 0x18; - addi r0, r12, 2; - mulli r5, r10, 0xf0; - addi r4, r12, 1; - clrlwi r7, r0, 0x18; - addi r0, r12, 3; - add r9, r3, r5; - clrlwi r8, r4, 0x18; - sth r11, 0xcf0(r9); - clrlwi r6, r0, 0x18; - addi r4, r12, 4; - addi r0, r12, 5; - sth r11, 0xcf6(r9); - clrlwi r5, r4, 0x18; - addi r10, r10, 1; - clrlwi r4, r0, 0x18; - stb r10, 0xcf9(r9); - addi r0, r8, 1; - addi r7, r7, 1; - addi r6, r6, 1; - stb r10, 0xcf8(r9); - addi r5, r5, 1; - addi r4, r4, 1; - addi r12, r12, 6; - sth r11, 0xde0(r9); - sth r11, 0xde6(r9); - stb r0, 0xde9(r9); - stb r0, 0xde8(r9); - sth r11, 0xed0(r9); - sth r11, 0xed6(r9); - stb r7, 0xed9(r9); - stb r7, 0xed8(r9); - sth r11, 0xfc0(r9); - sth r11, 0xfc6(r9); - stb r6, 0xfc9(r9); - stb r6, 0xfc8(r9); - sth r11, 0x10b0(r9); - sth r11, 0x10b6(r9); - stb r5, 0x10b9(r9); - stb r5, 0x10b8(r9); - sth r11, 0x11a0(r9); - sth r11, 0x11a6(r9); - stb r4, 0x11a9(r9); - stb r4, 0x11a8(r9); - bdnz lbl_8052e488; - lwz r4, 0x2370(r3); - li r11, 0; - li r0, 2; - li r6, 3; - li r5, 1; - rlwinm r4, r4, 0, 0, 0x1c; - stb r11, 0x177c(r3); - li r12, 0; - stb r6, 0x177d(r3); - stw r11, 0x2360(r3); - stw r5, 0x235c(r3); - stb r6, 0x236d(r3); - stw r5, 0x234c(r3); - stw r4, 0x2370(r3); - mtctr r0; -lbl_8052e578: - clrlwi r10, r12, 0x18; - addi r0, r12, 2; - mulli r5, r10, 0xf0; - addi r4, r12, 1; - clrlwi r7, r0, 0x18; - addi r0, r12, 3; - add r9, r3, r5; - clrlwi r8, r4, 0x18; - sth r11, 0x18e0(r9); - clrlwi r6, r0, 0x18; - addi r4, r12, 4; - addi r0, r12, 5; - sth r11, 0x18e6(r9); - clrlwi r5, r4, 0x18; - addi r10, r10, 1; - clrlwi r4, r0, 0x18; - stb r10, 0x18e9(r9); - addi r0, r8, 1; - addi r7, r7, 1; - addi r6, r6, 1; - stb r10, 0x18e8(r9); - addi r5, r5, 1; - addi r4, r4, 1; - addi r12, r12, 6; - sth r11, 0x19d0(r9); - sth r11, 0x19d6(r9); - stb r0, 0x19d9(r9); - stb r0, 0x19d8(r9); - sth r11, 0x1ac0(r9); - sth r11, 0x1ac6(r9); - stb r7, 0x1ac9(r9); - stb r7, 0x1ac8(r9); - sth r11, 0x1bb0(r9); - sth r11, 0x1bb6(r9); - stb r6, 0x1bb9(r9); - stb r6, 0x1bb8(r9); - sth r11, 0x1ca0(r9); - sth r11, 0x1ca6(r9); - stb r5, 0x1ca9(r9); - stb r5, 0x1ca8(r9); - sth r11, 0x1d90(r9); - sth r11, 0x1d96(r9); - stb r4, 0x1d99(r9); - stb r4, 0x1d98(r9); - bdnz lbl_8052e578; - li r4, 0; - li r0, 3; - stb r4, 0x236c(r3); - stb r0, 0x236d(r3); - blr; - // clang-format on +void RaceConfig::reset() { + mMenuScenario.reset(); + mAwardsScenario.reset(); } -namespace System { - void RaceConfigPlayer::reset(s8 pos) { mPreviousScore = 0; mGpRankScore = 0; @@ -817,6 +685,7 @@ u8 RaceConfigScenario::update() { // Symbol: unk_8052e870 // PAL: 0x8052e870..0x8052e950 +// Scratch: https://decomp.me/scratch/SvbY2 MARK_BINARY_BLOB(unk_8052e870, 0x8052e870, 0x8052e950); asm UNKNOWN_FUNCTION(unk_8052e870) { // clang-format off @@ -885,6 +754,7 @@ asm UNKNOWN_FUNCTION(unk_8052e870) { // Symbol: unk_8052e950 // PAL: 0x8052e950..0x8052ed18 +// Scratch: https://decomp.me/scratch/AQNbc MARK_BINARY_BLOB(unk_8052e950, 0x8052e950, 0x8052ed18); asm UNKNOWN_FUNCTION(unk_8052e950) { // clang-format off @@ -1173,6 +1043,7 @@ s32 RaceConfigPlayer::getPlayerType() { return mPlayerType; } // Symbol: RacedataScenario_postInitControllers // PAL: 0x8052ed28..0x8052eef0 +// Scratch: https://decomp.me/scratch/aw5WV MARK_BINARY_BLOB(RacedataScenario_postInitControllers, 0x8052ed28, 0x8052eef0); asm UNKNOWN_FUNCTION(RacedataScenario_postInitControllers) { // clang-format off @@ -1426,6 +1297,7 @@ void RaceConfigScenario::resetPlayers() { // Symbol: unk_8052f064 // PAL: 0x8052f064..0x8052f1e0 +// Scratch: https://decomp.me/scratch/ANzFM MARK_BINARY_BLOB(unk_8052f064, 0x8052f064, 0x8052f1e0); asm UNKNOWN_FUNCTION(unk_8052f064) { // clang-format off @@ -1535,6 +1407,7 @@ asm UNKNOWN_FUNCTION(unk_8052f064) { // Symbol: RacedataScenario_copyPrevPositions // PAL: 0x8052f1e0..0x8052f4e8 +// Scratch: https://decomp.me/scratch/w7jKr MARK_BINARY_BLOB(RacedataScenario_copyPrevPositions, 0x8052f1e0, 0x8052f4e8); asm UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions) { // clang-format off @@ -1752,6 +1625,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions) { // Symbol: RacedataScenario_initControllers // PAL: 0x8052f4e8..0x8052f788 +// Scratch: https://decomp.me/scratch/V2Pce MARK_BINARY_BLOB(RacedataScenario_initControllers, 0x8052f4e8, 0x8052f788); asm UNKNOWN_FUNCTION(RacedataScenario_initControllers) { // clang-format off @@ -2013,6 +1887,7 @@ void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, // Symbol: RacedataScenario_initRng // PAL: 0x8052f924..0x8052fa0c +// Scratch: https://decomp.me/scratch/Y23JS MARK_BINARY_BLOB(RacedataScenario_initRng, 0x8052f924, 0x8052fa0c); asm UNKNOWN_FUNCTION(RacedataScenario_initRng) { // clang-format off @@ -2086,6 +1961,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_initRng) { // Symbol: unk_8052fa0c // PAL: 0x8052fa0c..0x8052fb90 +// Scratch: https://decomp.me/scratch/UHaS4 MARK_BINARY_BLOB(unk_8052fa0c, 0x8052fa0c, 0x8052fb90); asm UNKNOWN_FUNCTION(unk_8052fa0c) { // clang-format off @@ -2199,6 +2075,7 @@ asm UNKNOWN_FUNCTION(unk_8052fa0c) { // Symbol: RacedataScenario_initRace // PAL: 0x8052fb90..0x8052fe58 +// Scratch: https://decomp.me/scratch/omAC0 MARK_BINARY_BLOB(RacedataScenario_initRace, 0x8052fb90, 0x8052fe58); asm UNKNOWN_FUNCTION(RacedataScenario_initRace) { // clang-format off @@ -2394,6 +2271,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_initRace) { // Symbol: Racedata_initStaticInstance // PAL: 0x8052fe58..0x8052ffe8 +// Scratch: N/A (trivial to match when RaceConfig ctor matches) MARK_BINARY_BLOB(Racedata_initStaticInstance, 0x8052fe58, 0x8052ffe8); asm UNKNOWN_FUNCTION(Racedata_initStaticInstance) { // clang-format off @@ -2506,6 +2384,7 @@ asm UNKNOWN_FUNCTION(Racedata_initStaticInstance) { // Symbol: Racedata_destroyStaticInstance // PAL: 0x8052ffe8..0x80530038 +// Scratch: https://decomp.me/scratch/sGUYR MARK_BINARY_BLOB(Racedata_destroyStaticInstance, 0x8052ffe8, 0x80530038); asm UNKNOWN_FUNCTION(Racedata_destroyStaticInstance) { // clang-format off @@ -2536,6 +2415,7 @@ asm UNKNOWN_FUNCTION(Racedata_destroyStaticInstance) { // Symbol: Racedata_destroy // PAL: 0x80530038..0x805300f4 +// Scratch: https://decomp.me/scratch/Fhjji MARK_BINARY_BLOB(Racedata_destroy, 0x80530038, 0x805300f4); asm UNKNOWN_FUNCTION(Racedata_destroy) { // clang-format off @@ -2594,6 +2474,14 @@ asm UNKNOWN_FUNCTION(Racedata_destroy) { // clang-format on } +// Requires RaceConfigPlayer vtable +#ifdef NON_MATCHING +namespace System { + +RaceConfigScenario::~RaceConfigScenario() {} + +} // namespace System +#else // Symbol: RacedataScenario_destroy // PAL: 0x805300f4..0x8053015c MARK_BINARY_BLOB(RacedataScenario_destroy, 0x805300f4, 0x8053015c); @@ -2629,8 +2517,10 @@ asm UNKNOWN_FUNCTION(RacedataScenario_destroy) { blr; // clang-format on } +#endif // Requires rodata from unk_8052e870 and unk_8052fa0c first +// Also may be a complete non-match #ifdef NON_MATCHING namespace System { @@ -2642,6 +2532,7 @@ RaceConfig::RaceConfig() #else // Symbol: Racedata_construct // PAL: 0x8053015c..0x805302c4 +// Scratch: https://decomp.me/scratch/ZyQzz MARK_BINARY_BLOB(Racedata_construct, 0x8053015c, 0x805302c4); asm UNKNOWN_FUNCTION(Racedata_construct) { // clang-format off @@ -2743,6 +2634,7 @@ asm UNKNOWN_FUNCTION(Racedata_construct) { // Symbol: Racedata_initRace // PAL: 0x805302c4..0x805305ac +// Scratch: https://decomp.me/scratch/2bYoM MARK_BINARY_BLOB(Racedata_initRace, 0x805302c4, 0x805305ac); asm UNKNOWN_FUNCTION(Racedata_initRace) { // clang-format off @@ -2941,6 +2833,7 @@ asm UNKNOWN_FUNCTION(Racedata_initRace) { // Symbol: RacedataScenario_copy // PAL: 0x805305ac..0x80530864 +// Scratch: https://decomp.me/scratch/10rsj MARK_BINARY_BLOB(RacedataScenario_copy, 0x805305ac, 0x80530864); asm UNKNOWN_FUNCTION(RacedataScenario_copy) { // clang-format off @@ -3127,6 +3020,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_copy) { // Symbol: Racedata_initAwards // PAL: 0x80530864..0x80530f0c +// Scratch: https://decomp.me/scratch/y64A8 MARK_BINARY_BLOB(Racedata_initAwards, 0x80530864, 0x80530f0c); asm UNKNOWN_FUNCTION(Racedata_initAwards) { // clang-format off @@ -3596,6 +3490,7 @@ VehicleId RaceConfigPlayer::getVehicle() { return mVehicleId; } // Symbol: unk_80530f30 // PAL: 0x80530f30..0x80531068 +// Scratch: https://decomp.me/scratch/7sJZl MARK_BINARY_BLOB(unk_80530f30, 0x80530f30, 0x80531068); asm UNKNOWN_FUNCTION(unk_80530f30) { // clang-format off @@ -3690,6 +3585,7 @@ Mii* RaceConfigPlayer::getMii() { return &mMii; } // Symbol: Racedata_initCredits // PAL: 0x80531070..0x80531ce4 +// Scratch: https://decomp.me/scratch/wyhhV MARK_BINARY_BLOB(Racedata_initCredits, 0x80531070, 0x80531ce4); asm UNKNOWN_FUNCTION(Racedata_initCredits) { // clang-format off @@ -4519,6 +4415,7 @@ u8 RaceConfig::update() { return mMenuScenario.update(); } // Symbol: unk_80531de4 // PAL: 0x80531de4..0x80531f18 +// Scratch: https://decomp.me/scratch/kUMDQ MARK_BINARY_BLOB(unk_80531de4, 0x80531de4, 0x80531f18); asm UNKNOWN_FUNCTION(unk_80531de4) { // clang-format off @@ -4630,6 +4527,7 @@ s8 RaceConfig::getHudPlayerId(u8 playerIdx) { // Symbol: unk_80531f80 // PAL: 0x80531f80..0x80531fc8 +// Scratch: https://decomp.me/scratch/xgmJ3 MARK_BINARY_BLOB(unk_80531f80, 0x80531f80, 0x80531fc8); asm UNKNOWN_FUNCTION(unk_80531f80) { // clang-format off @@ -4657,6 +4555,7 @@ asm UNKNOWN_FUNCTION(unk_80531f80) { // Symbol: unk_80531fc8 // PAL: 0x80531fc8..0x80532030 +// Scratch: https://decomp.me/scratch/7aPIN MARK_BINARY_BLOB(unk_80531fc8, 0x80531fc8, 0x80532030); asm UNKNOWN_FUNCTION(unk_80531fc8) { // clang-format off @@ -4695,6 +4594,7 @@ asm UNKNOWN_FUNCTION(unk_80531fc8) { // Symbol: Racedata_isTimeAttackReplay // PAL: 0x80532030..0x80532070 +// Scratch: https://decomp.me/scratch/Ai9Da MARK_BINARY_BLOB(Racedata_isTimeAttackReplay, 0x80532030, 0x80532070); asm UNKNOWN_FUNCTION(Racedata_isTimeAttackReplay) { // clang-format off diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index a1da89662..38f77c453 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -263,6 +263,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { virtual void vf10(); virtual void vf14(); virtual void vf18(); + void reset(); static u8 getRacePlayerCount(); u8 update(); s32 getLocalPlayerCount(u8 playerIdx); From cf17efad0e62628083dd36dc4621d8a6d0747b7b Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 19 Jul 2022 22:00:09 -0400 Subject: [PATCH 21/37] RaceConfig: isTimeAttackReplay --- source/game/system/RaceConfig.cpp | 37 +++++++++---------------------- source/game/system/RaceConfig.hpp | 1 + 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index d19db0f70..402e25261 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -4592,35 +4592,18 @@ asm UNKNOWN_FUNCTION(unk_80531fc8) { // clang-format on } -// Symbol: Racedata_isTimeAttackReplay -// PAL: 0x80532030..0x80532070 -// Scratch: https://decomp.me/scratch/Ai9Da -MARK_BINARY_BLOB(Racedata_isTimeAttackReplay, 0x80532030, 0x80532070); -asm UNKNOWN_FUNCTION(Racedata_isTimeAttackReplay) { - // clang-format off - nofralloc; - lwz r0, 0xb70(r3); - li r3, 0; - cmpwi r0, 2; - beq lbl_80532048; - cmpwi r0, 5; - bnelr; -lbl_80532048: - lis r4, 0; - lwz r4, 0(r4); - lbz r0, 0x24(r4); - cmpwi r0, 0; - beqlr; - lwz r0, 0x38(r4); - cmpwi r0, 3; - bnelr; - li r3, 1; - blr; - // clang-format on -} - namespace System { +bool RaceConfig::isTimeAttackReplay() { + const s32 gameMode = mRaceScenario.mSettings.mGameMode; + + return ((gameMode == 2 || gameMode == 5) && + spInstance->mRaceScenario.mPlayerCount != 0 && + spInstance->mRaceScenario.mPlayers[0].mPlayerType == 3) + ? true + : false; +} + void RaceConfig::vf18() {} void RaceConfig::vf14() {} diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 38f77c453..4986180ed 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -269,6 +269,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); s8 getHudPlayerId(u8 playerIdx); + bool isTimeAttackReplay(); static RaceConfig* spInstance; From 7f58565d3ca10624f7223a3dcf1e9b74285f283d Mon Sep 17 00:00:00 2001 From: vabold Date: Tue, 19 Jul 2022 22:33:22 -0400 Subject: [PATCH 22/37] RaceConfig: unk_80531fc8 Function name suggestions welcome. --- source/game/system/RaceConfig.cpp | 62 ++++++++++++------------------- source/game/system/RaceConfig.hpp | 1 + 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 402e25261..bc07fd7d8 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -4553,47 +4553,31 @@ asm UNKNOWN_FUNCTION(unk_80531f80) { // clang-format on } -// Symbol: unk_80531fc8 -// PAL: 0x80531fc8..0x80532030 -// Scratch: https://decomp.me/scratch/7aPIN -MARK_BINARY_BLOB(unk_80531fc8, 0x80531fc8, 0x80532030); -asm UNKNOWN_FUNCTION(unk_80531fc8) { - // clang-format off - nofralloc; - lwz r5, 0xb74(r3); - addi r0, r5, -2; - cmplwi r0, 2; - bgt lbl_80531fe0; - li r3, 1; - blr; -lbl_80531fe0: - cmpwi r5, 1; - bne lbl_80531ff0; - li r3, 1; - blr; -lbl_80531ff0: - add r4, r3, r4; - lbz r0, 0xb84(r4); - extsb. r0, r0; - blt lbl_80532028; - clrlwi r0, r0, 0x18; - mulli r0, r0, 0xf0; - add r3, r3, r0; - lwz r0, 0x38(r3); - cmpwi r0, 0; - beq lbl_80532028; - cmpwi r0, 3; - beq lbl_80532028; - li r3, 1; - blr; -lbl_80532028: - li r3, 0; - blr; - // clang-format on -} - namespace System { +// Unsure what to call this because I'm unsure of what it does +bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { + // In fairness, this makes more sense when it's an enum + s32 gameType = mRaceScenario.mSettings.mGameType; + if (2 >= (u32)gameType - 2) { + return true; + } + + if (gameType == 1) { + return true; + } + + s32 playerId = mRaceScenario.mSettings.mHudPlayerIds[hudPlayerIdx]; + if (playerId >= 0) { + s32 playerType = mRaceScenario.mPlayers[(u8)playerId].mPlayerType; + if (playerType != 0 && playerType != 3) { + return true; + } + } + + return false; +} + bool RaceConfig::isTimeAttackReplay() { const s32 gameMode = mRaceScenario.mSettings.mGameMode; diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 4986180ed..ef7c7b7dc 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -269,6 +269,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); s8 getHudPlayerId(u8 playerIdx); + bool unk_80531fc8(u8 hudPlayerIdx); bool isTimeAttackReplay(); static RaceConfig* spInstance; From 656ed3117d02c9410fdb7fe58657026028aa5f7c Mon Sep 17 00:00:00 2001 From: vabold Date: Wed, 20 Jul 2022 08:39:23 -0400 Subject: [PATCH 23/37] RaceConfigPlayer: setMii Co-Authored-By: CLF78 <29682335+CLF78@users.noreply.github.com> --- pack/symbols.txt | 2 +- source/game/system/Mii.hpp | 29 +++------ source/game/system/RaceConfig.cpp | 105 +++--------------------------- source/game/system/RaceConfig.hpp | 3 +- 4 files changed, 21 insertions(+), 118 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index ff62ba2d9..185ff3911 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9759,7 +9759,7 @@ 0x80530f18 getUnkPos__Q26System16RaceConfigPlayerFv 0x80530f20 getCharacter__Q26System16RaceConfigPlayerFv 0x80530f28 getVehicle__Q26System16RaceConfigPlayerFv -0x80530f30 unk_80530f30 +0x80530f30 setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii 0x80531068 getMii__Q26System16RaceConfigPlayerFv 0x80531070 Racedata_initCredits 0x80531ce4 Racedata_updateEndOfRace diff --git a/source/game/system/Mii.hpp b/source/game/system/Mii.hpp index 5c7b25811..ffbcfc2d6 100644 --- a/source/game/system/Mii.hpp +++ b/source/game/system/Mii.hpp @@ -35,28 +35,19 @@ class Mii { s8 _9; s32 _C; RawMii mRaw; - unk32 _5C; - unkStruct _60; // almost certainly a color struct - s32 _64; - char mName[20]; - unk32 _7C; - unk32 _80; - unk32 _84; - unk32 _88; - unk32 _8C; - unk32 _90; - MiiId mId; - unk32 _9C; - unk32 _A0; + s32 _5C; + unkStruct _60; + u32 _64; + u32 _68[15]; u8 _A4; u8 _A5; u8 _A6; - unk32 _A8; - unk8 _AC; - unk8 _AD; - unk8 _AE; - unk32 _B0; - unk32 _B4; + u32 _A8; + u8 _AC; + u8 _AD; + u8 _AE; + u32 _B0; + u32 _B4; }; } // namespace System diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index bc07fd7d8..3cf3be6cd 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -3133,7 +3133,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { addi r3, r31, 0xc10; bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_80530f30; + bl setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii; b lbl_80530a1c; lbl_80530a10: addi r28, r28, 1; @@ -3248,7 +3248,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r27, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_80530f30; + bl setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii; addi r27, r27, 1; lbl_80530bb8: addi r25, r25, 1; @@ -3332,7 +3332,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r27, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r29; - bl unk_80530f30; + bl setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii; addi r27, r27, 1; lbl_80530cfc: addi r26, r26, 1; @@ -3409,7 +3409,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r25, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_80530f30; + bl setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii; addi r25, r25, 1; lbl_80530e20: addi r27, r27, 1; @@ -3464,7 +3464,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { li r4, 0; bl getPlayer__Q26System12MenuScenarioFUc; mr r4, r30; - bl unk_80530f30; + bl setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii; lbl_80530ef0: mr r3, r31; bl Racedata_initRace; @@ -3486,98 +3486,9 @@ CharacterId RaceConfigPlayer::getCharacter() { return mCharacterId; } VehicleId RaceConfigPlayer::getVehicle() { return mVehicleId; } -} // namespace System - -// Symbol: unk_80530f30 -// PAL: 0x80530f30..0x80531068 -// Scratch: https://decomp.me/scratch/7sJZl -MARK_BINARY_BLOB(unk_80530f30, 0x80530f30, 0x80531068); -asm UNKNOWN_FUNCTION(unk_80530f30) { - // clang-format off - nofralloc; - lwz r5, 4(r4); - li r0, 0x26; - stw r5, 0x18(r3); - addi r7, r3, 0x23; - addi r6, r4, 0xf; - lbz r5, 8(r4); - stb r5, 0x1c(r3); - lbz r5, 9(r4); - stb r5, 0x1d(r3); - lwz r5, 0xc(r4); - stw r5, 0x20(r3); - mtctr r0; -lbl_80530f60: - lbz r5, 1(r6); - lbzu r0, 2(r6); - stb r5, 1(r7); - stbu r0, 2(r7); - bdnz lbl_80530f60; - lwz r0, 0x5c(r4); - stw r0, 0x70(r3); - lbz r0, 0x60(r4); - stb r0, 0x74(r3); - lbz r0, 0x61(r4); - stb r0, 0x75(r3); - lbz r0, 0x62(r4); - stb r0, 0x76(r3); - lbz r0, 0x63(r4); - stb r0, 0x77(r3); - lwz r0, 0x64(r4); - stw r0, 0x78(r3); - lwz r5, 0x68(r4); - lwz r0, 0x6c(r4); - stw r0, 0x80(r3); - stw r5, 0x7c(r3); - lwz r5, 0x70(r4); - lwz r0, 0x74(r4); - stw r0, 0x88(r3); - stw r5, 0x84(r3); - lwz r5, 0x78(r4); - lwz r0, 0x7c(r4); - stw r0, 0x90(r3); - stw r5, 0x8c(r3); - lwz r5, 0x80(r4); - lwz r0, 0x84(r4); - stw r0, 0x98(r3); - stw r5, 0x94(r3); - lwz r5, 0x88(r4); - lwz r0, 0x8c(r4); - stw r0, 0xa0(r3); - stw r5, 0x9c(r3); - lwz r5, 0x90(r4); - lwz r0, 0x94(r4); - stw r0, 0xa8(r3); - stw r5, 0xa4(r3); - lwz r5, 0x98(r4); - lwz r0, 0x9c(r4); - stw r0, 0xb0(r3); - stw r5, 0xac(r3); - lwz r0, 0xa0(r4); - stw r0, 0xb4(r3); - lbz r0, 0xa4(r4); - stb r0, 0xb8(r3); - lbz r0, 0xa5(r4); - stb r0, 0xb9(r3); - lbz r0, 0xa6(r4); - stb r0, 0xba(r3); - lwz r0, 0xa8(r4); - stw r0, 0xbc(r3); - lbz r0, 0xac(r4); - stb r0, 0xc0(r3); - lbz r0, 0xad(r4); - stb r0, 0xc1(r3); - lbz r0, 0xae(r4); - stb r0, 0xc2(r3); - lwz r0, 0xb0(r4); - stw r0, 0xc4(r3); - lwz r0, 0xb4(r4); - stw r0, 0xc8(r3); - blr; - // clang-format on -} - -namespace System { +#pragma legacy_struct_alignment on +void RaceConfigPlayer::setMii(const Mii& mii) { mMii = mii; } +#pragma legacy_struct_alignment off Mii* RaceConfigPlayer::getMii() { return &mMii; } diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index ef7c7b7dc..cbedbb794 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -107,7 +107,7 @@ UNKNOWN_FUNCTION(getCharacter__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f28..0x80530f30 UNKNOWN_FUNCTION(getVehicle__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f30..0x80531068 -UNKNOWN_FUNCTION(unk_80530f30); +UNKNOWN_FUNCTION(setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii); // PAL: 0x80531068..0x80531070 UNKNOWN_FUNCTION(getMii__Q26System16RaceConfigPlayerFv); // PAL: 0x80531070..0x80531ce4 @@ -166,6 +166,7 @@ class RaceConfigPlayer { u8 getUnkPos(); CharacterId getCharacter(); VehicleId getVehicle(); + void setMii(const Mii& mii); Mii* getMii(); // private: unk8 _04; From ace1d8c6684e2624c1a40f6535372e720af76193 Mon Sep 17 00:00:00 2001 From: vabold Date: Wed, 20 Jul 2022 08:54:20 -0400 Subject: [PATCH 24/37] Generate and merge new REL symbols --- .gitignore | 1 + pack/symbols.txt | 332 +++++++++++++++++++++++------------------------ 2 files changed, 167 insertions(+), 166 deletions(-) diff --git a/.gitignore b/.gitignore index f73a1084b..548f825ff 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ tmp *.map out.html tools.zip +pack/new_symbols.txt # Editors .vscode/ diff --git a/pack/symbols.txt b/pack/symbols.txt index 185ff3911..d1fffdf1a 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9123,10 +9123,10 @@ 0x80512040 VEC2_add 0x80512064 unk_80512064 0x80512370 CheckpointHolder_computeMeanTotalDistance -0x80512694 CourseMap_createInstance -0x8051271c CourseMap_destroyInstance -0x8051276c CourseMap_ct -0x805127ac CourseMap_dt +0x80512694 initStaticInstance__Q25Field9CourseMapFv +0x8051271c destroyStaticInstance__Q25Field9CourseMapFv +0x8051276c __ct__Q25Field9CourseMapFv +0x805127ac __dt__Q25Field9CourseMapFv 0x805127ec CourseMap_init 0x80512c10 CourseMap_loadFile 0x80512c2c CourseMapHeader_ct @@ -9229,23 +9229,23 @@ 0x80518bb0 unk_80518bb0 0x80518bdc unk_80518bdc 0x80518c40 Enemypoint_destroy -0x80518cc0 DvdArchive_ct -0x80518cf4 DvdArchive_dt -0x80518dcc DvdArchive_mount -0x80518e10 load__Q26System10DvdArchiveFPcPQ23EGG4HeapilPQ23EGG4HeapUl -0x80518fa4 SArchive_load +0x80518cc0 __ct__Q26System10DvdArchiveFv +0x80518cf4 __dt__Q26System10DvdArchiveFv +0x80518dcc mount__Q26System10DvdArchiveFPQ23EGG4Heap +0x80518e10 load__Q26System10DvdArchiveFPCcPQ23EGG4HeapblPQ23EGG4HeapUl +0x80518fa4 load__Q26System10DvdArchiveFPCcUlPQ23EGG4Heap 0x80518fbc loadBuffer__Q26System10DvdArchiveFPvUlPQ23EGG4Heapl -0x80519040 unk_80519040 -0x805190e8 unk_805190e8 -0x805190f0 ripFile__Q26System10DvdArchiveFPcPQ23EGG4HeapUc -0x805191a4 unk_805191a4 +0x80519040 getFileCopy__Q26System10DvdArchiveFPcPQ23EGG4HeapPUlSc +0x805190e8 _UNKNOWN2__Q26System10DvdArchiveFiPUc +0x805190f0 ripFile__Q26System10DvdArchiveFPCcPQ23EGG4HeapUc +0x805191a4 tryRipFile__Q26System10DvdArchiveFPCcPQ23EGG4HeapSc 0x80519240 clear__Q26System10DvdArchiveFv 0x805192cc unmount__Q26System10DvdArchiveFv -0x80519370 unk_80519370 -0x805193c8 unk_805193c8 -0x80519420 getFile__Q26System10DvdArchiveFPcPUl -0x80519508 decompress__Q26System10DvdArchiveFPcPQ23EGG4HeapUl -0x805195a4 unk_805195a4 +0x80519370 clearArchive__Q26System10DvdArchiveFv +0x805193c8 clearFile__Q26System10DvdArchiveFv +0x80519420 getFile__Q26System10DvdArchiveFPCcPUl +0x80519508 decompress__Q26System10DvdArchiveFPCcPQ23EGG4HeapUl +0x805195a4 move__Q26System10DvdArchiveFv 0x805195d8 loadOther__Q26System10DvdArchiveFPCQ26System10DvdArchivePQ23EGG4Heap 0x80519670 unk_80519670 0x805196b0 unk_805196b0 @@ -9317,31 +9317,31 @@ 0x8051c02c unk_8051c02c 0x8051c030 unk_8051c030 0x8051c088 reset__Q26System12RawGhostFileFv -0x8051c094 RawGhostFile_isHeaderValid +0x8051c094 isHeaderValid__Q26System12RawGhostFileCFv 0x8051c120 isValid__Q26System12RawGhostFileCFv -0x8051c23c unk_8051c23c +0x8051c23c updateCrc32Uncompressed__Q26System12RawGhostFileFv 0x8051c270 __ct__Q26System9GhostFileFv -0x8051c334 Timer_destroy -0x8051c374 Timer_construct -0x8051c4a0 GhostFile_reset -0x8051c52c GhostFile_readHeader +0x8051c334 __dt__Q26System4TimeFv +0x8051c374 __ct__Q26System4TimeFv +0x8051c4a0 reset__Q26System9GhostFileFv +0x8051c52c readHeader_thunk__Q26System9GhostFileFRCQ26System12RawGhostFile 0x8051c790 read__Q26System9GhostFileFRCQ26System12RawGhostFile 0x8051c7f4 writeHeader__Q26System9GhostFileCFRQ26System12RawGhostFile 0x8051ca0c writeHeaderUncompressed__Q26System9GhostFileCFRQ26System12RawGhostFile 0x8051ca80 writeUncompressed__Q26System9GhostFileCFRQ26System12RawGhostFile 0x8051cb1c init__Q26System9GhostFileFUc -0x8051ce7c Controller_vf10 -0x8051ce84 Input_vf18 -0x8051ce8c Input_vf1c -0x8051ce94 GhostGroup_construct -0x8051cf90 GhostFile_destroy -0x8051cff8 GhostGroup_destroy -0x8051d064 GhostGroup_reset -0x8051d084 GhostGroup_get -0x8051d0bc GhostGroup_readHeader +0x8051ce7c Controller_vf10__6SystemFv +0x8051ce84 Input_vf18__6SystemFv +0x8051ce8c Input_vf1c__6SystemFv +0x8051ce94 __ct__Q26System14GhostFileGroupFPQ23EGG4Heapl +0x8051cf90 __dt__Q26System9GhostFileFv +0x8051cff8 __dt__Q26System14GhostFileGroupFv +0x8051d064 invalidate__Q26System14GhostFileGroupFUs +0x8051d084 get__Q26System14GhostFileGroupFUs +0x8051d0bc readHeader__Q26System14GhostFileGroupFUsRCQ26System12RawGhostFile 0x8051d0e0 compress__Q26System12RawGhostFileFRCQ26System12RawGhostFileRQ26System12RawGhostFile 0x8051d1b4 decompress__Q26System12RawGhostFileFRCQ26System12RawGhostFileRQ26System12RawGhostFile -0x8051d388 RawGhostFile_getSize +0x8051d388 getSize__Q26System12RawGhostFileCFv 0x8051d4d4 HomeButton_createInstance 0x8051d534 unk_8051d534 0x8051d584 unk_8051d584 @@ -9641,25 +9641,25 @@ 0x8052a03c unk_8052a03c 0x8052a048 thunk_unk_80552564 0x8052a04c unk_8052a04c -0x8052a098 createMultiDvdArchive__F11SLoaderKind -0x8052a1c8 __ct__Q26System13CourseArchiveFv -0x8052a21c init__Q26System13CourseArchiveFv -0x8052a2a8 __ct__Q26System11Unk2ArchiveFv -0x8052a2fc init__Q26System11Unk2ArchiveFv -0x8052a36c __ct__Q26System11RaceArchiveFv -0x8052a3c0 init__Q26System11RaceArchiveFv -0x8052a430 __dt__Q26System13CourseArchiveFv -0x8052a4e0 __dt__Q26System11RaceArchiveFv +0x8052a098 createMultiDvdArchive__6SystemFQ26System17ResourceChannelID +0x8052a1c8 __ct__Q26System16CourseDvdArchiveFv +0x8052a21c init__Q26System16CourseDvdArchiveFv +0x8052a2a8 __ct__Q26System12UIDvdArchiveFv +0x8052a2fc init__Q26System12UIDvdArchiveFv +0x8052a36c __ct__Q26System17RaceSysDvdArchiveFv +0x8052a3c0 init__Q26System17RaceSysDvdArchiveFv +0x8052a430 __dt__Q26System17RaceSysDvdArchiveFv +0x8052a4e0 __dt__Q26System16CourseDvdArchiveFv 0x8052a538 __ct__Q26System15MultiDvdArchiveFUs 0x8052a648 init__Q26System15MultiDvdArchiveFv 0x8052a6dc __dt__Q26System15MultiDvdArchiveFv -0x8052a760 getFile__15MultiDvdArchiveFPcUl +0x8052a760 getFile__Q26System15MultiDvdArchiveFPCcPUl 0x8052a800 isLoaded__Q26System15MultiDvdArchiveFv 0x8052a864 exists__Q26System15MultiDvdArchiveFPCc -0x8052a954 load__Q26System15MultiDvdArchiveFPCcP4HeapP4HeapUl +0x8052a954 load__Q26System15MultiDvdArchiveFPCcPQ23EGG4HeapPQ23EGG4Heapi 0x8052aa88 unmount__Q26System15MultiDvdArchiveFv 0x8052aae8 loadOther__Q26System15MultiDvdArchiveFPQ26System15MultiDvdArchivePQ23EGG4Heap -0x8052ab6c rip__Q26System15MultiDvdArchiveFPCcP4Heap +0x8052ab6c rip__Q26System15MultiDvdArchiveFPCcPQ23EGG4Heap 0x8052ac40 clear__Q26System15MultiDvdArchiveFv 0x8052aca0 totalArchiveSize__Q26System15MultiDvdArchiveFv 0x8052ad08 getEarliestResBufInMem__Q26System15MultiDvdArchiveFv @@ -9714,11 +9714,11 @@ 0x8052d46c unk_8052d46c 0x8052d828 unk_8052d828 0x8052d888 unk_8052d888 -0x8052d96c RacedataPlayer_construct -0x8052da10 unk_8052da10 -0x8052da50 unk_8052da50 -0x8052daf0 RacedataPlayer_computeGpRank -0x8052dbc8 RacedataScenario_construct +0x8052d96c __ct__Q26System16RaceConfigPlayerFv +0x8052da10 __dt__Q26System6RatingFv +0x8052da50 appendParamFile__Q26System16RaceConfigPlayerFPQ26System10RaceConfig +0x8052daf0 computeGpRank__Q26System16RaceConfigPlayerCFv +0x8052dbc8 __ct__Q26System18RaceConfigScenarioFPQ26System12RawGhostFile 0x8052dc68 RacedataPlayer_destroy 0x8052dca8 computeWinningTeam__Q26System12RaceScenarioFv 0x8052dd18 getTeam__Q26System16RaceConfigPlayerFv @@ -9729,10 +9729,10 @@ 0x8052e434 getPlayer__Q26System12MenuScenarioFUc 0x8052e444 setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId 0x8052e44c setPlayerType__Q26System16RaceConfigPlayerFl -0x8052e454 Racedata_resetSomeStuff +0x8052e454 reset__Q26System10RaceConfigFv 0x8052e658 setPrevFinishPos__Q26System16RaceConfigPlayerFSc 0x8052e660 setUnkPos__Q26System16RaceConfigPlayerFSc -0x8052e668 unk_8052e668 +0x8052e668 reset__Q26System18RaceConfigScenarioFv 0x8052e870 unk_8052e870 0x8052e950 unk_8052e950 0x8052ed18 getGametype__Q26System12MenuScenarioFv @@ -9762,17 +9762,17 @@ 0x80530f30 setMii__Q26System16RaceConfigPlayerFRCQ26System3Mii 0x80531068 getMii__Q26System16RaceConfigPlayerFv 0x80531070 Racedata_initCredits -0x80531ce4 Racedata_updateEndOfRace +0x80531ce4 update__Q26System10RaceConfigFv 0x80531de4 unk_80531de4 0x80531f18 getLocalPlayerCount__Q26System10RaceConfigFUc -0x80531f2c Racedata_setGhost -0x80531f70 Racedata_getHudPlayerId +0x80531f2c setGhost__Q26System10RaceConfigFPQ26System12RawGhostFile +0x80531f70 getHudPlayerId__Q26System10RaceConfigFUc 0x80531f80 unk_80531f80 -0x80531fc8 unk_80531fc8 -0x80532030 Racedata_isTimeAttackReplay -0x80532070 unk_80532070 -0x80532074 unk_80532074 -0x80532078 unk_80532078 +0x80531fc8 unk_80531fc8__Q26System10RaceConfigFUc +0x80532030 isTimeAttackReplay__Q26System10RaceConfigFv +0x80532070 vf18__Q26System10RaceConfigFv +0x80532074 vf14__Q26System10RaceConfigFv +0x80532078 vf10__Q26System10RaceConfigFv 0x8053207c unk_8053207c 0x80532084 Raceinfo_initStaticInstance 0x805320d4 Raceinfo_destroyStaticInstance @@ -9959,79 +9959,79 @@ 0x8053fa10 unk_8053fa10 0x8053fb38 unk_8053fb38 0x8053fb98 unk_8053fb98 -0x8053fc4c ResourceManager_createInstance -0x8053fc9c ResourceManager_destroyInstance +0x8053fc4c createInstance__Q26System15ResourceManagerFv +0x8053fc9c destroyInstance__Q26System15ResourceManagerFv 0x8053fcec __ct__Q26System15ResourceManagerFv 0x8053fe68 __ct__Q26System20MenuCharacterManagerFv -0x8053fe94 unk_8053fe94 -0x8053fed4 unk_8053fed4 -0x8053ff14 unk_8053ff14 -0x8053ff1c ResourceManager_destroy -0x80540038 unk_80540038 -0x805400a0 ResourceManager_process -0x805401ec unk_805401ec -0x805401fc unk_805401fc -0x8054020c unk_8054020c -0x805402c0 unk_805402c0 -0x80540394 unk_80540394 -0x80540450 ResourceManager_load -0x80540558 unk_80540558 -0x80540680 ResourceManager_loadUI -0x80540760 loadCourse__Q26System15ResourceManagerF8CourseIdPQ23EGG4Heapb -0x80540918 loadMission__Q26System15ResourceManagerF8CourseIdlPQ23EGG4Heapb -0x80540b14 loadCompetition__Q26System15ResourceManagerF8CourseIdPvUlPQ23EGG4HeapUc -0x80540cfc loadKartFromArchive__Q26System15ResourceManagerFPQ26System15MultiDvdArchiveUl6KartId11CharacterId10BattleTeam8PlayModePQ23EGG4HeapPQ23EGG4Heap -0x80540e3c unk_80540e3c -0x80540f90 unk_80540f90 -0x805410e4 unk_805410e4 -0x805411d4 unk_805411d4 -0x805411e4 unk_805411e4 -0x805411ec unk_805411ec -0x805411fc ResourceManager_getFile -0x80541278 unk_80541278 -0x80541320 unk_80541320 -0x805413c8 unk_805413c8 -0x80541438 unk_80541438 -0x805414a8 ResourceManager_loadBSP -0x8054155c unk_8054155c +0x8053fe94 __dt__Q26System1SFv +0x8053fed4 __dt__Q26System20MenuCharacterManagerFv +0x8053ff14 __defctor__Q26System15MultiDvdArchiveFv +0x8053ff1c __dt__Q26System15ResourceManagerFv +0x80540038 doLoadTask__Q26System15ResourceManagerFPv +0x805400a0 process__Q26System15ResourceManagerFv +0x805401ec _unk_call14__FP5Dummy +0x805401fc _unk_call1c__FP5Dummy +0x8054020c requestLoad__Q26System15ResourceManagerFlPQ26System15MultiDvdArchivePCcPQ23EGG4Heap +0x805402c0 requestLoad__Q26System15ResourceManagerFlPQ26System10DvdArchivePCcUlPQ23EGG4Heap +0x80540394 requestLoad__Q26System15ResourceManagerFlPQ26System15MultiDvdArchivePCcPQ23EGG4HeapPQ23EGG4Heap +0x80540450 load__Q26System15ResourceManagerFQ26System17ResourceChannelIDPQ23EGG4HeapPCc +0x80540558 loadSystemResource__Q26System15ResourceManagerFlPQ23EGG4Heap +0x80540680 loadUI__Q26System15ResourceManagerFPCcPQ23EGG4Heap +0x80540760 loadCourse__Q26System15ResourceManagerFQ26System8CourseIdPQ23EGG4Heapb +0x80540918 loadMission__Q26System15ResourceManagerFQ26System8CourseIdlPQ23EGG4Heapb +0x80540b14 loadCompetition__Q26System15ResourceManagerFQ26System8CourseIdPvUlPQ23EGG4HeapUc +0x80540cfc loadKartFromArchive__Q26System15ResourceManagerFPQ26System15MultiDvdArchiveUlQ26System9VehicleIdQ26System11CharacterIdQ26System10BattleTeamQ26System8PlayModePQ23EGG4HeapPQ23EGG4Heap +0x80540e3c loadKartFromArchive2__Q26System15ResourceManagerFlQ26System9VehicleIdQ26System11CharacterIdQ26System10BattleTeamQ26System8PlayModePQ23EGG4HeapPQ23EGG4Heap +0x80540f90 loadKartFromArchive3__Q26System15ResourceManagerFlQ26System9VehicleIdQ26System11CharacterIdQ26System10BattleTeamQ26System8PlayModePQ23EGG4HeapPQ23EGG4Heap +0x805410e4 loadMenuKartModel__Q26System15ResourceManagerFlQ26System11CharacterIdQ26System10BattleTeamPQ23EGG4HeapPQ23EGG4Heap +0x805411d4 unmountMulti__Q26System15ResourceManagerFl +0x805411e4 unmountMulti__Q26System15ResourceManagerFPQ26System15MultiDvdArchive +0x805411ec unmountArchive__Q26System15ResourceManagerFl +0x805411fc getFile__Q26System15ResourceManagerFlPCcPUl +0x80541278 getCharacterFile__Q26System15ResourceManagerFQ26System11CharacterIdPUl +0x80541320 getVehicleFile__Q26System15ResourceManagerFlQ26System9VehicleIdPUl +0x805413c8 getKartArchiveFile__Q26System15ResourceManagerFlPCcPUl +0x80541438 getBackupKartArchiveFile__Q26System15ResourceManagerFlPCcPUl +0x805414a8 getBspFile__Q26System15ResourceManagerFlPUl +0x8054155c getFileCopy__Q26System15ResourceManagerFlPcPQ23EGG4HeapPUlSc 0x805415b0 unk_805415b0 -0x805415b4 unk_805415b4 -0x805415c4 unk_805415c4 -0x805415d4 unk_805415d4 -0x805415e4 unk_805415e4 -0x80541614 getArchiveStart__Q26System15ResourceManagerFQ26System17ResourceChannelIdUl -0x8054169c unk_8054169c -0x80541738 unk_80541738 -0x80541794 ResourceManager_getMenuArchiveCount -0x805417a4 unk_805417a4 -0x80541878 ResourceManager_attachLayoutDir -0x80541998 ResourceManager_preloadCourseTask +0x805415b4 isSceneArchiveLoaded__Q26System15ResourceManagerVFl +0x805415c4 isKartArchiveLoaded__Q26System15ResourceManagerFl +0x805415d4 isBackupKartArchiveLoaded__Q26System15ResourceManagerFl +0x805415e4 isSystemArchiveLoaded__Q26System15ResourceManagerFl +0x80541614 getArchiveStart__Q26System15ResourceManagerFQ26System17ResourceChannelIDUl +0x8054169c setArcResourceLink__Q26System15ResourceManagerFlUsPvPCc +0x80541738 getLoadedArchiveCount__Q26System15ResourceManagerFl +0x80541794 getMenuArchiveCount__Q26System15ResourceManagerFv +0x805417a4 attachArcResourceAccessor__Q26System15ResourceManagerFPvPCc +0x80541878 attatchLayoutDir__Q26System15ResourceManagerFPvPCcPQ26System9Whatever2b +0x80541998 preloadCourseTask__6SystemFPv 0x805419ac preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId -0x805419c8 getCharacterName__6SystemF11CharacterId -0x805419ec getKartName__6SystemF11CharacterId -0x80541a10 unk_80541a10 -0x80541a70 unk_80541a70 -0x80541ac4 unk_80541ac4 -0x80541b58 load__Q26System11CourseCacheFl -0x80541c18 unk_80541c18 -0x80541c38 unk_80541c38 -0x80541c48 unk_80541c48 -0x80541cbc unk_80541cbc -0x80541ce0 unk_80541ce0 -0x80541e44 unk_80541e44 -0x80542030 unk_80542030 -0x80542210 unk_80542210 -0x805422cc unk_805422cc -0x805423bc unk_805423bc -0x8054247c unk_8054247c -0x8054248c unk_8054248c -0x80542524 unk_80542524 -0x80542584 unk_80542584 -0x805425d0 unk_805425d0 -0x80542694 unk_80542694 -0x80542754 unk_80542754 -0x805427bc SaveManager_loadStaffGhostAsync -0x80542868 unk_80542868 +0x805419c8 getCharacterName__6SystemFQ26System11CharacterId +0x805419ec getVehicleName__6SystemFQ26System9VehicleId +0x80541a10 __ct__Q26System11CourseCacheFv +0x80541a70 init__Q26System11CourseCacheFv +0x80541ac4 __dt__Q26System11CourseCacheFv +0x80541b58 load__Q26System11CourseCacheFQ26System8CourseId +0x80541c18 loadOther__Q26System11CourseCacheFPQ26System15MultiDvdArchivePQ23EGG4Heap +0x80541c38 _unk_getNullString__Fv +0x80541c48 tryRequestTask__Q26System15ResourceManagerFPFPv_vPv +0x80541cbc requestTask__Q26System15ResourceManagerFPFPv_vPvPv +0x80541ce0 flush__Q26System15ResourceManagerFv +0x80541e44 doLoadCharacterKartModel__Q26System15ResourceManagerFPv +0x80542030 doLoadCharacterKartModelPriv__Q26System15ResourceManagerFl +0x80542210 loadKartMenuModelAsync__Q26System15ResourceManagerFlQ26System11CharacterIdQ26System10BattleTeam +0x805422cc createMenuHeaps__Q26System15ResourceManagerFUll +0x805423bc clear__Q26System15ResourceManagerFv +0x8054247c unk_8054247c__Fv +0x8054248c loadGlobe__Q26System15ResourceManagerFPQ23EGG4Heap +0x80542524 initGlobeHeap__Q26System15ResourceManagerFUlPQ23EGG4Heap +0x80542584 deinitGlobeHeap__Q26System15ResourceManagerFv +0x805425d0 doLoadGlobe__Q26System15ResourceManagerFPv +0x80542694 doLoadGlobeImpl__Q26System15ResourceManagerVFPPUc +0x80542754 loadGlobeAsync__Q26System15ResourceManagerFPv +0x805427bc loadStaffGhostAsync__Q26System15ResourceManagerFQ36System14GhostFileGroup14GhostGroupTypeQ26System8CourseIdPUc +0x80542868 unk_80542868__Fv 0x80542878 InitScene_construct 0x805429a8 InitScene_destroy 0x80542a18 unk_80542a18 @@ -10556,14 +10556,14 @@ 0x8055531c rel_start 0x80555368 unk_80555368 0x805553b0 unk_805553b0 -0x80555464 Random_construct -0x805554d0 Random_reseed -0x80555514 Random_construct2 -0x80555538 Random_destroy -0x80555578 Random_nextInt -0x805555cc Random_nextIntLimited -0x80555628 Random_nextFloat -0x805556a8 Random_nextFloatLimited +0x80555464 __ct__Q24Util6RandomFv +0x805554d0 reseed__Q24Util6RandomFv +0x80555514 __ct__Q24Util6RandomFUl +0x80555538 __dt__Q24Util6RandomFv +0x80555578 nextU32__Q24Util6RandomFv +0x805555cc nextU32__Q24Util6RandomFUl +0x80555628 nextF32__Q24Util6RandomFv +0x805556a8 nextF32__Q24Util6RandomFf 0x8055572c unk_8055572c 0x80555750 unk_80555750 0x8055586c unk_8055586c @@ -11552,9 +11552,9 @@ 0x8058ffe8 PlayerHolder_update 0x80590100 PlayerHolder_getPlayer 0x80590110 unk_80590110 -0x80590128 initList -0x80590138 setupInList -0x8059018c construct +0x80590128 initList__Q24Kart13KartComponentFv +0x80590138 setupInList__Q24Kart13KartComponentFPQ24Kart12KartAccessor +0x8059018c __ct__Q24Kart13KartComponentFv 0x805901d0 setupSingle 0x8059020c PlayerPointers_getPlayerPosition 0x80590224 PlayerPointers_getPlayerPhysicsHolderPosition @@ -12533,18 +12533,18 @@ 0x805c2370 unk_805c2370 0x805c23a0 unk_805c23a0 0x805c23d0 unk_805c23d0 -0x805c23e4 ControlGroup_construct -0x805c2400 ControlGroup_destroy -0x805c2460 ControlGroup_create -0x805c2620 ControlGroup_create2 -0x805c27dc ControlGroup_insert -0x805c2804 ControlGroup_debug -0x805c2868 ControlGroup_init -0x805c28d8 ControlGroup_calc -0x805c2948 ControlGroup_draw -0x805c2a5c ControlGroup_solve -0x805c2ac0 ControlGroup_at -0x805c2ad0 ControlGroup_transform +0x805c23e4 __ct__Q22UI12ControlGroupFv +0x805c2400 __dt__Q22UI12ControlGroupFv +0x805c2460 create__Q22UI12ControlGroupFPQ22UI9UIControli +0x805c2620 create__Q22UI12ControlGroupFPQ22UI4Pagei +0x805c27dc insert__Q22UI12ControlGroupFiPQ22UI9UIControli +0x805c2804 debug__Q22UI12ControlGroupFv +0x805c2868 init__Q22UI12ControlGroupFv +0x805c28d8 calc__Q22UI12ControlGroupFv +0x805c2948 draw__Q22UI12ControlGroupFi +0x805c2a5c solve__Q22UI12ControlGroupFv +0x805c2ac0 at__Q22UI12ControlGroupFi +0x805c2ad0 transform__Q22UI12ControlGroupFRQ32UI12ControlGroup7Functor 0x805c2c18 ControlLoader_construct 0x805c2c20 ControlLoader_destroy 0x805c2c60 ControlLoader_load @@ -13403,13 +13403,13 @@ 0x805f5fe8 unk_805f5fe8 0x805f5ffc unk_805f5ffc 0x805f8b24 unk_805f8b24 -0x805f8b34 MessageGroup_construct -0x805f8b50 MessageGroup_destroy -0x805f8b90 MessageGroup_load -0x805f8c00 MessageGroup_load2 -0x805f8c88 MessageGroup_getSlot -0x805f8cf0 MessageGroup_getMessage -0x805f8d2c MessageGroup_getAttributes +0x805f8b34 __ct__Q22UI12MessageGroupFv +0x805f8b50 __dt__Q22UI12MessageGroupFv +0x805f8b90 load__Q22UI12MessageGroupFPCc +0x805f8c00 load__Q22UI12MessageGroupFPCv +0x805f8c88 getSlot__Q22UI12MessageGroupCFUl +0x805f8cf0 getMessage__Q22UI12MessageGroupFl +0x805f8d2c getAttributes__Q22UI12MessageGroupFl 0x805f8d5c unk_805f8d5c 0x805f8de0 unk_805f8de0 0x805f8e48 unk_805f8e48 @@ -19160,12 +19160,12 @@ 0x80786b14 unk_80786b14 0x80786c60 unk_80786c60 0x80786dbc unk_80786dbc -0x80786e60 unk_80786e60 -0x80786ed0 Entity_construct -0x80786ef4 Entity_destroy -0x80786f34 Entity_init -0x80786f6c unk_80786f6c -0x80786f7c unk_80786f7c +0x80786e60 isSomeSphereExist__13BoxColManagerCFRCQ23EGG8Vector3fUlf +0x80786ed0 __ct__10BoxColUnitFv +0x80786ef4 __dt__10BoxColUnitFv +0x80786f34 set__10BoxColUnitFPCQ23EGG8Vector3fUlPvff +0x80786f6c makeDynamic__10BoxColUnitFv +0x80786f7c resizeSphere__10BoxColUnitFff 0x80786f98 unk_80786f98 0x80786fa8 unk_80786fa8 0x80786fc0 unk_80786fc0 From 4d24a17aae96be1a5b6343ff3ed61717c51a09ce Mon Sep 17 00:00:00 2001 From: Aiden Date: Wed, 20 Jul 2022 21:47:44 -0400 Subject: [PATCH 25/37] RaceConfig: loadNextCourse --- pack/rel_objects.txt | 2 +- pack/rel_slices.csv | 2 +- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 40 +++++++++---------------------- source/game/system/RaceConfig.hpp | 33 +++++++++++++++++++++++-- 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index b5dc73ea8..6c5c98918 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -20,7 +20,7 @@ out/rel/data_808b2d50_808b3188.o out/LocalizedArchive.o out/MultiDvdArchive.o out/rel/text_8052ae5c_8052d96c.o -out/rel/rodata_8088fe28_808900c0.o +out/rel/rodata_8088fe28_8088ffb0.o out/rel/data_808b31e8_808b32a0.o out/RaceConfig.o out/rel/text_80532084_8053fc4c.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index 7c35b1789..bfb13d7af 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -5,7 +5,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/system/Mii.cpp,0x80525f88,0x80525ff4,,,,,0x8088fd60,0x8088fd64,,,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, -1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x808900c0,0x808900e0,0x808b32a0,0x808b32ac,, +1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x8088ffb0,0x808900e0,0x808b32a0,0x808b32ac,, 1,source/game/system/ResourceManager.cpp,0x8053FC4C,0x80542878,,,,,0x80890490,0x80890d0c,0x808b3960,0x808b3c2c,, 1,source/game/util/Random.cpp,0x80555464,0x8055572c,,,,,0x80891370,0x80891380,0x808b42e0,0x808b42ec,, 1,source/game/kart/KartComponent.cpp,0x80590128,0x805901d0,,,,,,,,,0x809c1900,0x809c1910 diff --git a/pack/symbols.txt b/pack/symbols.txt index d1fffdf1a..da734486d 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9767,7 +9767,7 @@ 0x80531f18 getLocalPlayerCount__Q26System10RaceConfigFUc 0x80531f2c setGhost__Q26System10RaceConfigFPQ26System12RawGhostFile 0x80531f70 getHudPlayerId__Q26System10RaceConfigFUc -0x80531f80 unk_80531f80 +0x80531f80 loadNextCourse__Q26System10RaceConfigFv 0x80531fc8 unk_80531fc8__Q26System10RaceConfigFUc 0x80532030 isTimeAttackReplay__Q26System10RaceConfigFv 0x80532070 vf18__Q26System10RaceConfigFv diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 3cf3be6cd..56042db79 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -4434,37 +4434,19 @@ s8 RaceConfig::getHudPlayerId(u8 playerIdx) { return (s8)(u8)mRaceScenario.mSettings.mHudPlayerIds[playerIdx]; } -} // namespace System +void RaceConfig::loadNextCourse() { + if (mRaceScenario.mSettings.mGameMode != 0) { + return; + } -// Symbol: unk_80531f80 -// PAL: 0x80531f80..0x80531fc8 -// Scratch: https://decomp.me/scratch/xgmJ3 -MARK_BINARY_BLOB(unk_80531f80, 0x80531f80, 0x80531fc8); -asm UNKNOWN_FUNCTION(unk_80531f80) { - // clang-format off - nofralloc; - lwz r0, 0xb70(r3); - cmpwi r0, 0; - bnelr; - lbz r4, 0xb8c(r3); - cmplwi r4, 3; - bgelr; - lwz r3, 0xb88(r3); - lis r5, 0; - addi r0, r4, 1; - lis r7, 0; - slwi r6, r3, 4; - addi r5, r5, 0; - slwi r4, r0, 2; - lwz r3, 0(r7); - add r0, r5, r6; - lwzx r4, r4, r0; - b preloadCourseAsync__Q26System15ResourceManagerFQ26System8CourseId; - blr; - // clang-format on -} + u8 raceNumber = mRaceScenario.mSettings.mRaceNumber; + if (raceNumber >= 3) { + return; + } -namespace System { + ResourceManager::spInstance_REAL->preloadCourseAsync( + COURSE_ORDER[mRaceScenario.mSettings.mCupId][raceNumber + 1]); +} // Unsure what to call this because I'm unsure of what it does bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index cbedbb794..238698595 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -141,12 +141,40 @@ UNKNOWN_FUNCTION(unk_8053207c); } #endif +namespace System { + +const CourseId COURSE_ORDER[8][4] = { + {LUIGI_CIRCUIT, MOO_MOO_MEADOWS, MUSHROOM_GORGE, TOADS_FACTORY}, + {MARIO_CIRCUIT, COCONUT_MALL, DK_SUMMIT, WARIOS_GOLD_MINE}, + {DAISY_CIRCUIT, KOOPA_CAPE, MAPLE_TREEWAY, GRUMBLE_VOLCANO}, + {DRY_DRY_RUINS, MOONVIEW_HIGHWAY, BOWSERS_CASTLE, RAINBOW_ROAD}, + {GCN_PEACH_BEACH, DS_YOSHI_FALLS, SNES_GHOST_VALLEY_2, N64_MARIO_RACEWAY}, + {N64_SHERBET_LAND, GBA_SHY_GUY_BEACH, DS_DELFINO_SQUARE, + GCN_WALUIGI_STADIUM}, + {DS_DESERT_HILLS, GBA_BOWSER_CASTLE_3, N64_DKS_JUNGLE_PARKWAY, + GCN_MARIO_CIRCUIT}, + {SNES_MARIO_CIRCUIT_3, DS_PEACH_GARDENS, GCN_DK_MOUNTAIN, + N64_BOWSERS_CASTLE}}; + +extern const u8 VS_POINT_DISTRIBUTION[12][12]; +const u8 VS_POINT_DISTRIBUTION[12][12] = { + {15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 7, 5, 3, 1, 0, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0}, + {15, 12, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0}, + {15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 0, 0}, + {15, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0}}; + const s32 RANK_SCORES[] = {1000, 700, 400, 200, 0}; const u16 SCORES[] = {60, 52, 40, 20}; // NOTE: anything marked u8, u16, or u32 could be signed -namespace System { - class RaceConfig; class RaceConfigPlayer { @@ -270,6 +298,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); s8 getHudPlayerId(u8 playerIdx); + void loadNextCourse(); bool unk_80531fc8(u8 hudPlayerIdx); bool isTimeAttackReplay(); From 200d1da3b6d40acc4405a6a15dec44beca34ca9f Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sat, 23 Jul 2022 01:04:22 +0300 Subject: [PATCH 26/37] WIP align VS_POINT_DISTRIBUTION --- source/game/system/RaceConfig.hpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 238698595..14832a848 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -156,20 +156,19 @@ const CourseId COURSE_ORDER[8][4] = { {SNES_MARIO_CIRCUIT_3, DS_PEACH_GARDENS, GCN_DK_MOUNTAIN, N64_BOWSERS_CASTLE}}; -extern const u8 VS_POINT_DISTRIBUTION[12][12]; -const u8 VS_POINT_DISTRIBUTION[12][12] = { - {15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 9, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0}, - {15, 10, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0}, - {15, 10, 7, 5, 3, 1, 0, 0, 0, 0, 0, 0}, - {15, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0}, - {15, 11, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0}, - {15, 12, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0}, - {15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 0, 0}, - {15, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0}}; +const u8 __attribute__((force_export)) +VS_POINT_DISTRIBUTION[12][12] = {{15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 7, 5, 3, 1, 0, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0}, + {15, 12, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0}, + {15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 0, 0}, + {15, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0}}; const s32 RANK_SCORES[] = {1000, 700, 400, 200, 0}; const u16 SCORES[] = {60, 52, 40, 20}; From 2256b076d8fdbed1c3b8f48ff8b7efca58e18d97 Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sat, 23 Jul 2022 01:30:36 +0300 Subject: [PATCH 27/37] Fix rodata export --- source/game/system/RaceConfig.cpp | 29 +++++++++++++++++++++++++++++ source/game/system/RaceConfig.hpp | 31 ------------------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 56042db79..b590c4c51 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -40,6 +40,35 @@ extern UNKNOWN_FUNCTION(unk_8066c8d8); } namespace System { +const CourseId COURSE_ORDER[8][4] = { + {LUIGI_CIRCUIT, MOO_MOO_MEADOWS, MUSHROOM_GORGE, TOADS_FACTORY}, + {MARIO_CIRCUIT, COCONUT_MALL, DK_SUMMIT, WARIOS_GOLD_MINE}, + {DAISY_CIRCUIT, KOOPA_CAPE, MAPLE_TREEWAY, GRUMBLE_VOLCANO}, + {DRY_DRY_RUINS, MOONVIEW_HIGHWAY, BOWSERS_CASTLE, RAINBOW_ROAD}, + {GCN_PEACH_BEACH, DS_YOSHI_FALLS, SNES_GHOST_VALLEY_2, N64_MARIO_RACEWAY}, + {N64_SHERBET_LAND, GBA_SHY_GUY_BEACH, DS_DELFINO_SQUARE, + GCN_WALUIGI_STADIUM}, + {DS_DESERT_HILLS, GBA_BOWSER_CASTLE_3, N64_DKS_JUNGLE_PARKWAY, + GCN_MARIO_CIRCUIT}, + {SNES_MARIO_CIRCUIT_3, DS_PEACH_GARDENS, GCN_DK_MOUNTAIN, + N64_BOWSERS_CASTLE}}; + +const u8 __attribute__((force_export)) +VS_POINT_DISTRIBUTION[12][12] = {{15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {15, 9, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0}, + {15, 10, 7, 5, 3, 1, 0, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0}, + {15, 11, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0}, + {15, 12, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0}, + {15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 0, 0}, + {15, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0}}; + +const s32 RANK_SCORES[] = {1000, 700, 400, 200, 0}; +const u16 SCORES[] = {60, 52, 40, 20}; RaceConfigPlayer::RaceConfigPlayer() : _04(0), mLocalPlayerNum(-1), mPlayerInputIdx(-1), diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 14832a848..9435b9156 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -142,37 +142,6 @@ UNKNOWN_FUNCTION(unk_8053207c); #endif namespace System { - -const CourseId COURSE_ORDER[8][4] = { - {LUIGI_CIRCUIT, MOO_MOO_MEADOWS, MUSHROOM_GORGE, TOADS_FACTORY}, - {MARIO_CIRCUIT, COCONUT_MALL, DK_SUMMIT, WARIOS_GOLD_MINE}, - {DAISY_CIRCUIT, KOOPA_CAPE, MAPLE_TREEWAY, GRUMBLE_VOLCANO}, - {DRY_DRY_RUINS, MOONVIEW_HIGHWAY, BOWSERS_CASTLE, RAINBOW_ROAD}, - {GCN_PEACH_BEACH, DS_YOSHI_FALLS, SNES_GHOST_VALLEY_2, N64_MARIO_RACEWAY}, - {N64_SHERBET_LAND, GBA_SHY_GUY_BEACH, DS_DELFINO_SQUARE, - GCN_WALUIGI_STADIUM}, - {DS_DESERT_HILLS, GBA_BOWSER_CASTLE_3, N64_DKS_JUNGLE_PARKWAY, - GCN_MARIO_CIRCUIT}, - {SNES_MARIO_CIRCUIT_3, DS_PEACH_GARDENS, GCN_DK_MOUNTAIN, - N64_BOWSERS_CASTLE}}; - -const u8 __attribute__((force_export)) -VS_POINT_DISTRIBUTION[12][12] = {{15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0}, - {15, 9, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0}, - {15, 10, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0}, - {15, 10, 7, 5, 3, 1, 0, 0, 0, 0, 0, 0}, - {15, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0}, - {15, 11, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0}, - {15, 12, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0}, - {15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 0, 0}, - {15, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0}}; - -const s32 RANK_SCORES[] = {1000, 700, 400, 200, 0}; -const u16 SCORES[] = {60, 52, 40, 20}; - // NOTE: anything marked u8, u16, or u32 could be signed class RaceConfig; From fcecdcc9f12c9e01c0fd23a379e82353944c5bf1 Mon Sep 17 00:00:00 2001 From: Aiden Date: Sun, 24 Jul 2022 14:50:33 -0400 Subject: [PATCH 28/37] [FAIL] RaceConfig: updateRating --- pack/rel_objects.txt | 4 ++-- pack/rel_slices.csv | 2 +- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 25 +++++++++++++++++++++++-- source/game/system/RaceConfig.hpp | 1 + source/game/system/SaveManager.hpp | 3 +++ 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/pack/rel_objects.txt b/pack/rel_objects.txt index 6c5c98918..d2eea3751 100644 --- a/pack/rel_objects.txt +++ b/pack/rel_objects.txt @@ -20,11 +20,11 @@ out/rel/data_808b2d50_808b3188.o out/LocalizedArchive.o out/MultiDvdArchive.o out/rel/text_8052ae5c_8052d96c.o -out/rel/rodata_8088fe28_8088ffb0.o +out/rel/rodata_8088fe28_8088ffa8.o out/rel/data_808b31e8_808b32a0.o out/RaceConfig.o out/rel/text_80532084_8053fc4c.o -out/rel/rodata_808900e0_80890490.o +out/rel/rodata_808900e8_80890490.o out/rel/data_808b32ac_808b3960.o out/ResourceManager.o out/rel/text_80542878_80555464.o diff --git a/pack/rel_slices.csv b/pack/rel_slices.csv index bfb13d7af..b6af0755e 100644 --- a/pack/rel_slices.csv +++ b/pack/rel_slices.csv @@ -5,7 +5,7 @@ enabled,name,textStart,textEnd,ctorsStart,ctorsEnd,dtorsStart,dtorsEnd,rodataSta 1,source/game/system/Mii.cpp,0x80525f88,0x80525ff4,,,,,0x8088fd60,0x8088fd64,,,, 1,source/game/system/LocalizedArchive.cpp,0x8052a098,0x8052a538,,,,,0x8088fdc0,0x8088fe00,0x808b3188,0x808b31d8,, 1,source/game/system/MultiDvdArchive.cpp,0x8052a538,0x8052ae5c,,,,,0x8088fe00,0x8088fe28,0x808b31d8,0x808b31e8,, -1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x8088ffb0,0x808900e0,0x808b32a0,0x808b32ac,, +1,source/game/system/RaceConfig.cpp,0x8052d96c,0x80532084,,,,,0x8088ffa8,0x808900e8,0x808b32a0,0x808b32ac,, 1,source/game/system/ResourceManager.cpp,0x8053FC4C,0x80542878,,,,,0x80890490,0x80890d0c,0x808b3960,0x808b3c2c,, 1,source/game/util/Random.cpp,0x80555464,0x8055572c,,,,,0x80891370,0x80891380,0x808b42e0,0x808b42ec,, 1,source/game/kart/KartComponent.cpp,0x80590128,0x805901d0,,,,,,,,,0x809c1900,0x809c1910 diff --git a/pack/symbols.txt b/pack/symbols.txt index c26eec6e1..8d446d91f 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9776,7 +9776,7 @@ 0x8052e658 setPrevFinishPos__Q26System16RaceConfigPlayerFSc 0x8052e660 setUnkPos__Q26System16RaceConfigPlayerFSc 0x8052e668 reset__Q26System18RaceConfigScenarioFv -0x8052e870 unk_8052e870 +0x8052e870 updateRating__Q26System10RaceConfigFUc 0x8052e950 unk_8052e950 0x8052ed18 getGametype__Q26System12MenuScenarioFv 0x8052ed20 getPlayerType__Q26System16RaceConfigPlayerFv diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index b590c4c51..f62becfe2 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -40,6 +40,9 @@ extern UNKNOWN_FUNCTION(unk_8066c8d8); } namespace System { + +const f32 ZERO_FLOAT = 0.0; + const CourseId COURSE_ORDER[8][4] = { {LUIGI_CIRCUIT, MOO_MOO_MEADOWS, MUSHROOM_GORGE, TOADS_FACTORY}, {MARIO_CIRCUIT, COCONUT_MALL, DK_SUMMIT, WARIOS_GOLD_MINE}, @@ -712,6 +715,24 @@ u8 RaceConfigScenario::update() { } // namespace System +#if 1 +namespace System { + +s16 RaceConfig::updateRating(u8 playerIdx) { + const u8 playerCount = RaceConfig::getRacePlayerCount(); + f32 totalPoints = ZERO_FLOAT; + + for (u8 i = 0; i < playerCount; i++) { + if (playerIdx == i) { continue; } + + RaceConfigPlayer* player = RaceConfig::spInstance->mRaceScenario.getPlayer(playerIdx); + totalPoints += player->mRating.calcNegPoints(&RaceConfig::spInstance->mRaceScenario.getPlayer(i)->mRating); + } + return totalPoints; +} + +} // namespace System +#else // Symbol: unk_8052e870 // PAL: 0x8052e870..0x8052e950 // Scratch: https://decomp.me/scratch/SvbY2 @@ -780,6 +801,7 @@ asm UNKNOWN_FUNCTION(unk_8052e870) { blr; // clang-format on } +#endif // Symbol: unk_8052e950 // PAL: 0x8052e950..0x8052ed18 @@ -4479,9 +4501,8 @@ void RaceConfig::loadNextCourse() { // Unsure what to call this because I'm unsure of what it does bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { - // In fairness, this makes more sense when it's an enum s32 gameType = mRaceScenario.mSettings.mGameType; - if (2 >= (u32)gameType - 2) { + if (gameType > 1 && gameType < 5) { return true; } diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 9435b9156..23cc64075 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -262,6 +262,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { virtual void vf18(); void reset(); static u8 getRacePlayerCount(); + s16 updateRating(u8 playerIdx); u8 update(); s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); diff --git a/source/game/system/SaveManager.hpp b/source/game/system/SaveManager.hpp index 9d699c1cc..53409a18e 100644 --- a/source/game/system/SaveManager.hpp +++ b/source/game/system/SaveManager.hpp @@ -9,6 +9,9 @@ class Rating { Rating() { mPoints = 5000; } virtual ~Rating() {} + s16 calcPosPoints(Rating* opponent); + s16 calcNegPoints(Rating* opponent); + u16 mPoints; }; From 209668958f761a6d21c7c9ec462706bde9fd269c Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Mon, 25 Jul 2022 01:01:08 +0300 Subject: [PATCH 29/37] Fix .rodata --- source/game/system/RaceConfig.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index f62becfe2..3d4552398 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -41,8 +41,13 @@ extern UNKNOWN_FUNCTION(unk_8066c8d8); namespace System { -const f32 ZERO_FLOAT = 0.0; +extern const f32 ZERO_FLOAT; +extern const CourseId COURSE_ORDER[8][4]; +extern const u8 VS_POINT_DISTRIBUTION[12][12]; +extern const s32 RANK_SCORES[5]; +extern const u16 SCORES[4]; +const f32 ZERO_FLOAT = 0; const CourseId COURSE_ORDER[8][4] = { {LUIGI_CIRCUIT, MOO_MOO_MEADOWS, MUSHROOM_GORGE, TOADS_FACTORY}, {MARIO_CIRCUIT, COCONUT_MALL, DK_SUMMIT, WARIOS_GOLD_MINE}, @@ -719,16 +724,20 @@ u8 RaceConfigScenario::update() { namespace System { s16 RaceConfig::updateRating(u8 playerIdx) { - const u8 playerCount = RaceConfig::getRacePlayerCount(); - f32 totalPoints = ZERO_FLOAT; - - for (u8 i = 0; i < playerCount; i++) { - if (playerIdx == i) { continue; } - - RaceConfigPlayer* player = RaceConfig::spInstance->mRaceScenario.getPlayer(playerIdx); - totalPoints += player->mRating.calcNegPoints(&RaceConfig::spInstance->mRaceScenario.getPlayer(i)->mRating); + const u8 playerCount = RaceConfig::getRacePlayerCount(); + f32 totalPoints = ZERO_FLOAT; + + for (u8 i = 0; i < playerCount; i++) { + if (playerIdx == i) { + continue; } - return totalPoints; + + RaceConfigPlayer* player = + RaceConfig::spInstance->mRaceScenario.getPlayer(playerIdx); + totalPoints += player->mRating.calcNegPoints( + &RaceConfig::spInstance->mRaceScenario.getPlayer(i)->mRating); + } + return totalPoints; } } // namespace System From d084c3b89baac3cbb8cd585b1b2ada6dba791cac Mon Sep 17 00:00:00 2001 From: Aiden <86704247+vabold@users.noreply.github.com> Date: Sun, 24 Jul 2022 18:05:04 -0400 Subject: [PATCH 30/37] RaceConfig: minor file cleanup --- source/game/system/RaceConfig.cpp | 75 ------------------------------- 1 file changed, 75 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 3d4552398..f1a384d7f 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -718,11 +718,6 @@ u8 RaceConfigScenario::update() { return mSettings.mRaceNumber; } -} // namespace System - -#if 1 -namespace System { - s16 RaceConfig::updateRating(u8 playerIdx) { const u8 playerCount = RaceConfig::getRacePlayerCount(); f32 totalPoints = ZERO_FLOAT; @@ -741,76 +736,6 @@ s16 RaceConfig::updateRating(u8 playerIdx) { } } // namespace System -#else -// Symbol: unk_8052e870 -// PAL: 0x8052e870..0x8052e950 -// Scratch: https://decomp.me/scratch/SvbY2 -MARK_BINARY_BLOB(unk_8052e870, 0x8052e870, 0x8052e950); -asm UNKNOWN_FUNCTION(unk_8052e870) { - // clang-format off - nofralloc; - stwu r1, -0x50(r1); - mflr r0; - stw r0, 0x54(r1); - stfd f31, 0x40(r1); - psq_st f31, 72(r1), 0, 0; - stfd f30, 0x30(r1); - psq_st f30, 56(r1), 0, 0; - addi r11, r1, 0x30; - bl unk_805553b0; - lis r29, 0; - lis r5, 0; - lwz r6, 0(r29); - lis r3, 0; - mulli r28, r4, 0xf0; - lfs f30, 0(r5); - lbz r30, 0x24(r6); - mr r26, r4; - lfd f31, 0(r3); - li r27, 0; - lis r31, 0x4330; - b lbl_8052e910; -lbl_8052e8c4: - clrlwi r0, r27, 0x18; - cmplw r26, r0; - beq lbl_8052e90c; - lwz r3, 0(r29); - mulli r0, r0, 0xf0; - addi r4, r3, 0x28; - add r3, r4, r28; - add r4, r4, r0; - addi r4, r4, 0xe4; - addi r3, r3, 0xe4; - bl unk_8052d1c0; - extsh r0, r3; - stw r31, 8(r1); - xoris r0, r0, 0x8000; - stw r0, 0xc(r1); - lfd f0, 8(r1); - fsubs f0, f0, f31; - fadds f30, f30, f0; -lbl_8052e90c: - addi r27, r27, 1; -lbl_8052e910: - clrlwi r0, r27, 0x18; - cmplw r0, r30; - blt lbl_8052e8c4; - fctiwz f0, f30; - stfd f0, 8(r1); - lwz r3, 0xc(r1); - psq_l f31, 72(r1), 0, 0; - lfd f31, 0x40(r1); - psq_l f30, 56(r1), 0, 0; - lfd f30, 0x30(r1); - addi r11, r1, 0x30; - bl unk_805553b0; - lwz r0, 0x54(r1); - mtlr r0; - addi r1, r1, 0x50; - blr; - // clang-format on -} -#endif // Symbol: unk_8052e950 // PAL: 0x8052e950..0x8052ed18 From acf99d41f766a945013e7cc26d46da7632ace33d Mon Sep 17 00:00:00 2001 From: vabold Date: Sun, 24 Jul 2022 19:10:26 -0400 Subject: [PATCH 31/37] RaceConfig: fix updateRating --- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 6 +++--- source/game/system/RaceConfig.hpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 8d446d91f..148e1db7b 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9747,7 +9747,7 @@ 0x8052d00c unk_8052d00c 0x8052d068 unk_8052d068 0x8052d118 unk_8052d118 -0x8052d1c0 unk_8052d1c0 +0x8052d1c0 calcNegPoints__Q26System6RatingFPQ26System6Rating 0x8052d270 unk_8052d270 0x8052d298 unk_8052d298 0x8052d310 unk_8052d310 diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index f1a384d7f..c9bf47059 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -25,7 +25,7 @@ extern UNKNOWN_FUNCTION(init__Q26System3MiiFl); // PAL: 0x8052d118 extern UNKNOWN_FUNCTION(unk_8052d118); // PAL: 0x8052d1c0 -extern UNKNOWN_FUNCTION(unk_8052d1c0); +extern UNKNOWN_FUNCTION(calcNegPoints__Q26System6RatingFPQ26System6Rating); // PAL: 0x8052d270 extern UNKNOWN_FUNCTION(unk_8052d270); // PAL: 0x805368f8 @@ -176,7 +176,7 @@ BattleTeam RaceConfigPlayer::getTeam() { return mTeam; } RaceConfigPlayer* RaceScenario::getPlayer(u8 idx) { return &mPlayers[idx]; } -u8 RaceConfig::getRacePlayerCount() { +const u8 RaceConfig::getRacePlayerCount() { return RaceConfig::spInstance->mRaceScenario.mPlayerCount; } @@ -887,7 +887,7 @@ asm UNKNOWN_FUNCTION(unk_8052e950) { mulli r0, r0, 0xf0; add r4, r15, r0; addi r4, r4, 0xec; - bl unk_8052d1c0; + bl calcNegPoints__Q26System6RatingFPQ26System6Rating; extsh r0, r3; stw r31, 0x20(r1); xoris r0, r0, 0x8000; diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 23cc64075..46b2e9784 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -261,7 +261,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { virtual void vf14(); virtual void vf18(); void reset(); - static u8 getRacePlayerCount(); + static const u8 getRacePlayerCount(); s16 updateRating(u8 playerIdx); u8 update(); s32 getLocalPlayerCount(u8 playerIdx); From da40c01a7f5becc4d66b92f8bddae773ff01188d Mon Sep 17 00:00:00 2001 From: Aiden Date: Sun, 24 Jul 2022 21:32:10 -0400 Subject: [PATCH 32/37] MenuScenario: initRace --- pack/symbols.txt | 10 +- source/game/system/RaceConfig.cpp | 283 ++++++++---------------------- source/game/system/RaceConfig.hpp | 25 ++- 3 files changed, 98 insertions(+), 220 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 148e1db7b..a3d3177c1 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -9780,16 +9780,16 @@ 0x8052e950 unk_8052e950 0x8052ed18 getGametype__Q26System12MenuScenarioFv 0x8052ed20 getPlayerType__Q26System16RaceConfigPlayerFv -0x8052ed28 RacedataScenario_postInitControllers +0x8052ed28 postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario 0x8052eef0 unk_8052eef0 0x8052efd4 resetPlayers__Q26System18RaceConfigScenarioFv 0x8052f064 unk_8052f064 -0x8052f1e0 RacedataScenario_copyPrevPositions -0x8052f4e8 RacedataScenario_initControllers +0x8052f1e0 copyPrevPositions__Q26System12MenuScenarioFv +0x8052f4e8 initControllers__Q26System12MenuScenarioFUc 0x8052f788 computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc -0x8052f924 RacedataScenario_initRng +0x8052f924 initRng__Q26System12MenuScenarioFv 0x8052fa0c unk_8052fa0c -0x8052fb90 RacedataScenario_initRace +0x8052fb90 initRace__Q26System12MenuScenarioFPQ26System12RaceScenario 0x8052fe58 Racedata_initStaticInstance 0x8052ffe8 Racedata_destroyStaticInstance 0x80530038 Racedata_destroy diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index c9bf47059..e59dadedc 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -457,7 +457,7 @@ asm UNKNOWN_FUNCTION(Racedata_init) { bctrl; addi r3, r31, 0xc10; addi r4, r31, 0x20; - bl RacedataScenario_initRace; + bl initRace__Q26System12MenuScenarioFPQ26System12RaceScenario; lbz r9, 0xc14(r31); addi r3, r31, 0x28; lbz r8, 0xc15(r31); @@ -1026,11 +1026,14 @@ s32 RaceConfigPlayer::getPlayerType() { return mPlayerType; } } // namespace System -// Symbol: RacedataScenario_postInitControllers +// Symbol: postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario // PAL: 0x8052ed28..0x8052eef0 // Scratch: https://decomp.me/scratch/aw5WV -MARK_BINARY_BLOB(RacedataScenario_postInitControllers, 0x8052ed28, 0x8052eef0); -asm UNKNOWN_FUNCTION(RacedataScenario_postInitControllers) { +MARK_BINARY_BLOB( + postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario, + 0x8052ed28, 0x8052eef0); +asm UNKNOWN_FUNCTION( + postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario) { // clang-format off nofralloc; stwu r1, -0x20(r1); @@ -1390,11 +1393,12 @@ asm UNKNOWN_FUNCTION(unk_8052f064) { // clang-format on } -// Symbol: RacedataScenario_copyPrevPositions +// Symbol: copyPrevPositions__Q26System12MenuScenarioFv // PAL: 0x8052f1e0..0x8052f4e8 // Scratch: https://decomp.me/scratch/w7jKr -MARK_BINARY_BLOB(RacedataScenario_copyPrevPositions, 0x8052f1e0, 0x8052f4e8); -asm UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions) { +MARK_BINARY_BLOB(copyPrevPositions__Q26System12MenuScenarioFv, 0x8052f1e0, + 0x8052f4e8); +asm UNKNOWN_FUNCTION(copyPrevPositions__Q26System12MenuScenarioFv) { // clang-format off nofralloc; stwu r1, -0x20(r1); @@ -1608,11 +1612,12 @@ asm UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions) { // clang-format on } -// Symbol: RacedataScenario_initControllers +// Symbol: initControllers__Q26System12MenuScenarioFUc // PAL: 0x8052f4e8..0x8052f788 // Scratch: https://decomp.me/scratch/V2Pce -MARK_BINARY_BLOB(RacedataScenario_initControllers, 0x8052f4e8, 0x8052f788); -asm UNKNOWN_FUNCTION(RacedataScenario_initControllers) { +MARK_BINARY_BLOB(initControllers__Q26System12MenuScenarioFUc, 0x8052f4e8, + 0x8052f788); +asm UNKNOWN_FUNCTION(initControllers__Q26System12MenuScenarioFUc) { // clang-format off nofralloc; stwu r1, -0x110(r1); @@ -1870,11 +1875,11 @@ void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, } // namespace System -// Symbol: RacedataScenario_initRng +// Symbol: initRng__Q26System12MenuScenarioFv // PAL: 0x8052f924..0x8052fa0c // Scratch: https://decomp.me/scratch/Y23JS -MARK_BINARY_BLOB(RacedataScenario_initRng, 0x8052f924, 0x8052fa0c); -asm UNKNOWN_FUNCTION(RacedataScenario_initRng) { +MARK_BINARY_BLOB(initRng__Q26System12MenuScenarioFv, 0x8052f924, 0x8052fa0c); +asm UNKNOWN_FUNCTION(initRng__Q26System12MenuScenarioFv) { // clang-format off nofralloc; stwu r1, -0x10(r1); @@ -2058,202 +2063,60 @@ asm UNKNOWN_FUNCTION(unk_8052fa0c) { // clang-format on } -// Symbol: RacedataScenario_initRace -// PAL: 0x8052fb90..0x8052fe58 -// Scratch: https://decomp.me/scratch/omAC0 -MARK_BINARY_BLOB(RacedataScenario_initRace, 0x8052fb90, 0x8052fe58); -asm UNKNOWN_FUNCTION(RacedataScenario_initRace) { - // clang-format off - nofralloc; - stwu r1, -0x20(r1); - mflr r0; - stw r0, 0x24(r1); - li r0, 0; - stw r31, 0x1c(r1); - stw r30, 0x18(r1); - mr r30, r4; - stw r29, 0x14(r1); - mr r29, r3; - stw r28, 0x10(r1); - stb r0, 0xa(r1); - stb r0, 9(r1); - stb r0, 8(r1); - lwz r0, 0xb70(r3); - rlwinm. r0, r0, 0, 0x1d, 0x1d; - beq lbl_8052fbd4; - bl unk_8052fa0c; -lbl_8052fbd4: - mr r3, r29; - bl RacedataScenario_copyPrevPositions; - li r5, 0; - li r0, -1; - mulli r8, r5, 0xf0; - mr r3, r29; - li r5, 6; - addi r4, r1, 0xa; - add r7, r29, r8; - addi r6, r1, 8; - stb r0, 0xd(r7); - mulli r8, r5, 0xf0; - addi r5, r1, 9; - stb r0, 0xe(r7); - stb r0, 0xfd(r7); - stb r0, 0xfe(r7); - stb r0, 0x1ed(r7); - stb r0, 0x1ee(r7); - stb r0, 0x2dd(r7); - stb r0, 0x2de(r7); - stb r0, 0x3cd(r7); - stb r0, 0x3ce(r7); - stb r0, 0x4bd(r7); - stb r0, 0x4be(r7); - add r7, r29, r8; - stb r0, 0xd(r7); - stb r0, 0xe(r7); - stb r0, 0xfd(r7); - stb r0, 0xfe(r7); - stb r0, 0x1ed(r7); - stb r0, 0x1ee(r7); - stb r0, 0x2dd(r7); - stb r0, 0x2de(r7); - stb r0, 0x3cd(r7); - stb r0, 0x3ce(r7); - stb r0, 0x4bd(r7); - stb r0, 0x4be(r7); - stb r0, 0xb64(r29); - stb r0, 0xb65(r29); - stb r0, 0xb66(r29); - stb r0, 0xb67(r29); - bl computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc; - lwz r0, 0xb54(r29); - lbz r31, 9(r1); - cmpwi r0, 5; - bne lbl_8052fc94; - li r0, 1; - stb r0, 9(r1); -lbl_8052fc94: - lbz r0, 0xb6c(r29); - cmpwi r0, 0; - bne lbl_8052fdfc; - lwz r4, 0xb50(r29); - li r0, 0; - lbz r3, 0xa(r1); - cmpwi r4, 7; - blt lbl_8052fcc0; - cmpwi r4, 0xa; - bgt lbl_8052fcc0; - li r0, 1; -lbl_8052fcc0: - cmpwi r0, 0; - bne lbl_8052fdfc; - cmpwi r3, 0; - li r4, 0; - beq lbl_8052fdfc; - cmplwi r3, 8; - addi r0, r3, 0xf8; - ble lbl_8052fdc8; - clrlwi r5, r0, 0x18; - li r11, 0; - addi r0, r5, 7; - srwi r0, r0, 3; - mtctr r0; - cmplwi r5, 0; - ble lbl_8052fdc8; -lbl_8052fcfc: - clrlwi r7, r4, 0x18; - addi r5, r4, 1; - mulli r6, r7, 0xf0; - addi r0, r4, 2; - clrlwi r10, r5, 0x18; - clrlwi r9, r0, 0x18; - add r12, r29, r6; - addi r0, r4, 3; - sth r11, 0xe0(r12); - clrlwi r8, r0, 0x18; - subf r28, r7, r3; - addi r0, r4, 4; - stb r28, 0xe9(r12); - clrlwi r7, r0, 0x18; - addi r6, r4, 5; - addi r5, r4, 6; - stb r28, 0xe8(r12); - addi r0, r4, 7; - clrlwi r6, r6, 0x18; - clrlwi r5, r5, 0x18; - sth r11, 0x1d0(r12); - subf r10, r10, r3; - clrlwi r0, r0, 0x18; - subf r9, r9, r3; - stb r10, 0x1d9(r12); - subf r8, r8, r3; - subf r7, r7, r3; - subf r6, r6, r3; - stb r10, 0x1d8(r12); - subf r5, r5, r3; - subf r0, r0, r3; - addi r4, r4, 8; - sth r11, 0x2c0(r12); - stb r9, 0x2c9(r12); - stb r9, 0x2c8(r12); - sth r11, 0x3b0(r12); - stb r8, 0x3b9(r12); - stb r8, 0x3b8(r12); - sth r11, 0x4a0(r12); - stb r7, 0x4a9(r12); - stb r7, 0x4a8(r12); - sth r11, 0x590(r12); - stb r6, 0x599(r12); - stb r6, 0x598(r12); - sth r11, 0x680(r12); - stb r5, 0x689(r12); - stb r5, 0x688(r12); - sth r11, 0x770(r12); - stb r0, 0x779(r12); - stb r0, 0x778(r12); - bdnz lbl_8052fcfc; -lbl_8052fdc8: - li r5, 0; - b lbl_8052fdf0; -lbl_8052fdd0: - clrlwi r6, r4, 0x18; - addi r4, r4, 1; - mulli r0, r6, 0xf0; - subf r7, r6, r3; - add r6, r29, r0; - sth r5, 0xe0(r6); - stb r7, 0xe9(r6); - stb r7, 0xe8(r6); -lbl_8052fdf0: - clrlwi r0, r4, 0x18; - cmplw r0, r3; - blt lbl_8052fdd0; -lbl_8052fdfc: - lbz r4, 9(r1); - mr r3, r29; - bl RacedataScenario_initControllers; - mr r3, r29; - mr r4, r30; - bl RacedataScenario_postInitControllers; - mr r3, r29; - bl RacedataScenario_initRng; - lbz r0, 0xa(r1); - stb r0, 4(r29); - lbz r0, 9(r1); - stb r0, 5(r29); - stb r31, 7(r29); - lbz r0, 8(r1); - stb r0, 6(r29); - lwz r31, 0x1c(r1); - lwz r30, 0x18(r1); - lwz r29, 0x14(r1); - lwz r28, 0x10(r1); - lwz r0, 0x24(r1); - mtlr r0; - addi r1, r1, 0x20; - blr; - // clang-format on +namespace System { + +void MenuScenario::initRace(RaceScenario* raceScenario) { + u8 playerCount = 0; + u8 hudCount = 0; + u8 localPlayerCount = 0; + + if (mSettings.mModeFlags & 4) { + unk_8052fa0c(); + } + + copyPrevPositions(); + + for (u8 i = 0; i < 12; i++) { + RaceConfigPlayer* player = getPlayer(i); + player->mLocalPlayerNum = -1; + player->mPlayerInputIdx = -1; + } + + for (u8 i = 0; i < 4; i++) { + mSettings.mHudPlayerIds[i] = -1; + } + + computePlayerCounts(&playerCount, &hudCount, &localPlayerCount); + + u8 hudCount_ = hudCount; + if (mSettings.mGameType == 5) { + hudCount = 1; + } + + if (mSettings.mRaceNumber == 0) { + u8 playerCount_ = playerCount; + if (!isOnline(mSettings.mGameMode)) { + for (u8 i = 0; i < playerCount_; i++) { + RaceConfigPlayer* player = getPlayer(i); + player->mPreviousScore = 0; + player->mPrevFinishPos = playerCount_ - i; + player->_e0 = playerCount_ - i; + } + } + } + + initControllers(hudCount); + postInitControllers(raceScenario); + initRng(); + + mPlayerCount = playerCount; + mHudCount = hudCount; + mHudCount2 = hudCount_; + mLocalPlayerCount = localPlayerCount; } +} // namespace System + // Symbol: Racedata_initStaticInstance // PAL: 0x8052fe58..0x8052ffe8 // Scratch: N/A (trivial to match when RaceConfig ctor matches) @@ -2631,7 +2494,7 @@ asm UNKNOWN_FUNCTION(Racedata_initRace) { mr r31, r3; addi r3, r3, 0xc10; addi r4, r31, 0x20; - bl RacedataScenario_initRace; + bl initRace__Q26System12MenuScenarioFPQ26System12RaceScenario; lbz r9, 0xc14(r31); addi r4, r31, 0x28; lbz r8, 0xc15(r31); @@ -3669,7 +3532,7 @@ asm UNKNOWN_FUNCTION(Racedata_initCredits) { addi r4, r31, 0x20; stw r0, 0x17fc(r3); addi r3, r3, 0xc10; - bl RacedataScenario_initRace; + bl initRace__Q26System12MenuScenarioFPQ26System12RaceScenario; lbz r9, 0xc14(r31); addi r3, r31, 0x28; lbz r8, 0xc15(r31); @@ -4118,7 +3981,7 @@ asm UNKNOWN_FUNCTION(Racedata_initCredits) { ble lbl_80531864; addi r3, r31, 0xc10; addi r4, r31, 0x20; - bl RacedataScenario_initRace; + bl initRace__Q26System12MenuScenarioFPQ26System12RaceScenario; lbz r9, 0xc14(r31); addi r3, r31, 0x28; lbz r8, 0xc15(r31); diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 46b2e9784..ecc8f6e9f 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -63,7 +63,8 @@ UNKNOWN_FUNCTION(getGametype__Q26System12MenuScenarioFv); // PAL: 0x8052ed20..0x8052ed28 UNKNOWN_FUNCTION(getPlayerType__Q26System16RaceConfigPlayerFv); // PAL: 0x8052ed28..0x8052eef0 -UNKNOWN_FUNCTION(RacedataScenario_postInitControllers); +UNKNOWN_FUNCTION( + postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario); // PAL: 0x8052eef0..0x8052efd4 UNKNOWN_FUNCTION(unk_8052eef0); // PAL: 0x8052efd4..0x8052f064 @@ -71,17 +72,17 @@ UNKNOWN_FUNCTION(resetPlayers__Q26System18RaceConfigScenarioFv); // PAL: 0x8052f064..0x8052f1e0 UNKNOWN_FUNCTION(unk_8052f064); // PAL: 0x8052f1e0..0x8052f4e8 -UNKNOWN_FUNCTION(RacedataScenario_copyPrevPositions); +UNKNOWN_FUNCTION(copyPrevPositions__Q26System12MenuScenarioFv); // PAL: 0x8052f4e8..0x8052f788 -UNKNOWN_FUNCTION(RacedataScenario_initControllers); +UNKNOWN_FUNCTION(initControllers__Q26System12MenuScenarioFUc); // PAL: 0x8052f788..0x8052f924 UNKNOWN_FUNCTION(computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc); // PAL: 0x8052f924..0x8052fa0c -UNKNOWN_FUNCTION(RacedataScenario_initRng); +UNKNOWN_FUNCTION(initRng__Q26System12MenuScenarioFv); // PAL: 0x8052fa0c..0x8052fb90 UNKNOWN_FUNCTION(unk_8052fa0c); // PAL: 0x8052fb90..0x8052fe58 -UNKNOWN_FUNCTION(RacedataScenario_initRace); +UNKNOWN_FUNCTION(initRace__Q26System12MenuScenarioFPQ26System12RaceScenario); // PAL: 0x8052fe58..0x8052ffe8 UNKNOWN_FUNCTION(Racedata_initStaticInstance); // PAL: 0x8052ffe8..0x80530038 @@ -211,6 +212,15 @@ class RaceConfigScenario { void reset(); u8 update(); void resetPlayers(); + + // This is required for some MenuScenario methods + // We're basically tricking the compiler into doing two comparisons + inline bool isOnlineLower(s32 mode) { return mode >= 7; } + inline bool isOnlineHigher(s32 mode) { return mode <= 10; } + inline bool isOnline(s32 mode) { + return !isOnlineLower(mode) || !isOnlineHigher(mode) ? false : true; + } + // private: u8 mPlayerCount; u8 mHudCount; @@ -234,8 +244,13 @@ class MenuScenario : public RaceConfigScenario { MenuScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} RaceConfigPlayer* getPlayer(u8 idx); s32 getGametype(); + void postInitControllers(RaceScenario* raceScenario); bool initGhost(u8 playerIdx, u8 playerInputIdx); void computePlayerCounts(u8* playerCount, u8* hudCount, u8* localPlayerCount); + void initRng(); + void copyPrevPositions(); + void initControllers(u8 controllerCount); + void initRace(RaceScenario* raceScenario); u32 getModeFlag(); }; class AwardsScenario : public RaceConfigScenario { From 6a29c5492b64d0c13e2a3c87832e99e44602eee7 Mon Sep 17 00:00:00 2001 From: Aiden Date: Mon, 25 Jul 2022 16:05:13 -0400 Subject: [PATCH 33/37] RaceConfig: initPlayers --- source/game/system/RaceConfig.cpp | 143 +++--------------------------- source/game/system/RaceConfig.hpp | 1 + 2 files changed, 15 insertions(+), 129 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index e59dadedc..c5ed3e532 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -1281,118 +1281,21 @@ void RaceConfigScenario::resetPlayers() { } } -} // namespace System +void MenuScenario::initPlayers(u8 playerCount) { + if (isOnline(mSettings.mGameMode)) { + return; + } -// Symbol: unk_8052f064 -// PAL: 0x8052f064..0x8052f1e0 -// Scratch: https://decomp.me/scratch/ANzFM -MARK_BINARY_BLOB(unk_8052f064, 0x8052f064, 0x8052f1e0); -asm UNKNOWN_FUNCTION(unk_8052f064) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - li r0, 0; - stw r31, 0xc(r1); - stw r30, 8(r1); - lwz r5, 0xb50(r3); - cmpwi r5, 7; - blt lbl_8052f08c; - cmpwi r5, 0xa; - bgt lbl_8052f08c; - li r0, 1; -lbl_8052f08c: - cmpwi r0, 0; - bne lbl_8052f1d0; - cmpwi r4, 0; - li r5, 0; - beq lbl_8052f1d0; - cmplwi r4, 8; - addi r0, r4, 0xf8; - ble lbl_8052f194; - clrlwi r6, r0, 0x18; - li r12, 0; - addi r0, r6, 7; - srwi r0, r0, 3; - mtctr r0; - cmplwi r6, 0; - ble lbl_8052f194; -lbl_8052f0c8: - clrlwi r8, r5, 0x18; - addi r6, r5, 1; - mulli r7, r8, 0xf0; - addi r0, r5, 2; - clrlwi r11, r6, 0x18; - clrlwi r10, r0, 0x18; - add r31, r3, r7; - addi r0, r5, 3; - sth r12, 0xe0(r31); - clrlwi r9, r0, 0x18; - subf r30, r8, r4; - addi r0, r5, 4; - stb r30, 0xe9(r31); - clrlwi r8, r0, 0x18; - addi r7, r5, 5; - addi r6, r5, 6; - stb r30, 0xe8(r31); - addi r0, r5, 7; - clrlwi r7, r7, 0x18; - clrlwi r6, r6, 0x18; - sth r12, 0x1d0(r31); - subf r11, r11, r4; - clrlwi r0, r0, 0x18; - subf r10, r10, r4; - stb r11, 0x1d9(r31); - subf r9, r9, r4; - subf r8, r8, r4; - subf r7, r7, r4; - stb r11, 0x1d8(r31); - subf r6, r6, r4; - subf r0, r0, r4; - addi r5, r5, 8; - sth r12, 0x2c0(r31); - stb r10, 0x2c9(r31); - stb r10, 0x2c8(r31); - sth r12, 0x3b0(r31); - stb r9, 0x3b9(r31); - stb r9, 0x3b8(r31); - sth r12, 0x4a0(r31); - stb r8, 0x4a9(r31); - stb r8, 0x4a8(r31); - sth r12, 0x590(r31); - stb r7, 0x599(r31); - stb r7, 0x598(r31); - sth r12, 0x680(r31); - stb r6, 0x689(r31); - stb r6, 0x688(r31); - sth r12, 0x770(r31); - stb r0, 0x779(r31); - stb r0, 0x778(r31); - bdnz lbl_8052f0c8; -lbl_8052f194: - clrlwi r6, r5, 0x18; - li r7, 0; - subf r0, r6, r4; - mtctr r0; - cmplw r6, r4; - bge lbl_8052f1d0; -lbl_8052f1ac: - clrlwi r6, r5, 0x18; - addi r5, r5, 1; - mulli r0, r6, 0xf0; - subf r8, r6, r4; - add r6, r3, r0; - sth r7, 0xe0(r6); - stb r8, 0xe9(r6); - stb r8, 0xe8(r6); - bdnz lbl_8052f1ac; -lbl_8052f1d0: - lwz r31, 0xc(r1); - lwz r30, 8(r1); - addi r1, r1, 0x10; - blr; - // clang-format on + for (u8 i = 0; i < playerCount; i++) { + RaceConfigPlayer* player = getPlayer(i); + player->mPreviousScore = 0; + player->mPrevFinishPos = playerCount - i; + player->_e0 = playerCount - i; + } } +} // namespace System + // Symbol: copyPrevPositions__Q26System12MenuScenarioFv // PAL: 0x8052f1e0..0x8052f4e8 // Scratch: https://decomp.me/scratch/w7jKr @@ -2075,17 +1978,7 @@ void MenuScenario::initRace(RaceScenario* raceScenario) { } copyPrevPositions(); - - for (u8 i = 0; i < 12; i++) { - RaceConfigPlayer* player = getPlayer(i); - player->mLocalPlayerNum = -1; - player->mPlayerInputIdx = -1; - } - - for (u8 i = 0; i < 4; i++) { - mSettings.mHudPlayerIds[i] = -1; - } - + resetPlayers(); computePlayerCounts(&playerCount, &hudCount, &localPlayerCount); u8 hudCount_ = hudCount; @@ -2094,15 +1987,7 @@ void MenuScenario::initRace(RaceScenario* raceScenario) { } if (mSettings.mRaceNumber == 0) { - u8 playerCount_ = playerCount; - if (!isOnline(mSettings.mGameMode)) { - for (u8 i = 0; i < playerCount_; i++) { - RaceConfigPlayer* player = getPlayer(i); - player->mPreviousScore = 0; - player->mPrevFinishPos = playerCount_ - i; - player->_e0 = playerCount_ - i; - } - } + initPlayers(playerCount); } initControllers(hudCount); diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index ecc8f6e9f..4a7e79972 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -246,6 +246,7 @@ class MenuScenario : public RaceConfigScenario { s32 getGametype(); void postInitControllers(RaceScenario* raceScenario); bool initGhost(u8 playerIdx, u8 playerInputIdx); + void initPlayers(u8 playerCount); void computePlayerCounts(u8* playerCount, u8* hudCount, u8* localPlayerCount); void initRng(); void copyPrevPositions(); From 24dd571f779a6845ebea114bec1718c46d44a30d Mon Sep 17 00:00:00 2001 From: Aiden Date: Mon, 25 Jul 2022 21:27:52 -0400 Subject: [PATCH 34/37] RaceConfig: create enums --- pack/symbols.txt | 6 +-- source/game/system/RaceConfig.cpp | 73 ++++++++++++++------------- source/game/system/RaceConfig.hpp | 84 ++++++++++++++++++++++++++----- 3 files changed, 114 insertions(+), 49 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 8069605b8..728c2f030 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -10045,19 +10045,19 @@ 0x8052e42c setCharacter__Q26System16RaceConfigPlayerFQ26System11CharacterId 0x8052e434 getPlayer__Q26System12MenuScenarioFUc 0x8052e444 setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId -0x8052e44c setPlayerType__Q26System16RaceConfigPlayerFl +0x8052e44c setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType 0x8052e454 reset__Q26System10RaceConfigFv 0x8052e658 setPrevFinishPos__Q26System16RaceConfigPlayerFSc 0x8052e660 setUnkPos__Q26System16RaceConfigPlayerFSc 0x8052e668 reset__Q26System18RaceConfigScenarioFv 0x8052e870 updateRating__Q26System10RaceConfigFUc 0x8052e950 unk_8052e950 -0x8052ed18 getGametype__Q26System12MenuScenarioFv +0x8052ed18 getGameType__Q26System12MenuScenarioFv 0x8052ed20 getPlayerType__Q26System16RaceConfigPlayerFv 0x8052ed28 postInitControllers__Q26System12MenuScenarioFPQ26System12RaceScenario 0x8052eef0 unk_8052eef0 0x8052efd4 resetPlayers__Q26System18RaceConfigScenarioFv -0x8052f064 unk_8052f064 +0x8052f064 initPlayers__Q26System12MenuScenarioFUc 0x8052f1e0 copyPrevPositions__Q26System12MenuScenarioFv 0x8052f4e8 initControllers__Q26System12MenuScenarioFUc 0x8052f788 computePlayerCounts__Q26System12MenuScenarioFPUcPUcPUc diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index c5ed3e532..55c627598 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -80,8 +80,9 @@ const u16 SCORES[] = {60, 52, 40, 20}; RaceConfigPlayer::RaceConfigPlayer() : _04(0), mLocalPlayerNum(-1), mPlayerInputIdx(-1), - mVehicleId(STANDARD_KART_M), mCharacterId(MARIO), mPlayerType(0), mMii(7), - mControllerId(-1), _d4(8), mRating(), _ec(_ec & ~0x80) {} + mVehicleId(STANDARD_KART_M), mCharacterId(MARIO), + mPlayerType(PLAYER_TYPE_REAL_LOCAL), mMii(7), mControllerId(-1), _d4(8), + mRating(), _ec(_ec & ~0x80) {} void RaceConfigPlayer::appendParamFile(RaceConfig* raceConfig) { raceConfig->append(mVehicleId, InitScene::spInstance->mHeapCollection @@ -121,9 +122,9 @@ s32 RaceConfigPlayer::computeGpRank() const { RaceConfigScenario::RaceConfigScenario(RawGhostFile* ghost) : mPlayerCount(0), mHudCount(0), mPlayers() { mSettings.mCourseId = GCN_MARIO_CIRCUIT; - mSettings.mGameMode = 0; - mSettings.mGameType = 0; - mSettings.mCupId = 0; + mSettings.mGameMode = GAMEMODE_GRAND_PRIX; + mSettings.mGameType = GAMETYPE_TIME_ATTACK; + mSettings.mCupId = MUSHROOM_CUP; // seems dubious memset(&this->_b7c, 0, 0x70); @@ -652,7 +653,7 @@ RaceConfigPlayer* MenuScenario::getPlayer(u8 idx) { return &mPlayers[idx]; } void RaceConfigPlayer::setVehicle(VehicleId vehicle) { mVehicleId = vehicle; } -void RaceConfigPlayer::setPlayerType(s32 playerType) { +void RaceConfigPlayer::setPlayerType(PlayerType playerType) { mPlayerType = playerType; } @@ -1020,9 +1021,9 @@ asm UNKNOWN_FUNCTION(unk_8052e950) { namespace System { -s32 MenuScenario::getGametype() { return mSettings.mGameType; } +GameType MenuScenario::getGameType() { return mSettings.mGameType; } -s32 RaceConfigPlayer::getPlayerType() { return mPlayerType; } +PlayerType RaceConfigPlayer::getPlayerType() { return mPlayerType; } } // namespace System @@ -1720,16 +1721,16 @@ void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, u8 localPlayerCount_ = 0; for (u8 i = 0; i < 12; i++) { - const s32 playerType = mPlayers[i].mPlayerType; + const PlayerType playerType = mPlayers[i].mPlayerType; // Check if player exists - if (playerType == 5) { + if (playerType == PLAYER_TYPE_NONE) { continue; } playerCount_++; // Check if player is local - if (playerType != 0) { + if (playerType != PLAYER_TYPE_REAL_LOCAL) { continue; } @@ -1750,18 +1751,18 @@ void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, } // Set HUD count based on menu game type - const s32 gameType = mSettings.mGameType; - if (gameType == 2) { + const GameType gameType = mSettings.mGameType; + if (gameType == GAMETYPE_UNK_2) { hudCount_ = 1; - } else if (gameType == 3) { + } else if (gameType == GAMETYPE_UNK_3) { hudCount_ = 2; - } else if (gameType == 4) { + } else if (gameType == GAMETYPE_UNK_4) { hudCount_ = 4; } // Cap player count on awards - if (mSettings.mGameMode == 11) { - if (gameType == 7) { + if (mSettings.mGameMode == GAMEMODE_AWARDS) { + if (gameType == GAMETYPE_GRAND_PRIX_WIN) { // Cap player count on GP win if (3 < playerCount_) { playerCount_ = 3; @@ -1982,7 +1983,7 @@ void MenuScenario::initRace(RaceScenario* raceScenario) { computePlayerCounts(&playerCount, &hudCount, &localPlayerCount); u8 hudCount_ = hudCount; - if (mSettings.mGameType == 5) { + if (mSettings.mGameType == GAMETYPE_GAMEPLAY) { hudCount = 1; } @@ -2773,7 +2774,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r30, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 5; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; clrlwi r4, r30, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; @@ -2789,12 +2790,12 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { cmplwi r30, 0xc; blt lbl_8053088c; addi r3, r31, 0xc10; - bl getGametype__Q26System12MenuScenarioFv; + bl getGameType__Q26System12MenuScenarioFv; addi r0, r3, -7; addi r3, r31, 0xc10; cntlzw r0, r0; srwi r29, r0, 5; - bl getGametype__Q26System12MenuScenarioFv; + bl getGameType__Q26System12MenuScenarioFv; addi r0, r3, -12; addi r3, r31, 0xc10; cntlzw r0, r0; @@ -2846,7 +2847,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { addi r3, r31, 0xc10; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; mr r4, r27; addi r3, r31, 0xc10; bl getPlayer__Q26System12MenuScenarioFUc; @@ -2960,7 +2961,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r27, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; clrlwi r4, r27, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; @@ -3044,7 +3045,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r27, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; clrlwi r4, r27, 0x18; addi r3, r31, 0xc10; addi r29, r4, 1; @@ -3121,7 +3122,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { clrlwi r4, r25, 0x18; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; clrlwi r4, r25, 0x18; addi r3, r31, 0xc10; addi r30, r4, 1; @@ -3177,7 +3178,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { li r4, 0; bl getPlayer__Q26System12MenuScenarioFUc; li r4, 1; - bl setPlayerType__Q26System16RaceConfigPlayerFl; + bl setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType; addi r3, r31, 0xc10; li r4, 0; bl getPlayer__Q26System12MenuScenarioFUc; @@ -4168,7 +4169,7 @@ s8 RaceConfig::getHudPlayerId(u8 playerIdx) { } void RaceConfig::loadNextCourse() { - if (mRaceScenario.mSettings.mGameMode != 0) { + if (mRaceScenario.mSettings.mGameMode != GAMEMODE_GRAND_PRIX) { return; } @@ -4183,19 +4184,21 @@ void RaceConfig::loadNextCourse() { // Unsure what to call this because I'm unsure of what it does bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { - s32 gameType = mRaceScenario.mSettings.mGameType; - if (gameType > 1 && gameType < 5) { + GameType gameType = mRaceScenario.mSettings.mGameType; + // UNK_2, UNK_3, UNK_4 return true + if (gameType > GAMETYPE_REPLAY && gameType < GAMETYPE_GAMEPLAY) { return true; } - if (gameType == 1) { + if (gameType == GAMETYPE_REPLAY) { return true; } s32 playerId = mRaceScenario.mSettings.mHudPlayerIds[hudPlayerIdx]; if (playerId >= 0) { - s32 playerType = mRaceScenario.mPlayers[(u8)playerId].mPlayerType; - if (playerType != 0 && playerType != 3) { + PlayerType playerType = mRaceScenario.mPlayers[(u8)playerId].mPlayerType; + if (playerType != PLAYER_TYPE_REAL_LOCAL && + playerType != PLAYER_TYPE_GHOST) { return true; } } @@ -4206,9 +4209,11 @@ bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { bool RaceConfig::isTimeAttackReplay() { const s32 gameMode = mRaceScenario.mSettings.mGameMode; - return ((gameMode == 2 || gameMode == 5) && + return ((gameMode == GAMEMODE_TIME_TRIAL || + gameMode == GAMEMODE_GHOST_RACE) && spInstance->mRaceScenario.mPlayerCount != 0 && - spInstance->mRaceScenario.mPlayers[0].mPlayerType == 3) + spInstance->mRaceScenario.mPlayers[0].mPlayerType == + PLAYER_TYPE_GHOST) ? true : false; } diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 4a7e79972..714a735f7 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -45,7 +45,8 @@ UNKNOWN_FUNCTION(getPlayer__Q26System12MenuScenarioFUc); // PAL: 0x8052e444..0x8052e44c UNKNOWN_FUNCTION(setVehicle__Q26System16RaceConfigPlayerFQ26System9VehicleId); // PAL: 0x8052e44c..0x8052e454 -UNKNOWN_FUNCTION(setPlayerType__Q26System16RaceConfigPlayerFl); +UNKNOWN_FUNCTION( + setPlayerType__Q26System16RaceConfigPlayerFQ26System10PlayerType); // PAL: 0x8052e454..0x8052e658 UNKNOWN_FUNCTION(Racedata_resetSomeStuff); // PAL: 0x8052e658..0x8052e660 @@ -59,7 +60,7 @@ UNKNOWN_FUNCTION(unk_8052e870); // PAL: 0x8052e950..0x8052ed18 UNKNOWN_FUNCTION(unk_8052e950); // PAL: 0x8052ed18..0x8052ed20 -UNKNOWN_FUNCTION(getGametype__Q26System12MenuScenarioFv); +UNKNOWN_FUNCTION(getGameType__Q26System12MenuScenarioFv); // PAL: 0x8052ed20..0x8052ed28 UNKNOWN_FUNCTION(getPlayerType__Q26System16RaceConfigPlayerFv); // PAL: 0x8052ed28..0x8052eef0 @@ -143,6 +144,61 @@ UNKNOWN_FUNCTION(unk_8053207c); #endif namespace System { + +typedef enum { + PLAYER_TYPE_REAL_LOCAL = 0, + PLAYER_TYPE_CPU = 1, + PLAYER_TYPE_UNKNOWN = 2, + PLAYER_TYPE_GHOST = 3, + PLAYER_TYPE_REAL_ONLINE = 4, + PLAYER_TYPE_NONE = 5 +} PlayerType; + +// TODO: verify +typedef enum { + GAMEMODE_GRAND_PRIX = 0, + GAMEMODE_VS_RACE = 1, + GAMEMODE_TIME_TRIAL = 2, + GAMEMODE_BATTLE = 3, + GAMEMODE_MISSION_TOURNAMENT = 4, + GAMEMODE_GHOST_RACE = 5, + GAMEMODE_UNK_6 = 6, + GAMEMODE_PRIVATE_VS = 7, + GAMEMODE_PUBLIC_VS = 8, + GAMEMODE_PUBLIC_BATTLE = 9, + GAMEMODE_PRIVATE_BATTLE = 10, + GAMEMODE_AWARDS = 11, + GAMEMODE_CREDITS = 12 +} GameMode; + +// TODO: verify +typedef enum { + GAMETYPE_TIME_ATTACK = 0, + GAMETYPE_REPLAY = 1, + GAMETYPE_UNK_2 = 2, // possibly related to HUD count? + GAMETYPE_UNK_3 = 3, // + GAMETYPE_UNK_4 = 4, // + GAMETYPE_GAMEPLAY = 5, + GAMETYPE_LIVE_VIEW = 6, + GAMETYPE_GRAND_PRIX_WIN = 7, + GAMETYPE_SOLO_VS_WIN = 8, + GAMETYPE_TEAM_VS_WIN = 9, + GAMETYPE_BATTLE_WIN = 10, + GAMETYPE_UNK_11 = 11, + GAMETYPE_LOSS = 12 +} GameType; + +typedef enum { + MUSHROOM_CUP = 0, + FLOWER_CUP = 1, + STAR_CUP = 2, + SPECIAL_CUP = 3, + SHELL_CUP = 4, + BANANA_CUP = 5, + LEAF_CUP = 6, + LIGHTNING_CUP = 7 +} CupId; + // NOTE: anything marked u8, u16, or u32 could be signed class RaceConfig; @@ -155,11 +211,11 @@ class RaceConfigPlayer { BattleTeam getTeam(); void setCharacter(CharacterId character); void setVehicle(VehicleId vehicle); - void setPlayerType(s32 playerType); + void setPlayerType(PlayerType playerType); void reset(s8 pos); void setPrevFinishPos(s8 pos); void setUnkPos(s8 pos); - s32 getPlayerType(); + PlayerType getPlayerType(); u8 getUnkPos(); CharacterId getCharacter(); VehicleId getVehicle(); @@ -171,7 +227,7 @@ class RaceConfigPlayer { s8 mPlayerInputIdx; VehicleId mVehicleId; CharacterId mCharacterId; - s32 mPlayerType; // TODO: create enum + PlayerType mPlayerType; Mii mMii; BattleTeam mTeam; u32 mControllerId; @@ -190,13 +246,13 @@ class RaceConfigPlayer { struct RaceConfigSettings { CourseId mCourseId; u32 mEngineClass; // probably an enum - s32 mGameMode; // TODO: create enum - s32 mGameType; // TODO: create enum + GameMode mGameMode; + GameType mGameType; u32 mBattleType; u32 mCpuMode; u32 mItemMode; s8 mHudPlayerIds[4]; - s32 mCupId; // TODO: create enum + CupId mCupId; u8 mRaceNumber; u8 mLapCount; s32 mModeFlags; // TODO: create enum @@ -215,9 +271,13 @@ class RaceConfigScenario { // This is required for some MenuScenario methods // We're basically tricking the compiler into doing two comparisons - inline bool isOnlineLower(s32 mode) { return mode >= 7; } - inline bool isOnlineHigher(s32 mode) { return mode <= 10; } - inline bool isOnline(s32 mode) { + inline bool isOnlineLower(GameMode mode) { + return mode >= GAMEMODE_PRIVATE_VS; + } + inline bool isOnlineHigher(GameMode mode) { + return mode <= GAMEMODE_PRIVATE_BATTLE; + } + inline bool isOnline(GameMode mode) { return !isOnlineLower(mode) || !isOnlineHigher(mode) ? false : true; } @@ -243,7 +303,7 @@ class MenuScenario : public RaceConfigScenario { public: MenuScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} RaceConfigPlayer* getPlayer(u8 idx); - s32 getGametype(); + GameType getGameType(); void postInitControllers(RaceScenario* raceScenario); bool initGhost(u8 playerIdx, u8 playerInputIdx); void initPlayers(u8 playerCount); From 2c4c1af830f41c8ee484cc290a2b67a572cf0f39 Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 26 Jul 2022 14:17:02 -0400 Subject: [PATCH 35/37] RaceConfig: fix function names, add more enum info --- source/game/system/RaceConfig.cpp | 20 ++++++++++---------- source/game/system/RaceConfig.hpp | 20 +++++++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index 55c627598..e12ac7668 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -678,7 +678,9 @@ void RaceConfigScenario::reset() { mSettings.mCpuMode = 1; mSettings.mLapCount = 3; mSettings.mEngineClass = 1; - mSettings.mModeFlags = mSettings.mModeFlags & 0xFFFFFFF8; + mSettings.mModeFlags = + (RaceModeFlags)(mSettings.mModeFlags & + ~(SOMETHING_ONLINE | TEAM_MODE | MIRROR_MODE)); for (u8 i = 0; i < 12; i++) { getPlayer(i)->reset(i + 1); @@ -1750,13 +1752,13 @@ void MenuScenario::computePlayerCounts(u8* playerCount, u8* hudCount, hudCount_ = 4; } - // Set HUD count based on menu game type + // Set HUD count based on title screen const GameType gameType = mSettings.mGameType; - if (gameType == GAMETYPE_UNK_2) { + if (gameType == GAMETYPE_TITLE_ONE_PLAYER) { hudCount_ = 1; - } else if (gameType == GAMETYPE_UNK_3) { + } else if (gameType == GAMETYPE_TITLE_TWO_PLAYER) { hudCount_ = 2; - } else if (gameType == GAMETYPE_UNK_4) { + } else if (gameType == GAMETYPE_TITLE_FOUR_PLAYER) { hudCount_ = 4; } @@ -1974,7 +1976,7 @@ void MenuScenario::initRace(RaceScenario* raceScenario) { u8 hudCount = 0; u8 localPlayerCount = 0; - if (mSettings.mModeFlags & 4) { + if (mSettings.mModeFlags & SOMETHING_ONLINE) { unk_8052fa0c(); } @@ -3212,7 +3214,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { namespace System { -u32 MenuScenario::getModeFlag() { return mSettings.mModeFlags >> 1 & 1; } +bool MenuScenario::getModeFlag() { return mSettings.mModeFlags >> 1 & 1; } u8 RaceConfigPlayer::getUnkPos() { return this->_e0; } @@ -4182,10 +4184,8 @@ void RaceConfig::loadNextCourse() { COURSE_ORDER[mRaceScenario.mSettings.mCupId][raceNumber + 1]); } -// Unsure what to call this because I'm unsure of what it does -bool RaceConfig::unk_80531fc8(u8 hudPlayerIdx) { +bool RaceConfig::isLiveView(u8 hudPlayerIdx) { GameType gameType = mRaceScenario.mSettings.mGameType; - // UNK_2, UNK_3, UNK_4 return true if (gameType > GAMETYPE_REPLAY && gameType < GAMETYPE_GAMEPLAY) { return true; } diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 714a735f7..4b0e806d7 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -173,11 +173,11 @@ typedef enum { // TODO: verify typedef enum { - GAMETYPE_TIME_ATTACK = 0, + GAMETYPE_TIME_ATTACK = 0, // how are TIME_ATTACK and GAMEPLAY different? GAMETYPE_REPLAY = 1, - GAMETYPE_UNK_2 = 2, // possibly related to HUD count? - GAMETYPE_UNK_3 = 3, // - GAMETYPE_UNK_4 = 4, // + GAMETYPE_TITLE_ONE_PLAYER = 2, + GAMETYPE_TITLE_TWO_PLAYER = 3, + GAMETYPE_TITLE_FOUR_PLAYER = 4, GAMETYPE_GAMEPLAY = 5, GAMETYPE_LIVE_VIEW = 6, GAMETYPE_GRAND_PRIX_WIN = 7, @@ -199,6 +199,12 @@ typedef enum { LIGHTNING_CUP = 7 } CupId; +typedef enum { + MIRROR_MODE = 1, + TEAM_MODE = 2, + SOMETHING_ONLINE = 4 +} RaceModeFlags; + // NOTE: anything marked u8, u16, or u32 could be signed class RaceConfig; @@ -255,7 +261,7 @@ struct RaceConfigSettings { CupId mCupId; u8 mRaceNumber; u8 mLapCount; - s32 mModeFlags; // TODO: create enum + RaceModeFlags mModeFlags; u32 mSeed1; u32 mSeed2; }; @@ -312,7 +318,7 @@ class MenuScenario : public RaceConfigScenario { void copyPrevPositions(); void initControllers(u8 controllerCount); void initRace(RaceScenario* raceScenario); - u32 getModeFlag(); + bool getModeFlag(); }; class AwardsScenario : public RaceConfigScenario { public: @@ -344,7 +350,7 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { void setGhost(RawGhostFile* ghost); s8 getHudPlayerId(u8 playerIdx); void loadNextCourse(); - bool unk_80531fc8(u8 hudPlayerIdx); + bool isLiveView(u8 hudPlayerIdx); bool isTimeAttackReplay(); static RaceConfig* spInstance; From 4c294501f21714c8a9f1e68929d30b0cb0c069ec Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 26 Jul 2022 14:24:48 -0400 Subject: [PATCH 36/37] RaceConfig: isTeamMode name change --- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 4 ++-- source/game/system/RaceConfig.hpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 728c2f030..76b003a4b 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -10072,7 +10072,7 @@ 0x805302c4 Racedata_initRace 0x805305ac RacedataScenario_copy 0x80530864 Racedata_initAwards -0x80530f0c getModeFlag__Q26System12MenuScenarioFv +0x80530f0c isTeamMode__Q26System12MenuScenarioFv 0x80530f18 getUnkPos__Q26System16RaceConfigPlayerFv 0x80530f20 getCharacter__Q26System16RaceConfigPlayerFv 0x80530f28 getVehicle__Q26System16RaceConfigPlayerFv diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index e12ac7668..e07400476 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -2802,7 +2802,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { addi r3, r31, 0xc10; cntlzw r0, r0; srwi r30, r0, 5; - bl getModeFlag__Q26System12MenuScenarioFv; + bl isTeamMode__Q26System12MenuScenarioFv; cmpwi r29, 0; beq lbl_80530a2c; li r30, 1; @@ -3214,7 +3214,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { namespace System { -bool MenuScenario::getModeFlag() { return mSettings.mModeFlags >> 1 & 1; } +bool MenuScenario::isTeamMode() { return mSettings.mModeFlags >> 1 & 1; } u8 RaceConfigPlayer::getUnkPos() { return this->_e0; } diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index 4b0e806d7..ca1ec5960 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -101,7 +101,7 @@ UNKNOWN_FUNCTION(RacedataScenario_copy); // PAL: 0x80530864..0x80530f0c UNKNOWN_FUNCTION(Racedata_initAwards); // PAL: 0x80530f0c..0x80530f18 -UNKNOWN_FUNCTION(getModeFlag__Q26System12MenuScenarioFv); +UNKNOWN_FUNCTION(isTeamMode__Q26System12MenuScenarioFv); // PAL: 0x80530f18..0x80530f20 UNKNOWN_FUNCTION(getUnkPos__Q26System16RaceConfigPlayerFv); // PAL: 0x80530f20..0x80530f28 @@ -318,7 +318,7 @@ class MenuScenario : public RaceConfigScenario { void copyPrevPositions(); void initControllers(u8 controllerCount); void initRace(RaceScenario* raceScenario); - bool getModeFlag(); + bool isTeamMode(); }; class AwardsScenario : public RaceConfigScenario { public: From 5ec7eac2391ef360a609ed84fd6f4630807a1c64 Mon Sep 17 00:00:00 2001 From: vabold Date: Sun, 31 Jul 2022 11:00:17 -0400 Subject: [PATCH 37/37] RaceConfig: non-matching initAwards --- pack/symbols.txt | 2 +- source/game/system/RaceConfig.cpp | 125 +++++++++++++++++++++++++++++- source/game/system/RaceConfig.hpp | 15 ++++ 3 files changed, 140 insertions(+), 2 deletions(-) diff --git a/pack/symbols.txt b/pack/symbols.txt index 76b003a4b..b61b100d5 100644 --- a/pack/symbols.txt +++ b/pack/symbols.txt @@ -10085,7 +10085,7 @@ 0x80531f2c setGhost__Q26System10RaceConfigFPQ26System12RawGhostFile 0x80531f70 getHudPlayerId__Q26System10RaceConfigFUc 0x80531f80 loadNextCourse__Q26System10RaceConfigFv -0x80531fc8 unk_80531fc8__Q26System10RaceConfigFUc +0x80531fc8 isLiveView__Q26System10RaceConfigFUc 0x80532030 isTimeAttackReplay__Q26System10RaceConfigFv 0x80532070 vf18__Q26System10RaceConfigFv 0x80532074 vf14__Q26System10RaceConfigFv diff --git a/source/game/system/RaceConfig.cpp b/source/game/system/RaceConfig.cpp index e07400476..a6904f56b 100644 --- a/source/game/system/RaceConfig.cpp +++ b/source/game/system/RaceConfig.cpp @@ -2256,7 +2256,7 @@ asm UNKNOWN_FUNCTION(RacedataScenario_destroy) { #endif // Requires rodata from unk_8052e870 and unk_8052fa0c first -// Also may be a complete non-match +// Also may be completely non-equivalent #ifdef NON_MATCHING namespace System { @@ -2754,6 +2754,128 @@ asm UNKNOWN_FUNCTION(RacedataScenario_copy) { // clang-format on } +// Requires some inline-related pragma to be implemented correctly +#ifdef NON_MATCHING +namespace System { + +void RaceConfig::initAwards() { + initRace(); + mAwardsScenario.copy(&mRaceScenario); + + for (u8 i = 0; i < 12; i++) { + mMenuScenario.getPlayer(i)->setPlayerType(PLAYER_TYPE_NONE); + mMenuScenario.getPlayer(i)->setPrevFinishPos(i + 1); + mMenuScenario.getPlayer(i)->setUnkPos(i + 1); + } + + bool isGpWin = mMenuScenario.getGameType() == GAMETYPE_GRAND_PRIX_WIN; + bool isLoss = mMenuScenario.getGameType() == GAMETYPE_LOSS; + bool isTeamMode = mMenuScenario.isTeamMode(); + + if (isGpWin) { + for (u8 i = 1; i <= 3; i++) { + for (u8 j = 0; j < 12; j++) { + u8 unkPos = mRaceScenario.getPlayer(j)->getUnkPos(); + if (i != unkPos) { + continue; + } + + PlayerType playerType = mRaceScenario.getPlayer(j)->getPlayerType(); + if (playerType == PLAYER_TYPE_NONE) { + continue; + } + + u8 idx = i - 1; + copy(i, j, idx); + break; + } + } + } else if (isTeamMode) { + BattleTeam winningTeam = mRaceScenario.computeWinningTeam(); + BattleTeam winningTeam_ = (BattleTeam)(winningTeam == 0); + for (u8 i = 0; i < getRacePlayerCount(); i++) { + PlayerType playerType = mRaceScenario.getPlayer(i)->getPlayerType(); + if (playerType == PLAYER_TYPE_REAL_LOCAL) { + BattleTeam playerTeam = mRaceScenario.getPlayer(i)->getTeam(); + if (winningTeam == playerTeam) { + winningTeam_ = winningTeam; + break; + } + } + } + + u8 idx = 0; + for (u8 i = 1; i <= 12; i++) { + for (u8 j = 0; j < 12; j++) { + u8 unkPos = mRaceScenario.getPlayer(j)->getUnkPos(); + if (i != unkPos) { + continue; + } + + PlayerType playerType = mRaceScenario.getPlayer(j)->getPlayerType(); + if (playerType == PLAYER_TYPE_REAL_LOCAL) { + BattleTeam playerTeam = mRaceScenario.getPlayer(j)->getTeam(); + if (winningTeam_ != playerTeam) { + continue; + } + + copy(idx + 1, j, idx); + idx++; + } + } + } + + for (u8 i = 1; i <= 12; i++) { + for (u8 j = 0; j < 12; j++) { + u8 unkPos = mRaceScenario.getPlayer(j)->getUnkPos(); + if (i != unkPos) { + continue; + } + + PlayerType playerType = mRaceScenario.getPlayer(j)->getPlayerType(); + if (playerType == PLAYER_TYPE_NONE) { + continue; + } + + playerType = mRaceScenario.getPlayer(j)->getPlayerType(); + if (playerType != PLAYER_TYPE_REAL_LOCAL) { + BattleTeam playerTeam = mRaceScenario.getPlayer(j)->getTeam(); + if (winningTeam_ != playerTeam) { + continue; + } + + copy(idx + 1, j, idx); + idx++; + } + } + } + } else if (isLoss) { + u8 idx = 0; + for (u8 i = 1; i <= 12; i++) { + for (u8 j = 0; j < 12; j++) { + u8 unkPos = mRaceScenario.getPlayer(j)->getUnkPos(); + if (i != unkPos) { + continue; + } + + PlayerType playerType = mRaceScenario.getPlayer(j)->getPlayerType(); + if (playerType != PLAYER_TYPE_REAL_LOCAL) { + continue; + } + + copy(idx + 1, j, idx); + idx++; + } + } + } else { + copy(1, 0, 0); + } + + initRace(); +} + +} // namespace System +#else // Symbol: Racedata_initAwards // PAL: 0x80530864..0x80530f0c // Scratch: https://decomp.me/scratch/y64A8 @@ -3211,6 +3333,7 @@ asm UNKNOWN_FUNCTION(Racedata_initAwards) { blr; // clang-format on } +#endif namespace System { diff --git a/source/game/system/RaceConfig.hpp b/source/game/system/RaceConfig.hpp index ca1ec5960..f0dc7452b 100644 --- a/source/game/system/RaceConfig.hpp +++ b/source/game/system/RaceConfig.hpp @@ -323,6 +323,7 @@ class MenuScenario : public RaceConfigScenario { class AwardsScenario : public RaceConfigScenario { public: AwardsScenario(RawGhostFile* ghost) : RaceConfigScenario(ghost) {} + void copy(RaceScenario* raceScenario); }; class RaceConfigEx { @@ -346,6 +347,8 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { static const u8 getRacePlayerCount(); s16 updateRating(u8 playerIdx); u8 update(); + void initAwards(); + void initRace(); s32 getLocalPlayerCount(u8 playerIdx); void setGhost(RawGhostFile* ghost); s8 getHudPlayerId(u8 playerIdx); @@ -353,6 +356,18 @@ class RaceConfig : public RaceConfigEx2, public ParameterFile, RaceConfigEx { bool isLiveView(u8 hudPlayerIdx); bool isTimeAttackReplay(); + inline void copy(u8 i, u8 j, u8 playerIdx) { + mMenuScenario.getPlayer(playerIdx)->setCharacter( + mRaceScenario.getPlayer(j)->getCharacter()); + mMenuScenario.getPlayer(playerIdx)->setVehicle( + mRaceScenario.getPlayer(j)->getVehicle()); + mMenuScenario.getPlayer(playerIdx)->setPlayerType(PLAYER_TYPE_CPU); + mMenuScenario.getPlayer(playerIdx)->setPrevFinishPos(i); + mMenuScenario.getPlayer(playerIdx)->setUnkPos(i); + mMenuScenario.getPlayer(playerIdx)->setMii( + *mRaceScenario.getPlayer(j)->getMii()); + } + static RaceConfig* spInstance; RaceScenario mRaceScenario;