#include #include "constants.h" #include "game/camdraw.h" #include "game/title.h" #include "game/game_01b0a0.h" #include "game/bondgun.h" #include "game/game_0b0fd0.h" #include "game/player.h" #include "game/savebuffer.h" #include "game/menu.h" #include "game/playermgr.h" #include "game/game_1531a0.h" #include "game/lv.h" #include "game/music.h" #include "game/mplayer/setup.h" #include "game/mplayer/scenarios.h" #include "game/mpstats.h" #include "game/game_19aa80.h" #include "game/lang.h" #include "game/mplayer/mplayer.h" #include "game/pak/pak.h" #include "bss.h" #include "lib/args.h" #include "lib/vi.h" #include "lib/main.h" #include "lib/rng.h" #include "lib/lib_317f0.h" #include "data.h" #include "types.h" // bss struct chrdata *g_MpAllChrPtrs[MAX_MPCHRS]; struct mpchrconfig *g_MpAllChrConfigPtrs[MAX_MPCHRS]; s32 g_MpNumChrs; u32 var800ac534; struct mpbotconfig g_BotConfigsArray[MAX_BOTS]; u8 g_MpSimulantDifficultiesPerNumPlayers[MAX_BOTS][4]; struct mpplayerconfig g_PlayerConfigsArray[6]; u8 g_AmBotCommands[16]; struct mpsetup g_MpSetup; struct bossfile g_BossFile; u32 var800acc1c; struct mplockinfo g_MpLockInfo; struct modelfiledata *var800acc28[18]; // Forward declaractions struct mpweaponset g_MpWeaponSets[12]; s32 g_MpWeaponSetNum; #if VERSION >= VERSION_NTSC_1_0 const char var7f1b8a00[] = "||||||||||||| Starting game... players %d\n"; #endif s32 var80087260 = 0x00000000; bool g_MpEnableMusicSwitching = false; struct mpweapon g_MpWeapons[0x27] = { /*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_CALLISTO, 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_FARSIGHT, 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 }, }; /** * Converts the given value into a float on a curved scale from 0.1 to 10. * * value 0 will return 0.1 * value 127 will return 1 * value 255 will return 10 */ f32 mpHandicapToDamageScale(u8 value) { f32 tmp; if (value < 127) { return (value / 127.0f) * (value / 127.0f) * 0.9f + 0.1f; } if (value == 127) { return 1; } tmp = (value - 128) / 127.0f + 1; return tmp * tmp * 3 - 2; } void func0f187838(struct mpchrconfig *mpchr) { s32 i = 0; while (i < ARRAYCOUNT(mpchr->killcounts)) { mpchr->killcounts[i++] = 0; } mpchr->numdeaths = 0; mpchr->numpoints = 0; mpchr->unk40 = 0; } void mpStartMatch(void) { s32 i; s32 numplayers = 0; s32 stagenum; mpConfigureQuickTeamSimulants(); if (!mpIsFeatureUnlocked(MPFEATURE_ONEHITKILLS)) { g_MpSetup.options &= ~MPOPTION_ONEHITKILLS; } if (!mpIsFeatureUnlocked(MPFEATURE_SLOWMOTION)) { g_MpSetup.options &= ~(MPOPTION_SLOWMOTION_ON | MPOPTION_SLOWMOTION_SMART); } for (i = 0; i < 4; i++) { if (g_MpSetup.chrslots & (1 << i)) { numplayers++; } } stagenum = g_MpSetup.stagenum; if (g_MpSetup.stagenum == STAGE_MP_RANDOM) { stagenum = mpChooseRandomStage(); } titleSetNextStage(stagenum); mainChangeToStage(stagenum); setNumPlayers(numplayers); titleSetNextMode(TITLEMODE_SKIP); g_Vars.perfectbuddynum = 1; } void mpInit(void) { s32 i; s32 mpindex = 0; g_MpNumChrs = 0; g_Vars.mplayerisrunning = true; if (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) { g_Vars.normmplayerisrunning = false; } else { g_Vars.normmplayerisrunning = true; } g_Vars.perfectbuddynum = 0; if (mpHasSimulants()) { g_Vars.lvmpbotlevel = true; } if (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) { struct mpplayerconfig tmp; tmp = g_PlayerConfigsArray[4]; g_PlayerConfigsArray[4] = g_PlayerConfigsArray[0]; g_PlayerConfigsArray[0] = tmp; tmp = g_PlayerConfigsArray[5]; g_PlayerConfigsArray[5] = g_PlayerConfigsArray[1]; g_PlayerConfigsArray[1] = tmp; // Player index 0 g_Vars.playerstats[0].mpindex = 0; g_PlayerConfigsArray[0].contpad1 = 0; g_PlayerConfigsArray[0].contpad2 = 2; if ((g_Vars.coopplayernum >= 0 && g_Vars.coopradaron) || (g_Vars.antiplayernum >= 0 && g_Vars.antiradaron)) { g_PlayerConfigsArray[0].base.displayoptions |= MPDISPLAYOPTION_RADAR; } else { g_PlayerConfigsArray[0].base.displayoptions &= ~MPDISPLAYOPTION_RADAR; } // Player index 1 g_Vars.playerstats[1].mpindexu32 = 1; g_PlayerConfigsArray[1].contpad1 = 1; g_PlayerConfigsArray[1].contpad2 = 3; if ((g_Vars.coopplayernum >= 0 && g_Vars.coopradaron) || (g_Vars.antiplayernum >= 0 && g_Vars.antiradaron)) { g_PlayerConfigsArray[1].base.displayoptions |= MPDISPLAYOPTION_RADAR; } else { g_PlayerConfigsArray[1].base.displayoptions &= ~MPDISPLAYOPTION_RADAR; } g_MpNumChrs = 2; } else { for (i = 0; i < 4; i++) { if (g_MpSetup.chrslots & (1 << i)) { g_Vars.playerstats[mpindex].mpindex = i; g_PlayerConfigsArray[i].contpad1 = i; g_PlayerConfigsArray[i].contpad2 = 0; mpCalculatePlayerTitle(&g_PlayerConfigsArray[i]); g_PlayerConfigsArray[i].newtitle = g_PlayerConfigsArray[i].title; g_MpNumChrs++; mpindex++; } } } for (i = 0; i != MAX_MPCHRS; i++) { struct mpchrconfig *mpchr = MPCHR(i); func0f187838(mpchr); #if VERSION >= VERSION_NTSC_1_0 g_MpAllChrPtrs[i] = NULL; #endif } g_MpSetup.paused = false; g_MpEnableMusicSwitching = false; if (g_Vars.normmplayerisrunning) { if (mpGetUsingMultipleTunes()) { s32 i = 0; s32 count = 0; s32 numtracks = mpGetNumUnlockedTracks(); for (i; i < numtracks && count < 2; i++) { if (mpIsMultiTrackSlotEnabled(i)) { count++; } } if (count >= 2) { g_MpEnableMusicSwitching = true; } } g_MpLockInfo.unk04 = -1; } // Assign aibot commands to active menu slots for (i = 0; i < 9; i++) { g_AmBotCommands[i] = AIBOTCMD_NORMAL; } g_AmBotCommands[1] = AIBOTCMD_ATTACK; g_AmBotCommands[7] = AIBOTCMD_NORMAL; g_AmBotCommands[0] = AIBOTCMD_FOLLOW; g_AmBotCommands[2] = AIBOTCMD_PROTECT; g_AmBotCommands[3] = AIBOTCMD_DEFEND; g_AmBotCommands[5] = AIBOTCMD_HOLD; switch (g_MpSetup.scenario) { case MPSCENARIO_CAPTURETHECASE: g_AmBotCommands[3] = AIBOTCMD_GETCASE; g_AmBotCommands[5] = AIBOTCMD_SAVECASE; break; case MPSCENARIO_KINGOFTHEHILL: g_AmBotCommands[6] = AIBOTCMD_DEFHILL; g_AmBotCommands[8] = AIBOTCMD_HOLDHILL; break; case MPSCENARIO_HACKERCENTRAL: g_AmBotCommands[6] = AIBOTCMD_DOWNLOAD; g_AmBotCommands[8] = AIBOTCMD_DOWNLOAD; break; case MPSCENARIO_POPACAP: g_AmBotCommands[6] = AIBOTCMD_POPCAP; g_AmBotCommands[8] = AIBOTCMD_POPCAP; break; case MPSCENARIO_HOLDTHEBRIEFCASE: g_AmBotCommands[6] = AIBOTCMD_GETCASE2; g_AmBotCommands[8] = AIBOTCMD_GETCASE2; break; default: g_AmBotCommands[0] = AIBOTCMD_FOLLOW; g_AmBotCommands[1] = AIBOTCMD_ATTACK; g_AmBotCommands[2] = AIBOTCMD_PROTECT; g_AmBotCommands[3] = AIBOTCMD_DEFEND; g_AmBotCommands[5] = AIBOTCMD_HOLD; g_AmBotCommands[7] = AIBOTCMD_NORMAL; break; } } void mpCalculateTeamIsOnlyAi(void) { s32 playercount = PLAYERCOUNT(); s32 i; s32 j; // Iterate simulants, which go after players in the g_MpAllChrPtrs array for (i = playercount; i < g_MpNumChrs; i++) { if (!g_MpAllChrPtrs[i]) { continue; } g_MpAllChrPtrs[i]->aibot->teamisonlyai = true; if (g_MpSetup.options & MPOPTION_TEAMSENABLED) { // Iterate human players for (j = 0; j < playercount; j++) { if (g_MpAllChrPtrs[i]->team == g_MpAllChrPtrs[j]->team) { g_MpAllChrPtrs[i]->aibot->teamisonlyai = false; break; } } } } } void func0f187fbc(s32 playernum) { g_PlayerConfigsArray[playernum].base.unk18 = 80; g_PlayerConfigsArray[playernum].base.unk1a = 80; g_PlayerConfigsArray[playernum].base.unk1c = 75; } void func0f187fec(void) { g_MpSetup.timelimit = 9; g_MpSetup.scorelimit = 9; g_MpSetup.teamscorelimit = 19; } void mpPlayerSetDefaults(s32 playernum, bool autonames) { s32 i; s32 j; func0f187fbc(playernum); g_PlayerConfigsArray[playernum].controlmode = CONTROLMODE_11; g_PlayerConfigsArray[playernum].options = OPTION_LOOKAHEAD | OPTION_SIGHTONSCREEN | OPTION_AUTOAIM | OPTION_AMMOONSCREEN | OPTION_SHOWGUNFUNCTION | OPTION_HEADROLL | OPTION_0100 | OPTION_ALWAYSSHOWTARGET | OPTION_SHOWZOOMRANGE; g_PlayerConfigsArray[playernum].handicap = 128; switch (playernum) { case 0: default: g_PlayerConfigsArray[playernum].base.mpbodynum = MPBODY_DARK_COMBAT; break; case 1: g_PlayerConfigsArray[playernum].base.mpbodynum = MPBODY_CASSANDRA; break; case 2: g_PlayerConfigsArray[playernum].base.mpbodynum = MPBODY_CARRINGTON; break; case 3: g_PlayerConfigsArray[playernum].base.mpbodynum = MPBODY_CILABTECH; break; } g_PlayerConfigsArray[playernum].base.mpheadnum = mpGetMpheadnumByMpbodynum(g_PlayerConfigsArray[playernum].base.mpbodynum); g_PlayerConfigsArray[playernum].base.displayoptions = MPDISPLAYOPTION_RADAR | MPDISPLAYOPTION_HIGHLIGHTTEAMS; g_PlayerConfigsArray[playernum].fileguid.fileid = 0; g_PlayerConfigsArray[playernum].fileguid.deviceserial = 0; if (autonames) { // "Player 1" etc sprintf(g_PlayerConfigsArray[playernum].base.name, "%s %d\n", langGet(L_MISC_437), playernum + 1); } else { g_PlayerConfigsArray[playernum].base.name[0] = '\0'; } g_PlayerConfigsArray[playernum].kills = 0; g_PlayerConfigsArray[playernum].deaths = 0; g_PlayerConfigsArray[playernum].gamesplayed = 0; g_PlayerConfigsArray[playernum].gameswon = 0; g_PlayerConfigsArray[playernum].gameslost = 0; g_PlayerConfigsArray[playernum].time = 0; g_PlayerConfigsArray[playernum].distance = 0; g_PlayerConfigsArray[playernum].accuracy = 1000; g_PlayerConfigsArray[playernum].damagedealt = 0; g_PlayerConfigsArray[playernum].painreceived = 0; g_PlayerConfigsArray[playernum].headshots = 0; g_PlayerConfigsArray[playernum].ammoused = 0; g_PlayerConfigsArray[playernum].accuracymedals = 0; g_PlayerConfigsArray[playernum].headshotmedals = 0; g_PlayerConfigsArray[playernum].killmastermedals = 0; g_PlayerConfigsArray[playernum].survivormedals = 0; g_PlayerConfigsArray[playernum].title = MPPLAYERTITLE_BEGINNER; if (playernum < 4) { for (i = 0; i < 30; i++) { for (j = 1; j <= 4; j++) { mpSetChallengeCompletedByPlayerWithNumPlayers(playernum, i, j, false); } } mpDetermineUnlockedFeatures(); } for (i = 0; i < 6; i++) { g_PlayerConfigsArray[playernum].gunfuncs[i] = 0; } } void func0f1881d4(s32 index) { g_BotConfigsArray[index].base.name[0] = '\0'; g_BotConfigsArray[index].base.mpheadnum = MPHEAD_DARK_COMBAT; g_BotConfigsArray[index].base.mpbodynum = MPBODY_DARK_COMBAT; g_BotConfigsArray[index].type = BOTTYPE_GENERAL; g_BotConfigsArray[index].difficulty = BOTDIFF_DISABLED; } void mpSetDefaultSetup(void) { s32 i; s32 j; g_MpSetup.scenario = MPSCENARIO_COMBAT; g_MpSetup.stagenum = STAGE_MP_SKEDAR; g_MpSetup.options = MPOPTION_DISPLAYTEAM | MPOPTION_KILLSSCORE | MPOPTION_HTB_HIGHLIGHTBRIEFCASE | MPOPTION_HTB_SHOWONRADAR | MPOPTION_CTC_SHOWONRADAR | MPOPTION_KOH_HILLONRADAR | MPOPTION_KOH_MOBILEHILL | MPOPTION_00010000 | MPOPTION_HTM_HIGHLIGHTTERMINAL | MPOPTION_HTM_SHOWONRADAR | MPOPTION_PAC_HIGHLIGHTTARGET | MPOPTION_PAC_SHOWONRADAR; g_Vars.mphilltime = 10; func0f187fec(); g_MpSetup.fileguid.fileid = 0; g_MpSetup.fileguid.deviceserial = 0; strcpy(g_MpSetup.name, ""); for (i = 0; i < 6; i++) { mpPlayerSetDefaults(i, false); } for (i = 0; i < MAX_BOTS; i++) { func0f1881d4(i); } if (argFindByPrefix(1, "-mpwpnset")) { char *value = argFindByPrefix(1, "-mpwpnset"); mpSetWeaponSet(*value - 0x30); } else { mpSetWeaponSet(0); } g_Vars.mplayerisrunning = false; g_Vars.normmplayerisrunning = false; g_Vars.lvmpbotlevel = 0; g_MpLockInfo.lockedplayernum = 0; g_MpLockInfo.lastwinner = -1; g_MpLockInfo.lastloser = -1; g_MpLockInfo.unk03 = -1; g_MpLockInfo.unk04 = -1; mpForceUnlockSimulantFeatures(); for (i = 0; i < ARRAYCOUNT(g_PlayerConfigsArray); i++) { for (j = 0; j < 6; j++) { g_PlayerConfigsArray[i].gunfuncs[j] = 0; } } g_MpSetup.chrslots = 0; } #if VERSION >= VERSION_PAL_FINAL void mpGetTeamsWithDefaultName(u8 *mask) { s32 i; *mask = 0; for (i = 0; i < 8; i++) { if (strcmp(g_BossFile.teamnames[i], langGet(L_OPTIONS_008 + i)) == 0) { *mask |= 1 << i; } } } #endif #if VERSION >= VERSION_PAL_FINAL void mpSetTeamNamesToDefault(u8 mask) { s32 i; for (i = 0; i < 8; i++) { if (mask & (1 << i)) { strcpy(g_BossFile.teamnames[i], langGet(L_OPTIONS_008 + i)); } } } #endif void mpSetDefaultNamesIfEmpty(void) { s32 i; // Setup file name if (g_MpSetup.name[0] == '\0') { strcpy(g_MpSetup.name, langGet(L_MISC_438)); // empty string } // Team names for (i = 0; i < 8; i++) { if (g_BossFile.teamnames[i][0] == '\0') { strcpy(g_BossFile.teamnames[i], langGet(L_OPTIONS_008 + i)); // "Red", "Yellow" etc } } // Player names for (i = 0; i < 4; i++) { if (g_PlayerConfigsArray[i].base.name[0] == '\0') { sprintf(g_PlayerConfigsArray[i].base.name, "%s %d\n", langGet(L_MISC_437), i + 1); // "Player 1" etc } } } s32 mpCalculateTeamScoreLimit(void) { s32 limit = g_MpSetup.teamscorelimit; s32 i; if (g_BossFile.locktype == MPLOCKTYPE_CHALLENGE && g_MpSetup.teamscorelimit != 400 && (g_MpSetup.scenario == MPSCENARIO_COMBAT || g_MpSetup.scenario == MPSCENARIO_KINGOFTHEHILL)) { s32 numchrs = 0; for (i = 0; i < 4; i++) { if (g_MpSetup.chrslots & (1 << i)) { numchrs++; } } switch (numchrs) { case 1: break; case 2: limit = limit * 2 + 1; break; case 3: limit = (limit * 5 + 5) / 2 - 1; break; case 4: limit = limit * 3 + 2; break; } } return limit; } void mpApplyLimits(void) { if (g_MpSetup.timelimit >= 60) { lvSetMpTimeLimit60(0); } else { lvSetMpTimeLimit60(SECSTOTIME60((g_MpSetup.timelimit + 1) * 60)); } if (g_MpSetup.scorelimit >= 100) { lvSetMpScoreLimit(0); } else { lvSetMpScoreLimit(g_MpSetup.scorelimit + 1); } if (g_MpSetup.teamscorelimit >= 400) { lvSetMpTeamScoreLimit(0); } else { lvSetMpTeamScoreLimit(mpCalculateTeamScoreLimit() + 1); } } /** * Given a pointer to an array of 12 ranking structs, populate those rankings * with the winner first, loser last. Return the number of rows (players). * * The function also populates the placement an rankablescore values in the * mpchr structs and calculates the last winner and loser for the lock settings. */ s32 mpGetPlayerRankings(struct ranking *rankings) { s32 i; s32 scores[MAX_MPCHRS]; u32 rankablescores[MAX_MPCHRS]; struct mpchrconfig *mpchrs[MAX_MPCHRS]; s32 chrnums[MAX_MPCHRS]; s32 count = 0; s32 numteams; struct ranking teamrankings[MAX_MPCHRS]; s32 winner; s32 loser; s32 score; s32 deaths; struct mpchrconfig *mpchr; s32 dstindex; bool found; u32 rankablescore; s32 j; if (g_MpSetup.options & MPOPTION_TEAMSENABLED) { numteams = mpGetTeamRankings(teamrankings); } // Populate 4 arrays with player info, sorted by highest score descending for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { mpchr = MPCHR(i); scenarioCalculatePlayerScore(mpchr, i, &score, &deaths); rankablescore = (score + 0x8000) << 16 | 0xffff - deaths; dstindex = 0; found = false; // Find where this player should be placed in the sorted arrays for (j = 0; j < count && !found; j++) { if (rankablescore > rankablescores[j]) { dstindex = j; found = true; } } if (!found) { dstindex = count; } // Shuffle everything forward after dstindex to create a gap for (j = count; j > dstindex; j--) { rankablescores[j] = rankablescores[j - 1]; scores[j] = scores[j - 1]; mpchrs[j] = mpchrs[j - 1]; chrnums[j] = chrnums[j - 1]; } count++; // Write the new figures rankablescores[dstindex] = (score + 0x8000) << 16 | 0xffff - deaths; scores[dstindex] = score; mpchrs[dstindex] = mpchr; chrnums[dstindex] = i; } } // Populate the rankings array, copy some values into the mpchr structs // and calculate the winner and loser winner = -1; loser = -1; for (j = 0; j < count; j++) { rankings[j].mpchr = mpchrs[j]; rankings[j].teamnum = chrnums[j]; rankings[j].positionindex = j; rankings[j].unk0c = 0; rankings[j].score = scores[j]; // For a team game, the mpchr's placement has to be the team's placement // and not the placement of the individual player. if (g_MpSetup.options & MPOPTION_TEAMSENABLED) { s32 placement = numteams - 1; s32 i; for (i = 0; i < numteams; i++) { if (teamrankings[i].teamnum == mpchrs[j]->team) { placement = i; } } mpchrs[j]->placement = placement; #if VERSION >= VERSION_NTSC_1_0 mpchrs[j]->rankablescore = 255 - placement; #endif } else { mpchrs[j]->placement = j; #if VERSION >= VERSION_NTSC_1_0 mpchrs[j]->rankablescore = rankablescores[j]; #endif } #if VERSION < VERSION_NTSC_1_0 mpchrs[j]->rankablescore = rankablescores[j]; #endif if (chrnums[j] < 4) { loser = chrnums[j]; if (winner == -1) { winner = chrnums[j]; if (1); } } } g_MpLockInfo.lastwinner = winner; g_MpLockInfo.lastloser = loser; if (g_BossFile.locktype == MPLOCKTYPE_RANDOM) { g_MpLockInfo.lockedplayernum = mpChooseRandomLockPlayer(); } return count; } /** * Iterate players on the given team and add their scores. * * There are two score values: * - The team score, which is written to the result pointer and eventually * displayed on screen * - The rankable score, which is the returned value. The rankable score is * similar to the team score but uses the number of deaths as a tie breaker. */ s32 mpCalculateTeamScore(s32 teamnum, s32 *result) { struct mpchrconfig *mpchr; s32 teamscore = 0; s32 teamdeaths = 0; bool teamexists = false; s32 i; u32 stack; s32 score; s32 deaths; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { mpchr = MPCHR(i); if (mpchr->team == teamnum) { scenarioCalculatePlayerScore(mpchr, i, &score, &deaths); teamexists = true; teamscore += score; teamdeaths += deaths; } } } if (teamexists) { *result = teamscore; return (teamscore + 0x8000) << 16 | 0xffff - teamdeaths; } return 0; } /** * Given a pointer to an array of 8 ranking structs, populate those rankings * with the winning team first, losing team last. Return the number of rows * (teams). */ s32 mpGetTeamRankings(struct ranking *rankings) { s32 i; s32 count; s32 apparentscores[8]; u32 rankablescores[8]; u32 bestrankablescore; s32 thisteamnum; count = 0; // Calculate scores for each team for (i = 0; i < 8; i++) { apparentscores[i] = -8000; rankablescores[i] = mpCalculateTeamScore(i, &apparentscores[i]); } // Iterate each slot and determine which team belongs in it. // As each team is found, set their apparent score to -8000 so they're not // found again. do { bestrankablescore = 0; thisteamnum = -8000; // Check which team has the best remaining score for (i = 0; i < 8; i++) { if (apparentscores[7 - i] > -8000 && rankablescores[7 - i] >= bestrankablescore) { thisteamnum = 7 - i; bestrankablescore = rankablescores[thisteamnum]; } } if (thisteamnum > -8000) { // Append to the rankings array rankings[count].mpchr = NULL; rankings[count].teamnum = thisteamnum; rankings[count].positionindex = count + 1; rankings[count].unk0c = 0; rankings[count].score = apparentscores[thisteamnum]; apparentscores[thisteamnum] = -8000; count++; } } while (thisteamnum != -8000); return count; } s32 func0f188bcc(void) { return 39; } s32 mpGetNumWeaponOptions(void) { s32 count = 0; s32 i; for (i = 0; i < ARRAYCOUNT(g_MpWeapons); i++) { if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature)) { count++; } } return count; } char *mpGetWeaponLabel(s32 weaponnum) { s32 i; for (i = 0; i < ARRAYCOUNT(g_MpWeapons); i++) { if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature)) { if (weaponnum == 0) { if (g_MpWeapons[i].weaponnum == WEAPON_NONE) { return langGet(L_MPWEAPONS_058); // "Nothing" } if (g_MpWeapons[i].weaponnum == WEAPON_MPSHIELD) { return langGet(L_MPWEAPONS_059); // "Shield" } if (g_MpWeapons[i].weaponnum == WEAPON_DISABLED) { return langGet(L_MPWEAPONS_060); // "Disabled" } return bgunGetName(g_MpWeapons[i].weaponnum); } weaponnum--; } } return ""; } #if VERSION >= VERSION_NTSC_1_0 const char var7f1b8a5c[] = "Gun index %d -> slot %d = gun %d\n\n"; const char var7f1b8a80[] = "HOLDER: selecting weapon set %d\n"; #endif void mpSetWeaponSlot(s32 slot, s32 mpweaponnum) { s32 optionindex = mpweaponnum; s32 i; for (i = 0; i <= mpweaponnum; i++) { if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature) == 0) { mpweaponnum++; } optionindex = mpweaponnum; } g_MpSetup.weapons[slot] = optionindex; } s32 mpGetWeaponSlot(s32 slot) { s32 count = 0; s32 i; for (i = 0; i < g_MpSetup.weapons[slot]; i++) { if (mpIsFeatureUnlocked(g_MpWeapons[i].unlockfeature)) { count++; } } return count; } struct mpweapon *func0f188e24(s32 arg0) { s32 v0 = arg0 + 1; s32 slot = 0; s32 a2 = v0; u8 mpweaponnum; while (v0 > 0) { mpweaponnum = g_MpSetup.weapons[slot]; if (g_MpWeapons[mpweaponnum].weaponnum != WEAPON_DISABLED) { v0--; } if (v0 > 0) { slot++; if (slot >= 6) { slot = 0; if (a2 == v0) { mpweaponnum = 0; v0 = 0; } a2 = v0; } } } return &g_MpWeapons[mpweaponnum]; } s32 mpCountWeaponSetThing(s32 weaponsetindex) { s32 i; s32 count = 0; if (weaponsetindex >= ARRAYCOUNT(g_MpWeaponSets)) { count = weaponsetindex - ARRAYCOUNT(g_MpWeaponSets); weaponsetindex = ARRAYCOUNT(g_MpWeaponSets); } for (i = 0; i < weaponsetindex; i++) { 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) { count++; } } return count; } s32 func0f188f9c(s32 arg0) { s32 i; for (i = 0; i < ARRAYCOUNT(g_MpWeaponSets); i++) { // @bug? Shouldn't the disabled check be == WEAPON_DISABLED? 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; } arg0--; } } return i + arg0; } s32 func0f189058(s32 arg0) { return mpCountWeaponSetThing(arg0 ? 15 : 12); } s32 func0f189088(void) { return mpCountWeaponSetThing(14); } char *mpGetWeaponSetName(s32 index) { index = func0f188f9c(index); if (index < 0 || index >= 14) { return langGet(L_MPWEAPONS_041); // "Custom" } if (index == 13) { return langGet(L_MPWEAPONS_042); // "Random" } if (index == 12) { return langGet(L_MPWEAPONS_043); // "Random Five" } return langGet(g_MpWeaponSets[index].name); } void func0f18913c(void) { s32 i; bool done = false; u8 *ptr; s32 j; for (i = 0; !done && i < 12; i++) { 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])) { ptr = &g_MpWeaponSets[i].slots[0]; } else if (g_MpWeaponSets[i].unk0c != WEAPON_DISABLED) { ptr = &g_MpWeaponSets[i].unk0c; } else { ptr = NULL; } if (ptr != NULL) { bool ok = true; for (j = 0; j < 6; j++) { s32 weaponnum = ptr[j]; if (weaponnum == WEAPON_MPSHIELD) { if (!mpIsFeatureUnlocked(MPFEATURE_WEAPON_SHIELD)) { weaponnum = 0; } } if (weaponnum != g_MpWeapons[g_MpSetup.weapons[j]].weaponnum) { ok = false; } } if (ok) { done = true; g_MpWeaponSetNum = i; } } } if (!done) { g_MpWeaponSetNum = WEAPONSET_CUSTOM; } } void mpApplyWeaponSet(void) { s32 i; u8 *ptr; if (g_MpWeaponSetNum >= 0 && g_MpWeaponSetNum < 12) { if (mpIsFeatureUnlocked(g_MpWeaponSets[g_MpWeaponSetNum].requirefeatures[0]) && mpIsFeatureUnlocked(g_MpWeaponSets[g_MpWeaponSetNum].requirefeatures[1]) && mpIsFeatureUnlocked(g_MpWeaponSets[g_MpWeaponSetNum].requirefeatures[2]) && mpIsFeatureUnlocked(g_MpWeaponSets[g_MpWeaponSetNum].requirefeatures[3])) { ptr = &g_MpWeaponSets[g_MpWeaponSetNum].slots[0]; } else if (g_MpWeaponSets[g_MpWeaponSetNum].unk0c != WEAPON_DISABLED) { ptr = &g_MpWeaponSets[g_MpWeaponSetNum].unk0c; } else { ptr = NULL; } if (ptr != NULL) { for (i = 0; i < 6; i++) { u32 j; bool done = false; s32 mpweaponnum = MPWEAPON_NONE; s32 weaponnum = ptr[i]; if (weaponnum == WEAPON_MPSHIELD && !mpIsFeatureUnlocked(MPFEATURE_WEAPON_SHIELD)) { weaponnum = 0; } for (j = 0; !done; j++) { if (j > MPWEAPON_DISABLED) { done = true; } else if (weaponnum == g_MpWeapons[j].weaponnum) { mpweaponnum = j; done = true; } } g_MpSetup.weapons[i] = mpweaponnum; } } } else if (g_MpWeaponSetNum == WEAPONSET_RANDOM) { s32 numoptions = mpGetNumWeaponOptions(); for (i = 0; i < 6; i++) { mpSetWeaponSlot(i, random() % numoptions); } } else if (g_MpWeaponSetNum == WEAPONSET_RANDOMFIVE) { s32 numoptions = mpGetNumWeaponOptions() - 2; for (i = 0; i < 5; i++) { mpSetWeaponSlot(i, random() % numoptions + 1); } mpSetWeaponSlot(i, mpGetNumWeaponOptions() - 1); } } void mpSetWeaponSet(s32 weaponsetnum) { g_MpWeaponSetNum = func0f188f9c(weaponsetnum); mpApplyWeaponSet(); } void func0f1895e8(void) { if (g_MpWeaponSetNum < 12) { mpApplyWeaponSet(); } } s32 mpGetWeaponSet(void) { return mpCountWeaponSetThing(g_MpWeaponSetNum); } bool mpIsPaused(void) { if (PLAYERCOUNT() == 1 && g_Vars.mplayerisrunning && g_Menus[g_Vars.currentplayerstats->mpindex].curdialog) { return true; } if (g_MpSetup.paused == PAUSEMODE_UNPAUSED) { return false; } return true; } void mpSetPaused(u8 mode) { g_MpSetup.paused = mode; } /** * Render "Paused" in the middle of the viewport if paused, * or "Press START" if player has finished their death animation. * * @bug: When calling textRender(), viGetWidth() is used twice but it should be * viGetViewWidth() and viGetViewHeight(). These arguments to textRender() set * the crop box for the text, but the text doesn't extend past the box anyway * so it has no effect. */ Gfx *mpRenderModalText(Gfx *gdl) { s32 textwidth; s32 textheight; s32 x; s32 y; char text[50]; s32 stack1; if (g_MpSetup.paused == MPPAUSEMODE_PAUSED) { s32 red = (s32) ((1.0f - var80061630) * 20.0f * 255.0f) % 255; s32 stack2; gdl = func0f153628(gdl); strcpy(text, langGet(L_MPWEAPONS_040)); // "Paused" x = viGetViewLeft() + viGetViewWidth() / 2; #if VERSION >= VERSION_NTSC_1_0 if (g_Menus[g_Vars.currentplayerstats->mpindex].curdialog) #else if (g_Menus[g_Vars.currentplayernum].curdialog) #endif { y = viGetViewTop() + 10; } else { y = viGetViewTop() + viGetViewHeight() / 2; } #if PAL // Use smaller fonts textMeasure(&textheight, &textwidth, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, 0); #else textMeasure(&textheight, &textwidth, text, g_CharsHandelGothicMd, g_FontHandelGothicMd, 0); #endif x -= textwidth / 2; #if PAL gdl = textRender(gdl, &x, &y, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, (red << 24) | 0x00ff00ff, 0x000000ff, viGetWidth(), viGetWidth(), 0, 0); #else gdl = textRender(gdl, &x, &y, text, g_CharsHandelGothicMd, g_FontHandelGothicMd, (red << 24) | 0x00ff00ff, 0x000000ff, viGetWidth(), viGetWidth(), 0, 0); #endif gdl = func0f153780(gdl); } else if (!g_MainIsEndscreen && g_MpSetup.paused == MPPAUSEMODE_UNPAUSED && g_Vars.currentplayer->isdead && g_Vars.currentplayer->redbloodfinished && g_Vars.currentplayer->deathanimfinished && !(g_Vars.coopplayernum >= 0 && ((g_Vars.bond->isdead && g_Vars.coop->isdead) || !g_Vars.currentplayer->coopcanrestart || g_InCutscene)) && !(g_Vars.antiplayernum >= 0 && ((g_Vars.currentplayer != g_Vars.anti || g_InCutscene))) && g_NumReasonsToEndMpMatch == 0) { // Render "Press START" text gdl = func0f153628(gdl); strcpy(text, langGet(L_MPWEAPONS_039)); x = viGetViewLeft() + viGetViewWidth() / 2; y = viGetViewTop() + viGetViewHeight() / 2; textMeasure(&textheight, &textwidth, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, 0); x -= textwidth / 2; gdl = textRender(gdl, &x, &y, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, 0xff0000ff, 0x000000ff, viGetWidth(), viGetWidth(), 0, 0); if (g_Vars.currentplayer->deadtimer > 0) { // Render countdown timer s32 countdowny = viGetViewTop() + viGetViewHeight() / 2 + textheight + 2; s32 coutndownx = viGetViewLeft() + viGetViewWidth() / 2; sprintf(text, "%d\n", (g_Vars.currentplayer->deadtimer + TICKS(60) - 1) / TICKS(60)); textMeasure(&textheight, &textwidth, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, 0); x = coutndownx - textwidth / 2; y = countdowny; gdl = textRender(gdl, &x, &y, text, g_CharsHandelGothicSm, g_FontHandelGothicSm, 0xff0000ff, 0x000000ff, viGetWidth(), viGetWidth(), 0, 0); } gdl = func0f153780(gdl); g_Menus[g_Vars.currentplayerstats->mpindex].openinhibit = 10; } return gdl; } s32 mpFindMaxInt(s32 numplayers, s32 val0, s32 val1, s32 val2, s32 val3) { s32 bestvalue = val0; s32 bestplayer = 0; if (numplayers >= 2) { if (val1 > bestvalue || (val1 == bestvalue && (random() % 2))) { bestplayer = 1; bestvalue = val1; } else { bestvalue = val0; bestplayer = 0; } if (numplayers >= 3) { if (val2 > bestvalue || (val2 == bestvalue && (random() % 2))) { bestplayer = 2; bestvalue = val2; } if (numplayers >= 4) { if (val3 > bestvalue || (val3 == bestvalue && (random() % 2))) { bestplayer = 3; } } } } return bestplayer; } s32 mpFindMinInt(s32 numplayers, s32 val0, s32 val1, s32 val2, s32 val3) { s32 bestvalue = val0; s32 bestplayer = 0; if (numplayers >= 2) { if (val1 < bestvalue || (val1 == bestvalue && (random() % 2))) { bestplayer = 1; bestvalue = val1; } else { bestvalue = val0; bestplayer = 0; } if (numplayers >= 3) { if (val2 < bestvalue || (val2 == bestvalue && (random() % 2))) { bestplayer = 2; bestvalue = val2; } if (numplayers >= 4) { if (val3 < bestvalue || (val3 == bestvalue && (random() % 2))) { bestplayer = 3; } } } } return bestplayer; } s32 mpFindMaxFloat(s32 numplayers, f32 val0, f32 val1, f32 val2, f32 val3) { // @bug: bestvalue should be an f32. Any value saved into here will be // rounded down which may cause the function to return an incorrect result. s32 bestvalue; s32 bestplayer = 0; if (numplayers >= 2) { if (val1 > val0 || (val1 == val0 && (random() % 2))) { bestplayer = 1; bestvalue = val1; } else { bestvalue = val0; bestplayer = 0; } if (numplayers >= 3) { if (val2 > bestvalue || (val2 == bestvalue && (random() % 2))) { bestplayer = 2; bestvalue = val2; } if (numplayers >= 4) { if (val3 > bestvalue || (val3 == bestvalue && (random() % 2))) { bestplayer = 3; } } } } return bestplayer; } s32 mpFindMinFloat(s32 numplayers, f32 val0, f32 val1, f32 val2, f32 val3) { // @bug: bestvalue should be an f32. Any value saved into here will be // rounded down which may cause the function to return an incorrect result. s32 bestvalue; s32 bestplayer = 0; if (numplayers >= 2) { if (val0); if (val1 < val0 || (val1 == val0 && (random() % 2))) { bestplayer = 1; bestvalue = val1; } else { bestplayer = 0; bestvalue = val0; } if (numplayers >= 3) { if (val2 < bestvalue || (val2 == bestvalue && (random() % 2))) { bestplayer = 2; bestvalue = val2; } if (numplayers >= 4) { if (val3 < bestvalue || (val3 == bestvalue && (random() % 2))) { bestplayer = 3; } } } } return bestplayer; } struct mpweaponset g_MpWeaponSets[12] = { { /*0x00*/ L_MPWEAPONS_055, { WEAPON_FALCON2, WEAPON_MAGSEC4, WEAPON_PHOENIX, WEAPON_MAULER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_PHOENIX, MPFEATURE_WEAPON_MAULER, 0, 0 }, WEAPON_FALCON2, WEAPON_MAGSEC4, WEAPON_FALCON2, WEAPON_DY357MAGNUM, WEAPON_MPSHIELD, WEAPON_DISABLED }, // Pistols { /*0x01*/ L_MPWEAPONS_054, { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_LAPTOPGUN, WEAPON_AR34, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_LAPTOPGUN, 0, 0, 0 }, WEAPON_FALCON2, WEAPON_CMP150, WEAPON_DRAGON, WEAPON_AR34, WEAPON_MPSHIELD, WEAPON_DISABLED }, // Automatics { /*0x02*/ L_MPWEAPONS_053, { WEAPON_MAGSEC4, WEAPON_DY357MAGNUM, WEAPON_SHOTGUN, WEAPON_RCP120, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SHOTGUN, MPFEATURE_WEAPON_RCP120, 0, 0 }, WEAPON_MAGSEC4, WEAPON_DY357MAGNUM, WEAPON_DRAGON, WEAPON_AR34, WEAPON_MPSHIELD, WEAPON_DISABLED }, // Power { /*0x03*/ L_MPWEAPONS_052, { WEAPON_PHOENIX, WEAPON_CYCLONE, WEAPON_CALLISTO, WEAPON_FARSIGHT, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_FARSIGHT, MPFEATURE_WEAPON_CALLISTO, 0, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // FarSight { /*0x04*/ L_MPWEAPONS_051, { WEAPON_FALCON2, WEAPON_CMP150, WEAPON_DRAGON, WEAPON_TRANQUILIZER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_TRANQUILIZER, 0, 0, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Tranquilizer { /*0x05*/ L_MPWEAPONS_050, { WEAPON_MAULER, WEAPON_K7AVENGER, WEAPON_REAPER, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SUPERDRAGON, MPFEATURE_WEAPON_MAULER, MPFEATURE_WEAPON_K7AVENGER, MPFEATURE_WEAPON_REAPER }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Heavy { /*0x06*/ L_MPWEAPONS_049, { WEAPON_FALCON2_SILENCER, WEAPON_GRENADE, WEAPON_CMP150, WEAPON_DY357LX, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_FALCON2SILENCED, MPFEATURE_WEAPON_DY357LX, 0, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Golden Magnum { /*0x07*/ L_MPWEAPONS_048, { WEAPON_DEVASTATOR, WEAPON_DEVASTATOR, WEAPON_SUPERDRAGON, WEAPON_SUPERDRAGON, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_SUPERDRAGON, MPFEATURE_WEAPON_DEVASTATOR, 0, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Explosive { /*0x08*/ L_MPWEAPONS_047, { WEAPON_MAGSEC4, WEAPON_CMP150, WEAPON_AR34, WEAPON_DEVASTATOR, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_DEVASTATOR, 0, 0, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Grenade Launcher { /*0x09*/ L_MPWEAPONS_046, { WEAPON_MAULER, WEAPON_CYCLONE, WEAPON_DRAGON, WEAPON_ROCKETLAUNCHER, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_MAULER, 0, 0, 0 }, WEAPON_FALCON2, WEAPON_CYCLONE, WEAPON_DRAGON, WEAPON_ROCKETLAUNCHER, WEAPON_MPSHIELD, WEAPON_DISABLED }, // Rocket Launcher { /*0x0a*/ L_MPWEAPONS_045, { WEAPON_MAGSEC4, WEAPON_LAPTOPGUN, WEAPON_K7AVENGER, WEAPON_PROXIMITYMINE, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_LAPTOPGUN, MPFEATURE_WEAPON_K7AVENGER, MPFEATURE_WEAPON_PROXIMITYMINE, 0 }, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED, WEAPON_DISABLED }, // Proximity Mine { /*0x0b*/ L_MPWEAPONS_044, { WEAPON_COMBATKNIFE, WEAPON_COMBATKNIFE, WEAPON_TIMEDMINE, WEAPON_CROSSBOW, WEAPON_MPSHIELD, WEAPON_DISABLED }, { MPFEATURE_WEAPON_CROSSBOW, 0, 0, 0 }, WEAPON_COMBATKNIFE, WEAPON_COMBATKNIFE, WEAPON_TIMEDMINE, WEAPON_TIMEDMINE, WEAPON_MPSHIELD, WEAPON_DISABLED }, // Close Combat }; s32 g_MpWeaponSetNum = 0x00000000; u16 g_AwardNames[] = { L_MPMENU_000, // "Most Suicidal" L_MPMENU_001, // "Who Needs Ammo?" L_MPMENU_002, // "Least Shielded" L_MPMENU_003, // "Best Protected" L_MPMENU_004, // "Marksmanship" L_MPMENU_005, // "Most Professional" L_MPMENU_006, // "Most Deadly" L_MPMENU_007, // "Most Harmless" L_MPMENU_008, // "Most Cowardly" L_MPMENU_009, // "Most Frantic" L_MPMENU_010, // "Most Honorable" L_MPMENU_011, // "Most Dishonourable" L_MPMENU_012, // "Shortest Life" L_MPMENU_013, // "Longest Life" L_MPMENU_014, // "Double Kill" L_MPMENU_015, // "Triple Kill" L_MPMENU_016, // "Quad Kill" }; #if VERSION >= VERSION_NTSC_1_0 void mpCalculatePlayerTitle(struct mpplayerconfig *mpplayer) { const u32 tiers[] = { 2, 4, 8, 16, 28, 60, 100, 150, 210, 300 }; s32 tallies[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; s32 sum; s32 i; for (i = 0; i < 10; i++) { if (mpplayer->kills >= tiers[i] * 60) { tallies[0]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->gameswon >= tiers[i] * 3) { tallies[1]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->accuracymedals >= tiers[i] * 3) { tallies[2]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->headshotmedals >= tiers[i] * 3) { tallies[3]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->killmastermedals >= tiers[i] * 3) { tallies[4]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->time >= tiers[i] * 3600) { tallies[5]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->distance >= tiers[i] * 300) { tallies[6]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->damagedealt >= tiers[i] * 3) { tallies[7]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->ammoused >= tiers[i] * 1500) { tallies[8]++; } else { break; } } for (i = 0; i < 10; i++) { if (mpplayer->survivormedals >= tiers[i] * 3) { tallies[9]++; } else { break; } } sum = 0; for (i = 0; i < 10; i++) { sum = sum + tallies[i]; } if (sum > 100) { sum = 100; } mpplayer->title = sum / 5; if (mpplayer->title > MPPLAYERTITLE_PERFECT) { mpplayer->title = MPPLAYERTITLE_PERFECT; } } #else u32 var80089c70nb[10] = {0}; GLOBAL_ASM( glabel mpCalculatePlayerTitle /* f184578: 3c0f7f1b */ lui $t7,0x7f1b /* f18457c: 27bdffa0 */ addiu $sp,$sp,-96 /* f184580: 25ef3324 */ addiu $t7,$t7,0x3324 /* f184584: 25e80024 */ addiu $t0,$t7,0x24 /* f184588: 27ae0038 */ addiu $t6,$sp,0x38 .NB0f18458c: /* f18458c: 8de10000 */ lw $at,0x0($t7) /* f184590: 25ef000c */ addiu $t7,$t7,0xc /* f184594: 25ce000c */ addiu $t6,$t6,0xc /* f184598: adc1fff4 */ sw $at,-0xc($t6) /* f18459c: 8de1fff8 */ lw $at,-0x8($t7) /* f1845a0: adc1fff8 */ sw $at,-0x8($t6) /* f1845a4: 8de1fffc */ lw $at,-0x4($t7) /* f1845a8: 15e8fff8 */ bne $t7,$t0,.NB0f18458c /* f1845ac: adc1fffc */ sw $at,-0x4($t6) /* f1845b0: 8de10000 */ lw $at,0x0($t7) /* f1845b4: 3c0a8009 */ lui $t2,0x8009 /* f1845b8: 254a9c70 */ addiu $t2,$t2,-25488 /* f1845bc: 254d0024 */ addiu $t5,$t2,0x24 /* f1845c0: 27a90010 */ addiu $t1,$sp,0x10 /* f1845c4: adc10000 */ sw $at,0x0($t6) .NB0f1845c8: /* f1845c8: 8d410000 */ lw $at,0x0($t2) /* f1845cc: 254a000c */ addiu $t2,$t2,0xc /* f1845d0: 2529000c */ addiu $t1,$t1,0xc /* f1845d4: ad21fff4 */ sw $at,-0xc($t1) /* f1845d8: 8d41fff8 */ lw $at,-0x8($t2) /* f1845dc: ad21fff8 */ sw $at,-0x8($t1) /* f1845e0: 8d41fffc */ lw $at,-0x4($t2) /* f1845e4: 154dfff8 */ bne $t2,$t5,.NB0f1845c8 /* f1845e8: ad21fffc */ sw $at,-0x4($t1) /* f1845ec: 8d410000 */ lw $at,0x0($t2) /* f1845f0: 27a20038 */ addiu $v0,$sp,0x38 /* f1845f4: 27a50060 */ addiu $a1,$sp,0x60 /* f1845f8: 24030014 */ addiu $v1,$zero,0x14 /* f1845fc: ad210000 */ sw $at,0x0($t1) /* f184600: 8c580000 */ lw $t8,0x0($v0) .NB0f184604: /* f184604: 8c990054 */ lw $t9,0x54($a0) /* f184608: 8faf0010 */ lw $t7,0x10($sp) /* f18460c: 03030019 */ multu $t8,$v1 /* f184610: 24420004 */ addiu $v0,$v0,0x4 /* f184614: 25ee0001 */ addiu $t6,$t7,0x1 /* f184618: 00004012 */ mflo $t0 /* f18461c: 0328082b */ sltu $at,$t9,$t0 /* f184620: 14200003 */ bnez $at,.NB0f184630 /* f184624: 00000000 */ sll $zero,$zero,0x0 /* f184628: 10000003 */ beqz $zero,.NB0f184638 /* f18462c: afae0010 */ sw $t6,0x10($sp) .NB0f184630: /* f184630: 10000005 */ beqz $zero,.NB0f184648 /* f184634: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184638: /* f184638: 0045082b */ sltu $at,$v0,$a1 /* f18463c: 5420fff1 */ bnezl $at,.NB0f184604 /* f184640: 8c580000 */ lw $t8,0x0($v0) /* f184644: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184648: /* f184648: 27a30060 */ addiu $v1,$sp,0x60 /* f18464c: 8c8c0060 */ lw $t4,0x60($a0) .NB0f184650: /* f184650: 8c4b0000 */ lw $t3,0x0($v0) /* f184654: 8fad0014 */ lw $t5,0x14($sp) /* f184658: 24420004 */ addiu $v0,$v0,0x4 /* f18465c: 018b082b */ sltu $at,$t4,$t3 /* f184660: 14200003 */ bnez $at,.NB0f184670 /* f184664: 25aa0001 */ addiu $t2,$t5,0x1 /* f184668: 10000003 */ beqz $zero,.NB0f184678 /* f18466c: afaa0014 */ sw $t2,0x14($sp) .NB0f184670: /* f184670: 10000005 */ beqz $zero,.NB0f184688 /* f184674: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184678: /* f184678: 0043082b */ sltu $at,$v0,$v1 /* f18467c: 5420fff4 */ bnezl $at,.NB0f184650 /* f184680: 8c8c0060 */ lw $t4,0x60($a0) /* f184684: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184688: /* f184688: 27a30060 */ addiu $v1,$sp,0x60 /* f18468c: 8c890084 */ lw $t1,0x84($a0) .NB0f184690: /* f184690: 8c580000 */ lw $t8,0x0($v0) /* f184694: 8fb90018 */ lw $t9,0x18($sp) /* f184698: 24420004 */ addiu $v0,$v0,0x4 /* f18469c: 0138082b */ sltu $at,$t1,$t8 /* f1846a0: 14200003 */ bnez $at,.NB0f1846b0 /* f1846a4: 27280001 */ addiu $t0,$t9,0x1 /* f1846a8: 10000003 */ beqz $zero,.NB0f1846b8 /* f1846ac: afa80018 */ sw $t0,0x18($sp) .NB0f1846b0: /* f1846b0: 10000005 */ beqz $zero,.NB0f1846c8 /* f1846b4: 27a20038 */ addiu $v0,$sp,0x38 .NB0f1846b8: /* f1846b8: 0043082b */ sltu $at,$v0,$v1 /* f1846bc: 5420fff4 */ bnezl $at,.NB0f184690 /* f1846c0: 8c890084 */ lw $t1,0x84($a0) /* f1846c4: 27a20038 */ addiu $v0,$sp,0x38 .NB0f1846c8: /* f1846c8: 27a30060 */ addiu $v1,$sp,0x60 /* f1846cc: 8c8f0088 */ lw $t7,0x88($a0) .NB0f1846d0: /* f1846d0: 8c4e0000 */ lw $t6,0x0($v0) /* f1846d4: 8fac001c */ lw $t4,0x1c($sp) /* f1846d8: 24420004 */ addiu $v0,$v0,0x4 /* f1846dc: 01ee082b */ sltu $at,$t7,$t6 /* f1846e0: 14200003 */ bnez $at,.NB0f1846f0 /* f1846e4: 258b0001 */ addiu $t3,$t4,0x1 /* f1846e8: 10000003 */ beqz $zero,.NB0f1846f8 /* f1846ec: afab001c */ sw $t3,0x1c($sp) .NB0f1846f0: /* f1846f0: 10000005 */ beqz $zero,.NB0f184708 /* f1846f4: 27a20038 */ addiu $v0,$sp,0x38 .NB0f1846f8: /* f1846f8: 0043082b */ sltu $at,$v0,$v1 /* f1846fc: 5420fff4 */ bnezl $at,.NB0f1846d0 /* f184700: 8c8f0088 */ lw $t7,0x88($a0) /* f184704: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184708: /* f184708: 27a30060 */ addiu $v1,$sp,0x60 /* f18470c: 8c8d008c */ lw $t5,0x8c($a0) .NB0f184710: /* f184710: 8c4a0000 */ lw $t2,0x0($v0) /* f184714: 8fa90020 */ lw $t1,0x20($sp) /* f184718: 24420004 */ addiu $v0,$v0,0x4 /* f18471c: 01aa082b */ sltu $at,$t5,$t2 /* f184720: 14200003 */ bnez $at,.NB0f184730 /* f184724: 25380001 */ addiu $t8,$t1,0x1 /* f184728: 10000003 */ beqz $zero,.NB0f184738 /* f18472c: afb80020 */ sw $t8,0x20($sp) .NB0f184730: /* f184730: 10000005 */ beqz $zero,.NB0f184748 /* f184734: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184738: /* f184738: 0043082b */ sltu $at,$v0,$v1 /* f18473c: 5420fff4 */ bnezl $at,.NB0f184710 /* f184740: 8c8d008c */ lw $t5,0x8c($a0) /* f184744: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184748: /* f184748: 27a50060 */ addiu $a1,$sp,0x60 /* f18474c: 240304b0 */ addiu $v1,$zero,0x4b0 /* f184750: 8c480000 */ lw $t0,0x0($v0) .NB0f184754: /* f184754: 8c990068 */ lw $t9,0x68($a0) /* f184758: 8fae0024 */ lw $t6,0x24($sp) /* f18475c: 01030019 */ multu $t0,$v1 /* f184760: 24420004 */ addiu $v0,$v0,0x4 /* f184764: 25cc0001 */ addiu $t4,$t6,0x1 /* f184768: 00007812 */ mflo $t7 /* f18476c: 032f082b */ sltu $at,$t9,$t7 /* f184770: 14200003 */ bnez $at,.NB0f184780 /* f184774: 00000000 */ sll $zero,$zero,0x0 /* f184778: 10000003 */ beqz $zero,.NB0f184788 /* f18477c: afac0024 */ sw $t4,0x24($sp) .NB0f184780: /* f184780: 10000005 */ beqz $zero,.NB0f184798 /* f184784: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184788: /* f184788: 0045082b */ sltu $at,$v0,$a1 /* f18478c: 5420fff1 */ bnezl $at,.NB0f184754 /* f184790: 8c480000 */ lw $t0,0x0($v0) /* f184794: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184798: /* f184798: 27a50060 */ addiu $a1,$sp,0x60 /* f18479c: 24030064 */ addiu $v1,$zero,0x64 /* f1847a0: 8c4d0000 */ lw $t5,0x0($v0) .NB0f1847a4: /* f1847a4: 8c8b006c */ lw $t3,0x6c($a0) /* f1847a8: 8fa90028 */ lw $t1,0x28($sp) /* f1847ac: 01a30019 */ multu $t5,$v1 /* f1847b0: 24420004 */ addiu $v0,$v0,0x4 /* f1847b4: 25380001 */ addiu $t8,$t1,0x1 /* f1847b8: 00005012 */ mflo $t2 /* f1847bc: 016a082b */ sltu $at,$t3,$t2 /* f1847c0: 14200003 */ bnez $at,.NB0f1847d0 /* f1847c4: 00000000 */ sll $zero,$zero,0x0 /* f1847c8: 10000003 */ beqz $zero,.NB0f1847d8 /* f1847cc: afb80028 */ sw $t8,0x28($sp) .NB0f1847d0: /* f1847d0: 10000005 */ beqz $zero,.NB0f1847e8 /* f1847d4: 27a20038 */ addiu $v0,$sp,0x38 .NB0f1847d8: /* f1847d8: 0045082b */ sltu $at,$v0,$a1 /* f1847dc: 5420fff1 */ bnezl $at,.NB0f1847a4 /* f1847e0: 8c4d0000 */ lw $t5,0x0($v0) /* f1847e4: 27a20038 */ addiu $v0,$sp,0x38 .NB0f1847e8: /* f1847e8: 27a30060 */ addiu $v1,$sp,0x60 /* f1847ec: 8c880074 */ lw $t0,0x74($a0) .NB0f1847f0: /* f1847f0: 8c590000 */ lw $t9,0x0($v0) /* f1847f4: 8faf002c */ lw $t7,0x2c($sp) /* f1847f8: 24420004 */ addiu $v0,$v0,0x4 /* f1847fc: 0119082b */ sltu $at,$t0,$t9 /* f184800: 14200003 */ bnez $at,.NB0f184810 /* f184804: 25ee0001 */ addiu $t6,$t7,0x1 /* f184808: 10000003 */ beqz $zero,.NB0f184818 /* f18480c: afae002c */ sw $t6,0x2c($sp) .NB0f184810: /* f184810: 10000005 */ beqz $zero,.NB0f184828 /* f184814: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184818: /* f184818: 0043082b */ sltu $at,$v0,$v1 /* f18481c: 5420fff4 */ bnezl $at,.NB0f1847f0 /* f184820: 8c880074 */ lw $t0,0x74($a0) /* f184824: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184828: /* f184828: 27a50060 */ addiu $a1,$sp,0x60 /* f18482c: 240301f4 */ addiu $v1,$zero,0x1f4 /* f184830: 8c4d0000 */ lw $t5,0x0($v0) .NB0f184834: /* f184834: 8c8c0080 */ lw $t4,0x80($a0) /* f184838: 8faa0030 */ lw $t2,0x30($sp) /* f18483c: 01a30019 */ multu $t5,$v1 /* f184840: 24420004 */ addiu $v0,$v0,0x4 /* f184844: 25490001 */ addiu $t1,$t2,0x1 /* f184848: 00005812 */ mflo $t3 /* f18484c: 018b082b */ sltu $at,$t4,$t3 /* f184850: 14200003 */ bnez $at,.NB0f184860 /* f184854: 00000000 */ sll $zero,$zero,0x0 /* f184858: 10000003 */ beqz $zero,.NB0f184868 /* f18485c: afa90030 */ sw $t1,0x30($sp) .NB0f184860: /* f184860: 10000005 */ beqz $zero,.NB0f184878 /* f184864: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184868: /* f184868: 0045082b */ sltu $at,$v0,$a1 /* f18486c: 5420fff1 */ bnezl $at,.NB0f184834 /* f184870: 8c4d0000 */ lw $t5,0x0($v0) /* f184874: 27a20038 */ addiu $v0,$sp,0x38 .NB0f184878: /* f184878: 27a30060 */ addiu $v1,$sp,0x60 /* f18487c: 8c980090 */ lw $t8,0x90($a0) .NB0f184880: /* f184880: 8c480000 */ lw $t0,0x0($v0) /* f184884: 8fb90034 */ lw $t9,0x34($sp) /* f184888: 24420004 */ addiu $v0,$v0,0x4 /* f18488c: 0308082b */ sltu $at,$t8,$t0 /* f184890: 14200003 */ bnez $at,.NB0f1848a0 /* f184894: 272f0001 */ addiu $t7,$t9,0x1 /* f184898: 10000003 */ beqz $zero,.NB0f1848a8 /* f18489c: afaf0034 */ sw $t7,0x34($sp) .NB0f1848a0: /* f1848a0: 10000005 */ beqz $zero,.NB0f1848b8 /* f1848a4: 00001025 */ or $v0,$zero,$zero .NB0f1848a8: /* f1848a8: 0043082b */ sltu $at,$v0,$v1 /* f1848ac: 5420fff4 */ bnezl $at,.NB0f184880 /* f1848b0: 8c980090 */ lw $t8,0x90($a0) /* f1848b4: 00001025 */ or $v0,$zero,$zero .NB0f1848b8: /* f1848b8: 27a30010 */ addiu $v1,$sp,0x10 /* f1848bc: 27a50038 */ addiu $a1,$sp,0x38 .NB0f1848c0: /* f1848c0: 8c6e0000 */ lw $t6,0x0($v1) /* f1848c4: 24630004 */ addiu $v1,$v1,0x4 /* f1848c8: 1465fffd */ bne $v1,$a1,.NB0f1848c0 /* f1848cc: 01c21021 */ addu $v0,$t6,$v0 /* f1848d0: 28410065 */ slti $at,$v0,0x65 /* f1848d4: 14200002 */ bnez $at,.NB0f1848e0 /* f1848d8: 240b0014 */ addiu $t3,$zero,0x14 /* f1848dc: 24020064 */ addiu $v0,$zero,0x64 .NB0f1848e0: /* f1848e0: 24010005 */ addiu $at,$zero,0x5 /* f1848e4: 0041001a */ div $zero,$v0,$at /* f1848e8: 00006812 */ mflo $t5 /* f1848ec: 31ac00ff */ andi $t4,$t5,0xff /* f1848f0: 29810015 */ slti $at,$t4,0x15 /* f1848f4: 14200002 */ bnez $at,.NB0f184900 /* f1848f8: a08d0095 */ sb $t5,0x95($a0) /* f1848fc: a08b0095 */ sb $t3,0x95($a0) .NB0f184900: /* f184900: 03e00008 */ jr $ra /* f184904: 27bd0060 */ addiu $sp,$sp,0x60 ); #endif #if VERSION >= VERSION_NTSC_1_0 const char var7f1b8ad0[] = "%s%sAccuracy Peak! real value: %f (*100)\n"; const char var7f1b8afc[] = ""; const char var7f1b8b00[] = ""; const char var7f1b8b04[] = "%splayer %d Accuracy :%f\n"; const char var7f1b8b20[] = ""; const char var7f1b8b24[] = "%splayer %d dist:%f -> %f = %d\n"; const char var7f1b8b44[] = ""; const char var7f1b8b48[] = "Player %d TitleCalc ============\n"; #else const u32 var7f1b3324nb[] = {2, 4, 8, 0x10, 0x1c, 0x30, 0x4e, 0x8a, 0xc6, 0x12c }; #endif struct mphead g_MpBeauHeads[NUM_MPBEAUHEADS] = { // head, require feature { HEAD_BEAU2, 0 }, { HEAD_BEAU3, 0 }, { HEAD_BEAU4, 0 }, { HEAD_BEAU5, 0 }, { HEAD_BEAU6, 0 }, }; struct mphead g_MpHeads[75] = { // head, require feature { /*0x00*/ HEAD_DARK_COMBAT, 0 }, { /*0x01*/ HEAD_DARK_FROCK, MPFEATURE_CHR_CI }, { /*0x02*/ HEAD_DARKAQUA, MPFEATURE_CHR_PELAGIC }, { /*0x03*/ HEAD_DARK_SNOW, MPFEATURE_4A }, { /*0x04*/ HEAD_ELVIS, MPFEATURE_CHR_ELVIS }, { /*0x05*/ HEAD_ELVIS_GOGS, MPFEATURE_CHR_ELVIS }, { /*0x06*/ HEAD_CARRINGTON, 0 }, { /*0x07*/ HEAD_MRBLONDE, MPFEATURE_CHR_MRBLONDE }, { /*0x08*/ HEAD_CASSANDRA, 0 }, { /*0x09*/ HEAD_TRENT, MPFEATURE_CHR_TRENT }, { /*0x0a*/ HEAD_JONATHAN, MPFEATURE_CHR_INFILTRATION }, { /*0x0b*/ HEAD_VD, 0 }, { /*0x0c*/ HEAD_PRESIDENT, MPFEATURE_CHR_CI }, { /*0x0d*/ HEAD_DDSHOCK, 0 }, { /*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_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 }, { /*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 }, }; u32 g_BotHeads[] = { MPHEAD_JON, MPHEAD_BEAU1, MPHEAD_ROSS, MPHEAD_MARK2, MPHEAD_CHRIST, MPHEAD_RUSS, MPHEAD_DARLING, MPHEAD_BRIAN, MPHEAD_JAMIE, MPHEAD_DUNCAN2, MPHEAD_KEITH, MPHEAD_STEVEM, MPHEAD_GRANT, MPHEAD_PENNY, MPHEAD_DAVEC, MPHEAD_JONES, MPHEAD_GRAHAM, MPHEAD_ROBERT, MPHEAD_NEIL2, MPHEAD_SHAUN, MPHEAD_ROBIN, MPHEAD_COOK, MPHEAD_PRYCE, MPHEAD_SILKE, MPHEAD_SMITH, MPHEAD_GARETH, MPHEAD_MURCHIE, MPHEAD_WONG, MPHEAD_CARTER, MPHEAD_TINTIN, MPHEAD_MUNTON, MPHEAD_STAMPER, MPHEAD_PHELPS, MPHEAD_ALEX, MPHEAD_JULIANNE, MPHEAD_LAURA, MPHEAD_EDMCG, MPHEAD_ANKA, MPHEAD_LESLIE_S, MPHEAD_MATT_C, MPHEAD_PEER_S, MPHEAD_EILEEN_T, MPHEAD_ANDY_R, MPHEAD_BEN_R, MPHEAD_STEVE_K, MPHEAD_SANCHEZ, MPHEAD_TIM, MPHEAD_KEN, MPHEAD_EILEEN_H, MPHEAD_SCOTT_H, MPHEAD_JOEL, MPHEAD_GRIFFEY, MPHEAD_MOTO, }; // 2d74c struct botprofile g_BotProfiles[] = { // type, difficulty, name, body, require feature { BOTTYPE_GENERAL, BOTDIFF_MEAT, L_MISC_088, MPBODY_DD_GUARD, 0 }, { BOTTYPE_GENERAL, BOTDIFF_EASY, L_MISC_089, MPBODY_DD_SECGUARD, 0 }, { BOTTYPE_GENERAL, BOTDIFF_NORMAL, L_MISC_090, MPBODY_DD_SHOCK_INF, 0 }, { BOTTYPE_GENERAL, BOTDIFF_HARD, L_MISC_091, MPBODY_DDSHOCK, MPFEATURE_BOTDIFF_HARD }, { BOTTYPE_GENERAL, BOTDIFF_PERFECT, L_MISC_092, MPBODY_STRIPES, MPFEATURE_BOTDIFF_PERFECT }, { BOTTYPE_GENERAL, BOTDIFF_DARK, L_MISC_093, MPBODY_MOORE, MPFEATURE_BOTDIFF_DARK }, { BOTTYPE_PEACE, BOTDIFF_NORMAL, L_MISC_094, MPBODY_DD_LABTECH, 0 }, { BOTTYPE_SHIELD, BOTDIFF_NORMAL, L_MISC_095, MPBODY_G5_SWAT_GUARD, 0 }, { BOTTYPE_ROCKET, BOTDIFF_NORMAL, L_MISC_096, MPBODY_G5_GUARD, 0 }, { BOTTYPE_KAZE, BOTDIFF_NORMAL, L_MISC_097, MPBODY_PRES_SECURITY, 0 }, { BOTTYPE_FIST, BOTDIFF_NORMAL, L_MISC_098, MPBODY_PELAGIC_GUARD, 0 }, { BOTTYPE_PREY, BOTDIFF_NORMAL, L_MISC_099, MPBODY_DDSHOCK, 0 }, { BOTTYPE_COWARD, BOTDIFF_NORMAL, L_MISC_100, MPBODY_PRESIDENT, 0 }, { BOTTYPE_JUDGE, BOTDIFF_NORMAL, L_MISC_101, MPBODY_STEWARD, 0 }, { BOTTYPE_FEUD, BOTDIFF_NORMAL, L_MISC_102, MPBODY_NSA_LACKEY, 0 }, { BOTTYPE_SPEED, BOTDIFF_NORMAL, L_MISC_103, MPBODY_MRBLONDE, 0 }, { BOTTYPE_TURTLE, BOTDIFF_NORMAL, L_MISC_104, MPBODY_CARRINGTON, 0 }, { BOTTYPE_VENGE, BOTDIFF_NORMAL, L_MISC_105, MPBODY_ALASKAN_GUARD, 0 }, }; // 2d7dc 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_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_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_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_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_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_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 }, /*0x3c*/ { BODY_DJBOND, L_OPTIONS_070, 1000, MPFEATURE_8BOTS }, }; u32 g_MpMaleHeads[] = { HEAD_JON, HEAD_BEAU1, HEAD_ROSS, HEAD_MARK2, HEAD_CHRIST, HEAD_RUSS, HEAD_DARLING, HEAD_BRIAN, HEAD_JAMIE, HEAD_DUNCAN2, HEAD_KEITH, HEAD_STEVEM, HEAD_GRANT, HEAD_PENNY, HEAD_DAVEC, HEAD_JONES, HEAD_GRAHAM, HEAD_NEIL2, HEAD_SHAUN, HEAD_ROBIN, HEAD_COOK, HEAD_PRYCE, HEAD_SILKE, HEAD_SMITH, HEAD_GARETH, HEAD_MURCHIE, HEAD_WONG, HEAD_CARTER, HEAD_TINTIN, HEAD_MUNTON, HEAD_STAMPER, HEAD_PHELPS, HEAD_EDMCG, HEAD_MATT_C, HEAD_PEER_S, HEAD_ANDY_R, HEAD_BEN_R, HEAD_STEVE_K, HEAD_SANCHEZ, HEAD_TIM, HEAD_KEN, HEAD_SCOTT_H, HEAD_JOEL, HEAD_MOTO, }; u32 g_MpFemaleHeads[] = { HEAD_ALEX, HEAD_JULIANNE, HEAD_LAURA, HEAD_ANKA, HEAD_LESLIE_S, HEAD_EILEEN_T, HEAD_EILEEN_H, }; #if VERSION >= VERSION_NTSC_1_0 /** * Calculate player awards, medals, and update character statistics. */ void mpCalculateAwards(void) { s32 playercount; s32 i; s32 j; s32 prevplayernum; s32 duration60; struct awardmetrics metrics[4]; // @bug: playerrankings should have 12 elements. Because it's too small, // overflow occurs in mpGetPlayerRankings. The overflow writes into the // metrics array (above) which is yet to be initialised, so this bug has // no effect. struct ranking playerrankings[1]; s32 numchrs; s32 numteams; struct ranking teamrankings[MAX_MPCHRS]; u32 stack[4]; playercount = PLAYERCOUNT(); duration60 = playerGetMissionTime(); func00033dd8(); numchrs = mpGetPlayerRankings(playerrankings); numteams = (g_MpSetup.options & MPOPTION_TEAMSENABLED) ? mpGetTeamRankings(teamrankings) : 0; prevplayernum = g_Vars.currentplayernum; // Iterate all human players and update their character stats. // At the same time, populate the metrics array // which is a temporary array for award calculation. for (i = 0; i < playercount; i++) { struct mpchrconfig *mpchr = mpGetChrConfigBySlotNum(i); struct mpplayerconfig *mpplayer = (struct mpplayerconfig *)mpchr; s32 chrnum = mpGetChrIndexBySlotNum(i); s32 sum; setCurrentPlayerNum(i); g_Vars.currentplayer->award1 = NULL; g_Vars.currentplayer->award2 = NULL; metrics[i].numshots = mpstatsGetPlayerShotCountByRegion(SHOTREGION_TOTAL); metrics[i].numheadshots = mpstatsGetPlayerShotCountByRegion(SHOTREGION_HEAD); metrics[i].numkills = 0; metrics[i].numdeaths = 0; metrics[i].numsuicides = 0; for (j = 0; j < MAX_MPCHRS; j++) { if (chrnum == j) { metrics[i].numsuicides += mpchr->killcounts[j]; } else { metrics[i].numkills += mpchr->killcounts[j]; } } for (j = 0; j < MAX_MPCHRS; j++) { struct mpchrconfig *othermpchr = MPCHR(j); metrics[i].numdeaths += othermpchr->killcounts[chrnum]; } metrics[i].ksratio = metrics[i].numkills * 100.0f / (metrics[i].numshots + 1.0f); metrics[i].kdratio = metrics[i].numkills * 100.0f / (metrics[i].numdeaths + 1.0f); metrics[i].backshotcount = g_Vars.playerstats[i].backshotcount; metrics[i].drawplayercount = g_Vars.playerstats[i].drawplayercount; metrics[i].avgkmperhour = g_Vars.playerstats[i].distance / 100000.0f / ((duration60 + 1) / (3600.0f * 60.0f)); metrics[i].armourcount = g_Vars.playerstats[i].armourcount; metrics[i].awards = 0; metrics[i].longestlife = g_Vars.playerstats[i].longestlife; metrics[i].shortestlife = g_Vars.playerstats[i].shortestlife; sum = mpstatsGetPlayerShotCountByRegion(SHOTREGION_HEAD) + mpstatsGetPlayerShotCountByRegion(SHOTREGION_BODY) + mpstatsGetPlayerShotCountByRegion(SHOTREGION_LIMB) + mpstatsGetPlayerShotCountByRegion(SHOTREGION_GUN) + mpstatsGetPlayerShotCountByRegion(SHOTREGION_HAT) + mpstatsGetPlayerShotCountByRegion(SHOTREGION_OBJECT); if (metrics[i].numshots > 0) { metrics[i].accuracyfrac = sum / (f32)metrics[i].numshots; } else { metrics[i].accuracyfrac = 0.0f; } if (metrics[i].accuracyfrac > 1.0f) { metrics[i].accuracyfrac = 1.0f; } mpplayer->medals = 0; if (!g_CheatsActiveBank0 && !g_CheatsActiveBank1) { mpplayer->kills += metrics[i].numkills; mpplayer->deaths += metrics[i].numdeaths; mpplayer->gamesplayed++; mpplayer->time += duration60 / 60; mpplayer->distance += (u32)(g_Vars.playerstats[i].distance / 10000.0f); if (metrics[i].numshots > 0) { if (mpplayer->gamesplayed < 2) { mpplayer->accuracy = metrics[i].accuracyfrac * 1000.0f; } else { mpplayer->accuracy = ((metrics[i].accuracyfrac * 0.3f) + (mpplayer->accuracy / 1000.0f * 0.7f)) * 1000.0f; } } mpplayer->damagedealt += (u32)(g_Vars.playerstats[i].damtransmitted / 0.1f); mpplayer->painreceived += (u32)(g_Vars.playerstats[i].damreceived / 0.1f); mpplayer->headshots += metrics[i].numheadshots; mpplayer->ammoused += metrics[i].numshots; if ((numchrs >= 2 && (g_MpSetup.options & MPOPTION_TEAMSENABLED) == 0) || numteams >= 2) { bool lost = false; if (mpplayer->base.placement == 0) { for (j = 0; j < MAX_MPCHRS; j++) { if (g_MpSetup.chrslots & (1 << j)) { struct mpchrconfig *othermpchr = MPCHR(j); if (othermpchr->rankablescore == mpplayer->base.rankablescore && othermpchr != &mpplayer->base && !((g_MpSetup.options & MPOPTION_TEAMSENABLED) && othermpchr->team == mpplayer->base.team)) { lost = true; } } } if (!lost) { mpplayer->gameswon++; } } if (((g_MpSetup.options & MPOPTION_TEAMSENABLED) == 0 && numchrs == mpplayer->base.placement + 1) || ((g_MpSetup.options & MPOPTION_TEAMSENABLED) && numteams == mpplayer->base.placement + 1)) { bool won = false; for (j = 0; j < MAX_MPCHRS; j++) { if (g_MpSetup.chrslots & (1 << j)) { struct mpchrconfig *othermpchr = MPCHR(j); if (othermpchr->rankablescore == mpplayer->base.rankablescore && &mpplayer->base != othermpchr && !((g_MpSetup.options & MPOPTION_TEAMSENABLED) && othermpchr->team == mpplayer->base.team)) { won = true; } } } if (!won) { mpplayer->gameslost++; } } } else { // empty } } } setCurrentPlayerNum(prevplayernum); // Choose which players are eligible for which awards i = mpFindMaxInt(playercount, metrics[0].numsuicides, metrics[1].numsuicides, metrics[2].numsuicides, metrics[3].numsuicides); if (metrics[i].numsuicides > 0) { metrics[i].awards |= AWARD_MOSTSUICIDAL; } i = mpFindMinInt(playercount, metrics[0].numshots, metrics[1].numshots, metrics[2].numshots, metrics[3].numshots); if (metrics[i].numshots < 100) { metrics[i].awards |= AWARD_WHONEEDSAMMO; } i = mpFindMinFloat(playercount, metrics[0].armourcount, metrics[1].armourcount, metrics[2].armourcount, metrics[3].armourcount); if (metrics[i].armourcount <= 2.0f) { metrics[i].awards |= AWARD_LEASTSHIELDED; } i = mpFindMaxFloat(playercount, metrics[0].armourcount, metrics[1].armourcount, metrics[2].armourcount, metrics[3].armourcount); if (metrics[i].armourcount > 6.0f) { metrics[i].awards |= AWARD_BESTPROTECTED; } i = mpFindMaxInt(playercount, metrics[0].numheadshots, metrics[1].numheadshots, metrics[2].numheadshots, metrics[3].numheadshots); if (metrics[i].numheadshots > 0) { metrics[i].awards |= AWARD_MARKSMANSHIP; } i = mpFindMaxFloat(playercount, metrics[0].ksratio, metrics[1].ksratio, metrics[2].ksratio, metrics[3].ksratio); if (metrics[i].ksratio > 0.0f) { metrics[i].awards |= AWARD_MOSTPROFESSIONAL; } i = mpFindMaxFloat(playercount, metrics[0].kdratio, metrics[1].kdratio, metrics[2].kdratio, metrics[3].kdratio); if (metrics[i].kdratio > 0.0f) { metrics[i].awards |= AWARD_MOSTDEADLY; } i = mpFindMinFloat(playercount, metrics[0].kdratio, metrics[1].kdratio, metrics[2].kdratio, metrics[3].kdratio); if (PLAYERCOUNT() >= 2) { metrics[i].awards |= AWARD_MOSTHARMLESS; } i = mpFindMinInt(playercount, metrics[0].drawplayercount, metrics[1].drawplayercount, metrics[2].drawplayercount, metrics[3].drawplayercount); if (PLAYERCOUNT() >= 2) { metrics[i].awards |= AWARD_MOSTCOWARDLY; } i = mpFindMaxFloat(playercount, metrics[0].avgkmperhour, metrics[1].avgkmperhour, metrics[2].avgkmperhour, metrics[3].avgkmperhour); if (metrics[i].avgkmperhour > 10.0f) { metrics[i].awards |= AWARD_MOSTFRANTIC; } i = mpFindMinInt(playercount, metrics[0].backshotcount, metrics[1].backshotcount, metrics[2].backshotcount, metrics[3].backshotcount); metrics[i].awards |= AWARD_MOSTHONORABLE; i = mpFindMaxInt(playercount, metrics[0].backshotcount, metrics[1].backshotcount, metrics[2].backshotcount, metrics[3].backshotcount); if (metrics[i].backshotcount > 0 && (metrics[i].awards & AWARD_MOSTHONORABLE) == 0) { metrics[i].awards |= AWARD_MOSTDISHONORABLE; } i = mpFindMaxInt(playercount, metrics[0].longestlife, metrics[1].longestlife, metrics[2].longestlife, metrics[3].longestlife); if (metrics[i].longestlife > 0) { metrics[i].awards |= AWARD_LONGESTLIFE; } i = mpFindMinInt(playercount, metrics[0].shortestlife, metrics[1].shortestlife, metrics[2].shortestlife, metrics[3].shortestlife); if (metrics[i].shortestlife > 0 && metrics[i].numdeaths > 0) { metrics[i].awards |= AWARD_SHORTESTLIFE; } for (i = 0; i < playercount; i++) { if (g_Vars.playerstats[i].maxsimulkills == 4) { metrics[i].awards |= AWARD_QUADKILL; } else if (g_Vars.playerstats[i].maxsimulkills == 3) { metrics[i].awards |= AWARD_TRIPLEKILL; } else if (g_Vars.playerstats[i].maxsimulkills == 2) { metrics[i].awards |= AWARD_DOUBLEKILL; } } // These loops would have printed each player's awards for (i = 0; i < playercount; i++) { for (j = 0; j < 17; j++) { if (metrics[i].awards & (1 << j)); } } // For each player, choose which two awards to actually give them. // Note that the first award checked is quad kill, but after that the awards // are checked randomly. So if a player has quad kill they'll definitely see // it on the endscreen, but this is not the case for triple kill or any // other awards. for (i = 0; i < playercount; i++) { s32 numdone = 0; s32 awardindex = 16; if (playercount == 1) { // In a single player game, only allow the following awards metrics[i].awards &= 0 | AWARD_MARKSMANSHIP | AWARD_MOSTPROFESSIONAL | AWARD_MOSTDEADLY | AWARD_MOSTFRANTIC | AWARD_MOSTHONORABLE | AWARD_DOUBLEKILL | AWARD_TRIPLEKILL | AWARD_QUADKILL; } while (numdone == 0) { if (metrics[i].awards & (1 << awardindex)) { metrics[i].awards &= ~(1 << awardindex); g_Vars.players[i]->award1 = langGet(g_AwardNames[awardindex]); numdone = 1; } if (metrics[i].awards == 0) { numdone = 1; } awardindex = random() % 17; } while (numdone < 2) { awardindex = random() % 17; if (metrics[i].awards & (1 << awardindex)) { metrics[i].awards &= ~(1 << awardindex); g_Vars.players[i]->award2 = langGet(g_AwardNames[awardindex]); numdone = 2; } if (metrics[i].awards == 0) { numdone = 2; } } } // Calculate KillMaster and Survivor medals if (numchrs >= 2) { s32 mostkillsvalue = 0; s32 mostkillsplayer = -1; s32 leastdeathsvalue = 0xffffff; s32 leastdeathsplayer = -1; s32 k; for (k = 0; k < MAX_MPCHRS; k++) { if (g_MpSetup.chrslots & (1 << k)) { s32 totalkills = 0; struct mpchrconfig *mpchr = MPCHR(k); for (j = 0; j < MAX_MPCHRS; j++) { // @bug: i should be k. The value of i was incremented after // the last iteration of its loop above so it'll be between // 1 and 4 inclusively depending on the number of players. // The bot nums start from 4 regardless of how many players // there are. So in a game with 4 humans, the kills on the // first bot will not be considered for the killmaster medal // which means the medal could go to a player who got fewer // total kills. Additionally, suicides are counted as kills // while the intention here was to omit them. if (i != j) { totalkills += mpchr->killcounts[j]; } } if (totalkills == mostkillsvalue) { mostkillsplayer = -1; } if (totalkills > mostkillsvalue) { mostkillsplayer = k; mostkillsvalue = totalkills; } if (mpchr->numdeaths == leastdeathsvalue) { leastdeathsplayer = -1; } if (mpchr->numdeaths < leastdeathsvalue) { leastdeathsplayer = k; leastdeathsvalue = mpchr->numdeaths; } } } if (!g_CheatsActiveBank0 && !g_CheatsActiveBank1) { if (mostkillsplayer < 4 && mostkillsplayer >= 0) { struct mpplayerconfig *mpplayer = (struct mpplayerconfig *)MPCHR(mostkillsplayer); mpplayer->medals |= MEDAL_KILLMASTER; mpplayer->killmastermedals++; } if (leastdeathsplayer < 4 && leastdeathsplayer >= 0) { struct mpplayerconfig *mpplayer = (struct mpplayerconfig *)MPCHR(leastdeathsplayer); mpplayer->medals |= MEDAL_SURVIVOR; mpplayer->survivormedals++; } } } // Calculate Headshot and Accuracy medals if (!g_CheatsActiveBank0 && !g_CheatsActiveBank1 && playercount >= 2) { s32 mostheadshotvalue = 0; f32 mostaccuratevalue = 0.5f; s32 mostheadshotplayer = -1; s32 mostaccurateplayer = -1; for (i = 0; i < playercount; i++) { if (mostheadshotvalue == metrics[i].numheadshots) { mostheadshotplayer = -1; } if (metrics[i].numheadshots > mostheadshotvalue) { mostheadshotplayer = i; mostheadshotvalue = metrics[i].numheadshots; } if (metrics[i].accuracyfrac > mostaccuratevalue) { mostaccurateplayer = i; mostaccuratevalue = metrics[i].accuracyfrac; } } if (mostheadshotplayer >= 0) { struct mpplayerconfig *mpplayer = (struct mpplayerconfig *)mpGetChrConfigBySlotNum(mostheadshotplayer); mpplayer->medals |= MEDAL_HEADSHOT; mpplayer->headshotmedals++; } if (mostaccurateplayer >= 0) { struct mpplayerconfig *mpplayer = (struct mpplayerconfig *)mpGetChrConfigBySlotNum(mostaccurateplayer); mpplayer->medals |= MEDAL_ACCURACY; mpplayer->accuracymedals++; } } // Recalculate title for all players for (i = 0; i < playercount; i++) { struct mpplayerconfig *mpchr = (struct mpplayerconfig *)mpGetChrConfigBySlotNum(i); mpCalculatePlayerTitle(mpchr); } } #else GLOBAL_ASM( glabel mpCalculateAwards .late_rodata glabel var7f1b8d98 .word 0x4852f000 glabel var7f1b8d9c .word 0x47c35000 glabel var7f1b8da0 .word 0x461c4000 glabel var7f1b8da4 .word 0x3e99999a glabel var7f1b8da8 .word 0x3f333333 glabel var7f1b8dac .word 0x3dcccccd glabel var7f1b8db0 .word 0x3dcccccd .text /* f184908: 27bdfdf0 */ addiu $sp,$sp,-528 /* f18490c: 3c02800a */ lui $v0,0x800a /* f184910: 2442e6c0 */ addiu $v0,$v0,-6464 /* f184914: 8c4e006c */ lw $t6,0x6c($v0) /* f184918: afbf0044 */ sw $ra,0x44($sp) /* f18491c: afbe0040 */ sw $s8,0x40($sp) /* f184920: afb7003c */ sw $s7,0x3c($sp) /* f184924: afb60038 */ sw $s6,0x38($sp) /* f184928: afb50034 */ sw $s5,0x34($sp) /* f18492c: afb40030 */ sw $s4,0x30($sp) /* f184930: afb3002c */ sw $s3,0x2c($sp) /* f184934: afb20028 */ sw $s2,0x28($sp) /* f184938: afb10024 */ sw $s1,0x24($sp) /* f18493c: 11c00004 */ beqz $t6,.NB0f184950 /* f184940: afb00020 */ sw $s0,0x20($sp) /* f184944: 240f0001 */ addiu $t7,$zero,0x1 /* f184948: 10000002 */ beqz $zero,.NB0f184954 /* f18494c: afaf006c */ sw $t7,0x6c($sp) .NB0f184950: /* f184950: afa0006c */ sw $zero,0x6c($sp) .NB0f184954: /* f184954: 8c580068 */ lw $t8,0x68($v0) /* f184958: 13000003 */ beqz $t8,.NB0f184968 /* f18495c: 24190001 */ addiu $t9,$zero,0x1 /* f184960: 10000002 */ beqz $zero,.NB0f18496c /* f184964: afb90070 */ sw $t9,0x70($sp) .NB0f184968: /* f184968: afa00070 */ sw $zero,0x70($sp) .NB0f18496c: /* f18496c: 8c4d0064 */ lw $t5,0x64($v0) /* f184970: 11a00003 */ beqz $t5,.NB0f184980 /* f184974: 240e0001 */ addiu $t6,$zero,0x1 /* f184978: 10000002 */ beqz $zero,.NB0f184984 /* f18497c: afae0074 */ sw $t6,0x74($sp) .NB0f184980: /* f184980: afa00074 */ sw $zero,0x74($sp) .NB0f184984: /* f184984: 8c4f0070 */ lw $t7,0x70($v0) /* f184988: 8fb80074 */ lw $t8,0x74($sp) /* f18498c: 8fad0070 */ lw $t5,0x70($sp) /* f184990: 51e00004 */ beqzl $t7,.NB0f1849a4 /* f184994: 00009025 */ or $s2,$zero,$zero /* f184998: 10000002 */ beqz $zero,.NB0f1849a4 /* f18499c: 24120001 */ addiu $s2,$zero,0x1 /* f1849a0: 00009025 */ or $s2,$zero,$zero .NB0f1849a4: /* f1849a4: 8faf006c */ lw $t7,0x6c($sp) /* f1849a8: 0258c821 */ addu $t9,$s2,$t8 /* f1849ac: 032d7021 */ addu $t6,$t9,$t5 /* f1849b0: 01cf8021 */ addu $s0,$t6,$t7 /* f1849b4: 0fc2ff91 */ jal playerGetMissionTime /* f1849b8: afb0020c */ sw $s0,0x20c($sp) /* f1849bc: 0c00d474 */ jal func00033dd8 /* f1849c0: afa201fc */ sw $v0,0x1fc($sp) /* f1849c4: 0fc60a7a */ jal mpGetPlayerRankings /* f1849c8: 27a400f8 */ addiu $a0,$sp,0xf8 /* f1849cc: 3c18800a */ lui $t8,0x800a /* f1849d0: 8f18e94c */ lw $t8,-0x16b4($t8) /* f1849d4: afa200f4 */ sw $v0,0xf4($sp) /* f1849d8: 0000b025 */ or $s6,$zero,$zero /* f1849dc: 1a0001dc */ blez $s0,.NB0f185150 /* f1849e0: afb80200 */ sw $t8,0x200($sp) /* f1849e4: 8fb901fc */ lw $t9,0x1fc($sp) /* f1849e8: 3c017f1b */ lui $at,0x7f1b /* f1849ec: c4283380 */ lwc1 $f8,0x3380($at) /* f1849f0: 272d0001 */ addiu $t5,$t9,0x1 /* f1849f4: 448d2000 */ mtc1 $t5,$f4 /* f1849f8: 3c14800a */ lui $s4,0x800a /* f1849fc: 3c1e800b */ lui $s8,0x800b /* f184a00: 468021a0 */ cvt.s.w $f6,$f4 /* f184a04: 3c11800b */ lui $s1,0x800b /* f184a08: 26311438 */ addiu $s1,$s1,0x1438 /* f184a0c: 27de1068 */ addiu $s8,$s8,0x1068 /* f184a10: 2694e6c0 */ addiu $s4,$s4,-6464 /* f184a14: 27b3010c */ addiu $s3,$sp,0x10c /* f184a18: 46083283 */ div.s $f10,$f6,$f8 /* f184a1c: 0000a825 */ or $s5,$zero,$zero /* f184a20: 2417000c */ addiu $s7,$zero,0xc /* f184a24: e7aa004c */ swc1 $f10,0x4c($sp) .NB0f184a28: /* f184a28: 0fc61a7b */ jal mpGetChrConfigBySlotNum /* f184a2c: 02c02025 */ or $a0,$s6,$zero /* f184a30: 00409025 */ or $s2,$v0,$zero /* f184a34: 00408025 */ or $s0,$v0,$zero /* f184a38: 0fc48d5b */ jal setCurrentPlayerNum /* f184a3c: 02c02025 */ or $a0,$s6,$zero /* f184a40: 3c02800a */ lui $v0,0x800a /* f184a44: 2442e6c0 */ addiu $v0,$v0,-6464 /* f184a48: 8c4e0284 */ lw $t6,0x284($v0) /* f184a4c: 00002025 */ or $a0,$zero,$zero /* f184a50: adc01974 */ sw $zero,0x1974($t6) /* f184a54: 8c4f0284 */ lw $t7,0x284($v0) /* f184a58: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184a5c: ade01978 */ sw $zero,0x1978($t7) /* f184a60: ae620000 */ sw $v0,0x0($s3) /* f184a64: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184a68: 24040001 */ addiu $a0,$zero,0x1 /* f184a6c: ae620004 */ sw $v0,0x4($s3) /* f184a70: ae600008 */ sw $zero,0x8($s3) /* f184a74: ae60000c */ sw $zero,0xc($s3) /* f184a78: ae600010 */ sw $zero,0x10($s3) /* f184a7c: 00163040 */ sll $a2,$s6,0x1 /* f184a80: 00002025 */ or $a0,$zero,$zero /* f184a84: 02402825 */ or $a1,$s2,$zero .NB0f184a88: /* f184a88: 54c40007 */ bnel $a2,$a0,.NB0f184aa8 /* f184a8c: 8e6e0008 */ lw $t6,0x8($s3) /* f184a90: 8e780010 */ lw $t8,0x10($s3) /* f184a94: 84b90024 */ lh $t9,0x24($a1) /* f184a98: 03196821 */ addu $t5,$t8,$t9 /* f184a9c: 10000005 */ beqz $zero,.NB0f184ab4 /* f184aa0: ae6d0010 */ sw $t5,0x10($s3) /* f184aa4: 8e6e0008 */ lw $t6,0x8($s3) .NB0f184aa8: /* f184aa8: 84af0024 */ lh $t7,0x24($a1) /* f184aac: 01cfc021 */ addu $t8,$t6,$t7 /* f184ab0: ae780008 */ sw $t8,0x8($s3) .NB0f184ab4: /* f184ab4: 24840002 */ addiu $a0,$a0,0x2 /* f184ab8: 28810018 */ slti $at,$a0,0x18 /* f184abc: 1420fff2 */ bnez $at,.NB0f184a88 /* f184ac0: 24a50002 */ addiu $a1,$a1,0x2 /* f184ac4: 00001825 */ or $v1,$zero,$zero /* f184ac8: 240500a0 */ addiu $a1,$zero,0xa0 .NB0f184acc: /* f184acc: 28610004 */ slti $at,$v1,0x4 /* f184ad0: 10200006 */ beqz $at,.NB0f184aec /* f184ad4: 00036880 */ sll $t5,$v1,0x2 /* f184ad8: 00650019 */ multu $v1,$a1 /* f184adc: 0000c812 */ mflo $t9 /* f184ae0: 03d91021 */ addu $v0,$s8,$t9 /* f184ae4: 1000000a */ beqz $zero,.NB0f184b10 /* f184ae8: 0055c821 */ addu $t9,$v0,$s5 .NB0f184aec: /* f184aec: 01a36821 */ addu $t5,$t5,$v1 /* f184af0: 000d6880 */ sll $t5,$t5,0x2 /* f184af4: 01a36823 */ subu $t5,$t5,$v1 /* f184af8: 000d6880 */ sll $t5,$t5,0x2 /* f184afc: 3c0f800b */ lui $t7,0x800b /* f184b00: 25ef0de8 */ addiu $t7,$t7,0xde8 /* f184b04: 25aefed0 */ addiu $t6,$t5,-304 /* f184b08: 01cf1021 */ addu $v0,$t6,$t7 /* f184b0c: 0055c821 */ addu $t9,$v0,$s5 .NB0f184b10: /* f184b10: 872d0024 */ lh $t5,0x24($t9) /* f184b14: 8e78000c */ lw $t8,0xc($s3) /* f184b18: 24630001 */ addiu $v1,$v1,0x1 /* f184b1c: 2861000c */ slti $at,$v1,0xc /* f184b20: 030d7021 */ addu $t6,$t8,$t5 /* f184b24: 1420ffe9 */ bnez $at,.NB0f184acc /* f184b28: ae6e000c */ sw $t6,0xc($s3) /* f184b2c: 8e6f0008 */ lw $t7,0x8($s3) /* f184b30: 3c013f80 */ lui $at,0x3f80 /* f184b34: 44811000 */ mtc1 $at,$f2 /* f184b38: 448f8000 */ mtc1 $t7,$f16 /* f184b3c: 3c0142c8 */ lui $at,0x42c8 /* f184b40: 44812000 */ mtc1 $at,$f4 /* f184b44: 468084a0 */ cvt.s.w $f18,$f16 /* f184b48: 8e790000 */ lw $t9,0x0($s3) /* f184b4c: 01c0c025 */ or $t8,$t6,$zero /* f184b50: 8e8d00b0 */ lw $t5,0xb0($s4) /* f184b54: 44993000 */ mtc1 $t9,$f6 /* f184b58: 8e8e00a8 */ lw $t6,0xa8($s4) /* f184b5c: 46049002 */ mul.s $f0,$f18,$f4 /* f184b60: 44989000 */ mtc1 $t8,$f18 /* f184b64: 3c017f1b */ lui $at,0x7f1b /* f184b68: ae6d001c */ sw $t5,0x1c($s3) /* f184b6c: ae6e0020 */ sw $t6,0x20($s3) /* f184b70: 8e8f00c0 */ lw $t7,0xc0($s4) /* f184b74: 46803220 */ cvt.s.w $f8,$f6 /* f184b78: 8e9900c4 */ lw $t9,0xc4($s4) /* f184b7c: 24040005 */ addiu $a0,$zero,0x5 /* f184b80: 46809120 */ cvt.s.w $f4,$f18 /* f184b84: 46024280 */ add.s $f10,$f8,$f2 /* f184b88: 46022180 */ add.s $f6,$f4,$f2 /* f184b8c: 460a0403 */ div.s $f16,$f0,$f10 /* f184b90: c68a00ac */ lwc1 $f10,0xac($s4) /* f184b94: 46060203 */ div.s $f8,$f0,$f6 /* f184b98: e6700014 */ swc1 $f16,0x14($s3) /* f184b9c: e6680018 */ swc1 $f8,0x18($s3) /* f184ba0: c4303384 */ lwc1 $f16,0x3384($at) /* f184ba4: c7a4004c */ lwc1 $f4,0x4c($sp) /* f184ba8: c68800b4 */ lwc1 $f8,0xb4($s4) /* f184bac: 46105483 */ div.s $f18,$f10,$f16 /* f184bb0: ae60002c */ sw $zero,0x2c($s3) /* f184bb4: ae6f0030 */ sw $t7,0x30($s3) /* f184bb8: ae790034 */ sw $t9,0x34($s3) /* f184bbc: e6680028 */ swc1 $f8,0x28($s3) /* f184bc0: 46049183 */ div.s $f6,$f18,$f4 /* f184bc4: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184bc8: e6660024 */ swc1 $f6,0x24($s3) /* f184bcc: afa20068 */ sw $v0,0x68($sp) /* f184bd0: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184bd4: 24040004 */ addiu $a0,$zero,0x4 /* f184bd8: afa2006c */ sw $v0,0x6c($sp) /* f184bdc: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184be0: 24040003 */ addiu $a0,$zero,0x3 /* f184be4: afa20070 */ sw $v0,0x70($sp) /* f184be8: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184bec: 24040002 */ addiu $a0,$zero,0x2 /* f184bf0: afa20074 */ sw $v0,0x74($sp) /* f184bf4: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184bf8: 24040001 */ addiu $a0,$zero,0x1 /* f184bfc: 00409025 */ or $s2,$v0,$zero /* f184c00: 0fc2b8a3 */ jal mpstatsGetPlayerShotCountByRegion /* f184c04: 24040006 */ addiu $a0,$zero,0x6 /* f184c08: 8e630000 */ lw $v1,0x0($s3) /* f184c0c: 3c013f80 */ lui $at,0x3f80 /* f184c10: 44810000 */ mtc1 $at,$f0 /* f184c14: 18600011 */ blez $v1,.NB0f184c5c /* f184c18: 26d60001 */ addiu $s6,$s6,0x1 /* f184c1c: 8fad0074 */ lw $t5,0x74($sp) /* f184c20: 8faf0070 */ lw $t7,0x70($sp) /* f184c24: 0052c021 */ addu $t8,$v0,$s2 /* f184c28: 030d7021 */ addu $t6,$t8,$t5 /* f184c2c: 8fb8006c */ lw $t8,0x6c($sp) /* f184c30: 01cfc821 */ addu $t9,$t6,$t7 /* f184c34: 8fae0068 */ lw $t6,0x68($sp) /* f184c38: 03386821 */ addu $t5,$t9,$t8 /* f184c3c: 44839000 */ mtc1 $v1,$f18 /* f184c40: 01ae7821 */ addu $t7,$t5,$t6 /* f184c44: 448f5000 */ mtc1 $t7,$f10 /* f184c48: 46809120 */ cvt.s.w $f4,$f18 /* f184c4c: 46805420 */ cvt.s.w $f16,$f10 /* f184c50: 46048183 */ div.s $f6,$f16,$f4 /* f184c54: 10000004 */ beqz $zero,.NB0f184c68 /* f184c58: e6660038 */ swc1 $f6,0x38($s3) .NB0f184c5c: /* f184c5c: 44804000 */ mtc1 $zero,$f8 /* f184c60: 00000000 */ sll $zero,$zero,0x0 /* f184c64: e6680038 */ swc1 $f8,0x38($s3) .NB0f184c68: /* f184c68: c66a0038 */ lwc1 $f10,0x38($s3) /* f184c6c: 3c19800a */ lui $t9,0x800a /* f184c70: 3c18800a */ lui $t8,0x800a /* f184c74: 460a003c */ c.lt.s $f0,$f10 /* f184c78: 00000000 */ sll $zero,$zero,0x0 /* f184c7c: 45020003 */ bc1fl .NB0f184c8c /* f184c80: a2000094 */ sb $zero,0x94($s0) /* f184c84: e6600038 */ swc1 $f0,0x38($s3) /* f184c88: a2000094 */ sb $zero,0x94($s0) .NB0f184c8c: /* f184c8c: 8f3966c0 */ lw $t9,0x66c0($t9) /* f184c90: 5720012b */ bnezl $t9,.NB0f185140 /* f184c94: 8fad020c */ lw $t5,0x20c($sp) /* f184c98: 8f1866c4 */ lw $t8,0x66c4($t8) /* f184c9c: 57000128 */ bnezl $t8,.NB0f185140 /* f184ca0: 8fad020c */ lw $t5,0x20c($sp) /* f184ca4: 8e0d0054 */ lw $t5,0x54($s0) /* f184ca8: 8e6e0008 */ lw $t6,0x8($s3) /* f184cac: 8e190058 */ lw $t9,0x58($s0) /* f184cb0: 2401003c */ addiu $at,$zero,0x3c /* f184cb4: 01ae7821 */ addu $t7,$t5,$t6 /* f184cb8: ae0f0054 */ sw $t7,0x54($s0) /* f184cbc: 8e78000c */ lw $t8,0xc($s3) /* f184cc0: 8e0e005c */ lw $t6,0x5c($s0) /* f184cc4: 03386821 */ addu $t5,$t9,$t8 /* f184cc8: 25cf0001 */ addiu $t7,$t6,0x1 /* f184ccc: ae0d0058 */ sw $t5,0x58($s0) /* f184cd0: ae0f005c */ sw $t7,0x5c($s0) /* f184cd4: 8fb801fc */ lw $t8,0x1fc($sp) /* f184cd8: 8e190068 */ lw $t9,0x68($s0) /* f184cdc: 0301001a */ div $zero,$t8,$at /* f184ce0: 00006812 */ mflo $t5 /* f184ce4: 032d7021 */ addu $t6,$t9,$t5 /* f184ce8: ae0e0068 */ sw $t6,0x68($s0) /* f184cec: 3c017f1b */ lui $at,0x7f1b /* f184cf0: c4303388 */ lwc1 $f16,0x3388($at) /* f184cf4: c69200ac */ lwc1 $f18,0xac($s4) /* f184cf8: 24180001 */ addiu $t8,$zero,0x1 /* f184cfc: 3c014f00 */ lui $at,0x4f00 /* f184d00: 46109103 */ div.s $f4,$f18,$f16 /* f184d04: 444ff800 */ cfc1 $t7,$31 /* f184d08: 44d8f800 */ ctc1 $t8,$31 /* f184d0c: 00000000 */ sll $zero,$zero,0x0 /* f184d10: 460021a4 */ cvt.w.s $f6,$f4 /* f184d14: 4458f800 */ cfc1 $t8,$31 /* f184d18: 00000000 */ sll $zero,$zero,0x0 /* f184d1c: 33180078 */ andi $t8,$t8,0x78 /* f184d20: 53000013 */ beqzl $t8,.NB0f184d70 /* f184d24: 44183000 */ mfc1 $t8,$f6 /* f184d28: 44813000 */ mtc1 $at,$f6 /* f184d2c: 24180001 */ addiu $t8,$zero,0x1 /* f184d30: 46062181 */ sub.s $f6,$f4,$f6 /* f184d34: 44d8f800 */ ctc1 $t8,$31 /* f184d38: 00000000 */ sll $zero,$zero,0x0 /* f184d3c: 460031a4 */ cvt.w.s $f6,$f6 /* f184d40: 4458f800 */ cfc1 $t8,$31 /* f184d44: 00000000 */ sll $zero,$zero,0x0 /* f184d48: 33180078 */ andi $t8,$t8,0x78 /* f184d4c: 17000005 */ bnez $t8,.NB0f184d64 /* f184d50: 00000000 */ sll $zero,$zero,0x0 /* f184d54: 44183000 */ mfc1 $t8,$f6 /* f184d58: 3c018000 */ lui $at,0x8000 /* f184d5c: 10000007 */ beqz $zero,.NB0f184d7c /* f184d60: 0301c025 */ or $t8,$t8,$at .NB0f184d64: /* f184d64: 10000005 */ beqz $zero,.NB0f184d7c /* f184d68: 2418ffff */ addiu $t8,$zero,-1 /* f184d6c: 44183000 */ mfc1 $t8,$f6 .NB0f184d70: /* f184d70: 00000000 */ sll $zero,$zero,0x0 /* f184d74: 0700fffb */ bltz $t8,.NB0f184d64 /* f184d78: 00000000 */ sll $zero,$zero,0x0 .NB0f184d7c: /* f184d7c: 8e19006c */ lw $t9,0x6c($s0) /* f184d80: 8e0e0070 */ lw $t6,0x70($s0) /* f184d84: 3c017f1b */ lui $at,0x7f1b /* f184d88: 03386821 */ addu $t5,$t9,$t8 /* f184d8c: ae0d006c */ sw $t5,0x6c($s0) /* f184d90: 44cff800 */ ctc1 $t7,$31 /* f184d94: c42a338c */ lwc1 $f10,0x338c($at) /* f184d98: c6680038 */ lwc1 $f8,0x38($s3) /* f184d9c: 448e8000 */ mtc1 $t6,$f16 /* f184da0: 3c014f80 */ lui $at,0x4f80 /* f184da4: 460a4482 */ mul.s $f18,$f8,$f10 /* f184da8: 05c10004 */ bgez $t6,.NB0f184dbc /* f184dac: 46808120 */ cvt.s.w $f4,$f16 /* f184db0: 44813000 */ mtc1 $at,$f6 /* f184db4: 00000000 */ sll $zero,$zero,0x0 /* f184db8: 46062100 */ add.s $f4,$f4,$f6 .NB0f184dbc: /* f184dbc: 3c01447a */ lui $at,0x447a /* f184dc0: 44814000 */ mtc1 $at,$f8 /* f184dc4: 3c017f1b */ lui $at,0x7f1b /* f184dc8: c4303390 */ lwc1 $f16,0x3390($at) /* f184dcc: 46082283 */ div.s $f10,$f4,$f8 /* f184dd0: 3c01447a */ lui $at,0x447a /* f184dd4: 44814000 */ mtc1 $at,$f8 /* f184dd8: 24190001 */ addiu $t9,$zero,0x1 /* f184ddc: 3c014f00 */ lui $at,0x4f00 /* f184de0: 46105182 */ mul.s $f6,$f10,$f16 /* f184de4: 46069100 */ add.s $f4,$f18,$f6 /* f184de8: 46082282 */ mul.s $f10,$f4,$f8 /* f184dec: 444ff800 */ cfc1 $t7,$31 /* f184df0: 44d9f800 */ ctc1 $t9,$31 /* f184df4: 00000000 */ sll $zero,$zero,0x0 /* f184df8: 46005424 */ cvt.w.s $f16,$f10 /* f184dfc: 4459f800 */ cfc1 $t9,$31 /* f184e00: 00000000 */ sll $zero,$zero,0x0 /* f184e04: 33390078 */ andi $t9,$t9,0x78 /* f184e08: 53200013 */ beqzl $t9,.NB0f184e58 /* f184e0c: 44198000 */ mfc1 $t9,$f16 /* f184e10: 44818000 */ mtc1 $at,$f16 /* f184e14: 24190001 */ addiu $t9,$zero,0x1 /* f184e18: 46105401 */ sub.s $f16,$f10,$f16 /* f184e1c: 44d9f800 */ ctc1 $t9,$31 /* f184e20: 00000000 */ sll $zero,$zero,0x0 /* f184e24: 46008424 */ cvt.w.s $f16,$f16 /* f184e28: 4459f800 */ cfc1 $t9,$31 /* f184e2c: 00000000 */ sll $zero,$zero,0x0 /* f184e30: 33390078 */ andi $t9,$t9,0x78 /* f184e34: 17200005 */ bnez $t9,.NB0f184e4c /* f184e38: 00000000 */ sll $zero,$zero,0x0 /* f184e3c: 44198000 */ mfc1 $t9,$f16 /* f184e40: 3c018000 */ lui $at,0x8000 /* f184e44: 10000007 */ beqz $zero,.NB0f184e64 /* f184e48: 0321c825 */ or $t9,$t9,$at .NB0f184e4c: /* f184e4c: 10000005 */ beqz $zero,.NB0f184e64 /* f184e50: 2419ffff */ addiu $t9,$zero,-1 /* f184e54: 44198000 */ mfc1 $t9,$f16 .NB0f184e58: /* f184e58: 00000000 */ sll $zero,$zero,0x0 /* f184e5c: 0720fffb */ bltz $t9,.NB0f184e4c /* f184e60: 00000000 */ sll $zero,$zero,0x0 .NB0f184e64: /* f184e64: ae190070 */ sw $t9,0x70($s0) /* f184e68: 3c017f1b */ lui $at,0x7f1b /* f184e6c: 44cff800 */ ctc1 $t7,$31 /* f184e70: c4263394 */ lwc1 $f6,0x3394($at) /* f184e74: c69200f0 */ lwc1 $f18,0xf0($s4) /* f184e78: 240d0001 */ addiu $t5,$zero,0x1 /* f184e7c: 3c014f00 */ lui $at,0x4f00 /* f184e80: 46069103 */ div.s $f4,$f18,$f6 /* f184e84: 4458f800 */ cfc1 $t8,$31 /* f184e88: 44cdf800 */ ctc1 $t5,$31 /* f184e8c: 00000000 */ sll $zero,$zero,0x0 /* f184e90: 46002224 */ cvt.w.s $f8,$f4 /* f184e94: 444df800 */ cfc1 $t5,$31 /* f184e98: 00000000 */ sll $zero,$zero,0x0 /* f184e9c: 31ad0078 */ andi $t5,$t5,0x78 /* f184ea0: 51a00013 */ beqzl $t5,.NB0f184ef0 /* f184ea4: 440d4000 */ mfc1 $t5,$f8 /* f184ea8: 44814000 */ mtc1 $at,$f8 /* f184eac: 240d0001 */ addiu $t5,$zero,0x1 /* f184eb0: 46082201 */ sub.s $f8,$f4,$f8 /* f184eb4: 44cdf800 */ ctc1 $t5,$31 /* f184eb8: 00000000 */ sll $zero,$zero,0x0 /* f184ebc: 46004224 */ cvt.w.s $f8,$f8 /* f184ec0: 444df800 */ cfc1 $t5,$31 /* f184ec4: 00000000 */ sll $zero,$zero,0x0 /* f184ec8: 31ad0078 */ andi $t5,$t5,0x78 /* f184ecc: 15a00005 */ bnez $t5,.NB0f184ee4 /* f184ed0: 00000000 */ sll $zero,$zero,0x0 /* f184ed4: 440d4000 */ mfc1 $t5,$f8 /* f184ed8: 3c018000 */ lui $at,0x8000 /* f184edc: 10000007 */ beqz $zero,.NB0f184efc /* f184ee0: 01a16825 */ or $t5,$t5,$at .NB0f184ee4: /* f184ee4: 10000005 */ beqz $zero,.NB0f184efc /* f184ee8: 240dffff */ addiu $t5,$zero,-1 /* f184eec: 440d4000 */ mfc1 $t5,$f8 .NB0f184ef0: /* f184ef0: 00000000 */ sll $zero,$zero,0x0 /* f184ef4: 05a0fffb */ bltz $t5,.NB0f184ee4 /* f184ef8: 00000000 */ sll $zero,$zero,0x0 .NB0f184efc: /* f184efc: 8e0e0074 */ lw $t6,0x74($s0) /* f184f00: 3c017f1b */ lui $at,0x7f1b /* f184f04: 44d8f800 */ ctc1 $t8,$31 /* f184f08: 01cd7821 */ addu $t7,$t6,$t5 /* f184f0c: ae0f0074 */ sw $t7,0x74($s0) /* f184f10: c4303398 */ lwc1 $f16,0x3398($at) /* f184f14: c68a00ec */ lwc1 $f10,0xec($s4) /* f184f18: 24180001 */ addiu $t8,$zero,0x1 /* f184f1c: 3c014f00 */ lui $at,0x4f00 /* f184f20: 46105483 */ div.s $f18,$f10,$f16 /* f184f24: 4459f800 */ cfc1 $t9,$31 /* f184f28: 44d8f800 */ ctc1 $t8,$31 /* f184f2c: 00000000 */ sll $zero,$zero,0x0 /* f184f30: 460091a4 */ cvt.w.s $f6,$f18 /* f184f34: 4458f800 */ cfc1 $t8,$31 /* f184f38: 00000000 */ sll $zero,$zero,0x0 /* f184f3c: 33180078 */ andi $t8,$t8,0x78 /* f184f40: 53000013 */ beqzl $t8,.NB0f184f90 /* f184f44: 44183000 */ mfc1 $t8,$f6 /* f184f48: 44813000 */ mtc1 $at,$f6 /* f184f4c: 24180001 */ addiu $t8,$zero,0x1 /* f184f50: 46069181 */ sub.s $f6,$f18,$f6 /* f184f54: 44d8f800 */ ctc1 $t8,$31 /* f184f58: 00000000 */ sll $zero,$zero,0x0 /* f184f5c: 460031a4 */ cvt.w.s $f6,$f6 /* f184f60: 4458f800 */ cfc1 $t8,$31 /* f184f64: 00000000 */ sll $zero,$zero,0x0 /* f184f68: 33180078 */ andi $t8,$t8,0x78 /* f184f6c: 17000005 */ bnez $t8,.NB0f184f84 /* f184f70: 00000000 */ sll $zero,$zero,0x0 /* f184f74: 44183000 */ mfc1 $t8,$f6 /* f184f78: 3c018000 */ lui $at,0x8000 /* f184f7c: 10000007 */ beqz $zero,.NB0f184f9c /* f184f80: 0301c025 */ or $t8,$t8,$at .NB0f184f84: /* f184f84: 10000005 */ beqz $zero,.NB0f184f9c /* f184f88: 2418ffff */ addiu $t8,$zero,-1 /* f184f8c: 44183000 */ mfc1 $t8,$f6 .NB0f184f90: /* f184f90: 00000000 */ sll $zero,$zero,0x0 /* f184f94: 0700fffb */ bltz $t8,.NB0f184f84 /* f184f98: 00000000 */ sll $zero,$zero,0x0 .NB0f184f9c: /* f184f9c: 8e0e0078 */ lw $t6,0x78($s0) /* f184fa0: 44d9f800 */ ctc1 $t9,$31 /* f184fa4: 8e0f007c */ lw $t7,0x7c($s0) /* f184fa8: 01d86821 */ addu $t5,$t6,$t8 /* f184fac: ae0d0078 */ sw $t5,0x78($s0) /* f184fb0: 8e790004 */ lw $t9,0x4($s3) /* f184fb4: 8e180080 */ lw $t8,0x80($s0) /* f184fb8: 01f97021 */ addu $t6,$t7,$t9 /* f184fbc: ae0e007c */ sw $t6,0x7c($s0) /* f184fc0: 8e6d0000 */ lw $t5,0x0($s3) /* f184fc4: 030d7821 */ addu $t7,$t8,$t5 /* f184fc8: ae0f0080 */ sw $t7,0x80($s0) /* f184fcc: 8fb900f4 */ lw $t9,0xf4($sp) /* f184fd0: 2b210002 */ slti $at,$t9,0x2 /* f184fd4: 5420005a */ bnezl $at,.NB0f185140 /* f184fd8: 8fad020c */ lw $t5,0x20c($sp) /* f184fdc: 8206001e */ lb $a2,0x1e($s0) /* f184fe0: 2727ffff */ addiu $a3,$t9,-1 /* f184fe4: 00002825 */ or $a1,$zero,$zero /* f184fe8: 14c00029 */ bnez $a2,.NB0f185090 /* f184fec: 00001825 */ or $v1,$zero,$zero /* f184ff0: 8e040020 */ lw $a0,0x20($s0) /* f184ff4: 28610004 */ slti $at,$v1,0x4 .NB0f184ff8: /* f184ff8: 10200006 */ beqz $at,.NB0f185014 /* f184ffc: 0003c080 */ sll $t8,$v1,0x2 /* f185000: 00037080 */ sll $t6,$v1,0x2 /* f185004: 01c37021 */ addu $t6,$t6,$v1 /* f185008: 000e7140 */ sll $t6,$t6,0x5 /* f18500c: 10000009 */ beqz $zero,.NB0f185034 /* f185010: 03ce1021 */ addu $v0,$s8,$t6 .NB0f185014: /* f185014: 0303c021 */ addu $t8,$t8,$v1 /* f185018: 0018c080 */ sll $t8,$t8,0x2 /* f18501c: 0303c023 */ subu $t8,$t8,$v1 /* f185020: 0018c080 */ sll $t8,$t8,0x2 /* f185024: 3c0f800b */ lui $t7,0x800b /* f185028: 25ef0de8 */ addiu $t7,$t7,0xde8 /* f18502c: 270dfed0 */ addiu $t5,$t8,-304 /* f185030: 01af1021 */ addu $v0,$t5,$t7 .NB0f185034: /* f185034: 8c590020 */ lw $t9,0x20($v0) /* f185038: 24630001 */ addiu $v1,$v1,0x1 /* f18503c: 1499000c */ bne $a0,$t9,.NB0f185070 /* f185040: 00000000 */ sll $zero,$zero,0x0 /* f185044: 1202000a */ beq $s0,$v0,.NB0f185070 /* f185048: 00000000 */ sll $zero,$zero,0x0 /* f18504c: 8e2e000c */ lw $t6,0xc($s1) /* f185050: 31d80002 */ andi $t8,$t6,0x2 /* f185054: 53000006 */ beqzl $t8,.NB0f185070 /* f185058: 24050001 */ addiu $a1,$zero,0x1 /* f18505c: 920d0011 */ lbu $t5,0x11($s0) /* f185060: 904f0011 */ lbu $t7,0x11($v0) /* f185064: 11af0002 */ beq $t5,$t7,.NB0f185070 /* f185068: 00000000 */ sll $zero,$zero,0x0 /* f18506c: 24050001 */ addiu $a1,$zero,0x1 .NB0f185070: /* f185070: 5477ffe1 */ bnel $v1,$s7,.NB0f184ff8 /* f185074: 28610004 */ slti $at,$v1,0x4 /* f185078: 14a00005 */ bnez $a1,.NB0f185090 /* f18507c: 00000000 */ sll $zero,$zero,0x0 /* f185080: 8e190060 */ lw $t9,0x60($s0) /* f185084: 8206001e */ lb $a2,0x1e($s0) /* f185088: 272e0001 */ addiu $t6,$t9,0x1 /* f18508c: ae0e0060 */ sw $t6,0x60($s0) .NB0f185090: /* f185090: 14e6002a */ bne $a3,$a2,.NB0f18513c /* f185094: 00002825 */ or $a1,$zero,$zero /* f185098: 00001825 */ or $v1,$zero,$zero /* f18509c: 8e040020 */ lw $a0,0x20($s0) /* f1850a0: 240600a0 */ addiu $a2,$zero,0xa0 /* f1850a4: 28610004 */ slti $at,$v1,0x4 .NB0f1850a8: /* f1850a8: 10200006 */ beqz $at,.NB0f1850c4 /* f1850ac: 00036880 */ sll $t5,$v1,0x2 /* f1850b0: 00660019 */ multu $v1,$a2 /* f1850b4: 0000c012 */ mflo $t8 /* f1850b8: 03d81021 */ addu $v0,$s8,$t8 /* f1850bc: 1000000a */ beqz $zero,.NB0f1850e8 /* f1850c0: 8c4e0020 */ lw $t6,0x20($v0) .NB0f1850c4: /* f1850c4: 01a36821 */ addu $t5,$t5,$v1 /* f1850c8: 000d6880 */ sll $t5,$t5,0x2 /* f1850cc: 01a36823 */ subu $t5,$t5,$v1 /* f1850d0: 000d6880 */ sll $t5,$t5,0x2 /* f1850d4: 3c19800b */ lui $t9,0x800b /* f1850d8: 27390de8 */ addiu $t9,$t9,0xde8 /* f1850dc: 25affed0 */ addiu $t7,$t5,-304 /* f1850e0: 01f91021 */ addu $v0,$t7,$t9 /* f1850e4: 8c4e0020 */ lw $t6,0x20($v0) .NB0f1850e8: /* f1850e8: 24630001 */ addiu $v1,$v1,0x1 /* f1850ec: 148e000c */ bne $a0,$t6,.NB0f185120 /* f1850f0: 00000000 */ sll $zero,$zero,0x0 /* f1850f4: 1202000a */ beq $s0,$v0,.NB0f185120 /* f1850f8: 00000000 */ sll $zero,$zero,0x0 /* f1850fc: 8e38000c */ lw $t8,0xc($s1) /* f185100: 330d0002 */ andi $t5,$t8,0x2 /* f185104: 51a00006 */ beqzl $t5,.NB0f185120 /* f185108: 24050001 */ addiu $a1,$zero,0x1 /* f18510c: 920f0011 */ lbu $t7,0x11($s0) /* f185110: 90590011 */ lbu $t9,0x11($v0) /* f185114: 11f90002 */ beq $t7,$t9,.NB0f185120 /* f185118: 00000000 */ sll $zero,$zero,0x0 /* f18511c: 24050001 */ addiu $a1,$zero,0x1 .NB0f185120: /* f185120: 5477ffe1 */ bnel $v1,$s7,.NB0f1850a8 /* f185124: 28610004 */ slti $at,$v1,0x4 /* f185128: 54a00005 */ bnezl $a1,.NB0f185140 /* f18512c: 8fad020c */ lw $t5,0x20c($sp) /* f185130: 8e0e0064 */ lw $t6,0x64($s0) /* f185134: 25d80001 */ addiu $t8,$t6,0x1 /* f185138: ae180064 */ sw $t8,0x64($s0) .NB0f18513c: /* f18513c: 8fad020c */ lw $t5,0x20c($sp) .NB0f185140: /* f185140: 2673003c */ addiu $s3,$s3,0x3c /* f185144: 26b50002 */ addiu $s5,$s5,0x2 /* f185148: 16cdfe37 */ bne $s6,$t5,.NB0f184a28 /* f18514c: 26940080 */ addiu $s4,$s4,0x80 .NB0f185150: /* f185150: 3c1e800b */ lui $s8,0x800b /* f185154: 27de1068 */ addiu $s8,$s8,0x1068 /* f185158: 2417000c */ addiu $s7,$zero,0xc /* f18515c: 0fc48d5b */ jal setCurrentPlayerNum /* f185160: 8fa40200 */ lw $a0,0x200($sp) /* f185164: 8faf01d0 */ lw $t7,0x1d0($sp) /* f185168: 8fa4020c */ lw $a0,0x20c($sp) /* f18516c: 8fa5011c */ lw $a1,0x11c($sp) /* f185170: 8fa60158 */ lw $a2,0x158($sp) /* f185174: 8fa70194 */ lw $a3,0x194($sp) /* f185178: 0fc6102a */ jal mpFindMaxInt /* f18517c: afaf0010 */ sw $t7,0x10($sp) /* f185180: 0002c900 */ sll $t9,$v0,0x4 /* f185184: 0322c823 */ subu $t9,$t9,$v0 /* f185188: 0019c880 */ sll $t9,$t9,0x2 /* f18518c: 27ae010c */ addiu $t6,$sp,0x10c /* f185190: 032e8021 */ addu $s0,$t9,$t6 /* f185194: 8e180010 */ lw $t8,0x10($s0) /* f185198: 5b000005 */ blezl $t8,.NB0f1851b0 /* f18519c: 8fb901c0 */ lw $t9,0x1c0($sp) /* f1851a0: 8e0d002c */ lw $t5,0x2c($s0) /* f1851a4: 35af0001 */ ori $t7,$t5,0x1 /* f1851a8: ae0f002c */ sw $t7,0x2c($s0) /* f1851ac: 8fb901c0 */ lw $t9,0x1c0($sp) .NB0f1851b0: /* f1851b0: 8fa4020c */ lw $a0,0x20c($sp) /* f1851b4: 8fa5010c */ lw $a1,0x10c($sp) /* f1851b8: 8fa60148 */ lw $a2,0x148($sp) /* f1851bc: 8fa70184 */ lw $a3,0x184($sp) /* f1851c0: 0fc6106c */ jal mpFindMinInt /* f1851c4: afb90010 */ sw $t9,0x10($sp) /* f1851c8: 00027100 */ sll $t6,$v0,0x4 /* f1851cc: 01c27023 */ subu $t6,$t6,$v0 /* f1851d0: 000e7080 */ sll $t6,$t6,0x2 /* f1851d4: 27b8010c */ addiu $t8,$sp,0x10c /* f1851d8: 01d88021 */ addu $s0,$t6,$t8 /* f1851dc: 8e0d0000 */ lw $t5,0x0($s0) /* f1851e0: 29a10064 */ slti $at,$t5,0x64 /* f1851e4: 50200005 */ beqzl $at,.NB0f1851fc /* f1851e8: c7a401e8 */ lwc1 $f4,0x1e8($sp) /* f1851ec: 8e0f002c */ lw $t7,0x2c($s0) /* f1851f0: 35f90002 */ ori $t9,$t7,0x2 /* f1851f4: ae19002c */ sw $t9,0x2c($s0) /* f1851f8: c7a401e8 */ lwc1 $f4,0x1e8($sp) .NB0f1851fc: /* f1851fc: 8fa4020c */ lw $a0,0x20c($sp) /* f185200: 8fa50134 */ lw $a1,0x134($sp) /* f185204: 8fa60170 */ lw $a2,0x170($sp) /* f185208: 8fa701ac */ lw $a3,0x1ac($sp) /* f18520c: 0fc61106 */ jal mpFindMinFloat /* f185210: e7a40010 */ swc1 $f4,0x10($sp) /* f185214: 00027100 */ sll $t6,$v0,0x4 /* f185218: 01c27023 */ subu $t6,$t6,$v0 /* f18521c: 000e7080 */ sll $t6,$t6,0x2 /* f185220: 27b8010c */ addiu $t8,$sp,0x10c /* f185224: 01d88021 */ addu $s0,$t6,$t8 /* f185228: 3c014000 */ lui $at,0x4000 /* f18522c: 44814000 */ mtc1 $at,$f8 /* f185230: c60a0028 */ lwc1 $f10,0x28($s0) /* f185234: 4608503e */ c.le.s $f10,$f8 /* f185238: 00000000 */ sll $zero,$zero,0x0 /* f18523c: 45020005 */ bc1fl .NB0f185254 /* f185240: c7b001e8 */ lwc1 $f16,0x1e8($sp) /* f185244: 8e0d002c */ lw $t5,0x2c($s0) /* f185248: 35af0004 */ ori $t7,$t5,0x4 /* f18524c: ae0f002c */ sw $t7,0x2c($s0) /* f185250: c7b001e8 */ lwc1 $f16,0x1e8($sp) .NB0f185254: /* f185254: 8fa4020c */ lw $a0,0x20c($sp) /* f185258: 8fa50134 */ lw $a1,0x134($sp) /* f18525c: 8fa60170 */ lw $a2,0x170($sp) /* f185260: 8fa701ac */ lw $a3,0x1ac($sp) /* f185264: 0fc610ae */ jal mpFindMaxFloat /* f185268: e7b00010 */ swc1 $f16,0x10($sp) /* f18526c: 0002c900 */ sll $t9,$v0,0x4 /* f185270: 0322c823 */ subu $t9,$t9,$v0 /* f185274: 0019c880 */ sll $t9,$t9,0x2 /* f185278: 27ae010c */ addiu $t6,$sp,0x10c /* f18527c: 032e8021 */ addu $s0,$t9,$t6 /* f185280: 3c0140c0 */ lui $at,0x40c0 /* f185284: 44819000 */ mtc1 $at,$f18 /* f185288: c6060028 */ lwc1 $f6,0x28($s0) /* f18528c: 4606903c */ c.lt.s $f18,$f6 /* f185290: 00000000 */ sll $zero,$zero,0x0 /* f185294: 45020005 */ bc1fl .NB0f1852ac /* f185298: 8faf01c4 */ lw $t7,0x1c4($sp) /* f18529c: 8e18002c */ lw $t8,0x2c($s0) /* f1852a0: 370d0008 */ ori $t5,$t8,0x8 /* f1852a4: ae0d002c */ sw $t5,0x2c($s0) /* f1852a8: 8faf01c4 */ lw $t7,0x1c4($sp) .NB0f1852ac: /* f1852ac: 8fa4020c */ lw $a0,0x20c($sp) /* f1852b0: 8fa50110 */ lw $a1,0x110($sp) /* f1852b4: 8fa6014c */ lw $a2,0x14c($sp) /* f1852b8: 8fa70188 */ lw $a3,0x188($sp) /* f1852bc: 0fc6102a */ jal mpFindMaxInt /* f1852c0: afaf0010 */ sw $t7,0x10($sp) /* f1852c4: 0002c900 */ sll $t9,$v0,0x4 /* f1852c8: 0322c823 */ subu $t9,$t9,$v0 /* f1852cc: 0019c880 */ sll $t9,$t9,0x2 /* f1852d0: 27ae010c */ addiu $t6,$sp,0x10c /* f1852d4: 032e8021 */ addu $s0,$t9,$t6 /* f1852d8: 8e180004 */ lw $t8,0x4($s0) /* f1852dc: 5b000005 */ blezl $t8,.NB0f1852f4 /* f1852e0: c7a401d4 */ lwc1 $f4,0x1d4($sp) /* f1852e4: 8e0d002c */ lw $t5,0x2c($s0) /* f1852e8: 35af0010 */ ori $t7,$t5,0x10 /* f1852ec: ae0f002c */ sw $t7,0x2c($s0) /* f1852f0: c7a401d4 */ lwc1 $f4,0x1d4($sp) .NB0f1852f4: /* f1852f4: 8fa4020c */ lw $a0,0x20c($sp) /* f1852f8: 8fa50120 */ lw $a1,0x120($sp) /* f1852fc: 8fa6015c */ lw $a2,0x15c($sp) /* f185300: 8fa70198 */ lw $a3,0x198($sp) /* f185304: 0fc610ae */ jal mpFindMaxFloat /* f185308: e7a40010 */ swc1 $f4,0x10($sp) /* f18530c: 0002c900 */ sll $t9,$v0,0x4 /* f185310: 0322c823 */ subu $t9,$t9,$v0 /* f185314: 0019c880 */ sll $t9,$t9,0x2 /* f185318: 27ae010c */ addiu $t6,$sp,0x10c /* f18531c: 032e8021 */ addu $s0,$t9,$t6 /* f185320: c60a0014 */ lwc1 $f10,0x14($s0) /* f185324: 44804000 */ mtc1 $zero,$f8 /* f185328: 00000000 */ sll $zero,$zero,0x0 /* f18532c: 460a403c */ c.lt.s $f8,$f10 /* f185330: 00000000 */ sll $zero,$zero,0x0 /* f185334: 45020005 */ bc1fl .NB0f18534c /* f185338: c7b001d8 */ lwc1 $f16,0x1d8($sp) /* f18533c: 8e18002c */ lw $t8,0x2c($s0) /* f185340: 370d0020 */ ori $t5,$t8,0x20 /* f185344: ae0d002c */ sw $t5,0x2c($s0) /* f185348: c7b001d8 */ lwc1 $f16,0x1d8($sp) .NB0f18534c: /* f18534c: 8fa4020c */ lw $a0,0x20c($sp) /* f185350: 8fa50124 */ lw $a1,0x124($sp) /* f185354: 8fa60160 */ lw $a2,0x160($sp) /* f185358: 8fa7019c */ lw $a3,0x19c($sp) /* f18535c: 0fc610ae */ jal mpFindMaxFloat /* f185360: e7b00010 */ swc1 $f16,0x10($sp) /* f185364: 00027900 */ sll $t7,$v0,0x4 /* f185368: 01e27823 */ subu $t7,$t7,$v0 /* f18536c: 000f7880 */ sll $t7,$t7,0x2 /* f185370: 27b9010c */ addiu $t9,$sp,0x10c /* f185374: 01f98021 */ addu $s0,$t7,$t9 /* f185378: c6060018 */ lwc1 $f6,0x18($s0) /* f18537c: 44809000 */ mtc1 $zero,$f18 /* f185380: 00000000 */ sll $zero,$zero,0x0 /* f185384: 4606903c */ c.lt.s $f18,$f6 /* f185388: 00000000 */ sll $zero,$zero,0x0 /* f18538c: 45020005 */ bc1fl .NB0f1853a4 /* f185390: c7a401d8 */ lwc1 $f4,0x1d8($sp) /* f185394: 8e0e002c */ lw $t6,0x2c($s0) /* f185398: 35d80040 */ ori $t8,$t6,0x40 /* f18539c: ae18002c */ sw $t8,0x2c($s0) /* f1853a0: c7a401d8 */ lwc1 $f4,0x1d8($sp) .NB0f1853a4: /* f1853a4: 8fa4020c */ lw $a0,0x20c($sp) /* f1853a8: 8fa50124 */ lw $a1,0x124($sp) /* f1853ac: 8fa60160 */ lw $a2,0x160($sp) /* f1853b0: 8fa7019c */ lw $a3,0x19c($sp) /* f1853b4: 0fc61106 */ jal mpFindMinFloat /* f1853b8: e7a40010 */ swc1 $f4,0x10($sp) /* f1853bc: 3c0d800a */ lui $t5,0x800a /* f1853c0: 8dade72c */ lw $t5,-0x18d4($t5) /* f1853c4: 3c19800a */ lui $t9,0x800a /* f1853c8: 3c18800a */ lui $t8,0x800a /* f1853cc: 11a00003 */ beqz $t5,.NB0f1853dc /* f1853d0: 240f0001 */ addiu $t7,$zero,0x1 /* f1853d4: 10000002 */ beqz $zero,.NB0f1853e0 /* f1853d8: afaf006c */ sw $t7,0x6c($sp) .NB0f1853dc: /* f1853dc: afa0006c */ sw $zero,0x6c($sp) .NB0f1853e0: /* f1853e0: 8f39e728 */ lw $t9,-0x18d8($t9) /* f1853e4: 3c0f800a */ lui $t7,0x800a /* f1853e8: 13200003 */ beqz $t9,.NB0f1853f8 /* f1853ec: 240e0001 */ addiu $t6,$zero,0x1 /* f1853f0: 10000002 */ beqz $zero,.NB0f1853fc /* f1853f4: afae0070 */ sw $t6,0x70($sp) .NB0f1853f8: /* f1853f8: afa00070 */ sw $zero,0x70($sp) .NB0f1853fc: /* f1853fc: 8f18e724 */ lw $t8,-0x18dc($t8) /* f185400: 13000003 */ beqz $t8,.NB0f185410 /* f185404: 240d0001 */ addiu $t5,$zero,0x1 /* f185408: 10000002 */ beqz $zero,.NB0f185414 /* f18540c: afad0074 */ sw $t5,0x74($sp) .NB0f185410: /* f185410: afa00074 */ sw $zero,0x74($sp) .NB0f185414: /* f185414: 8defe730 */ lw $t7,-0x18d0($t7) /* f185418: 8fb90074 */ lw $t9,0x74($sp) /* f18541c: 8fb80070 */ lw $t8,0x70($sp) /* f185420: 51e00004 */ beqzl $t7,.NB0f185434 /* f185424: 00009025 */ or $s2,$zero,$zero /* f185428: 10000002 */ beqz $zero,.NB0f185434 /* f18542c: 24120001 */ addiu $s2,$zero,0x1 /* f185430: 00009025 */ or $s2,$zero,$zero .NB0f185434: /* f185434: 8faf006c */ lw $t7,0x6c($sp) /* f185438: 02597021 */ addu $t6,$s2,$t9 /* f18543c: 01d86821 */ addu $t5,$t6,$t8 /* f185440: 01afc821 */ addu $t9,$t5,$t7 /* f185444: 2b210002 */ slti $at,$t9,0x2 /* f185448: 14200008 */ bnez $at,.NB0f18546c /* f18544c: 00027100 */ sll $t6,$v0,0x4 /* f185450: 01c27023 */ subu $t6,$t6,$v0 /* f185454: 000e7080 */ sll $t6,$t6,0x2 /* f185458: 27b8010c */ addiu $t8,$sp,0x10c /* f18545c: 01d88021 */ addu $s0,$t6,$t8 /* f185460: 8e0d002c */ lw $t5,0x2c($s0) /* f185464: 35af0080 */ ori $t7,$t5,0x80 /* f185468: ae0f002c */ sw $t7,0x2c($s0) .NB0f18546c: /* f18546c: 8fb901e0 */ lw $t9,0x1e0($sp) /* f185470: 8fa4020c */ lw $a0,0x20c($sp) /* f185474: 8fa5012c */ lw $a1,0x12c($sp) /* f185478: 8fa60168 */ lw $a2,0x168($sp) /* f18547c: 8fa701a4 */ lw $a3,0x1a4($sp) /* f185480: 0fc6106c */ jal mpFindMinInt /* f185484: afb90010 */ sw $t9,0x10($sp) /* f185488: 3c0e800a */ lui $t6,0x800a /* f18548c: 8dcee72c */ lw $t6,-0x18d4($t6) /* f185490: 3c0d800a */ lui $t5,0x800a /* f185494: 3c19800a */ lui $t9,0x800a /* f185498: 11c00003 */ beqz $t6,.NB0f1854a8 /* f18549c: 24180001 */ addiu $t8,$zero,0x1 /* f1854a0: 10000002 */ beqz $zero,.NB0f1854ac /* f1854a4: afb8006c */ sw $t8,0x6c($sp) .NB0f1854a8: /* f1854a8: afa0006c */ sw $zero,0x6c($sp) .NB0f1854ac: /* f1854ac: 8dade728 */ lw $t5,-0x18d8($t5) /* f1854b0: 3c18800a */ lui $t8,0x800a /* f1854b4: 11a00003 */ beqz $t5,.NB0f1854c4 /* f1854b8: 240f0001 */ addiu $t7,$zero,0x1 /* f1854bc: 10000002 */ beqz $zero,.NB0f1854c8 /* f1854c0: afaf0070 */ sw $t7,0x70($sp) .NB0f1854c4: /* f1854c4: afa00070 */ sw $zero,0x70($sp) .NB0f1854c8: /* f1854c8: 8f39e724 */ lw $t9,-0x18dc($t9) /* f1854cc: 13200003 */ beqz $t9,.NB0f1854dc /* f1854d0: 240e0001 */ addiu $t6,$zero,0x1 /* f1854d4: 10000002 */ beqz $zero,.NB0f1854e0 /* f1854d8: afae0074 */ sw $t6,0x74($sp) .NB0f1854dc: /* f1854dc: afa00074 */ sw $zero,0x74($sp) .NB0f1854e0: /* f1854e0: 8f18e730 */ lw $t8,-0x18d0($t8) /* f1854e4: 8fad0074 */ lw $t5,0x74($sp) /* f1854e8: 8fb90070 */ lw $t9,0x70($sp) /* f1854ec: 53000004 */ beqzl $t8,.NB0f185500 /* f1854f0: 00009025 */ or $s2,$zero,$zero /* f1854f4: 10000002 */ beqz $zero,.NB0f185500 /* f1854f8: 24120001 */ addiu $s2,$zero,0x1 /* f1854fc: 00009025 */ or $s2,$zero,$zero .NB0f185500: /* f185500: 8fb8006c */ lw $t8,0x6c($sp) /* f185504: 024d7821 */ addu $t7,$s2,$t5 /* f185508: 01f97021 */ addu $t6,$t7,$t9 /* f18550c: 01d86821 */ addu $t5,$t6,$t8 /* f185510: 29a10002 */ slti $at,$t5,0x2 /* f185514: 14200008 */ bnez $at,.NB0f185538 /* f185518: 00027900 */ sll $t7,$v0,0x4 /* f18551c: 01e27823 */ subu $t7,$t7,$v0 /* f185520: 000f7880 */ sll $t7,$t7,0x2 /* f185524: 27b9010c */ addiu $t9,$sp,0x10c /* f185528: 01f98021 */ addu $s0,$t7,$t9 /* f18552c: 8e0e002c */ lw $t6,0x2c($s0) /* f185530: 35d80100 */ ori $t8,$t6,0x100 /* f185534: ae18002c */ sw $t8,0x2c($s0) .NB0f185538: /* f185538: c7a801e4 */ lwc1 $f8,0x1e4($sp) /* f18553c: 8fa4020c */ lw $a0,0x20c($sp) /* f185540: 8fa50130 */ lw $a1,0x130($sp) /* f185544: 8fa6016c */ lw $a2,0x16c($sp) /* f185548: 8fa701a8 */ lw $a3,0x1a8($sp) /* f18554c: 0fc610ae */ jal mpFindMaxFloat /* f185550: e7a80010 */ swc1 $f8,0x10($sp) /* f185554: 00026900 */ sll $t5,$v0,0x4 /* f185558: 01a26823 */ subu $t5,$t5,$v0 /* f18555c: 000d6880 */ sll $t5,$t5,0x2 /* f185560: 27af010c */ addiu $t7,$sp,0x10c /* f185564: 01af8021 */ addu $s0,$t5,$t7 /* f185568: 3c014120 */ lui $at,0x4120 /* f18556c: 44815000 */ mtc1 $at,$f10 /* f185570: c6100024 */ lwc1 $f16,0x24($s0) /* f185574: 4610503c */ c.lt.s $f10,$f16 /* f185578: 00000000 */ sll $zero,$zero,0x0 /* f18557c: 45020005 */ bc1fl .NB0f185594 /* f185580: 8fb801dc */ lw $t8,0x1dc($sp) /* f185584: 8e19002c */ lw $t9,0x2c($s0) /* f185588: 372e0200 */ ori $t6,$t9,0x200 /* f18558c: ae0e002c */ sw $t6,0x2c($s0) /* f185590: 8fb801dc */ lw $t8,0x1dc($sp) .NB0f185594: /* f185594: 8fa4020c */ lw $a0,0x20c($sp) /* f185598: 8fa50128 */ lw $a1,0x128($sp) /* f18559c: 8fa60164 */ lw $a2,0x164($sp) /* f1855a0: 8fa701a0 */ lw $a3,0x1a0($sp) /* f1855a4: 0fc6106c */ jal mpFindMinInt /* f1855a8: afb80010 */ sw $t8,0x10($sp) /* f1855ac: 00026900 */ sll $t5,$v0,0x4 /* f1855b0: 01a26823 */ subu $t5,$t5,$v0 /* f1855b4: 000d6880 */ sll $t5,$t5,0x2 /* f1855b8: 27af010c */ addiu $t7,$sp,0x10c /* f1855bc: 01af8021 */ addu $s0,$t5,$t7 /* f1855c0: 8e19002c */ lw $t9,0x2c($s0) /* f1855c4: 372e0400 */ ori $t6,$t9,0x400 /* f1855c8: ae0e002c */ sw $t6,0x2c($s0) /* f1855cc: 8fb801dc */ lw $t8,0x1dc($sp) /* f1855d0: 8fa701a0 */ lw $a3,0x1a0($sp) /* f1855d4: 8fa60164 */ lw $a2,0x164($sp) /* f1855d8: 8fa50128 */ lw $a1,0x128($sp) /* f1855dc: 8fa4020c */ lw $a0,0x20c($sp) /* f1855e0: 0fc6102a */ jal mpFindMaxInt /* f1855e4: afb80010 */ sw $t8,0x10($sp) /* f1855e8: 00026900 */ sll $t5,$v0,0x4 /* f1855ec: 01a26823 */ subu $t5,$t5,$v0 /* f1855f0: 000d6880 */ sll $t5,$t5,0x2 /* f1855f4: 27af010c */ addiu $t7,$sp,0x10c /* f1855f8: 01af8021 */ addu $s0,$t5,$t7 /* f1855fc: 8e19001c */ lw $t9,0x1c($s0) /* f185600: 5b200007 */ blezl $t9,.NB0f185620 /* f185604: 8fad01f0 */ lw $t5,0x1f0($sp) /* f185608: 8e03002c */ lw $v1,0x2c($s0) /* f18560c: 306e0400 */ andi $t6,$v1,0x400 /* f185610: 15c00002 */ bnez $t6,.NB0f18561c /* f185614: 34780800 */ ori $t8,$v1,0x800 /* f185618: ae18002c */ sw $t8,0x2c($s0) .NB0f18561c: /* f18561c: 8fad01f0 */ lw $t5,0x1f0($sp) .NB0f185620: /* f185620: 8fa4020c */ lw $a0,0x20c($sp) /* f185624: 8fa5013c */ lw $a1,0x13c($sp) /* f185628: 8fa60178 */ lw $a2,0x178($sp) /* f18562c: 8fa701b4 */ lw $a3,0x1b4($sp) /* f185630: 0fc6102a */ jal mpFindMaxInt /* f185634: afad0010 */ sw $t5,0x10($sp) /* f185638: 00027900 */ sll $t7,$v0,0x4 /* f18563c: 01e27823 */ subu $t7,$t7,$v0 /* f185640: 000f7880 */ sll $t7,$t7,0x2 /* f185644: 27b9010c */ addiu $t9,$sp,0x10c /* f185648: 01f98021 */ addu $s0,$t7,$t9 /* f18564c: 8e0e0030 */ lw $t6,0x30($s0) /* f185650: 59c00005 */ blezl $t6,.NB0f185668 /* f185654: 8faf01f4 */ lw $t7,0x1f4($sp) /* f185658: 8e18002c */ lw $t8,0x2c($s0) /* f18565c: 370d2000 */ ori $t5,$t8,0x2000 /* f185660: ae0d002c */ sw $t5,0x2c($s0) /* f185664: 8faf01f4 */ lw $t7,0x1f4($sp) .NB0f185668: /* f185668: 8fa4020c */ lw $a0,0x20c($sp) /* f18566c: 8fa50140 */ lw $a1,0x140($sp) /* f185670: 8fa6017c */ lw $a2,0x17c($sp) /* f185674: 8fa701b8 */ lw $a3,0x1b8($sp) /* f185678: 0fc6106c */ jal mpFindMinInt /* f18567c: afaf0010 */ sw $t7,0x10($sp) /* f185680: 2409003c */ addiu $t1,$zero,0x3c /* f185684: 00490019 */ multu $v0,$t1 /* f185688: 27a7010c */ addiu $a3,$sp,0x10c /* f18568c: 3c14800a */ lui $s4,0x800a /* f185690: 2694e6c0 */ addiu $s4,$s4,-6464 /* f185694: 24060002 */ addiu $a2,$zero,0x2 /* f185698: 24050003 */ addiu $a1,$zero,0x3 /* f18569c: 3c040001 */ lui $a0,0x1 /* f1856a0: 24030004 */ addiu $v1,$zero,0x4 /* f1856a4: 0000c812 */ mflo $t9 /* f1856a8: 00f98021 */ addu $s0,$a3,$t9 /* f1856ac: 8e0e0034 */ lw $t6,0x34($s0) /* f1856b0: 59c00008 */ blezl $t6,.NB0f1856d4 /* f1856b4: 8fa8020c */ lw $t0,0x20c($sp) /* f1856b8: 8e18000c */ lw $t8,0xc($s0) /* f1856bc: 5b000005 */ blezl $t8,.NB0f1856d4 /* f1856c0: 8fa8020c */ lw $t0,0x20c($sp) /* f1856c4: 8e0d002c */ lw $t5,0x2c($s0) /* f1856c8: 35af1000 */ ori $t7,$t5,0x1000 /* f1856cc: ae0f002c */ sw $t7,0x2c($s0) /* f1856d0: 8fa8020c */ lw $t0,0x20c($sp) .NB0f1856d4: /* f1856d4: 0000b025 */ or $s6,$zero,$zero /* f1856d8: 19000020 */ blez $t0,.NB0f18575c /* f1856dc: 00000000 */ sll $zero,$zero,0x0 .NB0f1856e0: /* f1856e0: 8e8200cc */ lw $v0,0xcc($s4) /* f1856e4: 14620008 */ bne $v1,$v0,.NB0f185708 /* f1856e8: 00000000 */ sll $zero,$zero,0x0 /* f1856ec: 02c90019 */ multu $s6,$t1 /* f1856f0: 0000c812 */ mflo $t9 /* f1856f4: 00f99821 */ addu $s3,$a3,$t9 /* f1856f8: 8e6e002c */ lw $t6,0x2c($s3) /* f1856fc: 01c4c025 */ or $t8,$t6,$a0 /* f185700: 10000012 */ beqz $zero,.NB0f18574c /* f185704: ae78002c */ sw $t8,0x2c($s3) .NB0f185708: /* f185708: 14a20008 */ bne $a1,$v0,.NB0f18572c /* f18570c: 00000000 */ sll $zero,$zero,0x0 /* f185710: 02c90019 */ multu $s6,$t1 /* f185714: 00006812 */ mflo $t5 /* f185718: 00ed9821 */ addu $s3,$a3,$t5 /* f18571c: 8e6f002c */ lw $t7,0x2c($s3) /* f185720: 35f98000 */ ori $t9,$t7,0x8000 /* f185724: 10000009 */ beqz $zero,.NB0f18574c /* f185728: ae79002c */ sw $t9,0x2c($s3) .NB0f18572c: /* f18572c: 54c20008 */ bnel $a2,$v0,.NB0f185750 /* f185730: 26d60001 */ addiu $s6,$s6,0x1 /* f185734: 02c90019 */ multu $s6,$t1 /* f185738: 00007012 */ mflo $t6 /* f18573c: 00ee9821 */ addu $s3,$a3,$t6 /* f185740: 8e78002c */ lw $t8,0x2c($s3) /* f185744: 370d4000 */ ori $t5,$t8,0x4000 /* f185748: ae6d002c */ sw $t5,0x2c($s3) .NB0f18574c: /* f18574c: 26d60001 */ addiu $s6,$s6,0x1 .NB0f185750: /* f185750: 16c8ffe3 */ bne $s6,$t0,.NB0f1856e0 /* f185754: 26940080 */ addiu $s4,$s4,0x80 /* f185758: 0000b025 */ or $s6,$zero,$zero .NB0f18575c: /* f18575c: 1900000a */ blez $t0,.NB0f185788 /* f185760: 27b3010c */ addiu $s3,$sp,0x10c /* f185764: 24020011 */ addiu $v0,$zero,0x11 .NB0f185768: /* f185768: 00001825 */ or $v1,$zero,$zero /* f18576c: 24630001 */ addiu $v1,$v1,0x1 .NB0f185770: /* f185770: 5462ffff */ bnel $v1,$v0,.NB0f185770 /* f185774: 24630001 */ addiu $v1,$v1,0x1 /* f185778: 26d60001 */ addiu $s6,$s6,0x1 /* f18577c: 16c8fffa */ bne $s6,$t0,.NB0f185768 /* f185780: 2673003c */ addiu $s3,$s3,0x3c /* f185784: 0000b025 */ or $s6,$zero,$zero .NB0f185788: /* f185788: 19000066 */ blez $t0,.NB0f185924 /* f18578c: 3c148009 */ lui $s4,0x8009 /* f185790: 26949c4c */ addiu $s4,$s4,-25524 /* f185794: 24150011 */ addiu $s5,$zero,0x11 /* f185798: 8faf020c */ lw $t7,0x20c($sp) .NB0f18579c: /* f18579c: 24010001 */ addiu $at,$zero,0x1 /* f1857a0: 00009025 */ or $s2,$zero,$zero /* f1857a4: 15e1000b */ bne $t7,$at,.NB0f1857d4 /* f1857a8: 24050010 */ addiu $a1,$zero,0x10 /* f1857ac: 0016c900 */ sll $t9,$s6,0x4 /* f1857b0: 0336c823 */ subu $t9,$t9,$s6 /* f1857b4: 0019c880 */ sll $t9,$t9,0x2 /* f1857b8: 27ae010c */ addiu $t6,$sp,0x10c /* f1857bc: 032e9821 */ addu $s3,$t9,$t6 /* f1857c0: 8e78002c */ lw $t8,0x2c($s3) /* f1857c4: 3c010001 */ lui $at,0x1 /* f1857c8: 3421c670 */ ori $at,$at,0xc670 /* f1857cc: 03016824 */ and $t5,$t8,$at /* f1857d0: ae6d002c */ sw $t5,0x2c($s3) .NB0f1857d4: /* f1857d4: 00167900 */ sll $t7,$s6,0x4 /* f1857d8: 01f67823 */ subu $t7,$t7,$s6 /* f1857dc: 000f7880 */ sll $t7,$t7,0x2 /* f1857e0: 27b9010c */ addiu $t9,$sp,0x10c /* f1857e4: 01f99821 */ addu $s3,$t7,$t9 /* f1857e8: 8e70002c */ lw $s0,0x2c($s3) .NB0f1857ec: /* f1857ec: 240e0001 */ addiu $t6,$zero,0x1 /* f1857f0: 00ae1004 */ sllv $v0,$t6,$a1 /* f1857f4: 0202c024 */ and $t8,$s0,$v0 /* f1857f8: 1300000f */ beqz $t8,.NB0f185838 /* f1857fc: 00406827 */ nor $t5,$v0,$zero /* f185800: 020d7824 */ and $t7,$s0,$t5 /* f185804: 3c0d800a */ lui $t5,0x800a /* f185808: 0005c840 */ sll $t9,$a1,0x1 /* f18580c: 02997021 */ addu $t6,$s4,$t9 /* f185810: 25ade6c0 */ addiu $t5,$t5,-6464 /* f185814: 0016c080 */ sll $t8,$s6,0x2 /* f185818: ae6f002c */ sw $t7,0x2c($s3) /* f18581c: 030d8821 */ addu $s1,$t8,$t5 /* f185820: 95c40000 */ lhu $a0,0x0($t6) /* f185824: 0fc5a4dd */ jal langGet /* f185828: 24120001 */ addiu $s2,$zero,0x1 /* f18582c: 8e2f0064 */ lw $t7,0x64($s1) /* f185830: ade21974 */ sw $v0,0x1974($t7) /* f185834: 8e70002c */ lw $s0,0x2c($s3) .NB0f185838: /* f185838: 16000002 */ bnez $s0,.NB0f185844 /* f18583c: 00000000 */ sll $zero,$zero,0x0 /* f185840: 24120001 */ addiu $s2,$zero,0x1 .NB0f185844: /* f185844: 0c004d84 */ jal random /* f185848: 00000000 */ sll $zero,$zero,0x0 /* f18584c: 0055001b */ divu $zero,$v0,$s5 /* f185850: 00002810 */ mfhi $a1 /* f185854: 16a00002 */ bnez $s5,.NB0f185860 /* f185858: 00000000 */ sll $zero,$zero,0x0 /* f18585c: 0007000d */ break 0x7 .NB0f185860: /* f185860: 5240ffe2 */ beqzl $s2,.NB0f1857ec /* f185864: 8e70002c */ lw $s0,0x2c($s3) /* f185868: 2a410002 */ slti $at,$s2,0x2 /* f18586c: 10200029 */ beqz $at,.NB0f185914 /* f185870: 0016c900 */ sll $t9,$s6,0x4 /* f185874: 0336c823 */ subu $t9,$t9,$s6 /* f185878: 0019c880 */ sll $t9,$t9,0x2 /* f18587c: 27ae010c */ addiu $t6,$sp,0x10c /* f185880: 032e9821 */ addu $s3,$t9,$t6 .NB0f185884: /* f185884: 0c004d84 */ jal random /* f185888: 00000000 */ sll $zero,$zero,0x0 /* f18588c: 0055001b */ divu $zero,$v0,$s5 /* f185890: 8e70002c */ lw $s0,0x2c($s3) /* f185894: 00001810 */ mfhi $v1 /* f185898: 24180001 */ addiu $t8,$zero,0x1 /* f18589c: 00786804 */ sllv $t5,$t8,$v1 /* f1858a0: 16a00002 */ bnez $s5,.NB0f1858ac /* f1858a4: 00000000 */ sll $zero,$zero,0x0 /* f1858a8: 0007000d */ break 0x7 .NB0f1858ac: /* f1858ac: 020d7824 */ and $t7,$s0,$t5 /* f1858b0: 11e00012 */ beqz $t7,.NB0f1858fc /* f1858b4: 00602825 */ or $a1,$v1,$zero /* f1858b8: 24190001 */ addiu $t9,$zero,0x1 /* f1858bc: 00797004 */ sllv $t6,$t9,$v1 /* f1858c0: 01c0c027 */ nor $t8,$t6,$zero /* f1858c4: 02186824 */ and $t5,$s0,$t8 /* f1858c8: 3c18800a */ lui $t8,0x800a /* f1858cc: 00037840 */ sll $t7,$v1,0x1 /* f1858d0: 028fc821 */ addu $t9,$s4,$t7 /* f1858d4: 2718e6c0 */ addiu $t8,$t8,-6464 /* f1858d8: 00167080 */ sll $t6,$s6,0x2 /* f1858dc: ae6d002c */ sw $t5,0x2c($s3) /* f1858e0: 01d88821 */ addu $s1,$t6,$t8 /* f1858e4: 97240000 */ lhu $a0,0x0($t9) /* f1858e8: 0fc5a4dd */ jal langGet /* f1858ec: 24120002 */ addiu $s2,$zero,0x2 /* f1858f0: 8e2d0064 */ lw $t5,0x64($s1) /* f1858f4: ada21978 */ sw $v0,0x1978($t5) /* f1858f8: 8e70002c */ lw $s0,0x2c($s3) .NB0f1858fc: /* f1858fc: 56000003 */ bnezl $s0,.NB0f18590c /* f185900: 2a410002 */ slti $at,$s2,0x2 /* f185904: 24120002 */ addiu $s2,$zero,0x2 /* f185908: 2a410002 */ slti $at,$s2,0x2 .NB0f18590c: /* f18590c: 1420ffdd */ bnez $at,.NB0f185884 /* f185910: 00000000 */ sll $zero,$zero,0x0 .NB0f185914: /* f185914: 8faf020c */ lw $t7,0x20c($sp) /* f185918: 26d60001 */ addiu $s6,$s6,0x1 /* f18591c: 56cfff9f */ bnel $s6,$t7,.NB0f18579c /* f185920: 8faf020c */ lw $t7,0x20c($sp) .NB0f185924: /* f185924: 8fb900f4 */ lw $t9,0xf4($sp) /* f185928: 2b210002 */ slti $at,$t9,0x2 /* f18592c: 14200072 */ bnez $at,.NB0f185af8 /* f185930: 3c0700ff */ lui $a3,0xff /* f185934: 3c0a800b */ lui $t2,0x800b /* f185938: 3c0b800b */ lui $t3,0x800b /* f18593c: 00003025 */ or $a2,$zero,$zero /* f185940: 2408ffff */ addiu $t0,$zero,-1 /* f185944: 34e7ffff */ ori $a3,$a3,0xffff /* f185948: 2409ffff */ addiu $t1,$zero,-1 /* f18594c: 256b0de8 */ addiu $t3,$t3,0xde8 /* f185950: 954a144e */ lhu $t2,0x144e($t2) /* f185954: 00002825 */ or $a1,$zero,$zero /* f185958: 240c004c */ addiu $t4,$zero,0x4c /* f18595c: 240e0001 */ addiu $t6,$zero,0x1 .NB0f185960: /* f185960: 00aec004 */ sllv $t8,$t6,$a1 /* f185964: 01586824 */ and $t5,$t2,$t8 /* f185968: 11a00024 */ beqz $t5,.NB0f1859fc /* f18596c: 28a10004 */ slti $at,$a1,0x4 /* f185970: 10200006 */ beqz $at,.NB0f18598c /* f185974: 00001025 */ or $v0,$zero,$zero /* f185978: 00057880 */ sll $t7,$a1,0x2 /* f18597c: 01e57821 */ addu $t7,$t7,$a1 /* f185980: 000f7940 */ sll $t7,$t7,0x5 /* f185984: 10000005 */ beqz $zero,.NB0f18599c /* f185988: 03cf2021 */ addu $a0,$s8,$t7 .NB0f18598c: /* f18598c: 00ac0019 */ multu $a1,$t4 /* f185990: 0000c812 */ mflo $t9 /* f185994: 01792021 */ addu $a0,$t3,$t9 /* f185998: 2484fed0 */ addiu $a0,$a0,-304 .NB0f18599c: /* f18599c: 00001825 */ or $v1,$zero,$zero .NB0f1859a0: /* f1859a0: 12c30004 */ beq $s6,$v1,.NB0f1859b4 /* f1859a4: 00037040 */ sll $t6,$v1,0x1 /* f1859a8: 008ec021 */ addu $t8,$a0,$t6 /* f1859ac: 870d0024 */ lh $t5,0x24($t8) /* f1859b0: 004d1021 */ addu $v0,$v0,$t5 .NB0f1859b4: /* f1859b4: 24630001 */ addiu $v1,$v1,0x1 /* f1859b8: 1477fff9 */ bne $v1,$s7,.NB0f1859a0 /* f1859bc: 00000000 */ sll $zero,$zero,0x0 /* f1859c0: 14460002 */ bne $v0,$a2,.NB0f1859cc /* f1859c4: 00c2082a */ slt $at,$a2,$v0 /* f1859c8: 2408ffff */ addiu $t0,$zero,-1 .NB0f1859cc: /* f1859cc: 50200004 */ beqzl $at,.NB0f1859e0 /* f1859d0: 8482003c */ lh $v0,0x3c($a0) /* f1859d4: 00a04025 */ or $t0,$a1,$zero /* f1859d8: 00403025 */ or $a2,$v0,$zero /* f1859dc: 8482003c */ lh $v0,0x3c($a0) .NB0f1859e0: /* f1859e0: 14e20002 */ bne $a3,$v0,.NB0f1859ec /* f1859e4: 0047082a */ slt $at,$v0,$a3 /* f1859e8: 2409ffff */ addiu $t1,$zero,-1 .NB0f1859ec: /* f1859ec: 50200004 */ beqzl $at,.NB0f185a00 /* f1859f0: 24a50001 */ addiu $a1,$a1,0x1 /* f1859f4: 00a04825 */ or $t1,$a1,$zero /* f1859f8: 00403825 */ or $a3,$v0,$zero .NB0f1859fc: /* f1859fc: 24a50001 */ addiu $a1,$a1,0x1 .NB0f185a00: /* f185a00: 54b7ffd7 */ bnel $a1,$s7,.NB0f185960 /* f185a04: 240e0001 */ addiu $t6,$zero,0x1 /* f185a08: 3c0f800a */ lui $t7,0x800a /* f185a0c: 8def66c0 */ lw $t7,0x66c0($t7) /* f185a10: 3c19800a */ lui $t9,0x800a /* f185a14: 15e00038 */ bnez $t7,.NB0f185af8 /* f185a18: 00000000 */ sll $zero,$zero,0x0 /* f185a1c: 8f3966c4 */ lw $t9,0x66c4($t9) /* f185a20: 29010004 */ slti $at,$t0,0x4 /* f185a24: 17200034 */ bnez $t9,.NB0f185af8 /* f185a28: 00000000 */ sll $zero,$zero,0x0 /* f185a2c: 50200019 */ beqzl $at,.NB0f185a94 /* f185a30: 29210004 */ slti $at,$t1,0x4 /* f185a34: 05000016 */ bltz $t0,.NB0f185a90 /* f185a38: 29010004 */ slti $at,$t0,0x4 /* f185a3c: 10200006 */ beqz $at,.NB0f185a58 /* f185a40: 0008c080 */ sll $t8,$t0,0x2 /* f185a44: 00087080 */ sll $t6,$t0,0x2 /* f185a48: 01c87021 */ addu $t6,$t6,$t0 /* f185a4c: 000e7140 */ sll $t6,$t6,0x5 /* f185a50: 10000009 */ beqz $zero,.NB0f185a78 /* f185a54: 03ce1021 */ addu $v0,$s8,$t6 .NB0f185a58: /* f185a58: 0308c021 */ addu $t8,$t8,$t0 /* f185a5c: 0018c080 */ sll $t8,$t8,0x2 /* f185a60: 0308c023 */ subu $t8,$t8,$t0 /* f185a64: 0018c080 */ sll $t8,$t8,0x2 /* f185a68: 3c0f800b */ lui $t7,0x800b /* f185a6c: 25ef0de8 */ addiu $t7,$t7,0xde8 /* f185a70: 270dfed0 */ addiu $t5,$t8,-304 /* f185a74: 01af1021 */ addu $v0,$t5,$t7 .NB0f185a78: /* f185a78: 90590094 */ lbu $t9,0x94($v0) /* f185a7c: 8c58008c */ lw $t8,0x8c($v0) /* f185a80: 372e0001 */ ori $t6,$t9,0x1 /* f185a84: 270d0001 */ addiu $t5,$t8,0x1 /* f185a88: a04e0094 */ sb $t6,0x94($v0) /* f185a8c: ac4d008c */ sw $t5,0x8c($v0) .NB0f185a90: /* f185a90: 29210004 */ slti $at,$t1,0x4 .NB0f185a94: /* f185a94: 10200018 */ beqz $at,.NB0f185af8 /* f185a98: 00000000 */ sll $zero,$zero,0x0 /* f185a9c: 05200016 */ bltz $t1,.NB0f185af8 /* f185aa0: 29210004 */ slti $at,$t1,0x4 /* f185aa4: 10200006 */ beqz $at,.NB0f185ac0 /* f185aa8: 0009c880 */ sll $t9,$t1,0x2 /* f185aac: 00097880 */ sll $t7,$t1,0x2 /* f185ab0: 01e97821 */ addu $t7,$t7,$t1 /* f185ab4: 000f7940 */ sll $t7,$t7,0x5 /* f185ab8: 10000009 */ beqz $zero,.NB0f185ae0 /* f185abc: 03cf1021 */ addu $v0,$s8,$t7 .NB0f185ac0: /* f185ac0: 0329c821 */ addu $t9,$t9,$t1 /* f185ac4: 0019c880 */ sll $t9,$t9,0x2 /* f185ac8: 0329c823 */ subu $t9,$t9,$t1 /* f185acc: 0019c880 */ sll $t9,$t9,0x2 /* f185ad0: 3c18800b */ lui $t8,0x800b /* f185ad4: 27180de8 */ addiu $t8,$t8,0xde8 /* f185ad8: 272efed0 */ addiu $t6,$t9,-304 /* f185adc: 01d81021 */ addu $v0,$t6,$t8 .NB0f185ae0: /* f185ae0: 904d0094 */ lbu $t5,0x94($v0) /* f185ae4: 8c590090 */ lw $t9,0x90($v0) /* f185ae8: 35af0008 */ ori $t7,$t5,0x8 /* f185aec: 272e0001 */ addiu $t6,$t9,0x1 /* f185af0: a04f0094 */ sb $t7,0x94($v0) /* f185af4: ac4e0090 */ sw $t6,0x90($v0) .NB0f185af8: /* f185af8: 3c0d800a */ lui $t5,0x800a /* f185afc: 8dad66c0 */ lw $t5,0x66c0($t5) /* f185b00: 8fb8020c */ lw $t8,0x20c($sp) /* f185b04: 0000b025 */ or $s6,$zero,$zero /* f185b08: 15a00035 */ bnez $t5,.NB0f185be0 /* f185b0c: 3c0f800a */ lui $t7,0x800a /* f185b10: 8def66c4 */ lw $t7,0x66c4($t7) /* f185b14: 2b010002 */ slti $at,$t8,0x2 /* f185b18: 55e00032 */ bnezl $t7,.NB0f185be4 /* f185b1c: 8fa8020c */ lw $t0,0x20c($sp) /* f185b20: 1420002f */ bnez $at,.NB0f185be0 /* f185b24: 00001825 */ or $v1,$zero,$zero /* f185b28: 3c013f00 */ lui $at,0x3f00 /* f185b2c: 44811000 */ mtc1 $at,$f2 /* f185b30: 2404ffff */ addiu $a0,$zero,-1 /* f185b34: 1b000016 */ blez $t8,.NB0f185b90 /* f185b38: 2410ffff */ addiu $s0,$zero,-1 /* f185b3c: 27b3010c */ addiu $s3,$sp,0x10c .NB0f185b40: /* f185b40: 8e620004 */ lw $v0,0x4($s3) /* f185b44: 8fb9020c */ lw $t9,0x20c($sp) /* f185b48: 14620002 */ bne $v1,$v0,.NB0f185b54 /* f185b4c: 0062082a */ slt $at,$v1,$v0 /* f185b50: 2404ffff */ addiu $a0,$zero,-1 .NB0f185b54: /* f185b54: 50200004 */ beqzl $at,.NB0f185b68 /* f185b58: c6600038 */ lwc1 $f0,0x38($s3) /* f185b5c: 02c02025 */ or $a0,$s6,$zero /* f185b60: 00401825 */ or $v1,$v0,$zero /* f185b64: c6600038 */ lwc1 $f0,0x38($s3) .NB0f185b68: /* f185b68: 4600103c */ c.lt.s $f2,$f0 /* f185b6c: 00000000 */ sll $zero,$zero,0x0 /* f185b70: 45020004 */ bc1fl .NB0f185b84 /* f185b74: 26d60001 */ addiu $s6,$s6,0x1 /* f185b78: 02c08025 */ or $s0,$s6,$zero /* f185b7c: 46000086 */ mov.s $f2,$f0 /* f185b80: 26d60001 */ addiu $s6,$s6,0x1 .NB0f185b84: /* f185b84: 16d9ffee */ bne $s6,$t9,.NB0f185b40 /* f185b88: 2673003c */ addiu $s3,$s3,0x3c /* f185b8c: 0000b025 */ or $s6,$zero,$zero .NB0f185b90: /* f185b90: 04800009 */ bltz $a0,.NB0f185bb8 /* f185b94: 00000000 */ sll $zero,$zero,0x0 /* f185b98: 0fc61a7b */ jal mpGetChrConfigBySlotNum /* f185b9c: 00000000 */ sll $zero,$zero,0x0 /* f185ba0: 904e0094 */ lbu $t6,0x94($v0) /* f185ba4: 8c4f0088 */ lw $t7,0x88($v0) /* f185ba8: 35cd0002 */ ori $t5,$t6,0x2 /* f185bac: 25f80001 */ addiu $t8,$t7,0x1 /* f185bb0: a04d0094 */ sb $t5,0x94($v0) /* f185bb4: ac580088 */ sw $t8,0x88($v0) .NB0f185bb8: /* f185bb8: 0602000a */ bltzl $s0,.NB0f185be4 /* f185bbc: 8fa8020c */ lw $t0,0x20c($sp) /* f185bc0: 0fc61a7b */ jal mpGetChrConfigBySlotNum /* f185bc4: 02002025 */ or $a0,$s0,$zero /* f185bc8: 90590094 */ lbu $t9,0x94($v0) /* f185bcc: 8c4d0084 */ lw $t5,0x84($v0) /* f185bd0: 372e0004 */ ori $t6,$t9,0x4 /* f185bd4: 25af0001 */ addiu $t7,$t5,0x1 /* f185bd8: a04e0094 */ sb $t6,0x94($v0) /* f185bdc: ac4f0084 */ sw $t7,0x84($v0) .NB0f185be0: /* f185be0: 8fa8020c */ lw $t0,0x20c($sp) .NB0f185be4: /* f185be4: 5900000a */ blezl $t0,.NB0f185c10 /* f185be8: 8fbf0044 */ lw $ra,0x44($sp) .NB0f185bec: /* f185bec: 0fc61a7b */ jal mpGetChrConfigBySlotNum /* f185bf0: 02c02025 */ or $a0,$s6,$zero /* f185bf4: 0fc6115e */ jal mpCalculatePlayerTitle /* f185bf8: 00402025 */ or $a0,$v0,$zero /* f185bfc: 8fb8020c */ lw $t8,0x20c($sp) /* f185c00: 26d60001 */ addiu $s6,$s6,0x1 /* f185c04: 16d8fff9 */ bne $s6,$t8,.NB0f185bec /* f185c08: 00000000 */ sll $zero,$zero,0x0 /* f185c0c: 8fbf0044 */ lw $ra,0x44($sp) .NB0f185c10: /* f185c10: 8fb00020 */ lw $s0,0x20($sp) /* f185c14: 8fb10024 */ lw $s1,0x24($sp) /* f185c18: 8fb20028 */ lw $s2,0x28($sp) /* f185c1c: 8fb3002c */ lw $s3,0x2c($sp) /* f185c20: 8fb40030 */ lw $s4,0x30($sp) /* f185c24: 8fb50034 */ lw $s5,0x34($sp) /* f185c28: 8fb60038 */ lw $s6,0x38($sp) /* f185c2c: 8fb7003c */ lw $s7,0x3c($sp) /* f185c30: 8fbe0040 */ lw $s8,0x40($sp) /* f185c34: 03e00008 */ jr $ra /* f185c38: 27bd0210 */ addiu $sp,$sp,0x210 ); #endif void mpEndMatch(void) { s32 stack; s32 playercount = PLAYERCOUNT(); s32 prevplayernum; s32 i; musicStartMenu(); mpSetPaused(MPPAUSEMODE_GAMEOVER); prevplayernum = g_Vars.currentplayernum; for (i = 0; i < playercount; i++) { setCurrentPlayerNum(i); g_Vars.currentplayer->award1 = NULL; g_Vars.currentplayer->award2 = NULL; if (g_Vars.currentplayer->visionmode == VISIONMODE_SLAYERROCKET) { g_Vars.currentplayer->visionmode = VISIONMODE_NORMAL; } } setCurrentPlayerNum(prevplayernum); mpCalculateAwards(); if (g_BossFile.locktype == MPLOCKTYPE_CHALLENGE) { mpConsiderMarkingCurrentChallengeComplete(); } func0f0f820c(NULL, -6); } s32 mpGetNumHeads2(void) { return NUM_MPHEADS; } s32 mpGetNumHeads(void) { return NUM_MPHEADS; } s32 mpGetHeadId(u8 headnum) { return g_MpHeads[headnum].headnum; } s32 mpGetHeadRequiredFeature(u8 headnum) { return g_MpHeads[headnum].requirefeature; } s32 mpGetBeauHeadId(u8 headnum) { return g_MpBeauHeads[headnum].headnum; } s32 mpGetNumBeauHeads(void) { return NUM_MPBEAUHEADS; } u32 mpGetNumBodies(void) { return NUM_MPBODIES; } s32 mpGetBodyId(u8 bodynum) { if (bodynum >= 62) { if (bodynum == 62) { return BODY_DRCAROLL; } return BODY_DARK_COMBAT; } return g_MpBodies[bodynum].bodynum; } s32 mpGetMpbodynumByBodynum(u16 bodynum) { s32 i; if (bodynum == BODY_DRCAROLL) { return 62; // NUM_MPBODIES + 1 } for (i = 0; i != NUM_MPBODIES; i++) { if (g_MpBodies[i].bodynum == bodynum) { return i; } } // @bug: Should return 0 as a fallback, not the first body's bodynum return g_MpBodies[0].bodynum; } char *mpGetBodyName(u8 mpbodynum) { // Possible @bug: This should probably be >= if (mpbodynum > NUM_MPBODIES) { mpbodynum = 0; } return langGet(g_MpBodies[mpbodynum].name); } u8 mpGetBodyRequiredFeature(u8 bodynum) { // Possible @bug: This should probably be >= if (bodynum > NUM_MPBODIES) { bodynum = 0; } return g_MpBodies[bodynum].requirefeature; } s32 mpGetMpheadnumByMpbodynum(s32 mpbodynum) { s32 headnum; s32 index = 0; s32 i; if (mpbodynum >= HEAD_VD) { mpbodynum = 0; } headnum = g_MpBodies[mpbodynum].headnum; if (headnum == 1000) { if (g_HeadsAndBodies[g_MpBodies[mpbodynum].bodynum].ismale) { headnum = g_MpMaleHeads[random() % ARRAYCOUNT(g_MpMaleHeads)]; } else { headnum = g_MpFemaleHeads[random() % ARRAYCOUNT(g_MpFemaleHeads)]; } } for (i = 0; i != ARRAYCOUNT(g_MpHeads); i++) { if (g_MpHeads[i].headnum == headnum) { index = i; } } return index; } void mpFindUnusedHeadAndBody(u8 *mpheadnum, u8 *mpbodynum) { struct mpchrconfig *mpchr; bool available; u8 trympheadnum; u8 trympbodynum; s32 i; do { available = true; trympheadnum = random() % 75; trympbodynum = random() % 61; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { mpchr = MPCHR(i); if (mpchr->mpheadnum == trympheadnum) { available = false; } if (mpchr->mpbodynum == trympbodynum) { available = false; } } } } while (!available); if (1); *mpheadnum = trympheadnum; *mpbodynum = trympbodynum; } s32 mpChooseRandomLockPlayer(void) { s32 start = random() % 4; s32 i; for (i = (start + 1) % 4;; i = (i + 1) % 4) { if ((g_MpSetup.chrslots & (1 << i)) || i == start) { break; } } return i; } bool mpSetLock(s32 locktype, s32 playernum) { g_BossFile.locktype = locktype; if (g_BossFile.locktype == MPLOCKTYPE_RANDOM) { g_MpLockInfo.lockedplayernum = mpChooseRandomLockPlayer(); } else { g_MpLockInfo.lockedplayernum = playernum; } return true; } s32 mpGetLockType(void) { return g_BossFile.locktype; } u32 mpGetLockPlayerNum(void) { return g_MpLockInfo.lockedplayernum; } bool mpIsPlayerLockedOut(s32 playernum) { if (g_BossFile.locktype == MPLOCKTYPE_NONE) { return false; } if (g_MpLockInfo.lockedplayernum == playernum) { return false; } return true; } void mpCalculateLockIfLastWinnerOrLoser(void) { if (g_BossFile.locktype == MPLOCKTYPE_LASTWINNER && g_MpLockInfo.lastwinner >= 0) { g_MpLockInfo.lockedplayernum = g_MpLockInfo.lastwinner; } if (g_BossFile.locktype == MPLOCKTYPE_LASTLOSER && g_MpLockInfo.lastloser >= 0) { g_MpLockInfo.lockedplayernum = g_MpLockInfo.lastloser; } if (g_MpLockInfo.lockedplayernum >= 0 && g_BossFile.locktype != MPLOCKTYPE_CHALLENGE && (g_MpSetup.chrslots & (1 << g_MpLockInfo.lockedplayernum)) == 0) { g_MpLockInfo.lastwinner = g_MpLockInfo.lastloser = -1; g_MpLockInfo.lockedplayernum = mpChooseRandomLockPlayer(); } } struct mptrack g_MpTracks[NUM_MPTRACKS] = { // Audio ID, duration, name, unlock after stage /*0x00*/ { MUSIC_DARK_COMBAT, 160, L_MISC_124, -1 }, // "Dark Combat" /*0x01*/ { MUSIC_SKEDAR_MYSTERY, 170, L_MISC_125, -1 }, // "Skedar Mystery" /*0x02*/ { MUSIC_CI_OPERATIVE, 170, L_MISC_126, -1 }, // "CI Operative" /*0x03*/ { MUSIC_DATADYNE_ACTION, 180, L_MISC_127, -1 }, // "dataDyne Action" /*0x04*/ { MUSIC_MAIAN_TEARS, 200, L_MISC_128, -1 }, // "Maian Tears" /*0x05*/ { MUSIC_ALIEN_CONFLICT, 197, L_MISC_129, -1 }, // "Alien Conflict" /*0x06*/ { MUSIC_CI, 120, L_MISC_130, -1 }, // "Carrington Institute" /*0x07*/ { MUSIC_DEFECTION, 120, L_MISC_131, SOLOSTAGEINDEX_DEFECTION }, // "dD Central" /*0x08*/ { MUSIC_DEFECTION_X, 120, L_MISC_132, SOLOSTAGEINDEX_DEFECTION }, // "dD Central X" /*0x09*/ { MUSIC_INVESTIGATION, 120, L_MISC_133, SOLOSTAGEINDEX_INVESTIGATION }, // "dD Research" /*0x0a*/ { MUSIC_INVESTIGATION_X, 120, L_MISC_134, SOLOSTAGEINDEX_INVESTIGATION }, // "dD Research X" /*0x0b*/ { MUSIC_EXTRACTION, 120, L_MISC_135, SOLOSTAGEINDEX_EXTRACTION }, // "dD Extraction" /*0x0c*/ { MUSIC_EXTRACTION_X, 120, L_MISC_136, SOLOSTAGEINDEX_EXTRACTION }, // "dD Extraction X" /*0x0d*/ { MUSIC_VILLA, 120, L_MISC_137, SOLOSTAGEINDEX_VILLA }, // "Carrington Villa" /*0x0e*/ { MUSIC_VILLA_X, 120, L_MISC_138, SOLOSTAGEINDEX_VILLA }, // "Carrington Villa X" /*0x0f*/ { MUSIC_CHICAGO, 120, L_MISC_139, SOLOSTAGEINDEX_CHICAGO }, // "Chicago" /*0x10*/ { MUSIC_CHICAGO_X, 120, L_MISC_140, SOLOSTAGEINDEX_CHICAGO }, // "Chicago X" /*0x11*/ { MUSIC_G5, 120, L_MISC_141, SOLOSTAGEINDEX_G5BUILDING }, // "G5 Building" /*0x12*/ { MUSIC_G5_X, 120, L_MISC_142, SOLOSTAGEINDEX_G5BUILDING }, // "G5 Building X" /*0x13*/ { MUSIC_INFILTRATION, 120, L_MISC_143, SOLOSTAGEINDEX_INFILTRATION }, // "A51 Infiltration" /*0x14*/ { MUSIC_INFILTRATION_X, 120, L_MISC_144, SOLOSTAGEINDEX_INFILTRATION }, // "A51 Infiltration X" /*0x15*/ { MUSIC_RESCUE, 120, L_MISC_145, SOLOSTAGEINDEX_RESCUE }, // "A51 Rescue" /*0x16*/ { MUSIC_RESCUE_X, 120, L_MISC_146, SOLOSTAGEINDEX_RESCUE }, // "A51 Rescue X" /*0x17*/ { MUSIC_ESCAPE, 120, L_MISC_147, SOLOSTAGEINDEX_ESCAPE }, // "A51 Escape" /*0x18*/ { MUSIC_ESCAPE_X, 120, L_MISC_148, SOLOSTAGEINDEX_ESCAPE }, // "A51 Escape X" /*0x19*/ { MUSIC_AIRBASE, 120, L_MISC_149, SOLOSTAGEINDEX_AIRBASE }, // "Air Base" /*0x1a*/ { MUSIC_AIRBASE_X, 120, L_MISC_150, SOLOSTAGEINDEX_AIRBASE }, // "Air Base X" /*0x1b*/ { MUSIC_AIRFORCEONE, 120, L_MISC_151, SOLOSTAGEINDEX_AIRFORCEONE }, // "Air Force One" /*0x1c*/ { MUSIC_AIRFORCEONE_X, 120, L_MISC_152, SOLOSTAGEINDEX_AIRFORCEONE }, // "Air Force One X" /*0x1d*/ { MUSIC_CRASHSITE, 120, L_MISC_153, SOLOSTAGEINDEX_CRASHSITE }, // "Crash Site" /*0x1e*/ { MUSIC_CRASHSITE_X, 120, L_MISC_154, SOLOSTAGEINDEX_CRASHSITE }, // "Crash Site X" /*0x1f*/ { MUSIC_PELAGIC, 120, L_MISC_155, SOLOSTAGEINDEX_PELAGIC }, // "Pelagic II" /*0x20*/ { MUSIC_PELAGIC_X, 120, L_MISC_156, SOLOSTAGEINDEX_PELAGIC }, // "Pelagic II X" /*0x21*/ { MUSIC_DEEPSEA, 120, L_MISC_157, SOLOSTAGEINDEX_DEEPSEA }, // "Deep Sea" /*0x22*/ { MUSIC_DEEPSEA_X, 120, L_MISC_158, SOLOSTAGEINDEX_DEEPSEA }, // "Deep Sea X" /*0x23*/ { MUSIC_DEFENSE, 120, L_MISC_159, SOLOSTAGEINDEX_DEFENSE }, // "Institute Defense" /*0x24*/ { MUSIC_DEFENSE_X, 120, L_MISC_160, SOLOSTAGEINDEX_DEFENSE }, // "Institute Defense X" /*0x25*/ { MUSIC_ATTACKSHIP, 120, L_MISC_161, SOLOSTAGEINDEX_ATTACKSHIP }, // "Attack Ship" /*0x26*/ { MUSIC_ATTACKSHIP_X, 120, L_MISC_162, SOLOSTAGEINDEX_ATTACKSHIP }, // "Attack Ship X" /*0x27*/ { MUSIC_SKEDARRUINS, 120, L_MISC_163, SOLOSTAGEINDEX_SKEDARRUINS }, // "Skedar Ruins" /*0x28*/ { MUSIC_SKEDARRUINS_X, 120, L_MISC_164, SOLOSTAGEINDEX_SKEDARRUINS }, // "Skedar Ruins X" /*0x29*/ { MUSIC_CREDITS, 120, L_MISC_165, SOLOSTAGEINDEX_SKEDARRUINS }, // "End Credits" }; bool mpIsTrackUnlocked(s32 tracknum) { s16 stageindex = g_MpTracks[tracknum].unlockstage; bool unlocked = false; u32 i; if (stageindex < 0 || stageindex >= NUM_SOLONORMALSTAGES) { unlocked = true; } else { for (i = 0; i != 3; i++) { if (g_GameFile.besttimes[stageindex][i]) { unlocked = true; break; } } } return unlocked; } s32 mpGetTrackSlotIndex(s32 tracknum) { s32 i; s32 slotindex = 0; for (i = 0; i < tracknum; i++) { if (mpIsTrackUnlocked(i)) { slotindex++; } } return slotindex; } s32 mpGetTrackNumAtSlotIndex(s32 slotindex) { s32 i; s32 numunlocked = 0; for (i = 0; i != NUM_MPTRACKS; i++) { if (mpIsTrackUnlocked(i)) { if (numunlocked == slotindex) { break; } numunlocked++; } } return i; } s32 mpGetNumUnlockedTracks(void) { return mpGetTrackSlotIndex(NUM_MPTRACKS); } s32 mpGetTrackMusicNum(s32 slotindex) { s32 tracknum = mpGetTrackNumAtSlotIndex(slotindex); return g_MpTracks[tracknum].musicnum; } char *mpGetTrackName(s32 slotindex) { s32 tracknum = mpGetTrackNumAtSlotIndex(slotindex); return langGet(g_MpTracks[tracknum].name); } void mpSetUsingMultipleTunes(bool enable) { g_BossFile.usingmultipletunes = enable; } bool mpGetUsingMultipleTunes(void) { return g_BossFile.usingmultipletunes; } bool mpIsMultiTrackSlotEnabled(s32 slot) { s32 tracknum = mpGetTrackNumAtSlotIndex(slot); u8 index = tracknum >> 3; u8 value = 1 << (tracknum & 7); if ((g_BossFile.multipletracknums[index] & value) == 0) { return false; } return true; } void mpSetMultiTrackSlotEnabled(s32 slot, bool enable) { s32 tracknum = mpGetTrackNumAtSlotIndex(slot); u8 value = 1 << (tracknum & 7); u8 index = tracknum >> 3; if (enable) { g_BossFile.multipletracknums[index] |= value; } else { g_BossFile.multipletracknums[index] &= ~value; } } void mpSetTrackSlotEnabled(s32 slot) { if (mpGetUsingMultipleTunes()) { mpSetMultiTrackSlotEnabled(slot, 1 - mpIsMultiTrackSlotEnabled(slot)); } else { g_BossFile.tracknum = mpGetTrackNumAtSlotIndex(slot); } } void mpEnableAllMultiTracks(void) { s32 i; for (i = 0; i != 6; i++) { g_BossFile.multipletracknums[i] = 0xff; } } void mpDisableAllMultiTracks(void) { s32 i; for (i = 0; i != 6; i++) { g_BossFile.multipletracknums[i] = 0; } } void mpRandomiseMultiTracks(void) { s32 i; for (i = 0; i != 6; i++) { g_BossFile.multipletracknums[i] = random(); } } void mpSetTrackToRandom(void) { g_BossFile.tracknum = -1; } s32 mpGetCurrentTrackSlotNum(void) { if (g_BossFile.tracknum < 0) { return g_BossFile.tracknum; } return mpGetTrackSlotIndex(g_BossFile.tracknum); } #if VERSION >= VERSION_PAL_FINAL GLOBAL_ASM( glabel mpChooseTrack /* f18d564: 27bdffc8 */ addiu $sp,$sp,-56 /* f18d568: afbf0034 */ sw $ra,0x34($sp) /* f18d56c: afb60030 */ sw $s6,0x30($sp) /* f18d570: afb5002c */ sw $s5,0x2c($sp) /* f18d574: afb40028 */ sw $s4,0x28($sp) /* f18d578: afb30024 */ sw $s3,0x24($sp) /* f18d57c: afb20020 */ sw $s2,0x20($sp) /* f18d580: afb1001c */ sw $s1,0x1c($sp) /* f18d584: 0fc634d2 */ jal mpGetUsingMultipleTunes /* f18d588: afb00018 */ sw $s0,0x18($sp) /* f18d58c: 1040006f */ beqz $v0,.PF0f18d74c /* f18d590: 00000000 */ nop /* f18d594: 0fc634a9 */ jal mpGetNumUnlockedTracks /* f18d598: 00000000 */ nop /* f18d59c: 0040a025 */ move $s4,$v0 /* f18d5a0: 0000a825 */ move $s5,$zero /* f18d5a4: 18400009 */ blez $v0,.PF0f18d5cc /* f18d5a8: 00008025 */ move $s0,$zero .PF0f18d5ac: /* f18d5ac: 0fc634d5 */ jal mpIsMultiTrackSlotEnabled /* f18d5b0: 02002025 */ move $a0,$s0 /* f18d5b4: 10400002 */ beqz $v0,.PF0f18d5c0 /* f18d5b8: 26100001 */ addiu $s0,$s0,0x1 /* f18d5bc: 26b50001 */ addiu $s5,$s5,0x1 .PF0f18d5c0: /* f18d5c0: 0214082a */ slt $at,$s0,$s4 /* f18d5c4: 1420fff9 */ bnez $at,.PF0f18d5ac /* f18d5c8: 00000000 */ nop .PF0f18d5cc: /* f18d5cc: 16a00020 */ bnez $s5,.PF0f18d650 /* f18d5d0: 3c16800b */ lui $s6,0x800b /* f18d5d4: 26d6d1c0 */ addiu $s6,$s6,-11840 .PF0f18d5d8: /* f18d5d8: 0c004ad4 */ jal random /* f18d5dc: 00000000 */ nop /* f18d5e0: 0054001b */ divu $zero,$v0,$s4 /* f18d5e4: 00002010 */ mfhi $a0 /* f18d5e8: 16800002 */ bnez $s4,.PF0f18d5f4 /* f18d5ec: 00000000 */ nop /* f18d5f0: 0007000d */ break 0x7 .PF0f18d5f4: /* f18d5f4: 0fc6348e */ jal mpGetTrackNumAtSlotIndex /* f18d5f8: 00000000 */ nop /* f18d5fc: 8ece0004 */ lw $t6,0x4($s6) /* f18d600: 00409825 */ move $s3,$v0 /* f18d604: 104efff4 */ beq $v0,$t6,.PF0f18d5d8 /* f18d608: 00000000 */ nop /* f18d60c: 00027880 */ sll $t7,$v0,0x2 /* f18d610: 01e27823 */ subu $t7,$t7,$v0 /* f18d614: 000f7840 */ sll $t7,$t7,0x1 /* f18d618: 3c038008 */ lui $v1,0x8008 /* f18d61c: aec20004 */ sw $v0,0x4($s6) /* f18d620: 006f1821 */ addu $v1,$v1,$t7 /* f18d624: 94637fc0 */ lhu $v1,0x7fc0($v1) /* f18d628: 3c018008 */ lui $at,0x8008 /* f18d62c: 307801ff */ andi $t8,$v1,0x1ff /* f18d630: 0018c880 */ sll $t9,$t8,0x2 /* f18d634: 0338c823 */ subu $t9,$t9,$t8 /* f18d638: 0019c8c0 */ sll $t9,$t9,0x3 /* f18d63c: 0338c821 */ addu $t9,$t9,$t8 /* f18d640: 0019c840 */ sll $t9,$t9,0x1 /* f18d644: ac394638 */ sw $t9,0x4638($at) /* f18d648: 1000007b */ b .PF0f18d838 /* f18d64c: 00031242 */ srl $v0,$v1,0x9 .PF0f18d650: /* f18d650: 3c16800b */ lui $s6,0x800b /* f18d654: 26d6d1c0 */ addiu $s6,$s6,-11840 /* f18d658: 00008025 */ move $s0,$zero .PF0f18d65c: /* f18d65c: 0c004ad4 */ jal random /* f18d660: 00008825 */ move $s1,$zero /* f18d664: 0055001b */ divu $zero,$v0,$s5 /* f18d668: 00009010 */ mfhi $s2 /* f18d66c: 2413ffff */ li $s3,-1 /* f18d670: 16a00002 */ bnez $s5,.PF0f18d67c /* f18d674: 00000000 */ nop /* f18d678: 0007000d */ break 0x7 .PF0f18d67c: /* f18d67c: 5a80000d */ blezl $s4,.PF0f18d6b4 /* f18d680: 2401ffff */ li $at,-1 .PF0f18d684: /* f18d684: 0fc634d5 */ jal mpIsMultiTrackSlotEnabled /* f18d688: 02002025 */ move $a0,$s0 /* f18d68c: 50400006 */ beqzl $v0,.PF0f18d6a8 /* f18d690: 26100001 */ addiu $s0,$s0,0x1 /* f18d694: 56510003 */ bnel $s2,$s1,.PF0f18d6a4 /* f18d698: 26310001 */ addiu $s1,$s1,0x1 /* f18d69c: 02009825 */ move $s3,$s0 /* f18d6a0: 26310001 */ addiu $s1,$s1,0x1 .PF0f18d6a4: /* f18d6a4: 26100001 */ addiu $s0,$s0,0x1 .PF0f18d6a8: /* f18d6a8: 1614fff6 */ bne $s0,$s4,.PF0f18d684 /* f18d6ac: 00000000 */ nop /* f18d6b0: 2401ffff */ li $at,-1 .PF0f18d6b4: /* f18d6b4: 1661000c */ bne $s3,$at,.PF0f18d6e8 /* f18d6b8: 3c038008 */ lui $v1,0x8008 /* f18d6bc: 94637fc0 */ lhu $v1,0x7fc0($v1) /* f18d6c0: 3c018008 */ lui $at,0x8008 /* f18d6c4: 306801ff */ andi $t0,$v1,0x1ff /* f18d6c8: 00084880 */ sll $t1,$t0,0x2 /* f18d6cc: 01284823 */ subu $t1,$t1,$t0 /* f18d6d0: 000948c0 */ sll $t1,$t1,0x3 /* f18d6d4: 01284821 */ addu $t1,$t1,$t0 /* f18d6d8: 00094840 */ sll $t1,$t1,0x1 /* f18d6dc: ac294638 */ sw $t1,0x4638($at) /* f18d6e0: 10000055 */ b .PF0f18d838 /* f18d6e4: 00031242 */ srl $v0,$v1,0x9 .PF0f18d6e8: /* f18d6e8: 0fc6348e */ jal mpGetTrackNumAtSlotIndex /* f18d6ec: 02602025 */ move $a0,$s3 /* f18d6f0: 2aa10002 */ slti $at,$s5,0x2 /* f18d6f4: 14200004 */ bnez $at,.PF0f18d708 /* f18d6f8: 00409825 */ move $s3,$v0 /* f18d6fc: 8eca0004 */ lw $t2,0x4($s6) /* f18d700: 504affd6 */ beql $v0,$t2,.PF0f18d65c /* f18d704: 00008025 */ move $s0,$zero .PF0f18d708: /* f18d708: 00135880 */ sll $t3,$s3,0x2 /* f18d70c: 01735823 */ subu $t3,$t3,$s3 /* f18d710: 000b5840 */ sll $t3,$t3,0x1 /* f18d714: 3c038008 */ lui $v1,0x8008 /* f18d718: aed30004 */ sw $s3,0x4($s6) /* f18d71c: 006b1821 */ addu $v1,$v1,$t3 /* f18d720: 94637fc0 */ lhu $v1,0x7fc0($v1) /* f18d724: 3c018008 */ lui $at,0x8008 /* f18d728: 306c01ff */ andi $t4,$v1,0x1ff /* f18d72c: 000c6880 */ sll $t5,$t4,0x2 /* f18d730: 01ac6823 */ subu $t5,$t5,$t4 /* f18d734: 000d68c0 */ sll $t5,$t5,0x3 /* f18d738: 01ac6821 */ addu $t5,$t5,$t4 /* f18d73c: 000d6840 */ sll $t5,$t5,0x1 /* f18d740: ac2d4638 */ sw $t5,0x4638($at) /* f18d744: 1000003c */ b .PF0f18d838 /* f18d748: 00031242 */ srl $v0,$v1,0x9 .PF0f18d74c: /* f18d74c: 0fc6354b */ jal mpGetCurrentTrackSlotNum /* f18d750: 00000000 */ nop /* f18d754: 04410024 */ bgez $v0,.PF0f18d7e8 /* f18d758: 00409825 */ move $s3,$v0 /* f18d75c: 0fc634a9 */ jal mpGetNumUnlockedTracks /* f18d760: 00000000 */ nop /* f18d764: 3c16800b */ lui $s6,0x800b /* f18d768: 00408025 */ move $s0,$v0 /* f18d76c: 26d6d1c0 */ addiu $s6,$s6,-11840 .PF0f18d770: /* f18d770: 0c004ad4 */ jal random /* f18d774: 00000000 */ nop /* f18d778: 0050001b */ divu $zero,$v0,$s0 /* f18d77c: 00002010 */ mfhi $a0 /* f18d780: 16000002 */ bnez $s0,.PF0f18d78c /* f18d784: 00000000 */ nop /* f18d788: 0007000d */ break 0x7 .PF0f18d78c: /* f18d78c: 0fc6348e */ jal mpGetTrackNumAtSlotIndex /* f18d790: 00000000 */ nop /* f18d794: 8ece0004 */ lw $t6,0x4($s6) /* f18d798: 00409825 */ move $s3,$v0 /* f18d79c: 104efff4 */ beq $v0,$t6,.PF0f18d770 /* f18d7a0: 00000000 */ nop /* f18d7a4: 00027880 */ sll $t7,$v0,0x2 /* f18d7a8: 01e27823 */ subu $t7,$t7,$v0 /* f18d7ac: 000f7840 */ sll $t7,$t7,0x1 /* f18d7b0: 3c038008 */ lui $v1,0x8008 /* f18d7b4: aec20004 */ sw $v0,0x4($s6) /* f18d7b8: 006f1821 */ addu $v1,$v1,$t7 /* f18d7bc: 94637fc0 */ lhu $v1,0x7fc0($v1) /* f18d7c0: 3c018008 */ lui $at,0x8008 /* f18d7c4: 307801ff */ andi $t8,$v1,0x1ff /* f18d7c8: 0018c880 */ sll $t9,$t8,0x2 /* f18d7cc: 0338c823 */ subu $t9,$t9,$t8 /* f18d7d0: 0019c8c0 */ sll $t9,$t9,0x3 /* f18d7d4: 0338c821 */ addu $t9,$t9,$t8 /* f18d7d8: 0019c840 */ sll $t9,$t9,0x1 /* f18d7dc: ac394638 */ sw $t9,0x4638($at) /* f18d7e0: 10000015 */ b .PF0f18d838 /* f18d7e4: 00031242 */ srl $v0,$v1,0x9 .PF0f18d7e8: /* f18d7e8: 0fc6348e */ jal mpGetTrackNumAtSlotIndex /* f18d7ec: 02602025 */ move $a0,$s3 /* f18d7f0: 00024080 */ sll $t0,$v0,0x2 /* f18d7f4: 3c16800b */ lui $s6,0x800b /* f18d7f8: 01024023 */ subu $t0,$t0,$v0 /* f18d7fc: 26d6d1c0 */ addiu $s6,$s6,-11840 /* f18d800: 00084040 */ sll $t0,$t0,0x1 /* f18d804: 3c038008 */ lui $v1,0x8008 /* f18d808: aec20004 */ sw $v0,0x4($s6) /* f18d80c: 00681821 */ addu $v1,$v1,$t0 /* f18d810: 94637fc0 */ lhu $v1,0x7fc0($v1) /* f18d814: 3c018008 */ lui $at,0x8008 /* f18d818: 306901ff */ andi $t1,$v1,0x1ff /* f18d81c: 00095080 */ sll $t2,$t1,0x2 /* f18d820: 01495023 */ subu $t2,$t2,$t1 /* f18d824: 000a50c0 */ sll $t2,$t2,0x3 /* f18d828: 01495021 */ addu $t2,$t2,$t1 /* f18d82c: 000a5040 */ sll $t2,$t2,0x1 /* f18d830: ac2a4638 */ sw $t2,0x4638($at) /* f18d834: 00031242 */ srl $v0,$v1,0x9 .PF0f18d838: /* f18d838: 8fbf0034 */ lw $ra,0x34($sp) /* f18d83c: 8fb00018 */ lw $s0,0x18($sp) /* f18d840: 8fb1001c */ lw $s1,0x1c($sp) /* f18d844: 8fb20020 */ lw $s2,0x20($sp) /* f18d848: 8fb30024 */ lw $s3,0x24($sp) /* f18d84c: 8fb40028 */ lw $s4,0x28($sp) /* f18d850: 8fb5002c */ lw $s5,0x2c($sp) /* f18d854: 8fb60030 */ lw $s6,0x30($sp) /* f18d858: 03e00008 */ jr $ra /* f18d85c: 27bd0038 */ addiu $sp,$sp,0x38 ); #else GLOBAL_ASM( glabel mpChooseTrack /* f18c4c0: 27bdffc8 */ addiu $sp,$sp,-56 /* f18c4c4: afbf0034 */ sw $ra,0x34($sp) /* f18c4c8: afb60030 */ sw $s6,0x30($sp) /* f18c4cc: afb5002c */ sw $s5,0x2c($sp) /* f18c4d0: afb40028 */ sw $s4,0x28($sp) /* f18c4d4: afb30024 */ sw $s3,0x24($sp) /* f18c4d8: afb20020 */ sw $s2,0x20($sp) /* f18c4dc: afb1001c */ sw $s1,0x1c($sp) /* f18c4e0: 0fc630a9 */ jal mpGetUsingMultipleTunes /* f18c4e4: afb00018 */ sw $s0,0x18($sp) /* f18c4e8: 10400069 */ beqz $v0,.L0f18c690 /* f18c4ec: 00000000 */ nop /* f18c4f0: 0fc63080 */ jal mpGetNumUnlockedTracks /* f18c4f4: 00000000 */ nop /* f18c4f8: 0040a025 */ or $s4,$v0,$zero /* f18c4fc: 0000a825 */ or $s5,$zero,$zero /* f18c500: 18400009 */ blez $v0,.L0f18c528 /* f18c504: 00008025 */ or $s0,$zero,$zero .L0f18c508: /* f18c508: 0fc630ac */ jal mpIsMultiTrackSlotEnabled /* f18c50c: 02002025 */ or $a0,$s0,$zero /* f18c510: 10400002 */ beqz $v0,.L0f18c51c /* f18c514: 26100001 */ addiu $s0,$s0,0x1 /* f18c518: 26b50001 */ addiu $s5,$s5,0x1 .L0f18c51c: /* f18c51c: 0214082a */ slt $at,$s0,$s4 /* f18c520: 1420fff9 */ bnez $at,.L0f18c508 /* f18c524: 00000000 */ nop .L0f18c528: /* f18c528: 16a0001e */ bnez $s5,.L0f18c5a4 /* f18c52c: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c530: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) .L0f18c534: /* f18c534: 0c004b70 */ jal random /* f18c538: 00000000 */ nop /* f18c53c: 0054001b */ divu $zero,$v0,$s4 /* f18c540: 00002010 */ mfhi $a0 /* f18c544: 16800002 */ bnez $s4,.L0f18c550 /* f18c548: 00000000 */ nop /* f18c54c: 0007000d */ break 0x7 .L0f18c550: /* f18c550: 0fc63065 */ jal mpGetTrackNumAtSlotIndex /* f18c554: 00000000 */ nop /* f18c558: 8ece0004 */ lw $t6,0x4($s6) /* f18c55c: 00409825 */ or $s3,$v0,$zero /* f18c560: 104efff4 */ beq $v0,$t6,.L0f18c534 /* f18c564: 00000000 */ nop /* f18c568: 00027880 */ sll $t7,$v0,0x2 /* f18c56c: 01e27823 */ subu $t7,$t7,$v0 /* f18c570: 000f7840 */ sll $t7,$t7,0x1 /* f18c574: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c578: aec20004 */ sw $v0,0x4($s6) /* f18c57c: 006f1821 */ addu $v1,$v1,$t7 /* f18c580: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) /* f18c584: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c588: 307801ff */ andi $t8,$v1,0x1ff /* f18c58c: 0018c900 */ sll $t9,$t8,0x4 /* f18c590: 0338c823 */ subu $t9,$t9,$t8 /* f18c594: 0019c880 */ sll $t9,$t9,0x2 /* f18c598: ac3940f8 */ sw $t9,%lo(g_MusicLife60)($at) /* f18c59c: 10000073 */ b .L0f18c76c /* f18c5a0: 00031242 */ srl $v0,$v1,0x9 .L0f18c5a4: /* f18c5a4: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c5a8: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) /* f18c5ac: 00008025 */ or $s0,$zero,$zero .L0f18c5b0: /* f18c5b0: 0c004b70 */ jal random /* f18c5b4: 00008825 */ or $s1,$zero,$zero /* f18c5b8: 0055001b */ divu $zero,$v0,$s5 /* f18c5bc: 00009010 */ mfhi $s2 /* f18c5c0: 2413ffff */ addiu $s3,$zero,-1 /* f18c5c4: 16a00002 */ bnez $s5,.L0f18c5d0 /* f18c5c8: 00000000 */ nop /* f18c5cc: 0007000d */ break 0x7 .L0f18c5d0: /* f18c5d0: 5a80000d */ blezl $s4,.L0f18c608 /* f18c5d4: 2401ffff */ addiu $at,$zero,-1 .L0f18c5d8: /* f18c5d8: 0fc630ac */ jal mpIsMultiTrackSlotEnabled /* f18c5dc: 02002025 */ or $a0,$s0,$zero /* f18c5e0: 50400006 */ beqzl $v0,.L0f18c5fc /* f18c5e4: 26100001 */ addiu $s0,$s0,0x1 /* f18c5e8: 56510003 */ bnel $s2,$s1,.L0f18c5f8 /* f18c5ec: 26310001 */ addiu $s1,$s1,0x1 /* f18c5f0: 02009825 */ or $s3,$s0,$zero /* f18c5f4: 26310001 */ addiu $s1,$s1,0x1 .L0f18c5f8: /* f18c5f8: 26100001 */ addiu $s0,$s0,0x1 .L0f18c5fc: /* f18c5fc: 1614fff6 */ bne $s0,$s4,.L0f18c5d8 /* f18c600: 00000000 */ nop /* f18c604: 2401ffff */ addiu $at,$zero,-1 .L0f18c608: /* f18c608: 1661000a */ bne $s3,$at,.L0f18c634 /* f18c60c: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c610: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) /* f18c614: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c618: 306801ff */ andi $t0,$v1,0x1ff /* f18c61c: 00084900 */ sll $t1,$t0,0x4 /* f18c620: 01284823 */ subu $t1,$t1,$t0 /* f18c624: 00094880 */ sll $t1,$t1,0x2 /* f18c628: ac2940f8 */ sw $t1,%lo(g_MusicLife60)($at) /* f18c62c: 1000004f */ b .L0f18c76c /* f18c630: 00031242 */ srl $v0,$v1,0x9 .L0f18c634: /* f18c634: 0fc63065 */ jal mpGetTrackNumAtSlotIndex /* f18c638: 02602025 */ or $a0,$s3,$zero /* f18c63c: 2aa10002 */ slti $at,$s5,0x2 /* f18c640: 14200004 */ bnez $at,.L0f18c654 /* f18c644: 00409825 */ or $s3,$v0,$zero /* f18c648: 8eca0004 */ lw $t2,0x4($s6) /* f18c64c: 504affd8 */ beql $v0,$t2,.L0f18c5b0 /* f18c650: 00008025 */ or $s0,$zero,$zero .L0f18c654: /* f18c654: 00135880 */ sll $t3,$s3,0x2 /* f18c658: 01735823 */ subu $t3,$t3,$s3 /* f18c65c: 000b5840 */ sll $t3,$t3,0x1 /* f18c660: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c664: aed30004 */ sw $s3,0x4($s6) /* f18c668: 006b1821 */ addu $v1,$v1,$t3 /* f18c66c: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) /* f18c670: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c674: 306c01ff */ andi $t4,$v1,0x1ff /* f18c678: 000c6900 */ sll $t5,$t4,0x4 /* f18c67c: 01ac6823 */ subu $t5,$t5,$t4 /* f18c680: 000d6880 */ sll $t5,$t5,0x2 /* f18c684: ac2d40f8 */ sw $t5,%lo(g_MusicLife60)($at) /* f18c688: 10000038 */ b .L0f18c76c /* f18c68c: 00031242 */ srl $v0,$v1,0x9 .L0f18c690: /* f18c690: 0fc63122 */ jal mpGetCurrentTrackSlotNum /* f18c694: 00000000 */ nop /* f18c698: 04410022 */ bgez $v0,.L0f18c724 /* f18c69c: 00409825 */ or $s3,$v0,$zero /* f18c6a0: 0fc63080 */ jal mpGetNumUnlockedTracks /* f18c6a4: 00000000 */ nop /* f18c6a8: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c6ac: 00408025 */ or $s0,$v0,$zero /* f18c6b0: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) .L0f18c6b4: /* f18c6b4: 0c004b70 */ jal random /* f18c6b8: 00000000 */ nop /* f18c6bc: 0050001b */ divu $zero,$v0,$s0 /* f18c6c0: 00002010 */ mfhi $a0 /* f18c6c4: 16000002 */ bnez $s0,.L0f18c6d0 /* f18c6c8: 00000000 */ nop /* f18c6cc: 0007000d */ break 0x7 .L0f18c6d0: /* f18c6d0: 0fc63065 */ jal mpGetTrackNumAtSlotIndex /* f18c6d4: 00000000 */ nop /* f18c6d8: 8ece0004 */ lw $t6,0x4($s6) /* f18c6dc: 00409825 */ or $s3,$v0,$zero /* f18c6e0: 104efff4 */ beq $v0,$t6,.L0f18c6b4 /* f18c6e4: 00000000 */ nop /* f18c6e8: 00027880 */ sll $t7,$v0,0x2 /* f18c6ec: 01e27823 */ subu $t7,$t7,$v0 /* f18c6f0: 000f7840 */ sll $t7,$t7,0x1 /* f18c6f4: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c6f8: aec20004 */ sw $v0,0x4($s6) /* f18c6fc: 006f1821 */ addu $v1,$v1,$t7 /* f18c700: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) /* f18c704: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c708: 307801ff */ andi $t8,$v1,0x1ff /* f18c70c: 0018c900 */ sll $t9,$t8,0x4 /* f18c710: 0338c823 */ subu $t9,$t9,$t8 /* f18c714: 0019c880 */ sll $t9,$t9,0x2 /* f18c718: ac3940f8 */ sw $t9,%lo(g_MusicLife60)($at) /* f18c71c: 10000013 */ b .L0f18c76c /* f18c720: 00031242 */ srl $v0,$v1,0x9 .L0f18c724: /* f18c724: 0fc63065 */ jal mpGetTrackNumAtSlotIndex /* f18c728: 02602025 */ or $a0,$s3,$zero /* f18c72c: 00024080 */ sll $t0,$v0,0x2 /* f18c730: 3c16800b */ lui $s6,%hi(g_MpLockInfo) /* f18c734: 01024023 */ subu $t0,$t0,$v0 /* f18c738: 26d6cc20 */ addiu $s6,$s6,%lo(g_MpLockInfo) /* f18c73c: 00084040 */ sll $t0,$t0,0x1 /* f18c740: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c744: aec20004 */ sw $v0,0x4($s6) /* f18c748: 00681821 */ addu $v1,$v1,$t0 /* f18c74c: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) /* f18c750: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c754: 306901ff */ andi $t1,$v1,0x1ff /* f18c758: 00095100 */ sll $t2,$t1,0x4 /* f18c75c: 01495023 */ subu $t2,$t2,$t1 /* f18c760: 000a5080 */ sll $t2,$t2,0x2 /* f18c764: ac2a40f8 */ sw $t2,%lo(g_MusicLife60)($at) /* f18c768: 00031242 */ srl $v0,$v1,0x9 .L0f18c76c: /* f18c76c: 8fbf0034 */ lw $ra,0x34($sp) /* f18c770: 8fb00018 */ lw $s0,0x18($sp) /* f18c774: 8fb1001c */ lw $s1,0x1c($sp) /* f18c778: 8fb20020 */ lw $s2,0x20($sp) /* f18c77c: 8fb30024 */ lw $s3,0x24($sp) /* f18c780: 8fb40028 */ lw $s4,0x28($sp) /* f18c784: 8fb5002c */ lw $s5,0x2c($sp) /* f18c788: 8fb60030 */ lw $s6,0x30($sp) /* f18c78c: 03e00008 */ jr $ra /* f18c790: 27bd0038 */ addiu $sp,$sp,0x38 ); #endif // Mismatch: goal uses shifting to calculate the offset into g_MpTracks // while the below uses multu. //s32 mpChooseTrack(void) //{ // s32 i; // s32 tracknum; // // if (mpGetUsingMultipleTunes()) { // s32 numunlocked = mpGetNumUnlockedTracks(); // s32 numselected = 0; // // // 508 // for (i = 0; i < numunlocked; i++) { // if (mpIsMultiTrackSlotEnabled(i)) { // numselected++; // } // } // // // 528 // if (numselected == 0) { // do { // tracknum = mpGetTrackNumAtSlotIndex(random() % numunlocked); // } while (tracknum == g_MpLockInfo.unk04); // // // 568 // g_MpLockInfo.unk04 = tracknum; // g_MusicLife60 = g_MpTracks[tracknum].duration * TICKS(60); // // return g_MpTracks[tracknum].musicnum; // } // // // 5a4 // do { // s32 selectionindex = random() % numselected; // s32 selectioncount = 0; // tracknum = -1; // s3 // // // 5d8 // for (i = 0; i < numunlocked; i++) { // if (mpIsMultiTrackSlotEnabled(i)) { // if (selectionindex == selectioncount) { // tracknum = i; // } // // selectioncount++; // } // } // // // 608 // if (tracknum == -1) { // g_MusicLife60 = g_MpTracks[0].duration * TICKS(60); // return g_MpTracks[0].musicnum; // } // // // 634 // tracknum = mpGetTrackNumAtSlotIndex(tracknum); // } while (numselected > 1 && tracknum == g_MpLockInfo.unk04); // // // 654 // g_MpLockInfo.unk04 = tracknum; // g_MusicLife60 = g_MpTracks[tracknum].duration * TICKS(60); // // return g_MpTracks[tracknum].musicnum; // } // // // 690 // tracknum = mpGetCurrentTrackSlotNum(); // // if (tracknum < 0) { // s32 numunlocked = mpGetNumUnlockedTracks(); // // do { // tracknum = mpGetTrackNumAtSlotIndex(random() % numunlocked); // } while (tracknum == g_MpLockInfo.unk04); // // g_MpLockInfo.unk04 = tracknum; // g_MusicLife60 = g_MpTracks[tracknum].duration * TICKS(60); // return g_MpTracks[tracknum].musicnum; // } // // tracknum = mpGetTrackNumAtSlotIndex(tracknum); // g_MpLockInfo.unk04 = tracknum; // g_MusicLife60 = g_MpTracks[g_MpLockInfo.unk04].duration * TICKS(60); // // return g_MpTracks[tracknum].musicnum; //} struct mpchrconfig *mpGetChrConfigBySlotNum(s32 slot) { s32 count = 0; struct mpchrconfig *result = NULL; s32 i; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { if (count == slot) { result = MPCHR(i); break; } count++; } } return result; } #if VERSION >= VERSION_NTSC_1_0 s32 mpGetChrIndexBySlotNum(s32 slot) { s32 count = 0; s32 result = 0; s32 i; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { if (count == slot) { result = i; break; } count++; } } return result; } #endif s32 mpGetNumChrs(void) { s32 count = 0; s32 i; for (i = 0; i != MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { count++; } } return count; } u8 mpFindUnusedTeamNum(void) { u8 teamnum = 0; bool available = false; s32 i; while (teamnum < 7 && !available) { available = true; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { struct mpchrconfig *mpchr = MPCHR(i); if (mpchr->team == teamnum) { available = false; } } } if (!available) { teamnum++; } } if (teamnum > 7) { teamnum = 7; } return teamnum; } void mpCreateBotFromProfile(s32 botnum, u8 profilenum) { s32 headnum = 0; u8 team = mpFindUnusedTeamNum(); bool available = false; s32 i; g_BotConfigsArray[botnum].type = g_BotProfiles[profilenum].type; g_BotConfigsArray[botnum].difficulty = g_BotProfiles[profilenum].difficulty; for (i = 0; i < 4; i++) { g_MpSimulantDifficultiesPerNumPlayers[botnum][i] = g_BotConfigsArray[botnum].difficulty; } g_MpSetup.chrslots |= 1 << (botnum + 4); strcpy(g_BotConfigsArray[botnum].base.name, "Sim\n"); g_BotConfigsArray[botnum].base.team = team; while (!available) { headnum = g_BotHeads[random() % ARRAYCOUNT(g_BotHeads)]; available = true; for (i = 0; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { struct mpchrconfig *mpchr = MPCHR(i); if (mpchr->mpheadnum == headnum) { available = false; } } } } g_BotConfigsArray[botnum].base.mpheadnum = headnum; g_BotConfigsArray[botnum].base.mpbodynum = g_BotProfiles[profilenum].body; } void mpSetBotDifficulty(s32 botnum, s32 difficulty) { s32 i; g_BotConfigsArray[botnum].difficulty = difficulty; for (i = 0; i < 4; i++) { g_MpSimulantDifficultiesPerNumPlayers[botnum][i] = g_BotConfigsArray[botnum].difficulty; } } /** * Return the first unused bot slot (0-7), or return 7 if all slots are full. * * This is used for the quick team feature. */ s32 mpGetSlotForNewBot(void) { s32 i = 0; while (i < MAX_BOTS - 1 && g_MpSetup.chrslots & (1 << (i + 4))) { i++; } return i; } void mpRemoveSimulant(s32 index) { g_MpSetup.chrslots &= ~(1 << (index + 4)); g_BotConfigsArray[index].base.name[0] = '\0'; func0f1881d4(index); mpGenerateBotNames(); } bool mpHasSimulants(void) { if ((g_MpSetup.chrslots & 0xfff0) != 0) { return true; } return false; } bool mpHasUnusedBotSlots(void) { s32 numvacant = mpIsFeatureUnlocked(MPFEATURE_8BOTS) ? MAX_BOTS : 4; s32 i; for (i = 4; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { numvacant--; } } if (numvacant > 0) { return true; } return false; } bool mpIsSimSlotEnabled(s32 slot) { s32 numfree = MAX_BOTS; s32 i; if ((g_MpSetup.chrslots & (1 << (slot + 4))) == 0) { for (i = 0; i < MAX_BOTS; i++) { if (g_MpSetup.chrslots & (1 << (i + 4))) { numfree--; } } if (numfree > 0) { return true; } return false; } return true; } s32 mpFindBotProfile(s32 type, s32 difficulty) { s32 i; if (type == BOTTYPE_GENERAL) { for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { if (g_BotProfiles[i].difficulty == difficulty) { break; } } } else { for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { if (g_BotProfiles[i].type == type) { break; } } } if (i >= ARRAYCOUNT(g_BotProfiles)) { i = -1; } return i; } void mpGenerateBotNames(void) { s32 counts[ARRAYCOUNT(g_BotProfiles)]; s32 profilenum; s32 i; char name[16]; for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { counts[i] = 0; } // Count the number of bots using each profile (MeatSim, TurtleSim etc) for (i = 4; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { profilenum = mpFindBotProfile(g_BotConfigsArray[i - 4].type, g_BotConfigsArray[i - 4].difficulty); if (profilenum >= 0 && profilenum < ARRAYCOUNT(g_BotProfiles)) { counts[profilenum]++; } } } // Profiles with only one bot don't need to have to number appended to the // name, so mark those as -1. For profiles with multiple bots, reset them // to 0 because they'll be a counter for the final loop. for (i = 0; i < ARRAYCOUNT(g_BotProfiles); i++) { if (counts[i] <= 1) { counts[i] = -1; } else { counts[i] = 0; } } for (i = 4; i < MAX_MPCHRS; i++) { if (g_MpSetup.chrslots & (1 << i)) { profilenum = mpFindBotProfile(g_BotConfigsArray[i - 4].type, g_BotConfigsArray[i - 4].difficulty); if (profilenum >= 0 && profilenum < ARRAYCOUNT(g_BotProfiles)) { if (counts[profilenum] >= 0) { // Multiple bots using this profile - append the number counts[profilenum]++; sprintf(name, "%s:%d\n", langGet(g_BotProfiles[profilenum].name), counts[profilenum]); strcpy(g_BotConfigsArray[i - 4].base.name, name); } else { // One bots using this profile - just use the profile name sprintf(name, "%s\n", langGet(g_BotProfiles[profilenum].name)); strcpy(g_BotConfigsArray[i - 4].base.name, name); } } } } } #if VERSION >= VERSION_NTSC_1_0 const char var7f1b8b80[] = "Adding GBCHead to load to slot %d: guid is %x-%x, player is %d\n"; const char var7f1b8bc0[] = "PakId for player %d: %d\n"; const char var7f1b8bdc[] = "Save Player Result: %d New GUID: %x\n"; const char var7f1b8c04[] = "PakId for player %d: %d\n"; const char var7f1b8c20[] = "Load Player - Result: %d\n"; #endif s32 mpPlayerGetIndex(struct chrdata *chr) { s32 i; for (i = 0; i < g_MpNumChrs; i++) { if (g_MpAllChrPtrs[i] == chr) { return i; } } return -1; } struct chrdata *mpGetChrFromPlayerIndex(s32 index) { if (index >= 0 && index < g_MpNumChrs) { return g_MpAllChrPtrs[index]; } return NULL; } s32 func0f18d074(s32 index) { s32 i; for (i = 0; i < 4; i++) { if (&g_PlayerConfigsArray[i].base == g_MpAllChrConfigPtrs[index]) { return i; } } for (i = 0; i < MAX_BOTS; i++) { if (&g_BotConfigsArray[i].base == g_MpAllChrConfigPtrs[index]) { return i + 4; } } return -1; } s32 func0f18d0e8(s32 arg0) { s32 i; if (arg0 < 4) { for (i = 0; i < g_MpNumChrs; i++) { if (g_MpAllChrConfigPtrs[i] == &g_PlayerConfigsArray[arg0].base) { return i; } } } else { for (i = 0; i < g_MpNumChrs; i++) { if (g_MpAllChrConfigPtrs[i] == &g_BotConfigsArray[arg0 - 4].base) { return i; } } } return -1; } void mpplayerfileLoadGunFuncs(struct savebuffer *buffer, s32 playernum) { s32 bitsremaining = 35; s32 i = 0; while (bitsremaining > 0) { s32 numbits = bitsremaining; if (numbits > 8) { numbits = 8; } g_PlayerConfigsArray[playernum].gunfuncs[i] = savebufferReadBits(buffer, numbits); bitsremaining -= 8; i++; } } void mpplayerfileSaveGunFuncs(struct savebuffer *buffer, s32 playernum) { s32 bitsremaining = 35; s32 i = 0; while (bitsremaining > 0) { s32 numbits = bitsremaining; if (numbits > 8) { numbits = 8; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].gunfuncs[i], numbits); bitsremaining -= 8; i++; } } void mpplayerfileLoadWad(s32 playernum, struct savebuffer *buffer, s32 arg2) { struct fileguid guid; u32 stack; s32 i; s32 j; savebufferReadString(buffer, g_PlayerConfigsArray[playernum].base.name, 1); g_PlayerConfigsArray[playernum].time = savebufferReadBits(buffer, 28); if (arg2 != 0) { g_PlayerConfigsArray[playernum].base.mpheadnum = savebufferReadBits(buffer, 7); g_PlayerConfigsArray[playernum].base.mpbodynum = savebufferReadBits(buffer, 7); savebufferReadGuid(buffer, &guid); if (g_PlayerConfigsArray[playernum].base.mpheadnum >= mpGetNumHeads2()) { if (guid.fileid != 0 && guid.deviceserial != 0) { if (g_MenuData.unk668 < 11) { g_MenuData.unk668++; g_MenuData.unk5d8[g_MenuData.unk668].fileguid.fileid = guid.fileid; g_MenuData.unk5d8[g_MenuData.unk668].fileguid.deviceserial = guid.deviceserial; g_MenuData.unk5d8[g_MenuData.unk668].unk08 = g_MpPlayerNum; g_MenuData.unk5d8[g_MenuData.unk668].unk09 = g_MpPlayerNum; } } else { g_PlayerConfigsArray[playernum].base.mpheadnum = MPHEAD_DARK_COMBAT; } } } else { savebufferReadBits(buffer, 7); savebufferReadBits(buffer, 7); savebufferReadGuid(buffer, &guid); } g_PlayerConfigsArray[playernum].base.displayoptions = savebufferReadBits(buffer, 8); g_PlayerConfigsArray[playernum].kills = savebufferReadBits(buffer, 20); g_PlayerConfigsArray[playernum].deaths = savebufferReadBits(buffer, 20); g_PlayerConfigsArray[playernum].gamesplayed = savebufferReadBits(buffer, 19); g_PlayerConfigsArray[playernum].gameswon = savebufferReadBits(buffer, 19); g_PlayerConfigsArray[playernum].gameslost = savebufferReadBits(buffer, 19); g_PlayerConfigsArray[playernum].distance = savebufferReadBits(buffer, 25); g_PlayerConfigsArray[playernum].accuracy = savebufferReadBits(buffer, 10); g_PlayerConfigsArray[playernum].damagedealt = savebufferReadBits(buffer, 26); g_PlayerConfigsArray[playernum].painreceived = savebufferReadBits(buffer, 26); g_PlayerConfigsArray[playernum].headshots = savebufferReadBits(buffer, 20); g_PlayerConfigsArray[playernum].ammoused = savebufferReadBits(buffer, 30); g_PlayerConfigsArray[playernum].accuracymedals = savebufferReadBits(buffer, 18); g_PlayerConfigsArray[playernum].headshotmedals = savebufferReadBits(buffer, 18); g_PlayerConfigsArray[playernum].killmastermedals = savebufferReadBits(buffer, 18); g_PlayerConfigsArray[playernum].survivormedals = savebufferReadBits(buffer, 16); g_PlayerConfigsArray[playernum].controlmode = savebufferReadBits(buffer, 2); g_PlayerConfigsArray[playernum].options = savebufferReadBits(buffer, 12); for (i = 0; i < 30; i++) { for (j = 1; j < 5; j++) { mpSetChallengeCompletedByPlayerWithNumPlayers(playernum, i, j, savebufferReadBits(buffer, 1)); } } mpDetermineUnlockedFeatures(); mpCalculatePlayerTitle(&g_PlayerConfigsArray[playernum]); mpplayerfileLoadGunFuncs(buffer, playernum); } void mpplayerfileSaveWad(s32 playernum, struct savebuffer *buffer) { s32 i; s32 j; u32 stack; func0f0d55a4(buffer, g_PlayerConfigsArray[playernum].base.name); if (g_PlayerConfigsArray[playernum].time > 0x0fffffff) { // over 3106 days g_PlayerConfigsArray[playernum].time = 0x0fffffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].time, 28); savebufferOr(buffer, g_PlayerConfigsArray[playernum].base.mpheadnum, 7); savebufferOr(buffer, g_PlayerConfigsArray[playernum].base.mpbodynum, 7); if (g_PlayerConfigsArray[playernum].base.mpheadnum >= mpGetNumHeads2()) { struct fileguid guid; phGetGuid(g_PlayerConfigsArray[playernum].base.mpheadnum - mpGetNumHeads2(), &guid); savebufferWriteGuid(buffer, &guid); } else { struct fileguid guid; guid.deviceserial = 0; guid.fileid = 0; savebufferWriteGuid(buffer, &guid); } savebufferOr(buffer, g_PlayerConfigsArray[playernum].base.displayoptions, 8); if (g_PlayerConfigsArray[playernum].kills > 0xfffff) { // 1,048,575 g_PlayerConfigsArray[playernum].kills = 0xfffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].kills, 20); if (g_PlayerConfigsArray[playernum].deaths > 0xfffff) { // 1,048,575 g_PlayerConfigsArray[playernum].deaths = 0xfffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].deaths, 20); if (g_PlayerConfigsArray[playernum].gamesplayed > 0x7ffff) { // 524,287 g_PlayerConfigsArray[playernum].gamesplayed = 0x7ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].gamesplayed, 19); if (g_PlayerConfigsArray[playernum].gameswon > 0x7ffff) { // 524,287 g_PlayerConfigsArray[playernum].gameswon = 0x7ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].gameswon, 19); if (g_PlayerConfigsArray[playernum].gameslost > 0x7ffff) { // 524,287 g_PlayerConfigsArray[playernum].gameslost = 0x7ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].gameslost, 19); if (g_PlayerConfigsArray[playernum].distance > 0x1ffffff) { // 33,554,431 g_PlayerConfigsArray[playernum].distance = 0x1ffffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].distance, 25); if (g_PlayerConfigsArray[playernum].accuracy > 0x3ff) { // 1023 g_PlayerConfigsArray[playernum].accuracy = 0x3ff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].accuracy, 10); if (g_PlayerConfigsArray[playernum].damagedealt > 0x3ffffff) { // 67,108,863 g_PlayerConfigsArray[playernum].damagedealt = 0x3ffffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].damagedealt, 26); if (g_PlayerConfigsArray[playernum].painreceived > 0x3ffffff) { // 67,108,863 g_PlayerConfigsArray[playernum].painreceived = 0x3ffffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].painreceived, 26); if (g_PlayerConfigsArray[playernum].headshots > 0xfffff) { // 1,048,575 g_PlayerConfigsArray[playernum].headshots = 0xfffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].headshots, 20); if (g_PlayerConfigsArray[playernum].ammoused > 0x3fffffff) { // 1,073,741,823 g_PlayerConfigsArray[playernum].ammoused = 0x3fffffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].ammoused, 30); if (g_PlayerConfigsArray[playernum].accuracymedals > 0x3ffff) { // 262,143 g_PlayerConfigsArray[playernum].accuracymedals = 0x3ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].accuracymedals, 18); if (g_PlayerConfigsArray[playernum].headshotmedals > 0x3ffff) { // 262,143 g_PlayerConfigsArray[playernum].headshotmedals = 0x3ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].headshotmedals, 18); if (g_PlayerConfigsArray[playernum].killmastermedals > 0x3ffff) { // 262,143 g_PlayerConfigsArray[playernum].killmastermedals = 0x3ffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].killmastermedals, 18); if (g_PlayerConfigsArray[playernum].survivormedals > 0xffff) { // 65,535 g_PlayerConfigsArray[playernum].survivormedals = 0xffff; } savebufferOr(buffer, g_PlayerConfigsArray[playernum].survivormedals, 16); savebufferOr(buffer, g_PlayerConfigsArray[playernum].controlmode, 2); savebufferOr(buffer, g_PlayerConfigsArray[playernum].options, 12); for (i = 0; i < 30; i++) { for (j = 1; j < 5; j++) { savebufferOr(buffer, mpIsChallengeCompletedByPlayerWithNumPlayers(playernum, i, j), 1); } } mpplayerfileSaveGunFuncs(buffer, playernum); } void mpplayerfileGetOverview(char *arg0, char *name, u32 *playtime) { struct savebuffer buffer; func0f0d5484(&buffer, arg0, 15); savebufferReadString(&buffer, name, 0); *playtime = savebufferReadBits(&buffer, 28); } s32 mpplayerfileSave(s32 playernum, s32 device, s32 fileid, u16 deviceserial) { s32 ret; s32 newfileid; struct savebuffer buffer; if (device >= 0) { savebufferClear(&buffer); mpplayerfileSaveWad(playernum, &buffer); func0f0d54c4(&buffer); var80075bd0[2] = true; ret = pakSaveAtGuid(device, fileid, PAKFILETYPE_MPPLAYER, buffer.bytes, &newfileid, 0); if (ret == 0) { g_PlayerConfigsArray[playernum].fileguid.fileid = newfileid; g_PlayerConfigsArray[playernum].fileguid.deviceserial = deviceserial; return 0; } g_FilemgrLastPakError = ret; return -1; } return -1; } s32 mpplayerfileLoad(s32 playernum, s32 device, s32 fileid, u16 deviceserial) { s32 ret; struct savebuffer buffer; if (device >= 0) { savebufferClear(&buffer); ret = pakReadBodyAtGuid(device, fileid, buffer.bytes, 0); if (ret == 0) { g_PlayerConfigsArray[playernum].fileguid.fileid = fileid; g_PlayerConfigsArray[playernum].fileguid.deviceserial = deviceserial; mpplayerfileLoadWad(playernum, &buffer, 1); func0f0d54c4(&buffer); g_PlayerConfigsArray[playernum].handicap = 0x80; return 0; } g_FilemgrLastPakError = ret; return -1; } return -1; } struct mppreset g_MpPresets[NUM_MPPRESETS] = { { L_MPWEAPONS_025, MPCONFIG_NOSHIELD }, // "No Shield" { L_MPWEAPONS_026, MPCONFIG_AUTOMATICS }, // "Automatics" { L_MPWEAPONS_027, MPCONFIG_ROCKETS }, // "Rocket Launcher" { L_MPWEAPONS_028, MPCONFIG_SIMULANTS }, // "Simulants" { L_MPWEAPONS_029, MPCONFIG_SKEDARKING }, // "King of the Hill" { L_MPWEAPONS_030, MPCONFIG_FARSIGHT }, // "Complex FarSight" { L_MPWEAPONS_031, MPCONFIG_BRIEFCASE }, // "Hold the Briefcase" { L_MPWEAPONS_032, MPCONFIG_PISTOLS }, // "Pistol One-Hit Kills" { L_MPWEAPONS_033, MPCONFIG_FLAGS }, // "Capture the Case" { L_MPWEAPONS_034, MPCONFIG_CLOAKING }, // "Cloaking" { L_MPWEAPONS_035, MPCONFIG_TEMPLE }, // "Temple Explosives" { L_MPWEAPONS_036, MPCONFIG_SLAYER }, // "Slayer" { L_MPWEAPONS_037, MPCONFIG_DRUGGUN }, // "Tranquilizr" { L_MPWEAPONS_038, MPCONFIG_SLOWMO }, // "Slow Motion" }; s32 mpGetNumPresets(void) { return NUM_MPPRESETS; } bool mpIsPresetUnlocked(s32 presetnum) { s32 i; for (i = 0; i != 16; i++) { if (!mpIsFeatureUnlocked(g_MpPresets[presetnum].requirefeatures[i]) && g_MpPresets[presetnum].requirefeatures[i] != MPFEATURE_WEAPON_SHIELD) { return false; } } return true; } s32 mpGetNumUnlockedPresets(void) { s32 numunlocked = 0; s32 i; for (i = 0; i != NUM_MPPRESETS; i++) { if (mpIsPresetUnlocked(i)) { numunlocked++; } } return numunlocked; } char *mpGetPresetNameBySlot(s32 slot) { s32 i; for (i = 0; i != 14; i++) { if (mpIsPresetUnlocked(i)) { if (slot == 0) { return langGet(g_MpPresets[i].name); } slot--; } } return ""; } #if VERSION >= VERSION_NTSC_1_0 const char var7f1b8c40[] = "bot %d headId %d bodyId %d\n"; const char var7f1b8c5c[] = "team change %s %d\n"; #if VERSION >= VERSION_PAL_FINAL const char var7f1b8c70[] = "options/mplayer.c"; #else const char var7f1b8c70[] = "mplayer.c"; #endif const char var7f1b8c7c[] = "team change %s %d\n"; #if VERSION >= VERSION_PAL_FINAL const char var7f1b8c90[] = "options/mplayer.c"; #else const char var7f1b8c90[] = "mplayer.c"; #endif const char var7f1b8c9c[] = "SaveMultiGameFile : PakId=0x%x, FileId=0x%x\n"; const char var7f1b8ccc[] = "SaveGame Result: %d New GUID: %x\n"; const char var7f1b8cf0[] = "LoadMultiGameFile : PakId=0x%x, FileId=0x%x\n"; const char var7f1b8d20[] = "LoadGame Result: %d\n"; const char var7f1b8d38[] = "GBCHead: Call to create head for slot %d (gbcheadobjs[slotno]=%x)\n"; #endif // >= VERSION_NTSC_1_0 void mpApplyConfig(struct mpconfigfull *config) { s32 i; s32 j; u16 chrslots; g_MpSetup.scenario = config->config.setup.scenario; #if VERSION >= VERSION_PAL_FINAL chrslots = g_MpSetup.chrslots; #endif scenarioInit(); g_MpSetup = config->config.setup; #if VERSION >= VERSION_PAL_FINAL g_MpSetup.chrslots = chrslots; #endif for (i = 0; i < MAX_BOTS; i++) { g_BotConfigsArray[i].type = config->config.simulants[i].type; for (j = 0; j < 4; j++) { g_MpSimulantDifficultiesPerNumPlayers[i][j] = config->config.simulants[i].difficulties[j]; } g_BotConfigsArray[i].difficulty = g_MpSimulantDifficultiesPerNumPlayers[i][0]; #if VERSION >= VERSION_NTSC_1_0 if (IS4MB()) { // "ShockSim:%d" sprintf(g_BotConfigsArray[i].base.name, langGet(L_MPWEAPONS_241), i + 1); } else { strcpy(g_BotConfigsArray[i].base.name, config->strings.aibotnames[i]); } #else strcpy(g_BotConfigsArray[i].base.name, config->strings.aibotnames[i]); #endif g_BotConfigsArray[i].base.mpheadnum = config->config.simulants[i].mpheadnum; g_BotConfigsArray[i].base.mpbodynum = config->config.simulants[i].mpbodynum; g_BotConfigsArray[i].base.team = config->config.simulants[i].team; } if (!mpIsFeatureUnlocked(MPFEATURE_WEAPON_SHIELD)) { for (i = 0; i < 6; i++) { if (g_MpSetup.weapons[i] == MPWEAPON_SHIELD) { g_MpSetup.weapons[i] = MPWEAPON_NONE; } } } func0f18913c(); func0f19c190(); } void func0f18dec4(s32 slot) { struct mpconfigfull *config; u8 buffer[0x1ca]; s32 confignum = 0; s32 i; for (i = 0; i < 14; i++) { if (mpIsPresetUnlocked(i)) { if (slot == 0) { confignum = g_MpPresets[i].confignum; break; } slot--; } } config = mpLoadConfig(confignum, buffer, sizeof(buffer)); mpApplyConfig(config); } void mpsetupfileLoadWad(struct savebuffer *buffer) { s32 i; s32 j; savebufferReadString(buffer, g_MpSetup.name, false); savebufferReadBits(buffer, 4); g_MpSetup.stagenum = savebufferReadBits(buffer, 7); g_MpSetup.scenario = savebufferReadBits(buffer, 3); scenarioInit(); scenarioReadSave(buffer); g_MpSetup.options = savebufferReadBits(buffer, 21); g_MpSetup.chrslots &= 0x000f; for (i = 0; i < MAX_BOTS; i++) { g_BotConfigsArray[i].base.name[0] = '\0'; g_BotConfigsArray[i].type = savebufferReadBits(buffer, 5); g_BotConfigsArray[i].difficulty = savebufferReadBits(buffer, 3); for (j = 0; j < 4; j++) { g_MpSimulantDifficultiesPerNumPlayers[i][j] = g_BotConfigsArray[i].difficulty; } if (g_BotConfigsArray[i].difficulty != BOTDIFF_DISABLED) { g_MpSetup.chrslots |= 1 << (i + 4); } g_BotConfigsArray[i].base.mpheadnum = savebufferReadBits(buffer, 7); g_BotConfigsArray[i].base.mpbodynum = savebufferReadBits(buffer, 7); g_BotConfigsArray[i].base.team = savebufferReadBits(buffer, 3); } mpGenerateBotNames(); for (i = 0; i < 6; i++) { g_MpSetup.weapons[i] = savebufferReadBits(buffer, 7); } func0f18913c(); g_MpSetup.timelimit = savebufferReadBits(buffer, 6); g_MpSetup.scorelimit = savebufferReadBits(buffer, 7); g_MpSetup.teamscorelimit = savebufferReadBits(buffer, 9); for (i = 0; i < 4; i++) { g_PlayerConfigsArray[i].base.team = savebufferReadBits(buffer, 3); } mpForceUnlockSimulantFeatures(); } void mpsetupfileSaveWad(struct savebuffer *buffer) { s32 numsims = 0; s32 mpbodynum; s32 i; func0f0d55a4(buffer, g_MpSetup.name); for (i = 0; i < MAX_BOTS; i++) { if (g_MpSetup.chrslots & (1 << (i + 4))) { numsims++; } } savebufferOr(buffer, numsims, 4); savebufferOr(buffer, g_MpSetup.stagenum, 7); savebufferOr(buffer, g_MpSetup.scenario, 3); scenarioWriteSave(buffer); savebufferOr(buffer, g_MpSetup.options, 21); for (i = 0; i < MAX_BOTS; i++) { savebufferOr(buffer, g_BotConfigsArray[i].type, 5); if (g_MpSetup.chrslots & (1 << (i + 4))) { savebufferOr(buffer, g_BotConfigsArray[i].difficulty, 3); } else { savebufferOr(buffer, BOTDIFF_DISABLED, 3); } savebufferOr(buffer, g_BotConfigsArray[i].base.mpheadnum, 7); if (g_BotConfigsArray[i].base.mpbodynum == 0xff) { s32 profilenum = mpFindBotProfile(g_BotConfigsArray[i].type, g_BotConfigsArray[i].difficulty); if (profilenum < 0 || profilenum >= ARRAYCOUNT(g_BotProfiles)) { profilenum = 0; } mpbodynum = g_BotProfiles[profilenum].body; } else { mpbodynum = g_BotConfigsArray[i].base.mpbodynum; } savebufferOr(buffer, mpbodynum, 7); savebufferOr(buffer, g_BotConfigsArray[i].base.team, 3); } for (i = 0; i < 6; i++) { savebufferOr(buffer, g_MpSetup.weapons[i], 7); } savebufferOr(buffer, g_MpSetup.timelimit, 6); savebufferOr(buffer, g_MpSetup.scorelimit, 7); savebufferOr(buffer, g_MpSetup.teamscorelimit, 9); for (i = 0; i < 4; i++) { savebufferOr(buffer, g_PlayerConfigsArray[i].base.team, 3); } } void mpsetupfileGetOverview(char *arg0, char *filename, u16 *numsims, u16 *stagenum, u16 *scenarionum) { struct savebuffer buffer; func0f0d5484(&buffer, arg0, 15); savebufferReadString(&buffer, filename, 0); *numsims = savebufferReadBits(&buffer, 4); *stagenum = savebufferReadBits(&buffer, 7); *scenarionum = savebufferReadBits(&buffer, 3); } s32 mpsetupfileSave(s32 device, s32 fileid, u16 deviceserial) { s32 ret; s32 newfileid; struct savebuffer buffer; if (device >= 0) { savebufferClear(&buffer); mpsetupfileSaveWad(&buffer); func0f0d54c4(&buffer); ret = pakSaveAtGuid(device, fileid, PAKFILETYPE_MPSETUP, buffer.bytes, &newfileid, 0); var80075bd0[1] = true; if (ret == 0) { g_MpSetup.fileguid.fileid = newfileid; g_MpSetup.fileguid.deviceserial = deviceserial; return 0; } g_FilemgrLastPakError = ret; return -1; } return -1; } s32 mpsetupfileLoad(s32 device, s32 fileid, u16 deviceserial) { s32 ret; struct savebuffer buffer; if (device >= 0) { savebufferClear(&buffer); ret = pakReadBodyAtGuid(device, fileid, buffer.bytes, 0); if (ret == 0) { g_MpSetup.fileguid.fileid = fileid; g_MpSetup.fileguid.deviceserial = deviceserial; mpsetupfileLoadWad(&buffer); func0f0d54c4(&buffer); return 0; } g_FilemgrLastPakError = ret; return -1; } return -1; } void func0f18e558(void) { s32 i; for (i = 0; i < ARRAYCOUNT(var800acc28); i++) { var800acc28[i] = NULL; } } struct modelfiledata *func0f18e57c(s32 index, s32 *headnum) { return var800acc28[index]; }