Discover MP features/unlockables structure and rename many symbols

This commit is contained in:
Ryan Dwyer 2020-11-25 00:07:40 +10:00
parent 5c60cfb8e8
commit 0aa56dba60
13 changed files with 566 additions and 467 deletions

View File

@ -736,23 +736,23 @@ struct menudialog menudialog_2aba0 = {
// 2abb8
struct mparena g_MpArenas[] = {
// Stage, unlock, name
{ STAGE_MP_SKEDAR, 0x00, L_MPMENU(119) },
{ STAGE_MP_PIPES, 0x00, L_MPMENU(120) },
{ STAGE_MP_RAVINE, 0x26, L_MPMENU(121) },
{ STAGE_MP_G5BUILDING, 0x28, L_MPMENU(122) },
{ STAGE_MP_SEWERS, 0x2c, L_MPMENU(123) },
{ STAGE_MP_WAREHOUSE, 0x25, L_MPMENU(124) },
{ STAGE_MP_GRID, 0x29, L_MPMENU(125) },
{ STAGE_MP_RUINS, 0x2d, L_MPMENU(126) },
{ STAGE_MP_AREA52, 0x00, L_MPMENU(127) },
{ STAGE_MP_BASE, 0x2e, L_MPMENU(128) },
{ STAGE_MP_FORTRESS, 0x30, L_MPMENU(130) },
{ STAGE_MP_VILLA, 0x2b, L_MPMENU(131) },
{ STAGE_MP_CARPARK, 0x23, L_MPMENU(132) },
{ STAGE_MP_TEMPLE, 0x27, L_MPMENU(133) },
{ STAGE_MP_COMPLEX, 0x24, L_MPMENU(134) },
{ STAGE_MP_FELICITY, 0x2a, L_MPMENU(135) },
{ 1, 0x00, L_MPMENU(136) }, // "Random"
{ STAGE_MP_SKEDAR, 0, L_MPMENU(119) },
{ STAGE_MP_PIPES, 0, L_MPMENU(120) },
{ STAGE_MP_RAVINE, MPFEATURE_STAGE_RAVINE, L_MPMENU(121) },
{ STAGE_MP_G5BUILDING, MPFEATURE_STAGE_G5BUILDING, L_MPMENU(122) },
{ STAGE_MP_SEWERS, MPFEATURE_STAGE_SEWERS, L_MPMENU(123) },
{ STAGE_MP_WAREHOUSE, MPFEATURE_STAGE_WAREHOUSE, L_MPMENU(124) },
{ STAGE_MP_GRID, MPFEATURE_STAGE_GRID, L_MPMENU(125) },
{ STAGE_MP_RUINS, MPFEATURE_STAGE_RUINS, L_MPMENU(126) },
{ STAGE_MP_AREA52, 0, L_MPMENU(127) },
{ STAGE_MP_BASE, MPFEATURE_STAGE_BASE, L_MPMENU(128) },
{ STAGE_MP_FORTRESS, MPFEATURE_STAGE_FORTRESS, L_MPMENU(130) },
{ STAGE_MP_VILLA, MPFEATURE_STAGE_VILLA, L_MPMENU(131) },
{ STAGE_MP_CARPARK, MPFEATURE_STAGE_CARPARK, L_MPMENU(132) },
{ STAGE_MP_TEMPLE, MPFEATURE_STAGE_TEMPLE, L_MPMENU(133) },
{ STAGE_MP_COMPLEX, MPFEATURE_STAGE_COMPLEX, L_MPMENU(134) },
{ STAGE_MP_FELICITY, MPFEATURE_STAGE_FELICITY, L_MPMENU(135) },
{ 1, 0, L_MPMENU(136) }, // "Random"
};
// 2ac20
@ -2074,43 +2074,43 @@ u32 var80087264 = 0x00000000;
// 2d288
struct mpweapon g_MpWeapons[] = {
/*0x00*/ { WEAPON_NONE, 0x00, 0x00, 0x00, 0x00, 1, 0x00, MODEL_CHRTT33, 0x0100 },
/*0x01*/ { WEAPON_FALCON2, 0x01, 0x50, 0x00, 0x00, 1, 0x00, MODEL_CHRFALCON2, 0x0100 },
/*0x02*/ { WEAPON_FALCON2_SILENCER, 0x01, 0x50, 0x00, 0x00, 1, 0x05, MODEL_CHRFALCON2SIL, 0x0100 },
/*0x03*/ { WEAPON_FALCON2_SCOPE, 0x01, 0x50, 0x00, 0x00, 1, 0x06, MODEL_CHRFALCON2SCOPE, 0x0100 },
/*0x04*/ { WEAPON_MAGSEC4, 0x01, 0x50, 0x00, 0x00, 1, 0x00, MODEL_CHRLEEGUN1, 0x0100 },
/*0x05*/ { WEAPON_MAULER, 0x01, 0x5c, 0x00, 0x00, 1, 0x07, MODEL_CHRMAULER, 0x0100 },
/*0x06*/ { WEAPON_PHOENIX, 0x01, 0x40, 0x00, 0x00, 1, 0x08, MODEL_CHRMAIANPISTOL, 0x0100 },
/*0x07*/ { WEAPON_DY357MAGNUM, 0x0a, 0x32, 0x00, 0x00, 1, 0x00, MODEL_CHRDY357, 0x0100 },
/*0x08*/ { WEAPON_DY357LX, 0x0a, 0x32, 0x00, 0x00, 1, 0x09, MODEL_CHRDY357TRENT, 0x0100 },
/*0x09*/ { WEAPON_CMP150, 0x02, 0x64, 0x00, 0x00, 1, 0x00, MODEL_CHRCMP150, 0x0100 },
/*0x0a*/ { WEAPON_CYCLONE, 0x02, 0x96, 0x00, 0x00, 1, 0x00, MODEL_CHRCYCLONE, 0x0100 },
/*0x0b*/ { WEAPON_CALLISTONTG, 0x02, 0x96, 0x00, 0x00, 1, 0x0a, MODEL_CHRMAIANSMG, 0x0100 },
/*0x0c*/ { WEAPON_RCP120, 0x02, 0x96, 0x00, 0x00, 1, 0x0d, MODEL_CHRRCP120, 0x0100 },
/*0x0d*/ { WEAPON_LAPTOPGUN, 0x02, 0x96, 0x00, 0x00, 1, 0x0b, MODEL_CHRPCGUN, 0x0100 },
/*0x0e*/ { WEAPON_DRAGON, 0x04, 0x96, 0x00, 0x00, 1, 0x00, MODEL_CHRDRAGON, 0x0100 },
/*0x0f*/ { WEAPON_K7AVENGER, 0x04, 0x96, 0x00, 0x00, 1, 0x0c, MODEL_CHRAVENGER, 0x0100 },
/*0x10*/ { WEAPON_AR34, 0x04, 0x64, 0x00, 0x00, 1, 0x00, MODEL_CHRAR34, 0x0100 },
/*0x11*/ { WEAPON_SUPERDRAGON, 0x04, 0x96, 0x0b, 0x10, 1, 0x03, MODEL_CHRSUPERDRAGON, 0x0100 },
/*0x12*/ { WEAPON_SHOTGUN, 0x05, 0x10, 0x00, 0x00, 1, 0x0e, MODEL_CHRSHOTGUN, 0x0100 },
/*0x13*/ { WEAPON_REAPER, 0x0f, 0xc8, 0x00, 0x00, 1, 0x0f, MODEL_CHRSKMINIGUN, 0x0100 },
/*0x14*/ { WEAPON_SNIPERRIFLE, 0x04, 0x32, 0x00, 0x00, 1, 0x00, MODEL_CHRSNIPERRIFLE, 0x0100 },
/*0x15*/ { WEAPON_FARSIGHTXR20, 0x06, 0x0a, 0x00, 0x00, 1, 0x01, MODEL_CHRZ2020, 0x0100 },
/*0x16*/ { WEAPON_DEVASTATOR, 0x0b, 0x10, 0x00, 0x00, 1, 0x10, MODEL_CHRDEVASTATOR, 0x0100 },
/*0x17*/ { WEAPON_ROCKETLAUNCHER, 0x08, 0x03, 0x00, 0x00, 1, 0x00, MODEL_CHRDYROCKET, 0x0100 },
/*0x18*/ { WEAPON_SLAYER, 0x08, 0x03, 0x00, 0x00, 1, 0x04, MODEL_CHRSKROCKET, 0x0100 },
/*0x19*/ { WEAPON_COMBATKNIFE, 0x09, 0x05, 0x00, 0x00, 1, 0x00, MODEL_CHRKNIFE, 0x0100 },
/*0x1a*/ { WEAPON_CROSSBOW, 0x03, 0x0a, 0x00, 0x00, 1, 0x11, MODEL_CHRCROSSBOW, 0x0100 },
/*0x1b*/ { WEAPON_TRANQUILIZER, 0x13, 0x32, 0x00, 0x00, 1, 0x02, MODEL_CHRDRUGGUN, 0x0100 },
/*0x1c*/ { WEAPON_GRENADE, 0x07, 0x05, 0x00, 0x00, 0, 0x00, MODEL_CHRGRENADE, 0x0100 },
/*0x1d*/ { WEAPON_NBOMB, 0x12, 0x03, 0x00, 0x00, 0, 0x12, MODEL_CHRNBOMB, 0x0100 },
/*0x1e*/ { WEAPON_TIMEDMINE, 0x0e, 0x05, 0x00, 0x00, 0, 0x00, MODEL_CHRTIMEDMINE, 0x0180 },
/*0x1f*/ { WEAPON_PROXIMITYMINE, 0x0d, 0x05, 0x00, 0x00, 0, 0x13, MODEL_CHRPROXIMITYMINE, 0x0180 },
/*0x20*/ { WEAPON_REMOTEMINE, 0x0c, 0x05, 0x00, 0x00, 0, 0x14, MODEL_CHRREMOTEMINE, 0x0180 },
/*0x21*/ { WEAPON_LASER, 0x00, 0x00, 0x00, 0x00, 1, 0x4f, MODEL_CHRLASER, 0x0200 },
/*0x22*/ { WEAPON_XRAYSCANNER, 0x00, 0x00, 0x00, 0x00, 1, 0x15, MODEL_CHRNIGHTSIGHT, 0x0100 },
/*0x23*/ { WEAPON_CLOAKINGDEVICE, 0x00, 0x00, 0x00, 0x00, 1, 0x17, MODEL_CHRCLOAKER, 0x0100 },
/*0x24*/ { WEAPON_COMBATBOOST, 0x00, 0x00, 0x00, 0x00, 1, 0x18, MODEL_CHRSPEEDPILL, 0x0100 },
/*0x25*/ { WEAPON_MPSHIELD, 0x00, 0x00, 0x00, 0x00, 1, 0x16, MODEL_CHRSHIELD, 0x0100 },
/*0x26*/ { WEAPON_DISABLED, 0x00, 0x00, 0x00, 0x00, 0, 0x00, 0, 0x0000 },
/*0x00*/ { WEAPON_NONE, 0x00, 0x00, 0x00, 0x00, 1, 0, MODEL_CHRTT33, 0x0100 },
/*0x01*/ { WEAPON_FALCON2, 0x01, 0x50, 0x00, 0x00, 1, 0, MODEL_CHRFALCON2, 0x0100 },
/*0x02*/ { WEAPON_FALCON2_SILENCER, 0x01, 0x50, 0x00, 0x00, 1, MPFEATURE_WEAPON_FALCON2SILENCED, MODEL_CHRFALCON2SIL, 0x0100 },
/*0x03*/ { WEAPON_FALCON2_SCOPE, 0x01, 0x50, 0x00, 0x00, 1, MPFEATURE_WEAPON_FALCON2SCOPE, MODEL_CHRFALCON2SCOPE, 0x0100 },
/*0x04*/ { WEAPON_MAGSEC4, 0x01, 0x50, 0x00, 0x00, 1, 0, MODEL_CHRLEEGUN1, 0x0100 },
/*0x05*/ { WEAPON_MAULER, 0x01, 0x5c, 0x00, 0x00, 1, MPFEATURE_WEAPON_MAULER, MODEL_CHRMAULER, 0x0100 },
/*0x06*/ { WEAPON_PHOENIX, 0x01, 0x40, 0x00, 0x00, 1, MPFEATURE_WEAPON_PHOENIX, MODEL_CHRMAIANPISTOL, 0x0100 },
/*0x07*/ { WEAPON_DY357MAGNUM, 0x0a, 0x32, 0x00, 0x00, 1, 0, MODEL_CHRDY357, 0x0100 },
/*0x08*/ { WEAPON_DY357LX, 0x0a, 0x32, 0x00, 0x00, 1, MPFEATURE_WEAPON_DY357LX, MODEL_CHRDY357TRENT, 0x0100 },
/*0x09*/ { WEAPON_CMP150, 0x02, 0x64, 0x00, 0x00, 1, 0, MODEL_CHRCMP150, 0x0100 },
/*0x0a*/ { WEAPON_CYCLONE, 0x02, 0x96, 0x00, 0x00, 1, 0, MODEL_CHRCYCLONE, 0x0100 },
/*0x0b*/ { WEAPON_CALLISTONTG, 0x02, 0x96, 0x00, 0x00, 1, MPFEATURE_WEAPON_CALLISTO, MODEL_CHRMAIANSMG, 0x0100 },
/*0x0c*/ { WEAPON_RCP120, 0x02, 0x96, 0x00, 0x00, 1, MPFEATURE_WEAPON_RCP120, MODEL_CHRRCP120, 0x0100 },
/*0x0d*/ { WEAPON_LAPTOPGUN, 0x02, 0x96, 0x00, 0x00, 1, MPFEATURE_WEAPON_LAPTOPGUN, MODEL_CHRPCGUN, 0x0100 },
/*0x0e*/ { WEAPON_DRAGON, 0x04, 0x96, 0x00, 0x00, 1, 0, MODEL_CHRDRAGON, 0x0100 },
/*0x0f*/ { WEAPON_K7AVENGER, 0x04, 0x96, 0x00, 0x00, 1, MPFEATURE_WEAPON_K7AVENGER, MODEL_CHRAVENGER, 0x0100 },
/*0x10*/ { WEAPON_AR34, 0x04, 0x64, 0x00, 0x00, 1, 0, MODEL_CHRAR34, 0x0100 },
/*0x11*/ { WEAPON_SUPERDRAGON, 0x04, 0x96, 0x0b, 0x10, 1, MPFEATURE_WEAPON_SUPERDRAGON, MODEL_CHRSUPERDRAGON, 0x0100 },
/*0x12*/ { WEAPON_SHOTGUN, 0x05, 0x10, 0x00, 0x00, 1, MPFEATURE_WEAPON_SHOTGUN, MODEL_CHRSHOTGUN, 0x0100 },
/*0x13*/ { WEAPON_REAPER, 0x0f, 0xc8, 0x00, 0x00, 1, MPFEATURE_WEAPON_REAPER, MODEL_CHRSKMINIGUN, 0x0100 },
/*0x14*/ { WEAPON_SNIPERRIFLE, 0x04, 0x32, 0x00, 0x00, 1, 0, MODEL_CHRSNIPERRIFLE, 0x0100 },
/*0x15*/ { WEAPON_FARSIGHTXR20, 0x06, 0x0a, 0x00, 0x00, 1, MPFEATURE_WEAPON_FARSIGHT, MODEL_CHRZ2020, 0x0100 },
/*0x16*/ { WEAPON_DEVASTATOR, 0x0b, 0x10, 0x00, 0x00, 1, MPFEATURE_WEAPON_DEVASTATOR, MODEL_CHRDEVASTATOR, 0x0100 },
/*0x17*/ { WEAPON_ROCKETLAUNCHER, 0x08, 0x03, 0x00, 0x00, 1, 0, MODEL_CHRDYROCKET, 0x0100 },
/*0x18*/ { WEAPON_SLAYER, 0x08, 0x03, 0x00, 0x00, 1, MPFEATURE_WEAPON_SLAYER, MODEL_CHRSKROCKET, 0x0100 },
/*0x19*/ { WEAPON_COMBATKNIFE, 0x09, 0x05, 0x00, 0x00, 1, 0, MODEL_CHRKNIFE, 0x0100 },
/*0x1a*/ { WEAPON_CROSSBOW, 0x03, 0x0a, 0x00, 0x00, 1, MPFEATURE_WEAPON_CROSSBOW, MODEL_CHRCROSSBOW, 0x0100 },
/*0x1b*/ { WEAPON_TRANQUILIZER, 0x13, 0x32, 0x00, 0x00, 1, MPFEATURE_WEAPON_TRANQUILIZER, MODEL_CHRDRUGGUN, 0x0100 },
/*0x1c*/ { WEAPON_GRENADE, 0x07, 0x05, 0x00, 0x00, 0, 0, MODEL_CHRGRENADE, 0x0100 },
/*0x1d*/ { WEAPON_NBOMB, 0x12, 0x03, 0x00, 0x00, 0, MPFEATURE_WEAPON_NBOMB, MODEL_CHRNBOMB, 0x0100 },
/*0x1e*/ { WEAPON_TIMEDMINE, 0x0e, 0x05, 0x00, 0x00, 0, 0, MODEL_CHRTIMEDMINE, 0x0180 },
/*0x1f*/ { WEAPON_PROXIMITYMINE, 0x0d, 0x05, 0x00, 0x00, 0, MPFEATURE_WEAPON_PROXIMITYMINE, MODEL_CHRPROXIMITYMINE, 0x0180 },
/*0x20*/ { WEAPON_REMOTEMINE, 0x0c, 0x05, 0x00, 0x00, 0, MPFEATURE_WEAPON_REMOTEMINE, MODEL_CHRREMOTEMINE, 0x0180 },
/*0x21*/ { WEAPON_LASER, 0x00, 0x00, 0x00, 0x00, 1, MPFEATURE_WEAPON_LASER, MODEL_CHRLASER, 0x0200 },
/*0x22*/ { WEAPON_XRAYSCANNER, 0x00, 0x00, 0x00, 0x00, 1, MPFEATURE_WEAPON_XRAYSCANNER, MODEL_CHRNIGHTSIGHT, 0x0100 },
/*0x23*/ { WEAPON_CLOAKINGDEVICE, 0x00, 0x00, 0x00, 0x00, 1, MPFEATURE_WEAPON_CLOAKINGDEVICE, MODEL_CHRCLOAKER, 0x0100 },
/*0x24*/ { WEAPON_COMBATBOOST, 0x00, 0x00, 0x00, 0x00, 1, MPFEATURE_WEAPON_COMBATBOOST, MODEL_CHRSPEEDPILL, 0x0100 },
/*0x25*/ { WEAPON_MPSHIELD, 0x00, 0x00, 0x00, 0x00, 1, MPFEATURE_WEAPON_SHIELD, MODEL_CHRSHIELD, 0x0100 },
/*0x26*/ { WEAPON_DISABLED, 0x00, 0x00, 0x00, 0x00, 0, 0x00, 0, 0x0000 },
};

View File

@ -3277,7 +3277,7 @@ void setupParseObjects(s32 stagenum)
s32 maxsimulants;
s32 slotnum;
if (mpIsChallengeComplete(CHALLENGE_UNK64)) {
if (mpIsFeatureUnlocked(MPFEATURE_8BOTS)) {
maxsimulants = 8;
} else {
maxsimulants = 4;

View File

@ -123,7 +123,7 @@ s16 mpChooseRandomStage(void)
s32 index;
for (i = 0; i < 16; i++) {
if (mpIsChallengeComplete(g_MpArenas[i].unlock)) {
if (mpIsFeatureUnlocked(g_MpArenas[i].requirefeature)) {
numchallengescomplete++;
}
}
@ -131,7 +131,7 @@ s16 mpChooseRandomStage(void)
index = random() % numchallengescomplete;
for (i = 0; i < 16; i++) {
if (mpIsChallengeComplete(g_MpArenas[i].unlock)) {
if (mpIsFeatureUnlocked(g_MpArenas[i].requirefeature)) {
if (index == 0) {
return g_MpArenas[i].stagenum;
}
@ -196,7 +196,7 @@ glabel var7f1b8074
/* f179248: 3c108008 */ lui $s0,%hi(g_MpArenas)
/* f17924c: 26104b98 */ addiu $s0,$s0,%lo(g_MpArenas)
.L0f179250:
/* f179250: 0fc67244 */ jal mpIsChallengeComplete
/* f179250: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179254: 92040002 */ lbu $a0,0x2($s0)
/* f179258: 10400002 */ beqz $v0,.L0f179264
/* f17925c: 26100006 */ addiu $s0,$s0,0x6
@ -211,7 +211,7 @@ glabel var7f1b8074
/* f17927c: 3c108008 */ lui $s0,%hi(g_MpArenas)
/* f179280: 26104b98 */ addiu $s0,$s0,%lo(g_MpArenas)
.L0f179284:
/* f179284: 0fc67244 */ jal mpIsChallengeComplete
/* f179284: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179288: 92040002 */ lbu $a0,0x2($s0)
/* f17928c: 10400009 */ beqz $v0,.L0f1792b4
/* f179290: 3c0c8008 */ lui $t4,%hi(g_MpArenas+0x66)
@ -233,7 +233,7 @@ glabel var7f1b8074
/* f1792cc: 3c108008 */ lui $s0,%hi(g_MpArenas)
/* f1792d0: 26104b98 */ addiu $s0,$s0,%lo(g_MpArenas)
.L0f1792d4:
/* f1792d4: 0fc67244 */ jal mpIsChallengeComplete
/* f1792d4: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1792d8: 92040002 */ lbu $a0,0x2($s0)
/* f1792dc: 10400004 */ beqz $v0,.L0f1792f0
/* f1792e0: 3c198008 */ lui $t9,%hi(g_MpArenas+0x66)
@ -260,7 +260,7 @@ glabel var7f1b8074
/* f179328: 00000000 */ nop
/* f17932c: ae510000 */ sw $s1,0x0($s2)
.L0f179330:
/* f179330: 0fc67244 */ jal mpIsChallengeComplete
/* f179330: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179334: 92040002 */ lbu $a0,0x2($s0)
/* f179338: 10400002 */ beqz $v0,.L0f179344
/* f17933c: 26100006 */ addiu $s0,$s0,0x6
@ -274,15 +274,15 @@ glabel var7f1b8074
/* f179358: 00001025 */ or $v0,$zero,$zero
/* f17935c: 24090003 */ addiu $t1,$zero,0x3
/* f179360: ae490000 */ sw $t1,0x0($s2)
/* f179364: 0fc67244 */ jal mpIsChallengeComplete
/* f179364: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179368: 24040024 */ addiu $a0,$zero,0x24
/* f17936c: 5440004b */ bnezl $v0,.L0f17949c
/* f179370: 00001025 */ or $v0,$zero,$zero
/* f179374: 0fc67244 */ jal mpIsChallengeComplete
/* f179374: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179378: 24040027 */ addiu $a0,$zero,0x27
/* f17937c: 54400047 */ bnezl $v0,.L0f17949c
/* f179380: 00001025 */ or $v0,$zero,$zero
/* f179384: 0fc67244 */ jal mpIsChallengeComplete
/* f179384: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179388: 2404002a */ addiu $a0,$zero,0x2a
/* f17938c: 54400043 */ bnezl $v0,.L0f17949c
/* f179390: 00001025 */ or $v0,$zero,$zero
@ -291,15 +291,15 @@ glabel var7f1b8074
/* f17939c: 1000003e */ b .L0f179498
/* f1793a0: ae4b0000 */ sw $t3,0x0($s2)
/* f1793a4: 8e510000 */ lw $s1,0x0($s2)
/* f1793a8: 0fc67244 */ jal mpIsChallengeComplete
/* f1793a8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1793ac: 24040024 */ addiu $a0,$zero,0x24
/* f1793b0: 5440000d */ bnezl $v0,.L0f1793e8
/* f1793b4: 001160c0 */ sll $t4,$s1,0x3
/* f1793b8: 0fc67244 */ jal mpIsChallengeComplete
/* f1793b8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1793bc: 24040027 */ addiu $a0,$zero,0x27
/* f1793c0: 54400009 */ bnezl $v0,.L0f1793e8
/* f1793c4: 001160c0 */ sll $t4,$s1,0x3
/* f1793c8: 0fc67244 */ jal mpIsChallengeComplete
/* f1793c8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1793cc: 2404002a */ addiu $a0,$zero,0x2a
/* f1793d0: 54400005 */ bnezl $v0,.L0f1793e8
/* f1793d4: 001160c0 */ sll $t4,$s1,0x3
@ -314,15 +314,15 @@ glabel var7f1b8074
/* f1793f4: 1000002a */ b .L0f1794a0
/* f1793f8: 8fbf0024 */ lw $ra,0x24($sp)
/* f1793fc: 8e500000 */ lw $s0,0x0($s2)
/* f179400: 0fc67244 */ jal mpIsChallengeComplete
/* f179400: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179404: 24040024 */ addiu $a0,$zero,0x24
/* f179408: 5440000d */ bnezl $v0,.L0f179440
/* f17940c: 001068c0 */ sll $t5,$s0,0x3
/* f179410: 0fc67244 */ jal mpIsChallengeComplete
/* f179410: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179414: 24040027 */ addiu $a0,$zero,0x27
/* f179418: 54400009 */ bnezl $v0,.L0f179440
/* f17941c: 001068c0 */ sll $t5,$s0,0x3
/* f179420: 0fc67244 */ jal mpIsChallengeComplete
/* f179420: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179424: 2404002a */ addiu $a0,$zero,0x2a
/* f179428: 14400004 */ bnez $v0,.L0f17943c
/* f17942c: 24010001 */ addiu $at,$zero,0x1
@ -342,7 +342,7 @@ glabel var7f1b8074
/* f17945c: 92040002 */ lbu $a0,0x2($s0)
.L0f179460:
/* f179460: afa3003c */ sw $v1,0x3c($sp)
/* f179464: 0fc67244 */ jal mpIsChallengeComplete
/* f179464: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179468: afa5002c */ sw $a1,0x2c($sp)
/* f17946c: 8fa3003c */ lw $v1,0x3c($sp)
/* f179470: 10400002 */ beqz $v0,.L0f17947c
@ -884,9 +884,9 @@ glabel var7f1b80dc
/* f179ea0: ac400df4 */ sw $zero,0xdf4($v0)
/* f179ea4: 1000005b */ b .L0f17a014
/* f179ea8: e4500d94 */ swc1 $f16,0xd94($v0)
/* f179eac: 0fc62f1c */ jal mpGetBodyUnk06
/* f179eac: 0fc62f1c */ jal mpGetBodyRequiredFeature
/* f179eb0: 90c40003 */ lbu $a0,0x3($a2)
/* f179eb4: 0fc67244 */ jal mpIsChallengeComplete
/* f179eb4: 0fc67244 */ jal mpIsFeatureUnlocked
/* f179eb8: 00402025 */ or $a0,$v0,$zero
/* f179ebc: 54400056 */ bnezl $v0,.L0f17a018
/* f179ec0: 00001025 */ or $v0,$zero,$zero
@ -1053,7 +1053,7 @@ glabel menuhandler0017a20c
/* f17a264: 00001025 */ or $v0,$zero,$zero
.L0f17a268:
/* f17a268: 3c048007 */ lui $a0,%hi(g_MpPlayerNum)
/* f17a26c: 0fc670b3 */ jal mpGetNumChallengesAvailable
/* f17a26c: 0fc670b3 */ jal mpGetAutoFocusedChallengeIndex
/* f17a270: 8c841448 */ lw $a0,%lo(g_MpPlayerNum)($a0)
/* f17a274: 100000eb */ b .L0f17a624
/* f17a278: ae020000 */ sw $v0,0x0($s0)
@ -1187,7 +1187,7 @@ glabel menuhandler0017a20c
/* f17a46c: 24720001 */ addiu $s2,$v1,0x1
/* f17a470: 02403025 */ or $a2,$s2,$zero
/* f17a474: 8c841448 */ lw $a0,%lo(g_MpPlayerNum)($a0)
/* f17a478: 0fc670ef */ jal func0f19c3bc
/* f17a478: 0fc670ef */ jal mpIsChallengeCompletedByPlayerWithNumPlayers2
/* f17a47c: 8fa500bc */ lw $a1,0xbc($sp)
/* f17a480: 1040000d */ beqz $v0,.L0f17a4b8
/* f17a484: 8fae00c4 */ lw $t6,0xc4($sp)
@ -2556,9 +2556,9 @@ glabel var7f1b814c
/* f17b6d4: ac690df4 */ sw $t1,0xdf4($v1)
/* f17b6d8: 10000054 */ b .L0f17b82c
/* f17b6dc: e4700d94 */ swc1 $f16,0xd94($v1)
/* f17b6e0: 0fc62ed2 */ jal mpGetHeadUnlockValue
/* f17b6e0: 0fc62ed2 */ jal mpGetHeadRequiredFeature
/* f17b6e4: 90c40003 */ lbu $a0,0x3($a2)
/* f17b6e8: 0fc67244 */ jal mpIsChallengeComplete
/* f17b6e8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17b6ec: 00402025 */ or $a0,$v0,$zero
/* f17b6f0: 5440004f */ bnezl $v0,.L0f17b830
/* f17b6f4: 00001025 */ or $v0,$zero,$zero
@ -3549,7 +3549,7 @@ glabel var7f1b81e8
/* f17c724: 263177bc */ addiu $s1,$s1,%lo(g_MpBodies)
/* f17c728: 2610772c */ addiu $s0,$s0,%lo(g_MpSimulantTypes)
.L0f17c72c:
/* f17c72c: 0fc67244 */ jal mpIsChallengeComplete
/* f17c72c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17c730: 92040006 */ lbu $a0,0x6($s0)
/* f17c734: 10400002 */ beqz $v0,.L0f17c740
/* f17c738: 26100008 */ addiu $s0,$s0,0x8
@ -3564,7 +3564,7 @@ glabel var7f1b81e8
/* f17c758: 263177bc */ addiu $s1,$s1,%lo(g_MpBodies)
/* f17c75c: 2610772c */ addiu $s0,$s0,%lo(g_MpSimulantTypes)
.L0f17c760:
/* f17c760: 0fc67244 */ jal mpIsChallengeComplete
/* f17c760: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17c764: 92040006 */ lbu $a0,0x6($s0)
/* f17c768: 5040000a */ beqzl $v0,.L0f17c794
/* f17c76c: 26100008 */ addiu $s0,$s0,0x8
@ -3621,7 +3621,7 @@ glabel var7f1b81e8
/* f17c828: 00008825 */ or $s1,$zero,$zero
/* f17c82c: 24130012 */ addiu $s3,$zero,0x12
.L0f17c830:
/* f17c830: 0fc67244 */ jal mpIsChallengeComplete
/* f17c830: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17c834: 92040006 */ lbu $a0,0x6($s0)
/* f17c838: 50400005 */ beqzl $v0,.L0f17c850
/* f17c83c: 26310001 */ addiu $s1,$s1,0x1
@ -3679,7 +3679,7 @@ glabel var7f1b81e8
/* f17c8fc: 00008825 */ or $s1,$zero,$zero
/* f17c900: 24130012 */ addiu $s3,$zero,0x12
.L0f17c904:
/* f17c904: 0fc67244 */ jal mpIsChallengeComplete
/* f17c904: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17c908: 92040006 */ lbu $a0,0x6($s0)
/* f17c90c: 50400005 */ beqzl $v0,.L0f17c924
/* f17c910: 26310001 */ addiu $s1,$s1,0x1
@ -3737,7 +3737,7 @@ glabel var7f1b81e8
/* f17c9d8: 59e00010 */ blezl $t7,.L0f17ca1c
/* f17c9dc: ae920008 */ sw $s2,0x8($s4)
.L0f17c9e0:
/* f17c9e0: 0fc67244 */ jal mpIsChallengeComplete
/* f17c9e0: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17c9e4: 92040006 */ lbu $a0,0x6($s0)
/* f17c9e8: 50400003 */ beqzl $v0,.L0f17c9f8
/* f17c9ec: 8e990000 */ lw $t9,0x0($s4)
@ -3905,7 +3905,7 @@ glabel menuhandlerMpSimulantDifficulty
/* f17ceb4: 2631775c */ addiu $s1,$s1,%lo(g_MpSimulantTypes+0x30)
/* f17ceb8: 2610772c */ addiu $s0,$s0,%lo(g_MpSimulantTypes)
.L0f17cebc:
/* f17cebc: 0fc67244 */ jal mpIsChallengeComplete
/* f17cebc: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17cec0: 92040006 */ lbu $a0,0x6($s0)
/* f17cec4: 10400002 */ beqz $v0,.L0f17ced0
/* f17cec8: 26100008 */ addiu $s0,$s0,0x8
@ -3920,7 +3920,7 @@ glabel menuhandlerMpSimulantDifficulty
/* f17cee4: 2610772c */ addiu $s0,$s0,%lo(g_MpSimulantTypes)
/* f17cee8: 24130006 */ addiu $s3,$zero,0x6
.L0f17ceec:
/* f17ceec: 0fc67244 */ jal mpIsChallengeComplete
/* f17ceec: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17cef0: 92040006 */ lbu $a0,0x6($s0)
/* f17cef4: 5040000a */ beqzl $v0,.L0f17cf20
/* f17cef8: 26310001 */ addiu $s1,$s1,0x1
@ -4011,7 +4011,7 @@ s32 menuhandlerMpChangeSimulantType(u32 operation, struct menuitem *item, union
g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].skill);
for (i = 0; i < simtypeindex; i++) {
if (mpIsChallengeComplete(g_MpSimulantTypes[i].unlockvalue)) {
if (mpIsFeatureUnlocked(g_MpSimulantTypes[i].requirefeature)) {
count++;
}
}
@ -4067,7 +4067,7 @@ s32 menuhandlerMpSimulantSlot(u32 operation, struct menuitem *item, union handle
}
break;
case MENUOP_CHECKHIDDEN:
if (item->param >= 4 && !mpIsChallengeComplete(CHALLENGE_UNK64)) {
if (item->param >= 4 && !mpIsFeatureUnlocked(MPFEATURE_8BOTS)) {
return true;
}
break;
@ -6124,7 +6124,7 @@ s32 menuhandlerMpNumberOfSimulants(u32 operation, struct menuitem *item, union h
{
switch (operation) {
case MENUOP_GETOPTIONCOUNT:
data->dropdown.value = !mpIsChallengeComplete(CHALLENGE_UNK64) ? 4 : 8;
data->dropdown.value = !mpIsFeatureUnlocked(MPFEATURE_8BOTS) ? 4 : 8;
break;
case MENUOP_GETOPTIONTEXT:
sprintf(g_StringPointer, "%d\n", data->dropdown.value + 1);
@ -6247,7 +6247,7 @@ glabel var7f1b8430
/* f17f7a0: 2631775c */ addiu $s1,$s1,%lo(g_MpSimulantTypes+0x30)
/* f17f7a4: 2610772c */ addiu $s0,$s0,%lo(g_MpSimulantTypes)
.L0f17f7a8:
/* f17f7a8: 0fc67244 */ jal mpIsChallengeComplete
/* f17f7a8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17f7ac: 92040006 */ lbu $a0,0x6($s0)
/* f17f7b0: 10400002 */ beqz $v0,.L0f17f7bc
/* f17f7b4: 26100008 */ addiu $s0,$s0,0x8
@ -6262,7 +6262,7 @@ glabel var7f1b8430
/* f17f7d4: 00008825 */ or $s1,$zero,$zero
/* f17f7d8: 24130006 */ addiu $s3,$zero,0x6
.L0f17f7dc:
/* f17f7dc: 0fc67244 */ jal mpIsChallengeComplete
/* f17f7dc: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17f7e0: 92040006 */ lbu $a0,0x6($s0)
/* f17f7e4: 5040000a */ beqzl $v0,.L0f17f810
/* f17f7e8: 26310001 */ addiu $s1,$s1,0x1

View File

@ -328,7 +328,7 @@ s32 menuhandlerMpDisplayTeam(u32 operation, struct menuitem *item, union handler
s32 menuhandlerMpOneHitKills(u32 operation, struct menuitem *item, union handlerdata *data)
{
if (operation == MENUOP_CHECKDISABLED || operation == MENUOP_CHECKHIDDEN) {
if (mpIsChallengeComplete(CHALLENGE_7)) {
if (mpIsFeatureUnlocked(MPFEATURE_ONEHITKILLS)) {
return false;
}
@ -409,7 +409,7 @@ glabel var7f1b8938
/* f17fe90: 8c2888dc */ lw $t0,%lo(var7f1b88dc)($at)
/* f17fe94: 01000008 */ jr $t0
/* f17fe98: 00000000 */ nop
/* f17fe9c: 0fc67244 */ jal mpIsChallengeComplete
/* f17fe9c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f17fea0: 2404001d */ addiu $a0,$zero,0x1d
/* f17fea4: 10400003 */ beqz $v0,.L0f17feb4
/* f17fea8: 00000000 */ nop
@ -5220,7 +5220,7 @@ glabel var7f1b897c
/* f185118: 2631716c */ addiu $s1,$s1,%lo(var8008716c)
/* f18511c: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews)
.L0f185120:
/* f185120: 0fc67244 */ jal mpIsChallengeComplete
/* f185120: 0fc67244 */ jal mpIsFeatureUnlocked
/* f185124: 92040004 */ lbu $a0,0x4($s0)
/* f185128: 50400008 */ beqzl $v0,.L0f18514c
/* f18512c: 26100006 */ addiu $s0,$s0,0x6
@ -5242,7 +5242,7 @@ glabel var7f1b897c
/* f185164: 2631716c */ addiu $s1,$s1,%lo(var8008716c)
/* f185168: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews)
.L0f18516c:
/* f18516c: 0fc67244 */ jal mpIsChallengeComplete
/* f18516c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f185170: 92040004 */ lbu $a0,0x4($s0)
/* f185174: 5040000f */ beqzl $v0,.L0f1851b4
/* f185178: 26100006 */ addiu $s0,$s0,0x6
@ -5272,7 +5272,7 @@ glabel var7f1b897c
/* f1851cc: 00008825 */ or $s1,$zero,$zero
/* f1851d0: 24130006 */ addiu $s3,$zero,0x6
.L0f1851d4:
/* f1851d4: 0fc67244 */ jal mpIsChallengeComplete
/* f1851d4: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1851d8: 92040004 */ lbu $a0,0x4($s0)
/* f1851dc: 5040000d */ beqzl $v0,.L0f185214
/* f1851e0: 26310001 */ addiu $s1,$s1,0x1
@ -5303,7 +5303,7 @@ glabel var7f1b897c
/* f185234: 00008825 */ or $s1,$zero,$zero
/* f185238: 24130006 */ addiu $s3,$zero,0x6
.L0f18523c:
/* f18523c: 0fc67244 */ jal mpIsChallengeComplete
/* f18523c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f185240: 92040004 */ lbu $a0,0x4($s0)
/* f185244: 5040000d */ beqzl $v0,.L0f18527c
/* f185248: 26310001 */ addiu $s1,$s1,0x1
@ -5329,11 +5329,11 @@ glabel var7f1b897c
/* f18528c: 24190002 */ addiu $t9,$zero,0x2
/* f185290: 12800009 */ beqz $s4,.L0f1852b8
/* f185294: aeb90000 */ sw $t9,0x0($s5)
/* f185298: 0fc67244 */ jal mpIsChallengeComplete
/* f185298: 0fc67244 */ jal mpIsFeatureUnlocked
/* f18529c: 2404001f */ addiu $a0,$zero,0x1f
/* f1852a0: 5440002e */ bnezl $v0,.L0f18535c
/* f1852a4: 00001025 */ or $v0,$zero,$zero
/* f1852a8: 0fc67244 */ jal mpIsChallengeComplete
/* f1852a8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1852ac: 24040021 */ addiu $a0,$zero,0x21
/* f1852b0: 5440002a */ bnezl $v0,.L0f18535c
/* f1852b4: 00001025 */ or $v0,$zero,$zero
@ -5359,7 +5359,7 @@ glabel var7f1b897c
/* f185300: 59c00015 */ blezl $t6,.L0f185358
/* f185304: aeb20008 */ sw $s2,0x8($s5)
.L0f185308:
/* f185308: 0fc67244 */ jal mpIsChallengeComplete
/* f185308: 0fc67244 */ jal mpIsFeatureUnlocked
/* f18530c: 92040004 */ lbu $a0,0x4($s0)
/* f185310: 50400008 */ beqzl $v0,.L0f185334
/* f185314: 8ea80000 */ lw $t0,0x0($s5)

View File

@ -377,18 +377,18 @@ glabel func0f19ab70
/* f19af38: 000f102b */ sltu $v0,$zero,$t7
);
bool func0f19af3c(s32 chrnum, s32 challengeindex)
bool mpIsChallengeAvailableToPlayer(s32 chrnum, s32 challengeindex)
{
if ((g_MpSetup.chrslots & (1 << chrnum)) == 0) {
return 0;
}
return ((g_MpChallenges[challengeindex].completions[0] & (2 << chrnum)) != 0);
return ((g_MpChallenges[challengeindex].availability & (2 << chrnum)) != 0);
}
bool mpIsChallengeAvailable(s32 challengeindex)
bool mpIsChallengeAvailableToAnyPlayer(s32 challengeindex)
{
return (g_MpChallenges[challengeindex].completions[0] & (((g_MpSetup.chrslots & 0xf) << 1) | 1)) != 0;
return (g_MpChallenges[challengeindex].availability & (((g_MpSetup.chrslots & 0xf) << 1) | 1)) != 0;
}
void mpDetermineUnlockedFeatures(void)
@ -401,9 +401,9 @@ void mpDetermineUnlockedFeatures(void)
s32 j;
s32 k;
// Clear all challenge completions
// Clear all challenge availability
for (challengeindex = 0; challengeindex < 30; challengeindex++) {
g_MpChallenges[challengeindex].completions[0] = 0;
g_MpChallenges[challengeindex].availability = 0;
}
numgifted = 0;
@ -412,10 +412,10 @@ void mpDetermineUnlockedFeatures(void)
for (challengeindex = 0; challengeindex < 30; challengeindex++) {
flag = 0;
if (mpIsChallengeCompletedByAnyChrWithNumPlayers(challengeindex, 1)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(challengeindex, 2)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(challengeindex, 3)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(challengeindex, 4)) {
if (mpIsChallengeCompletedByAnyPlayerWithNumPlayers(challengeindex, 1)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(challengeindex, 2)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(challengeindex, 3)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(challengeindex, 4)) {
// Completed challenge
flag = 1;
} else if (challengeindex < 4) {
@ -426,22 +426,22 @@ void mpDetermineUnlockedFeatures(void)
// Challenges are available if their previous one is complete
prev = challengeindex - 1;
if (mpIsChallengeCompletedByAnyChrWithNumPlayers(prev, 1)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(prev, 2)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(prev, 3)
|| mpIsChallengeCompletedByAnyChrWithNumPlayers(prev, 4)) {
if (mpIsChallengeCompletedByAnyPlayerWithNumPlayers(prev, 1)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(prev, 2)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(prev, 3)
|| mpIsChallengeCompletedByAnyPlayerWithNumPlayers(prev, 4)) {
flag = 1;
numgifted++;
}
}
g_MpChallenges[challengeindex].completions[0] |= flag;
g_MpChallenges[challengeindex].availability |= flag;
}
// Gift up to 4 challenges
for (challengeindex = 0; numgifted < 4 && challengeindex < 30; challengeindex++) {
if ((g_MpChallenges[challengeindex].completions[0] & 1) == 0) {
g_MpChallenges[challengeindex].completions[0] |= 1;
if ((g_MpChallenges[challengeindex].availability & 1) == 0) {
g_MpChallenges[challengeindex].availability |= 1;
numgifted++;
}
}
@ -453,10 +453,10 @@ void mpDetermineUnlockedFeatures(void)
for (challengeindex = 0; challengeindex < 30; challengeindex++) {
flag = 0;
if (mpIsChallengeCompletedByChrWithNumPlayers(j, challengeindex, 1)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, challengeindex, 2)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, challengeindex, 3)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, challengeindex, 4)) {
if (mpIsChallengeCompletedByPlayerWithNumPlayers(j, challengeindex, 1)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, challengeindex, 2)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, challengeindex, 3)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, challengeindex, 4)) {
// Completed challenge
flag = 2 << j;
} else if (challengeindex < 4) {
@ -467,51 +467,51 @@ void mpDetermineUnlockedFeatures(void)
// Challenges are available if their previous one is complete
prev = challengeindex - 1;
if (mpIsChallengeCompletedByChrWithNumPlayers(j, prev, 1)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, prev, 2)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, prev, 3)
|| mpIsChallengeCompletedByChrWithNumPlayers(j, prev, 4)) {
if (mpIsChallengeCompletedByPlayerWithNumPlayers(j, prev, 1)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, prev, 2)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, prev, 3)
|| mpIsChallengeCompletedByPlayerWithNumPlayers(j, prev, 4)) {
flag = 2 << j;
numgifted++;
}
}
g_MpChallenges[challengeindex].completions[0] |= flag;
g_MpChallenges[challengeindex].availability |= flag;
}
// Gift up to 4 challenges
for (challengeindex = 0; numgifted < 4 && challengeindex < 30; challengeindex++) {
if ((g_MpChallenges[challengeindex].completions[0] & (2 << j)) == 0) {
g_MpChallenges[challengeindex].completions[0] |= 2 << j;
if ((g_MpChallenges[challengeindex].availability & (2 << j)) == 0) {
g_MpChallenges[challengeindex].availability |= 2 << j;
numgifted++;
}
}
}
for (j = 0; j < 80; j++) {
for (j = 0; j < ARRAYCOUNT(g_MpFeaturesUnlocked); j++) {
flag = 0;
for (challengeindex = 0; challengeindex < 30; challengeindex++) {
if (mpIsChallengeAvailable(challengeindex)) {
if (mpIsChallengeAvailableToAnyPlayer(challengeindex)) {
for (i = 0; i < 16; i++) {
if (g_MpChallenges[challengeindex].unk09[i] == j) {
if (g_MpChallenges[challengeindex].unlockfeatures[i] == j) {
flag |= 1;
}
}
}
}
for (i = 0; i < 40; i++) {
if (var800acca0[i] == j) {
for (i = 0; i < ARRAYCOUNT(g_MpFeaturesForceUnlocked); i++) {
if (g_MpFeaturesForceUnlocked[i] == j) {
flag |= 1;
}
}
for (challengeindex = 0; challengeindex < 30; challengeindex++) {
for (prev = 0; prev < 4; prev++) {
if (func0f19af3c(prev, challengeindex)) {
if (mpIsChallengeAvailableToPlayer(prev, challengeindex)) {
for (i = 0; i < 16; i++) {
if (g_MpChallenges[challengeindex].unk09[i] == j) {
if (g_MpChallenges[challengeindex].unlockfeatures[i] == j) {
flag |= 2 << prev;
}
}
@ -519,21 +519,21 @@ void mpDetermineUnlockedFeatures(void)
}
}
g_MpChallengesCompleted[j] = flag;
g_MpFeaturesUnlocked[j] = flag;
}
for (j = 0; j < func0f188bcc(); j++) {
struct mpweapon *weapon = &g_MpWeapons[j];
if (weapon->unlock > 0 && func0f19cbcc(weapon->weaponnum)) {
g_MpChallengesCompleted[weapon->unlock] |= 1;
if (weapon->unlockfeature > 0 && func0f19cbcc(weapon->weaponnum)) {
g_MpFeaturesUnlocked[weapon->unlockfeature] |= 1;
}
}
func0f1895e8();
// If the ability to have 8 simulants hasn't been unlocked, limit them to 4
if (!mpIsChallengeComplete(0x40)) {
if (!mpIsFeatureUnlocked(MPFEATURE_8BOTS)) {
for (k = 4; k < 8; k++) {
if (g_MpSetup.chrslots & (1 << (4 + k))) {
mpRemoveSimulant(k);
@ -575,7 +575,7 @@ void mpPerformSanityChecks(void)
if (g_MpSetup.scenario == MPSCENARIO_KINGOFTHEHILL) {
g_Vars.mphilltime = 10;
}
} else if (!mpIsChallengeComplete(CHALLENGE_UNK64)) {
} else if (!mpIsFeatureUnlocked(MPFEATURE_8BOTS)) {
// Limit to 4 players and 4 simulants
g_MpSetup.chrslots &= 0x00ff;
}
@ -587,7 +587,7 @@ s32 mpGetNumAvailableChallenges(void)
s32 count = 0;
for (challengeindex = 0; challengeindex != NUM_CHALLENGES; challengeindex++) {
if (mpIsChallengeAvailable(challengeindex)) {
if (mpIsChallengeAvailableToAnyPlayer(challengeindex)) {
count++;
}
}
@ -606,7 +606,7 @@ char *mpGetChallengeNameBySlot(s32 slot)
s32 i;
for (i = 0; i < 30; i++) {
if (mpIsChallengeAvailable(i)) {
if (mpIsChallengeAvailableToAnyPlayer(i)) {
if (index == slot) {
return mpChallengeGetName(i);
}
@ -624,7 +624,7 @@ void mpSetCurrentChallenge(s32 slotnum)
g_MpChallengeIndex = 0;
for (challengeindex = 0; challengeindex != NUM_CHALLENGES; challengeindex++) {
if (mpIsChallengeAvailable(challengeindex)) {
if (mpIsChallengeAvailableToAnyPlayer(challengeindex)) {
if (slotnum == 0) {
g_MpChallengeIndex = challengeindex;
break;
@ -648,9 +648,9 @@ bool mpIsChallengeCompletedByAnyChrWithNumPlayersBySlot(s32 slot, s32 numplayers
s32 i;
for (i = 0; i < 30; i++) {
if (mpIsChallengeAvailable(i)) {
if (mpIsChallengeAvailableToAnyPlayer(i)) {
if (availableindex == slot) {
return mpIsChallengeCompletedByAnyChrWithNumPlayers(i, numplayers);
return mpIsChallengeCompletedByAnyPlayerWithNumPlayers(i, numplayers);
}
availableindex++;
@ -666,9 +666,9 @@ bool mpIsChallengeCompletedByChrWithNumPlayersBySlot(s32 mpchrnum, s32 slot, s32
s32 i;
for (i = 0; i < 30; i++) {
if (mpIsChallengeAvailable(i)) {
if (mpIsChallengeAvailableToAnyPlayer(i)) {
if (availableindex == slot) {
return mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, i, numplayers);
return mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, i, numplayers);
}
availableindex++;
@ -853,7 +853,7 @@ struct mpconfigfull *mpGetNthAvailableChallengeSomething(s32 n, u8 *buffer, s32
s32 challengeindex;
for (challengeindex = 0; challengeindex != NUM_CHALLENGES; challengeindex++) {
if (mpIsChallengeAvailable(challengeindex)) {
if (mpIsChallengeAvailableToAnyPlayer(challengeindex)) {
if (numavailable == n) {
return mpLoadChallenge(challengeindex, buffer, len);
}
@ -871,24 +871,24 @@ struct mpconfigfull *mpLoadCurrentChallenge(u8 *buffer, s32 len)
}
/**
* This is adding unlockvalue to the array, provided it's unique.
* This is adding featurenum to the array, provided it's unique.
*/
s32 func0f19bb50(s32 unlockvalue, u8 *array, s32 index, s32 len)
s32 mpForceUnlockFeature(s32 featurenum, u8 *array, s32 tail, s32 len)
{
s32 i;
for (i = 0; i < index; i++) {
if (array[i] == unlockvalue) {
for (i = 0; i < tail; i++) {
if (array[i] == featurenum) {
break;
}
}
if (i >= index && index < len) {
array[index] = unlockvalue;
index++;
if (i >= tail && tail < len) {
array[tail] = featurenum;
tail++;
}
return index;
return tail;
}
GLOBAL_ASM(
@ -923,7 +923,7 @@ glabel func0f19bb98
/* f19bc00: 3099007f */ andi $t9,$a0,0x7f
/* f19bc04: 13200004 */ beqz $t9,.L0f19bc18
/* f19bc08: 03202025 */ or $a0,$t9,$zero
/* f19bc0c: 0fc66ed4 */ jal func0f19bb50
/* f19bc0c: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bc10: 02c03825 */ or $a3,$s6,$zero
/* f19bc14: 00409025 */ or $s2,$v0,$zero
.L0f19bc18:
@ -950,7 +950,7 @@ glabel func0f19bb98
/* f19bc64: 02403025 */ or $a2,$s2,$zero
/* f19bc68: 50800005 */ beqzl $a0,.L0f19bc80
/* f19bc6c: 26310001 */ addiu $s1,$s1,0x1
/* f19bc70: 0fc66ed4 */ jal func0f19bb50
/* f19bc70: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bc74: 02c03825 */ or $a3,$s6,$zero
/* f19bc78: 00409025 */ or $s2,$v0,$zero
/* f19bc7c: 26310001 */ addiu $s1,$s1,0x1
@ -974,7 +974,7 @@ glabel func0f19bb98
/* f19bcbc: 02403025 */ or $a2,$s2,$zero
/* f19bcc0: 50800005 */ beqzl $a0,.L0f19bcd8
/* f19bcc4: 8ee3000c */ lw $v1,0xc($s7)
/* f19bcc8: 0fc66ed4 */ jal func0f19bb50
/* f19bcc8: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bccc: 02c03825 */ or $a3,$s6,$zero
/* f19bcd0: 00409025 */ or $s2,$v0,$zero
.L0f19bcd4:
@ -985,7 +985,7 @@ glabel func0f19bb98
/* f19bce0: 306d0001 */ andi $t5,$v1,0x1
/* f19bce4: 11a00005 */ beqz $t5,.L0f19bcfc
/* f19bce8: 02403025 */ or $a2,$s2,$zero
/* f19bcec: 0fc66ed4 */ jal func0f19bb50
/* f19bcec: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bcf0: 02c03825 */ or $a3,$s6,$zero
/* f19bcf4: 00409025 */ or $s2,$v0,$zero
/* f19bcf8: 8ee3000c */ lw $v1,0xc($s7)
@ -995,7 +995,7 @@ glabel func0f19bb98
/* f19bd04: 2404001d */ addiu $a0,$zero,0x1d
/* f19bd08: 02a02825 */ or $a1,$s5,$zero
/* f19bd0c: 02403025 */ or $a2,$s2,$zero
/* f19bd10: 0fc66ed4 */ jal func0f19bb50
/* f19bd10: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bd14: 02c03825 */ or $a3,$s6,$zero
/* f19bd18: 00409025 */ or $s2,$v0,$zero
.L0f19bd1c:
@ -1050,7 +1050,7 @@ glabel func0f19bd4c
/* f19bdc8: 02403025 */ or $a2,$s2,$zero
/* f19bdcc: 50800005 */ beqzl $a0,.L0f19bde4
/* f19bdd0: 00008025 */ or $s0,$zero,$zero
/* f19bdd4: 0fc66ed4 */ jal func0f19bb50
/* f19bdd4: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bdd8: 02603825 */ or $a3,$s3,$zero
/* f19bddc: 00409025 */ or $s2,$v0,$zero
.L0f19bde0:
@ -1069,7 +1069,7 @@ glabel func0f19bd4c
/* f19be08: 02403025 */ or $a2,$s2,$zero
/* f19be0c: 50800005 */ beqzl $a0,.L0f19be24
/* f19be10: 26100001 */ addiu $s0,$s0,0x1
/* f19be14: 0fc66ed4 */ jal func0f19bb50
/* f19be14: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19be18: 02603825 */ or $a3,$s3,$zero
/* f19be1c: 00409025 */ or $s2,$v0,$zero
.L0f19be20:
@ -1088,7 +1088,7 @@ glabel func0f19bd4c
/* f19be4c: 02403025 */ or $a2,$s2,$zero
/* f19be50: 50800005 */ beqzl $a0,.L0f19be68
/* f19be54: 92e20029 */ lbu $v0,0x29($s7)
/* f19be58: 0fc66ed4 */ jal func0f19bb50
/* f19be58: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19be5c: 02603825 */ or $a3,$s3,$zero
/* f19be60: 00409025 */ or $s2,$v0,$zero
.L0f19be64:
@ -1104,7 +1104,7 @@ glabel func0f19bd4c
/* f19be84: 02403025 */ or $a2,$s2,$zero
/* f19be88: 50800005 */ beqzl $a0,.L0f19bea0
/* f19be8c: 8faa0040 */ lw $t2,0x40($sp)
/* f19be90: 0fc66ed4 */ jal func0f19bb50
/* f19be90: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19be94: 02603825 */ or $a3,$s3,$zero
/* f19be98: 00409025 */ or $s2,$v0,$zero
.L0f19be9c:
@ -1122,7 +1122,7 @@ glabel func0f19bd4c
/* f19bec4: 28410019 */ slti $at,$v0,0x19
/* f19bec8: 14200006 */ bnez $at,.L0f19bee4
/* f19becc: 02403025 */ or $a2,$s2,$zero
/* f19bed0: 0fc66ed4 */ jal func0f19bb50
/* f19bed0: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bed4: 02603825 */ or $a3,$s3,$zero
/* f19bed8: 00409025 */ or $s2,$v0,$zero
/* f19bedc: 10000014 */ b .L0f19bf30
@ -1133,7 +1133,7 @@ glabel func0f19bd4c
/* f19beec: 24040023 */ addiu $a0,$zero,0x23
/* f19bef0: 02802825 */ or $a1,$s4,$zero
/* f19bef4: 02403025 */ or $a2,$s2,$zero
/* f19bef8: 0fc66ed4 */ jal func0f19bb50
/* f19bef8: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19befc: 02603825 */ or $a3,$s3,$zero
/* f19bf00: 00409025 */ or $s2,$v0,$zero
/* f19bf04: 1000000a */ b .L0f19bf30
@ -1144,7 +1144,7 @@ glabel func0f19bd4c
/* f19bf14: 2404004d */ addiu $a0,$zero,0x4d
/* f19bf18: 02802825 */ or $a1,$s4,$zero
/* f19bf1c: 02403025 */ or $a2,$s2,$zero
/* f19bf20: 0fc66ed4 */ jal func0f19bb50
/* f19bf20: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bf24: 02603825 */ or $a3,$s3,$zero
/* f19bf28: 00409025 */ or $s2,$v0,$zero
/* f19bf2c: 8fa2006c */ lw $v0,0x6c($sp)
@ -1154,7 +1154,7 @@ glabel func0f19bd4c
/* f19bf38: 24040040 */ addiu $a0,$zero,0x40
/* f19bf3c: 02802825 */ or $a1,$s4,$zero
/* f19bf40: 02403025 */ or $a2,$s2,$zero
/* f19bf44: 0fc66ed4 */ jal func0f19bb50
/* f19bf44: 0fc66ed4 */ jal mpForceUnlockFeature
/* f19bf48: 02603825 */ or $a3,$s3,$zero
/* f19bf4c: 00409025 */ or $s2,$v0,$zero
.L0f19bf50:
@ -1182,30 +1182,32 @@ glabel func0f19bd4c
/* f19bf9c: 27bd0060 */ addiu $sp,$sp,0x60
);
void func0f19bfa0(void)
void mpForceUnlockSimulantFeatures(void)
{
s32 numsims = 0;
s32 index = func0f19bb98(&g_MpSetup, var800acca0, 40);
s32 index = func0f19bb98(&g_MpSetup, g_MpFeaturesForceUnlocked, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
s32 i;
for (i = 0; i < 8; i++) {
// Force unlock the simulant type
s32 simtypeindex = mpGetSimTypeIndex(g_MpSimulants[i].base.simtype, SIMSKILL_NORMAL);
if (simtypeindex >= 0) {
s32 unlockvalue = g_MpSimulantTypes[simtypeindex].unlockvalue;
s32 featurenum = g_MpSimulantTypes[simtypeindex].requirefeature;
if (unlockvalue) {
index = func0f19bb50(unlockvalue, var800acca0, index, 40);
if (featurenum) {
index = mpForceUnlockFeature(featurenum, g_MpFeaturesForceUnlocked, index, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
}
}
// Force unlock the simulant skill
simtypeindex = mpGetSimTypeIndex(SIMTYPE_GENERAL, g_MpSimulants[i].skill);
if (simtypeindex >= 0) {
s32 unlockvalue = g_MpSimulantTypes[simtypeindex].unlockvalue;
s32 featurenum = g_MpSimulantTypes[simtypeindex].requirefeature;
if (unlockvalue) {
index = func0f19bb50(unlockvalue, var800acca0, index, 40);
if (featurenum) {
index = mpForceUnlockFeature(featurenum, g_MpFeaturesForceUnlocked, index, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
}
}
@ -1213,29 +1215,33 @@ void func0f19bfa0(void)
numsims++;
}
// Force unlock the simulant's body
if (g_MpSimulants[i].base.bodynum < ARRAYCOUNT(g_MpBodies)) {
s32 unlockvalue = g_MpBodies[g_MpSimulants[i].base.bodynum].unlockvalue;
s32 featurenum = g_MpBodies[g_MpSimulants[i].base.bodynum].requirefeature;
if (unlockvalue) {
index = func0f19bb50(unlockvalue, var800acca0, index, 40);
if (featurenum) {
index = mpForceUnlockFeature(featurenum, g_MpFeaturesForceUnlocked, index, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
}
}
// Force unlock the simulant's head
if (g_MpSimulants[i].base.headnum < ARRAYCOUNT(g_MpHeads)) {
s32 unlockvalue = g_MpHeads[g_MpSimulants[i].base.headnum].unlockvalue;
s32 featurenum = g_MpHeads[g_MpSimulants[i].base.headnum].requirefeature;
if (unlockvalue) {
index = func0f19bb50(unlockvalue, var800acca0, index, 40);
if (featurenum) {
index = mpForceUnlockFeature(featurenum, g_MpFeaturesForceUnlocked, index, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
}
}
}
// Force unlock 8 simulants
if (numsims > 4) {
index = func0f19bb50(64, var800acca0, index, 40);
index = mpForceUnlockFeature(MPFEATURE_8BOTS, g_MpFeaturesForceUnlocked, index, ARRAYCOUNT(g_MpFeaturesForceUnlocked));
}
for (i = index; i < 40; i++) {
var800acca0[i] = 0;
// Clear the remainder of the array
for (i = index; i < ARRAYCOUNT(g_MpFeaturesForceUnlocked); i++) {
g_MpFeaturesForceUnlocked[i] = 0;
}
mpDetermineUnlockedFeatures();
@ -1244,8 +1250,9 @@ void func0f19bfa0(void)
void func0f19c190(void)
{
s32 i;
for (i = 0; i < 40; i++) {
var800acca0[i] = 0;
for (i = 0; i < ARRAYCOUNT(g_MpFeaturesForceUnlocked); i++) {
g_MpFeaturesForceUnlocked[i] = 0;
}
mpDetermineUnlockedFeatures();
@ -1302,26 +1309,30 @@ char *mpconfigGetDescription(struct mpconfigfull *mpconfig)
return "";
}
s32 mpGetNumChallengesAvailable(s32 mpchrnum)
/**
* Return the index of the first incomplete challenge, but if it's in the first
* 4 then return index 4 because the first 4 are always shown.
*/
s32 mpGetAutoFocusedChallengeIndex(s32 mpchrnum)
{
s32 challengeindex;
s32 numavail = 0;
s32 index = 0;
for (challengeindex = 29; challengeindex >= 0; challengeindex--) {
if (mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, challengeindex, 1) ||
mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, challengeindex, 2) ||
mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, challengeindex, 3) ||
mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, challengeindex, 4)) {
numavail = challengeindex + 1;
if (mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, challengeindex, 1) ||
mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, challengeindex, 2) ||
mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, challengeindex, 3) ||
mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, challengeindex, 4)) {
index = challengeindex + 1;
break;
}
}
if (numavail < 4) {
numavail = 4;
if (index < 4) {
index = 4;
}
return numavail;
return index;
}
char *mpChallengeGetNameWithArg(s32 arg0, s32 challengeindex)
@ -1329,39 +1340,39 @@ char *mpChallengeGetNameWithArg(s32 arg0, s32 challengeindex)
return langGet(g_MpChallenges[challengeindex].name);
}
bool func0f19c3bc(s32 mpchrnum, s32 index, s32 numplayers)
bool mpIsChallengeCompletedByPlayerWithNumPlayers2(s32 mpchrnum, s32 index, s32 numplayers)
{
return mpIsChallengeCompletedByChrWithNumPlayers(mpchrnum, index, numplayers);
return mpIsChallengeCompletedByPlayerWithNumPlayers(mpchrnum, index, numplayers);
}
bool mpIsChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers)
bool mpIsChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers)
{
return (g_MpChallenges[index].completions[numplayers] & 1) != 0;
return (g_MpChallenges[index].completions[numplayers - 1] & 1) != 0;
}
void mpSetChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers, bool completed)
void mpSetChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers, bool completed)
{
if (completed) {
g_MpChallenges[index].completions[numplayers] |= 1;
g_MpChallenges[index].completions[numplayers - 1] |= 1;
return;
}
g_MpChallenges[index].completions[numplayers] &= ~1;
g_MpChallenges[index].completions[numplayers - 1] &= ~1;
}
bool mpIsChallengeCompletedByChrWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers)
bool mpIsChallengeCompletedByPlayerWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers)
{
return (g_MpChallenges[index].completions[numplayers] & (2 << mpchrnum)) != 0;
return (g_MpChallenges[index].completions[numplayers - 1] & (2 << mpchrnum)) != 0;
}
void mpSetChallengeCompletedByChrWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed)
void mpSetChallengeCompletedByPlayerWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed)
{
if (completed) {
g_MpChallenges[index].completions[numplayers] |= 2 << mpchrnum;
g_MpChallenges[index].completions[numplayers - 1] |= 2 << mpchrnum;
return;
}
g_MpChallenges[index].completions[numplayers] &= ~(2 << mpchrnum);
g_MpChallenges[index].completions[numplayers - 1] &= ~(2 << mpchrnum);
}
bool mpIsChallengeCompleteForEndscreen(void)
@ -1402,12 +1413,12 @@ void mpConsiderMarkingCurrentChallengeComplete(void)
u32 prevplayernum;
s32 i;
mpSetChallengeCompletedByAnyChrWithNumPlayers(g_MpChallengeIndex, PLAYERCOUNT(), 1);
mpSetChallengeCompletedByAnyPlayerWithNumPlayers(g_MpChallengeIndex, PLAYERCOUNT(), 1);
prevplayernum = g_Vars.currentplayernum;
for (i = 0; i < PLAYERCOUNT(); i++) {
setCurrentPlayerNum(i);
mpSetChallengeCompletedByChrWithNumPlayers(g_Vars.currentplayerstats->mpindex, g_MpChallengeIndex, PLAYERCOUNT(), true);
mpSetChallengeCompletedByPlayerWithNumPlayers(g_Vars.currentplayerstats->mpindex, g_MpChallengeIndex, PLAYERCOUNT(), true);
}
setCurrentPlayerNum(prevplayernum);
@ -1415,27 +1426,27 @@ void mpConsiderMarkingCurrentChallengeComplete(void)
}
}
bool mpIsChallengeComplete(s32 challenge)
bool mpIsFeatureUnlocked(s32 featurenum)
{
if (challenge == 0) {
if (featurenum == 0) {
return true;
}
return (g_MpChallengesCompleted[challenge] & 1) != 0;
return (g_MpFeaturesUnlocked[featurenum] & 1) != 0;
}
bool mpIsChallengeCompleteWithNumPlayers(u32 numplayers, s32 challenge)
bool mpIsFeatureUnlockedByPlayer(u32 numplayers, s32 featurenum)
{
if (challenge == 0) {
if (featurenum == 0) {
return true;
}
return (g_MpChallengesCompleted[challenge] & (2 << numplayers)) != 0;
return (g_MpFeaturesUnlocked[featurenum] & (2 << numplayers)) != 0;
}
bool func0f19c96c(s32 challenge)
bool func0f19c96c(s32 featurenum)
{
if (challenge) {
if (featurenum) {
return false;
}

View File

@ -214,7 +214,7 @@ void savefileLoadDefaults(struct savefile_solo *file)
for (i = 0; i < 30; i++) {
for (j = 1; j != 5; j++) {
mpSetChallengeCompletedByAnyChrWithNumPlayers(i, j, false);
mpSetChallengeCompletedByAnyPlayerWithNumPlayers(i, j, false);
}
}
@ -434,7 +434,7 @@ glabel func0f10fac8
/* f10fd40: 24050001 */ addiu $a1,$zero,0x1
/* f10fd44: 02202025 */ or $a0,$s1,$zero
/* f10fd48: 02002825 */ or $a1,$s0,$zero
/* f10fd4c: 0fc67103 */ jal mpSetChallengeCompletedByAnyChrWithNumPlayers
/* f10fd4c: 0fc67103 */ jal mpSetChallengeCompletedByAnyPlayerWithNumPlayers
/* f10fd50: 00403025 */ or $a2,$v0,$zero
/* f10fd54: 26100001 */ addiu $s0,$s0,0x1
/* f10fd58: 5612fff8 */ bnel $s0,$s2,.L0f10fd3c
@ -928,7 +928,7 @@ glabel func0f10feac
.L0f1104a0:
/* f1104a0: 02202025 */ or $a0,$s1,$zero
.L0f1104a4:
/* f1104a4: 0fc670f7 */ jal mpIsChallengeCompletedByAnyChrWithNumPlayers
/* f1104a4: 0fc670f7 */ jal mpIsChallengeCompletedByAnyPlayerWithNumPlayers
/* f1104a8: 02002825 */ or $a1,$s0,$zero
/* f1104ac: 02802025 */ or $a0,$s4,$zero
/* f1104b0: 00402825 */ or $a1,$v0,$zero

View File

@ -93,11 +93,11 @@ void mpStartMatch(void)
func0f17f260();
if (!mpIsChallengeComplete(30)) {
if (!mpIsFeatureUnlocked(MPFEATURE_ONEHITKILLS)) {
g_MpSetup.options &= ~MPOPTION_ONEHITKILLS;
}
if (!mpIsChallengeComplete(29)) {
if (!mpIsFeatureUnlocked(MPFEATURE_SLOWMOTION)) {
g_MpSetup.options &= ~(MPOPTION_SLOWMOTION_ON | MPOPTION_SLOWMOTION_SMART);
}
@ -707,7 +707,7 @@ glabel func0f18800c
.L0f188154:
/* f188154: 02202825 */ or $a1,$s1,$zero
/* f188158: 02003025 */ or $a2,$s0,$zero
/* f18815c: 0fc6712e */ jal mpSetChallengeCompletedByChrWithNumPlayers
/* f18815c: 0fc6712e */ jal mpSetChallengeCompletedByPlayerWithNumPlayers
/* f188160: 00003825 */ or $a3,$zero,$zero
/* f188164: 26100001 */ addiu $s0,$s0,0x1
/* f188168: 5612fffa */ bnel $s0,$s2,.L0f188154
@ -821,7 +821,7 @@ glabel func0f188210
/* f188308: a0430001 */ sb $v1,0x1($v0)
/* f18830c: a0430002 */ sb $v1,0x2($v0)
/* f188310: a0430003 */ sb $v1,0x3($v0)
/* f188314: 0fc66fe8 */ jal func0f19bfa0
/* f188314: 0fc66fe8 */ jal mpForceUnlockSimulantFeatures
/* f188318: ac430004 */ sw $v1,0x4($v0)
/* f18831c: 3c05800b */ lui $a1,%hi(g_MpPlayers)
/* f188320: 3c06800b */ lui $a2,%hi(g_ActiveMenuMpBotCommands)
@ -1477,7 +1477,7 @@ glabel mpGetNumWeaponOptions
/* f188bfc: 96040004 */ lhu $a0,0x4($s0)
.L0f188c00:
/* f188c00: 308e007f */ andi $t6,$a0,0x7f
/* f188c04: 0fc67244 */ jal mpIsChallengeComplete
/* f188c04: 0fc67244 */ jal mpIsFeatureUnlocked
/* f188c08: 01c02025 */ or $a0,$t6,$zero
/* f188c0c: 10400002 */ beqz $v0,.L0f188c18
/* f188c10: 2610000a */ addiu $s0,$s0,0xa
@ -1509,7 +1509,7 @@ glabel mpGetWeaponLabel
/* f188c64: 96040004 */ lhu $a0,0x4($s0)
.L0f188c68:
/* f188c68: 308e007f */ andi $t6,$a0,0x7f
/* f188c6c: 0fc67244 */ jal mpIsChallengeComplete
/* f188c6c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f188c70: 01c02025 */ or $a0,$t6,$zero
/* f188c74: 5040001e */ beqzl $v0,.L0f188cf0
/* f188c78: 2610000a */ addiu $s0,$s0,0xa
@ -1566,7 +1566,7 @@ void mpSetWeaponSlot(s32 slot, s32 mpweaponnum)
s32 i;
for (i = 0; i <= mpweaponnum; i++) {
if (mpIsChallengeComplete(g_MpWeapons[i].unlock) == 0) {
if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature) == 0) {
mpweaponnum++;
}
@ -1582,7 +1582,7 @@ s32 mpGetWeaponSlot(s32 slot)
s32 i;
for (i = 0; i < g_MpSetup.weapons[slot]; i++) {
if (mpIsChallengeComplete(g_MpWeapons[i].unlock)) {
if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature)) {
count++;
}
}
@ -1654,10 +1654,10 @@ s32 mpCountWeaponSetThing(s32 weaponsetindex)
}
for (i = 0; i < weaponsetindex; i++) {
if ((mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[0])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[1])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[2])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[3])) || g_MpWeaponSets[i].unk0c != 0x5c) {
if ((mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[0])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[1])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[2])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[3])) || g_MpWeaponSets[i].unk0c != 0x5c) {
count++;
}
}
@ -1671,10 +1671,10 @@ s32 func0f188f9c(s32 arg0)
for (i = 0; i < ARRAYCOUNT(g_MpWeaponSets); i++) {
// @bug? Shouldn't the disabled check be == WEAPON_DISABLED?
if ((mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[0])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[1])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[2])
&& mpIsChallengeComplete(g_MpWeaponSets[i].unlocks[3]))
if ((mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[0])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[1])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[2])
&& mpIsFeatureUnlocked(g_MpWeaponSets[i].requirefeatures[3]))
|| g_MpWeaponSets[i].unk0c != WEAPON_DISABLED) {
if (arg0 == 0) {
break;
@ -1796,19 +1796,19 @@ glabel func0f18913c
/* f189190: 2416000a */ addiu $s6,$zero,0xa
/* f189194: afa00044 */ sw $zero,0x44($sp)
.L0f189198:
/* f189198: 0fc67244 */ jal mpIsChallengeComplete
/* f189198: 0fc67244 */ jal mpIsFeatureUnlocked
/* f18919c: 93c40008 */ lbu $a0,0x8($s8)
/* f1891a0: 50400010 */ beqzl $v0,.L0f1891e4
/* f1891a4: 93d8000c */ lbu $t8,0xc($s8)
/* f1891a8: 0fc67244 */ jal mpIsChallengeComplete
/* f1891a8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1891ac: 93c40009 */ lbu $a0,0x9($s8)
/* f1891b0: 5040000c */ beqzl $v0,.L0f1891e4
/* f1891b4: 93d8000c */ lbu $t8,0xc($s8)
/* f1891b8: 0fc67244 */ jal mpIsChallengeComplete
/* f1891b8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1891bc: 93c4000a */ lbu $a0,0xa($s8)
/* f1891c0: 50400008 */ beqzl $v0,.L0f1891e4
/* f1891c4: 93d8000c */ lbu $t8,0xc($s8)
/* f1891c8: 0fc67244 */ jal mpIsChallengeComplete
/* f1891c8: 0fc67244 */ jal mpIsFeatureUnlocked
/* f1891cc: 93c4000b */ lbu $a0,0xb($s8)
/* f1891d0: 50400004 */ beqzl $v0,.L0f1891e4
/* f1891d4: 93d8000c */ lbu $t8,0xc($s8)
@ -1832,7 +1832,7 @@ glabel func0f18913c
/* f189210: 92500000 */ lbu $s0,0x0($s2)
/* f189214: 56140007 */ bnel $s0,$s4,.L0f189234
/* f189218: 92390018 */ lbu $t9,0x18($s1)
/* f18921c: 0fc67244 */ jal mpIsChallengeComplete
/* f18921c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189220: 24040016 */ addiu $a0,$zero,0x16
/* f189224: 54400003 */ bnezl $v0,.L0f189234
/* f189228: 92390018 */ lbu $t9,0x18($s1)
@ -1903,7 +1903,7 @@ glabel func0f1892dc
/* f189308: 000e7040 */ sll $t6,$t6,0x1
/* f18930c: 3c048008 */ lui $a0,%hi(g_MpWeaponSets+0x8)
/* f189310: 008e2021 */ addu $a0,$a0,$t6
/* f189314: 0fc67244 */ jal mpIsChallengeComplete
/* f189314: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189318: 908473f8 */ lbu $a0,%lo(g_MpWeaponSets+0x8)($a0)
/* f18931c: 50400029 */ beqzl $v0,.L0f1893c4
/* f189320: 8e0d0000 */ lw $t5,0x0($s0)
@ -1913,7 +1913,7 @@ glabel func0f1892dc
/* f189330: 030fc021 */ addu $t8,$t8,$t7
/* f189334: 0018c040 */ sll $t8,$t8,0x1
/* f189338: 00982021 */ addu $a0,$a0,$t8
/* f18933c: 0fc67244 */ jal mpIsChallengeComplete
/* f18933c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189340: 908473f9 */ lbu $a0,%lo(g_MpWeaponSets+0x9)($a0)
/* f189344: 5040001f */ beqzl $v0,.L0f1893c4
/* f189348: 8e0d0000 */ lw $t5,0x0($s0)
@ -1923,7 +1923,7 @@ glabel func0f1892dc
/* f189358: 01996021 */ addu $t4,$t4,$t9
/* f18935c: 000c6040 */ sll $t4,$t4,0x1
/* f189360: 008c2021 */ addu $a0,$a0,$t4
/* f189364: 0fc67244 */ jal mpIsChallengeComplete
/* f189364: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189368: 908473fa */ lbu $a0,%lo(g_MpWeaponSets+0xa)($a0)
/* f18936c: 50400015 */ beqzl $v0,.L0f1893c4
/* f189370: 8e0d0000 */ lw $t5,0x0($s0)
@ -1933,7 +1933,7 @@ glabel func0f1892dc
/* f189380: 01cd7021 */ addu $t6,$t6,$t5
/* f189384: 000e7040 */ sll $t6,$t6,0x1
/* f189388: 008e2021 */ addu $a0,$a0,$t6
/* f18938c: 0fc67244 */ jal mpIsChallengeComplete
/* f18938c: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189390: 908473fb */ lbu $a0,%lo(g_MpWeaponSets+0xb)($a0)
/* f189394: 5040000b */ beqzl $v0,.L0f1893c4
/* f189398: 8e0d0000 */ lw $t5,0x0($s0)
@ -1982,7 +1982,7 @@ glabel func0f1892dc
/* f189438: afa60038 */ sw $a2,0x38($sp)
/* f18943c: afa0003c */ sw $zero,0x3c($sp)
/* f189440: afaa0024 */ sw $t2,0x24($sp)
/* f189444: 0fc67244 */ jal mpIsChallengeComplete
/* f189444: 0fc67244 */ jal mpIsFeatureUnlocked
/* f189448: afab0028 */ sw $t3,0x28($sp)
/* f18944c: 3c088008 */ lui $t0,%hi(g_MpWeapons)
/* f189450: 25087268 */ addiu $t0,$t0,%lo(g_MpWeapons)
@ -2872,18 +2872,18 @@ glabel func0f18a030
);
struct mpweaponset g_MpWeaponSets[] = {
{ /*0x00*/ L_MPWEAPONS(55), { WEAPON_FALCON2, WEAPON_MAGSEC4, WEAPON_PHOENIX, WEAPON_MAULER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x08, 0x07, 0x00, 0x00 }, 0x02, 0x05, 0x02, 0x08, 0x5b, 0x5c }, // Pistols
{ /*0x01*/ L_MPWEAPONS(54), { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_LAPTOPGUN, WEAPON_AR34, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x0b, 0x00, 0x00, 0x00 }, 0x02, 0x0a, 0x0f, 0x11, 0x5b, 0x5c }, // Automatics
{ /*0x02*/ L_MPWEAPONS(53), { WEAPON_MAGSEC4, WEAPON_DY357MAGNUM, WEAPON_SHOTGUN, WEAPON_RCP120, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x0e, 0x0d, 0x00, 0x00 }, 0x05, 0x08, 0x0f, 0x11, 0x5b, 0x5c }, // Power
{ /*0x03*/ L_MPWEAPONS(52), { WEAPON_PHOENIX, WEAPON_CYCLONE, WEAPON_CALLISTONTG, WEAPON_FARSIGHTXR20, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x01, 0x0a, 0x00, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // FarSight
{ /*0x04*/ L_MPWEAPONS(51), { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_DRAGON, WEAPON_TRANQUILIZER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x02, 0x00, 0x00, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Tranquilizer
{ /*0x05*/ L_MPWEAPONS(50), { WEAPON_MAULER, WEAPON_K7AVENGER, WEAPON_REAPER, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x03, 0x07, 0x0c, 0x0f }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Heavy
{ /*0x06*/ L_MPWEAPONS(49), { WEAPON_FALCON2_SILENCER, WEAPON_GRENADE, WEAPON_CMP150, WEAPON_DY357LX, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x05, 0x09, 0x00, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Golden Magnum
{ /*0x07*/ L_MPWEAPONS(48), { WEAPON_DEVASTATOR, WEAPON_DEVASTATOR, WEAPON_SUPERDRAGON, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x03, 0x10, 0x00, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Explosive
{ /*0x08*/ L_MPWEAPONS(47), { WEAPON_MAGSEC4, WEAPON_CMP150, WEAPON_AR34, WEAPON_DEVASTATOR, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x10, 0x00, 0x00, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Grenade Launcher
{ /*0x09*/ L_MPWEAPONS(46), { WEAPON_MAULER, WEAPON_CYCLONE, WEAPON_DRAGON, WEAPON_ROCKETLAUNCHER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x07, 0x00, 0x00, 0x00 }, 0x02, 0x0b, 0x0f, 0x18, 0x5b, 0x5c }, // Rocket Launcher
{ /*0x0a*/ L_MPWEAPONS(45), { WEAPON_MAGSEC4, WEAPON_LAPTOPGUN, WEAPON_K7AVENGER, WEAPON_PROXIMITYMINE, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x0b, 0x0c, 0x13, 0x00 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Proximity Mine
{ /*0x0b*/ L_MPWEAPONS(44), { WEAPON_COMBATKNIFE, WEAPON_COMBATKNIFE, WEAPON_TIMEDMINE, WEAPON_CROSSBOW, WEAPON_MPSHIELD, WEAPON_DISABLED }, { 0x11, 0x00, 0x00, 0x00 }, 0x1a, 0x1a, 0x20, 0x20, 0x5b, 0x5c }, // Close Combat
{ /*0x00*/ L_MPWEAPONS(55), { WEAPON_FALCON2, WEAPON_MAGSEC4, WEAPON_PHOENIX, WEAPON_MAULER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_PHOENIX, MPFEATURE_WEAPON_MAULER, 0, 0 }, 0x02, 0x05, 0x02, 0x08, 0x5b, 0x5c }, // Pistols
{ /*0x01*/ L_MPWEAPONS(54), { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_LAPTOPGUN, WEAPON_AR34, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_LAPTOPGUN, 0, 0, 0 }, 0x02, 0x0a, 0x0f, 0x11, 0x5b, 0x5c }, // Automatics
{ /*0x02*/ L_MPWEAPONS(53), { WEAPON_MAGSEC4, WEAPON_DY357MAGNUM, WEAPON_SHOTGUN, WEAPON_RCP120, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SHOTGUN, MPFEATURE_WEAPON_RCP120, 0, 0 }, 0x05, 0x08, 0x0f, 0x11, 0x5b, 0x5c }, // Power
{ /*0x03*/ L_MPWEAPONS(52), { WEAPON_PHOENIX, WEAPON_CYCLONE, WEAPON_CALLISTONTG, WEAPON_FARSIGHTXR20, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_FARSIGHT, MPFEATURE_WEAPON_CALLISTO, 0, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // FarSight
{ /*0x04*/ L_MPWEAPONS(51), { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_DRAGON, WEAPON_TRANQUILIZER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_TRANQUILIZER, 0, 0, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Tranquilizer
{ /*0x05*/ L_MPWEAPONS(50), { WEAPON_MAULER, WEAPON_K7AVENGER, WEAPON_REAPER, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SUPERDRAGON, MPFEATURE_WEAPON_MAULER, MPFEATURE_WEAPON_K7AVENGER, MPFEATURE_WEAPON_REAPER }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Heavy
{ /*0x06*/ L_MPWEAPONS(49), { WEAPON_FALCON2_SILENCER, WEAPON_GRENADE, WEAPON_CMP150, WEAPON_DY357LX, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_FALCON2SILENCED, MPFEATURE_WEAPON_DY357LX, 0, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Golden Magnum
{ /*0x07*/ L_MPWEAPONS(48), { WEAPON_DEVASTATOR, WEAPON_DEVASTATOR, WEAPON_SUPERDRAGON, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SUPERDRAGON, MPFEATURE_WEAPON_DEVASTATOR, 0, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Explosive
{ /*0x08*/ L_MPWEAPONS(47), { WEAPON_MAGSEC4, WEAPON_CMP150, WEAPON_AR34, WEAPON_DEVASTATOR, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_DEVASTATOR, 0, 0, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Grenade Launcher
{ /*0x09*/ L_MPWEAPONS(46), { WEAPON_MAULER, WEAPON_CYCLONE, WEAPON_DRAGON, WEAPON_ROCKETLAUNCHER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_MAULER, 0, 0, 0 }, 0x02, 0x0b, 0x0f, 0x18, 0x5b, 0x5c }, // Rocket Launcher
{ /*0x0a*/ L_MPWEAPONS(45), { WEAPON_MAGSEC4, WEAPON_LAPTOPGUN, WEAPON_K7AVENGER, WEAPON_PROXIMITYMINE, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_LAPTOPGUN, MPFEATURE_WEAPON_K7AVENGER, MPFEATURE_WEAPON_PROXIMITYMINE, 0 }, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c }, // Proximity Mine
{ /*0x0b*/ L_MPWEAPONS(44), { WEAPON_COMBATKNIFE, WEAPON_COMBATKNIFE, WEAPON_TIMEDMINE, WEAPON_CROSSBOW, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_CROSSBOW, 0, 0, 0 }, 0x1a, 0x1a, 0x20, 0x20, 0x5b, 0x5c }, // Close Combat
};
u32 var800874c8 = 0x00000000;
@ -3019,91 +3019,91 @@ const char var7f1b8c04[] = "PakId for player %d: %d\n";
const char var7f1b8c20[] = "Load Player - Result: %d\n";
struct mphead g_MpBeauHeads[NUM_MPBEAUHEADS] = {
// head, unlock value
{ HEAD_BEAU2, 0x00 },
{ HEAD_BEAU3, 0x00 },
{ HEAD_BEAU4, 0x00 },
{ HEAD_BEAU5, 0x00 },
{ HEAD_BEAU6, 0x00 },
// head, require feature
{ HEAD_BEAU2, 0 },
{ HEAD_BEAU3, 0 },
{ HEAD_BEAU4, 0 },
{ HEAD_BEAU5, 0 },
{ HEAD_BEAU6, 0 },
};
struct mphead g_MpHeads[75] = {
// head, unlock value
{ /*0x00*/ HEAD_DARK_COMBAT, 0x00 },
{ /*0x01*/ HEAD_DARK_FROCK, 0x41 },
{ /*0x02*/ HEAD_DARKAQUA, 0x45 },
{ /*0x03*/ HEAD_DARK_SNOW, 0x4a },
{ /*0x04*/ HEAD_ELVIS, 0x3d },
{ /*0x05*/ HEAD_ELVIS_GOGS, 0x3d },
{ /*0x06*/ HEAD_CARRINGTON, 0x00 },
{ /*0x07*/ HEAD_MRBLONDE, 0x38 },
{ /*0x08*/ HEAD_CASSANDRA, 0x00 },
{ /*0x09*/ HEAD_TRENT, 0x35 },
{ /*0x0a*/ HEAD_JONATHAN, 0x3a },
{ /*0x0b*/ HEAD_VD, 0x00 },
{ /*0x0c*/ HEAD_PRESIDENT, 0x41 },
{ /*0x0d*/ HEAD_DDSHOCK, 0x00 },
{ /*0x0e*/ HEAD_BIOTECH, 0x3c },
{ /*0x0f*/ HEAD_DDSNIPER, 0x34 },
{ /*0x10*/ HEAD_A51FACEPLATE, 0x3a },
{ /*0x11*/ HEAD_SECRETARY, 0x00 },
{ /*0x12*/ HEAD_FEM_GUARD, 0x32 },
{ /*0x13*/ HEAD_FEM_GUARD2, 0x32 },
{ /*0x14*/ HEAD_MAIAN_S, 0x3d },
{ /*0x15*/ HEAD_JON, 0x00 },
{ /*0x16*/ HEAD_BEAU1, 0x00 },
{ /*0x17*/ HEAD_ROSS, 0x00 },
{ /*0x18*/ HEAD_MARK2, 0x00 },
{ /*0x19*/ HEAD_CHRIST, 0x00 },
{ /*0x1a*/ HEAD_RUSS, 0x00 },
{ /*0x1b*/ HEAD_DARLING, 0x00 },
{ /*0x1c*/ HEAD_BRIAN, 0x00 },
{ /*0x1d*/ HEAD_JAMIE, 0x00 },
{ /*0x1e*/ HEAD_DUNCAN2, 0x00 },
{ /*0x1f*/ HEAD_KEITH, 0x00 },
{ /*0x20*/ HEAD_STEVEM, 0x00 },
{ /*0x21*/ HEAD_GRANT, 0x00 },
{ /*0x22*/ HEAD_PENNY, 0x00 },
{ /*0x23*/ HEAD_DAVEC, 0x00 },
{ /*0x24*/ HEAD_JONES, 0x00 },
{ /*0x25*/ HEAD_GRAHAM, 0x00 },
{ /*0x26*/ HEAD_ROBERT, 0x00 },
{ /*0x27*/ HEAD_NEIL2, 0x00 },
{ /*0x28*/ HEAD_SHAUN, 0x00 },
{ /*0x29*/ HEAD_ROBIN, 0x00 },
{ /*0x2a*/ HEAD_COOK, 0x00 },
{ /*0x2b*/ HEAD_PRYCE, 0x00 },
{ /*0x2c*/ HEAD_SILKE, 0x00 },
{ /*0x2d*/ HEAD_SMITH, 0x00 },
{ /*0x2e*/ HEAD_GARETH, 0x00 },
{ /*0x2f*/ HEAD_MURCHIE, 0x00 },
{ /*0x30*/ HEAD_WONG, 0x00 },
{ /*0x31*/ HEAD_CARTER, 0x00 },
{ /*0x32*/ HEAD_TINTIN, 0x00 },
{ /*0x33*/ HEAD_MUNTON, 0x00 },
{ /*0x34*/ HEAD_STAMPER, 0x00 },
{ /*0x35*/ HEAD_PHELPS, 0x00 },
{ /*0x36*/ HEAD_ALEX, 0x00 },
{ /*0x37*/ HEAD_JULIANNE, 0x00 },
{ /*0x38*/ HEAD_LAURA, 0x00 },
{ /*0x39*/ HEAD_EDMCG, 0x00 },
{ /*0x3a*/ HEAD_ANKA, 0x00 },
{ /*0x3b*/ HEAD_LESLIE_S, 0x00 },
{ /*0x3c*/ HEAD_MATT_C, 0x00 },
{ /*0x3d*/ HEAD_PEER_S, 0x00 },
{ /*0x3e*/ HEAD_EILEEN_T, 0x00 },
{ /*0x3f*/ HEAD_ANDY_R, 0x00 },
{ /*0x40*/ HEAD_BEN_R, 0x00 },
{ /*0x41*/ HEAD_STEVE_K, 0x00 },
{ /*0x42*/ HEAD_SANCHEZ, 0x00 },
{ /*0x43*/ HEAD_TIM, 0x00 },
{ /*0x44*/ HEAD_KEN, 0x00 },
{ /*0x45*/ HEAD_EILEEN_H, 0x00 },
{ /*0x46*/ HEAD_SCOTT_H, 0x00 },
{ /*0x47*/ HEAD_JOEL, 0x00 },
{ /*0x48*/ HEAD_GRIFFEY, 0x00 },
{ /*0x49*/ HEAD_MOTO, 0x00 },
{ /*0x4a*/ HEAD_WINNER, 0x00 },
// head, require feature
{ /*0x00*/ HEAD_DARK_COMBAT, 0 },
{ /*0x01*/ HEAD_DARK_FROCK, MPFEATURE_41 },
{ /*0x02*/ HEAD_DARKAQUA, MPFEATURE_45 },
{ /*0x03*/ HEAD_DARK_SNOW, MPFEATURE_4A },
{ /*0x04*/ HEAD_ELVIS, MPFEATURE_3D },
{ /*0x05*/ HEAD_ELVIS_GOGS, MPFEATURE_3D },
{ /*0x06*/ HEAD_CARRINGTON, 0 },
{ /*0x07*/ HEAD_MRBLONDE, MPFEATURE_38 },
{ /*0x08*/ HEAD_CASSANDRA, 0 },
{ /*0x09*/ HEAD_TRENT, MPFEATURE_35 },
{ /*0x0a*/ HEAD_JONATHAN, MPFEATURE_3A },
{ /*0x0b*/ HEAD_VD, 0 },
{ /*0x0c*/ HEAD_PRESIDENT, MPFEATURE_41 },
{ /*0x0d*/ HEAD_DDSHOCK, 0 },
{ /*0x0e*/ HEAD_BIOTECH, MPFEATURE_3C },
{ /*0x0f*/ HEAD_DDSNIPER, MPFEATURE_34 },
{ /*0x10*/ HEAD_A51FACEPLATE, MPFEATURE_3A },
{ /*0x11*/ HEAD_SECRETARY, 0 },
{ /*0x12*/ HEAD_FEM_GUARD, MPFEATURE_32 },
{ /*0x13*/ HEAD_FEM_GUARD2, MPFEATURE_32 },
{ /*0x14*/ HEAD_MAIAN_S, MPFEATURE_3D },
{ /*0x15*/ HEAD_JON, 0 },
{ /*0x16*/ HEAD_BEAU1, 0 },
{ /*0x17*/ HEAD_ROSS, 0 },
{ /*0x18*/ HEAD_MARK2, 0 },
{ /*0x19*/ HEAD_CHRIST, 0 },
{ /*0x1a*/ HEAD_RUSS, 0 },
{ /*0x1b*/ HEAD_DARLING, 0 },
{ /*0x1c*/ HEAD_BRIAN, 0 },
{ /*0x1d*/ HEAD_JAMIE, 0 },
{ /*0x1e*/ HEAD_DUNCAN2, 0 },
{ /*0x1f*/ HEAD_KEITH, 0 },
{ /*0x20*/ HEAD_STEVEM, 0 },
{ /*0x21*/ HEAD_GRANT, 0 },
{ /*0x22*/ HEAD_PENNY, 0 },
{ /*0x23*/ HEAD_DAVEC, 0 },
{ /*0x24*/ HEAD_JONES, 0 },
{ /*0x25*/ HEAD_GRAHAM, 0 },
{ /*0x26*/ HEAD_ROBERT, 0 },
{ /*0x27*/ HEAD_NEIL2, 0 },
{ /*0x28*/ HEAD_SHAUN, 0 },
{ /*0x29*/ HEAD_ROBIN, 0 },
{ /*0x2a*/ HEAD_COOK, 0 },
{ /*0x2b*/ HEAD_PRYCE, 0 },
{ /*0x2c*/ HEAD_SILKE, 0 },
{ /*0x2d*/ HEAD_SMITH, 0 },
{ /*0x2e*/ HEAD_GARETH, 0 },
{ /*0x2f*/ HEAD_MURCHIE, 0 },
{ /*0x30*/ HEAD_WONG, 0 },
{ /*0x31*/ HEAD_CARTER, 0 },
{ /*0x32*/ HEAD_TINTIN, 0 },
{ /*0x33*/ HEAD_MUNTON, 0 },
{ /*0x34*/ HEAD_STAMPER, 0 },
{ /*0x35*/ HEAD_PHELPS, 0 },
{ /*0x36*/ HEAD_ALEX, 0 },
{ /*0x37*/ HEAD_JULIANNE, 0 },
{ /*0x38*/ HEAD_LAURA, 0 },
{ /*0x39*/ HEAD_EDMCG, 0 },
{ /*0x3a*/ HEAD_ANKA, 0 },
{ /*0x3b*/ HEAD_LESLIE_S, 0 },
{ /*0x3c*/ HEAD_MATT_C, 0 },
{ /*0x3d*/ HEAD_PEER_S, 0 },
{ /*0x3e*/ HEAD_EILEEN_T, 0 },
{ /*0x3f*/ HEAD_ANDY_R, 0 },
{ /*0x40*/ HEAD_BEN_R, 0 },
{ /*0x41*/ HEAD_STEVE_K, 0 },
{ /*0x42*/ HEAD_SANCHEZ, 0 },
{ /*0x43*/ HEAD_TIM, 0 },
{ /*0x44*/ HEAD_KEN, 0 },
{ /*0x45*/ HEAD_EILEEN_H, 0 },
{ /*0x46*/ HEAD_SCOTT_H, 0 },
{ /*0x47*/ HEAD_JOEL, 0 },
{ /*0x48*/ HEAD_GRIFFEY, 0 },
{ /*0x49*/ HEAD_MOTO, 0 },
{ /*0x4a*/ HEAD_WINNER, 0 },
};
// 2d678
@ -3118,91 +3118,91 @@ u32 table_0x2d678[] = {
// 2d74c
struct mpsimulanttype g_MpSimulantTypes[] = {
// type, skill, name, body, unlock value
{ SIMTYPE_GENERAL, SIMSKILL_MEAT, L_MISC(88), MPBODY_DD_GUARD, 0x00 },
{ SIMTYPE_GENERAL, SIMSKILL_EASY, L_MISC(89), MPBODY_DD_SECGUARD, 0x00 },
{ SIMTYPE_GENERAL, SIMSKILL_NORMAL, L_MISC(90), MPBODY_DD_SHOCK_INF, 0x00 },
{ SIMTYPE_GENERAL, SIMSKILL_HARD, L_MISC(91), MPBODY_DDSHOCK, 0x19 },
{ SIMTYPE_GENERAL, SIMSKILL_PERFECT, L_MISC(92), MPBODY_STRIPES, 0x1a },
{ SIMTYPE_GENERAL, SIMSKILL_DARK, L_MISC(93), MPBODY_MOORE, 0x1c },
{ SIMTYPE_PEACE, SIMSKILL_NORMAL, L_MISC(94), MPBODY_DD_LABTECH, 0x00 },
{ SIMTYPE_SHIELD, SIMSKILL_NORMAL, L_MISC(95), MPBODY_G5_SWAT_GUARD, 0x00 },
{ SIMTYPE_ROCKET, SIMSKILL_NORMAL, L_MISC(96), MPBODY_G5_GUARD, 0x00 },
{ SIMTYPE_KAZE, SIMSKILL_NORMAL, L_MISC(97), MPBODY_PRES_SECURITY, 0x00 },
{ SIMTYPE_FIST, SIMSKILL_NORMAL, L_MISC(98), MPBODY_PELAGIC_GUARD, 0x00 },
{ SIMTYPE_PREY, SIMSKILL_NORMAL, L_MISC(99), MPBODY_DDSHOCK, 0x00 },
{ SIMTYPE_COWARD, SIMSKILL_NORMAL, L_MISC(100), MPBODY_PRESIDENT, 0x00 },
{ SIMTYPE_JUDGE, SIMSKILL_NORMAL, L_MISC(101), MPBODY_STEWARD, 0x00 },
{ SIMTYPE_FEUD, SIMSKILL_NORMAL, L_MISC(102), MPBODY_NSA_LACKEY, 0x00 },
{ SIMTYPE_SPEED, SIMSKILL_NORMAL, L_MISC(103), MPBODY_MRBLONDE, 0x00 },
{ SIMTYPE_TURTLE, SIMSKILL_NORMAL, L_MISC(104), MPBODY_CARRINGTON, 0x00 },
{ SIMTYPE_VENGE, SIMSKILL_NORMAL, L_MISC(105), MPBODY_ALASKAN_GUARD, 0x00 },
// type, skill, name, body, require feature
{ SIMTYPE_GENERAL, SIMSKILL_MEAT, L_MISC(88), MPBODY_DD_GUARD, 0 },
{ SIMTYPE_GENERAL, SIMSKILL_EASY, L_MISC(89), MPBODY_DD_SECGUARD, 0 },
{ SIMTYPE_GENERAL, SIMSKILL_NORMAL, L_MISC(90), MPBODY_DD_SHOCK_INF, 0 },
{ SIMTYPE_GENERAL, SIMSKILL_HARD, L_MISC(91), MPBODY_DDSHOCK, MPFEATURE_SIMSKILL_HARD },
{ SIMTYPE_GENERAL, SIMSKILL_PERFECT, L_MISC(92), MPBODY_STRIPES, MPFEATURE_SIMSKILL_PERFECT },
{ SIMTYPE_GENERAL, SIMSKILL_DARK, L_MISC(93), MPBODY_MOORE, MPFEATURE_SIMSKILL_DARK },
{ SIMTYPE_PEACE, SIMSKILL_NORMAL, L_MISC(94), MPBODY_DD_LABTECH, 0 },
{ SIMTYPE_SHIELD, SIMSKILL_NORMAL, L_MISC(95), MPBODY_G5_SWAT_GUARD, 0 },
{ SIMTYPE_ROCKET, SIMSKILL_NORMAL, L_MISC(96), MPBODY_G5_GUARD, 0 },
{ SIMTYPE_KAZE, SIMSKILL_NORMAL, L_MISC(97), MPBODY_PRES_SECURITY, 0 },
{ SIMTYPE_FIST, SIMSKILL_NORMAL, L_MISC(98), MPBODY_PELAGIC_GUARD, 0 },
{ SIMTYPE_PREY, SIMSKILL_NORMAL, L_MISC(99), MPBODY_DDSHOCK, 0 },
{ SIMTYPE_COWARD, SIMSKILL_NORMAL, L_MISC(100), MPBODY_PRESIDENT, 0 },
{ SIMTYPE_JUDGE, SIMSKILL_NORMAL, L_MISC(101), MPBODY_STEWARD, 0 },
{ SIMTYPE_FEUD, SIMSKILL_NORMAL, L_MISC(102), MPBODY_NSA_LACKEY, 0 },
{ SIMTYPE_SPEED, SIMSKILL_NORMAL, L_MISC(103), MPBODY_MRBLONDE, 0 },
{ SIMTYPE_TURTLE, SIMSKILL_NORMAL, L_MISC(104), MPBODY_CARRINGTON, 0 },
{ SIMTYPE_VENGE, SIMSKILL_NORMAL, L_MISC(105), MPBODY_ALASKAN_GUARD, 0 },
};
// 2d7dc
struct mpbody g_MpBodies[NUM_MPBODIES] = {
// global body ID, name, head, unk06
/*0x00*/ { BODY_DARK_COMBAT, L_OPTIONS(16), HEAD_DARK_COMBAT, 0x00 },
/*0x01*/ { BODY_DARK_TRENCH, L_OPTIONS(17), HEAD_DARK_COMBAT, 0x46 },
/*0x02*/ { BODY_DARK_FROCK, L_OPTIONS(18), HEAD_DARK_FROCK, 0x41 },
/*0x03*/ { BODY_DARK_RIPPED, L_OPTIONS(19), HEAD_DARK_FROCK, 0x41 },
/*0x04*/ { BODY_DARK_AF1, L_OPTIONS(20), HEAD_DARK_COMBAT, 0x3f },
/*0x05*/ { BODY_DARK_LEATHER, L_MPWEAPONS(156), HEAD_DARK_COMBAT, 0x37 },
/*0x06*/ { BODY_DARK_NEGOTIATOR, L_MPWEAPONS(157), HEAD_DARK_COMBAT, 0x34 },
/*0x07*/ { BODY_DARKWET, L_OPTIONS(21), HEAD_DARKAQUA, 0x45 },
/*0x08*/ { BODY_DARKAQUALUNG, L_OPTIONS(22), HEAD_DARKAQUA, 0x45 },
/*0x09*/ { BODY_DARKSNOW, L_OPTIONS(23), HEAD_DARK_SNOW, 0x4a },
/*0x0a*/ { BODY_DARKLAB, L_OPTIONS(24), HEAD_DARK_COMBAT, 0x3a },
/*0x0b*/ { BODY_THEKING, L_OPTIONS(25), HEAD_ELVIS, 0x3d },
/*0x0c*/ { BODY_ELVIS1, L_OPTIONS(26), HEAD_ELVIS, 0x3d },
/*0x0d*/ { BODY_ELVISWAISTCOAT, L_MPWEAPONS(158), HEAD_ELVIS, 0x3d },
/*0x0e*/ { BODY_CARRINGTON, L_OPTIONS(27), HEAD_CARRINGTON, 0x00 },
/*0x0f*/ { BODY_CARREVENINGSUIT, L_OPTIONS(28), HEAD_CARRINGTON, 0x41 },
/*0x10*/ { BODY_MRBLONDE, L_OPTIONS(29), HEAD_MRBLONDE, 0x38 },
/*0x11*/ { BODY_CASSANDRA, L_OPTIONS(30), HEAD_CASSANDRA, 0x00 },
/*0x12*/ { BODY_TRENT, L_OPTIONS(31), HEAD_TRENT, 0x35 },
/*0x13*/ { BODY_JONATHAN, L_OPTIONS(32), HEAD_JONATHAN, 0x4c },
/*0x14*/ { BODY_CILABTECH, L_OPTIONS(33), 1000, 0x00 },
/*0x15*/ { BODY_CIFEMTECH, L_OPTIONS(34), 1000, 0x00 },
/*0x16*/ { BODY_CISOLDIER, L_OPTIONS(35), 1000, 0x00 },
/*0x17*/ { BODY_DDSHOCK, L_OPTIONS(36), HEAD_DDSHOCK, 0x00 },
/*0x18*/ { BODY_FEM_GUARD, L_OPTIONS(37), 1000, 0x32 },
/*0x19*/ { BODY_DD_SECGUARD, L_OPTIONS(38), 1000, 0x00 },
/*0x1a*/ { BODY_DD_GUARD, L_OPTIONS(39), 1000, 0x00 },
/*0x1b*/ { BODY_DD_SHOCK_INF, L_OPTIONS(40), 1000, 0x00 },
/*0x1c*/ { BODY_SECRETARY, L_OPTIONS(41), 1000, 0x00 },
/*0x1d*/ { BODY_OFFICEWORKER, L_OPTIONS(42), 1000, 0x33 },
/*0x1e*/ { BODY_OFFICEWORKER2, L_OPTIONS(43), 1000, 0x33 },
/*0x1f*/ { BODY_NEGOTIATOR, L_OPTIONS(44), 1000, 0x34 },
/*0x20*/ { BODY_DDSNIPER, L_OPTIONS(45), HEAD_DDSNIPER, 0x34 },
/*0x21*/ { BODY_G5_GUARD, L_OPTIONS(46), 1000, 0x37 },
/*0x22*/ { BODY_G5_SWAT_GUARD, L_OPTIONS(47), 1000, 0x37 },
/*0x23*/ { BODY_CIAGUY, L_OPTIONS(48), 1000, 0x39 },
/*0x24*/ { BODY_FBIGUY, L_OPTIONS(49), 1000, 0x39 },
/*0x25*/ { BODY_AREA51GUARD, L_OPTIONS(50), 1000, 0x3a },
/*0x26*/ { BODY_A51TROOPER, L_OPTIONS(51), 1000, 0x3a },
/*0x27*/ { BODY_A51AIRMAN, L_OPTIONS(52), 1000, 0x3a },
/*0x28*/ { BODY_OVERALL, L_OPTIONS(53), 1000, 0x3a },
/*0x29*/ { BODY_STRIPES, L_OPTIONS(54), 1000, 0x44 },
/*0x2a*/ { BODY_LABTECH, L_OPTIONS(55), 1000, 0x3b },
/*0x2b*/ { BODY_FEMLABTECH, L_OPTIONS(56), 1000, 0x3b },
/*0x2c*/ { BODY_DD_LABTECH, L_OPTIONS(57), 1000, 0x3b },
/*0x2d*/ { BODY_BIOTECH, L_OPTIONS(58), HEAD_BIOTECH, 0x3c },
/*0x2e*/ { BODY_ALASKAN_GUARD, L_OPTIONS(59), 1000, 0x3e },
/*0x2f*/ { BODY_PILOTAF1, L_OPTIONS(60), 1000, 0x3f },
/*0x30*/ { BODY_STEWARD, L_OPTIONS(61), 1000, 0x3f },
/*0x31*/ { BODY_STEWARDESS, L_OPTIONS(62), 1000, 0x3f },
/*0x32*/ { BODY_STEWARDESS_COAT, L_OPTIONS(63), 1000, 0x3f },
/*0x33*/ { BODY_PRESIDENT, L_OPTIONS(64), HEAD_PRESIDENT, 0x41 },
/*0x34*/ { BODY_NSA_LACKEY, L_OPTIONS(65), 1000, 0x36 },
/*0x35*/ { BODY_PRES_SECURITY, L_OPTIONS(66), 1000, 0x43 },
/*0x36*/ { BODY_PRESIDENT_CLONE2, L_OPTIONS(67), HEAD_PRESIDENT, 0x42 },
/*0x37*/ { BODY_PELAGIC_GUARD, L_OPTIONS(68), 1000, 0x45 },
/*0x38*/ { BODY_MAIAN_SOLDIER, L_OPTIONS(69), HEAD_MAIAN_S, 0x3d },
/*0x39*/ { BODY_CONNERY, L_OPTIONS(70), 1000, 0x40 },
/*0x3a*/ { BODY_MOORE, L_OPTIONS(70), 1000, 0x40 },
/*0x3b*/ { BODY_DALTON, L_OPTIONS(70), 1000, 0x40 },
/*0x3c*/ { BODY_DJBOND, L_OPTIONS(70), 1000, 0x40 },
// global body ID, name, head, require feature
/*0x00*/ { BODY_DARK_COMBAT, L_OPTIONS(16), HEAD_DARK_COMBAT, 0 },
/*0x01*/ { BODY_DARK_TRENCH, L_OPTIONS(17), HEAD_DARK_COMBAT, MPFEATURE_46 },
/*0x02*/ { BODY_DARK_FROCK, L_OPTIONS(18), HEAD_DARK_FROCK, MPFEATURE_41 },
/*0x03*/ { BODY_DARK_RIPPED, L_OPTIONS(19), HEAD_DARK_FROCK, MPFEATURE_41 },
/*0x04*/ { BODY_DARK_AF1, L_OPTIONS(20), HEAD_DARK_COMBAT, MPFEATURE_3F },
/*0x05*/ { BODY_DARK_LEATHER, L_MPWEAPONS(156), HEAD_DARK_COMBAT, MPFEATURE_37 },
/*0x06*/ { BODY_DARK_NEGOTIATOR, L_MPWEAPONS(157), HEAD_DARK_COMBAT, MPFEATURE_34 },
/*0x07*/ { BODY_DARKWET, L_OPTIONS(21), HEAD_DARKAQUA, MPFEATURE_45 },
/*0x08*/ { BODY_DARKAQUALUNG, L_OPTIONS(22), HEAD_DARKAQUA, MPFEATURE_45 },
/*0x09*/ { BODY_DARKSNOW, L_OPTIONS(23), HEAD_DARK_SNOW, MPFEATURE_4A },
/*0x0a*/ { BODY_DARKLAB, L_OPTIONS(24), HEAD_DARK_COMBAT, MPFEATURE_3A },
/*0x0b*/ { BODY_THEKING, L_OPTIONS(25), HEAD_ELVIS, MPFEATURE_3D },
/*0x0c*/ { BODY_ELVIS1, L_OPTIONS(26), HEAD_ELVIS, MPFEATURE_3D },
/*0x0d*/ { BODY_ELVISWAISTCOAT, L_MPWEAPONS(158), HEAD_ELVIS, MPFEATURE_3D },
/*0x0e*/ { BODY_CARRINGTON, L_OPTIONS(27), HEAD_CARRINGTON, 0 },
/*0x0f*/ { BODY_CARREVENINGSUIT, L_OPTIONS(28), HEAD_CARRINGTON, MPFEATURE_41 },
/*0x10*/ { BODY_MRBLONDE, L_OPTIONS(29), HEAD_MRBLONDE, MPFEATURE_38 },
/*0x11*/ { BODY_CASSANDRA, L_OPTIONS(30), HEAD_CASSANDRA, 0 },
/*0x12*/ { BODY_TRENT, L_OPTIONS(31), HEAD_TRENT, MPFEATURE_35 },
/*0x13*/ { BODY_JONATHAN, L_OPTIONS(32), HEAD_JONATHAN, MPFEATURE_4C },
/*0x14*/ { BODY_CILABTECH, L_OPTIONS(33), 1000, 0 },
/*0x15*/ { BODY_CIFEMTECH, L_OPTIONS(34), 1000, 0 },
/*0x16*/ { BODY_CISOLDIER, L_OPTIONS(35), 1000, 0 },
/*0x17*/ { BODY_DDSHOCK, L_OPTIONS(36), HEAD_DDSHOCK, 0 },
/*0x18*/ { BODY_FEM_GUARD, L_OPTIONS(37), 1000, MPFEATURE_32 },
/*0x19*/ { BODY_DD_SECGUARD, L_OPTIONS(38), 1000, 0 },
/*0x1a*/ { BODY_DD_GUARD, L_OPTIONS(39), 1000, 0 },
/*0x1b*/ { BODY_DD_SHOCK_INF, L_OPTIONS(40), 1000, 0 },
/*0x1c*/ { BODY_SECRETARY, L_OPTIONS(41), 1000, 0 },
/*0x1d*/ { BODY_OFFICEWORKER, L_OPTIONS(42), 1000, MPFEATURE_33 },
/*0x1e*/ { BODY_OFFICEWORKER2, L_OPTIONS(43), 1000, MPFEATURE_33 },
/*0x1f*/ { BODY_NEGOTIATOR, L_OPTIONS(44), 1000, MPFEATURE_34 },
/*0x20*/ { BODY_DDSNIPER, L_OPTIONS(45), HEAD_DDSNIPER, MPFEATURE_34 },
/*0x21*/ { BODY_G5_GUARD, L_OPTIONS(46), 1000, MPFEATURE_37 },
/*0x22*/ { BODY_G5_SWAT_GUARD, L_OPTIONS(47), 1000, MPFEATURE_37 },
/*0x23*/ { BODY_CIAGUY, L_OPTIONS(48), 1000, MPFEATURE_39 },
/*0x24*/ { BODY_FBIGUY, L_OPTIONS(49), 1000, MPFEATURE_39 },
/*0x25*/ { BODY_AREA51GUARD, L_OPTIONS(50), 1000, MPFEATURE_3A },
/*0x26*/ { BODY_A51TROOPER, L_OPTIONS(51), 1000, MPFEATURE_3A },
/*0x27*/ { BODY_A51AIRMAN, L_OPTIONS(52), 1000, MPFEATURE_3A },
/*0x28*/ { BODY_OVERALL, L_OPTIONS(53), 1000, MPFEATURE_3A },
/*0x29*/ { BODY_STRIPES, L_OPTIONS(54), 1000, MPFEATURE_44 },
/*0x2a*/ { BODY_LABTECH, L_OPTIONS(55), 1000, MPFEATURE_3B },
/*0x2b*/ { BODY_FEMLABTECH, L_OPTIONS(56), 1000, MPFEATURE_3B },
/*0x2c*/ { BODY_DD_LABTECH, L_OPTIONS(57), 1000, MPFEATURE_3B },
/*0x2d*/ { BODY_BIOTECH, L_OPTIONS(58), HEAD_BIOTECH, MPFEATURE_3C },
/*0x2e*/ { BODY_ALASKAN_GUARD, L_OPTIONS(59), 1000, MPFEATURE_3E },
/*0x2f*/ { BODY_PILOTAF1, L_OPTIONS(60), 1000, MPFEATURE_3F },
/*0x30*/ { BODY_STEWARD, L_OPTIONS(61), 1000, MPFEATURE_3F },
/*0x31*/ { BODY_STEWARDESS, L_OPTIONS(62), 1000, MPFEATURE_3F },
/*0x32*/ { BODY_STEWARDESS_COAT, L_OPTIONS(63), 1000, MPFEATURE_3F },
/*0x33*/ { BODY_PRESIDENT, L_OPTIONS(64), HEAD_PRESIDENT, MPFEATURE_41 },
/*0x34*/ { BODY_NSA_LACKEY, L_OPTIONS(65), 1000, MPFEATURE_36 },
/*0x35*/ { BODY_PRES_SECURITY, L_OPTIONS(66), 1000, MPFEATURE_43 },
/*0x36*/ { BODY_PRESIDENT_CLONE2, L_OPTIONS(67), HEAD_PRESIDENT, MPFEATURE_42 },
/*0x37*/ { BODY_PELAGIC_GUARD, L_OPTIONS(68), 1000, MPFEATURE_45 },
/*0x38*/ { BODY_MAIAN_SOLDIER, L_OPTIONS(69), HEAD_MAIAN_S, MPFEATURE_3D },
/*0x39*/ { BODY_CONNERY, L_OPTIONS(70), 1000, MPFEATURE_8BOTS },
/*0x3a*/ { BODY_MOORE, L_OPTIONS(70), 1000, MPFEATURE_8BOTS },
/*0x3b*/ { BODY_DALTON, L_OPTIONS(70), 1000, MPFEATURE_8BOTS },
/*0x3c*/ { BODY_DJBOND, L_OPTIONS(70), 1000, MPFEATURE_8BOTS },
};
u32 g_MpMaleHeads[] = {
@ -4828,9 +4828,9 @@ s32 mpGetHeadId(u8 headnum)
return g_MpHeads[headnum].headnum;
}
s32 mpGetHeadUnlockValue(u8 headnum)
s32 mpGetHeadRequiredFeature(u8 headnum)
{
return g_MpHeads[headnum].unlockvalue;
return g_MpHeads[headnum].requirefeature;
}
s32 mpGetBeauHeadId(u8 headnum)
@ -4889,14 +4889,14 @@ char *mpGetBodyName(u8 bodynum)
return langGet(g_MpBodies[bodynum].name);
}
u8 mpGetBodyUnk06(u8 bodynum)
u8 mpGetBodyRequiredFeature(u8 bodynum)
{
// Possible @bug: This should probably be >=
if (bodynum > NUM_MPBODIES) {
bodynum = 0;
}
return g_MpBodies[bodynum].unlockvalue;
return g_MpBodies[bodynum].requirefeature;
}
s32 mpGetMpheadnumByMpbodynum(s32 mpbodynum)
@ -5825,7 +5825,7 @@ GLOBAL_ASM(
glabel func0f18cc8c
/* f18cc8c: 27bdffe8 */ addiu $sp,$sp,-24
/* f18cc90: afbf0014 */ sw $ra,0x14($sp)
/* f18cc94: 0fc67244 */ jal mpIsChallengeComplete
/* f18cc94: 0fc67244 */ jal mpIsFeatureUnlocked
/* f18cc98: 24040040 */ addiu $a0,$zero,0x40
/* f18cc9c: 10400003 */ beqz $v0,.L0f18ccac
/* f18cca0: 3c04800b */ lui $a0,%hi(g_MpSetup+0x16)
@ -6412,7 +6412,7 @@ glabel func0f18d2b8
/* f18d554: 02802025 */ or $a0,$s4,$zero
/* f18d558: 02202825 */ or $a1,$s1,$zero
/* f18d55c: 02003025 */ or $a2,$s0,$zero
/* f18d560: 0fc6712e */ jal mpSetChallengeCompletedByChrWithNumPlayers
/* f18d560: 0fc6712e */ jal mpSetChallengeCompletedByPlayerWithNumPlayers
/* f18d564: 00403825 */ or $a3,$v0,$zero
/* f18d568: 26100001 */ addiu $s0,$s0,0x1
/* f18d56c: 5612fff7 */ bnel $s0,$s2,.L0f18d54c
@ -6685,7 +6685,7 @@ glabel func0f18d5c4
/* f18d93c: 02802025 */ or $a0,$s4,$zero
.L0f18d940:
/* f18d940: 02202825 */ or $a1,$s1,$zero
/* f18d944: 0fc6711f */ jal mpIsChallengeCompletedByChrWithNumPlayers
/* f18d944: 0fc6711f */ jal mpIsChallengeCompletedByPlayerWithNumPlayers
/* f18d948: 02003025 */ or $a2,$s0,$zero
/* f18d94c: 02602025 */ or $a0,$s3,$zero
/* f18d950: 00402825 */ or $a1,$v0,$zero
@ -6857,8 +6857,8 @@ bool mpIsPresetUnlocked(s32 presetnum)
s32 i;
for (i = 0; i != 16; i++) {
if (!mpIsChallengeComplete(g_MpPresets[presetnum].challenges[i]) &&
g_MpPresets[presetnum].challenges[i] != 22) {
if (!mpIsFeatureUnlocked(g_MpPresets[presetnum].requirefeatures[i]) &&
g_MpPresets[presetnum].requirefeatures[i] != MPFEATURE_WEAPON_SHIELD) {
return false;
}
}
@ -7002,7 +7002,7 @@ glabel func0f18dcec
/* f18de3c: 26f70004 */ addiu $s7,$s7,0x4
/* f18de40: 1420ffd2 */ bnez $at,.L0f18dd8c
/* f18de44: a239ffc5 */ sb $t9,-0x3b($s1)
/* f18de48: 0fc67244 */ jal mpIsChallengeComplete
/* f18de48: 0fc67244 */ jal mpIsFeatureUnlocked
/* f18de4c: 24040016 */ addiu $a0,$zero,0x16
/* f18de50: 1440000c */ bnez $v0,.L0f18de84
/* f18de54: 3c04800b */ lui $a0,%hi(g_MpSetup+0x6)
@ -7211,7 +7211,7 @@ glabel func0f18df5c
/* f18e130: 261000a0 */ addiu $s0,$s0,0xa0
/* f18e134: 1611fffb */ bne $s0,$s1,.L0f18e124
/* f18e138: a202ff71 */ sb $v0,-0x8f($s0)
/* f18e13c: 0fc66fe8 */ jal func0f19bfa0
/* f18e13c: 0fc66fe8 */ jal mpForceUnlockSimulantFeatures
/* f18e140: 00000000 */ nop
/* f18e144: 8fbf0034 */ lw $ra,0x34($sp)
/* f18e148: 8fb00018 */ lw $s0,0x18($sp)

View File

@ -17140,8 +17140,10 @@ u32 var800acc74 = 0;
u32 var800acc78 = 0;
u32 var800acc7c = 0;
struct chrdata *g_MpSimulantChrs[MAX_SIMULANTS] = {NULL};
u8 var800acca0[40] = {0};
u8 g_MpChallengesCompleted[88] = {0}; // This is one *byte* per challenge, and length is at least 64
u8 g_MpFeaturesForceUnlocked[40] = {0};
u8 g_MpFeaturesUnlocked[80] = {0};
u32 var800acd18 = 0;
u32 var800acd1c = 0;
struct frdata g_FrData = {0};
struct trainingdata g_DtData = {0};
struct trainingdata g_HoloTrainingData = {0};

View File

@ -246,10 +246,6 @@
#define CASING_RIFLE 2
#define CASING_SHOTGUN 3
// Challenge numbers don't appear to be a 1:1 mapping :(
#define CHALLENGE_7 30
#define CHALLENGE_UNK64 64
#define CHANNEL_0 0
#define CHANNEL_1 1
#define CHANNEL_2 2
@ -1767,6 +1763,87 @@
#define MPCONFIG_CHALLENGE29 0x2a
#define MPCONFIG_CHALLENGE30 0x2b
// Features are things that can be unlocked
#define MPFEATURE_WEAPON_FARSIGHT 0x01
#define MPFEATURE_WEAPON_TRANQUILIZER 0x02
#define MPFEATURE_WEAPON_SUPERDRAGON 0x03
#define MPFEATURE_WEAPON_SLAYER 0x04
#define MPFEATURE_WEAPON_FALCON2SILENCED 0x05
#define MPFEATURE_WEAPON_FALCON2SCOPE 0x06
#define MPFEATURE_WEAPON_MAULER 0x07
#define MPFEATURE_WEAPON_PHOENIX 0x08
#define MPFEATURE_WEAPON_DY357LX 0x09
#define MPFEATURE_WEAPON_CALLISTO 0x0a
#define MPFEATURE_WEAPON_LAPTOPGUN 0x0b
#define MPFEATURE_WEAPON_K7AVENGER 0x0c
#define MPFEATURE_WEAPON_RCP120 0x0d
#define MPFEATURE_WEAPON_SHOTGUN 0x0e
#define MPFEATURE_WEAPON_REAPER 0x0f
#define MPFEATURE_WEAPON_DEVASTATOR 0x10
#define MPFEATURE_WEAPON_CROSSBOW 0x11
#define MPFEATURE_WEAPON_NBOMB 0x12
#define MPFEATURE_WEAPON_PROXIMITYMINE 0x13
#define MPFEATURE_WEAPON_REMOTEMINE 0x14
#define MPFEATURE_WEAPON_XRAYSCANNER 0x15
#define MPFEATURE_WEAPON_SHIELD 0x16
#define MPFEATURE_WEAPON_CLOAKINGDEVICE 0x17
#define MPFEATURE_WEAPON_COMBATBOOST 0x18
#define MPFEATURE_SIMSKILL_HARD 0x19
#define MPFEATURE_SIMSKILL_PERFECT 0x1a
#define MPFEATURE_1B 0x1b
#define MPFEATURE_SIMSKILL_DARK 0x1c
#define MPFEATURE_SLOWMOTION 0x1d
#define MPFEATURE_ONEHITKILLS 0x1e
#define MPFEATURE_1F 0x1f
#define MPFEATURE_20 0x20
#define MPFEATURE_21 0x21
#define MPFEATURE_22 0x22
#define MPFEATURE_STAGE_CARPARK 0x23
#define MPFEATURE_STAGE_COMPLEX 0x24
#define MPFEATURE_STAGE_WAREHOUSE 0x25
#define MPFEATURE_STAGE_RAVINE 0x26
#define MPFEATURE_STAGE_TEMPLE 0x27
#define MPFEATURE_STAGE_G5BUILDING 0x28
#define MPFEATURE_STAGE_GRID 0x29
#define MPFEATURE_STAGE_FELICITY 0x2a
#define MPFEATURE_STAGE_VILLA 0x2b
#define MPFEATURE_STAGE_SEWERS 0x2c
#define MPFEATURE_STAGE_RUINS 0x2d
#define MPFEATURE_STAGE_BASE 0x2e
#define MPFEATURE_2F 0x2f
#define MPFEATURE_STAGE_FORTRESS 0x30
#define MPFEATURE_31 0x31
#define MPFEATURE_32 0x32
#define MPFEATURE_33 0x33
#define MPFEATURE_34 0x34
#define MPFEATURE_35 0x35
#define MPFEATURE_36 0x36
#define MPFEATURE_37 0x37
#define MPFEATURE_38 0x38
#define MPFEATURE_39 0x39
#define MPFEATURE_3A 0x3a
#define MPFEATURE_3B 0x3b
#define MPFEATURE_3C 0x3c
#define MPFEATURE_3D 0x3d
#define MPFEATURE_3E 0x3e
#define MPFEATURE_3F 0x3f
#define MPFEATURE_8BOTS 0x40 // also unlocks the 4 Bonds
#define MPFEATURE_41 0x41
#define MPFEATURE_42 0x42
#define MPFEATURE_43 0x43
#define MPFEATURE_44 0x44
#define MPFEATURE_45 0x45
#define MPFEATURE_46 0x46
#define MPFEATURE_47 0x47
#define MPFEATURE_48 0x48
#define MPFEATURE_49 0x49
#define MPFEATURE_4A 0x4a
#define MPFEATURE_4B 0x4b
#define MPFEATURE_4C 0x4c
#define MPFEATURE_4D 0x4d
#define MPFEATURE_4E 0x4e
#define MPFEATURE_WEAPON_LASER 0x4f
#define MPHEAD_DARK_COMBAT 0x00
#define MPHEAD_DARK_FROCK 0x01
#define MPHEAD_DARKAQUA 0x02

View File

@ -14,18 +14,18 @@ void mpPerformSanityChecks(void);
char *mpGetChallengeNameBySlot(s32 slot);
bool mpIsChallengeCompletedByAnyChrWithNumPlayersBySlot(s32 slot, s32 numplayers);
struct mpconfigfull *mpLoadConfig(s32 confignum, u8 *buffer, s32 len);
s32 func0f19bb50(s32 unlockvalue, u8 *array, s32 index, s32 len);
s32 mpForceUnlockFeature(s32 featurenum, u8 *array, s32 tail, s32 len);
s32 func0f19bb98(struct mpsetup *mpsetup, u8 *array, s32 len);
u32 func0f19bd4c(void);
void func0f19bfa0(void);
void mpForceUnlockSimulantFeatures(void);
void func0f19c1cc(void);
char *mpGetCurrentChallengeDescription(void);
char *mpconfigGetDescription(struct mpconfigfull *mpconfig);
bool mpIsChallengeCompleteForEndscreen(void);
bool aiMpInitSimulants(void);
void func0f19ab40(void);
bool func0f19af3c(s32 chrnum, s32 challengeindex);
bool mpIsChallengeAvailable(s32 challengeindex);
bool mpIsChallengeAvailableToPlayer(s32 chrnum, s32 challengeindex);
bool mpIsChallengeAvailableToAnyPlayer(s32 challengeindex);
s32 mpGetNumAvailableChallenges(void);
char *mpChallengeGetName(s32 challengeindex);
void mpSetCurrentChallenge(s32 slotnum);
@ -38,14 +38,14 @@ s32 mpRemoveLock(void);
void mpLoadAndStoreCurrentChallenge(u8 *buffer, s32 len);
void mpClearCurrentChallenge(void);
bool mpIsChallengeLoaded(void);
s32 mpGetNumChallengesAvailable(s32 mpchrnum);
s32 mpGetAutoFocusedChallengeIndex(s32 mpchrnum);
char *mpChallengeGetNameWithArg(s32 arg0, s32 challengeindex);
bool func0f19c3bc(s32 mpchrnum, s32 index, s32 numplayers);
bool mpIsChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers);
void mpSetChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByChrWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers);
void mpSetChallengeCompletedByChrWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByPlayerWithNumPlayers2(s32 mpchrnum, s32 index, s32 numplayers);
bool mpIsChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers);
void mpSetChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByPlayerWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers);
void mpSetChallengeCompletedByPlayerWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed);
void mpConsiderMarkingCurrentChallengeComplete(void);
bool mpIsChallengeComplete(s32 challenge);
bool mpIsFeatureUnlocked(s32 feature);
#endif

View File

@ -48,13 +48,13 @@ void func0f18b9e4(void);
u32 func0f18bb1c(void);
s32 mpGetNumHeads(void);
s32 mpGetHeadId(u8 headnum);
s32 mpGetHeadUnlockValue(u8 headnum);
s32 mpGetHeadRequiredFeature(u8 headnum);
s32 mpGetBeauHeadId(u8 headnum);
u32 mpGetNumBodies(void);
s32 mpGetBodyId(u8 bodynum);
s32 mpGetMpbodynumByBodynum(u16 bodynum);
char *mpGetBodyName(u8 bodynum);
u8 mpGetBodyUnk06(u8 bodynum);
u8 mpGetBodyRequiredFeature(u8 bodynum);
s32 mpGetMpheadnumByMpbodynum(s32 bodynum);
u32 mpChooseRandomLockPlayer(void);
bool mpSetLock(s32 locktype, s32 playernum);

View File

@ -833,8 +833,8 @@ extern u32 var800acc28[18];
extern u32 var800acc70;
extern u32 var800acc74;
extern struct chrdata *g_MpSimulantChrs[MAX_SIMULANTS];
extern u8 var800acca0[40];
extern u8 g_MpChallengesCompleted[];
extern u8 g_MpFeaturesForceUnlocked[40];
extern u8 g_MpFeaturesUnlocked[80];
extern struct frdata g_FrData;
extern struct trainingdata g_DtData;
extern struct trainingdata g_HoloTrainingData;

View File

@ -3070,7 +3070,7 @@ struct stagetableentry {
struct mpweaponset {
/*0x00*/ u16 name;
/*0x02*/ u8 slots[6];
/*0x08*/ u8 unlocks[4];
/*0x08*/ u8 requirefeatures[4];
/*0x0c*/ u8 unk0c;
/*0x0d*/ u8 unk0d;
/*0x0e*/ u8 unk0e;
@ -3081,7 +3081,7 @@ struct mpweaponset {
struct mphead {
s16 headnum;
u8 unlockvalue;
u8 requirefeature;
};
struct mpsimulanttype {
@ -3089,14 +3089,14 @@ struct mpsimulanttype {
/*0x01*/ u8 skill;
/*0x02*/ u16 name;
/*0x04*/ u16 body;
/*0x06*/ u8 unlockvalue;
/*0x06*/ u8 requirefeature;
};
struct mpbody {
s16 bodynum;
s16 name;
s16 headnum;
u8 unlockvalue;
u8 requirefeature;
};
struct mptrack {
@ -4484,7 +4484,7 @@ struct mpscenariooverview {
struct mparena {
s16 stagenum;
u8 unlock;
u8 requirefeature;
u16 name;
};
@ -4521,11 +4521,20 @@ struct challenge {
/*0x00*/ u16 name;
/*0x02*/ s16 confignum;
// One byte for each number of players,
// and 4 bits in each to mark which players completed it
/*0x04*/ u8 completions[5];
// Bitfield xxx4 321a
// The number denotes if that player has the challenge available,
// and `a` denotes if any other has the challenge available.
/*0x04*/ u8 availability;
/*0x09*/ u8 unk09[16];
// Same structure as availability, however each byte determines how many
// players it was completed with. So completions[0] is for completions with
// a single player and completions[3] is for completions with 4 players.
/*0x05*/ u8 completions[4];
// Array of features which will become unlocked once the challenge is
// available. Seems to be unused though, as all arrays are empty.
// Maybe it's populated at runtime?
/*0x09*/ u8 unlockfeatures[16];
};
struct scenariodata_cbt {
@ -4777,7 +4786,7 @@ struct criteria_holograph {
struct mppreset {
u16 name;
u32 confignum;
u8 challenges[16];
u8 requirefeatures[16]; // Doesn't seem to be used? All values are zero
};
struct explosiontype {
@ -5816,7 +5825,7 @@ struct mpweapon {
/*0x03*/ s8 weapon2ammotypeminusone;
/*0x04*/ u8 weapon2ammoqty;
/*0x05*/ u8 giveweapon : 1;
/*0x05*/ u8 unlock : 7;
/*0x05*/ u8 unlockfeature : 7;
/*0x06*/ s16 model;
/*0x08*/ s16 extrascale;
};