Decompile botTickUnpaused

This commit is contained in:
Ryan Dwyer 2021-12-28 22:29:59 +10:00
parent 43ffa8f77a
commit 01272b8f4d
14 changed files with 1587 additions and 3346 deletions

View File

@ -202,7 +202,7 @@ CFLAGS = $(C_DEFINES) \
$(LOOPUNROLL) \ $(LOOPUNROLL) \
-Wab,-r4300_mul \ -Wab,-r4300_mul \
-non_shared \ -non_shared \
-Olimit 1000 \ -Olimit 2000 \
-G 0 \ -G 0 \
-Xcpluscomm \ -Xcpluscomm \
-w2 \ -w2 \

File diff suppressed because it is too large Load Diff

View File

@ -48,7 +48,8 @@ s32 botactGetClipCapacityByFunction(s32 weaponnum, u32 funcnum)
void botactReload(struct chrdata *chr, s32 handnum, bool withsound) void botactReload(struct chrdata *chr, s32 handnum, bool withsound)
{ {
struct aibot *aibot = chr->aibot; struct aibot *aibot = chr->aibot;
aibot->unk02c[handnum] = 0;
aibot->timeuntilreload60[handnum] = 0;
aibot->maulercharge[handnum] = 0; aibot->maulercharge[handnum] = 0;
if (chr->weapons_held[handnum] && !botactIsWeaponThrowable(aibot->weaponnum, aibot->gunfunc)) { if (chr->weapons_held[handnum] && !botactIsWeaponThrowable(aibot->weaponnum, aibot->gunfunc)) {
@ -284,7 +285,7 @@ s32 botactGetWeaponModel(s32 weapon)
return weaponGetModel(weapon); return weaponGetModel(weapon);
} }
bool botactIsWeaponThrowable(u32 weaponnum, bool is_secondary) bool botactIsWeaponThrowable(s32 weaponnum, bool is_secondary)
{ {
switch (weaponnum) { switch (weaponnum) {
case WEAPON_LAPTOPGUN: case WEAPON_LAPTOPGUN:
@ -403,9 +404,9 @@ void botact0f19a37c(struct chrdata *chr)
} }
/** /**
* Get the fire rate of the given weapon? * Get the shoot interval of the given weapon, in time60.
*/ */
s32 botact0f19a60c(s32 weaponnum, s32 funcnum) s32 botactGetShootInterval60(s32 weaponnum, s32 funcnum)
{ {
s32 stack[2]; s32 stack[2];
s32 result = 1; s32 result = 1;

View File

@ -565,12 +565,12 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
} }
break; break;
case WEAPON_CYCLONE: case WEAPON_CYCLONE:
if (funcnum == (chr->aibot->rand % 2)) { if (funcnum == (chr->aibot->random1 % 2)) {
score1--; score1--;
} }
break; break;
case WEAPON_CALLISTO: case WEAPON_CALLISTO:
if (funcnum == (chr->aibot->rand % 2)) { if (funcnum == (chr->aibot->random1 % 2)) {
score1--; score1--;
} }
break; break;
@ -578,8 +578,8 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
if (chr->aibot->cloakdeviceenabled == false if (chr->aibot->cloakdeviceenabled == false
&& botactGetAmmoQuantityByWeapon(chr->aibot, WEAPON_RCP120, FUNC_PRIMARY, true) > 500 && botactGetAmmoQuantityByWeapon(chr->aibot, WEAPON_RCP120, FUNC_PRIMARY, true) > 500
&& chr->aibot->config->difficulty > BOTDIFF_MEAT) { && chr->aibot->config->difficulty > BOTDIFF_MEAT) {
score1 += chr->aibot->rand % 10; score1 += chr->aibot->random1 % 10;
score2 += chr->aibot->rand % 10; score2 += chr->aibot->random1 % 10;
} }
break; break;
case WEAPON_LAPTOPGUN: case WEAPON_LAPTOPGUN:
@ -596,12 +596,12 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
break; break;
case WEAPON_SUPERDRAGON: case WEAPON_SUPERDRAGON:
if (chr->aibot->config->type != BOTDIFF_HARD if (chr->aibot->config->type != BOTDIFF_HARD
&& (chr->aibot->rand % 2) == funcnum) { && (chr->aibot->random1 % 2) == funcnum) {
score1 -= 15; score1 -= 15;
} }
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
if (funcnum == (chr->aibot->rand % 2)) { if (funcnum == (chr->aibot->random1 % 2)) {
score1--; score1--;
} }
break; break;
@ -618,7 +618,7 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
} }
break; break;
case WEAPON_ROCKETLAUNCHER: case WEAPON_ROCKETLAUNCHER:
if (funcnum == (chr->aibot->rand % 2)) { if (funcnum == (chr->aibot->random1 % 2)) {
score1--; score1--;
} }
break; break;
@ -629,7 +629,7 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
if (comparewithtarget) { if (comparewithtarget) {
if (chr->target != -1 if (chr->target != -1
&& chr->aibot->chrsinsight[mpPlayerGetIndex(chrGetTargetProp(chr)->chr)] == 0 && chr->aibot->chrsinsight[mpPlayerGetIndex(chrGetTargetProp(chr)->chr)] == 0
&& (chr->aibot->rand % 2) == 0) { && (chr->aibot->random1 % 2) == 0) {
score1 += 10; score1 += 10;
} else { } else {
score1 -= 10; score1 -= 10;
@ -646,7 +646,7 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
if (comparewithtarget) { if (comparewithtarget) {
if (chr->target != -1 if (chr->target != -1
&& chr->aibot->chrsinsight[mpPlayerGetIndex(chrGetTargetProp(chr)->chr)] == 0 && chr->aibot->chrsinsight[mpPlayerGetIndex(chrGetTargetProp(chr)->chr)] == 0
&& (chr->aibot->rand % 2) == 0) { && (chr->aibot->random1 % 2) == 0) {
score1 = 178; score1 = 178;
score2 = 188; score2 = 188;
} else { } else {
@ -698,11 +698,11 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
if (chr->aibot->config->difficulty <= BOTDIFF_MEAT) { if (chr->aibot->config->difficulty <= BOTDIFF_MEAT) {
score1 = 0; score1 = 0;
score2 = 0; score2 = 0;
} else if (bluramount > PALDOWN(3500) && (chr->aibot->rand % 2) == 0) { } else if (bluramount > PALDOWN(3500) && (chr->aibot->random1 % 2) == 0) {
score1 = chr->aibot->rand % 140 + 48; score1 = chr->aibot->random1 % 140 + 48;
score2 = 188; score2 = 188;
} else if (chr->aibot->rand % 10 == 0) { } else if (chr->aibot->random1 % 10 == 0) {
score1 = chr->aibot->rand % 140 + 48; score1 = chr->aibot->random1 % 140 + 48;
score2 = 188; score2 = 188;
} else { } else {
score1 = 0; score1 = 0;
@ -712,7 +712,7 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
if (bluramount >= PALDOWN(5000)) { if (bluramount >= PALDOWN(5000)) {
score2 = 48; score2 = 48;
if (chr->aibot->rand % 2) { if (chr->aibot->random1 % 2) {
score1 = 0; score1 = 0;
score2 = 0; score2 = 0;
} }
@ -727,10 +727,10 @@ void botinvScoreWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum, s32 arg3
value *= value; value *= value;
value *= value; value *= value;
if (value < chr->aibot->rand) { if (value < chr->aibot->random1) {
score2 = 48; score2 = 48;
if (chr->aibot->rand % 2) { if (chr->aibot->random1 % 2) {
score1 = 0; score1 = 0;
score2 = 0; score2 = 0;
} }
@ -905,19 +905,19 @@ void botinvTick(struct chrdata *chr)
// Every 2-12 seconds, generate a new random value which is used as a factor // Every 2-12 seconds, generate a new random value which is used as a factor
// in various aibot logic. // in various aibot logic.
aibot->randttl60 -= g_Vars.lvupdate240_60; aibot->random1ttl60 -= g_Vars.lvupdate240_60;
if (aibot->randttl60 < 0) { if (aibot->random1ttl60 < 0) {
aibot->randttl60 = PALDOWN(120) + random() % PALDOWN(600); aibot->random1ttl60 = PALDOWN(120) + random() % PALDOWN(600);
aibot->rand = random(); aibot->random1 = random();
} }
if (aibot->unk0c4[1] == 0 if (aibot->cyclonedischarging[HAND_LEFT] == 0
&& aibot->unk0c4[0] == 0 && aibot->cyclonedischarging[HAND_RIGHT] == 0
&& aibot->unk04d[1] <= 0 && aibot->burstsdone[HAND_LEFT] <= 0
&& aibot->unk04d[0] <= 0 && aibot->burstsdone[HAND_RIGHT] <= 0
&& aibot->unk0e0[1] <= 0 && aibot->reaperspeed[HAND_LEFT] <= 0
&& aibot->unk0e0[0] <= 0 && aibot->reaperspeed[HAND_RIGHT] <= 0
&& aibot->skrocket == NULL) { && aibot->skrocket == NULL) {
if (chr->myaction == MA_AIBOTDOWNLOAD) { if (chr->myaction == MA_AIBOTDOWNLOAD) {
keepcurrentweapon = true; keepcurrentweapon = true;
@ -1037,12 +1037,12 @@ bool botinvSwitchToWeapon(struct chrdata *chr, s32 weaponnum, s32 funcnum)
changingfunc = funcnum != aibot->gunfunc; changingfunc = funcnum != aibot->gunfunc;
if (changinggun) { if (changinggun) {
aibot->unk0cc = PALDOWN(60); aibot->changeguntimer60 = PALDOWN(60);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
aibot->unk0c4[i] = 0; aibot->cyclonedischarging[i] = false;
aibot->unk04d[i] = 0; aibot->burstsdone[i] = 0;
aibot->unk0e0[i] = 0; aibot->reaperspeed[i] = 0;
if (chr->weapons_held[i]) { if (chr->weapons_held[i]) {
chr->weapons_held[i]->obj->hidden |= OBJHFLAG_REAPABLE; chr->weapons_held[i]->obj->hidden |= OBJHFLAG_REAPABLE;

View File

@ -112,45 +112,45 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
switch (g_BotConfigsArray[aibotnum].difficulty) { switch (g_BotConfigsArray[aibotnum].difficulty) {
case BOTDIFF_MEAT: case BOTDIFF_MEAT:
aibot->unk000 = 0; aibot->followchance = 0;
break; break;
case BOTDIFF_EASY: case BOTDIFF_EASY:
aibot->unk000 = 10; aibot->followchance = 10;
break; break;
default: default:
case BOTDIFF_NORMAL: case BOTDIFF_NORMAL:
aibot->unk000 = 20; aibot->followchance = 20;
break; break;
case BOTDIFF_HARD: case BOTDIFF_HARD:
aibot->unk000 = 40; aibot->followchance = 40;
break; break;
case BOTDIFF_PERFECT: case BOTDIFF_PERFECT:
aibot->unk000 = 60; aibot->followchance = 60;
break; break;
case BOTDIFF_DARK: case BOTDIFF_DARK:
aibot->unk000 = 0; aibot->followchance = 0;
break; break;
} }
aibot->aibotnum = aibotnum; aibot->aibotnum = aibotnum;
aibot->unk064 = 0; aibot->unk064 = 0;
aibot->fetchprop = NULL; aibot->gotoprop = NULL;
aibot->unk02c[0] = 0; aibot->timeuntilreload60[0] = 0;
aibot->unk02c[1] = 0; aibot->timeuntilreload60[1] = 0;
aibot->unk034 = 0; aibot->throwtimer60 = 0;
aibot->unk040 = 0.0f; aibot->unk040 = 0.0f;
aibot->loadedammo[0] = 0; aibot->loadedammo[0] = 0;
aibot->loadedammo[1] = 0; aibot->loadedammo[1] = 0;
aibot->unk058 = 0; aibot->unk058 = 0;
aibot->unk059 = 0; aibot->unk059 = 0;
aibot->unk05c = 0; aibot->nextbullettimer60[0] = 0;
aibot->unk060 = 0; aibot->nextbullettimer60[1] = 0;
#if !PAL #if !PAL
aibot->unk030 = 301; aibot->unk030 = 301;
#endif #endif
aibot->unk038 = 0; aibot->unk038 = 0;
aibot->unk03e = -1; aibot->punchtimer60[HAND_LEFT] = -1;
aibot->unk03c = 0; aibot->punchtimer60[HAND_RIGHT] = 0;
aibot->attackingplayernum = -1; aibot->attackingplayernum = -1;
aibot->followingplayernum = -1; aibot->followingplayernum = -1;
aibot->dangerouspropnum = -1; aibot->dangerouspropnum = -1;
@ -159,7 +159,7 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
aibot->unk070 = 0.0f; aibot->unk070 = 0.0f;
aibot->distmode = -1; aibot->distmode = -1;
aibot->lastkilledbyplayernum = -1; aibot->lastkilledbyplayernum = -1;
aibot->unk114 = -1; aibot->feudplayernum = -1;
aibot->command = AIBOTCMD_NORMAL; aibot->command = AIBOTCMD_NORMAL;
aibot->unk098 = 0.0f; aibot->unk098 = 0.0f;
@ -169,35 +169,35 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
aibot->weaponnum = WEAPON_UNARMED; aibot->weaponnum = WEAPON_UNARMED;
aibot->unk04d[0] = 0; aibot->burstsdone[0] = 0;
aibot->unk04d[1] = 0; aibot->burstsdone[1] = 0;
aibot->skrocket = NULL; aibot->skrocket = NULL;
aibot->unk0a0 = 0; aibot->unk0a0 = 0;
aibot->gunfunc = 0; aibot->gunfunc = FUNC_PRIMARY;
aibot->iscloserangeweapon = true; aibot->iscloserangeweapon = true;
aibot->teamisonlyai = 0; aibot->teamisonlyai = false;
aibot->unk09c_00 = 0; aibot->hasbriefcase = false;
aibot->unk09c_01 = 0; aibot->hascase = false;
aibot->cloakdeviceenabled = false; aibot->cloakdeviceenabled = false;
aibot->rcp120cloakenabled = false; aibot->rcp120cloakenabled = false;
aibot->unk04c_04 = 0; aibot->unk04c_04 = false;
aibot->unk04c_03 = 0; aibot->unk04c_03 = false;
aibot->unk04c_05 = 0; aibot->hasuplink = false;
aibot->unk04c_00 = 0; aibot->unk04c_00 = false;
aibot->unk048 = -1; aibot->unk048 = -1;
aibot->unk04a = -1; aibot->unk04a = -1;
aibot->unk0bc = -1; aibot->lastknownhill = -1;
aibot->unk0c4[HAND_LEFT] = 0; aibot->cyclonedischarging[HAND_LEFT] = false;
aibot->unk0c4[HAND_RIGHT] = 0; aibot->cyclonedischarging[HAND_RIGHT] = false;
aibot->unk0cc = 0; aibot->changeguntimer60 = 0;
aibot->distmodettl60 = 0; aibot->distmodettl60 = 0;
aibot->unk0d8 = 0; aibot->forcemainloop = false;
aibot->unk0dc = 0; aibot->returntodefendtimer60 = 0;
aibot->unk0e0[HAND_LEFT] = 0; aibot->reaperspeed[HAND_LEFT] = 0;
aibot->unk0e0[HAND_RIGHT] = 0; aibot->reaperspeed[HAND_RIGHT] = 0;
aibot->maulercharge[HAND_LEFT] = 0.0f; aibot->maulercharge[HAND_LEFT] = 0.0f;
aibot->maulercharge[HAND_RIGHT] = 0.0f; aibot->maulercharge[HAND_RIGHT] = 0.0f;
aibot->unk0a4 = model0001ae44(chr->model); aibot->unk0a4 = model0001ae44(chr->model);
@ -210,8 +210,8 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
aibot->shotspeed.x = 0.0f; aibot->shotspeed.x = 0.0f;
aibot->shotspeed.y = 0.0f; aibot->shotspeed.y = 0.0f;
aibot->shotspeed.z = 0.0f; aibot->shotspeed.z = 0.0f;
aibot->unk118 = 0; aibot->commandtimer60 = 0;
aibot->targethotness = 0; aibot->shootdelaytimer60 = 0;
aibot->targetlastseen60 = -1; aibot->targetlastseen60 = -1;
aibot->lastseenanytarget60 = -1; aibot->lastseenanytarget60 = -1;
aibot->targetinsight = false; aibot->targetinsight = false;
@ -232,10 +232,10 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
aibot->unk1d0 = 0; aibot->unk1d0 = 0;
aibot->unk1d4 = 0.0f; aibot->unk1d4 = 0.0f;
aibot->unk1e4 = -1; aibot->unk1e4 = -1;
aibot->unk1e8 = 0; aibot->waypoints[0] = NULL;
aibot->unk208 = 0; aibot->unk208 = 0;
aibot->rand = random(); aibot->random1 = random();
aibot->randttl60 = 0; aibot->random1ttl60 = 0;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
aibot->killsbygunfunc[i][0] = 0.0f; aibot->killsbygunfunc[i][0] = 0.0f;
@ -254,12 +254,11 @@ void botmgrAllocateBot(s32 chrnum, s32 aibotnum)
aibot->dampensuicidesttl60 = 0; aibot->dampensuicidesttl60 = 0;
aibot->unk2c4 = 0.0f; aibot->unk2c4 = 0.0f;
aibot->targetcloaktimer60 = 0; aibot->targetcloaktimer60 = 0;
aibot->canseecloaked = false;
aibot->unk09c_03 = 0; aibot->random2ttl60 = 0;
aibot->random2 = random();
aibot->unk2cc = 0; aibot->randomfrac = random() * (1.0f / U32_MAX);
aibot->unk2d0 = random();
aibot->unk2d4 = random() * (1.0f / U32_MAX);
aibot->cheap = false; aibot->cheap = false;
#if VERSION >= VERSION_NTSC_1_0 #if VERSION >= VERSION_NTSC_1_0
aibot->unk078 = 0; aibot->unk078 = 0;

View File

@ -5106,11 +5106,11 @@ void chrDie(struct chrdata *chr, s32 aplayernum)
botinvDropAll(chr, chr->aibot->weaponnum); botinvDropAll(chr, chr->aibot->weaponnum);
#if VERSION >= VERSION_NTSC_1_0 #if VERSION >= VERSION_NTSC_1_0
chr->aibot->unk09c_00 = 0; chr->aibot->hasbriefcase = false;
chr->aibot->unk09c_01 = 0; chr->aibot->hascase = false;
chr->aibot->unk04c_04 = 0; chr->aibot->unk04c_04 = false;
chr->aibot->unk04c_03 = 0; chr->aibot->unk04c_03 = false;
chr->aibot->unk04c_05 = 0; chr->aibot->hasuplink = false;
#endif #endif
} }
} }
@ -15639,7 +15639,7 @@ glabel var7f1a9184
// if (chr->aibot // if (chr->aibot
// && chr->aibot->weaponnum == WEAPON_REAPER // && chr->aibot->weaponnum == WEAPON_REAPER
// && chr->aibot->gunfunc == FUNC_PRIMARY) { // && chr->aibot->gunfunc == FUNC_PRIMARY) {
// sp208 = (PALDOWN(90) - chr->aibot->unk0e0[handnum]); // sp208 = (PALDOWN(90) - chr->aibot->reaperspeed[handnum]);
// sp208 *= 1.0f / 1.8f; // sp208 *= 1.0f / 1.8f;
// tickspershot *= sp208 + 1; // tickspershot *= sp208 + 1;
// } // }
@ -15731,7 +15731,7 @@ glabel var7f1a9184
// vector.f[2] = cosf(sp200) * cosf(aimangle); // vector.f[2] = cosf(sp200) * cosf(aimangle);
// //
// if (isaibot) { // if (isaibot) {
// bgun0f0a0fac(&vector, chr->aibot->weaponnum, chr->aibot->gunfunc, chr->aibot->unk04d[handnum], botGuessCrouchPos(chr), chr->weapons_held[0] && chr->weapons_held[1]); // bgun0f0a0fac(&vector, chr->aibot->weaponnum, chr->aibot->gunfunc, chr->aibot->burstsdone[handnum], botGuessCrouchPos(chr), chr->weapons_held[0] && chr->weapons_held[1]);
// } // }
// } // }
// //
@ -21792,7 +21792,7 @@ bool chrIsTargetInFov(struct chrdata *chr, u8 arg1, u8 reverse)
return false; return false;
} }
bool func0f04911c(struct chrdata *chr, struct coord *pos, u8 arg2) bool chrIsLookingAtPos(struct chrdata *chr, struct coord *pos, u8 arg2)
{ {
f32 angle = chrGetAngleToPos(chr, pos); f32 angle = chrGetAngleToPos(chr, pos);
@ -23671,14 +23671,14 @@ glabel chrAssignCoverByCriteria
// f32 sqdist; // f32 sqdist;
// f32 y = chr->prop->pos.y + 170; // f32 y = chr->prop->pos.y + 170;
// s32 currefdist = refdist; // s32 currefdist = refdist;
// struct prop *fetchprop; // struct prop *gotoprop;
// //
// if (criteria & COVERCRITERIA_DISTTOFETCHPROP) { // if (criteria & COVERCRITERIA_DISTTOFETCHPROP) {
// if (!chr->aibot || !chr->aibot->fetchprop) { // if (!chr->aibot || !chr->aibot->gotoprop) {
// return -1; // return -1;
// } // }
// //
// fetchprop = chr->aibot->fetchprop; // gotoprop = chr->aibot->gotoprop;
// } // }
// //
// if (chr == NULL) { // if (chr == NULL) {
@ -23733,7 +23733,7 @@ glabel chrAssignCoverByCriteria
// } else if (criteria & COVERCRITERIA_DISTTOTARGET) { // } else if (criteria & COVERCRITERIA_DISTTOTARGET) {
// sqdist = coordGetSquaredDistanceToCoord(&target->pos, cover.pos); // sqdist = coordGetSquaredDistanceToCoord(&target->pos, cover.pos);
// } else if (criteria & COVERCRITERIA_DISTTOFETCHPROP) { // } else if (criteria & COVERCRITERIA_DISTTOFETCHPROP) {
// sqdist = coordGetSquaredDistanceToCoord(&fetchprop->pos, cover.pos); // sqdist = coordGetSquaredDistanceToCoord(&gotoprop->pos, cover.pos);
// } else if (userandomdist) { // } else if (userandomdist) {
// sqdist = random() % 0xf000; // sqdist = random() % 0xf000;
// } else { // } else {

View File

@ -906,9 +906,9 @@ void scenarioHtbTick(void)
if (g_ScenarioData.htb.token == NULL) { if (g_ScenarioData.htb.token == NULL) {
for (i = PLAYERCOUNT(); i < g_MpNumChrs; i++) { for (i = PLAYERCOUNT(); i < g_MpNumChrs; i++) {
#if VERSION >= VERSION_NTSC_1_0 #if VERSION >= VERSION_NTSC_1_0
if (g_MpAllChrPtrs[i]->prop && g_MpAllChrPtrs[i]->aibot->unk09c_00) if (g_MpAllChrPtrs[i]->prop && g_MpAllChrPtrs[i]->aibot->hasbriefcase)
#else #else
if (g_MpAllChrPtrs[i]->aibot->unk09c_00) if (g_MpAllChrPtrs[i]->aibot->hasbriefcase)
#endif #endif
{ {
g_ScenarioData.htb.token = g_MpAllChrPtrs[i]->prop; g_ScenarioData.htb.token = g_MpAllChrPtrs[i]->prop;
@ -936,7 +936,7 @@ void scenarioHtbTick(void)
void scenarioHtbCallback14(struct chrdata *chr) void scenarioHtbCallback14(struct chrdata *chr)
{ {
if (chr) { if (chr) {
if (chr->aibot->unk09c_00) { if (chr->aibot->hasbriefcase) {
chr->aibot->unk0a0 += g_Vars.lvupdate240; chr->aibot->unk0a0 += g_Vars.lvupdate240;
if (chr->aibot->unk0a0 >= PALDOWN(7200)) { if (chr->aibot->unk0a0 >= PALDOWN(7200)) {
@ -1413,7 +1413,7 @@ void scenarioCtcInit(void)
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
s32 j; s32 j;
g_ScenarioData.ctc.spawnpadsperteam[i].teamindex = i; g_ScenarioData.ctc.spawnpadsperteam[i].homepad = i;
g_ScenarioData.ctc.spawnpadsperteam[i].numspawnpads = 0; g_ScenarioData.ctc.spawnpadsperteam[i].numspawnpads = 0;
for (j = 0; j < 6; j++) { for (j = 0; j < 6; j++) {
@ -2496,7 +2496,7 @@ void mpCtcAddPad(s32 *cmd)
s32 i; s32 i;
if (cmd[0] == INTROCMD_CASE) { if (cmd[0] == INTROCMD_CASE) {
g_ScenarioData.ctc.spawnpadsperteam[cmd[1]].teamindex = cmd[2]; g_ScenarioData.ctc.spawnpadsperteam[cmd[1]].homepad = cmd[2];
} }
if (cmd[0] == INTROCMD_CASERESPAWN) { if (cmd[0] == INTROCMD_CASERESPAWN) {
@ -4752,7 +4752,7 @@ void func0f182bf4(void)
g_ScenarioData.htm.unk002 = 0; g_ScenarioData.htm.unk002 = 0;
g_ScenarioData.htm.unk138 = 0; g_ScenarioData.htm.unk138 = 0;
g_ScenarioData.htm.unk0d0 = -1; g_ScenarioData.htm.unk0d0 = -1;
g_ScenarioData.htm.unk0d2 = -1; g_ScenarioData.htm.uplinkingplayernum = -1;
g_ScenarioData.htm.unk0d4 = -1; g_ScenarioData.htm.unk0d4 = -1;
g_ScenarioData.htm.unk140 = 0; g_ScenarioData.htm.unk140 = 0;
@ -5332,7 +5332,7 @@ void scenarioHtmTick(void)
// Check if a simulant is holding it // Check if a simulant is holding it
if (g_ScenarioData.htm.uplink == NULL) { if (g_ScenarioData.htm.uplink == NULL) {
for (i = PLAYERCOUNT(); i < g_MpNumChrs; i++) { for (i = PLAYERCOUNT(); i < g_MpNumChrs; i++) {
if (g_MpAllChrPtrs[i]->aibot->unk04c_05) { if (g_MpAllChrPtrs[i]->aibot->hasuplink) {
g_ScenarioData.htm.uplink = g_MpAllChrPtrs[i]->prop; g_ScenarioData.htm.uplink = g_MpAllChrPtrs[i]->prop;
break; break;
} }
@ -9940,7 +9940,7 @@ void mpPrepareScenario(void)
break; break;
case MPSCENARIO_CAPTURETHECASE: case MPSCENARIO_CAPTURETHECASE:
for (i = 0; i < ARRAYCOUNT(g_ScenarioData.ctc.spawnpadsperteam); i++) { for (i = 0; i < ARRAYCOUNT(g_ScenarioData.ctc.spawnpadsperteam); i++) {
g_ScenarioData.ctc.spawnpadsperteam[i].teamindex = -1; g_ScenarioData.ctc.spawnpadsperteam[i].homepad = -1;
g_ScenarioData.ctc.spawnpadsperteam[i].numspawnpads = 0; g_ScenarioData.ctc.spawnpadsperteam[i].numspawnpads = 0;
for (j = 0; j < ARRAYCOUNT(g_ScenarioData.ctc.spawnpadsperteam[i].spawnpads); j++) { for (j = 0; j < ARRAYCOUNT(g_ScenarioData.ctc.spawnpadsperteam[i].spawnpads); j++) {
@ -12501,7 +12501,7 @@ s32 chrGiveUplink(struct chrdata *chr, struct prop *prop)
if (chr->aibot) { if (chr->aibot) {
propPlayPickupSound(prop, WEAPON_DATAUPLINK); propPlayPickupSound(prop, WEAPON_DATAUPLINK);
botinvGiveSingleWeapon(chr, WEAPON_DATAUPLINK); botinvGiveSingleWeapon(chr, WEAPON_DATAUPLINK);
chr->aibot->unk04c_05 = true; chr->aibot->hasuplink = true;
#if VERSION >= VERSION_NTSC_1_0 #if VERSION >= VERSION_NTSC_1_0
obj->hidden |= OBJHFLAG_REAPABLE; obj->hidden |= OBJHFLAG_REAPABLE;

View File

@ -6047,8 +6047,8 @@ void objFree(struct defaultobj *obj, bool freeprop, bool canregen)
s32 i; s32 i;
for (i = 0; i < g_MpNumChrs; i++) { for (i = 0; i < g_MpNumChrs; i++) {
if (g_MpAllChrPtrs[i]->aibot && g_MpAllChrPtrs[i]->aibot->fetchprop == obj->prop) { if (g_MpAllChrPtrs[i]->aibot && g_MpAllChrPtrs[i]->aibot->gotoprop == obj->prop) {
g_MpAllChrPtrs[i]->aibot->fetchprop = NULL; g_MpAllChrPtrs[i]->aibot->gotoprop = NULL;
} }
} }
} }

View File

@ -640,6 +640,7 @@
#define COVERFLAG_0020 0x0020 #define COVERFLAG_0020 0x0020
#define COVERFLAG_0040 0x0040 #define COVERFLAG_0040 0x0040
#define COVERFLAG_0080 0x0080 #define COVERFLAG_0080 0x0080
#define COVERFLAG_0100 0x0100
// L/C/R = left/centered/right // L/C/R = left/centered/right
// big/med/sml is the font size // big/med/sml is the font size
@ -3063,6 +3064,7 @@
#define PADFLAG_AIDUCK 0x4000 #define PADFLAG_AIDUCK 0x4000
#define PADFLAG_8000 0x8000 #define PADFLAG_8000 0x8000
#define PADFLAG_10000 0x10000 #define PADFLAG_10000 0x10000
#define PADFLAG_20000 0x20000
#define PAK010_00 0 #define PAK010_00 0
#define PAK010_01 1 #define PAK010_01 1

View File

@ -4,7 +4,7 @@
#include "data.h" #include "data.h"
#include "types.h" #include "types.h"
bool bot0f190260(struct chrdata *chr); bool botIsDizzy(struct chrdata *chr);
void botReset(struct chrdata *chr, u8 respawning); void botReset(struct chrdata *chr, u8 respawning);
void botSpawn(struct chrdata *chr, u8 full); void botSpawn(struct chrdata *chr, u8 full);
void botSpawnAll(void); void botSpawnAll(void);
@ -14,7 +14,7 @@ bool botTestPropForPickup(struct prop *prop, struct chrdata *chr);
void botCheckPickups(struct chrdata *chr); void botCheckPickups(struct chrdata *chr);
s32 botGuessCrouchPos(struct chrdata *chr); s32 botGuessCrouchPos(struct chrdata *chr);
bool botApplyMovement(struct chrdata *chr); bool botApplyMovement(struct chrdata *chr);
bool bot0f191638(struct chrdata *chr, bool arg1); bool botIsAboutToAttack(struct chrdata *chr, bool arg1);
s32 botTick(struct prop *prop); s32 botTick(struct prop *prop);
f32 botCalculateMaxSpeed(struct chrdata *chr); f32 botCalculateMaxSpeed(struct chrdata *chr);
@ -32,8 +32,8 @@ void bot0f192a74(struct chrdata *chr);
bool botPassesPeaceCheck(struct chrdata *botchr, struct chrdata *otherchr); bool botPassesPeaceCheck(struct chrdata *botchr, struct chrdata *otherchr);
bool botPassesCowardCheck(struct chrdata *botchr, struct chrdata *otherchr); bool botPassesCowardCheck(struct chrdata *botchr, struct chrdata *otherchr);
void botChooseGeneralTarget(struct chrdata *chr); void botChooseGeneralTarget(struct chrdata *chr);
void bot0f19369c(struct chrdata *chr, s32 arg1); void botScheduleReload(struct chrdata *chr, s32 handnum);
s32 bot0f1937a4(struct chrdata *chr, s32 arg1); struct prop *botFindPickup(struct chrdata *chr, s32 arg1);
s32 botGetNumOpponentsInHill(struct chrdata *chr); s32 botGetNumOpponentsInHill(struct chrdata *chr);
void botTickUnpaused(struct chrdata *chr); void botTickUnpaused(struct chrdata *chr);
s32 botIsObjCollectable(struct defaultobj *obj); s32 botIsObjCollectable(struct defaultobj *obj);
@ -46,15 +46,15 @@ void botApplyProtect(struct chrdata *chr, struct prop *prop);
void botApplyDefend(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3); void botApplyDefend(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3);
void botApplyHold(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3); void botApplyHold(struct chrdata *chr, struct coord *pos, s16 *room, f32 arg3);
void botApplyScenarioCommand(struct chrdata *chr, u32 arg1); void botApplyScenarioCommand(struct chrdata *chr, u32 arg1);
bool botIsFollowing(struct chrdata *leader, struct chrdata *follower); bool botCanFollow(struct chrdata *leader, struct chrdata *follower);
s32 bot0f193530(struct chrdata *chr, f32 range); s32 botFindTeammateToFollow(struct chrdata *chr, f32 range);
bool bot0f194670(struct chrdata *chr); bool bot0f194670(struct chrdata *chr);
s32 bot0f194694(struct chrdata *chr); struct prop *botFindNecessaryPickup(struct chrdata *chr);
s32 bot0f1946b4(struct chrdata *chr); struct prop *botFindUnnecessaryPickup(struct chrdata *chr);
s32 botGetNumPlayerTeammates(struct chrdata *chr); s32 botGetTeamSize(struct chrdata *chr);
s32 botCountByCommand(struct chrdata *self, u32 command, bool includeself); s32 botGetCountInTeamDoingCommand(struct chrdata *self, u32 command, bool includeself);
s32 botIsChrsTokenHeld(struct chrdata *chr); s32 botIsChrsCtcTokenHeld(struct chrdata *chr);
bool bot0f19489c(struct chrdata *chr); bool botShouldReturnCtcToken(struct chrdata *chr);
s32 botGetNumTeammatesDefendingHill(struct chrdata *bot); s32 botGetNumTeammatesDefendingHill(struct chrdata *bot);
void botCheckFetch(struct chrdata *chr); void botCheckFetch(struct chrdata *chr);

View File

@ -13,11 +13,11 @@ s32 botactTryRemoveAmmoFromReserve(struct aibot *aibot, s32 weaponnum, s32 funcn
void botactGiveAmmoByWeapon(struct aibot *aibot, s32 weaponnum, s32 funcnum, s32 qty); void botactGiveAmmoByWeapon(struct aibot *aibot, s32 weaponnum, s32 funcnum, s32 qty);
void botactGiveAmmoByType(struct aibot *aibot, u32 ammotype, s32 quantity); void botactGiveAmmoByType(struct aibot *aibot, u32 ammotype, s32 quantity);
bool botactShootFarsight(struct chrdata *chr, s32 arg1, struct coord *arg2, struct coord *arg3); bool botactShootFarsight(struct chrdata *chr, s32 arg1, struct coord *arg2, struct coord *arg3);
bool botactIsWeaponThrowable(u32 weaponnum, bool is_secondary); bool botactIsWeaponThrowable(s32 weaponnum, bool is_secondary);
u32 botactGetProjectileThrowInterval(u32 weapon); u32 botactGetProjectileThrowInterval(u32 weapon);
u32 botactGetWeaponByAmmoType(u32 ammotype); u32 botactGetWeaponByAmmoType(u32 ammotype);
void botact0f19a37c(struct chrdata *chr); void botact0f19a37c(struct chrdata *chr);
s32 botact0f19a60c(s32 weaponnum, s32 funcnum); s32 botactGetShootInterval60(s32 weaponnum, s32 funcnum);
bool botactFindRocketRoute(struct chrdata *chr, struct coord *frompos, struct coord *topos, s16 *fromrooms, s16 *torooms, struct projectile *projectile); bool botactFindRocketRoute(struct chrdata *chr, struct coord *frompos, struct coord *topos, s16 *fromrooms, s16 *torooms, struct projectile *projectile);
void botactGetRocketSpawnPos(u16 padnum, struct coord *pos); void botactGetRocketSpawnPos(u16 padnum, struct coord *pos);
void botactCreateSlayerRocket(struct chrdata *chr); void botactCreateSlayerRocket(struct chrdata *chr);

View File

@ -188,7 +188,7 @@ bool chrIsInTargetsFovX(struct chrdata *chr, u8 fov360);
bool chrIsVerticalAngleToTargetWithin(struct chrdata *chr, u8 arg1); bool chrIsVerticalAngleToTargetWithin(struct chrdata *chr, u8 arg1);
f32 func0f048fcc(struct chrdata *chr, u8 reverse); f32 func0f048fcc(struct chrdata *chr, u8 reverse);
bool chrIsTargetInFov(struct chrdata *chr, u8 arg1, u8 reverse); bool chrIsTargetInFov(struct chrdata *chr, u8 arg1, u8 reverse);
bool func0f04911c(struct chrdata *chr, struct coord *pos, u8 arg2); bool chrIsLookingAtPos(struct chrdata *chr, struct coord *pos, u8 arg2);
f32 chrGetSameFloorDistanceToPad(struct chrdata *chr, s32 pad_id); f32 chrGetSameFloorDistanceToPad(struct chrdata *chr, s32 pad_id);
void chrsClearRefsToPlayer(s32 playernum); void chrsClearRefsToPlayer(s32 playernum);
s32 chrResolveId(struct chrdata *ref, s32 id); s32 chrResolveId(struct chrdata *ref, s32 id);

View File

@ -9,7 +9,7 @@ extern struct mpconfigfull *g_MpCurrentChallengeConfig;
extern struct challenge g_MpChallenges[NUM_CHALLENGES]; extern struct challenge g_MpChallenges[NUM_CHALLENGES];
bool ai0176(void); bool ai0176(void);
u32 func0f19ab70(void); bool func0f19ab70(s32 room, struct coord *arg1, s32 *arg2, s32 *arg3, s32 *arg4);
void mpDetermineUnlockedFeatures(void); void mpDetermineUnlockedFeatures(void);
void mpPerformSanityChecks(void); void mpPerformSanityChecks(void);
char *mpGetChallengeNameBySlot(s32 slot); char *mpGetChallengeNameBySlot(s32 slot);

View File

@ -407,7 +407,7 @@ struct explosion;
struct prop { struct prop {
/*0x00*/ u8 type; /*0x00*/ u8 type;
/*0x01*/ u8 flags; /*0x01*/ u8 flags;
/*0x02*/ s16 timetoregen; // ticks down /*0x02*/ s16 timetoregen; // 0 when available, ticks down when unavailable
/*0x04*/ /*0x04*/
union { union {
@ -830,24 +830,23 @@ struct waypoint {
}; };
struct aibot { struct aibot {
/*0x000*/ u8 unk000; /*0x000*/ u8 followchance;
/*0x002*/ s16 aibotnum; /*0x002*/ s16 aibotnum;
/*0x004*/ struct mpbotconfig *config; /*0x004*/ struct mpbotconfig *config;
/*0x008*/ s16 attackingplayernum; /*0x008*/ s16 attackingplayernum;
/*0x00a*/ s16 followingplayernum; /*0x00a*/ s16 followingplayernum;
/*0x00c*/ s16 dangerouspropnum; // index into g_DangerousProps /*0x00c*/ s16 dangerouspropnum; // index into g_DangerousProps
/*0x010*/ struct prop *fetchprop; /*0x010*/ struct prop *gotoprop;
/*0x014*/ struct invitem *items; /*0x014*/ struct invitem *items;
/*0x018*/ s8 maxitems; /*0x018*/ s8 maxitems;
/*0x01c*/ s32 *ammoheld; /*0x01c*/ s32 *ammoheld;
/*0x020*/ s32 weaponnum; /*0x020*/ s32 weaponnum;
/*0x024*/ s32 loadedammo[2]; // amount of ammo in current clip /*0x024*/ s32 loadedammo[2]; // amount of ammo in current clip
/*0x02c*/ s16 unk02c[2]; /*0x02c*/ s16 timeuntilreload60[2];
/*0x030*/ u32 unk030; // timer of some sort /*0x030*/ u32 unk030; // timer of some sort
/*0x034*/ u32 unk034; /*0x034*/ s32 throwtimer60;
/*0x038*/ u32 unk038; /*0x038*/ u32 unk038;
/*0x03c*/ u16 unk03c; /*0x03c*/ s16 punchtimer60[2];
/*0x03e*/ s16 unk03e;
/*0x040*/ f32 unk040; /*0x040*/ f32 unk040;
/*0x044*/ struct prop *skrocket; /*0x044*/ struct prop *skrocket;
/*0x048*/ s16 unk048; /*0x048*/ s16 unk048;
@ -857,24 +856,15 @@ struct aibot {
/*0x04c*/ u8 gunfunc : 1; /*0x04c*/ u8 gunfunc : 1;
/*0x04c*/ u8 unk04c_03 : 1; /*0x04c*/ u8 unk04c_03 : 1;
/*0x04c*/ u8 unk04c_04 : 1; /*0x04c*/ u8 unk04c_04 : 1;
/*0x04c*/ u8 unk04c_05 : 1; /*0x04c*/ u8 hasuplink : 1;
/*0x04c*/ u8 cloakdeviceenabled : 1; /*0x04c*/ u8 cloakdeviceenabled : 1;
/*0x04c*/ u8 unk04c_07 : 1; /*0x04d*/ u8 burstsdone[2];
/*0x04d*/ u8 unk04d[2];
/*0x04f*/ u8 teamisonlyai : 1; /*0x04f*/ u8 teamisonlyai : 1;
/*0x04f*/ u8 unk04f_01 : 1;
/*0x04f*/ u8 unk04f_02 : 1;
/*0x04f*/ u8 unk04f_03 : 1;
/*0x04f*/ u8 unk04f_04 : 1;
/*0x04f*/ u8 unk04f_05 : 1;
/*0x04f*/ u8 unk04f_06 : 1;
/*0x04f*/ u8 unk04f_07 : 1;
/*0x050*/ struct prop *unk050; /*0x050*/ struct prop *unk050;
/*0x054*/ u32 unk054; /*0x054*/ u32 unk054;
/*0x058*/ u8 unk058; // related to fireslots /*0x058*/ u8 unk058; // related to fireslots
/*0x059*/ u8 unk059; /*0x059*/ u8 unk059;
/*0x05c*/ u32 unk05c; /*0x05c*/ s32 nextbullettimer60[2];
/*0x060*/ u32 unk060;
/** /**
* 0x0001 = has unlimited ammo (darksim?) * 0x0001 = has unlimited ammo (darksim?)
@ -891,17 +881,17 @@ struct aibot {
/*0x076*/ s16 lastkilledbyplayernum; /*0x076*/ s16 lastkilledbyplayernum;
/*0x078*/ u8 unk078; /*0x078*/ u8 unk078;
/*0x079*/ u8 command; /*0x079*/ u8 command;
/*0x07a*/ s16 rooms[1]; /*0x07a*/ s16 defendholdrooms[1];
/*0x07c*/ u32 unk07c; /*0x07c*/ u32 unk07c;
/*0x080*/ u32 unk080; /*0x080*/ u32 unk080;
/*0x084*/ u32 unk084; /*0x084*/ u32 unk084;
/*0x088*/ u32 unk088; /*0x088*/ u32 unk088;
/*0x08c*/ struct coord defendholdpos; /*0x08c*/ struct coord defendholdpos;
/*0x098*/ f32 unk098; /*0x098*/ f32 unk098;
/*0x09c*/ u8 unk09c_00 : 1; /*0x09c*/ u8 hasbriefcase : 1; // htb
/*0x09c*/ u8 unk09c_01 : 1; /*0x09c*/ u8 hascase : 1; // ctc
/*0x09c*/ u8 rcp120cloakenabled : 1; /*0x09c*/ u8 rcp120cloakenabled : 1;
/*0x09c*/ u8 unk09c_03 : 1; /*0x09c*/ u8 canseecloaked : 1;
/*0x09c*/ u8 unk09c_04 : 1; /*0x09c*/ u8 unk09c_04 : 1;
/*0x09c*/ u8 unk09c_05 : 1; /*0x09c*/ u8 unk09c_05 : 1;
/*0x09c*/ u8 unk09c_06 : 1; /*0x09c*/ u8 unk09c_06 : 1;
@ -914,27 +904,22 @@ struct aibot {
/*0x0b0*/ f32 unk0b0; // likely to be the turn angle to 360 degrees, in radians /*0x0b0*/ f32 unk0b0; // likely to be the turn angle to 360 degrees, in radians
/*0x0b4*/ f32 unk0b4; /*0x0b4*/ f32 unk0b4;
/*0x0b8*/ f32 unk0b8; /*0x0b8*/ f32 unk0b8;
/*0x0bc*/ s32 unk0bc; /*0x0bc*/ s32 lastknownhill;
/*0x0c0*/ s32 attackpropnum; /*0x0c0*/ s32 attackpropnum;
/*0x0c4*/ u32 unk0c4[2]; /*0x0c4*/ bool cyclonedischarging[2];
/*0x0cc*/ u32 unk0cc; // Timer? Related to weapon switching /*0x0cc*/ s32 changeguntimer60;
/*0x0d0*/ s32 distmodettl60; /*0x0d0*/ s32 distmodettl60;
/*0x0d4*/ s32 followprotectpropnum; /*0x0d4*/ s32 followprotectpropnum;
/*0x0d8*/ s32 unk0d8; /*0x0d8*/ bool forcemainloop;
/*0x0dc*/ u32 unk0dc; /*0x0dc*/ s32 returntodefendtimer60;
/*0x0e0*/ s16 unk0e0[2]; /*0x0e0*/ s16 reaperspeed[2];
/*0x0e4*/ f32 maulercharge[2]; /*0x0e4*/ f32 maulercharge[2];
/*0x0ec*/ u32 unk0ec; /*0x0ec*/ struct coord gotopos;
/*0x0f0*/ u32 unk0f0; /*0x0f8*/ s16 gotorooms[8];
/*0x0f4*/ u32 unk0f4;
/*0x0f8*/ u32 unk0f8;
/*0x0fc*/ u32 unk0fc;
/*0x100*/ u32 unk100;
/*0x104*/ u32 unk104;
/*0x108*/ struct coord shotspeed; // "boost" when aibot is shot /*0x108*/ struct coord shotspeed; // "boost" when aibot is shot
/*0x114*/ s32 unk114; /*0x114*/ s32 feudplayernum;
/*0x118*/ u32 unk118; /*0x118*/ s32 commandtimer60;
/*0x11c*/ s32 targethotness; // ticks up when target onscreen, down when offscreen, always >= 0 /*0x11c*/ s32 shootdelaytimer60; // ticks up when target onscreen, down when offscreen, always >= 0
/*0x120*/ s32 targetlastseen60; /*0x120*/ s32 targetlastseen60;
/*0x124*/ s32 lastseenanytarget60; /*0x124*/ s32 lastseenanytarget60;
/*0x128*/ bool targetinsight; /*0x128*/ bool targetinsight;
@ -950,21 +935,14 @@ struct aibot {
/*0x1cc*/ s32 unk1cc; /*0x1cc*/ s32 unk1cc;
/*0x1d0*/ u32 unk1d0; /*0x1d0*/ u32 unk1d0;
/*0x1d4*/ f32 unk1d4; /*0x1d4*/ f32 unk1d4;
/*0x1d8*/ u32 unk1d8; /*0x1d8*/ s32 abortattacktimer60;
/*0x1dc*/ u32 unk1dc; /*0x1dc*/ bool canbreakdefend;
/*0x1e0*/ u32 unk1e0; /*0x1e0*/ bool canbreakfollow;
/*0x1e4*/ s32 unk1e4; /*0x1e4*/ s32 unk1e4;
/*0x1e8*/ u32 unk1e8; /*0x1e8*/ struct waypoint *waypoints[8];
/*0x1ec*/ u32 unk1ec;
/*0x1f0*/ u32 unk1f0;
/*0x1f4*/ u32 unk1f4;
/*0x1f8*/ u32 unk1f8;
/*0x1fc*/ u32 unk1fc;
/*0x200*/ u32 unk200;
/*0x204*/ u32 unk204;
/*0x208*/ s32 unk208; /*0x208*/ s32 unk208;
/*0x20c*/ s32 randttl60; /*0x20c*/ s32 random1ttl60;
/*0x210*/ u32 rand; /*0x210*/ u32 random1;
/*0x214*/ f32 killsbygunfunc[6][2]; /*0x214*/ f32 killsbygunfunc[6][2];
/*0x244*/ f32 suicidesbygunfunc[6][2]; /*0x244*/ f32 suicidesbygunfunc[6][2];
/*0x274*/ s32 equipdurations60[6][2]; /*0x274*/ s32 equipdurations60[6][2];
@ -987,9 +965,9 @@ struct aibot {
*/ */
/*0x2c8*/ s32 targetcloaktimer60; /*0x2c8*/ s32 targetcloaktimer60;
/*0x2cc*/ u32 unk2cc; /*0x2cc*/ s32 random2ttl60;
/*0x2d0*/ u32 unk2d0; /*0x2d0*/ u32 random2;
/*0x2d4*/ f32 unk2d4; /*0x2d4*/ f32 randomfrac;
/*0x2d8*/ u32 unk2d8; /*0x2d8*/ u32 unk2d8;
/*0x2dc*/ u32 unk2dc; /*0x2dc*/ u32 unk2dc;
}; };
@ -4796,7 +4774,7 @@ struct scenariodata_htm {
/*0x800ac114*/ s16 padnums[60]; /*0x800ac114*/ s16 padnums[60];
/*0x800ac18c*/ struct htmthing unk07c[7]; // only the first element is used? /*0x800ac18c*/ struct htmthing unk07c[7]; // only the first element is used?
/*0x800ac1e0*/ s16 unk0d0; /*0x800ac1e0*/ s16 unk0d0;
/*0x800ac1e2*/ s16 unk0d2; /*0x800ac1e2*/ s16 uplinkingplayernum;
/*0x800ac1e4*/ s32 unk0d4; /*0x800ac1e4*/ s32 unk0d4;
/*0x800ac1e8*/ u32 unk0d8[12]; /*0x800ac1e8*/ u32 unk0d8[12];
/*0x800ac218*/ u32 unk108[12]; /*0x800ac218*/ u32 unk108[12];
@ -4830,7 +4808,7 @@ struct scenariodata_koh {
}; };
struct ctcspawnpadsperteam { struct ctcspawnpadsperteam {
s16 teamindex; s16 homepad;
s16 numspawnpads; s16 numspawnpads;
s16 spawnpads[6]; s16 spawnpads[6];
}; };
@ -5168,15 +5146,15 @@ struct modelstate {
u16 scale; u16 scale;
}; };
struct simdifficulty { struct botdifficulty {
u8 unk00; u8 shootdelay;
f32 unk04; f32 unk04;
f32 unk08; f32 unk08;
u16 unk0c; u16 unk0c;
f32 unk10; f32 unk10;
f32 unk14; f32 unk14;
f32 unk18; f32 unk18;
s32 blurdrugamount; s32 dizzyamount;
}; };
struct animtablerow { struct animtablerow {
@ -6959,8 +6937,8 @@ struct aibotweaponpreference {
u16 unk08; u16 unk08;
u16 unk0a; u16 unk0a;
u16 unk0c; u16 unk0c;
u16 unk0e_00 : 3; u16 reloaddelay : 3; // in seconds
u16 unk0e_03 : 1; u16 allowpartialreloaddelay : 1;
}; };
struct handweaponinfo { struct handweaponinfo {