diff --git a/src/game/game_19aa80.c b/src/game/game_19aa80.c index 1ac860a19..fd6d3a8b4 100644 --- a/src/game/game_19aa80.c +++ b/src/game/game_19aa80.c @@ -1286,7 +1286,7 @@ void mpForceUnlockConfigFeatures(struct mpconfig *config, u8 *array, s32 len, s3 s32 i; for (i = 0; i < 8; i++) { - s32 simtype = mpGetSimTypeIndex(config->simulants[i].type, BOTDIFF_NORMAL); + s32 simtype = mpFindBotProfile(config->simulants[i].type, BOTDIFF_NORMAL); if (simtype >= 0) { featurenum = g_BotProfiles[simtype].requirefeature; @@ -1297,7 +1297,7 @@ void mpForceUnlockConfigFeatures(struct mpconfig *config, u8 *array, s32 len, s3 } for (numplayers = 0; numplayers < 4; numplayers++) { - simtype = mpGetSimTypeIndex(0, config->simulants[i].difficulties[numplayers]); + simtype = mpFindBotProfile(0, config->simulants[i].difficulties[numplayers]); if (simtype >= 0) { featurenum = g_BotProfiles[simtype].requirefeature; @@ -1365,7 +1365,7 @@ void mpForceUnlockSimulantFeatures(void) for (i = 0; i < 8; i++) { // Force unlock the simulant type - s32 simtypeindex = mpGetSimTypeIndex(g_BotConfigsArray[i].type, BOTDIFF_NORMAL); + s32 simtypeindex = mpFindBotProfile(g_BotConfigsArray[i].type, BOTDIFF_NORMAL); if (simtypeindex >= 0) { s32 featurenum = g_BotProfiles[simtypeindex].requirefeature; @@ -1376,7 +1376,7 @@ void mpForceUnlockSimulantFeatures(void) } // Force unlock the simulant difficulty - simtypeindex = mpGetSimTypeIndex(BOTTYPE_GENERAL, g_BotConfigsArray[i].difficulty); + simtypeindex = mpFindBotProfile(BOTTYPE_GENERAL, g_BotConfigsArray[i].difficulty); if (simtypeindex >= 0) { s32 featurenum = g_BotProfiles[simtypeindex].requirefeature; diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index c173e6aa9..8f3193677 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -6712,17 +6712,6 @@ void mpCreateBotFromProfile(s32 botnum, u8 profilenum) g_BotConfigsArray[botnum].base.mpbodynum = g_BotProfiles[profilenum].body; } -const char var7f1b8b74[] = "%s:%d\n"; -const char var7f1b8b7c[] = "%s\n"; - -#if VERSION >= VERSION_NTSC_1_0 -const char var7f1b8b80[] = "Adding GBCHead to load to slot %d: guid is %x-%x, player is %d\n"; -const char var7f1b8bc0[] = "PakId for player %d: %d\n"; -const char var7f1b8bdc[] = "Save Player Result: %d New GUID: %x\n"; -const char var7f1b8c04[] = "PakId for player %d: %d\n"; -const char var7f1b8c20[] = "Load Player - Result: %d\n"; -#endif - void mpSetBotDifficulty(s32 botnum, s32 difficulty) { s32 i; @@ -6755,7 +6744,7 @@ void mpRemoveSimulant(s32 index) g_MpSetup.chrslots &= ~(1 << (index + 4)); g_BotConfigsArray[index].base.name[0] = '\0'; func0f1881d4(index); - func0f18cddc(); + mpGenerateBotNames(); } bool mpHasSimulants(void) @@ -6807,7 +6796,7 @@ bool mpIsSimSlotEnabled(s32 slot) return true; } -s32 mpGetSimTypeIndex(s32 type, s32 difficulty) +s32 mpFindBotProfile(s32 type, s32 difficulty) { s32 i; @@ -6832,154 +6821,66 @@ s32 mpGetSimTypeIndex(s32 type, s32 difficulty) return i; } -GLOBAL_ASM( -glabel func0f18cddc -/* f18cddc: 27bdff50 */ addiu $sp,$sp,-176 -/* f18cde0: afbf003c */ sw $ra,0x3c($sp) -/* f18cde4: afbe0038 */ sw $s8,0x38($sp) -/* f18cde8: afb70034 */ sw $s7,0x34($sp) -/* f18cdec: afb60030 */ sw $s6,0x30($sp) -/* f18cdf0: afb5002c */ sw $s5,0x2c($sp) -/* f18cdf4: afb40028 */ sw $s4,0x28($sp) -/* f18cdf8: afb30024 */ sw $s3,0x24($sp) -/* f18cdfc: afb20020 */ sw $s2,0x20($sp) -/* f18ce00: afb1001c */ sw $s1,0x1c($sp) -/* f18ce04: afb00018 */ sw $s0,0x18($sp) -/* f18ce08: 27a20068 */ addiu $v0,$sp,0x68 -/* f18ce0c: 27a300b0 */ addiu $v1,$sp,0xb0 -.L0f18ce10: -/* f18ce10: 24420004 */ addiu $v0,$v0,0x4 -/* f18ce14: 0043082b */ sltu $at,$v0,$v1 -/* f18ce18: 1420fffd */ bnez $at,.L0f18ce10 -/* f18ce1c: ac40fffc */ sw $zero,-0x4($v0) -/* f18ce20: 3c17800b */ lui $s7,%hi(g_BotConfigsArray) -/* f18ce24: 3c16800b */ lui $s6,%hi(g_MpSetup) -/* f18ce28: 26d6cb88 */ addiu $s6,$s6,%lo(g_MpSetup) -/* f18ce2c: 26f7c538 */ addiu $s7,$s7,%lo(g_BotConfigsArray) -/* f18ce30: 24110004 */ addiu $s1,$zero,0x4 -/* f18ce34: 241e004c */ addiu $s8,$zero,0x4c -/* f18ce38: 27b50068 */ addiu $s5,$sp,0x68 -/* f18ce3c: 96ce0016 */ lhu $t6,0x16($s6) -.L0f18ce40: -/* f18ce40: 240f0001 */ addiu $t7,$zero,0x1 -/* f18ce44: 022fc004 */ sllv $t8,$t7,$s1 -/* f18ce48: 01d8c824 */ and $t9,$t6,$t8 -/* f18ce4c: 53200010 */ beqzl $t9,.L0f18ce90 -/* f18ce50: 26310001 */ addiu $s1,$s1,0x1 -/* f18ce54: 023e0019 */ multu $s1,$s8 -/* f18ce58: 00004012 */ mflo $t0 -/* f18ce5c: 02e88021 */ addu $s0,$s7,$t0 -/* f18ce60: 9204ff17 */ lbu $a0,-0xe9($s0) -/* f18ce64: 0fc6335a */ jal mpGetSimTypeIndex -/* f18ce68: 9205ff18 */ lbu $a1,-0xe8($s0) -/* f18ce6c: 04400007 */ bltz $v0,.L0f18ce8c -/* f18ce70: 28410012 */ slti $at,$v0,0x12 -/* f18ce74: 10200005 */ beqz $at,.L0f18ce8c -/* f18ce78: 00024880 */ sll $t1,$v0,0x2 -/* f18ce7c: 02a91821 */ addu $v1,$s5,$t1 -/* f18ce80: 8c6a0000 */ lw $t2,0x0($v1) -/* f18ce84: 254b0001 */ addiu $t3,$t2,0x1 -/* f18ce88: ac6b0000 */ sw $t3,0x0($v1) -.L0f18ce8c: -/* f18ce8c: 26310001 */ addiu $s1,$s1,0x1 -.L0f18ce90: -/* f18ce90: 2a21000c */ slti $at,$s1,0xc -/* f18ce94: 5420ffea */ bnezl $at,.L0f18ce40 -/* f18ce98: 96ce0016 */ lhu $t6,0x16($s6) -/* f18ce9c: 27a20068 */ addiu $v0,$sp,0x68 -/* f18cea0: 27a400b0 */ addiu $a0,$sp,0xb0 -/* f18cea4: 2403ffff */ addiu $v1,$zero,-1 -/* f18cea8: 8c4c0000 */ lw $t4,0x0($v0) -.L0f18ceac: -/* f18ceac: 29810002 */ slti $at,$t4,0x2 -/* f18ceb0: 50200004 */ beqzl $at,.L0f18cec4 -/* f18ceb4: ac400000 */ sw $zero,0x0($v0) -/* f18ceb8: 10000002 */ b .L0f18cec4 -/* f18cebc: ac430000 */ sw $v1,0x0($v0) -/* f18cec0: ac400000 */ sw $zero,0x0($v0) -.L0f18cec4: -/* f18cec4: 24420004 */ addiu $v0,$v0,0x4 -/* f18cec8: 0044082b */ sltu $at,$v0,$a0 -/* f18cecc: 5420fff7 */ bnezl $at,.L0f18ceac -/* f18ced0: 8c4c0000 */ lw $t4,0x0($v0) -/* f18ced4: 3c148008 */ lui $s4,%hi(g_BotProfiles) -/* f18ced8: 2694772c */ addiu $s4,$s4,%lo(g_BotProfiles) -/* f18cedc: 24110004 */ addiu $s1,$zero,0x4 -/* f18cee0: 27b30050 */ addiu $s3,$sp,0x50 -/* f18cee4: 96cd0016 */ lhu $t5,0x16($s6) -.L0f18cee8: -/* f18cee8: 240f0001 */ addiu $t7,$zero,0x1 -/* f18ceec: 022f7004 */ sllv $t6,$t7,$s1 -/* f18cef0: 01aec024 */ and $t8,$t5,$t6 -/* f18cef4: 53000031 */ beqzl $t8,.L0f18cfbc -/* f18cef8: 26310001 */ addiu $s1,$s1,0x1 -/* f18cefc: 023e0019 */ multu $s1,$s8 -/* f18cf00: 0000c812 */ mflo $t9 -/* f18cf04: 02f98021 */ addu $s0,$s7,$t9 -/* f18cf08: 9204ff17 */ lbu $a0,-0xe9($s0) -/* f18cf0c: 0fc6335a */ jal mpGetSimTypeIndex -/* f18cf10: 9205ff18 */ lbu $a1,-0xe8($s0) -/* f18cf14: 04400028 */ bltz $v0,.L0f18cfb8 -/* f18cf18: 00401825 */ or $v1,$v0,$zero -/* f18cf1c: 28410012 */ slti $at,$v0,0x12 -/* f18cf20: 10200025 */ beqz $at,.L0f18cfb8 -/* f18cf24: 00024080 */ sll $t0,$v0,0x2 -/* f18cf28: 02a84821 */ addu $t1,$s5,$t0 -/* f18cf2c: 8d2a0000 */ lw $t2,0x0($t1) -/* f18cf30: 0003c0c0 */ sll $t8,$v1,0x3 -/* f18cf34: 2612fed0 */ addiu $s2,$s0,-304 -/* f18cf38: 05400015 */ bltz $t2,.L0f18cf90 -/* f18cf3c: 0298c821 */ addu $t9,$s4,$t8 -/* f18cf40: 00025880 */ sll $t3,$v0,0x2 -/* f18cf44: 02ab8021 */ addu $s0,$s5,$t3 -/* f18cf48: 8e0c0000 */ lw $t4,0x0($s0) -/* f18cf4c: 000268c0 */ sll $t5,$v0,0x3 -/* f18cf50: 028d7021 */ addu $t6,$s4,$t5 -/* f18cf54: 258f0001 */ addiu $t7,$t4,0x1 -/* f18cf58: ae0f0000 */ sw $t7,0x0($s0) -/* f18cf5c: 0fc5b9f1 */ jal langGet -/* f18cf60: 85c40002 */ lh $a0,0x2($t6) -/* f18cf64: 3c057f1c */ lui $a1,%hi(var7f1b8b74) -/* f18cf68: 24a58b74 */ addiu $a1,$a1,%lo(var7f1b8b74) -/* f18cf6c: 02602025 */ or $a0,$s3,$zero -/* f18cf70: 00403025 */ or $a2,$v0,$zero -/* f18cf74: 0c004dad */ jal sprintf -/* f18cf78: 8e070000 */ lw $a3,0x0($s0) -/* f18cf7c: 02402025 */ or $a0,$s2,$zero -/* f18cf80: 0c004c4c */ jal strcpy -/* f18cf84: 02602825 */ or $a1,$s3,$zero -/* f18cf88: 1000000c */ b .L0f18cfbc -/* f18cf8c: 26310001 */ addiu $s1,$s1,0x1 -.L0f18cf90: -/* f18cf90: 0fc5b9f1 */ jal langGet -/* f18cf94: 87240002 */ lh $a0,0x2($t9) -/* f18cf98: 3c057f1c */ lui $a1,%hi(var7f1b8b7c) -/* f18cf9c: 24a58b7c */ addiu $a1,$a1,%lo(var7f1b8b7c) -/* f18cfa0: 02602025 */ or $a0,$s3,$zero -/* f18cfa4: 0c004dad */ jal sprintf -/* f18cfa8: 00403025 */ or $a2,$v0,$zero -/* f18cfac: 02402025 */ or $a0,$s2,$zero -/* f18cfb0: 0c004c4c */ jal strcpy -/* f18cfb4: 02602825 */ or $a1,$s3,$zero -.L0f18cfb8: -/* f18cfb8: 26310001 */ addiu $s1,$s1,0x1 -.L0f18cfbc: -/* f18cfbc: 2401000c */ addiu $at,$zero,0xc -/* f18cfc0: 5621ffc9 */ bnel $s1,$at,.L0f18cee8 -/* f18cfc4: 96cd0016 */ lhu $t5,0x16($s6) -/* f18cfc8: 8fbf003c */ lw $ra,0x3c($sp) -/* f18cfcc: 8fb00018 */ lw $s0,0x18($sp) -/* f18cfd0: 8fb1001c */ lw $s1,0x1c($sp) -/* f18cfd4: 8fb20020 */ lw $s2,0x20($sp) -/* f18cfd8: 8fb30024 */ lw $s3,0x24($sp) -/* f18cfdc: 8fb40028 */ lw $s4,0x28($sp) -/* f18cfe0: 8fb5002c */ lw $s5,0x2c($sp) -/* f18cfe4: 8fb60030 */ lw $s6,0x30($sp) -/* f18cfe8: 8fb70034 */ lw $s7,0x34($sp) -/* f18cfec: 8fbe0038 */ lw $s8,0x38($sp) -/* f18cff0: 03e00008 */ jr $ra -/* f18cff4: 27bd00b0 */ addiu $sp,$sp,0xb0 -); +void mpGenerateBotNames(void) +{ + s32 counts[ARRAYCOUNT(g_BotProfiles)]; + s32 profilenum; + s32 i; + char name[16]; + + for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { + counts[i] = 0; + } + + // Count the number of bots using each profile (MeatSim, TurtleSim etc) + for (i = 4; i < 12; i++) { + if (g_MpSetup.chrslots & (1 << i)) { + profilenum = mpFindBotProfile(g_BotConfigsArray[i - 4].type, g_BotConfigsArray[i - 4].difficulty); + + if (profilenum >= 0 && profilenum < ARRAYCOUNT(g_BotProfiles)) { + counts[profilenum]++; + } + } + } + + // Profiles with only one bot don't need to have to number appended to the + // name, so mark those as -1. For profiles with multiple bots, reset them + // to 0 because they'll be a counter for the final loop. + for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { + if (counts[i] <= 1) { + counts[i] = -1; + } else { + counts[i] = 0; + } + } + + for (i = 4; i < 12; i++) { + if (g_MpSetup.chrslots & (1 << i)) { + profilenum = mpFindBotProfile(g_BotConfigsArray[i - 4].type, g_BotConfigsArray[i - 4].difficulty); + + if (profilenum >= 0 && profilenum < ARRAYCOUNT(g_BotProfiles)) { + if (counts[profilenum] >= 0) { + // Multiple bots using this profile - append the number + counts[profilenum]++; + sprintf(name, "%s:%d\n", langGet(g_BotProfiles[profilenum].name), counts[profilenum]); + strcpy(g_BotConfigsArray[i - 4].base.name, name); + } else { + // One bots using this profile - just use the profile name + sprintf(name, "%s\n", langGet(g_BotProfiles[profilenum].name)); + strcpy(g_BotConfigsArray[i - 4].base.name, name); + } + } + } + } +} + +#if VERSION >= VERSION_NTSC_1_0 +const char var7f1b8b80[] = "Adding GBCHead to load to slot %d: guid is %x-%x, player is %d\n"; +const char var7f1b8bc0[] = "PakId for player %d: %d\n"; +const char var7f1b8bdc[] = "Save Player Result: %d New GUID: %x\n"; +const char var7f1b8c04[] = "PakId for player %d: %d\n"; +const char var7f1b8c20[] = "Load Player - Result: %d\n"; +#endif s32 mpPlayerGetIndex(struct chrdata *chr) { @@ -7551,7 +7452,7 @@ void mpsetupfileLoadWad(struct savebuffer *buffer) g_BotConfigsArray[i].base.team = savebufferReadBits(buffer, 3); } - func0f18cddc(); + mpGenerateBotNames(); for (i = 0; i < 6; i++) { g_MpSetup.weapons[i] = savebufferReadBits(buffer, 7); @@ -7604,13 +7505,13 @@ void mpsetupfileSaveWad(struct savebuffer *buffer) savebufferOr(buffer, g_BotConfigsArray[i].base.mpheadnum, 7); if (g_BotConfigsArray[i].base.mpbodynum == 0xff) { - s32 index = mpGetSimTypeIndex(g_BotConfigsArray[i].type, g_BotConfigsArray[i].difficulty); + s32 profilenum = mpFindBotProfile(g_BotConfigsArray[i].type, g_BotConfigsArray[i].difficulty); - if (index < 0 || index >= ARRAYCOUNT(g_BotProfiles)) { - index = 0; + if (profilenum < 0 || profilenum >= ARRAYCOUNT(g_BotProfiles)) { + profilenum = 0; } - mpbodynum = g_BotProfiles[index].body; + mpbodynum = g_BotProfiles[profilenum].body; } else { mpbodynum = g_BotConfigsArray[i].base.mpbodynum; } diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index e4ea5dd25..d36c9e8d3 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -4872,7 +4872,7 @@ glabel var7f1b81e8 /* f17c8ac: 0fc632d8 */ jal mpSetBotDifficulty /* f17c8b0: 92050001 */ lbu $a1,0x1($s0) .L0f17c8b4: -/* f17c8b4: 0fc63377 */ jal func0f18cddc +/* f17c8b4: 0fc63377 */ jal mpGenerateBotNames /* f17c8b8: 00000000 */ nop /* f17c8bc: 3c098007 */ lui $t1,%hi(g_MpPlayerNum) /* f17c8c0: 8d291448 */ lw $t1,%lo(g_MpPlayerNum)($t1) @@ -5161,7 +5161,7 @@ glabel var7f1b81e8 /* f176fcc: 0fc61b59 */ jal mpSetBotDifficulty /* f176fd0: 92050001 */ lbu $a1,0x1($s0) .NB0f176fd4: -/* f176fd4: 0fc61bf8 */ jal func0f18cddc +/* f176fd4: 0fc61bf8 */ jal mpGenerateBotNames /* f176fd8: 00000000 */ sll $zero,$zero,0x0 /* f176fdc: 3c098007 */ lui $t1,0x8007 /* f176fe0: 8d293af0 */ lw $t1,0x3af0($t1) @@ -5371,7 +5371,7 @@ glabel menuhandlerMpSimulantDifficulty /* f17ce24: 008f2021 */ addu $a0,$a0,$t7 /* f17ce28: 0fc632d8 */ jal mpSetBotDifficulty /* f17ce2c: 8c84ee1c */ lw $a0,%lo(g_Menus+0xe1c)($a0) -/* f17ce30: 0fc63377 */ jal func0f18cddc +/* f17ce30: 0fc63377 */ jal mpGenerateBotNames /* f17ce34: 00000000 */ nop /* f17ce38: 1000003f */ b .L0f17cf38 /* f17ce3c: 00001025 */ or $v0,$zero,$zero @@ -5498,7 +5498,7 @@ glabel menuhandlerMpSimulantDifficulty /* f17ce24: 008f2021 */ addu $a0,$a0,$t7 /* f17ce28: 0fc632d8 */ jal mpSetBotDifficulty /* f17ce2c: 8c84ee1c */ lw $a0,%lo(g_Menus+0xe1c)($a0) -/* f17ce30: 0fc63377 */ jal func0f18cddc +/* f17ce30: 0fc63377 */ jal mpGenerateBotNames /* f17ce34: 00000000 */ nop /* f17ce38: 1000003f */ b .L0f17cf38 /* f17ce3c: 00001025 */ or $v0,$zero,$zero @@ -5625,7 +5625,7 @@ glabel menuhandlerMpSimulantDifficulty /* f177544: 008f2021 */ addu $a0,$a0,$t7 /* f177548: 0fc61b59 */ jal mpSetBotDifficulty /* f17754c: 8c843538 */ lw $a0,0x3538($a0) -/* f177550: 0fc61bf8 */ jal func0f18cddc +/* f177550: 0fc61bf8 */ jal mpGenerateBotNames /* f177554: 00000000 */ sll $zero,$zero,0x0 /* f177558: 1000003f */ beqz $zero,.NB0f177658 /* f17755c: 00001025 */ or $v0,$zero,$zero @@ -5735,11 +5735,11 @@ s32 menuhandlerMpChangeSimulantType(s32 operation, struct menuitem *item, union if (operation == MENUOP_SET) { s32 i; s32 count = 0; - s32 simtypeindex = mpGetSimTypeIndex( + s32 profilenum = mpFindBotProfile( g_BotConfigsArray[g_Menus[g_MpPlayerNum].mpsetup.slotindex].type, g_BotConfigsArray[g_Menus[g_MpPlayerNum].mpsetup.slotindex].difficulty); - for (i = 0; i < simtypeindex; i++) { + for (i = 0; i < profilenum; i++) { if (mpIsFeatureUnlocked(g_BotProfiles[i].requirefeature)) { count++; } @@ -8139,7 +8139,7 @@ void mpConfigureQuickTeamSimulants(void) } } - func0f18cddc(); + mpGenerateBotNames(); break; case MPQUICKTEAM_PLAYERSVSSIMS: for (i = 0; i < g_Vars.mpquickteamnumsims; i++) { @@ -8150,7 +8150,7 @@ void mpConfigureQuickTeamSimulants(void) } } - func0f18cddc(); + mpGenerateBotNames(); for (i = 0; i < ARRAYCOUNT(g_BotConfigsArray); i++) { g_BotConfigsArray[i].base.team = 1; @@ -8171,7 +8171,7 @@ void mpConfigureQuickTeamSimulants(void) } } - func0f18cddc(); + mpGenerateBotNames(); break; case MPQUICKTEAM_PLAYERSONLY: case MPQUICKTEAM_PLAYERSTEAMS: diff --git a/src/include/game/mplayer/mplayer.h b/src/include/game/mplayer/mplayer.h index a1ff7190b..0d0840617 100644 --- a/src/include/game/mplayer/mplayer.h +++ b/src/include/game/mplayer/mplayer.h @@ -91,8 +91,8 @@ void mpRemoveSimulant(s32 index); bool mpHasSimulants(void); bool mpHasUnusedBotSlots(void); bool mpIsSimSlotEnabled(s32 slot); -s32 mpGetSimTypeIndex(s32 type, s32 difficulty); -void func0f18cddc(void); +s32 mpFindBotProfile(s32 type, s32 difficulty); +void mpGenerateBotNames(void); s32 mpPlayerGetIndex(struct chrdata *chr); struct chrdata *mpGetChrFromPlayerIndex(s32 index); s32 func0f18d074(s32 index); diff --git a/src/include/types.h b/src/include/types.h index 8a71a07fd..71f0b8920 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3254,7 +3254,7 @@ struct mphead { struct botprofile { /*0x00*/ u8 type; /*0x01*/ u8 difficulty; - /*0x02*/ u16 name; + /*0x02*/ s16 name; /*0x04*/ s16 body; /*0x06*/ u8 requirefeature; };