diff --git a/src/game/game_19aa80.c b/src/game/game_19aa80.c index 82cc3e1c6..8bf7e597f 100644 --- a/src/game/game_19aa80.c +++ b/src/game/game_19aa80.c @@ -1258,7 +1258,7 @@ s32 mpForceUnlockSetupFeatures(struct mpsetup *setup, u8 *array, s32 len) // Force unlock the scenario if (setup->scenario <= MPSCENARIO_CAPTURETHECASE) { - s32 featurenum = g_MpScenarioOverviews[setup->scenario].unlockfeature; + s32 featurenum = g_MpScenarioOverviews[setup->scenario].requirefeature; if (featurenum) { index = mpForceUnlockFeature(featurenum, array, index, len); @@ -1330,7 +1330,7 @@ void mpForceUnlockConfigFeatures(struct mpconfig *config, u8 *array, s32 len, s3 } else if (challengeindex >= 20) { index = mpForceUnlockFeature(MPFEATURE_STAGE_CARPARK, array, index, len); } else if (challengeindex >= 15) { - index = mpForceUnlockFeature(MPFEATURE_4D, array, index, len); + index = mpForceUnlockFeature(MPFEATURE_SCENARIO_PAC, array, index, len); } if (challengeindex >= 10) { @@ -1342,7 +1342,7 @@ void mpForceUnlockConfigFeatures(struct mpconfig *config, u8 *array, s32 len, s3 } if (challengeindex >= 15) { - index = mpForceUnlockFeature(MPFEATURE_4D, array, index, len); + index = mpForceUnlockFeature(MPFEATURE_SCENARIO_PAC, array, index, len); } if (challengeindex >= 20) { @@ -1623,7 +1623,7 @@ bool mpIsFeatureUnlockedByPlayer(u32 numplayers, s32 featurenum) return (g_MpFeaturesUnlocked[featurenum] & (2 << numplayers)) != 0; } -bool func0f19c96c(s32 featurenum) +bool mpIsFeatureUnlockedByDefault(s32 featurenum) { if (featurenum) { return false; diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 97a2a2b09..2e0fcb3a6 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -3993,26 +3993,26 @@ struct mphead g_MpBeauHeads[NUM_MPBEAUHEADS] = { struct mphead g_MpHeads[75] = { // head, require feature { /*0x00*/ HEAD_DARK_COMBAT, 0 }, - { /*0x01*/ HEAD_DARK_FROCK, MPFEATURE_41 }, - { /*0x02*/ HEAD_DARKAQUA, MPFEATURE_45 }, + { /*0x01*/ HEAD_DARK_FROCK, MPFEATURE_CHR_CI }, + { /*0x02*/ HEAD_DARKAQUA, MPFEATURE_CHR_PELAGIC }, { /*0x03*/ HEAD_DARK_SNOW, MPFEATURE_4A }, - { /*0x04*/ HEAD_ELVIS, MPFEATURE_3D }, - { /*0x05*/ HEAD_ELVIS_GOGS, MPFEATURE_3D }, + { /*0x04*/ HEAD_ELVIS, MPFEATURE_CHR_ELVIS }, + { /*0x05*/ HEAD_ELVIS_GOGS, MPFEATURE_CHR_ELVIS }, { /*0x06*/ HEAD_CARRINGTON, 0 }, - { /*0x07*/ HEAD_MRBLONDE, MPFEATURE_38 }, + { /*0x07*/ HEAD_MRBLONDE, MPFEATURE_CHR_MRBLONDE }, { /*0x08*/ HEAD_CASSANDRA, 0 }, - { /*0x09*/ HEAD_TRENT, MPFEATURE_35 }, - { /*0x0a*/ HEAD_JONATHAN, MPFEATURE_3A }, + { /*0x09*/ HEAD_TRENT, MPFEATURE_CHR_TRENT }, + { /*0x0a*/ HEAD_JONATHAN, MPFEATURE_CHR_INFILTRATION }, { /*0x0b*/ HEAD_VD, 0 }, - { /*0x0c*/ HEAD_PRESIDENT, MPFEATURE_41 }, + { /*0x0c*/ HEAD_PRESIDENT, MPFEATURE_CHR_CI }, { /*0x0d*/ HEAD_DDSHOCK, 0 }, - { /*0x0e*/ HEAD_BIOTECH, MPFEATURE_3C }, - { /*0x0f*/ HEAD_DDSNIPER, MPFEATURE_34 }, - { /*0x10*/ HEAD_A51FACEPLATE, MPFEATURE_3A }, + { /*0x0e*/ HEAD_BIOTECH, MPFEATURE_CHR_BIOTECH }, + { /*0x0f*/ HEAD_DDSNIPER, MPFEATURE_CHR_VILLACHRS }, + { /*0x10*/ HEAD_A51FACEPLATE, MPFEATURE_CHR_INFILTRATION }, { /*0x11*/ HEAD_SECRETARY, 0 }, - { /*0x12*/ HEAD_FEM_GUARD, MPFEATURE_32 }, - { /*0x13*/ HEAD_FEM_GUARD2, MPFEATURE_32 }, - { /*0x14*/ HEAD_MAIAN_S, MPFEATURE_3D }, + { /*0x12*/ HEAD_FEM_GUARD, MPFEATURE_CHR_FEMGUARD }, + { /*0x13*/ HEAD_FEM_GUARD2, MPFEATURE_CHR_FEMGUARD }, + { /*0x14*/ HEAD_MAIAN_S, MPFEATURE_CHR_ELVIS }, { /*0x15*/ HEAD_JON, 0 }, { /*0x16*/ HEAD_BEAU1, 0 }, { /*0x17*/ HEAD_ROSS, 0 }, @@ -4106,62 +4106,62 @@ struct botprofile g_BotProfiles[] = { struct mpbody g_MpBodies[NUM_MPBODIES] = { // global body ID, name, head, require feature /*0x00*/ { BODY_DARK_COMBAT, L_OPTIONS_016, HEAD_DARK_COMBAT, 0 }, - /*0x01*/ { BODY_DARK_TRENCH, L_OPTIONS_017, HEAD_DARK_COMBAT, MPFEATURE_46 }, - /*0x02*/ { BODY_DARK_FROCK, L_OPTIONS_018, HEAD_DARK_FROCK, MPFEATURE_41 }, - /*0x03*/ { BODY_DARK_RIPPED, L_OPTIONS_019, HEAD_DARK_FROCK, MPFEATURE_41 }, - /*0x04*/ { BODY_DARK_AF1, L_OPTIONS_020, 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_021, HEAD_DARKAQUA, MPFEATURE_45 }, - /*0x08*/ { BODY_DARKAQUALUNG, L_OPTIONS_022, HEAD_DARKAQUA, MPFEATURE_45 }, + /*0x01*/ { BODY_DARK_TRENCH, L_OPTIONS_017, HEAD_DARK_COMBAT, MPFEATURE_CHR_JOTRENCH }, + /*0x02*/ { BODY_DARK_FROCK, L_OPTIONS_018, HEAD_DARK_FROCK, MPFEATURE_CHR_CI }, + /*0x03*/ { BODY_DARK_RIPPED, L_OPTIONS_019, HEAD_DARK_FROCK, MPFEATURE_CHR_CI }, + /*0x04*/ { BODY_DARK_AF1, L_OPTIONS_020, HEAD_DARK_COMBAT, MPFEATURE_CHR_AF1 }, + /*0x05*/ { BODY_DARK_LEATHER, L_MPWEAPONS_156, HEAD_DARK_COMBAT, MPFEATURE_CHR_G5 }, + /*0x06*/ { BODY_DARK_NEGOTIATOR, L_MPWEAPONS_157, HEAD_DARK_COMBAT, MPFEATURE_CHR_VILLACHRS }, + /*0x07*/ { BODY_DARKWET, L_OPTIONS_021, HEAD_DARKAQUA, MPFEATURE_CHR_PELAGIC }, + /*0x08*/ { BODY_DARKAQUALUNG, L_OPTIONS_022, HEAD_DARKAQUA, MPFEATURE_CHR_PELAGIC }, /*0x09*/ { BODY_DARKSNOW, L_OPTIONS_023, HEAD_DARK_SNOW, MPFEATURE_4A }, - /*0x0a*/ { BODY_DARKLAB, L_OPTIONS_024, HEAD_DARK_COMBAT, MPFEATURE_3A }, - /*0x0b*/ { BODY_THEKING, L_OPTIONS_025, HEAD_ELVIS, MPFEATURE_3D }, - /*0x0c*/ { BODY_ELVIS1, L_OPTIONS_026, HEAD_ELVIS, MPFEATURE_3D }, - /*0x0d*/ { BODY_ELVISWAISTCOAT, L_MPWEAPONS_158, HEAD_ELVIS, MPFEATURE_3D }, + /*0x0a*/ { BODY_DARKLAB, L_OPTIONS_024, HEAD_DARK_COMBAT, MPFEATURE_CHR_INFILTRATION }, + /*0x0b*/ { BODY_THEKING, L_OPTIONS_025, HEAD_ELVIS, MPFEATURE_CHR_ELVIS }, + /*0x0c*/ { BODY_ELVIS1, L_OPTIONS_026, HEAD_ELVIS, MPFEATURE_CHR_ELVIS }, + /*0x0d*/ { BODY_ELVISWAISTCOAT, L_MPWEAPONS_158, HEAD_ELVIS, MPFEATURE_CHR_ELVIS }, /*0x0e*/ { BODY_CARRINGTON, L_OPTIONS_027, HEAD_CARRINGTON, 0 }, - /*0x0f*/ { BODY_CARREVENINGSUIT, L_OPTIONS_028, HEAD_CARRINGTON, MPFEATURE_41 }, - /*0x10*/ { BODY_MRBLONDE, L_OPTIONS_029, HEAD_MRBLONDE, MPFEATURE_38 }, + /*0x0f*/ { BODY_CARREVENINGSUIT, L_OPTIONS_028, HEAD_CARRINGTON, MPFEATURE_CHR_CI }, + /*0x10*/ { BODY_MRBLONDE, L_OPTIONS_029, HEAD_MRBLONDE, MPFEATURE_CHR_MRBLONDE }, /*0x11*/ { BODY_CASSANDRA, L_OPTIONS_030, HEAD_CASSANDRA, 0 }, - /*0x12*/ { BODY_TRENT, L_OPTIONS_031, HEAD_TRENT, MPFEATURE_35 }, + /*0x12*/ { BODY_TRENT, L_OPTIONS_031, HEAD_TRENT, MPFEATURE_CHR_TRENT }, /*0x13*/ { BODY_JONATHAN, L_OPTIONS_032, HEAD_JONATHAN, MPFEATURE_4C }, /*0x14*/ { BODY_CILABTECH, L_OPTIONS_033, 1000, 0 }, /*0x15*/ { BODY_CIFEMTECH, L_OPTIONS_034, 1000, 0 }, /*0x16*/ { BODY_CISOLDIER, L_OPTIONS_035, 1000, 0 }, /*0x17*/ { BODY_DDSHOCK, L_OPTIONS_036, HEAD_DDSHOCK, 0 }, - /*0x18*/ { BODY_FEM_GUARD, L_OPTIONS_037, 1000, MPFEATURE_32 }, + /*0x18*/ { BODY_FEM_GUARD, L_OPTIONS_037, 1000, MPFEATURE_CHR_FEMGUARD }, /*0x19*/ { BODY_DD_SECGUARD, L_OPTIONS_038, 1000, 0 }, /*0x1a*/ { BODY_DD_GUARD, L_OPTIONS_039, 1000, 0 }, /*0x1b*/ { BODY_DD_SHOCK_INF, L_OPTIONS_040, 1000, 0 }, /*0x1c*/ { BODY_SECRETARY, L_OPTIONS_041, 1000, 0 }, - /*0x1d*/ { BODY_OFFICEWORKER, L_OPTIONS_042, 1000, MPFEATURE_33 }, - /*0x1e*/ { BODY_OFFICEWORKER2, L_OPTIONS_043, 1000, MPFEATURE_33 }, - /*0x1f*/ { BODY_NEGOTIATOR, L_OPTIONS_044, 1000, MPFEATURE_34 }, - /*0x20*/ { BODY_DDSNIPER, L_OPTIONS_045, HEAD_DDSNIPER, MPFEATURE_34 }, - /*0x21*/ { BODY_G5_GUARD, L_OPTIONS_046, 1000, MPFEATURE_37 }, - /*0x22*/ { BODY_G5_SWAT_GUARD, L_OPTIONS_047, 1000, MPFEATURE_37 }, - /*0x23*/ { BODY_CIAGUY, L_OPTIONS_048, 1000, MPFEATURE_39 }, - /*0x24*/ { BODY_FBIGUY, L_OPTIONS_049, 1000, MPFEATURE_39 }, - /*0x25*/ { BODY_AREA51GUARD, L_OPTIONS_050, 1000, MPFEATURE_3A }, - /*0x26*/ { BODY_A51TROOPER, L_OPTIONS_051, 1000, MPFEATURE_3A }, - /*0x27*/ { BODY_A51AIRMAN, L_OPTIONS_052, 1000, MPFEATURE_3A }, - /*0x28*/ { BODY_OVERALL, L_OPTIONS_053, 1000, MPFEATURE_3A }, - /*0x29*/ { BODY_STRIPES, L_OPTIONS_054, 1000, MPFEATURE_44 }, - /*0x2a*/ { BODY_LABTECH, L_OPTIONS_055, 1000, MPFEATURE_3B }, - /*0x2b*/ { BODY_FEMLABTECH, L_OPTIONS_056, 1000, MPFEATURE_3B }, - /*0x2c*/ { BODY_DD_LABTECH, L_OPTIONS_057, 1000, MPFEATURE_3B }, - /*0x2d*/ { BODY_BIOTECH, L_OPTIONS_058, HEAD_BIOTECH, MPFEATURE_3C }, - /*0x2e*/ { BODY_ALASKAN_GUARD, L_OPTIONS_059, 1000, MPFEATURE_3E }, - /*0x2f*/ { BODY_PILOTAF1, L_OPTIONS_060, 1000, MPFEATURE_3F }, - /*0x30*/ { BODY_STEWARD, L_OPTIONS_061, 1000, MPFEATURE_3F }, - /*0x31*/ { BODY_STEWARDESS, L_OPTIONS_062, 1000, MPFEATURE_3F }, - /*0x32*/ { BODY_STEWARDESS_COAT, L_OPTIONS_063, 1000, MPFEATURE_3F }, - /*0x33*/ { BODY_PRESIDENT, L_OPTIONS_064, HEAD_PRESIDENT, MPFEATURE_41 }, - /*0x34*/ { BODY_NSA_LACKEY, L_OPTIONS_065, 1000, MPFEATURE_36 }, - /*0x35*/ { BODY_PRES_SECURITY, L_OPTIONS_066, 1000, MPFEATURE_43 }, - /*0x36*/ { BODY_PRESIDENT_CLONE2, L_OPTIONS_067, HEAD_PRESIDENT, MPFEATURE_42 }, - /*0x37*/ { BODY_PELAGIC_GUARD, L_OPTIONS_068, 1000, MPFEATURE_45 }, - /*0x38*/ { BODY_MAIAN_SOLDIER, L_OPTIONS_069, HEAD_MAIAN_S, MPFEATURE_3D }, + /*0x1d*/ { BODY_OFFICEWORKER, L_OPTIONS_042, 1000, MPFEATURE_CHR_OFFICEWORKER }, + /*0x1e*/ { BODY_OFFICEWORKER2, L_OPTIONS_043, 1000, MPFEATURE_CHR_OFFICEWORKER }, + /*0x1f*/ { BODY_NEGOTIATOR, L_OPTIONS_044, 1000, MPFEATURE_CHR_VILLACHRS }, + /*0x20*/ { BODY_DDSNIPER, L_OPTIONS_045, HEAD_DDSNIPER, MPFEATURE_CHR_VILLACHRS }, + /*0x21*/ { BODY_G5_GUARD, L_OPTIONS_046, 1000, MPFEATURE_CHR_G5 }, + /*0x22*/ { BODY_G5_SWAT_GUARD, L_OPTIONS_047, 1000, MPFEATURE_CHR_G5 }, + /*0x23*/ { BODY_CIAGUY, L_OPTIONS_048, 1000, MPFEATURE_CHR_CIAFBI }, + /*0x24*/ { BODY_FBIGUY, L_OPTIONS_049, 1000, MPFEATURE_CHR_CIAFBI }, + /*0x25*/ { BODY_AREA51GUARD, L_OPTIONS_050, 1000, MPFEATURE_CHR_INFILTRATION }, + /*0x26*/ { BODY_A51TROOPER, L_OPTIONS_051, 1000, MPFEATURE_CHR_INFILTRATION }, + /*0x27*/ { BODY_A51AIRMAN, L_OPTIONS_052, 1000, MPFEATURE_CHR_INFILTRATION }, + /*0x28*/ { BODY_OVERALL, L_OPTIONS_053, 1000, MPFEATURE_CHR_INFILTRATION }, + /*0x29*/ { BODY_STRIPES, L_OPTIONS_054, 1000, MPFEATURE_CHR_STRIPES }, + /*0x2a*/ { BODY_LABTECH, L_OPTIONS_055, 1000, MPFEATURE_CHR_LABTECH }, + /*0x2b*/ { BODY_FEMLABTECH, L_OPTIONS_056, 1000, MPFEATURE_CHR_LABTECH }, + /*0x2c*/ { BODY_DD_LABTECH, L_OPTIONS_057, 1000, MPFEATURE_CHR_LABTECH }, + /*0x2d*/ { BODY_BIOTECH, L_OPTIONS_058, HEAD_BIOTECH, MPFEATURE_CHR_BIOTECH }, + /*0x2e*/ { BODY_ALASKAN_GUARD, L_OPTIONS_059, 1000, MPFEATURE_CHR_ALASKANGUARD }, + /*0x2f*/ { BODY_PILOTAF1, L_OPTIONS_060, 1000, MPFEATURE_CHR_AF1 }, + /*0x30*/ { BODY_STEWARD, L_OPTIONS_061, 1000, MPFEATURE_CHR_AF1 }, + /*0x31*/ { BODY_STEWARDESS, L_OPTIONS_062, 1000, MPFEATURE_CHR_AF1 }, + /*0x32*/ { BODY_STEWARDESS_COAT, L_OPTIONS_063, 1000, MPFEATURE_CHR_AF1 }, + /*0x33*/ { BODY_PRESIDENT, L_OPTIONS_064, HEAD_PRESIDENT, MPFEATURE_CHR_CI }, + /*0x34*/ { BODY_NSA_LACKEY, L_OPTIONS_065, 1000, MPFEATURE_CHR_NSALACKEY }, + /*0x35*/ { BODY_PRES_SECURITY, L_OPTIONS_066, 1000, MPFEATURE_CHR_PRESSECURITY }, + /*0x36*/ { BODY_PRESIDENT_CLONE2, L_OPTIONS_067, HEAD_PRESIDENT, MPFEATURE_CHR_PRESCLONE }, + /*0x37*/ { BODY_PELAGIC_GUARD, L_OPTIONS_068, 1000, MPFEATURE_CHR_PELAGIC }, + /*0x38*/ { BODY_MAIAN_SOLDIER, L_OPTIONS_069, HEAD_MAIAN_S, MPFEATURE_CHR_ELVIS }, /*0x39*/ { BODY_CONNERY, L_OPTIONS_070, 1000, MPFEATURE_8BOTS }, /*0x3a*/ { BODY_MOORE, L_OPTIONS_070, 1000, MPFEATURE_8BOTS }, /*0x3b*/ { BODY_DALTON, L_OPTIONS_070, 1000, MPFEATURE_8BOTS }, diff --git a/src/game/mplayer/scenarios.c b/src/game/mplayer/scenarios.c index 333e1a823..d5cf03f29 100644 --- a/src/game/mplayer/scenarios.c +++ b/src/game/mplayer/scenarios.c @@ -5695,262 +5695,113 @@ struct mpscenario g_MpScenarios[6] = { }; struct mpscenariooverview g_MpScenarioOverviews[] = { - // Full name, short name, unlock flags? - { L_MPMENU_246, L_MPMENU_253, 0x00, false }, // "Combat", "Combat" - { L_MPMENU_247, L_MPMENU_254, 0x20, false }, // "Hold the Briefcase", "Briefcase" - { L_MPMENU_248, L_MPMENU_255, 0x4e, false }, // "Hacker Central", "Hacker" - { L_MPMENU_249, L_MPMENU_256, 0x4d, false }, // "Pop a Cap", "Pop" - { L_MPMENU_250, L_MPMENU_257, 0x1f, true }, // "King of the Hill", "Hill" - { L_MPMENU_251, L_MPMENU_258, 0x21, true }, // "Capture the Case", "Capture" + // Full name, short name, require feature, team only + { L_MPMENU_246, L_MPMENU_253, 0, false }, // "Combat", "Combat" + { L_MPMENU_247, L_MPMENU_254, MPFEATURE_SCENARIO_HTB, false }, // "Hold the Briefcase", "Briefcase" + { L_MPMENU_248, L_MPMENU_255, MPFEATURE_SCENARIO_HTM, false }, // "Hacker Central", "Hacker" + { L_MPMENU_249, L_MPMENU_256, MPFEATURE_SCENARIO_PAC, false }, // "Pop a Cap", "Pop" + { L_MPMENU_250, L_MPMENU_257, MPFEATURE_SCENARIO_KOH, true }, // "King of the Hill", "Hill" + { L_MPMENU_251, L_MPMENU_258, MPFEATURE_SCENARIO_CTC, true }, // "Capture the Case", "Capture" }; -u32 var8008716c = 0x00000000; -u32 var80087170 = 0x50f40000; // "Free for All!" -u32 var80087174 = 0x00000004; -u32 var80087178 = 0x50f50000; // "-Teamwork-" +struct scenariogroup { + s32 startindex; + u16 textid; +}; -GLOBAL_ASM( -glabel menuhandler00185068 -.late_rodata -glabel var7f1b8964 -.word menuhandler00185068+0xa8 # f185110 -glabel var7f1b8968 -.word menuhandler00185068+0x224 # f18528c -glabel var7f1b896c -.word menuhandler00185068+0xf4 # f18515c -glabel var7f1b8970 -.word menuhandler00185068+0x260 # f1852c8 -glabel var7f1b8974 -.word menuhandler00185068+0x27c # f1852e4 -glabel var7f1b8978 -.word menuhandler00185068+0x15c # f1851c4 -glabel var7f1b897c -.word menuhandler00185068+0x1c4 # f18522c -.text -/* f185068: 27bdffb0 */ addiu $sp,$sp,-80 -/* f18506c: 3c0e8008 */ lui $t6,%hi(var8008716c) -/* f185070: afbf002c */ sw $ra,0x2c($sp) -/* f185074: afb50028 */ sw $s5,0x28($sp) -/* f185078: afb40024 */ sw $s4,0x24($sp) -/* f18507c: afb30020 */ sw $s3,0x20($sp) -/* f185080: afb2001c */ sw $s2,0x1c($sp) -/* f185084: afb10018 */ sw $s1,0x18($sp) -/* f185088: afb00014 */ sw $s0,0x14($sp) -/* f18508c: 25ce716c */ addiu $t6,$t6,%lo(var8008716c) -/* f185090: 8dc10000 */ lw $at,0x0($t6) -/* f185094: 27b30040 */ addiu $s3,$sp,0x40 -/* f185098: 00c0a825 */ or $s5,$a2,$zero -/* f18509c: ae610000 */ sw $at,0x0($s3) -/* f1850a0: 8dd90004 */ lw $t9,0x4($t6) -/* f1850a4: 00009025 */ or $s2,$zero,$zero -/* f1850a8: 24140001 */ addiu $s4,$zero,0x1 -/* f1850ac: ae790004 */ sw $t9,0x4($s3) -/* f1850b0: 8dc10008 */ lw $at,0x8($t6) -/* f1850b4: 3c02800a */ lui $v0,%hi(g_Vars+0x4b0) -/* f1850b8: 2489ffff */ addiu $t1,$a0,-1 -/* f1850bc: ae610008 */ sw $at,0x8($s3) -/* f1850c0: 8dd9000c */ lw $t9,0xc($t6) -/* f1850c4: ae79000c */ sw $t9,0xc($s3) -/* f1850c8: 90a80001 */ lbu $t0,0x1($a1) -/* f1850cc: 51000009 */ beqzl $t0,.L0f1850f4 -/* f1850d0: 2d210007 */ sltiu $at,$t1,0x7 -/* f1850d4: 8c42a470 */ lw $v0,%lo(g_Vars+0x4b0)($v0) -/* f1850d8: 24010001 */ addiu $at,$zero,0x1 -/* f1850dc: 50400004 */ beqzl $v0,.L0f1850f0 -/* f1850e0: 0000a025 */ or $s4,$zero,$zero -/* f1850e4: 54410003 */ bnel $v0,$at,.L0f1850f4 -/* f1850e8: 2d210007 */ sltiu $at,$t1,0x7 -/* f1850ec: 0000a025 */ or $s4,$zero,$zero -.L0f1850f0: -/* f1850f0: 2d210007 */ sltiu $at,$t1,0x7 -.L0f1850f4: -/* f1850f4: 10200098 */ beqz $at,.L0f185358 -/* f1850f8: 00094880 */ sll $t1,$t1,0x2 -/* f1850fc: 3c017f1c */ lui $at,%hi(var7f1b8964) -/* f185100: 00290821 */ addu $at,$at,$t1 -/* f185104: 8c298964 */ lw $t1,%lo(var7f1b8964)($at) -/* f185108: 01200008 */ jr $t1 -/* f18510c: 00000000 */ nop -/* f185110: 3c108008 */ lui $s0,%hi(g_MpScenarioOverviews) -/* f185114: 3c118008 */ lui $s1,%hi(var8008716c) -/* f185118: 2631716c */ addiu $s1,$s1,%lo(var8008716c) -/* f18511c: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews) -.L0f185120: -/* f185120: 0fc67244 */ jal mpIsFeatureUnlocked -/* f185124: 92040004 */ lbu $a0,0x4($s0) -/* f185128: 50400008 */ beqzl $v0,.L0f18514c -/* f18512c: 26100006 */ addiu $s0,$s0,0x6 -/* f185130: 56800005 */ bnezl $s4,.L0f185148 -/* f185134: 26520001 */ addiu $s2,$s2,0x1 -/* f185138: 920a0005 */ lbu $t2,0x5($s0) -/* f18513c: 55400003 */ bnezl $t2,.L0f18514c -/* f185140: 26100006 */ addiu $s0,$s0,0x6 -/* f185144: 26520001 */ addiu $s2,$s2,0x1 -.L0f185148: -/* f185148: 26100006 */ addiu $s0,$s0,0x6 -.L0f18514c: -/* f18514c: 1611fff4 */ bne $s0,$s1,.L0f185120 -/* f185150: 00000000 */ nop -/* f185154: 10000080 */ b .L0f185358 -/* f185158: aeb20000 */ sw $s2,0x0($s5) -/* f18515c: 3c108008 */ lui $s0,%hi(g_MpScenarioOverviews) -/* f185160: 3c118008 */ lui $s1,%hi(var8008716c) -/* f185164: 2631716c */ addiu $s1,$s1,%lo(var8008716c) -/* f185168: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews) -.L0f18516c: -/* f18516c: 0fc67244 */ jal mpIsFeatureUnlocked -/* f185170: 92040004 */ lbu $a0,0x4($s0) -/* f185174: 5040000f */ beqzl $v0,.L0f1851b4 -/* f185178: 26100006 */ addiu $s0,$s0,0x6 -/* f18517c: 56800005 */ bnezl $s4,.L0f185194 -/* f185180: 8eac0000 */ lw $t4,0x0($s5) -/* f185184: 920b0005 */ lbu $t3,0x5($s0) -/* f185188: 5560000a */ bnezl $t3,.L0f1851b4 -/* f18518c: 26100006 */ addiu $s0,$s0,0x6 -/* f185190: 8eac0000 */ lw $t4,0x0($s5) -.L0f185194: -/* f185194: 564c0006 */ bnel $s2,$t4,.L0f1851b0 -/* f185198: 26520001 */ addiu $s2,$s2,0x1 -/* f18519c: 0fc5b9f1 */ jal langGet -/* f1851a0: 96040000 */ lhu $a0,0x0($s0) -/* f1851a4: 1000006e */ b .L0f185360 -/* f1851a8: 8fbf002c */ lw $ra,0x2c($sp) -/* f1851ac: 26520001 */ addiu $s2,$s2,0x1 -.L0f1851b0: -/* f1851b0: 26100006 */ addiu $s0,$s0,0x6 -.L0f1851b4: -/* f1851b4: 1611ffed */ bne $s0,$s1,.L0f18516c -/* f1851b8: 00000000 */ nop -/* f1851bc: 10000067 */ b .L0f18535c -/* f1851c0: 00001025 */ or $v0,$zero,$zero -/* f1851c4: 3c108008 */ lui $s0,%hi(g_MpScenarioOverviews) -/* f1851c8: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews) -/* f1851cc: 00008825 */ or $s1,$zero,$zero -/* f1851d0: 24130006 */ addiu $s3,$zero,0x6 -.L0f1851d4: -/* f1851d4: 0fc67244 */ jal mpIsFeatureUnlocked -/* f1851d8: 92040004 */ lbu $a0,0x4($s0) -/* f1851dc: 5040000d */ beqzl $v0,.L0f185214 -/* f1851e0: 26310001 */ addiu $s1,$s1,0x1 -/* f1851e4: 56800005 */ bnezl $s4,.L0f1851fc -/* f1851e8: 8eb80000 */ lw $t8,0x0($s5) -/* f1851ec: 920d0005 */ lbu $t5,0x5($s0) -/* f1851f0: 55a00008 */ bnezl $t5,.L0f185214 -/* f1851f4: 26310001 */ addiu $s1,$s1,0x1 -/* f1851f8: 8eb80000 */ lw $t8,0x0($s5) -.L0f1851fc: -/* f1851fc: 16580003 */ bne $s2,$t8,.L0f18520c -/* f185200: 3c01800b */ lui $at,%hi(g_MpSetup+0x10) -/* f185204: 10000005 */ b .L0f18521c -/* f185208: a031cb98 */ sb $s1,%lo(g_MpSetup+0x10)($at) -.L0f18520c: -/* f18520c: 26520001 */ addiu $s2,$s2,0x1 -/* f185210: 26310001 */ addiu $s1,$s1,0x1 -.L0f185214: -/* f185214: 1633ffef */ bne $s1,$s3,.L0f1851d4 -/* f185218: 26100006 */ addiu $s0,$s0,0x6 -.L0f18521c: -/* f18521c: 0fc61521 */ jal scenarioInit -/* f185220: 00000000 */ nop -/* f185224: 1000004d */ b .L0f18535c -/* f185228: 00001025 */ or $v0,$zero,$zero -/* f18522c: 3c108008 */ lui $s0,%hi(g_MpScenarioOverviews) -/* f185230: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews) -/* f185234: 00008825 */ or $s1,$zero,$zero -/* f185238: 24130006 */ addiu $s3,$zero,0x6 -.L0f18523c: -/* f18523c: 0fc67244 */ jal mpIsFeatureUnlocked -/* f185240: 92040004 */ lbu $a0,0x4($s0) -/* f185244: 5040000d */ beqzl $v0,.L0f18527c -/* f185248: 26310001 */ addiu $s1,$s1,0x1 -/* f18524c: 16800004 */ bnez $s4,.L0f185260 -/* f185250: 3c0e800b */ lui $t6,%hi(g_MpSetup+0x10) -/* f185254: 920f0005 */ lbu $t7,0x5($s0) -/* f185258: 55e00008 */ bnezl $t7,.L0f18527c -/* f18525c: 26310001 */ addiu $s1,$s1,0x1 -.L0f185260: -/* f185260: 91cecb98 */ lbu $t6,%lo(g_MpSetup+0x10)($t6) -/* f185264: 562e0004 */ bnel $s1,$t6,.L0f185278 -/* f185268: 26520001 */ addiu $s2,$s2,0x1 -/* f18526c: 1000003a */ b .L0f185358 -/* f185270: aeb20000 */ sw $s2,0x0($s5) -/* f185274: 26520001 */ addiu $s2,$s2,0x1 -.L0f185278: -/* f185278: 26310001 */ addiu $s1,$s1,0x1 -.L0f18527c: -/* f18527c: 1633ffef */ bne $s1,$s3,.L0f18523c -/* f185280: 26100006 */ addiu $s0,$s0,0x6 -/* f185284: 10000035 */ b .L0f18535c -/* f185288: 00001025 */ or $v0,$zero,$zero -/* f18528c: 24190002 */ addiu $t9,$zero,0x2 -/* f185290: 12800009 */ beqz $s4,.L0f1852b8 -/* f185294: aeb90000 */ sw $t9,0x0($s5) -/* f185298: 0fc67244 */ jal mpIsFeatureUnlocked -/* f18529c: 2404001f */ addiu $a0,$zero,0x1f -/* f1852a0: 5440002e */ bnezl $v0,.L0f18535c -/* f1852a4: 00001025 */ or $v0,$zero,$zero -/* f1852a8: 0fc67244 */ jal mpIsFeatureUnlocked -/* f1852ac: 24040021 */ addiu $a0,$zero,0x21 -/* f1852b0: 5440002a */ bnezl $v0,.L0f18535c -/* f1852b4: 00001025 */ or $v0,$zero,$zero -.L0f1852b8: -/* f1852b8: 8ea80000 */ lw $t0,0x0($s5) -/* f1852bc: 2509ffff */ addiu $t1,$t0,-1 -/* f1852c0: 10000025 */ b .L0f185358 -/* f1852c4: aea90000 */ sw $t1,0x0($s5) -/* f1852c8: 8eaa0000 */ lw $t2,0x0($s5) -/* f1852cc: 000a58c0 */ sll $t3,$t2,0x3 -/* f1852d0: 026b6021 */ addu $t4,$s3,$t3 -/* f1852d4: 0fc5b9f1 */ jal langGet -/* f1852d8: 95840004 */ lhu $a0,0x4($t4) -/* f1852dc: 10000020 */ b .L0f185360 -/* f1852e0: 8fbf002c */ lw $ra,0x2c($sp) -/* f1852e4: 8ead0000 */ lw $t5,0x0($s5) -/* f1852e8: 3c108008 */ lui $s0,%hi(g_MpScenarioOverviews) -/* f1852ec: 26107148 */ addiu $s0,$s0,%lo(g_MpScenarioOverviews) -/* f1852f0: 000dc0c0 */ sll $t8,$t5,0x3 -/* f1852f4: 02787821 */ addu $t7,$s3,$t8 -/* f1852f8: 8dee0000 */ lw $t6,0x0($t7) -/* f1852fc: 00008825 */ or $s1,$zero,$zero -/* f185300: 59c00015 */ blezl $t6,.L0f185358 -/* f185304: aeb20008 */ sw $s2,0x8($s5) -.L0f185308: -/* f185308: 0fc67244 */ jal mpIsFeatureUnlocked -/* f18530c: 92040004 */ lbu $a0,0x4($s0) -/* f185310: 50400008 */ beqzl $v0,.L0f185334 -/* f185314: 8ea80000 */ lw $t0,0x0($s5) -/* f185318: 56800005 */ bnezl $s4,.L0f185330 -/* f18531c: 26520001 */ addiu $s2,$s2,0x1 -/* f185320: 92190005 */ lbu $t9,0x5($s0) -/* f185324: 57200003 */ bnezl $t9,.L0f185334 -/* f185328: 8ea80000 */ lw $t0,0x0($s5) -/* f18532c: 26520001 */ addiu $s2,$s2,0x1 -.L0f185330: -/* f185330: 8ea80000 */ lw $t0,0x0($s5) -.L0f185334: -/* f185334: 26310001 */ addiu $s1,$s1,0x1 -/* f185338: 26100006 */ addiu $s0,$s0,0x6 -/* f18533c: 000848c0 */ sll $t1,$t0,0x3 -/* f185340: 02695021 */ addu $t2,$s3,$t1 -/* f185344: 8d4b0000 */ lw $t3,0x0($t2) -/* f185348: 022b082a */ slt $at,$s1,$t3 -/* f18534c: 1420ffee */ bnez $at,.L0f185308 -/* f185350: 00000000 */ nop -/* f185354: aeb20008 */ sw $s2,0x8($s5) -.L0f185358: -/* f185358: 00001025 */ or $v0,$zero,$zero -.L0f18535c: -/* f18535c: 8fbf002c */ lw $ra,0x2c($sp) -.L0f185360: -/* f185360: 8fb00014 */ lw $s0,0x14($sp) -/* f185364: 8fb10018 */ lw $s1,0x18($sp) -/* f185368: 8fb2001c */ lw $s2,0x1c($sp) -/* f18536c: 8fb30020 */ lw $s3,0x20($sp) -/* f185370: 8fb40024 */ lw $s4,0x24($sp) -/* f185374: 8fb50028 */ lw $s5,0x28($sp) -/* f185378: 03e00008 */ jr $ra -/* f18537c: 27bd0050 */ addiu $sp,$sp,0x50 -); +s32 scenarioScenarioMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data) +{ + struct scenariogroup groups[] = { + { 0, L_MPMENU_244 }, // "Free for All!" + { 4, L_MPMENU_245 }, // "-Teamwork-" + }; + + s32 i; + s32 count = 0; + bool teamgame = true; + + if (item->param) { + if (g_Vars.mpquickteam == MPQUICKTEAM_PLAYERSONLY || g_Vars.mpquickteam == MPQUICKTEAM_PLAYERSANDSIMS) { + teamgame = false; + } + } + + switch (operation) { + case MENUOP_GETOPTIONCOUNT: + for (i = 0; i < ARRAYCOUNT(g_MpScenarioOverviews); i++) { + if (mpIsFeatureUnlocked(g_MpScenarioOverviews[i].requirefeature) + && (teamgame || g_MpScenarioOverviews[i].teamonly == false)) { + count++; + } + } + + data->list.value = count; + break; + case MENUOP_GETOPTIONTEXT: + for (i = 0; i < ARRAYCOUNT(g_MpScenarioOverviews); i++) { + if (mpIsFeatureUnlocked(g_MpScenarioOverviews[i].requirefeature) + && (teamgame || g_MpScenarioOverviews[i].teamonly == false)) { + if (count == data->list.value) { + return (s32)langGet(g_MpScenarioOverviews[i].name); + } + + count++; + } + } + + break; + case MENUOP_SET: + for (i = 0; i < ARRAYCOUNT(g_MpScenarioOverviews); i++) { + if (mpIsFeatureUnlocked(g_MpScenarioOverviews[i].requirefeature) + && (teamgame || g_MpScenarioOverviews[i].teamonly == false)) { + if (count == data->list.value) { + g_MpSetup.scenario = i; + break; + } + + count++; + } + } + + scenarioInit(); + break; + case MENUOP_GETOPTIONVALUE: + for (i = 0; i < ARRAYCOUNT(g_MpScenarioOverviews); i++) { + if (mpIsFeatureUnlocked(g_MpScenarioOverviews[i].requirefeature) + && (teamgame || g_MpScenarioOverviews[i].teamonly == false)) { + if (i == g_MpSetup.scenario) { + data->list.value = count; + break; + } + + count++; + } + } + + break; + case MENUOP_GETOPTGROUPCOUNT: + data->list.value = 2; + + if (!teamgame || (!mpIsFeatureUnlocked(MPFEATURE_SCENARIO_KOH) && !mpIsFeatureUnlocked(MPFEATURE_SCENARIO_CTC))) { + data->list.value--; + } + break; + case MENUOP_GETOPTGROUPTEXT: + return (s32)langGet(groups[data->list.value].textid); + case MENUOP_GETGROUPSTARTINDEX: + for (i = 0; i < groups[data->list.value].startindex; i++) { + if (mpIsFeatureUnlocked(g_MpScenarioOverviews[i].requirefeature) + && (teamgame || g_MpScenarioOverviews[i].teamonly == false)) { + count++; + } + } + + data->list.groupstartindex = count; + break; + } + + return 0; +} s32 menuhandlerMpOpenOptions(s32 operation, struct menuitem *item, union handlerdata *data) { @@ -6586,7 +6437,7 @@ void scenarioCallback38(s16 arg0, s32 *arg1, s32 *arg2, s32 *arg3) } struct menuitem g_MpScenarioMenuItems[] = { - { MENUITEMTYPE_LIST, 0, 0x00020040, 0x00000078, 0x0000004d, menuhandler00185068 }, + { MENUITEMTYPE_LIST, 0, 0x00020040, 0x00000078, 0x0000004d, scenarioScenarioMenuHandler }, { MENUITEMTYPE_END, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, }; @@ -6600,7 +6451,7 @@ struct menudialog g_MpScenarioMenuDialog = { }; struct menuitem g_MpQuickTeamScenarioMenuItems[] = { - { MENUITEMTYPE_LIST, 1, 0x00020040, 0x00000078, 0x0000004d, menuhandler00185068 }, + { MENUITEMTYPE_LIST, 1, 0x00020040, 0x00000078, 0x0000004d, scenarioScenarioMenuHandler }, { MENUITEMTYPE_END, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, }; diff --git a/src/include/constants.h b/src/include/constants.h index e1b3637e9..9ff7f6e59 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2501,9 +2501,9 @@ #define MPFEATURE_BOTDIFF_DARK 0x1c #define MPFEATURE_SLOWMOTION 0x1d #define MPFEATURE_ONEHITKILLS 0x1e -#define MPFEATURE_1F 0x1f -#define MPFEATURE_20 0x20 -#define MPFEATURE_21 0x21 +#define MPFEATURE_SCENARIO_KOH 0x1f +#define MPFEATURE_SCENARIO_HTB 0x20 +#define MPFEATURE_SCENARIO_CTC 0x21 #define MPFEATURE_22 0x22 #define MPFEATURE_STAGE_CARPARK 0x23 #define MPFEATURE_STAGE_COMPLEX 0x24 @@ -2520,35 +2520,35 @@ #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_CHR_FEMGUARD 0x32 +#define MPFEATURE_CHR_OFFICEWORKER 0x33 +#define MPFEATURE_CHR_VILLACHRS 0x34 +#define MPFEATURE_CHR_TRENT 0x35 +#define MPFEATURE_CHR_NSALACKEY 0x36 +#define MPFEATURE_CHR_G5 0x37 +#define MPFEATURE_CHR_MRBLONDE 0x38 +#define MPFEATURE_CHR_CIAFBI 0x39 +#define MPFEATURE_CHR_INFILTRATION 0x3a +#define MPFEATURE_CHR_LABTECH 0x3b +#define MPFEATURE_CHR_BIOTECH 0x3c +#define MPFEATURE_CHR_ELVIS 0x3d +#define MPFEATURE_CHR_ALASKANGUARD 0x3e +#define MPFEATURE_CHR_AF1 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_CHR_CI 0x41 +#define MPFEATURE_CHR_PRESCLONE 0x42 +#define MPFEATURE_CHR_PRESSECURITY 0x43 +#define MPFEATURE_CHR_STRIPES 0x44 +#define MPFEATURE_CHR_PELAGIC 0x45 +#define MPFEATURE_CHR_JOTRENCH 0x46 +#define MPFEATURE_CHR_JOSNOW 0x47 +#define MPFEATURE_CHR_JONATHAN 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_SCENARIO_PAC 0x4d +#define MPFEATURE_SCENARIO_HTM 0x4e #define MPFEATURE_WEAPON_LASER 0x4f #define MPHEAD_DARK_COMBAT 0x00 diff --git a/src/include/game/mplayer/setup.h b/src/include/game/mplayer/setup.h index f919c6168..6cedd1c67 100644 --- a/src/include/game/mplayer/setup.h +++ b/src/include/game/mplayer/setup.h @@ -103,7 +103,7 @@ bool scenarioPacRadar2(Gfx **gdl, struct prop *prop); s32 mpOptionsMenuDialog(s32 operation, struct menudialog *dialog, union handlerdata *data); char *mpMenuTextScenarioShortName(struct menuitem *item); char *mpMenuTextScenarioName(struct menuitem *item); -s32 menuhandler00185068(s32 operation, struct menuitem *item, union handlerdata *data); +s32 scenarioScenarioMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data); void mpCreateMatchStartHudmsgs(void); Gfx *scenarioRenderHud(Gfx *gdl); void scenarioCalculatePlayerScore(struct mpchrconfig *mpchr, s32 chrnum, s32 *arg2, s32 *arg3); diff --git a/src/include/types.h b/src/include/types.h index 2c058c7a4..257daf6a5 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -4690,8 +4690,8 @@ struct mpscenario { struct mpscenariooverview { u16 name; u16 shortname; - u8 unlockfeature; - u8 unk05; + u8 requirefeature; + u8 teamonly; }; struct mparena {