forked from Ports/perfect_dark
118 lines
2.6 KiB
C
118 lines
2.6 KiB
C
#include <ultra64.h>
|
|
#include "constants.h"
|
|
#include "game/body.h"
|
|
#include "game/cheats.h"
|
|
#include "game/chrai.h"
|
|
#include "game/game_00b820.h"
|
|
#include "game/playerreset.h"
|
|
#include "game/setuputils.h"
|
|
#include "bss.h"
|
|
#include "lib/memp.h"
|
|
#include "lib/rng.h"
|
|
#include "data.h"
|
|
#include "types.h"
|
|
|
|
void bodiesReset(s32 stagenum)
|
|
{
|
|
s32 *headsavailablelist;
|
|
s32 headsavailablelen;
|
|
bool done;
|
|
s32 i;
|
|
s32 j;
|
|
s32 whichteamlist = 1;
|
|
s32 index;
|
|
|
|
for (i = 0; g_HeadsAndBodies[i].filenum != 0; i++) {
|
|
g_HeadsAndBodies[i].modeldef = NULL;
|
|
}
|
|
|
|
var80062c80 = random() % g_NumBondBodies;
|
|
var80062b14 = 0;
|
|
var80062b18 = 0;
|
|
|
|
if (PLAYERCOUNT() >= 2) {
|
|
g_NumActiveHeadsPerGender = 4;
|
|
} else {
|
|
s32 len = 3;
|
|
|
|
static u8 overrides[3][2] = {
|
|
{ STAGE_INFILTRATION, 5 },
|
|
{ STAGE_RESCUE, 4 },
|
|
{ STAGE_ESCAPE, 5 },
|
|
};
|
|
|
|
g_NumActiveHeadsPerGender = 8;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
if (overrides[i][0] == stagenum) {
|
|
g_NumActiveHeadsPerGender = overrides[i][1];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Male heads
|
|
if (cheatIsActive(CHEAT_TEAMHEADSONLY)) {
|
|
if (whichteamlist) {
|
|
headsavailablelist = g_MaleGuardTeamHeads;
|
|
headsavailablelen = g_NumMaleGuardTeamHeads;
|
|
} else {
|
|
headsavailablelist = g_MaleGuardTeamHeads;
|
|
headsavailablelen = var80062b14;
|
|
}
|
|
} else {
|
|
headsavailablelist = g_MaleGuardHeads;
|
|
headsavailablelen = g_NumMaleGuardHeads;
|
|
}
|
|
|
|
for (i = 0; i < g_NumActiveHeadsPerGender; i++) {
|
|
do {
|
|
done = true;
|
|
g_ActiveMaleHeads[i] = headsavailablelist[random() % headsavailablelen];
|
|
|
|
if (headsavailablelen > g_NumActiveHeadsPerGender) {
|
|
for (j = 0; j < i; j++) {
|
|
if (g_ActiveMaleHeads[j] == g_ActiveMaleHeads[i]) {
|
|
done = false;
|
|
}
|
|
}
|
|
if (j && j && j);
|
|
}
|
|
} while (!done);
|
|
}
|
|
|
|
// Female heads
|
|
if (cheatIsActive(CHEAT_TEAMHEADSONLY)) {
|
|
if (whichteamlist) {
|
|
headsavailablelist = g_FemaleGuardTeamHeads;
|
|
headsavailablelen = g_NumFemaleGuardTeamHeads;
|
|
} else {
|
|
headsavailablelist = g_FemaleGuardTeamHeads;
|
|
headsavailablelen = var80062b18;
|
|
}
|
|
} else {
|
|
headsavailablelist = g_FemaleGuardHeads;
|
|
headsavailablelen = g_NumFemaleGuardHeads;
|
|
}
|
|
|
|
for (i = 0; i < g_NumActiveHeadsPerGender; i++) {
|
|
do {
|
|
done = true;
|
|
g_ActiveFemaleHeads[i] = headsavailablelist[random() % headsavailablelen];
|
|
|
|
if (headsavailablelen > g_NumActiveHeadsPerGender) {
|
|
for (j = 0; j < i; j++) {
|
|
if (g_ActiveFemaleHeads[j] == g_ActiveFemaleHeads[i]) {
|
|
done = false;
|
|
}
|
|
}
|
|
}
|
|
} while (!done);
|
|
}
|
|
|
|
g_ActiveMaleHeadsIndex = 0;
|
|
g_ActiveFemaleHeadsIndex = 0;
|
|
|
|
for (i = 0; i < g_NumActiveHeadsPerGender; i++);
|
|
for (i = 0; i < g_NumActiveHeadsPerGender; i++);
|
|
}
|