mirror of
https://github.com/perfect-dark-pc-port/perfect_dark.git
synced 2026-10-24 00:02:43 +02:00
12632 lines
332 KiB
C
12632 lines
332 KiB
C
#include <ultra64.h>
|
|
#include "constants.h"
|
|
#include "constants.h"
|
|
#include "game/bondmove.h"
|
|
#include "game/cheats.h"
|
|
#include "game/chr/chraction.h"
|
|
#include "game/chr/chrai.h"
|
|
#include "game/chr/chraicommands.h"
|
|
#include "game/debug.h"
|
|
#include "game/dlights.h"
|
|
#include "game/game_011110.h"
|
|
#include "game/title.h"
|
|
#include "game/chr/chr.h"
|
|
#include "game/prop.h"
|
|
#include "game/game_091e10.h"
|
|
#include "game/game_092610.h"
|
|
#include "game/game_095320.h"
|
|
#include "game/atan2f.h"
|
|
#include "game/bondgun.h"
|
|
#include "game/game_0b0fd0.h"
|
|
#include "game/game_0b28d0.h"
|
|
#include "game/game_0b69d0.h"
|
|
#include "game/hudmsg.h"
|
|
#include "game/inventory/inventory.h"
|
|
#include "game/game_127910.h"
|
|
#include "game/explosions/explosions.h"
|
|
#include "game/smoke/smoke.h"
|
|
#include "game/weather/weather.h"
|
|
#include "game/bg.h"
|
|
#include "game/game_1655c0.h"
|
|
#include "game/game_165670.h"
|
|
#include "game/game_1657c0.h"
|
|
#include "game/lv.h"
|
|
#include "game/music.h"
|
|
#include "game/training/training.h"
|
|
#include "game/gamefile.h"
|
|
#include "game/lang.h"
|
|
#include "game/pad.h"
|
|
#include "game/options.h"
|
|
#include "game/propobj.h"
|
|
#include "game/mpstats.h"
|
|
#include "bss.h"
|
|
#include "lib/main.h"
|
|
#include "lib/model.h"
|
|
#include "lib/snd.h"
|
|
#include "lib/music.h"
|
|
#include "lib/rng.h"
|
|
#include "lib/mtx.h"
|
|
#include "lib/ailist.h"
|
|
#include "lib/anim.h"
|
|
#include "lib/lib_317f0.h"
|
|
#include "lib/libc/ll.h"
|
|
#include "data.h"
|
|
#include "types.h"
|
|
|
|
/**
|
|
* @cmd 0000
|
|
*/
|
|
bool aiGoToNext(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
osSyncPrintf(" (%d)\n", cmd[2]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0001
|
|
*/
|
|
bool aiGoToFirst(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, 0, cmd[2]);
|
|
osSyncPrintf(" (%d)\n", cmd[2]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0002
|
|
*/
|
|
bool aiLabel(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0003
|
|
*/
|
|
bool aiYield(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->ailist = g_Vars.ailist;
|
|
g_Vars.chrdata->aioffset = g_Vars.aioffset;
|
|
} else if (g_Vars.truck) {
|
|
g_Vars.truck->ailist = g_Vars.ailist;
|
|
g_Vars.truck->aioffset = g_Vars.aioffset;
|
|
} else if (g_Vars.heli) {
|
|
g_Vars.heli->ailist = g_Vars.ailist;
|
|
g_Vars.heli->aioffset = g_Vars.aioffset;
|
|
} else if (g_Vars.hovercar) {
|
|
g_Vars.hovercar->ailist = g_Vars.ailist;
|
|
g_Vars.hovercar->aioffset = g_Vars.aioffset;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0005
|
|
*/
|
|
bool aiSetList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 ailistid = cmd[4] | (cmd[3] << 8);
|
|
u8 *ailist = ailistFindById(ailistid & 0xffff);
|
|
|
|
struct chrdata *chr = g_Vars.chrdata;
|
|
|
|
if ((cmd[2] & 0xff) == CHR_SELF) {
|
|
g_Vars.ailist = ailist;
|
|
g_Vars.aioffset = 0;
|
|
} else {
|
|
chr = chrFindById(chr, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->ailist = ailist;
|
|
chr->aioffset = 0;
|
|
chr->sleep = 0;
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0006
|
|
*/
|
|
bool aiSetReturnList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[4] | (cmd[3] << 8);
|
|
struct chrdata *chr;
|
|
|
|
if (g_Vars.chrdata) {
|
|
if (cmd[2] == CHR_SELF) {
|
|
g_Vars.chrdata->aireturnlist = ailistid;
|
|
} else {
|
|
chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->aireturnlist = ailistid;
|
|
}
|
|
}
|
|
} else if (g_Vars.truck) {
|
|
g_Vars.truck->aireturnlist = ailistid;
|
|
} else if (g_Vars.heli) {
|
|
g_Vars.heli->aireturnlist = ailistid;
|
|
} else if (g_Vars.hovercar) {
|
|
g_Vars.hovercar->aireturnlist = ailistid;
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0007
|
|
*/
|
|
bool aiSetShotList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->aishotlist = ailistid;
|
|
} else if (g_Vars.truck) {
|
|
osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.truck!\n");
|
|
} else if (g_Vars.heli) {
|
|
osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.heli!\n");
|
|
} else if (g_Vars.hovercar) {
|
|
osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.hovercar!\n");
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
const char var7f1a9524[] = "BOND IN ROOM \n";
|
|
const char var7f1a9534[] = "bond not in room \n";
|
|
const char var7f1a9548[] = "aTimer%s%s: %f\n";
|
|
const char var7f1a9558[] = "";
|
|
const char var7f1a955c[] = "";
|
|
const char var7f1a9560[] = "bTimer:%s%s %f\n";
|
|
const char var7f1a9570[] = "";
|
|
const char var7f1a9574[] = "";
|
|
const char var7f1a9578[] = "ai_ifbondintank: tank code has been removed.\n";
|
|
const char var7f1a95a8[] = "AI_BONDENABLECONTROL\n";
|
|
const char var7f1a95c0[] = "ai(void) enery tune on (%d, %d, %d)\n";
|
|
const char var7f1a95e8[] = "ai(void) enery tune off (%d)\n";
|
|
const char var7f1a9608[] = "%s%sAI_PRINT(void) height = %f ptop = %f \n\n";
|
|
const char var7f1a9638[] = "";
|
|
const char var7f1a963c[] = "";
|
|
const char var7f1a9640[] = "Preset character = %d, my target = %d \n";
|
|
const char var7f1a9668[] = "characters target is %d \n";
|
|
const char var7f1a9684[] = "(DGD)chrai.c(void) aiIfChrsTargetIsChr does not support CHR_BOND as chr1!\n";
|
|
const char var7f1a96d0[] = "(DGD)chrai.c(void) aiIfChrsTargetIsChr does not support CHR_BOND as chr1!\n";
|
|
const char var7f1a971c[] = "DGD(void) (chrai.c) WARNING! attempt to use invalid CHR_PRESET1 - defaulting to JO\n";
|
|
const char var7f1a9770[] = "RISK CHECK = %d \n";
|
|
const char var7f1a9784[] = "aiIfOpportunityFireJumpF() called with no botdata!\n";
|
|
const char var7f1a97b8[] = "TARGET %d PASSED THE DISTANCE 2 TESTS \n";
|
|
const char var7f1a97e0[] = "%d I NOTICE THE TARGET %d\n";
|
|
const char var7f1a97fc[] = "%d I NOTICE THE TARGET %d\n";
|
|
const char var7f1a9818[] = "%d OPPORTUNITY FIRE A CHARACTER = %d \n";
|
|
const char var7f1a9840[] = "%d CANNOT OPPORTUNITY FIRE A TARGET \n";
|
|
const char var7f1a9868[] = " RISK CHECK = %d \n";
|
|
const char var7f1a987c[] = "dist = %d \n";
|
|
const char var7f1a9888[] = "USING VOICE NUMBER %d \n";
|
|
const char var7f1a98a0[] = "SETORDERS COMMAND \n";
|
|
const char var7f1a98b8[] = "SQUADRON MEMBER CHR NUMBER = %d \n";
|
|
const char var7f1a98dc[] = "DOING DIST CHECK \n";
|
|
const char var7f1a98f0[] = "%d SYNCHED WITH A CHARACTER %d \n";
|
|
const char var7f1a9914[] = "synched = %d \n";
|
|
const char var7f1a9924[] = "LEADER'S GOING TO COVER \n";
|
|
const char var7f1a9940[] = "LEADER IS BREAKING COVER \n";
|
|
const char var7f1a995c[] = " I AM SAFE TO BREAK COVER \n";
|
|
const char var7f1a9978[] = "not safe to break cover \n";
|
|
const char var7f1a9994[] = "LEADER IS COVER SEEN \n";
|
|
const char var7f1a99ac[] = "LEADER IS FLANKING LEFT \n";
|
|
const char var7f1a99c8[] = "LEADER IS FLANKING RIGHT \n";
|
|
const char var7f1a99e4[] = "LEADER IS DODGING \n";
|
|
const char var7f1a99f8[] = "LEADER IS THROWING GRENADE \n";
|
|
const char var7f1a9a18[] = "LEADER HAS SEEN FROM WAIT \n";
|
|
const char var7f1a9a34[] = "UNKNOWN LEADER ACTION \n";
|
|
const char var7f1a9a4c[] = "ORDERS CARRIED OUT ";
|
|
const char var7f1a9a64[] = "WITHDRAWING!!!!!!!!!!!\n";
|
|
const char var7f1a9a7c[] = "CHECKING MY ORDERS ";
|
|
const char var7f1a9a94[] = "ACTING ON MY ORDERS ";
|
|
const char var7f1a9aac[] = "DOING DIST CHECK VS CHAR %d\n";
|
|
const char var7f1a9acc[] = "I'm just carrying out my ORDERS \n";
|
|
const char var7f1a9af0[] = "SQUAD IS DOING THAT ACTION\n";
|
|
const char var7f1a9b0c[] = "SQUAD NOT DOING ACTION\n";
|
|
const char var7f1a9b24[] = "g_Vars.CommandInfo.chrdata ->soundtimer = %d, g_Vars.CommandInfo.chrdata->talkgap = %d , soundgap = %d\n";
|
|
const char var7f1a9b8c[] = "RESETTING THE LISTENING \n";
|
|
const char var7f1a9ba8[] = "couldn't go to cover from danger !\n";
|
|
const char var7f1a9bcc[] = "couldn't find cover from danger !\n";
|
|
const char var7f1a9bf0[] = "Randnum = %d, Alarmrandnum = %d \n";
|
|
const char var7f1a9c18[] = "IVE FOUND MY PAD %d \n";
|
|
|
|
/**
|
|
* @cmd 01c1
|
|
*/
|
|
bool aiSetPunchDodgeList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->aipunchdodgelist = ailistid;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c2
|
|
*/
|
|
bool aiSetShootingAtMeList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->aishootingatmelist = ailistid;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c3
|
|
*/
|
|
bool aiSetDarkRoomList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->aidarkroomlist = ailistid;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c4
|
|
*/
|
|
bool aiSetPlayerDeadList(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 ailistid = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
g_Vars.chrdata->aiplayerdeadlist = ailistid;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0008
|
|
*/
|
|
bool aiReturn(void)
|
|
{
|
|
u8 *ailist = NULL;
|
|
|
|
if (g_Vars.chrdata) {
|
|
ailist = ailistFindById(g_Vars.chrdata->aireturnlist);
|
|
} else if (g_Vars.truck) {
|
|
ailist = ailistFindById(g_Vars.truck->aireturnlist);
|
|
} else if (g_Vars.heli) {
|
|
ailist = ailistFindById(g_Vars.heli->aireturnlist);
|
|
} else if (g_Vars.hovercar) {
|
|
ailist = ailistFindById(g_Vars.hovercar->aireturnlist);
|
|
}
|
|
|
|
g_Vars.ailist = ailist;
|
|
g_Vars.aioffset = 0;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0004
|
|
*/
|
|
bool aiEndList(void)
|
|
{
|
|
s32 ailistid;
|
|
bool is_global;
|
|
ailistid = chraiGetListIdByList(g_Vars.ailist, &is_global);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0009
|
|
*/
|
|
bool aiStop(void)
|
|
{
|
|
if (g_Vars.chrdata) {
|
|
chrTryStop(g_Vars.chrdata);
|
|
} else if (g_Vars.hovercar) {
|
|
chopperStop(g_Vars.hovercar);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000a
|
|
*/
|
|
bool aiKneel(void)
|
|
{
|
|
chrTryKneel(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000b
|
|
*/
|
|
bool aiChrDoAnimation(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 anim_id = cmd[3] | (cmd[2] << 8);
|
|
s32 startframe = cmd[5] | (cmd[4] << 8);
|
|
s32 endframe = cmd[7] | (cmd[6] << 8);
|
|
struct chrdata *chr = NULL;
|
|
f32 fstartframe;
|
|
f32 fendframe;
|
|
|
|
if (g_Vars.chrdata) {
|
|
chr = chrFindById(g_Vars.chrdata, cmd[10]);
|
|
}
|
|
|
|
if (startframe == 0xffff) {
|
|
fstartframe = 0;
|
|
} else if (startframe == 0xfffe) {
|
|
fstartframe = animGetNumFrames(anim_id) - 1;
|
|
} else {
|
|
fstartframe = startframe;
|
|
}
|
|
|
|
if (endframe == 0xffff) {
|
|
fendframe = -1.0f;
|
|
} else {
|
|
fendframe = endframe;
|
|
}
|
|
|
|
if (chr && chr->model) {
|
|
f32 speed = 1.0f / (s32)cmd[11];
|
|
|
|
if (g_Vars.in_cutscene) {
|
|
if (startframe != 0xfffe) {
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
fstartframe += var8009e388pf * speed;
|
|
#else
|
|
fstartframe += g_CutsceneFrameOverrun240 * speed * 0.25f;
|
|
#endif
|
|
}
|
|
|
|
chr->prop->propupdate240 = 0;
|
|
}
|
|
|
|
chrTryStartAnim(chr, anim_id, fstartframe, fendframe, cmd[8], cmd[9], speed);
|
|
|
|
if (startframe == 0xfffe) {
|
|
chr0f0220ec(chr, 1, 1);
|
|
|
|
if (chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
struct player *player = g_Vars.players[playernum];
|
|
player->vv_ground = chr->ground;
|
|
player->vv_manground = chr->ground;
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 12;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000c
|
|
*/
|
|
bool aiIfIdle(void)
|
|
{
|
|
if (g_Vars.chrdata->actiontype == ACT_ANIM) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool func0f04e418(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000d
|
|
*/
|
|
bool aiBeSurprisedOneHand(void)
|
|
{
|
|
chrTrySurprisedOneHand(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000e
|
|
*/
|
|
bool aiBeSurprisedLookAround(void)
|
|
{
|
|
chrTrySurprisedLookAround(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0032
|
|
*/
|
|
bool aiIfStopped(void)
|
|
{
|
|
if (chrIsStopped(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0033
|
|
*/
|
|
bool aiIfChrDead(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if ((!chr || !chr->prop || chr->prop->type != PROPTYPE_PLAYER) && (!chr || !chr->model || chrIsDead(chr))) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0034
|
|
*/
|
|
bool aiIfChrDeathAnimationFinished(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
bool pass;
|
|
|
|
if (!chr || !chr->prop) {
|
|
pass = true;
|
|
} else {
|
|
if (chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
pass = g_Vars.players[playernum]->isdead;
|
|
} else {
|
|
pass = (chr->actiontype == ACT_DEAD);
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017b
|
|
*/
|
|
bool aiIfChrKnockedOut(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if ((!chr || !chr->prop || chr->prop->type != PROPTYPE_PLAYER) &&
|
|
(!chr || !chr->model || chr->actiontype == ACT_DRUGGEDKO || chr->actiontype == ACT_DRUGGEDDROP || chr->actiontype == ACT_DRUGGEDCOMINGUP)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0035
|
|
*/
|
|
bool aiIfTargetInSight(void)
|
|
{
|
|
if (chrCheckTargetInSight(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 000f
|
|
*/
|
|
bool aiTrySidestep(void)
|
|
{
|
|
if (chrTrySidestep(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0010
|
|
*/
|
|
bool aiTryJumpOut(void)
|
|
{
|
|
if (chrTryJumpOut(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0011
|
|
*/
|
|
bool aiTryRunSideways(void)
|
|
{
|
|
if (chrTryRunSideways(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0012
|
|
*/
|
|
bool aiTryAttackWalk(void)
|
|
{
|
|
if (chrTryAttackWalk(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0013
|
|
*/
|
|
bool aiTryAttackRun(void)
|
|
{
|
|
if (chrTryAttackRun(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0014
|
|
*/
|
|
bool aiTryAttackRoll(void)
|
|
{
|
|
if (chrTryAttackRoll(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0015
|
|
*/
|
|
bool aiTryAttackStand(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 thingid = cmd[5] | (cmd[4] << 8);
|
|
u32 thingtype = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrTryAttackStand(g_Vars.chrdata, thingtype, thingid)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0016
|
|
*/
|
|
bool aiTryAttackKneel(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 thingid = cmd[5] | (cmd[4] << 8);
|
|
u32 thingtype = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrTryAttackKneel(g_Vars.chrdata, thingtype, thingid)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ba
|
|
*/
|
|
bool aiTryAttackLie(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 thingid = cmd[5] | (cmd[4] << 8);
|
|
u32 thingtype = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrTryAttackLie(g_Vars.chrdata, thingtype, thingid)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f0
|
|
*/
|
|
bool ai00f0(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->actiontype == ACT_ATTACK &&
|
|
!g_Vars.chrdata->act_attack.reaim &&
|
|
g_Vars.chrdata->act_attack.flags & ATTACKFLAG_DONTTURN) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f1
|
|
*/
|
|
bool aiIfAttacking(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->actiontype == ACT_ATTACK) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0017
|
|
*/
|
|
bool aiTryModifyAttack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 thingid = cmd[5] | (cmd[4] << 8);
|
|
u32 thingtype = cmd[3] | (cmd[2] << 8);
|
|
|
|
if ((g_Vars.chrdata && chrTryModifyAttack(g_Vars.chrdata, thingtype, thingid)) ||
|
|
(g_Vars.hovercar && chopperAttack(g_Vars.hovercar))) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0018
|
|
*/
|
|
bool aiFaceEntity(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 thingid = cmd[5] | (cmd[4] << 8);
|
|
u32 thingtype = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrFaceEntity(g_Vars.chrdata, thingtype, thingid)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0019
|
|
*/
|
|
bool ai0019(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct coord pos = {0, 0, 0};
|
|
|
|
if (chr && chr->prop) {
|
|
f32 damage = gsetGetDamage((struct gset *)&cmd[4]);
|
|
chrDamageByImpact(chr, damage, &pos, (struct gset *)&cmd[4], NULL, (s8)cmd[3]);
|
|
}
|
|
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001a
|
|
*/
|
|
bool aiChrDamageChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr1 = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct chrdata *chr2 = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr1 && chr2 && chr1->prop && chr2->prop) {
|
|
struct prop *prop = chrGetHeldUsableProp(chr1, HAND_RIGHT);
|
|
f32 damage;
|
|
struct coord vector = {0, 0, 0};
|
|
struct weaponobj *weapon;
|
|
|
|
if (!prop) {
|
|
prop = chrGetHeldUsableProp(chr1, HAND_LEFT);
|
|
}
|
|
|
|
if (prop) {
|
|
vector.x = chr2->prop->pos.x - chr1->prop->pos.x;
|
|
vector.y = chr2->prop->pos.y - chr1->prop->pos.y;
|
|
vector.z = chr2->prop->pos.z - chr1->prop->pos.z;
|
|
guNormalize(&vector.x, &vector.y, &vector.z);
|
|
weapon = prop->weapon;
|
|
damage = gsetGetDamage((struct gset *)&weapon->weaponnum);
|
|
chrDamageByImpact(chr2, damage, &vector, (struct gset *)&weapon->weaponnum, chr1->prop, (s8)cmd[4]);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001b
|
|
*/
|
|
bool aiConsiderGrenadeThrow(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 value2 = cmd[5] | (cmd[4] << 8);
|
|
u32 value1 = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrConsiderGrenadeThrow(g_Vars.chrdata, value1, value2)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001c
|
|
*/
|
|
bool aiDropItem(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 modelnum = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrDropItem(g_Vars.chrdata, modelnum & 0xffff, cmd[4] & 0xff)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0024
|
|
*/
|
|
bool aiSurrender(void)
|
|
{
|
|
chrTrySurrender(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0025
|
|
*/
|
|
bool aiFadeOut(void)
|
|
{
|
|
chrFadeOut(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0026
|
|
*/
|
|
bool aiRemoveChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop) {
|
|
chr->hidden |= 0x20;
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0027
|
|
*/
|
|
bool aiTryStartAlarm(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (chrTryStartAlarm(g_Vars.chrdata, pad_id)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0028
|
|
*/
|
|
bool aiActivateAlarm(void)
|
|
{
|
|
alarmActivate();
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0029
|
|
*/
|
|
bool aiDeactivateAlarm(void)
|
|
{
|
|
alarmDeactivate();
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002a
|
|
*/
|
|
bool aiTryRunFromTarget(void)
|
|
{
|
|
if (chrTryRunFromTarget(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002b
|
|
*/
|
|
bool aiTryJogToTargetProp(void)
|
|
{
|
|
if (chrGoToTarget(g_Vars.chrdata, SPEED_JOG)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002c
|
|
*/
|
|
bool aiTryWalkToTargetProp(void)
|
|
{
|
|
if (chrGoToTarget(g_Vars.chrdata, SPEED_WALK)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002d
|
|
*/
|
|
bool aiTryRunToTargetProp(void)
|
|
{
|
|
if (chrGoToTarget(g_Vars.chrdata, SPEED_RUN)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002e
|
|
*/
|
|
bool aiTryGoToCoverProp(void)
|
|
{
|
|
if (chrGoToCoverProp(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist,g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 002f
|
|
*/
|
|
bool aiTryJogToChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGoToChr(g_Vars.chrdata, cmd[2], SPEED_JOG)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0030
|
|
*/
|
|
bool aiTryWalkToChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGoToChr(g_Vars.chrdata, cmd[2], SPEED_WALK)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0031
|
|
*/
|
|
bool aiTryRunToChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGoToChr(g_Vars.chrdata, cmd[2], SPEED_RUN)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0036
|
|
*/
|
|
bool aiRandom(void)
|
|
{
|
|
g_Vars.chrdata->random = random() & 0xff;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0037
|
|
*/
|
|
bool aiIfRandomLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if ((g_Vars.chrdata && g_Vars.chrdata->random < cmd[2]) ||
|
|
(g_Vars.hovercar && ((u8)random()) < cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0038
|
|
*/
|
|
bool aiIfRandomGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if ((g_Vars.chrdata && g_Vars.chrdata->random > cmd[2]) ||
|
|
(g_Vars.hovercar && ((u8)random()) > cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001d
|
|
*/
|
|
bool aiJogToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad = cmd[3] | (cmd[2] << 8);
|
|
|
|
chrGoToPad(g_Vars.chrdata, pad, SPEED_JOG);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001e
|
|
*/
|
|
bool aiGoToPadPreset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
switch (cmd[2]) {
|
|
case 0:
|
|
chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_WALK);
|
|
break;
|
|
case 1:
|
|
chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_JOG);
|
|
break;
|
|
default:
|
|
chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, SPEED_RUN);
|
|
break;
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 001f
|
|
*/
|
|
bool aiWalkToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad = cmd[3] | (cmd[2] << 8);
|
|
|
|
chrGoToPad(g_Vars.chrdata, pad, SPEED_WALK);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0020
|
|
*/
|
|
bool aiRunToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad = cmd[3] | (cmd[2] << 8);
|
|
|
|
chrGoToPad(g_Vars.chrdata, pad, SPEED_RUN);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0021
|
|
*/
|
|
bool aiSetPath(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
chrSetPath(g_Vars.chrdata, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0022
|
|
*/
|
|
bool aiStartPatrol(void)
|
|
{
|
|
chrTryStartPatrol(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0039
|
|
*/
|
|
bool aiIfCanHearAlarm(void)
|
|
{
|
|
if (chrCanHearAlarm(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0023
|
|
*/
|
|
bool aiIfPatrolling(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->actiontype == ACT_PATROL
|
|
|| (g_Vars.chrdata->actiontype == ACT_GOPOS && g_Vars.chrdata->act_gopos.flags & GOPOSFLAG_FORPATHSTART)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003a
|
|
*/
|
|
bool aiIfAlarmActive(void)
|
|
{
|
|
if (alarmIsActive()) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003b
|
|
*/
|
|
bool aiIfGasActive(void)
|
|
{
|
|
if (gasIsActive()) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003c
|
|
*/
|
|
bool aiIfHearsTarget(void)
|
|
{
|
|
if (chrIsHearingTarget(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003d
|
|
*/
|
|
bool aiIfSawInjury(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrSawInjury(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003e
|
|
*/
|
|
bool aiIfSawDeath(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrSawDeath(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 003f
|
|
*/
|
|
bool aiIfCanSeeTarget(void)
|
|
{
|
|
if ((g_Vars.chrdata && chrCanSeeTarget(g_Vars.chrdata)) ||
|
|
(g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar))) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017a
|
|
*/
|
|
bool aiIfCanSeeAttackTarget(void)
|
|
{
|
|
if ((g_Vars.chrdata && g_Vars.chrdata->prop && chrCanSeeAttackTarget(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, true))
|
|
|| (g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar))) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0040
|
|
*/
|
|
bool aiIfTargetNearlyInSight(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 distance = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
if (chrIsTargetNearlyInSight(g_Vars.chrdata, distance)) {
|
|
cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0041
|
|
*/
|
|
bool aiIfNearlyInTargetsSight(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 distance = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
if (chrIsNearlyInTargetsSight(g_Vars.chrdata, distance)) {
|
|
cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0042
|
|
*/
|
|
bool aiSetPadPresetToPadOnRouteToTarget(void)
|
|
{
|
|
if (chrSetPadPresetToPadOnRouteToTarget(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0043
|
|
*/
|
|
bool aiIfSawTargetRecently(void)
|
|
{
|
|
if (chrSawTargetRecently(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0044
|
|
*/
|
|
bool aiIfHeardTargetRecently(void)
|
|
{
|
|
if (chrHeardTargetRecently(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0045
|
|
*/
|
|
bool ai0045(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chrHasLineOfSightToPos(g_Vars.chrdata, &chr->prop->pos, chr->prop->rooms)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0046
|
|
*/
|
|
bool aiIfNeverBeenOnScreen(void)
|
|
{
|
|
if ((g_Vars.chrdata->chrflags & CHRCFLAG_EVERONSCREEN) == 0) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0047
|
|
*/
|
|
bool aiIfOnScreen(void)
|
|
{
|
|
if (g_Vars.chrdata->prop->flags & (PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONANYSCREENPREVTICK)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0048
|
|
*/
|
|
bool aiIfChrInActiveRoom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
u8 pass = false;
|
|
s32 i;
|
|
|
|
if (chr && chr->prop) {
|
|
for (i = 0; chr->prop->rooms[i] != -1; i++) {
|
|
if (roomIsVisibleByAnyPlayer(chr->prop->rooms[i])) {
|
|
pass = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0049
|
|
*/
|
|
bool aiIfRoomActive(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
s32 room_id = chrGetPadRoom(g_Vars.chrdata, pad_id);
|
|
|
|
if (room_id >= 0 && roomIsVisibleByAnyPlayer(room_id)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004a
|
|
*/
|
|
bool ai004a(void)
|
|
{
|
|
if (chrCanSeeTargetWithExtraCheck(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004b
|
|
*/
|
|
bool aiIfNearMiss(void)
|
|
{
|
|
if (chrResetNearMiss(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004c
|
|
*/
|
|
bool aiIfSeesSuspiciousItem(void)
|
|
{
|
|
s16 *ptr;
|
|
ubool pass = false;
|
|
struct prop *prop;
|
|
struct defaultobj *obj;
|
|
s16 propnums[256];
|
|
struct prop *chrprop = g_Vars.chrdata->prop;
|
|
|
|
roomGetProps(chrprop->rooms, &propnums[0], 256);
|
|
|
|
ptr = &propnums[0];
|
|
|
|
while (*ptr >= 0) {
|
|
prop = &g_Vars.props[*ptr];
|
|
obj = prop->obj;
|
|
|
|
if (prop->type == PROPTYPE_WEAPON) {
|
|
if ((obj->hidden & OBJHFLAG_SUSPICIOUS) && chrCanSeeProp(g_Vars.chrdata, prop)) {
|
|
pass = true;
|
|
}
|
|
} else if (prop->type == PROPTYPE_OBJ) {
|
|
if (((obj->hidden & OBJHFLAG_SUSPICIOUS) || !objIsHealthy(obj))
|
|
&& chrCanSeeProp(g_Vars.chrdata, prop)) {
|
|
pass = true;
|
|
}
|
|
} else if (prop->type == PROPTYPE_EXPLOSION) {
|
|
if (chrCanSeeProp(g_Vars.chrdata, prop)) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
ptr++;
|
|
}
|
|
|
|
if (pass) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004e
|
|
*/
|
|
bool aiIfCheckFovWithTarget(void)
|
|
{
|
|
bool pass;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[4] == 0) {
|
|
if (cmd[3]) {
|
|
pass = chrIsInTargetsFovX(g_Vars.chrdata, cmd[2]);
|
|
} else {
|
|
pass = chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, cmd[2]);
|
|
}
|
|
} else {
|
|
pass = g_Vars.chrdata->yvisang && chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang) == 0;
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004d
|
|
*/
|
|
bool aiIfTargetInFovLeft(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetAngleToTarget(g_Vars.chrdata) < cmd[2] * M_BADTAU * 0.00390625f) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 004f
|
|
*/
|
|
bool aiIfTargetOutOfFovLeft(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetAngleToTarget(g_Vars.chrdata) > cmd[2] * M_BADTAU * 0.00390625f) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0050
|
|
*/
|
|
bool aiIfTargetInFov(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrIsTargetInFov(g_Vars.chrdata, cmd[2], 0)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0051
|
|
*/
|
|
bool aiIfTargetOutOfFov(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (!chrIsTargetInFov(g_Vars.chrdata, cmd[2], 0)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0052
|
|
*/
|
|
bool aiIfDistanceToTargetLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * (f32)10;
|
|
|
|
if (chrGetDistanceToTarget(g_Vars.chrdata) < distance) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0053
|
|
*/
|
|
bool aiIfDistanceToTargetGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * (f32)10;
|
|
|
|
if (chrGetDistanceToTarget(g_Vars.chrdata) > distance) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0054
|
|
*/
|
|
bool aiIfChrDistanceToPadLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 padnum = (cmd[6] | (cmd[5] << 8)) & 0xffff;
|
|
f32 value = (cmd[4] | (cmd[3] << 8)) * 10.0f;
|
|
s32 realpadnum = padnum;
|
|
|
|
if (padnum == 9000) {
|
|
realpadnum = (u16) g_Vars.chrdata->padpreset1;
|
|
}
|
|
|
|
if (chr && realpadnum < 9000 && chrGetDistanceToPad(chr, realpadnum) < value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
#else
|
|
u16 padnum = cmd[6] | (cmd[5] << 8);
|
|
f32 value = (cmd[4] | (cmd[3] << 8)) * 10.0f;
|
|
|
|
if (padnum == 9000) {
|
|
padnum = g_Vars.chrdata->padpreset1;
|
|
}
|
|
|
|
if (chr && chrGetDistanceToPad(chr, padnum) < value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01df
|
|
*/
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
GLOBAL_ASM(
|
|
glabel aiIfChrSameFloorDistanceToPadLessThan
|
|
/* f050c54: 27bdffd0 */ addiu $sp,$sp,-48
|
|
/* f050c58: afb00018 */ sw $s0,0x18($sp)
|
|
/* f050c5c: 3c10800a */ lui $s0,%hi(g_Vars)
|
|
/* f050c60: 26109fc0 */ addiu $s0,$s0,%lo(g_Vars)
|
|
/* f050c64: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f050c68: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f050c6c: afbf001c */ sw $ra,0x1c($sp)
|
|
/* f050c70: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f050c74: 01cf1821 */ addu $v1,$t6,$t7
|
|
/* f050c78: 90650002 */ lbu $a1,0x2($v1)
|
|
/* f050c7c: 0fc126d1 */ jal chrFindById
|
|
/* f050c80: afa3002c */ sw $v1,0x2c($sp)
|
|
/* f050c84: 8fa3002c */ lw $v1,0x2c($sp)
|
|
/* f050c88: 3c014120 */ lui $at,0x4120
|
|
/* f050c8c: 44814000 */ mtc1 $at,$f8
|
|
/* f050c90: 906a0003 */ lbu $t2,0x3($v1)
|
|
/* f050c94: 906c0004 */ lbu $t4,0x4($v1)
|
|
/* f050c98: 90780005 */ lbu $t8,0x5($v1)
|
|
/* f050c9c: 000a5a00 */ sll $t3,$t2,0x8
|
|
/* f050ca0: 016c6825 */ or $t5,$t3,$t4
|
|
/* f050ca4: 448d2000 */ mtc1 $t5,$f4
|
|
/* f050ca8: 90680006 */ lbu $t0,0x6($v1)
|
|
/* f050cac: 0018ca00 */ sll $t9,$t8,0x8
|
|
/* f050cb0: 468021a0 */ cvt.s.w $f6,$f4
|
|
/* f050cb4: 03282025 */ or $a0,$t9,$t0
|
|
/* f050cb8: 00403025 */ or $a2,$v0,$zero
|
|
/* f050cbc: 3085ffff */ andi $a1,$a0,0xffff
|
|
/* f050cc0: 24012328 */ addiu $at,$zero,0x2328
|
|
/* f050cc4: 00c02025 */ or $a0,$a2,$zero
|
|
/* f050cc8: 46083082 */ mul.s $f2,$f6,$f8
|
|
/* f050ccc: 14a10003 */ bne $a1,$at,.L0f050cdc
|
|
/* f050cd0: 00000000 */ nop
|
|
/* f050cd4: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f050cd8: 95c50128 */ lhu $a1,0x128($t6)
|
|
.L0f050cdc:
|
|
/* f050cdc: 50400011 */ beqzl $v0,.L0f050d24
|
|
/* f050ce0: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f050ce4: afa3002c */ sw $v1,0x2c($sp)
|
|
/* f050ce8: 0fc124e0 */ jal chrGetSameFloorDistanceToPad
|
|
/* f050cec: e7a20020 */ swc1 $f2,0x20($sp)
|
|
/* f050cf0: c7a20020 */ lwc1 $f2,0x20($sp)
|
|
/* f050cf4: 8fa3002c */ lw $v1,0x2c($sp)
|
|
/* f050cf8: 4602003c */ c.lt.s $f0,$f2
|
|
/* f050cfc: 00000000 */ nop
|
|
/* f050d00: 45020008 */ bc1fl .L0f050d24
|
|
/* f050d04: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f050d08: 8e040434 */ lw $a0,0x434($s0)
|
|
/* f050d0c: 8e050438 */ lw $a1,0x438($s0)
|
|
/* f050d10: 0fc13583 */ jal chraiGoToLabel
|
|
/* f050d14: 90660007 */ lbu $a2,0x7($v1)
|
|
/* f050d18: 10000004 */ b .L0f050d2c
|
|
/* f050d1c: ae020438 */ sw $v0,0x438($s0)
|
|
/* f050d20: 8e0f0438 */ lw $t7,0x438($s0)
|
|
.L0f050d24:
|
|
/* f050d24: 25f80008 */ addiu $t8,$t7,0x8
|
|
/* f050d28: ae180438 */ sw $t8,0x438($s0)
|
|
.L0f050d2c:
|
|
/* f050d2c: 8fbf001c */ lw $ra,0x1c($sp)
|
|
/* f050d30: 8fb00018 */ lw $s0,0x18($sp)
|
|
/* f050d34: 27bd0030 */ addiu $sp,$sp,0x30
|
|
/* f050d38: 03e00008 */ jr $ra
|
|
/* f050d3c: 00001025 */ or $v0,$zero,$zero
|
|
);
|
|
#endif
|
|
|
|
/**
|
|
* @cmd 0055
|
|
*/
|
|
bool aiIfChrDistanceToPadGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
u16 padnum = cmd[6] | (cmd[5] << 8);
|
|
f32 distance = (cmd[4] | (cmd[3] << 8)) * 10.0f;
|
|
|
|
if (padnum == 9000) {
|
|
padnum = g_Vars.chrdata->padpreset1;
|
|
}
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
if (chr && padnum < 9000 && chrGetDistanceToPad(chr, padnum) > distance)
|
|
#else
|
|
if (chr && chrGetDistanceToPad(chr, padnum) > distance)
|
|
#endif
|
|
{
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0056
|
|
*/
|
|
bool aiIfDistanceToChrLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 cutoff = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceToChr(g_Vars.chrdata, cmd[4]) < cutoff) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0057
|
|
*/
|
|
bool aiIfDistanceToChrGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 cutoff = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceToChr(g_Vars.chrdata, cmd[4]) > cutoff) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0058
|
|
*/
|
|
bool ai0058(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrSetChrPresetToAnyChrNearSelf(g_Vars.chrdata, distance)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0059
|
|
*/
|
|
bool aiIfDistanceFromTargetToPadLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad = cmd[5] | (cmd[4] << 8);
|
|
f32 value = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceFromTargetToPad(g_Vars.chrdata, pad) < value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005a
|
|
*/
|
|
bool aiIfDistanceFromTargetToPadGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad = cmd[5] | (cmd[4] << 8);
|
|
f32 value = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceFromTargetToPad(g_Vars.chrdata, pad) > value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005b
|
|
*/
|
|
bool aiIfChrInRoom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
u16 pad_id = cmd[5] | (cmd[4] << 8);
|
|
s32 room = chrGetPadRoom(g_Vars.chrdata, pad_id);
|
|
|
|
if ((cmd[3] == 0 && room >= 0 && chr && chr->prop && chr->prop->rooms[0] == room)
|
|
|| (cmd[3] == 1 && chr && chr->prop && chr->prop->rooms[0] == g_Vars.chrdata->roomtosearch)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
return false;
|
|
}
|
|
|
|
if (cmd[3] == 2 && stageGetIndex(g_Vars.stagenum) == STAGEINDEX_G5BUILDING) {
|
|
s32 i;
|
|
bool pass = false;
|
|
|
|
for (i = 0; i < PLAYERCOUNT(); i++) {
|
|
if (g_Vars.players[i]->eyespy && g_Vars.players[i]->eyespy->prop
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
&& chrGetDistanceToPad(g_Vars.players[i]->eyespy->prop->chr, pad_id) < 150.0f
|
|
#else
|
|
&& chrGetDistanceToPad(g_Vars.players[i]->eyespy->prop->chr, 0x4d) < 150.0f
|
|
#endif
|
|
) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass == true) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005c
|
|
*/
|
|
bool aiIfTargetInRoom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct prop *prop = chrGetTargetProp(g_Vars.chrdata);
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
s32 room_id = chrGetPadRoom(g_Vars.chrdata, pad_id);
|
|
|
|
if (room_id >= 0 && prop && room_id == prop->rooms[0]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005d
|
|
*/
|
|
bool aiIfChrHasObject(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
s32 hasprop = false;
|
|
|
|
if (obj && obj->prop && chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
s32 prevplayernum = g_Vars.currentplayernum;
|
|
setCurrentPlayerNum(propGetPlayerNum(chr->prop));
|
|
hasprop = invHasProp(obj->prop);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (hasprop) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005e
|
|
*/
|
|
bool aiIfWeaponThrown(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (weaponFindLanded(cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 005f
|
|
*/
|
|
bool aiIfWeaponThrownOnObject(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
struct defaultobj *obj = objFindByTagId(cmd->b3);
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop) {
|
|
struct prop *prop = obj->prop->child;
|
|
|
|
while (prop) {
|
|
if (prop->type == PROPTYPE_WEAPON) {
|
|
struct weaponobj *weapon = prop->weapon;
|
|
|
|
if (weapon->weaponnum == cmd->b2) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
prop = prop->next;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b4);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0060
|
|
*/
|
|
bool aiIfChrHasWeaponEquipped(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
bool passes = false;
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (bgunGetWeaponNum(HAND_RIGHT) == cmd[3]) {
|
|
passes = true;
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (passes) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0061
|
|
*/
|
|
bool aiIfGunUnclaimed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[3] == 0) {
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
} else {
|
|
struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon;
|
|
|
|
if (weapon && weapon->base.prop) {
|
|
weapon->base.flags |= OBJFLAG_00400000;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0062
|
|
*/
|
|
bool aiIfObjectHealthy(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && objIsHealthy(obj)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0063
|
|
*/
|
|
bool aiIfChrActivatedObject(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
u32 stack[1];
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop) {
|
|
if (cmd[2] == CHR_ANY) {
|
|
if (obj->hidden & (OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP)) {
|
|
pass = true;
|
|
obj->hidden &= ~(OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP);
|
|
}
|
|
} else {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop) {
|
|
if (chr->prop == g_Vars.bond->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_BOND)) {
|
|
pass = true;
|
|
obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_BOND;
|
|
} else if (g_Vars.coopplayernum >= 0 && chr->prop == g_Vars.coop->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_COOP)) {
|
|
pass = true;
|
|
obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_COOP;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0065
|
|
*/
|
|
bool aiObjInteract(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
if (obj->prop->type == PROPTYPE_DOOR) {
|
|
doorsActivate(obj->prop, false);
|
|
} else if (obj->prop->type == PROPTYPE_OBJ || obj->prop->type == PROPTYPE_WEAPON) {
|
|
propobjInteract(obj->prop);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0066
|
|
*/
|
|
bool aiDestroyObject(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && !objGetDestroyedValue(obj)) {
|
|
struct defaultobj *entity = obj->prop->obj;
|
|
|
|
if (entity->modelnum == MODEL_ELVIS_SAUCER) {
|
|
obj->flags = (obj->flags & ~OBJFLAG_00010000) | OBJFLAG_INVINCIBLE;
|
|
explosionCreateSimple(entity->prop, &entity->prop->pos, entity->prop->rooms, EXPLOSIONTYPE_3, 0);
|
|
smokeCreateAtProp(entity->prop, SMOKETYPE_UFO);
|
|
} else {
|
|
f32 damage = ((obj->maxdamage - obj->damage) + 1) / 250.0f;
|
|
objDamage(obj, damage, &obj->prop->pos, WEAPON_REMOTEMINE, -1);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0067
|
|
*/
|
|
bool ai0067(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->prop->parent && obj->prop->parent->type == PROPTYPE_CHR) {
|
|
struct chrdata *chr = obj->prop->parent->chr;
|
|
objSetDropped(obj->prop, DROPTYPE_SURRENDER);
|
|
chr->hidden |= CHRHFLAG_00000001;
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0068
|
|
*/
|
|
bool aiChrDropItems(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop) {
|
|
chrDropConcealedItems(chr);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0069
|
|
*/
|
|
bool aiChrDropWeapon(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
u32 weaponnum;
|
|
setCurrentPlayerNum(playernum);
|
|
weaponnum = bgunGetWeaponNum(HAND_RIGHT);
|
|
invRemoveItemByNum(weaponnum);
|
|
bgunCycleBack();
|
|
setCurrentPlayerNum(prevplayernum);
|
|
} else if (chr && chr->prop) {
|
|
if (chr->weapons_held[0]) {
|
|
objSetDropped(chr->weapons_held[0], DROPTYPE_DEFAULT);
|
|
chr->hidden |= CHRHFLAG_00000001;
|
|
}
|
|
|
|
if (chr->weapons_held[1]) {
|
|
objSetDropped(chr->weapons_held[1], DROPTYPE_DEFAULT);
|
|
chr->hidden |= CHRHFLAG_00000001;
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006a
|
|
*/
|
|
bool aiGiveObjectToChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (obj && obj->prop && chr && chr->prop) {
|
|
if (chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 something;
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
struct defaultobj *obj2 = obj->prop->obj;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
if (obj->prop->parent) {
|
|
objDetach(obj->prop);
|
|
func0f06ac90(obj->prop);
|
|
propActivate(obj->prop);
|
|
}
|
|
#endif
|
|
|
|
something = propPickupByPlayer(obj->prop, 0);
|
|
propExecuteTickOperation(obj->prop, something);
|
|
playernum = propGetPlayerNum(chr->prop);
|
|
obj2->hidden = (playernum << 28) | (obj2->hidden & 0x0fffffff);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
} else {
|
|
if (obj->prop->parent) {
|
|
objDetach(obj->prop);
|
|
} else {
|
|
propDeregisterRooms(obj->prop);
|
|
propDelist(obj->prop);
|
|
propDisable(obj->prop);
|
|
}
|
|
|
|
if (obj->type != OBJTYPE_WEAPON || chrEquipWeapon((struct weaponobj *) obj, chr) == 0) {
|
|
propReparent(obj->prop, chr->prop);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006b
|
|
*/
|
|
bool aiObjectMoveToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
u16 padnum = cmd[4] | (cmd[3] << 8);
|
|
Mtxf matrix;
|
|
struct pad pad;
|
|
s16 rooms[2];
|
|
|
|
if (obj && obj->prop) {
|
|
padUnpack(padnum, PADFIELD_POS | PADFIELD_LOOK | PADFIELD_UP | PADFIELD_ROOM, &pad);
|
|
mtx00016d58(&matrix,
|
|
0, 0, 0,
|
|
-pad.look.x, -pad.look.y, -pad.look.z,
|
|
pad.up.x, pad.up.y, pad.up.z);
|
|
|
|
if (obj->model) {
|
|
mtx00015f04(obj->model->scale, &matrix);
|
|
}
|
|
|
|
rooms[0] = pad.room;
|
|
rooms[1] = -1;
|
|
func0f06a730(obj, &pad, &matrix, rooms, &pad);
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006c
|
|
*/
|
|
bool aiOpenDoor(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
|
|
if (!doorCallLift(obj->prop, false)) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
doorsRequestMode(door, DOORMODE_OPENING);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006d
|
|
*/
|
|
bool aiCloseDoor(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
doorsRequestMode(door, DOORMODE_CLOSING);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006e
|
|
*/
|
|
bool aiIfDoorState(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_DOOR) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
|
|
if (door->mode == DOORMODE_IDLE) {
|
|
if (door->frac <= 0) {
|
|
pass = (cmd[3] & DOORSTATE_CLOSED) != 0;
|
|
} else {
|
|
pass = (cmd[3] & DOORSTATE_OPEN) != 0;
|
|
}
|
|
} else if (door->mode == DOORMODE_OPENING || door->mode == DOORMODE_WAITING) {
|
|
pass = (cmd[3] & DOORSTATE_OPENING) != 0;
|
|
} else if (door->mode == DOORMODE_CLOSING) {
|
|
pass = (cmd[3] & DOORSTATE_CLOSING) != 0;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 006f
|
|
*/
|
|
bool aiIfObjectIsDoor(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_DOOR && (obj->hidden & 0x200)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0070
|
|
*/
|
|
bool aiLockDoor(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
u8 bits = cmd[3];
|
|
door->keyflags = door->keyflags | bits;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0071
|
|
*/
|
|
bool aiUnlockDoor(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
u8 bits = cmd[3];
|
|
door->keyflags = door->keyflags & ~bits;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0072
|
|
*/
|
|
bool aiIfDoorLocked(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
u32 bits = cmd[3];
|
|
u32 keyflags = door->keyflags;
|
|
|
|
if ((keyflags & bits) == bits) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0073
|
|
*/
|
|
bool aiIfObjectiveComplete(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] < objectiveGetCount() &&
|
|
objectiveCheck(cmd[2]) == OBJECTIVE_COMPLETE &&
|
|
objectiveGetDifficultyBits(cmd[2]) & (1 << lvGetDifficulty())) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0074
|
|
*/
|
|
bool aiIfObjectiveFailed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] < objectiveGetCount() &&
|
|
objectiveCheck(cmd[2]) == OBJECTIVE_FAILED &&
|
|
objectiveGetDifficultyBits(cmd[2]) & (1 << lvGetDifficulty())) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0075
|
|
*/
|
|
bool ai0075(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (func0f04a4ec(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0076
|
|
*/
|
|
bool aiSetPadPresetToTargetQuadrant(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrSetPadPresetToWaypointWithinTargetQuadrant(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007d
|
|
*/
|
|
bool aiIfNumArghsLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetNumArghs(g_Vars.chrdata) < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007e
|
|
*/
|
|
bool aiIfNumArghsGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetNumArghs(g_Vars.chrdata) > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007f
|
|
*/
|
|
bool aiIfNumCloseArghsLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetNumCloseArghs(g_Vars.chrdata) < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0080
|
|
*/
|
|
bool aiIfNumCloseArghsGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetNumCloseArghs(g_Vars.chrdata) > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0081
|
|
*/
|
|
bool aiIfChrHealthGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = cmd[3] * 0.1f;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
u32 pass = false;
|
|
|
|
if (chr && chr->prop) {
|
|
if (chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
|
|
pass = (value > g_Vars.players[playernum]->bondhealth * 8.0f);
|
|
} else {
|
|
pass = (value > chr->maxdamage - chr->damage);
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0082
|
|
*/
|
|
bool aiIfChrHealthLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = cmd[3] * 0.1f;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
u32 pass = false;
|
|
|
|
if (chr && chr->prop) {
|
|
if (chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
|
|
pass = (value < g_Vars.players[playernum]->bondhealth * 8.0f);
|
|
} else {
|
|
pass = (value < chr->maxdamage - chr->damage);
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010f
|
|
*/
|
|
bool aiIfChrShieldLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = (cmd[4] | (cmd[3] << 8)) * 0.1f;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata,cmd[2]);
|
|
|
|
if (chr && chrGetShield(chr) < value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0110
|
|
*/
|
|
bool aiIfChrShieldGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = (cmd[4] | (cmd[3] << 8)) * 0.1f;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata,cmd[2]);
|
|
|
|
if (chr && chrGetShield(chr) > value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0083
|
|
*/
|
|
bool aiIfInjured(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->chrflags & CHRCFLAG_JUST_INJURED)) {
|
|
chr->chrflags &= ~CHRCFLAG_JUST_INJURED;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0168
|
|
*/
|
|
bool aiIfShieldDamaged(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->chrflags & CHRCFLAG_SHIELDDAMAGED)) {
|
|
chr->chrflags &= ~CHRCFLAG_SHIELDDAMAGED;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0077
|
|
*/
|
|
bool aiIfDifficultyLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (lvGetDifficulty() < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0078
|
|
*/
|
|
bool aiIfDifficultyGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (lvGetDifficulty() > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0079
|
|
*/
|
|
bool aiIfStageTimerLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 target = (f32)(cmd[3] | (cmd[2] << 8));
|
|
f32 time = lvGetStageTimeInSeconds();
|
|
|
|
if (time < target) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007a
|
|
*/
|
|
bool aiIfStageTimerGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 target = (f32)(cmd[3] | (cmd[2] << 8));
|
|
f32 time = lvGetStageTimeInSeconds();
|
|
|
|
if (time > target) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007b
|
|
*/
|
|
bool aiIfStageIdLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] > mainGetStageNum()) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 007c
|
|
*/
|
|
bool aiIfStageIdGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (mainGetStageNum() > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0084
|
|
*/
|
|
bool aiSetMorale(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.chrdata->morale = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0085
|
|
*/
|
|
bool aiAddMorale(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
incrementByte(&g_Vars.chrdata->morale, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0086
|
|
*/
|
|
bool aiChrAddMorale(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
incrementByte(&chr->morale, cmd[2]);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0087
|
|
*/
|
|
bool aiSubtractMorale(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
decrementByte(&g_Vars.chrdata->morale, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0088
|
|
*/
|
|
bool aiIfMoraleLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->morale < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0089
|
|
*/
|
|
bool aiIfMoraleLessThanRandom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->morale < g_Vars.chrdata->random) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008a
|
|
*/
|
|
bool aiSetAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.chrdata->alertness = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008b
|
|
*/
|
|
bool aiAddAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
incrementByte(&g_Vars.chrdata->alertness, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008c
|
|
*/
|
|
bool aiChrAddAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr && chr->prop) {
|
|
incrementByte(&chr->alertness, cmd[2]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008d
|
|
*/
|
|
bool aiSubtractAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
decrementByte(&g_Vars.chrdata->alertness, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008e
|
|
*/
|
|
bool aiIfAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if ((g_Vars.chrdata->alertness < cmd[2] && cmd[3] == 0) ||
|
|
(cmd[2] < g_Vars.chrdata->alertness && cmd[3] == 1)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 008f
|
|
*/
|
|
bool aiIfChrAlertnessLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr && chr->alertness < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0090
|
|
*/
|
|
bool aiIfAlertnessLessThanRandom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->alertness < g_Vars.chrdata->random) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0092
|
|
*/
|
|
bool aiSetHearDistance(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) / 1000.0f;
|
|
g_Vars.chrdata->hearingscale = distance;
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0093
|
|
*/
|
|
bool aiSetViewDistance(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (!cheatIsActive(CHEAT_PERFECTDARKNESS)) {
|
|
g_Vars.chrdata->visionrange = cmd[2];
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0094
|
|
*/
|
|
bool aiSetGrenadeProbability(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.chrdata->grenadeprob = cmd[2];
|
|
g_Vars.aioffset += + 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0095
|
|
*/
|
|
bool aiSetChrNum(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
chrSetChrnum(g_Vars.chrdata, cmd[2]);
|
|
g_Vars.chrdata->chrnum = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0096
|
|
*/
|
|
bool aiSetMaxDamage(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 maxdamage = (cmd[4] | (cmd[3] << 8)) * 0.1f;
|
|
|
|
if (g_Vars.hovercar) {
|
|
chopperSetMaxDamage(g_Vars.hovercar, maxdamage);
|
|
} else {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && !chrIsDead(chr)
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& chr->actiontype != ACT_DIE
|
|
&& chr->actiontype != ACT_DRUGGEDKO
|
|
&& chr->actiontype != ACT_DRUGGEDDROP
|
|
&& chr->actiontype != ACT_DRUGGEDCOMINGUP) {
|
|
chrSetMaxDamage(chr, maxdamage);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0097
|
|
*/
|
|
bool aiAddHealth()
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 amount = (cmd[3] | (cmd[2] << 8)) * 0.1f;
|
|
|
|
chrAddHealth(g_Vars.chrdata, amount);
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010e
|
|
*/
|
|
bool aiSetShield(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 amount = (cmd[3] | (cmd[2] << 8)) * 0.1f;
|
|
|
|
if (cheatIsActive(CHEAT_ENEMYSHIELDS)) {
|
|
amount = amount < 8 ? 8 : amount;
|
|
}
|
|
|
|
chrSetShield(g_Vars.chrdata, amount);
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0098
|
|
*/
|
|
bool aiSetReactionSpeed(void)
|
|
{
|
|
s8 *cmd = (s8 *)g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
g_Vars.chrdata->speedrating = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0099
|
|
*/
|
|
bool aiSetRecoverySpeed(void)
|
|
{
|
|
s8 *cmd = (s8 *)g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
g_Vars.chrdata->arghrating = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009a
|
|
*/
|
|
bool aiSetAccuracy(void)
|
|
{
|
|
s8 *cmd = (s8 *)g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
g_Vars.chrdata->accuracyrating = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c6
|
|
*/
|
|
bool aiSetDodgeRating(void)
|
|
{
|
|
s8 *cmd = (s8 *)g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] == 0) {
|
|
g_Vars.chrdata->dodgerating = cmd[3];
|
|
} else if (cmd[2] == 1) {
|
|
g_Vars.chrdata->maxdodgerating = cmd[3];
|
|
} else {
|
|
g_Vars.chrdata->dodgerating = cmd[3];
|
|
g_Vars.chrdata->maxdodgerating = cmd[3];
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c7
|
|
*/
|
|
bool aiSetUnarmedDodgeRating(void)
|
|
{
|
|
s8 *cmd = (s8 *)g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
g_Vars.chrdata->unarmeddodgerating = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009b
|
|
*/
|
|
bool aiSetFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
chrSetFlags(g_Vars.chrdata, flags, cmd[6]);
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009c
|
|
*/
|
|
bool aiUnsetFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
chrUnsetFlags(g_Vars.chrdata, flags, cmd[6]);
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009d
|
|
*/
|
|
bool aiIfHasFlag(void)
|
|
{
|
|
bool result;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
result = chrHasFlag(g_Vars.chrdata, flags, cmd[7]);
|
|
|
|
if (cmd[6] == 0) {
|
|
result = !result;
|
|
}
|
|
|
|
if (result) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
|
|
} else {
|
|
g_Vars.aioffset += 9;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009e
|
|
*/
|
|
bool aiChrSetFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
chrSetFlagsById(g_Vars.chrdata, cmd[2], flags, cmd[7]);
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 009f
|
|
*/
|
|
bool aiChrUnsetFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
chrUnsetFlagsById(g_Vars.chrdata, cmd[2], flags, cmd[7]);
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a0
|
|
*/
|
|
bool aiIfChrHasFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
|
|
if (chrHasFlagById(g_Vars.chrdata, cmd[2], flags, cmd[7])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
|
|
} else {
|
|
g_Vars.aioffset += 9;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a1
|
|
*/
|
|
bool aiSetStageFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
chrSetStageFlag(g_Vars.chrdata, flags);
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a2
|
|
*/
|
|
bool aiUnsetStageFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
chrUnsetStageFlag(g_Vars.chrdata, flags);
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a3
|
|
*/
|
|
bool aiIfStageFlagEq(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
if ((chrHasStageFlag(g_Vars.chrdata, flags) && cmd[6] == 1) ||
|
|
(!chrHasStageFlag(g_Vars.chrdata, flags) && cmd[6] == 0)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a4
|
|
*/
|
|
bool aiSetChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
g_Vars.chrdata->chrflags |= flags;
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a5
|
|
*/
|
|
bool aiUnsetChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
g_Vars.chrdata->chrflags &= ~flags;
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a6
|
|
*/
|
|
bool aiIfHasChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
|
|
if ((g_Vars.chrdata->chrflags & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a7
|
|
*/
|
|
bool aiChrSetChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->chrflags |= flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a8
|
|
*/
|
|
bool aiChrUnsetChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->chrflags &= ~flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00a9
|
|
*/
|
|
bool aiIfChrHasChrflag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->chrflags & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011b
|
|
*/
|
|
bool aiChrSetHiddenFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->hidden |= flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011c
|
|
*/
|
|
bool aiChrUnsetHiddenFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->hidden &= ~flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011d
|
|
*/
|
|
bool aiIfChrHasHiddenFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->hidden & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00aa
|
|
*/
|
|
bool aiSetObjFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags |= flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ab
|
|
*/
|
|
bool aiUnsetObjFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags &= ~flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ac
|
|
*/
|
|
bool aiIfObjHasFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && (obj->flags & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ad
|
|
*/
|
|
bool aiSetObjFlag2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags2 |= flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ae
|
|
*/
|
|
bool aiUnsetObjFlag2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags2 &= ~flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00af
|
|
*/
|
|
bool aiIfObjHasFlag2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && (obj->flags2 & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0118
|
|
*/
|
|
bool aiSetObjFlag3(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags3 |= flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0119
|
|
*/
|
|
bool aiUnsetObjFlag3(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->flags3 &= ~flags;
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011a
|
|
*/
|
|
bool aiIfObjHasFlag3(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && (obj->flags3 & flags) == flags) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b0
|
|
*/
|
|
bool aiSetChrPreset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
chrSetChrPreset(g_Vars.chrdata, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b1
|
|
*/
|
|
bool aiSetChrTarget(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
chrSetChrPresetByChrnum(g_Vars.chrdata, cmd[2], cmd[3]);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b2
|
|
*/
|
|
bool aiSetPadPreset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata) {
|
|
chrSetPadPreset(g_Vars.chrdata, pad_id);
|
|
} else if (g_Vars.heli) {
|
|
g_Vars.heli->base.pad = pad_id;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b3
|
|
*/
|
|
bool aiChrSetPadPreset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[4] | (cmd[3] << 8);
|
|
|
|
chrSetPadPresetByChrnum(g_Vars.chrdata, cmd[2], pad_id);
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b4
|
|
*/
|
|
bool aiChrCopyPadPreset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chrsrc = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct chrdata *chrdst = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
chrdst->padpreset1 = chrsrc->padpreset1;
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b5
|
|
*
|
|
* The weirdness to do with result is required for a match.
|
|
* The original source likely had something similar and probably used ifdefs.
|
|
*/
|
|
bool aiPrint(void)
|
|
{
|
|
u32 len;
|
|
u32 result = dprint();
|
|
|
|
if (result) {
|
|
result = 2;
|
|
}
|
|
|
|
if (result == 2) {
|
|
// empty
|
|
}
|
|
|
|
len = chraiGetCommandLength(g_Vars.ailist, g_Vars.aioffset);
|
|
|
|
g_Vars.aioffset += len;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0091
|
|
*/
|
|
bool aiNoOp0091(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b6
|
|
*/
|
|
bool aiRestartTimer(void)
|
|
{
|
|
if (g_Vars.chrdata) {
|
|
chrRestartTimer(g_Vars.chrdata);
|
|
} else if (g_Vars.hovercar) {
|
|
chopperRestartTimer(g_Vars.hovercar);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b7
|
|
*/
|
|
bool aiResetTimer(void)
|
|
{
|
|
g_Vars.chrdata->timer60 = 0;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b8
|
|
*/
|
|
bool aiPauseTimer(void)
|
|
{
|
|
g_Vars.chrdata->hidden &= ~CHRHFLAG_TIMER_RUNNING;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00b9
|
|
*/
|
|
bool aiResumeTimer(void)
|
|
{
|
|
g_Vars.chrdata->hidden |= CHRHFLAG_TIMER_RUNNING;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ba
|
|
*/
|
|
bool aiIfTimerStopped(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if ((g_Vars.chrdata->hidden & CHRHFLAG_TIMER_RUNNING) == 0) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00bb
|
|
*/
|
|
bool aiIfTimerGreaterThanRandom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 timer = chrGetTimer(g_Vars.chrdata);
|
|
|
|
if (g_Vars.chrdata->random < timer) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00bc
|
|
*/
|
|
bool aiIfTimerLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = (u32)((cmd[3] << 8) | cmd[4] | (cmd[2] << 16)) / 60.0f;
|
|
|
|
if ((g_Vars.chrdata && chrGetTimer(g_Vars.chrdata) < value) ||
|
|
(g_Vars.hovercar && chopperGetTimer(g_Vars.hovercar) < value)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00bd
|
|
*/
|
|
bool aiIfTimerGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = (u32)((cmd[3] << 8) | cmd[4] | (cmd[2] << 16)) / 60.0f;
|
|
|
|
// These two function calls were likely used in a debug print statement
|
|
if (g_Vars.chrdata) {
|
|
chrGetTimer(g_Vars.chrdata);
|
|
}
|
|
|
|
if (g_Vars.hovercar) {
|
|
chopperGetTimer(g_Vars.hovercar);
|
|
}
|
|
|
|
if ((g_Vars.chrdata && chrGetTimer(g_Vars.chrdata) > value) ||
|
|
(g_Vars.hovercar && chopperGetTimer(g_Vars.hovercar) > value)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00be
|
|
*/
|
|
bool aiShowCountdownTimer(void)
|
|
{
|
|
countdownTimerSetVisible(COUNTDOWNTIMERREASON_AI, true);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00bf
|
|
*/
|
|
bool aiHideCountdownTimer(void)
|
|
{
|
|
countdownTimerSetVisible(COUNTDOWNTIMERREASON_AI, false);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c0
|
|
*/
|
|
bool aiSetCountdownTimerValue(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 seconds = cmd[3] | (cmd[2] << 8);
|
|
|
|
countdownTimerSetValue60(seconds * 60);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c1
|
|
*/
|
|
bool aiStopCountdownTimer(void)
|
|
{
|
|
countdownTimerSetRunning(false);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c2
|
|
*/
|
|
bool aiStartCountdownTimer(void)
|
|
{
|
|
countdownTimerSetRunning(true);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c3
|
|
*/
|
|
bool aiIfCountdownTimerStopped(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (!countdownTimerIsRunning()) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c4
|
|
*/
|
|
bool aiIfCountdownTimerLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (countdownTimerGetValue60() < value * 60) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c5
|
|
*/
|
|
bool aiIfCountdownTimerGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 value = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (countdownTimerGetValue60() > value * 60) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c6
|
|
*/
|
|
GLOBAL_ASM(
|
|
glabel aiSpawnChrAtPad
|
|
/* f05565c: 27bdffc8 */ addiu $sp,$sp,-56
|
|
/* f055660: afb00020 */ sw $s0,0x20($sp)
|
|
/* f055664: 3c10800a */ lui $s0,%hi(g_Vars)
|
|
/* f055668: 26109fc0 */ addiu $s0,$s0,%lo(g_Vars)
|
|
/* f05566c: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f055670: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f055674: afbf0024 */ sw $ra,0x24($sp)
|
|
/* f055678: 01cf1821 */ addu $v1,$t6,$t7
|
|
/* f05567c: 90780004 */ lbu $t8,0x4($v1)
|
|
/* f055680: 906a0005 */ lbu $t2,0x5($v1)
|
|
/* f055684: 0018ca00 */ sll $t9,$t8,0x8
|
|
/* f055688: 032a5825 */ or $t3,$t9,$t2
|
|
/* f05568c: a7ab0032 */ sh $t3,0x32($sp)
|
|
/* f055690: 906e0009 */ lbu $t6,0x9($v1)
|
|
/* f055694: 906c0008 */ lbu $t4,0x8($v1)
|
|
/* f055698: 9079000a */ lbu $t9,0xa($v1)
|
|
/* f05569c: 000e7c00 */ sll $t7,$t6,0x10
|
|
/* f0556a0: 000c6e00 */ sll $t5,$t4,0x18
|
|
/* f0556a4: 906e0006 */ lbu $t6,0x6($v1)
|
|
/* f0556a8: 01afc025 */ or $t8,$t5,$t7
|
|
/* f0556ac: 906c000b */ lbu $t4,0xb($v1)
|
|
/* f0556b0: 906f0007 */ lbu $t7,0x7($v1)
|
|
/* f0556b4: 00195200 */ sll $t2,$t9,0x8
|
|
/* f0556b8: 030a5825 */ or $t3,$t8,$t2
|
|
/* f0556bc: 000e6a00 */ sll $t5,$t6,0x8
|
|
/* f0556c0: 016c4025 */ or $t0,$t3,$t4
|
|
/* f0556c4: 01af1025 */ or $v0,$t5,$t7
|
|
/* f0556c8: 3044ffff */ andi $a0,$v0,0xffff
|
|
/* f0556cc: afa8002c */ sw $t0,0x2c($sp)
|
|
/* f0556d0: 0c006134 */ jal ailistFindById
|
|
/* f0556d4: afa30034 */ sw $v1,0x34($sp)
|
|
/* f0556d8: 8fa30034 */ lw $v1,0x34($sp)
|
|
/* f0556dc: 8fa8002c */ lw $t0,0x2c($sp)
|
|
/* f0556e0: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f0556e4: 90650002 */ lbu $a1,0x2($v1)
|
|
/* f0556e8: 80660003 */ lb $a2,0x3($v1)
|
|
/* f0556ec: afa20010 */ sw $v0,0x10($sp)
|
|
/* f0556f0: 97a70032 */ lhu $a3,0x32($sp)
|
|
/* f0556f4: afa30034 */ sw $v1,0x34($sp)
|
|
/* f0556f8: 0fc12d5e */ jal chrSpawnAtPad
|
|
/* f0556fc: afa80014 */ sw $t0,0x14($sp)
|
|
/* f055700: 10400007 */ beqz $v0,.L0f055720
|
|
/* f055704: 8fa30034 */ lw $v1,0x34($sp)
|
|
/* f055708: 8e040434 */ lw $a0,0x434($s0)
|
|
/* f05570c: 8e050438 */ lw $a1,0x438($s0)
|
|
/* f055710: 0fc13583 */ jal chraiGoToLabel
|
|
/* f055714: 9066000c */ lbu $a2,0xc($v1)
|
|
/* f055718: 10000004 */ b .L0f05572c
|
|
/* f05571c: ae020438 */ sw $v0,0x438($s0)
|
|
.L0f055720:
|
|
/* f055720: 8e180438 */ lw $t8,0x438($s0)
|
|
/* f055724: 270a000d */ addiu $t2,$t8,0xd
|
|
/* f055728: ae0a0438 */ sw $t2,0x438($s0)
|
|
.L0f05572c:
|
|
/* f05572c: 8fbf0024 */ lw $ra,0x24($sp)
|
|
/* f055730: 8fb00020 */ lw $s0,0x20($sp)
|
|
/* f055734: 27bd0038 */ addiu $sp,$sp,0x38
|
|
/* f055738: 03e00008 */ jr $ra
|
|
/* f05573c: 00001025 */ or $v0,$zero,$zero
|
|
);
|
|
|
|
//bool aiSpawnChrAtPad(void)
|
|
//{
|
|
// u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
// u16 pad = cmd[5] | (cmd[4] << 8);
|
|
// u32 spawnflags = (cmd[9] << 16) | (cmd[10] << 8) | cmd[11] | (cmd[8] << 24);
|
|
// s32 ailistid = cmd[7] | (cmd[6] << 8);
|
|
// u8 *ailist = ailistFindById(ailistid & 0xffff);
|
|
//
|
|
// if (chrSpawnAtPad(g_Vars.chrdata, cmd[2], (s8)cmd[3], pad, ailist, spawnflags)) {
|
|
// g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[12]);
|
|
// } else {
|
|
// g_Vars.aioffset += 13;
|
|
// }
|
|
//
|
|
// return false;
|
|
//}
|
|
|
|
/**
|
|
* @cmd 00c7
|
|
*/
|
|
bool aiSpawnChrAtChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 spawnflags = (cmd[8] << 16) | (cmd[9] << 8) | cmd[10] | (cmd[7] << 24);
|
|
u16 ailistid = cmd[6] | (cmd[5] << 8);
|
|
u8 *ailist = ailistFindById(ailistid);
|
|
|
|
if (chrSpawnAtChr(g_Vars.chrdata, cmd[2], (s8)cmd[3], cmd[4], ailist, spawnflags)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[11]);
|
|
} else {
|
|
g_Vars.aioffset += 12;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00c8
|
|
*/
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
bool aiTryEquipWeapon(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[6] << 16) | (cmd[7] << 8) | cmd[8] | (cmd[5] << 24);
|
|
u32 model = cmd[3] | (cmd[2] << 8);
|
|
struct prop *prop = NULL;
|
|
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop && g_Vars.chrdata->model) {
|
|
if (cheatIsActive(CHEAT_MARQUIS)) {
|
|
// On MBR, allow Cass to draw her gun.
|
|
// Otherwise the mission can't progress.
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
if (g_Vars.chrdata->bodynum != BODY_CASSANDRA || mainGetStageNum() != STAGE_MBR)
|
|
#endif
|
|
{
|
|
flags &= ~OBJFLAG_WEAPON_LEFTHANDED;
|
|
flags |= OBJFLAG_20000000;
|
|
}
|
|
|
|
prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags);
|
|
} else if (cheatIsActive(CHEAT_ENEMYROCKETS)) {
|
|
switch (cmd[4]) {
|
|
case WEAPON_FALCON2:
|
|
case WEAPON_FALCON2_SILENCER:
|
|
case WEAPON_FALCON2_SCOPE:
|
|
case WEAPON_MAGSEC4:
|
|
case WEAPON_MAULER:
|
|
case WEAPON_PHOENIX:
|
|
case WEAPON_DY357MAGNUM:
|
|
case WEAPON_DY357LX:
|
|
case WEAPON_CMP150:
|
|
case WEAPON_CYCLONE:
|
|
case WEAPON_CALLISTO:
|
|
case WEAPON_RCP120:
|
|
case WEAPON_LAPTOPGUN:
|
|
case WEAPON_DRAGON:
|
|
case WEAPON_AR34:
|
|
case WEAPON_SUPERDRAGON:
|
|
case WEAPON_SHOTGUN:
|
|
case WEAPON_REAPER:
|
|
case WEAPON_SNIPERRIFLE:
|
|
case WEAPON_FARSIGHT:
|
|
case WEAPON_DEVASTATOR:
|
|
case WEAPON_ROCKETLAUNCHER:
|
|
case WEAPON_SLAYER:
|
|
case WEAPON_COMBATKNIFE:
|
|
case WEAPON_CROSSBOW:
|
|
case WEAPON_TRANQUILIZER:
|
|
case WEAPON_GRENADE:
|
|
case WEAPON_NBOMB:
|
|
case WEAPON_TIMEDMINE:
|
|
case WEAPON_PROXIMITYMINE:
|
|
case WEAPON_REMOTEMINE:
|
|
prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags);
|
|
break;
|
|
case WEAPON_K7AVENGER:
|
|
if (g_Vars.stagenum == STAGE_INVESTIGATION && lvGetDifficulty() == DIFF_PA) {
|
|
prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags);
|
|
} else {
|
|
prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags);
|
|
}
|
|
break;
|
|
default:
|
|
prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags);
|
|
break;
|
|
}
|
|
} else {
|
|
prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags);
|
|
}
|
|
}
|
|
|
|
if (prop) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[9]);
|
|
} else {
|
|
g_Vars.aioffset += 10;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
glabel aiTryEquipWeapon
|
|
.late_rodata
|
|
glabel var7f1a3f70nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f74nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f78nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f7cnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f80nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f84nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f88nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f8cnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f90nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f94nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f98nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3f9cnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fa0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fa4nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fa8nb
|
|
.word aiTryEquipWeapon+0x164
|
|
glabel var7f1a3facnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fb0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fb4nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fb8nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fbcnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fc0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fc4nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fc8nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fccnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fd0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fd4nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fd8nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fdcnb
|
|
.word aiTryEquipWeapon+0x1c8
|
|
glabel var7f1a3fe0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fe4nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fe8nb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3fecnb
|
|
.word aiTryEquipWeapon+0x148
|
|
glabel var7f1a3ff0nb
|
|
.word aiTryEquipWeapon+0x148
|
|
.text
|
|
/* f054cb0: 3c07800a */ lui $a3,0x800a
|
|
/* f054cb4: 24e7e6c0 */ addiu $a3,$a3,-6464
|
|
/* f054cb8: 8ce50438 */ lw $a1,0x438($a3)
|
|
/* f054cbc: 8cee0434 */ lw $t6,0x434($a3)
|
|
/* f054cc0: 27bdffd8 */ addiu $sp,$sp,-40
|
|
/* f054cc4: afbf0014 */ sw $ra,0x14($sp)
|
|
/* f054cc8: 01c54021 */ addu $t0,$t6,$a1
|
|
/* f054ccc: 910f0005 */ lbu $t7,0x5($t0)
|
|
/* f054cd0: 91190006 */ lbu $t9,0x6($t0)
|
|
/* f054cd4: 910b0007 */ lbu $t3,0x7($t0)
|
|
/* f054cd8: 910e0008 */ lbu $t6,0x8($t0)
|
|
/* f054cdc: 000fc600 */ sll $t8,$t7,0x18
|
|
/* f054ce0: 00194c00 */ sll $t1,$t9,0x10
|
|
/* f054ce4: 03095025 */ or $t2,$t8,$t1
|
|
/* f054ce8: 000b6200 */ sll $t4,$t3,0x8
|
|
/* f054cec: 014c6825 */ or $t5,$t2,$t4
|
|
/* f054cf0: 01ae7825 */ or $t7,$t5,$t6
|
|
/* f054cf4: afaf0020 */ sw $t7,0x20($sp)
|
|
/* f054cf8: 91190002 */ lbu $t9,0x2($t0)
|
|
/* f054cfc: 91090003 */ lbu $t1,0x3($t0)
|
|
/* f054d00: 8ce20424 */ lw $v0,0x424($a3)
|
|
/* f054d04: 0019c200 */ sll $t8,$t9,0x8
|
|
/* f054d08: 03095825 */ or $t3,$t8,$t1
|
|
/* f054d0c: afab001c */ sw $t3,0x1c($sp)
|
|
/* f054d10: 10400070 */ beqz $v0,.NB0f054ed4
|
|
/* f054d14: 00001825 */ or $v1,$zero,$zero
|
|
/* f054d18: 8c4a001c */ lw $t2,0x1c($v0)
|
|
/* f054d1c: 1140006d */ beqz $t2,.NB0f054ed4
|
|
/* f054d20: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054d24: 8c4c0020 */ lw $t4,0x20($v0)
|
|
/* f054d28: 24040014 */ addiu $a0,$zero,0x14
|
|
/* f054d2c: 11800069 */ beqz $t4,.NB0f054ed4
|
|
/* f054d30: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054d34: afa00018 */ sw $zero,0x18($sp)
|
|
/* f054d38: 0fc40ab9 */ jal cheatIsActive
|
|
/* f054d3c: afa80024 */ sw $t0,0x24($sp)
|
|
/* f054d40: 1040001e */ beqz $v0,.NB0f054dbc
|
|
/* f054d44: 8fa30018 */ lw $v1,0x18($sp)
|
|
/* f054d48: 3c02800a */ lui $v0,0x800a
|
|
/* f054d4c: 8c42eb74 */ lw $v0,-0x148c($v0)
|
|
/* f054d50: 24010037 */ addiu $at,$zero,0x37
|
|
/* f054d54: 10410019 */ beq $v0,$at,.NB0f054dbc
|
|
/* f054d58: 24010033 */ addiu $at,$zero,0x33
|
|
/* f054d5c: 14410011 */ bne $v0,$at,.NB0f054da4
|
|
/* f054d60: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054d64: 0fc59ed3 */ jal lvGetDifficulty
|
|
/* f054d68: afa30018 */ sw $v1,0x18($sp)
|
|
/* f054d6c: 24010002 */ addiu $at,$zero,0x2
|
|
/* f054d70: 8fa30018 */ lw $v1,0x18($sp)
|
|
/* f054d74: 1441000b */ bne $v0,$at,.NB0f054da4
|
|
/* f054d78: 8fa70020 */ lw $a3,0x20($sp)
|
|
/* f054d7c: 8fad0024 */ lw $t5,0x24($sp)
|
|
/* f054d80: 24010010 */ addiu $at,$zero,0x10
|
|
/* f054d84: 3c04800a */ lui $a0,0x800a
|
|
/* f054d88: 91a60004 */ lbu $a2,0x4($t5)
|
|
/* f054d8c: 8fa5001c */ lw $a1,0x1c($sp)
|
|
/* f054d90: 14c10004 */ bne $a2,$at,.NB0f054da4
|
|
/* f054d94: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054d98: 0fc228be */ jal chrGiveWeapon
|
|
/* f054d9c: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054da0: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f054da4:
|
|
/* f054da4: 3c05800a */ lui $a1,0x800a
|
|
/* f054da8: 3c07800a */ lui $a3,0x800a
|
|
/* f054dac: 24e7e6c0 */ addiu $a3,$a3,-6464
|
|
/* f054db0: 8ca5eaf8 */ lw $a1,-0x1508($a1)
|
|
/* f054db4: 10000047 */ beqz $zero,.NB0f054ed4
|
|
/* f054db8: 8fa80024 */ lw $t0,0x24($sp)
|
|
.NB0f054dbc:
|
|
/* f054dbc: 0fc40ab9 */ jal cheatIsActive
|
|
/* f054dc0: 24040012 */ addiu $a0,$zero,0x12
|
|
/* f054dc4: 10400037 */ beqz $v0,.NB0f054ea4
|
|
/* f054dc8: 8fa70020 */ lw $a3,0x20($sp)
|
|
/* f054dcc: 8fae0024 */ lw $t6,0x24($sp)
|
|
/* f054dd0: 91c60004 */ lbu $a2,0x4($t6)
|
|
/* f054dd4: 24cffffe */ addiu $t7,$a2,-2
|
|
/* f054dd8: 2de10021 */ sltiu $at,$t7,0x21
|
|
/* f054ddc: 10200026 */ beqz $at,.NB0f054e78
|
|
/* f054de0: 000f7880 */ sll $t7,$t7,0x2
|
|
/* f054de4: 3c017f1a */ lui $at,0x7f1a
|
|
/* f054de8: 002f0821 */ addu $at,$at,$t7
|
|
/* f054dec: 8c2f3f74 */ lw $t7,0x3f74($at)
|
|
/* f054df0: 01e00008 */ jr $t7
|
|
/* f054df4: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054df8: 3c04800a */ lui $a0,0x800a
|
|
/* f054dfc: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054e00: 24050108 */ addiu $a1,$zero,0x108
|
|
/* f054e04: 0fc228be */ jal chrGiveWeapon
|
|
/* f054e08: 24060018 */ addiu $a2,$zero,0x18
|
|
/* f054e0c: 1000001f */ beqz $zero,.NB0f054e8c
|
|
/* f054e10: 00401825 */ or $v1,$v0,$zero
|
|
/* f054e14: 3c19800a */ lui $t9,0x800a
|
|
/* f054e18: 8f39eb74 */ lw $t9,-0x148c($t9)
|
|
/* f054e1c: 24010033 */ addiu $at,$zero,0x33
|
|
/* f054e20: 1721000e */ bne $t9,$at,.NB0f054e5c
|
|
/* f054e24: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054e28: 0fc59ed3 */ jal lvGetDifficulty
|
|
/* f054e2c: 00000000 */ sll $zero,$zero,0x0
|
|
/* f054e30: 24010002 */ addiu $at,$zero,0x2
|
|
/* f054e34: 14410009 */ bne $v0,$at,.NB0f054e5c
|
|
/* f054e38: 8fa70020 */ lw $a3,0x20($sp)
|
|
/* f054e3c: 8fb80024 */ lw $t8,0x24($sp)
|
|
/* f054e40: 3c04800a */ lui $a0,0x800a
|
|
/* f054e44: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054e48: 8fa5001c */ lw $a1,0x1c($sp)
|
|
/* f054e4c: 0fc228be */ jal chrGiveWeapon
|
|
/* f054e50: 93060004 */ lbu $a2,0x4($t8)
|
|
/* f054e54: 1000000d */ beqz $zero,.NB0f054e8c
|
|
/* f054e58: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f054e5c:
|
|
/* f054e5c: 3c04800a */ lui $a0,0x800a
|
|
/* f054e60: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054e64: 24050108 */ addiu $a1,$zero,0x108
|
|
/* f054e68: 0fc228be */ jal chrGiveWeapon
|
|
/* f054e6c: 24060018 */ addiu $a2,$zero,0x18
|
|
/* f054e70: 10000006 */ beqz $zero,.NB0f054e8c
|
|
/* f054e74: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f054e78:
|
|
/* f054e78: 3c04800a */ lui $a0,0x800a
|
|
/* f054e7c: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054e80: 0fc228be */ jal chrGiveWeapon
|
|
/* f054e84: 8fa5001c */ lw $a1,0x1c($sp)
|
|
/* f054e88: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f054e8c:
|
|
/* f054e8c: 3c05800a */ lui $a1,0x800a
|
|
/* f054e90: 3c07800a */ lui $a3,0x800a
|
|
/* f054e94: 24e7e6c0 */ addiu $a3,$a3,-6464
|
|
/* f054e98: 8ca5eaf8 */ lw $a1,-0x1508($a1)
|
|
/* f054e9c: 1000000d */ beqz $zero,.NB0f054ed4
|
|
/* f054ea0: 8fa80024 */ lw $t0,0x24($sp)
|
|
.NB0f054ea4:
|
|
/* f054ea4: 8fa90024 */ lw $t1,0x24($sp)
|
|
/* f054ea8: 3c04800a */ lui $a0,0x800a
|
|
/* f054eac: 8c84eae4 */ lw $a0,-0x151c($a0)
|
|
/* f054eb0: 8fa5001c */ lw $a1,0x1c($sp)
|
|
/* f054eb4: 0fc228be */ jal chrGiveWeapon
|
|
/* f054eb8: 91260004 */ lbu $a2,0x4($t1)
|
|
/* f054ebc: 3c05800a */ lui $a1,0x800a
|
|
/* f054ec0: 3c07800a */ lui $a3,0x800a
|
|
/* f054ec4: 24e7e6c0 */ addiu $a3,$a3,-6464
|
|
/* f054ec8: 8ca5eaf8 */ lw $a1,-0x1508($a1)
|
|
/* f054ecc: 00401825 */ or $v1,$v0,$zero
|
|
/* f054ed0: 8fa80024 */ lw $t0,0x24($sp)
|
|
.NB0f054ed4:
|
|
/* f054ed4: 10600007 */ beqz $v1,.NB0f054ef4
|
|
/* f054ed8: 24ab000a */ addiu $t3,$a1,0xa
|
|
/* f054edc: 8ce40434 */ lw $a0,0x434($a3)
|
|
/* f054ee0: 0fc132f7 */ jal chraiGoToLabel
|
|
/* f054ee4: 91060009 */ lbu $a2,0x9($t0)
|
|
/* f054ee8: 3c01800a */ lui $at,0x800a
|
|
/* f054eec: 10000002 */ beqz $zero,.NB0f054ef8
|
|
/* f054ef0: ac22eaf8 */ sw $v0,-0x1508($at)
|
|
.NB0f054ef4:
|
|
/* f054ef4: aceb0438 */ sw $t3,0x438($a3)
|
|
.NB0f054ef8:
|
|
/* f054ef8: 8fbf0014 */ lw $ra,0x14($sp)
|
|
/* f054efc: 27bd0028 */ addiu $sp,$sp,0x28
|
|
/* f054f00: 00001025 */ or $v0,$zero,$zero
|
|
/* f054f04: 03e00008 */ jr $ra
|
|
/* f054f08: 00000000 */ sll $zero,$zero,0x0
|
|
);
|
|
#endif
|
|
|
|
/**
|
|
* @cmd 00c9
|
|
*/
|
|
bool aiTryEquipHat(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[5] << 16) | (cmd[6] << 8) | cmd[7] | (cmd[4] << 24);
|
|
u32 modelnum = cmd[3] | (cmd[2] << 8);
|
|
struct prop *prop = NULL;
|
|
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop && g_Vars.chrdata->model) {
|
|
prop = hatCreateForChr(g_Vars.chrdata, modelnum, flags);
|
|
}
|
|
|
|
if (prop) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
|
|
} else {
|
|
g_Vars.aioffset += 9;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ca
|
|
*/
|
|
bool aiDuplicateChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 spawnflags = (cmd[6] << 16) | (cmd[7] << 8) | cmd[8] | (cmd[5] << 24);
|
|
u16 ailistid = cmd[4] | (cmd[3] << 8);
|
|
u8 *ailist = ailistFindById(ailistid);
|
|
bool pass = false;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct chrdata *clone = NULL;
|
|
struct weaponobj *srcweapon1 = NULL;
|
|
struct prop *cloneprop = NULL;
|
|
struct weaponobj *srcweapon0 = NULL;
|
|
struct prop *srcweapon0prop = NULL;
|
|
struct prop *cloneweapon0prop = NULL;
|
|
struct prop *srcweapon1prop = NULL;
|
|
struct weaponobj *cloneweapon1 = NULL;
|
|
struct weaponobj *cloneweapon0 = NULL;
|
|
struct prop *cloneweapon1prop = NULL;
|
|
|
|
if (chr && (chr->chrflags & CHRCFLAG_CLONEABLE)) {
|
|
cloneprop = chrSpawnAtChr(g_Vars.chrdata, chr->bodynum, -1, chr->chrnum, ailist, spawnflags);
|
|
|
|
if (cloneprop) {
|
|
clone = cloneprop->chr;
|
|
chrSetChrnum(clone, chrsGetNextUnusedChrnum());
|
|
chr->chrdup = clone->chrnum;
|
|
|
|
srcweapon0prop = chrGetHeldProp(chr, 0);
|
|
|
|
if (srcweapon0prop) {
|
|
srcweapon0 = srcweapon0prop->weapon;
|
|
cloneweapon0prop = chrGiveWeapon(clone, srcweapon0->base.modelnum, srcweapon0->weaponnum, 0);
|
|
|
|
if (cloneweapon0prop) {
|
|
cloneweapon0 = cloneweapon0prop->weapon;
|
|
}
|
|
}
|
|
|
|
srcweapon1prop = chrGetHeldProp(chr, 1);
|
|
|
|
if (srcweapon1prop) {
|
|
srcweapon1 = srcweapon1prop->weapon;
|
|
cloneweapon1prop = chrGiveWeapon(clone, srcweapon1->base.modelnum, srcweapon1->weaponnum, OBJFLAG_WEAPON_LEFTHANDED);
|
|
|
|
if (cloneweapon1prop) {
|
|
cloneweapon1 = cloneweapon1prop->weapon;
|
|
}
|
|
}
|
|
|
|
if (srcweapon1 && srcweapon0
|
|
&& cloneweapon1 && cloneweapon0
|
|
&& srcweapon0 == srcweapon1->dualweapon && srcweapon1 == srcweapon0->dualweapon) {
|
|
propweaponSetDual(cloneweapon1, cloneweapon0);
|
|
}
|
|
|
|
if (chr->weapons_held[2]) {
|
|
struct defaultobj *obj = chr->weapons_held[2]->obj;
|
|
hatCreateForChr(clone, obj->modelnum, 0);
|
|
}
|
|
|
|
clone->flags = chr->flags;
|
|
clone->flags2 = chr->flags2;
|
|
clone->padpreset1 = chr->padpreset1;
|
|
|
|
if (g_Vars.normmplayerisrunning == false
|
|
&& g_MissionConfig.iscoop
|
|
&& g_Vars.numaibuddies > 0) {
|
|
clone->flags |= CHRFLAG0_AIVSAI;
|
|
}
|
|
|
|
if (spawnflags & SPAWNFLAG_HIDDEN) {
|
|
clone->chrflags &= CHRCFLAG_HIDDEN;
|
|
}
|
|
|
|
clone->team = chr->team;
|
|
clone->squadron = chr->squadron;
|
|
clone->voicebox = chr->voicebox;
|
|
|
|
rebuildTeams();
|
|
rebuildSquadrons();
|
|
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[9]);
|
|
} else {
|
|
g_Vars.aioffset += 10;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00cb
|
|
*/
|
|
bool aiShowHudmsg(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
char *text = langGet(cmd[4] | (cmd[3] << 8));
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = g_Vars.currentplayernum;
|
|
|
|
if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) {
|
|
playernum = propGetPlayerNum(chr->prop);
|
|
}
|
|
|
|
setCurrentPlayerNum(playernum);
|
|
hudmsgCreate(text, HUDMSGTYPE_DEFAULT);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a4
|
|
*/
|
|
bool aiShowHudmsgMiddle(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] == 0) {
|
|
u32 text_id = cmd[5] | (cmd[4] << 8);
|
|
char *text = langGet(text_id);
|
|
hudmsgCreateWithColour(text, HUDMSGTYPE_7, cmd[3]);
|
|
} else if (cmd[2] == 1) {
|
|
u32 text_id = cmd[5] | (cmd[4] << 8);
|
|
char *text = langGet(text_id);
|
|
hudmsgCreateWithColour(text, HUDMSGTYPE_8, cmd[3]);
|
|
} else {
|
|
hudmsgRemoveAll();
|
|
}
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00cc
|
|
*/
|
|
bool aiShowHudmsgTopMiddle(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
char *text = langGet(cmd[4] | (cmd[3] << 8));
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = g_Vars.currentplayernum;
|
|
|
|
if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) {
|
|
playernum = propGetPlayerNum(chr->prop);
|
|
}
|
|
|
|
setCurrentPlayerNum(playernum);
|
|
hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[5]);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00cd
|
|
*/
|
|
GLOBAL_ASM(
|
|
glabel aiSpeak
|
|
/* f056040: 27bdffb8 */ addiu $sp,$sp,-72
|
|
/* f056044: afb10020 */ sw $s1,0x20($sp)
|
|
/* f056048: 3c11800a */ lui $s1,%hi(g_Vars)
|
|
/* f05604c: 26319fc0 */ addiu $s1,$s1,%lo(g_Vars)
|
|
/* f056050: 8e2e0434 */ lw $t6,0x434($s1)
|
|
/* f056054: 8e2f0438 */ lw $t7,0x438($s1)
|
|
/* f056058: afb0001c */ sw $s0,0x1c($sp)
|
|
/* f05605c: afbf0024 */ sw $ra,0x24($sp)
|
|
/* f056060: 01cf8021 */ addu $s0,$t6,$t7
|
|
/* f056064: 92050002 */ lbu $a1,0x2($s0)
|
|
/* f056068: 0fc126d1 */ jal chrFindById
|
|
/* f05606c: 8e240424 */ lw $a0,0x424($s1)
|
|
/* f056070: 92180005 */ lbu $t8,0x5($s0)
|
|
/* f056074: 92080006 */ lbu $t0,0x6($s0)
|
|
/* f056078: 8e2e028c */ lw $t6,0x28c($s1)
|
|
/* f05607c: 0018ca00 */ sll $t9,$t8,0x8
|
|
/* f056080: 03284825 */ or $t1,$t9,$t0
|
|
/* f056084: a7a9003e */ sh $t1,0x3e($sp)
|
|
/* f056088: 920a0003 */ lbu $t2,0x3($s0)
|
|
/* f05608c: 920c0004 */ lbu $t4,0x4($s0)
|
|
/* f056090: 00402825 */ or $a1,$v0,$zero
|
|
/* f056094: 000a5a00 */ sll $t3,$t2,0x8
|
|
/* f056098: 016c2025 */ or $a0,$t3,$t4
|
|
/* f05609c: 00041c00 */ sll $v1,$a0,0x10
|
|
/* f0560a0: 00036c03 */ sra $t5,$v1,0x10
|
|
/* f0560a4: afae0038 */ sw $t6,0x38($sp)
|
|
/* f0560a8: 05a00008 */ bltz $t5,.L0f0560cc
|
|
/* f0560ac: 01c03025 */ or $a2,$t6,$zero
|
|
/* f0560b0: afa20040 */ sw $v0,0x40($sp)
|
|
/* f0560b4: 0fc5b9f1 */ jal langGet
|
|
/* f0560b8: afae0034 */ sw $t6,0x34($sp)
|
|
/* f0560bc: 8fa50040 */ lw $a1,0x40($sp)
|
|
/* f0560c0: 8fa60034 */ lw $a2,0x34($sp)
|
|
/* f0560c4: 10000002 */ b .L0f0560d0
|
|
/* f0560c8: afa2002c */ sw $v0,0x2c($sp)
|
|
.L0f0560cc:
|
|
/* f0560cc: afa0002c */ sw $zero,0x2c($sp)
|
|
.L0f0560d0:
|
|
/* f0560d0: 10a0000b */ beqz $a1,.L0f056100
|
|
/* f0560d4: 00000000 */ nop
|
|
/* f0560d8: 8ca4001c */ lw $a0,0x1c($a1)
|
|
/* f0560dc: 10800008 */ beqz $a0,.L0f056100
|
|
/* f0560e0: 00000000 */ nop
|
|
/* f0560e4: 908f0000 */ lbu $t7,0x0($a0)
|
|
/* f0560e8: 24010006 */ addiu $at,$zero,0x6
|
|
/* f0560ec: 15e10004 */ bne $t7,$at,.L0f056100
|
|
/* f0560f0: 00000000 */ nop
|
|
/* f0560f4: 0fc4a25f */ jal propGetPlayerNum
|
|
/* f0560f8: 00000000 */ nop
|
|
/* f0560fc: 00403025 */ or $a2,$v0,$zero
|
|
.L0f056100:
|
|
/* f056100: 0fc4a24b */ jal setCurrentPlayerNum
|
|
/* f056104: 00c02025 */ or $a0,$a2,$zero
|
|
/* f056108: 8fb8002c */ lw $t8,0x2c($sp)
|
|
/* f05610c: 5300000b */ beqzl $t8,.L0f05613c
|
|
/* f056110: 92090002 */ lbu $t1,0x2($s0)
|
|
/* f056114: 92190002 */ lbu $t9,0x2($s0)
|
|
/* f056118: 240100f2 */ addiu $at,$zero,0xf2
|
|
/* f05611c: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f056120: 53210006 */ beql $t9,$at,.L0f05613c
|
|
/* f056124: 92090002 */ lbu $t1,0x2($s0)
|
|
/* f056128: 8e280424 */ lw $t0,0x424($s1)
|
|
/* f05612c: 3406ffff */ dli $a2,0xffff
|
|
/* f056130: 0fc249af */ jal func0f0926bc
|
|
/* f056134: 8d04001c */ lw $a0,0x1c($t0)
|
|
/* f056138: 92090002 */ lbu $t1,0x2($s0)
|
|
.L0f05613c:
|
|
/* f05613c: 240100f2 */ addiu $at,$zero,0xf2
|
|
/* f056140: 87a5003e */ lh $a1,0x3e($sp)
|
|
/* f056144: 1521000c */ bne $t1,$at,.L0f056178
|
|
/* f056148: 00003025 */ or $a2,$zero,$zero
|
|
/* f05614c: 8e2a0424 */ lw $t2,0x424($s1)
|
|
/* f056150: 82040007 */ lb $a0,0x7($s0)
|
|
/* f056154: 240b0200 */ addiu $t3,$zero,0x200
|
|
/* f056158: 8d47001c */ lw $a3,0x1c($t2)
|
|
/* f05615c: afab0014 */ sw $t3,0x14($sp)
|
|
/* f056160: afa00010 */ sw $zero,0x10($sp)
|
|
/* f056164: 87a5003e */ lh $a1,0x3e($sp)
|
|
/* f056168: 0fc25010 */ jal audioPlayFromProp
|
|
/* f05616c: 00003025 */ or $a2,$zero,$zero
|
|
/* f056170: 1000000a */ b .L0f05619c
|
|
/* f056174: 00403825 */ or $a3,$v0,$zero
|
|
.L0f056178:
|
|
/* f056178: 8e2c0424 */ lw $t4,0x424($s1)
|
|
/* f05617c: 82040007 */ lb $a0,0x7($s0)
|
|
/* f056180: 240d0009 */ addiu $t5,$zero,0x9
|
|
/* f056184: 240e0200 */ addiu $t6,$zero,0x200
|
|
/* f056188: 8d87001c */ lw $a3,0x1c($t4)
|
|
/* f05618c: afae0014 */ sw $t6,0x14($sp)
|
|
/* f056190: 0fc25010 */ jal audioPlayFromProp
|
|
/* f056194: afad0010 */ sw $t5,0x10($sp)
|
|
/* f056198: 00403825 */ or $a3,$v0,$zero
|
|
.L0f05619c:
|
|
/* f05619c: 8faf002c */ lw $t7,0x2c($sp)
|
|
/* f0561a0: 87a4003e */ lh $a0,0x3e($sp)
|
|
/* f0561a4: 11e00009 */ beqz $t7,.L0f0561cc
|
|
/* f0561a8: 00000000 */ nop
|
|
/* f0561ac: 0c004103 */ jal sndIsFiltered
|
|
/* f0561b0: afa70030 */ sw $a3,0x30($sp)
|
|
/* f0561b4: 14400005 */ bnez $v0,.L0f0561cc
|
|
/* f0561b8: 8fa70030 */ lw $a3,0x30($sp)
|
|
/* f0561bc: 8fa4002c */ lw $a0,0x2c($sp)
|
|
/* f0561c0: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f0561c4: 0fc37858 */ jal func0f0de160
|
|
/* f0561c8: 92060008 */ lbu $a2,0x8($s0)
|
|
.L0f0561cc:
|
|
/* f0561cc: 0fc4a24b */ jal setCurrentPlayerNum
|
|
/* f0561d0: 8fa40038 */ lw $a0,0x38($sp)
|
|
/* f0561d4: 8e380438 */ lw $t8,0x438($s1)
|
|
/* f0561d8: 8fbf0024 */ lw $ra,0x24($sp)
|
|
/* f0561dc: 8fb0001c */ lw $s0,0x1c($sp)
|
|
/* f0561e0: 27190009 */ addiu $t9,$t8,0x9
|
|
/* f0561e4: ae390438 */ sw $t9,0x438($s1)
|
|
/* f0561e8: 8fb10020 */ lw $s1,0x20($sp)
|
|
/* f0561ec: 27bd0048 */ addiu $sp,$sp,0x48
|
|
/* f0561f0: 03e00008 */ jr $ra
|
|
/* f0561f4: 00001025 */ or $v0,$zero,$zero
|
|
);
|
|
|
|
// Mismatch due to different registers
|
|
//bool aiSpeak(void)
|
|
//{
|
|
// u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
// struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
// s16 audio_id = cmd[6] | (cmd[5] << 8);
|
|
// s16 text_id = cmd[4] | (cmd[3] << 8);
|
|
// s32 prevplayernum = g_Vars.currentplayernum;
|
|
// s32 playernum = g_Vars.currentplayernum;
|
|
// u32 channelnum;
|
|
// char *text = text_id >= 0 ? langGet(text_id) : NULL;
|
|
//
|
|
// if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
// playernum = propGetPlayerNum(chr->prop);
|
|
// }
|
|
//
|
|
// setCurrentPlayerNum(playernum);
|
|
//
|
|
// if (text && cmd[2] != CHR_P1P2) {
|
|
// func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff);
|
|
// }
|
|
//
|
|
// if (cmd[2] == CHR_P1P2) {
|
|
// channelnum = audioPlayFromProp(cmd[7], audio_id, 0, g_Vars.chrdata->prop, 0, 512);
|
|
// } else {
|
|
// channelnum = audioPlayFromProp(cmd[7], audio_id, 0, g_Vars.chrdata->prop, 9, 512);
|
|
// }
|
|
//
|
|
// if (text && !sndIsFiltered(audio_id)) {
|
|
// func0f0de160(text, 6, cmd[8], channelnum);
|
|
// }
|
|
//
|
|
// setCurrentPlayerNum(prevplayernum);
|
|
//
|
|
// g_Vars.aioffset += 9;
|
|
//
|
|
// return false;
|
|
//}
|
|
|
|
/**
|
|
* @cmd 00ce
|
|
*/
|
|
bool aiPlaySound(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 audio_id = cmd[3] | (cmd[2] << 8);
|
|
|
|
audioPlayFromProp((s8)cmd[4], audio_id, 0, NULL, 0, 0);
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017c
|
|
*/
|
|
bool aiAssignSound(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 audio_id = cmd[3] | (cmd[2] << 8);
|
|
|
|
audioPlayFromProp((s8)cmd[4], audio_id, -1, NULL, 11, 0);
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d3
|
|
*/
|
|
bool aiAudioMuteChannel(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s8 channel = (s8)cmd[2];
|
|
|
|
audioMuteChannel(channel);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0138
|
|
*/
|
|
bool aiIfChannelIdle(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s8 channel = (s8) cmd[2];
|
|
|
|
if (audioIsChannelIdle(channel)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d1
|
|
*/
|
|
bool ai00d1(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 audio_id = cmd[4] | (cmd[3] << 8);
|
|
u16 thing = cmd[6] | (cmd[5] << 8);
|
|
|
|
audioPlayFromProp2((s8)cmd[2], audio_id, -1, NULL, thing, 2500, 3000, 0);
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d2
|
|
*/
|
|
bool ai00d2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 thing1 = cmd[4] | (cmd[3] << 8);
|
|
u16 thing2 = cmd[6] | (cmd[5] << 8);
|
|
s32 audio_id = func0f0927d4(thing1, 400, 2500, 3000, 32767);
|
|
|
|
audioPlayFromProp2((s8)cmd[2], audio_id, -1, NULL, thing2, 2500, 3000, 0);
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00cf
|
|
*/
|
|
bool ai00cf(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
u16 thing = cmd[5] | (cmd[4] << 8);
|
|
|
|
if (obj && obj->prop) {
|
|
audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing, 2500, 3000, 0);
|
|
}
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016b
|
|
*/
|
|
bool ai016b(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
u16 thing1 = cmd[5] | (cmd[4] << 8);
|
|
u16 thing2 = cmd[7] | (cmd[6] << 8);
|
|
u16 thing3 = cmd[9] | (cmd[8] << 8);
|
|
|
|
if (obj && obj->prop) {
|
|
s32 thing1again;
|
|
|
|
if (thing1 == 0) {
|
|
thing1again = -1;
|
|
} else {
|
|
thing1again = thing1;
|
|
}
|
|
|
|
audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing1again, thing2, thing3, 2);
|
|
}
|
|
|
|
g_Vars.aioffset += 10;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0179
|
|
*/
|
|
bool ai0179(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 thing1 = cmd[5] | (cmd[4] << 8);
|
|
u16 thing2 = cmd[7] | (cmd[6] << 8);
|
|
u16 thing3 = cmd[9] | (cmd[8] << 8);
|
|
|
|
if (cmd[10] == 0) {
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
|
|
if (obj && obj->prop) {
|
|
audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing1, thing2, thing3, 0);
|
|
}
|
|
} else {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr && chr->prop) {
|
|
audioPlayFromProp2((s8)cmd[2], -1, -1, chr->prop, thing1, thing2, thing3, 0);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 11;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d0
|
|
*/
|
|
bool ai00d0(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 padnum = cmd[4] | (cmd[3] << 8);
|
|
s16 sound = cmd[6] | (cmd[5] << 8);
|
|
|
|
func0f0939f8(0, NULL, sound, padnum, -1, 2, 0, 0, 0, -1, 0, -1, -1, -1, -1);
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d4
|
|
*/
|
|
bool ai00d4(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 thing = cmd[4] | (cmd[3] << 8);
|
|
|
|
if (channelGetUnk06((s8)cmd[2]) < thing) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d5
|
|
*/
|
|
bool aiHovercarBeginPath(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct path *path = pathFindById(cmd[2]);
|
|
|
|
if (g_Vars.truck) {
|
|
g_Vars.truck->path = path;
|
|
g_Vars.truck->nextstep = 0;
|
|
}
|
|
|
|
if (g_Vars.hovercar) {
|
|
struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar);
|
|
g_Vars.hovercar->path = path;
|
|
g_Vars.hovercar->nextstep = 0;
|
|
g_Vars.hovercar->path->flags |= PATHFLAG_INUSE;
|
|
|
|
if (chopper) {
|
|
chopper->targetvisible = false;
|
|
chopper->attackmode = CHOPPERMODE_PATROL;
|
|
chopper->turnrot60 = 0;
|
|
chopper->roty = 0;
|
|
chopper->rotx = 0;
|
|
chopper->gunroty = 0;
|
|
chopper->gunrotx = 0;
|
|
chopper->barrelrot = 0;
|
|
chopper->barrelrotspeed = 0;
|
|
chopper->vz = 0;
|
|
chopper->vy = 0;
|
|
chopper->vx = 0;
|
|
chopper->otz = 0;
|
|
chopper->oty = 0;
|
|
chopper->otx = 0;
|
|
chopper->power = 0;
|
|
chopper->bob = 0;
|
|
chopper->bobstrength = 0.05;
|
|
chopper->timer60 = 0;
|
|
chopper->patroltimer60 = 0;
|
|
chopper->cw = 0;
|
|
chopper->weaponsarmed = true;
|
|
chopper->base.flags |= OBJFLAG_20000000;
|
|
} else {
|
|
g_Vars.hovercar->weaponsarmed = false;
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d6
|
|
*/
|
|
bool aiSetVehicleSpeed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 speedtime = cmd[5] | (cmd[4] << 8);
|
|
f32 speedaim = (cmd[3] | (cmd[2] << 8)) * 100.0f / 15360.0f;
|
|
|
|
if (g_Vars.truck) {
|
|
g_Vars.truck->speedaim = speedaim;
|
|
g_Vars.truck->speedtime60 = speedtime;
|
|
}
|
|
|
|
if (g_Vars.hovercar) {
|
|
g_Vars.hovercar->speedaim = speedaim;
|
|
g_Vars.hovercar->speedtime60 = speedtime;
|
|
}
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d7
|
|
*/
|
|
bool aiSetRotorSpeed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 speedtime = cmd[5] | (cmd[4] << 8);
|
|
f32 speedaim = (cmd[3] | (cmd[2] << 8)) * M_BADTAU / 3600;
|
|
|
|
if (g_Vars.heli) {
|
|
g_Vars.heli->rotoryspeedaim = speedaim;
|
|
g_Vars.heli->rotoryspeedtime = speedtime;
|
|
}
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d8
|
|
*/
|
|
bool aiNoOp00d8(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00d9
|
|
*/
|
|
bool aiNoOp00d9(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00da
|
|
*/
|
|
bool aiSetObjImage(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
if (obj->type == OBJTYPE_SINGLEMONITOR) {
|
|
struct singlemonitorobj *sm = (struct singlemonitorobj *) obj;
|
|
tvscreenSetImageByNum(&sm->screen, cmd[4]);
|
|
} else if (obj->type == OBJTYPE_MULTIMONITOR) {
|
|
u8 slot = cmd[3];
|
|
if (slot < 4) {
|
|
struct multimonitorobj *mm = (struct multimonitorobj *) obj;
|
|
tvscreenSetImageByNum(&mm->screens[slot], cmd[4]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00db
|
|
*/
|
|
bool aiNoOp00db(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00dc
|
|
*/
|
|
bool aiEndLevel(void)
|
|
{
|
|
if (debugAllowEndLevel()) {
|
|
if (var800624a4) {
|
|
mainChangeToStage(STAGE_TITLE);
|
|
} else if (g_Vars.autocutplaying) {
|
|
g_Vars.autocutfinished = true;
|
|
} else {
|
|
func0000e990();
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00dd
|
|
*/
|
|
bool ai00dd(void)
|
|
{
|
|
currentPlayerEndCutscene();
|
|
g_Vars.aioffset += 2;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00de
|
|
*/
|
|
bool aiWarpJoToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
currentPlayerPrepareWarpToPad(pad_id);
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010d
|
|
*/
|
|
bool aiNoOp010d(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0111
|
|
*/
|
|
bool aiSetCameraAnimation(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 anim_id = cmd[3] | (cmd[2] << 8);
|
|
|
|
cameraDoAnimation(anim_id);
|
|
|
|
if (g_Vars.currentplayer->haschrbody == false) {
|
|
return true;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0113
|
|
*/
|
|
bool aiIfInCutscene(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.in_cutscene) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0174
|
|
*/
|
|
bool aiIfCutsceneButtonPressed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if ((g_Vars.in_cutscene && g_CutsceneSkipRequested) ||
|
|
(g_Vars.stagenum == STAGE_CITRAINING && var80087260 > 0)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0175
|
|
*/
|
|
bool ai0175(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
func0f0ba190(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0112
|
|
*/
|
|
bool aiObjectDoAnimation(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 anim_id = cmd[3] | (cmd[2] << 8);
|
|
struct defaultobj *obj = NULL;
|
|
f32 thing;
|
|
s32 startframe = cmd[7] | (cmd[6] << 8);
|
|
f32 fstartframe;
|
|
|
|
if (startframe == 0xffff) {
|
|
fstartframe = 0;
|
|
} else if (startframe == 0xfffe) {
|
|
fstartframe = animGetNumFrames(anim_id) - 2;
|
|
|
|
if (fstartframe < 0) {
|
|
fstartframe = 0;
|
|
}
|
|
} else {
|
|
fstartframe = startframe;
|
|
}
|
|
|
|
if (cmd[4] == 255) {
|
|
if (g_Vars.chrdata && g_Vars.chrdata->myspecial >= 0) {
|
|
obj = objFindByTagId(g_Vars.chrdata->myspecial);
|
|
}
|
|
} else {
|
|
obj = objFindByTagId(cmd[4]);
|
|
}
|
|
|
|
if (obj && obj->prop) {
|
|
struct anim *anim = obj->model->anim;
|
|
|
|
if (obj->model->anim == NULL) {
|
|
obj->model->anim = func0f0b32e4();
|
|
}
|
|
|
|
if (obj->model->anim) {
|
|
thing = 1.0f / (s32)cmd[5];
|
|
|
|
if (g_Vars.in_cutscene && startframe != 0xfffe) {
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
fstartframe += var8009e388pf * thing;
|
|
#else
|
|
fstartframe += g_CutsceneFrameOverrun240 * thing * 0.25f;
|
|
#endif
|
|
}
|
|
|
|
animInit(obj->model->anim);
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
modelSetAnimPlaySpeed(obj->model, 1.2, 0);
|
|
#endif
|
|
modelSetAnimation(obj->model, anim_id, 0, fstartframe, thing, 0);
|
|
modelSetAnimScale(obj->model, func0f15c888() * obj->model->scale * 100.0f);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0114
|
|
*/
|
|
bool aiEnableChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->model) {
|
|
propActivate(chr->prop);
|
|
propEnable(chr->prop);
|
|
chr0f0220ac(chr);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0115
|
|
*/
|
|
bool aiDisableChr(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->model) {
|
|
propDeregisterRooms(chr->prop);
|
|
propDelist(chr->prop);
|
|
propDisable(chr->prop);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0116
|
|
*/
|
|
bool aiEnableObj(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->model) {
|
|
propActivate(obj->prop);
|
|
propEnable(obj->prop);
|
|
|
|
if (g_Vars.currentplayer->eyespy == NULL && obj->type == OBJTYPE_WEAPON) {
|
|
struct weaponobj *weapon = (struct weaponobj *) obj;
|
|
|
|
if (weapon->weaponnum == WEAPON_EYESPY) {
|
|
currentPlayerInitEyespy();
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0117
|
|
*/
|
|
bool aiDisableObj(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->model) {
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
if (g_Vars.autocutplaying
|
|
&& mainGetStageNum() == STAGE_AIRFORCEONE
|
|
&& (obj->modelnum == MODEL_AIRFORCE1 || obj->modelnum == MODEL_SK_SHUTTLE)) {
|
|
// ignore
|
|
} else {
|
|
if (obj->prop->parent) {
|
|
objDetach(obj->prop);
|
|
} else {
|
|
propDeregisterRooms(obj->prop);
|
|
propDelist(obj->prop);
|
|
propDisable(obj->prop);
|
|
}
|
|
}
|
|
#else
|
|
if (obj->prop->parent) {
|
|
objDetach(obj->prop);
|
|
} else {
|
|
propDeregisterRooms(obj->prop);
|
|
propDelist(obj->prop);
|
|
propDisable(obj->prop);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00df
|
|
*/
|
|
bool ai00df(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct tag *tag = tagFindById(cmd[2]);
|
|
|
|
if (tag) {
|
|
s32 cmdindex = tagGetCommandIndex(tag);
|
|
|
|
if (cmdindex >= 0) {
|
|
void *ptr = setupGetPtrToCommandByIndex(cmdindex + tag->cmdoffset);
|
|
currentPlayerPrepareWarpType2(ptr, cmd[4] | (cmd[3] << 8), cmd[6] | (cmd[5] << 8));
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 7;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e0
|
|
*/
|
|
bool aiRevokeControl(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, false);
|
|
bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, false);
|
|
|
|
if ((cmd[3] & 2) == 0) {
|
|
currentPlayerSetHudmsgsOff(HUDMSGREASON_NOCONTROL);
|
|
}
|
|
|
|
if ((cmd[3] & 4) == 0) {
|
|
countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, false);
|
|
}
|
|
|
|
g_PlayersWithControl[g_Vars.currentplayernum] = false;
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e1
|
|
*/
|
|
bool aiGrantControl(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
setCurrentPlayerNum(propGetPlayerNum(chr->prop));
|
|
bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, true);
|
|
bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, true);
|
|
currentPlayerSetHudmsgsOn(HUDMSGREASON_NOCONTROL);
|
|
countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, true);
|
|
g_PlayersWithControl[g_Vars.currentplayernum] = true;
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e2
|
|
*/
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
bool aiChrMoveToPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata,cmd[2]);
|
|
bool pass = false;
|
|
f32 somefloat;
|
|
struct pad pad;
|
|
s16 rooms[2];
|
|
struct chrdata *chr2;
|
|
|
|
if (chr && chr->prop) {
|
|
if (cmd[5] == 88) {
|
|
chr2 = chrFindById(g_Vars.chrdata, cmd[4]);
|
|
|
|
if (chr2 && chr2->prop) {
|
|
somefloat = chrGetInverseTheta(chr2);
|
|
pass = chrMoveToPos(chr, &chr2->prop->pos, chr2->prop->rooms, somefloat, 0);
|
|
}
|
|
} else {
|
|
s32 padnum = cmd[4] | (cmd[3] << 8);
|
|
padnum = chrResolvePadId(chr, padnum);
|
|
|
|
if (padnum >= 0) {
|
|
padUnpack(padnum, PADFIELD_POS | PADFIELD_LOOK | PADFIELD_ROOM, &pad);
|
|
somefloat = atan2f(pad.look.x, pad.look.z);
|
|
|
|
rooms[0] = pad.room;
|
|
rooms[1] = -1;
|
|
pass = chrMoveToPos(chr, &pad.pos, rooms, somefloat, cmd[5]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
#else
|
|
GLOBAL_ASM(
|
|
glabel aiChrMoveToPad
|
|
/* f056b9c: 27bdff68 */ addiu $sp,$sp,-152
|
|
/* f056ba0: afb0001c */ sw $s0,0x1c($sp)
|
|
/* f056ba4: 3c10800a */ lui $s0,0x800a
|
|
/* f056ba8: 2610e6c0 */ addiu $s0,$s0,-6464
|
|
/* f056bac: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f056bb0: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f056bb4: afb10020 */ sw $s1,0x20($sp)
|
|
/* f056bb8: afbf0024 */ sw $ra,0x24($sp)
|
|
/* f056bbc: 01cf8821 */ addu $s1,$t6,$t7
|
|
/* f056bc0: 92380003 */ lbu $t8,0x3($s1)
|
|
/* f056bc4: 92280004 */ lbu $t0,0x4($s1)
|
|
/* f056bc8: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f056bcc: 0018ca00 */ sll $t9,$t8,0x8
|
|
/* f056bd0: 03284825 */ or $t1,$t9,$t0
|
|
/* f056bd4: afa90090 */ sw $t1,0x90($sp)
|
|
/* f056bd8: 0fc123d5 */ jal chrFindById
|
|
/* f056bdc: 92250002 */ lbu $a1,0x2($s1)
|
|
/* f056be0: 00402025 */ or $a0,$v0,$zero
|
|
/* f056be4: 1040001a */ beqz $v0,.NB0f056c50
|
|
/* f056be8: 00001825 */ or $v1,$zero,$zero
|
|
/* f056bec: 8c4a001c */ lw $t2,0x1c($v0)
|
|
/* f056bf0: 8fa50090 */ lw $a1,0x90($sp)
|
|
/* f056bf4: 11400016 */ beqz $t2,.NB0f056c50
|
|
/* f056bf8: 00000000 */ sll $zero,$zero,0x0
|
|
/* f056bfc: 0fc1228f */ jal chrResolvePadId
|
|
/* f056c00: afa2008c */ sw $v0,0x8c($sp)
|
|
/* f056c04: 00402025 */ or $a0,$v0,$zero
|
|
/* f056c08: 24050046 */ addiu $a1,$zero,0x46
|
|
/* f056c0c: 0fc43fc4 */ jal padUnpack
|
|
/* f056c10: 27a60030 */ addiu $a2,$sp,0x30
|
|
/* f056c14: c7ac003c */ lwc1 $f12,0x3c($sp)
|
|
/* f056c18: 0fc251b8 */ jal atan2f
|
|
/* f056c1c: c7ae0044 */ lwc1 $f14,0x44($sp)
|
|
/* f056c20: 8fab0078 */ lw $t3,0x78($sp)
|
|
/* f056c24: 240cffff */ addiu $t4,$zero,-1
|
|
/* f056c28: a7ac002e */ sh $t4,0x2e($sp)
|
|
/* f056c2c: a7ab002c */ sh $t3,0x2c($sp)
|
|
/* f056c30: 922d0005 */ lbu $t5,0x5($s1)
|
|
/* f056c34: 44070000 */ mfc1 $a3,$f0
|
|
/* f056c38: 8fa4008c */ lw $a0,0x8c($sp)
|
|
/* f056c3c: 27a50030 */ addiu $a1,$sp,0x30
|
|
/* f056c40: 27a6002c */ addiu $a2,$sp,0x2c
|
|
/* f056c44: 0fc12a6e */ jal chrMoveToPos
|
|
/* f056c48: afad0010 */ sw $t5,0x10($sp)
|
|
/* f056c4c: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f056c50:
|
|
/* f056c50: 50600008 */ beqzl $v1,.NB0f056c74
|
|
/* f056c54: 8e0e0438 */ lw $t6,0x438($s0)
|
|
/* f056c58: 8e040434 */ lw $a0,0x434($s0)
|
|
/* f056c5c: 8e050438 */ lw $a1,0x438($s0)
|
|
/* f056c60: 0fc132f7 */ jal chraiGoToLabel
|
|
/* f056c64: 92260006 */ lbu $a2,0x6($s1)
|
|
/* f056c68: 10000004 */ beqz $zero,.NB0f056c7c
|
|
/* f056c6c: ae020438 */ sw $v0,0x438($s0)
|
|
/* f056c70: 8e0e0438 */ lw $t6,0x438($s0)
|
|
.NB0f056c74:
|
|
/* f056c74: 25cf0007 */ addiu $t7,$t6,0x7
|
|
/* f056c78: ae0f0438 */ sw $t7,0x438($s0)
|
|
.NB0f056c7c:
|
|
/* f056c7c: 8fbf0024 */ lw $ra,0x24($sp)
|
|
/* f056c80: 8fb0001c */ lw $s0,0x1c($sp)
|
|
/* f056c84: 8fb10020 */ lw $s1,0x20($sp)
|
|
/* f056c88: 27bd0098 */ addiu $sp,$sp,0x98
|
|
/* f056c8c: 03e00008 */ jr $ra
|
|
/* f056c90: 00001025 */ or $v0,$zero,$zero
|
|
);
|
|
#endif
|
|
|
|
/**
|
|
* @cmd 00e3
|
|
*/
|
|
bool ai00e3(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (var8007074c != 2) {
|
|
currentPlayerSetFadeColour(0, 0, 0, 0);
|
|
currentPlayerSetFadeFrac(60, 1);
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e4
|
|
*/
|
|
bool ai00e4(void)
|
|
{
|
|
s32 playernum;
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
|
|
for (playernum = 0; playernum < PLAYERCOUNT(); playernum++) {
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (var8007074c != 2) {
|
|
currentPlayerSetFadeColour(0, 0, 0, 1);
|
|
currentPlayerSetFadeFrac(60, 0);
|
|
}
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e5
|
|
*/
|
|
bool aiIfColourFadeComplete(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bool pass = false;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
|
|
if (g_Vars.players[playernum]->colourfadetimemax60 < 0) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e8
|
|
*/
|
|
bool aiSetDoorOpen(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
struct doorobj *door = (struct doorobj *) obj;
|
|
door->frac = door->maxfrac;
|
|
door->fracspeed = 0;
|
|
door->lastopen60 = g_Vars.lvframe60;
|
|
door->mode = 0;
|
|
doorUpdateTiles(door);
|
|
doorActivatePortal(door);
|
|
func0f0926bc(door->base.prop, 1, 0xffff);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00e9
|
|
*/
|
|
bool ai00e9(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chrSetWeaponReapable(chr, cmd[3]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ea
|
|
*/
|
|
bool aiIfNumPlayersLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (PLAYERCOUNT3012() < (s8)cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00eb
|
|
*/
|
|
bool aiIfChrAmmoQuantityLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
bool passes = false;
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (bgunGetAmmoCount((s8)cmd[3]) < (s8)cmd[4]) {
|
|
passes = true;
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (passes) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ec
|
|
*/
|
|
bool aiChrDrawWeapon(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
bgunEquipWeapon2(0, (s8)cmd[3]);
|
|
bgunEquipWeapon2(1, 0);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ed
|
|
*/
|
|
bool aiChrDrawWeaponInCutscene(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
bgunEquipWeapon((s8)cmd[3]);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ee
|
|
*/
|
|
bool ai00ee(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
g_Vars.currentplayer->bondforcespeed.x = (s8)cmd[3];
|
|
g_Vars.currentplayer->bondforcespeed.y = 0;
|
|
g_Vars.currentplayer->bondforcespeed.z = (s8)cmd[4];
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ef
|
|
*/
|
|
bool aiIfObjInRoom(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
u16 room_id = cmd[4] | (cmd[3] << 8);
|
|
s32 room_something = chrGetPadRoom(g_Vars.chrdata, room_id);
|
|
|
|
if (room_something >= 0 && obj && obj->prop && room_something == obj->prop->rooms[0]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f2
|
|
*/
|
|
bool aiSwitchToAltSky(void)
|
|
{
|
|
skySetTransitionFrac(1);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f3
|
|
*/
|
|
bool aiChrSetInvincible(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
g_PlayerInvincible = true;
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f4
|
|
*/
|
|
bool ai00f4(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
s32 a = cmd[3] | (cmd[2] << 8);
|
|
s16 b = cmd[5] | (cmd[4] << 8);
|
|
s16 c = cmd[7] | (cmd[6] << 8);
|
|
s32 d = cmd[9] | (cmd[8] << 8);
|
|
s16 e = cmd[11] | (cmd[10] << 8);
|
|
s32 f = cmd[13] | (cmd[12] << 8);
|
|
|
|
currentPlayerPrepareWarpType3(f * M_BADTAU / 65536, c * M_BADTAU / 65536, a, b, e, d);
|
|
|
|
g_Vars.aioffset += 14;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f5
|
|
*/
|
|
bool ai00f5(void)
|
|
{
|
|
var8007073c = 1;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f6
|
|
*/
|
|
bool ai00f6(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (var8007073c == 2) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f7
|
|
*/
|
|
bool aiIfAllObjectivesComplete(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (objectiveIsAllComplete()) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f8
|
|
*/
|
|
bool aiIfPlayerIsInvincible(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bool pass = false;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
pass = g_PlayerInvincible;
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00f9
|
|
*/
|
|
bool aiPlayXTrack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset += 5;
|
|
musicSetXReason((s8)cmd[2], cmd[3], cmd[4]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00fa
|
|
*/
|
|
bool aiStopXTrack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset += 3;
|
|
musicUnsetXReason((s8)cmd[2]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 015b
|
|
*/
|
|
bool aiPlayTrackIsolated(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] == MUSIC_CI_TRAINING) {
|
|
u16 volume = optionsGetMusicVolume();
|
|
musicPlayTrackIsolated(cmd[2]);
|
|
optionsSetMusicVolume(volume);
|
|
} else {
|
|
musicPlayTrackIsolated(cmd[2]);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 015c
|
|
*/
|
|
bool aiPlayDefaultTracks(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
musicPlayDefaultTracks();
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017d
|
|
*/
|
|
bool aiPlayCutsceneTrack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
musicStartCutscene(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017e
|
|
*/
|
|
bool aiStopCutsceneTrack(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
musicEndCutscene();
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 017f
|
|
*/
|
|
bool aiPlayTemporaryTrack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
musicStartTemporaryAmbient(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0180
|
|
*/
|
|
bool aiStopAmbientTrack(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
musicEndTemporaryAmbient();
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00fb
|
|
*/
|
|
bool aiChrExplosions(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
currentPlayerSurroundWithExplosions(0);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00fc
|
|
*/
|
|
bool aiIfKillCountGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.killcount > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ab
|
|
*/
|
|
bool aiIfNumKnockedOutChrs(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] < mpstatsGetTotalKnockoutCount() && cmd[3] == 0) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else if (mpstatsGetTotalKnockoutCount() < cmd[2] && cmd[3] == 1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00fd
|
|
*/
|
|
bool ai00fd(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->chrflags & CHRCFLAG_TRIGGERSHOTLIST)) {
|
|
chr->chrflags &= ~CHRCFLAG_TRIGGERSHOTLIST;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00fe
|
|
*/
|
|
bool aiKillBond(void)
|
|
{
|
|
g_Vars.bond->isdead = true;
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 00ff
|
|
*/
|
|
bool aiBeSurprisedSurrender(void)
|
|
{
|
|
chrTrySurprisedSurrender(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0100
|
|
*/
|
|
bool aiNoOp0100(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0101
|
|
*/
|
|
bool aiNoOp0101(void)
|
|
{
|
|
g_Vars.aioffset += 3;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0102
|
|
*/
|
|
bool aiSetLights(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 padnum = cmd[3] | (cmd[2] << 8);
|
|
s32 roomnum = chrGetPadRoom(g_Vars.chrdata, padnum);
|
|
|
|
if (roomnum >= 0) {
|
|
switch (cmd[4]) {
|
|
case LIGHTOP_TURNOFF:
|
|
roomSetLightsOn(roomnum, false);
|
|
break;
|
|
case LIGHTOP_TURNON:
|
|
roomSetLightsOn(roomnum, true);
|
|
break;
|
|
default:
|
|
roomSetLighting(roomnum, cmd[4], cmd[5], cmd[6], PALDOWN(cmd[7]));
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 11;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0103
|
|
*/
|
|
bool ai0103(void)
|
|
{
|
|
if (func0f04b658(g_Vars.chrdata)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0104
|
|
*/
|
|
GLOBAL_ASM(
|
|
glabel aiRemoveObjectAtPropPreset
|
|
/* f058b08: 3c05800a */ lui $a1,%hi(g_Vars)
|
|
/* f058b0c: 24a59fc0 */ addiu $a1,$a1,%lo(g_Vars)
|
|
/* f058b10: 8ca30424 */ lw $v1,0x424($a1)
|
|
/* f058b14: 2409ffff */ addiu $t1,$zero,-1
|
|
/* f058b18: 8462012c */ lh $v0,0x12c($v1)
|
|
/* f058b1c: 0440000c */ bltz $v0,.L0f058b50
|
|
/* f058b20: 000270c0 */ sll $t6,$v0,0x3
|
|
/* f058b24: 8caf0338 */ lw $t7,0x338($a1)
|
|
/* f058b28: 01c27021 */ addu $t6,$t6,$v0
|
|
/* f058b2c: 000e70c0 */ sll $t6,$t6,0x3
|
|
/* f058b30: 01cfc021 */ addu $t8,$t6,$t7
|
|
/* f058b34: 8f040004 */ lw $a0,0x4($t8)
|
|
/* f058b38: 3c01ffdf */ lui $at,0xffdf
|
|
/* f058b3c: 3421ffff */ ori $at,$at,0xffff
|
|
/* f058b40: 8c990040 */ lw $t9,0x40($a0)
|
|
/* f058b44: 03214024 */ and $t0,$t9,$at
|
|
/* f058b48: ac880040 */ sw $t0,0x40($a0)
|
|
/* f058b4c: 8ca30424 */ lw $v1,0x424($a1)
|
|
.L0f058b50:
|
|
/* f058b50: a469012c */ sh $t1,0x12c($v1)
|
|
/* f058b54: 8caa0438 */ lw $t2,0x438($a1)
|
|
/* f058b58: 00001025 */ or $v0,$zero,$zero
|
|
/* f058b5c: 254b0002 */ addiu $t3,$t2,0x2
|
|
/* f058b60: 03e00008 */ jr $ra
|
|
/* f058b64: acab0438 */ sw $t3,0x438($a1)
|
|
);
|
|
|
|
// Mismatch due to temporary registers
|
|
//bool aiRemoveObjectAtPropPreset(void)
|
|
//{
|
|
// if (g_Vars.chrdata->proppreset1 >= 0) {
|
|
// struct defaultobj *obj = g_Vars.props[g_Vars.chrdata->proppreset1].obj;
|
|
// obj->hidden &= ~OBJHFLAG_OCCUPIEDCHAIR;
|
|
// }
|
|
//
|
|
// g_Vars.chrdata->proppreset1 = -1;
|
|
// g_Vars.aioffset += 2;
|
|
//
|
|
// return false;
|
|
//}
|
|
|
|
/**
|
|
* @cmd 0105
|
|
*/
|
|
bool aiIfPropPresetHeightLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct prop *prop = &g_Vars.props[g_Vars.chrdata->proppreset1];
|
|
f32 value = cmd[3] | (cmd[2] << 8);
|
|
f32 ymax;
|
|
f32 ymin;
|
|
f32 width;
|
|
propGetBbox(prop, &width, &ymax, &ymin);
|
|
|
|
if (ymax - ymin < value) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0106
|
|
*/
|
|
bool aiSetTarget(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata) {
|
|
s16 prop_id;
|
|
|
|
if (!cmd[3] && !cmd[4]) {
|
|
prop_id = propGetIndexByChrId(g_Vars.chrdata, cmd[2]);
|
|
} else if (!cmd[4]) {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
prop_id = chr->target;
|
|
}
|
|
|
|
if (prop_id != g_Vars.chrdata->target) {
|
|
g_Vars.chrdata->lastvisibletarget60 = 0;
|
|
g_Vars.chrdata->lastseetarget60 = 0;
|
|
g_Vars.chrdata->lastheartarget60 = 0;
|
|
g_Vars.chrdata->hidden &= ~CHRHFLAG_IS_HEARING_TARGET;
|
|
g_Vars.chrdata->chrflags &= ~CHRCFLAG_NEAR_MISS;
|
|
g_Vars.chrdata->target = prop_id;
|
|
}
|
|
} else if (g_Vars.hovercar) {
|
|
chopperSetTarget(g_Vars.hovercar, cmd[2]);
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0107
|
|
*/
|
|
bool aiIfPresetsTargetIsNotMyTarget(void)
|
|
{
|
|
s32 mypresetchrstarget;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->chrpreset1 != -1) {
|
|
mypresetchrstarget = propGetIndexByChrId(g_Vars.chrdata, g_Vars.chrdata->chrpreset1);
|
|
}
|
|
|
|
if (g_Vars.chrdata->target != -1 && mypresetchrstarget != g_Vars.chrdata->target) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0108
|
|
*/
|
|
bool aiIfChrTarget(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
bool pass = false;
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
// empty
|
|
} else if (cmd[2] != CHR_BOND) {
|
|
if (cmd[4] == 0) {
|
|
struct chrdata *chr2 = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr2 && chr2->prop && chrGetTargetProp(chr) == chr2->prop) {
|
|
pass = true;
|
|
}
|
|
} else {
|
|
if (chr->target != -1 && chr && chr->prop) {
|
|
pass = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0109
|
|
*/
|
|
bool aiSetChrPresetToChrNearSelf(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[4] | (cmd[3] << 8)) * 10.0f;
|
|
|
|
if (chrSetChrPresetToChrNearSelf(cmd[2], g_Vars.chrdata, distance)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010a
|
|
*/
|
|
bool aiSetChrPresetToChrNearPad(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[4] | (cmd[3] << 8)) * 10.0f;
|
|
u16 padnum = cmd[6] | (cmd[5] << 8);
|
|
|
|
if (chrSetChrPresetToChrNearPad(cmd[2], g_Vars.chrdata, distance, padnum)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010b
|
|
*/
|
|
bool aiChrSetTeam(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->team = cmd[3];
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 010c
|
|
*/
|
|
bool aiIfCompareChrPresetsTeam(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, CHR_PRESET);
|
|
|
|
if (!chr || (!chr->model && chr->prop->type != PROPTYPE_PLAYER)) {
|
|
chrSetChrPreset(g_Vars.chrdata, CHR_BOND);
|
|
chr = chrFindById(g_Vars.chrdata, CHR_PRESET);
|
|
}
|
|
|
|
if (chrCompareTeams(chr, g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011e
|
|
*/
|
|
bool aiIfHuman(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && CHRRACE(chr) == RACE_HUMAN) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 011f
|
|
*/
|
|
bool aiIfSkedar(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && CHRRACE(chr) == RACE_SKEDAR) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0120
|
|
*/
|
|
GLOBAL_ASM(
|
|
glabel ai0120
|
|
.late_rodata
|
|
glabel var7f1a9ce4
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9ce8
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9cec
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9cf0
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9cf4
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9cf8
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9cfc
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9d00
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9d04
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d08
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d0c
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d10
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d14
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d18
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d1c
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d20
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d24
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d28
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d2c
|
|
.word ai0120+0x9c # f0593a0
|
|
glabel var7f1a9d30
|
|
.word ai0120+0x8c # f059390
|
|
glabel var7f1a9d34
|
|
.word ai0120+0x9c # f0593a0
|
|
glabel var7f1a9d38
|
|
.word ai0120+0x9c # f0593a0
|
|
glabel var7f1a9d3c
|
|
.word ai0120+0x9c # f0593a0
|
|
glabel var7f1a9d40
|
|
.word ai0120+0x9c # f0593a0
|
|
glabel var7f1a9d44
|
|
.word ai0120+0xac # f0593b0
|
|
glabel var7f1a9d48
|
|
.word ai0120+0xb8 # f0593bc
|
|
glabel var7f1a9d4c
|
|
.word 0x455ac000
|
|
.text
|
|
/* f059304: 27bdffd0 */ addiu $sp,$sp,-48
|
|
/* f059308: afb30020 */ sw $s3,0x20($sp)
|
|
/* f05930c: 3c13800a */ lui $s3,%hi(g_Vars)
|
|
/* f059310: 26739fc0 */ addiu $s3,$s3,%lo(g_Vars)
|
|
/* f059314: 8e6e0434 */ lw $t6,0x434($s3)
|
|
/* f059318: 8e6f0438 */ lw $t7,0x438($s3)
|
|
/* f05931c: 8e790424 */ lw $t9,0x424($s3)
|
|
/* f059320: afbf0024 */ sw $ra,0x24($sp)
|
|
/* f059324: 01cfc021 */ addu $t8,$t6,$t7
|
|
/* f059328: afb2001c */ sw $s2,0x1c($sp)
|
|
/* f05932c: afb10018 */ sw $s1,0x18($sp)
|
|
/* f059330: afb00014 */ sw $s0,0x14($sp)
|
|
/* f059334: afb8002c */ sw $t8,0x2c($sp)
|
|
/* f059338: 0fc13380 */ jal teamGetChrIds
|
|
/* f05933c: 93240125 */ lbu $a0,0x125($t9)
|
|
/* f059340: 24080006 */ addiu $t0,$zero,0x6
|
|
/* f059344: 00408825 */ or $s1,$v0,$zero
|
|
/* f059348: a3a8002b */ sb $t0,0x2b($sp)
|
|
/* f05934c: 00009025 */ or $s2,$zero,$zero
|
|
/* f059350: 0fc12840 */ jal chrGetNumArghs
|
|
/* f059354: 8e640424 */ lw $a0,0x424($s3)
|
|
/* f059358: 18400002 */ blez $v0,.L0f059364
|
|
/* f05935c: 24090004 */ addiu $t1,$zero,0x4
|
|
/* f059360: a3a9002b */ sb $t1,0x2b($sp)
|
|
.L0f059364:
|
|
/* f059364: 0fc2866a */ jal bgunGetWeaponNum
|
|
/* f059368: 00002025 */ or $a0,$zero,$zero
|
|
/* f05936c: 244afffe */ addiu $t2,$v0,-2
|
|
/* f059370: 2d41001a */ sltiu $at,$t2,0x1a
|
|
/* f059374: 1020000e */ beqz $at,.L0f0593b0
|
|
/* f059378: 000a5080 */ sll $t2,$t2,0x2
|
|
/* f05937c: 3c017f1b */ lui $at,%hi(var7f1a9ce4)
|
|
/* f059380: 002a0821 */ addu $at,$at,$t2
|
|
/* f059384: 8c2a9ce4 */ lw $t2,%lo(var7f1a9ce4)($at)
|
|
/* f059388: 01400008 */ jr $t2
|
|
/* f05938c: 00000000 */ nop
|
|
/* f059390: 93ab002b */ lbu $t3,0x2b($sp)
|
|
/* f059394: 256cffff */ addiu $t4,$t3,-1
|
|
/* f059398: 10000008 */ b .L0f0593bc
|
|
/* f05939c: a3ac002b */ sb $t4,0x2b($sp)
|
|
/* f0593a0: 93ad002b */ lbu $t5,0x2b($sp)
|
|
/* f0593a4: 25aefffe */ addiu $t6,$t5,-2
|
|
/* f0593a8: 10000004 */ b .L0f0593bc
|
|
/* f0593ac: a3ae002b */ sb $t6,0x2b($sp)
|
|
.L0f0593b0:
|
|
/* f0593b0: 93af002b */ lbu $t7,0x2b($sp)
|
|
/* f0593b4: 25f80001 */ addiu $t8,$t7,0x1
|
|
/* f0593b8: a3b8002b */ sb $t8,0x2b($sp)
|
|
.L0f0593bc:
|
|
/* f0593bc: 86240000 */ lh $a0,0x0($s1)
|
|
/* f0593c0: 2401fffe */ addiu $at,$zero,-2
|
|
/* f0593c4: 1081002d */ beq $a0,$at,.L0f05947c
|
|
/* f0593c8: 00000000 */ nop
|
|
.L0f0593cc:
|
|
/* f0593cc: 0fc0a1dd */ jal chrFindByLiteralId
|
|
/* f0593d0: 00000000 */ nop
|
|
/* f0593d4: 10400024 */ beqz $v0,.L0f059468
|
|
/* f0593d8: 00408025 */ or $s0,$v0,$zero
|
|
/* f0593dc: 8c590020 */ lw $t9,0x20($v0)
|
|
/* f0593e0: 53200022 */ beqzl $t9,.L0f05946c
|
|
/* f0593e4: 86240002 */ lh $a0,0x2($s1)
|
|
/* f0593e8: 0fc0e6a5 */ jal chrIsDead
|
|
/* f0593ec: 00402025 */ or $a0,$v0,$zero
|
|
/* f0593f0: 5440001e */ bnezl $v0,.L0f05946c
|
|
/* f0593f4: 86240002 */ lh $a0,0x2($s1)
|
|
/* f0593f8: 82080007 */ lb $t0,0x7($s0)
|
|
/* f0593fc: 24010005 */ addiu $at,$zero,0x5
|
|
/* f059400: 5101001a */ beql $t0,$at,.L0f05946c
|
|
/* f059404: 86240002 */ lh $a0,0x2($s1)
|
|
/* f059408: 92090113 */ lbu $t1,0x113($s0)
|
|
/* f05940c: 29210065 */ slti $at,$t1,0x65
|
|
/* f059410: 54200016 */ bnezl $at,.L0f05946c
|
|
/* f059414: 86240002 */ lh $a0,0x2($s1)
|
|
/* f059418: 8e640424 */ lw $a0,0x424($s3)
|
|
/* f05941c: 920a02a2 */ lbu $t2,0x2a2($s0)
|
|
/* f059420: 908b02a2 */ lbu $t3,0x2a2($a0)
|
|
/* f059424: 554b0011 */ bnel $t2,$t3,.L0f05946c
|
|
/* f059428: 86240002 */ lh $a0,0x2($s1)
|
|
/* f05942c: 86050000 */ lh $a1,0x0($s0)
|
|
/* f059430: 848c0000 */ lh $t4,0x0($a0)
|
|
/* f059434: 50ac000d */ beql $a1,$t4,.L0f05946c
|
|
/* f059438: 86240002 */ lh $a0,0x2($s1)
|
|
/* f05943c: 0fc1272c */ jal chrGetDistanceToChr
|
|
/* f059440: 00000000 */ nop
|
|
/* f059444: 3c017f1b */ lui $at,%hi(var7f1a9d4c)
|
|
/* f059448: c4249d4c */ lwc1 $f4,%lo(var7f1a9d4c)($at)
|
|
/* f05944c: 4604003c */ c.lt.s $f0,$f4
|
|
/* f059450: 00000000 */ nop
|
|
/* f059454: 45020005 */ bc1fl .L0f05946c
|
|
/* f059458: 86240002 */ lh $a0,0x2($s1)
|
|
/* f05945c: 26520001 */ addiu $s2,$s2,0x1
|
|
/* f059460: 324d00ff */ andi $t5,$s2,0xff
|
|
/* f059464: 01a09025 */ or $s2,$t5,$zero
|
|
.L0f059468:
|
|
/* f059468: 86240002 */ lh $a0,0x2($s1)
|
|
.L0f05946c:
|
|
/* f05946c: 2401fffe */ addiu $at,$zero,-2
|
|
/* f059470: 26310002 */ addiu $s1,$s1,0x2
|
|
/* f059474: 1481ffd5 */ bne $a0,$at,.L0f0593cc
|
|
/* f059478: 00000000 */ nop
|
|
.L0f05947c:
|
|
/* f05947c: 16400005 */ bnez $s2,.L0f059494
|
|
/* f059480: 02401825 */ or $v1,$s2,$zero
|
|
/* f059484: 93ae002b */ lbu $t6,0x2b($sp)
|
|
/* f059488: 25cffffe */ addiu $t7,$t6,-2
|
|
/* f05948c: 10000006 */ b .L0f0594a8
|
|
/* f059490: a3af002b */ sb $t7,0x2b($sp)
|
|
.L0f059494:
|
|
/* f059494: 24010001 */ addiu $at,$zero,0x1
|
|
/* f059498: 14610003 */ bne $v1,$at,.L0f0594a8
|
|
/* f05949c: 93b8002b */ lbu $t8,0x2b($sp)
|
|
/* f0594a0: 2719ffff */ addiu $t9,$t8,-1
|
|
/* f0594a4: a3b9002b */ sb $t9,0x2b($sp)
|
|
.L0f0594a8:
|
|
/* f0594a8: 93a2002b */ lbu $v0,0x2b($sp)
|
|
/* f0594ac: 28410003 */ slti $at,$v0,0x3
|
|
/* f0594b0: 50200005 */ beqzl $at,.L0f0594c8
|
|
/* f0594b4: 8fa3002c */ lw $v1,0x2c($sp)
|
|
/* f0594b8: 50600003 */ beqzl $v1,.L0f0594c8
|
|
/* f0594bc: 8fa3002c */ lw $v1,0x2c($sp)
|
|
/* f0594c0: 24020003 */ addiu $v0,$zero,0x3
|
|
/* f0594c4: 8fa3002c */ lw $v1,0x2c($sp)
|
|
.L0f0594c8:
|
|
/* f0594c8: 90680002 */ lbu $t0,0x2($v1)
|
|
/* f0594cc: 0048082a */ slt $at,$v0,$t0
|
|
/* f0594d0: 50200008 */ beqzl $at,.L0f0594f4
|
|
/* f0594d4: 8e690438 */ lw $t1,0x438($s3)
|
|
/* f0594d8: 8e640434 */ lw $a0,0x434($s3)
|
|
/* f0594dc: 8e650438 */ lw $a1,0x438($s3)
|
|
/* f0594e0: 0fc13583 */ jal chraiGoToLabel
|
|
/* f0594e4: 90660003 */ lbu $a2,0x3($v1)
|
|
/* f0594e8: 10000004 */ b .L0f0594fc
|
|
/* f0594ec: ae620438 */ sw $v0,0x438($s3)
|
|
/* f0594f0: 8e690438 */ lw $t1,0x438($s3)
|
|
.L0f0594f4:
|
|
/* f0594f4: 252a0004 */ addiu $t2,$t1,0x4
|
|
/* f0594f8: ae6a0438 */ sw $t2,0x438($s3)
|
|
.L0f0594fc:
|
|
/* f0594fc: 8fbf0024 */ lw $ra,0x24($sp)
|
|
/* f059500: 8fb00014 */ lw $s0,0x14($sp)
|
|
/* f059504: 8fb10018 */ lw $s1,0x18($sp)
|
|
/* f059508: 8fb2001c */ lw $s2,0x1c($sp)
|
|
/* f05950c: 8fb30020 */ lw $s3,0x20($sp)
|
|
/* f059510: 27bd0030 */ addiu $sp,$sp,0x30
|
|
/* f059514: 03e00008 */ jr $ra
|
|
/* f059518: 00001025 */ or $v0,$zero,$zero
|
|
);
|
|
|
|
// Mismatch: The below has an extra store to score and it's due to the
|
|
// `if (score);` trick. But removing it creates vastly different codegen.
|
|
// Could be related to the switch statement because cmd 0129 is similar and
|
|
// matches but has no switch.
|
|
//bool ai0120(void)
|
|
//{
|
|
// u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
// u8 score;
|
|
// u8 numnearby;
|
|
// s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
|
|
//
|
|
// score = 6;
|
|
// numnearby = 0;
|
|
//
|
|
// // 350
|
|
// if (chrGetNumArghs(g_Vars.chrdata) > 0) {
|
|
// score -= 2;
|
|
// }
|
|
//
|
|
// switch (bgunGetWeaponNum(HAND_RIGHT)) {
|
|
// case WEAPON_CMP150:
|
|
// case WEAPON_CYCLONE:
|
|
// case WEAPON_CALLISTO:
|
|
// case WEAPON_RCP120:
|
|
// case WEAPON_LAPTOPGUN:
|
|
// case WEAPON_DRAGON:
|
|
// case WEAPON_K7AVENGER:
|
|
// case WEAPON_AR34:
|
|
// case WEAPON_SUPERDRAGON:
|
|
// case WEAPON_SHOTGUN:
|
|
// case WEAPON_SNIPERRIFLE:
|
|
// score--;
|
|
// break;
|
|
// case WEAPON_REAPER:
|
|
// case WEAPON_FARSIGHT:
|
|
// case WEAPON_DEVASTATOR:
|
|
// case WEAPON_ROCKETLAUNCHER:
|
|
// case WEAPON_SLAYER:
|
|
// score -= 2;
|
|
// break;
|
|
// default:
|
|
// score++;
|
|
// break;
|
|
// case WEAPON_FALCON2:
|
|
// case WEAPON_FALCON2_SILENCER:
|
|
// case WEAPON_FALCON2_SCOPE:
|
|
// case WEAPON_MAGSEC4:
|
|
// case WEAPON_MAULER:
|
|
// case WEAPON_PHOENIX:
|
|
// case WEAPON_DY357MAGNUM:
|
|
// case WEAPON_DY357LX:
|
|
// case WEAPON_CROSSBOW:
|
|
// break;
|
|
// }
|
|
//
|
|
// // 3bc
|
|
// while (*chrnums != -2) {
|
|
// struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
//
|
|
// if (chr && chr->model
|
|
// && !chrIsDead(chr)
|
|
// && chr->actiontype != ACT_DEAD
|
|
// && chr->alertness > 100 // @bug? I don't think this goes higher than 100
|
|
// && g_Vars.chrdata->squadron == chr->squadron
|
|
// && g_Vars.chrdata->chrnum != chr->chrnum
|
|
// && chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) {
|
|
// numnearby++;
|
|
// }
|
|
//
|
|
// chrnums++;
|
|
// }
|
|
//
|
|
// // 47c
|
|
// if (numnearby == 0) {
|
|
// score -= 2;
|
|
// } else if (numnearby == 1) {
|
|
// score--;
|
|
// }
|
|
//
|
|
// // 4a8
|
|
// if (score < 3 && numnearby != 0) {
|
|
// score = 3;
|
|
// }
|
|
//
|
|
// if (score);
|
|
//
|
|
// if (score < cmd[2]) {
|
|
// g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
// } else {
|
|
// g_Vars.aioffset += 4;
|
|
// }
|
|
//
|
|
// return false;
|
|
//}
|
|
|
|
/**
|
|
* @cmd 0121
|
|
*/
|
|
bool aiFindCover(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 criteria = cmd[3] | (cmd[2] << 8);
|
|
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, 0) != -1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0122
|
|
*/
|
|
bool aiFindCoverWithinDist(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 criteria = cmd[3] | (cmd[2] << 8);
|
|
u32 flags = (cmd[5] << 16) | (cmd[6] << 8) | cmd[7] | (cmd[4] << 24);
|
|
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, flags) != -1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
|
|
} else {
|
|
g_Vars.aioffset += 9;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0123
|
|
*/
|
|
bool aiFindCoverOutsideDist(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 criteria = cmd[3] | (cmd[2] << 8);
|
|
u32 flags = (cmd[5] << 16) | (cmd[6] << 8) | cmd[7] | (cmd[4] << 24);
|
|
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, -flags) != -1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
|
|
} else {
|
|
g_Vars.aioffset += 9;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0124
|
|
*/
|
|
bool aiGoToCover(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
chrGoToCover(g_Vars.chrdata, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0125
|
|
*/
|
|
bool aiCheckCoverOutOfSight(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrCheckCoverOutOfSight(g_Vars.chrdata, g_Vars.chrdata->cover, false)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0126
|
|
*/
|
|
bool aiIfPlayerUsingCmpOrAr34(void)
|
|
{
|
|
u32 hand = HAND_RIGHT;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
switch (bgunGetWeaponNum(hand)) {
|
|
case WEAPON_CMP150:
|
|
case WEAPON_AR34:
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
break;
|
|
default:
|
|
g_Vars.aioffset += 3;
|
|
break;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0127
|
|
*/
|
|
bool aiDetectEnemyOnSameFloor(void)
|
|
{ \
|
|
s32 team = 0;
|
|
f32 closestdist = 9999.9;
|
|
f32 distance;
|
|
u32 stack[2];
|
|
f32 y;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 scandist;
|
|
s16 *chrnums = teamGetChrIds(1);
|
|
struct chrdata *chr;
|
|
s16 newtarget = -1;
|
|
|
|
if (g_Vars.chrdata->teamscandist == 0) {
|
|
scandist = 1500;
|
|
} else if (g_Vars.chrdata->teamscandist == 255) {
|
|
scandist = 9999;
|
|
} else {
|
|
scandist = g_Vars.chrdata->teamscandist * 40.0f;
|
|
}
|
|
|
|
y = g_Vars.chrdata->prop->pos.y;
|
|
|
|
while (team < 8) {
|
|
chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (*chrnums != -2) {
|
|
if (chr && chr->prop
|
|
&& chr->team != TEAM_NONCOMBAT
|
|
&& !chrIsDead(chr)
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& chr->actiontype != ACT_DRUGGEDKO
|
|
&& chr->actiontype != ACT_DRUGGEDDROP
|
|
&& chr->actiontype != ACT_DRUGGEDCOMINGUP
|
|
&& chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES)
|
|
&& (chr->hidden & CHRHFLAG_CLOAKED) == 0
|
|
&& (chr->chrflags & CHRCFLAG_HIDDEN) == 0
|
|
&& (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0
|
|
&& y - chr->prop->pos.y > -200
|
|
&& y - chr->prop->pos.y < 200
|
|
&& ((g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0
|
|
|| (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0
|
|
|| (chr->hidden & CHRHFLAG_DONTSHOOTME))
|
|
&& g_Vars.chrdata->chrnum != chr->chrnum) {
|
|
distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum);
|
|
|
|
if (distance < closestdist) {
|
|
if (distance < scandist || stageGetIndex(g_Vars.stagenum) == STAGEINDEX_MAIANSOS) {
|
|
if (distance < closestdist) {
|
|
closestdist = distance;
|
|
newtarget = chr->chrnum;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
chrnums++;
|
|
} else {
|
|
chrnums++;
|
|
team++;
|
|
}
|
|
}
|
|
|
|
if (newtarget != -1) {
|
|
g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, newtarget);
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0128
|
|
*/
|
|
bool aiDetectEnemy(void)
|
|
{
|
|
s16 *chrnums;
|
|
s32 team = 0;
|
|
u32 stack[4];
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 closestdist = 10000000;
|
|
f32 maxdist = (s32)cmd[2] * 10.0f;
|
|
s16 closesttarg = -1;
|
|
|
|
chrnums = teamGetChrIds(1);
|
|
|
|
if (!g_Vars.chrdata) {
|
|
g_Vars.aioffset = g_Vars.aioffset + 4;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Iterate all the chrs in team order. Generally the outer loop iterates the
|
|
* teams and the inner loop iterates the chrs within that team, but for the
|
|
* chr's current team the inner loop won't iterate so the outer loop handles
|
|
* it.
|
|
*
|
|
* The chrnums list returned by teamGetChrIds is an array of chrnums in
|
|
* team 1 terminated by a -2, then an array of chrnums in team 2 terminated
|
|
* by -2, and so on.
|
|
*/
|
|
do {
|
|
u8 teamvalue = (1 << team);
|
|
|
|
while (*chrnums != -2 && g_Vars.chrdata->team != teamvalue) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->prop
|
|
&& !chrIsDead(chr)
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& chr->actiontype != ACT_DIE
|
|
&& chr->actiontype != ACT_DRUGGEDKO
|
|
&& chr->actiontype != ACT_DRUGGEDDROP
|
|
&& chr->actiontype != ACT_DRUGGEDCOMINGUP
|
|
&& chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES)
|
|
&& chr != g_Vars.chrdata
|
|
&& (chr->hidden & CHRHFLAG_CLOAKED) == 0
|
|
&& (chr->chrflags & CHRCFLAG_HIDDEN) == 0
|
|
&& (chr->hidden & CHRHFLAG_DISGUISED) == 0
|
|
&& chr->team != TEAM_NONCOMBAT
|
|
&& (
|
|
(g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0
|
|
|| (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0
|
|
|| (chr->hidden & CHRHFLAG_DONTSHOOTME))) {
|
|
f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum);
|
|
|
|
if (distance < maxdist && distance != 0 && distance < closestdist
|
|
&& chrCanSeeProp(g_Vars.chrdata, chr->prop)
|
|
&& (chr->chrflags & CHRCFLAG_HIDDEN) == 0) {
|
|
if (g_Vars.chrdata->yvisang == 0) {
|
|
closestdist = distance;
|
|
closesttarg = chr->chrnum;
|
|
} else {
|
|
s16 prevtarget = g_Vars.chrdata->target;
|
|
g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum);
|
|
|
|
if (chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang)) {
|
|
closestdist = distance;
|
|
closesttarg = chr->chrnum;
|
|
}
|
|
|
|
g_Vars.chrdata->target = prevtarget;
|
|
}
|
|
}
|
|
}
|
|
|
|
chrnums++;
|
|
}
|
|
|
|
// If the inner loop was at the end of the current team,
|
|
// move to the next team
|
|
if (*chrnums == -2) {
|
|
team++;
|
|
}
|
|
|
|
// And progress chrnums past the -2 terminator
|
|
chrnums++;
|
|
} while (team < 8);
|
|
|
|
if (closesttarg != -1) {
|
|
g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, closesttarg);
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0129
|
|
*/
|
|
bool aiIfSafetyLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
|
|
u8 safety = 6;
|
|
u8 numnearby = 0;
|
|
|
|
if (chrGetNumArghs(g_Vars.chrdata) > 0) {
|
|
safety--;
|
|
}
|
|
|
|
while (*chrnums != -2) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->model
|
|
&& !chrIsDead(chr)
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& g_Vars.chrdata->chrnum != chr->chrnum
|
|
&& chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) {
|
|
numnearby++;
|
|
}
|
|
|
|
chrnums++;
|
|
}
|
|
|
|
if (numnearby == 0) {
|
|
safety -= 2;
|
|
} else if (numnearby < 3) {
|
|
safety--;
|
|
}
|
|
|
|
if (safety < cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 012a
|
|
*/
|
|
bool aiIfTargetMovingSlowly(void)
|
|
{
|
|
s32 delta;
|
|
s32 absdelta;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[2] == 0) {
|
|
delta = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata);
|
|
} else {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
delta = chrGetDistanceLostToTargetInLastSecond(chr);
|
|
}
|
|
|
|
absdelta = delta > 0 ? delta : -delta;
|
|
|
|
if (absdelta < 50) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 012b
|
|
*/
|
|
bool aiIfTargetMovingCloser(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) < -50) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 012c
|
|
*/
|
|
bool aiIfTargetMovingAway(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) > 50) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 012f
|
|
*/
|
|
bool ai012f(void)
|
|
{
|
|
if (g_Vars.chrdata->cover >= 0) {
|
|
coverSetInUse(g_Vars.chrdata->cover, 0);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
s16 g_GuardQuipBank[][4] = {
|
|
// Voicebox 0
|
|
{ QUIP_ATTACK1, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_SHES_MINE },
|
|
{ QUIP_ATTACK2, SFX_M0_OPEN_FIRE, SFX_M0_WIPE_HER_OUT, SFX_M0_WASTE_HER },
|
|
{ QUIP_GOTOCOVER1, SFX_M0_COVER_ME, SFX_M0_WATCH_MY_BACK, SFX_M0_TAKE_COVER },
|
|
{ QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA },
|
|
{ QUIP_RETREAT1, SFX_M0_GO_TO_PLAN_B, SFX_M0_GET_THE_HELL_OUT_OF_HERE, SFX_M0_RETREAT },
|
|
{ QUIP_GRENADE2, SFX_M0_CATCH, SFX_M0_EVERYBODY_DOWN, SFX_M0_GRENADE },
|
|
{ QUIP_RETREAT2, SFX_M0_FALL_BACK, SFX_M0_EVERYONE_BACK_OFF, SFX_M0_WITHDRAW },
|
|
{ QUIP_FLANK, SFX_M0_FLANK_THE_TARGET, SFX_M0_LETS_SPLIT_UP, SFX_M0_SURROUND_HER },
|
|
{ QUIP_SURRENDER, SFX_M0_DONT_SHOOT_ME, SFX_M0_I_GIVE_UP, SFX_M0_YOU_WIN_I_SURRENDER },
|
|
{ QUIP_HEARNOISE, SFX_M0_HEAR_THAT, SFX_M0_WHATS_THAT_NOISE, SFX_M0_HEARD_A_NOISE },
|
|
{ QUIP_10, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SEEPLAYER, SFX_M0_HEY_YOU, SFX_M0_INTRUDER_ALERT, SFX_M0_GOT_A_CONTACT },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ QUIP_SHOTUNALERT, SFX_M0_HOLY_SHH, SFX_M0_HOLY_SHH, SFX_M0_WHAT_THE_HELL },
|
|
#else
|
|
{ QUIP_SHOTUNALERT, SFX_80F6, SFX_80F6, SFX_M0_WHAT_THE_HELL },
|
|
#endif
|
|
{ QUIP_INJURED1, SFX_M0_MEDIC, SFX_M0_OW, SFX_M0_YOU_SHOT_ME },
|
|
{ QUIP_INJURED2, SFX_M0_IM_HIT, SFX_M0_IM_TAKING_FIRE, SFX_M0_TAKING_DAMAGE },
|
|
{ QUIP_KILLEDPLAYER1, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE },
|
|
{ QUIP_WARNFRIENDS, SFX_M0_INTRUDER_ALERT2, SFX_M0_WEVE_GOT_TROUBLE, SFX_M0_WEVE_GOT_PROBLEMS },
|
|
{ QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SURPRISED, SFX_M0_WHAT_THE, SFX_M0_WHO_THE, SFX_M0_WHO_THE },
|
|
{ QUIP_INSPECTBODY, SFX_M0_ARE_YOU_OKAY, SFX_M0_GOT_A_MAN_DOWN, SFX_M0_HES_BOUGHT_IT },
|
|
{ QUIP_20, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_HITPLAYER, SFX_M0_GIVE_IT_UP, SFX_M0_SURRENDER_NOW, SFX_M0_TAKE_THAT },
|
|
{ QUIP_MISSEDPLAYER1, SFX_M0_DAMN_IT_MISSED, SFX_M0_DAMN_IT_MISSED, SFX_M0_HOW_DID_I_MISS },
|
|
{ QUIP_MISSEDPLAYER2, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_SHES_A_TRICKY_ONE },
|
|
{ QUIP_GOTOCOVER2, SFX_M0_TAKE_COVER_028D, SFX_M0_ILL_COVER_YOU, SFX_M0_GET_DOWN },
|
|
{ QUIP_DIE, SFX_M0_YOU_BITCH, SFX_M0_OH_MY_GOD, SFX_M0_SHE_GOT_ME },
|
|
{ QUIP_26, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SEARCHSUCCESS, SFX_M0_I_SEE_HER, SFX_M0_THERE_SHE_IS, SFX_M0_THERE_MOVEMENT },
|
|
{ QUIP_SEEEYESPY, SFX_M0_WHAT_THE_HELL_8167, SFX_M0_HELLO_THERE, SFX_M0_WHATS_THIS },
|
|
{ QUIP_GREETING, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU },
|
|
{ QUIP_ASKWEAPON1, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING },
|
|
{ QUIP_ASKWEAPON2, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING },
|
|
{ QUIP_UNCOVERDISGUISE1, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY },
|
|
{ QUIP_LOSTGUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN },
|
|
{ QUIP_GOFORALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM },
|
|
{ QUIP_SEARCHFAIL, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_HEARING_THINGS },
|
|
{ QUIP_ATTACK3, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE },
|
|
{ QUIP_ATTACK4, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE, SFX_M0_OPEN_FIRE },
|
|
{ QUIP_KILLEDPLAYER2, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE },
|
|
{ QUIP_GUNJAMMED, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN },
|
|
{ QUIP_UNCOVEREDDISGUISE2, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY },
|
|
// Voicebox 1
|
|
{ QUIP_ATTACK1, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON },
|
|
{ QUIP_ATTACK2, SFX_M1_TAKE_HER_DOWN, SFX_M1_EVERYBODY_GET_HER, SFX_M1_ATTACK },
|
|
{ QUIP_GOTOCOVER1, SFX_M1_COVER_MY_ASS, SFX_M1_COVER_ME_NOW, SFX_M1_IM_GOING_FOR_COVER },
|
|
{ QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA },
|
|
{ QUIP_RETREAT1, SFX_M1_SHES_TOO_GOOD_RUN, SFX_M1_GET_SOME_BACKUP, SFX_M1_EVACUATE_THE_AREA },
|
|
{ QUIP_GRENADE2, SFX_M1_CATCH_THIS, SFX_M1_HERE_KEEP_IT, SFX_M1_GRENADE },
|
|
{ QUIP_RETREAT2, SFX_M1_WITHDRAW, SFX_M1_FALL_BACK, SFX_M1_EVERYONE_GET_BACK },
|
|
{ QUIP_FLANK, SFX_M1_SURROUND_HER, SFX_M1_SPREAD_OUT, SFX_M1_SPLIT_UP },
|
|
{ QUIP_SURRENDER, SFX_M1_PLEASE_DONT, SFX_M1_DONT_SHOOT, SFX_M1_IM_ONLY_DOING_MY_JOB },
|
|
{ QUIP_HEARNOISE, SFX_M1_THAT_SOUNDED_LIKE, SFX_M1_GUNFIRE, SFX_M1_SOMEONES_SHOOTING },
|
|
{ QUIP_10, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SEEPLAYER, SFX_M1_COME_HERE, SFX_M1_THERES_SOMEONE_HERE, SFX_M1_GET_HER },
|
|
{ QUIP_SHOTUNALERT, SFX_M1_WHOA, SFX_M1_MY_GOD, SFX_M1_IS_THAT_A_BULLET },
|
|
{ QUIP_INJURED1, SFX_M1_OH_MY_GOD, SFX_M1_IM_HIT_IM_HIT, SFX_M1_IM_BLEEDING },
|
|
{ QUIP_INJURED2, SFX_M1_OH_GOD_IM_HIT, SFX_M1_HELP_ME_OUT, SFX_M1_IM_IN_TROUBLE },
|
|
{ QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_WARNFRIENDS, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT },
|
|
{ QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SURPRISED, SFX_M1_HOLY, SFX_M1_WHAT_THE_HELL, SFX_M1_WHA },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ QUIP_INSPECTBODY, SFX_M1_NOOO, SFX_M1_OH_GOD_HES_DEAD, SFX_M1_HES_GONE },
|
|
#else
|
|
{ QUIP_INSPECTBODY, SFX_0313, SFX_M1_NOOO, SFX_M1_HES_GONE },
|
|
#endif
|
|
{ QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT },
|
|
{ QUIP_HITPLAYER, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEAH_BABY, SFX_M1_YEAH_BABY },
|
|
{ QUIP_MISSEDPLAYER1, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT },
|
|
{ QUIP_MISSEDPLAYER2, SFX_M1_STOP_DODGING, SFX_M1_SOMEONE_HIT_HER, SFX_M1_DAMN_SHES_GOOD },
|
|
{ QUIP_GOTOCOVER2, SFX_M1_GO_FOR_IT, SFX_M1_GO_GO_GO, SFX_M1_RUN },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ QUIP_DIE, SFX_M1_SCREAM, SFX_M1_WHY_ME, SFX_M1_CHOKING },
|
|
#else
|
|
{ QUIP_DIE, SFX_034C, SFX_M1_WHY_ME, SFX_M1_CHOKING },
|
|
#endif
|
|
{ QUIP_26, SFX_M1_OUTSTANDING, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE },
|
|
{ QUIP_SEARCHSUCCESS, SFX_M1_OVER_THERE, SFX_M1_HALT, SFX_M1_FREEZE },
|
|
{ QUIP_SEEEYESPY, SFX_M1_WHAT_IS_IT, SFX_M1_HOW_DID_THAT_GET_HERE, SFX_M1_DONT_TOUCH_IT },
|
|
{ QUIP_GREETING, SFX_M1_HI_THERE, SFX_M1_HI_THERE, SFX_M1_HOWS_THINGS },
|
|
{ QUIP_ASKWEAPON1, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_GET_THAT_FIREARM_APPROVED },
|
|
{ QUIP_ASKWEAPON2, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_BE_CAREFUL },
|
|
{ QUIP_UNCOVERDISGUISE1, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_DROP_THE_GUN },
|
|
{ QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ },
|
|
{ QUIP_GOFORALARM, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS },
|
|
{ QUIP_SEARCHFAIL, SFX_M1_I_CANT_SEE_ANYBODY, SFX_M1_THERES_NO_ONE_HERE, SFX_M1_THERES_NO_ONE_HERE },
|
|
{ QUIP_ATTACK3, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON },
|
|
{ QUIP_ATTACK4, SFX_M1_BRING_IT_ON, SFX_M1_ATTACK, SFX_M1_ATTACK },
|
|
{ QUIP_KILLEDPLAYER2, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE, SFX_M1_ANOTHER_ONE_BITES_THE_DUST },
|
|
{ QUIP_GUNJAMMED, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT },
|
|
{ QUIP_UNCOVEREDDISGUISE2, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE },
|
|
// Voicebox 2
|
|
{ QUIP_ATTACK1, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS },
|
|
{ QUIP_ATTACK2, SFX_M2_MOVE_IN, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_LET_HER_HAVE_IT },
|
|
{ QUIP_GOTOCOVER1, SFX_M2_HELP_ME_OUT_HERE, SFX_M2_HEY_DISTRACT_HER, SFX_M2_KEEP_HER_OCCUPIED },
|
|
{ QUIP_GRENADE1, SFX_M2_GET_BACK_QUICK, SFX_M2_WERE_GONNA_DIE, SFX_M2_GOD_RUN },
|
|
{ QUIP_RETREAT1, SFX_M2_RETREAT, SFX_M2_LETS_GET_THE_HELL_OUT_OF_HERE, SFX_M2_GET_BACK_GET_BACK },
|
|
{ QUIP_GRENADE2, SFX_M2_FIRE_IN_THE_HOLE, SFX_M2_HERES_A_LITTLE_PRESENT_FOR_YA, SFX_M2_TRY_THIS_FOR_SIZE },
|
|
{ QUIP_RETREAT2, SFX_M2_GET_OUT_OF_THE_WAY, SFX_M2_FALL_BACK, SFX_M2_MOVE_OUT },
|
|
{ QUIP_FLANK, SFX_M2_TEAM_UP_GUYS, SFX_M2_COME_ON_AROUND_THE_SIDE, SFX_M2_SCATTER },
|
|
{ QUIP_SURRENDER, SFX_M2_I_DONT_LIKE_THIS_ANY_MORE, SFX_M2_DONT_HURT_ME, SFX_M2_YOU_WIN_I_GIVE_UP },
|
|
{ QUIP_HEARNOISE, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_SOMEONES_NEARBY },
|
|
{ QUIP_10, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SEEPLAYER, SFX_M2_TARGET_SIGHTED, SFX_M2_COME_ON_MAN, SFX_M2_GOD_DAMN_IT },
|
|
{ QUIP_SHOTUNALERT, SFX_M2_THAT_WAS_CLOSE, SFX_M2_HOLY_MOLY, SFX_M2_AY_CARAMBA },
|
|
{ QUIP_INJURED1, SFX_M2_GEEZ_THAT_HURT, SFX_M2_WHY_YOU, SFX_M2_WHY_YOU },
|
|
{ QUIP_INJURED2, SFX_M2_IM_INJURED, SFX_M2_IM_HIT_IM_HIT, SFX_M2_DAMN_IT_IM_TAKING_FIRE },
|
|
{ QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_WARNFRIENDS, SFX_M2_WATCH_OUT, SFX_M2_HELP_ME_OUT, SFX_M2_WEVE_GOT_AN_INTRUDER },
|
|
{ QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 },
|
|
{ QUIP_SURPRISED, SFX_M2_HOW_THE, SFX_M2_HEY, SFX_M2_STOP },
|
|
{ QUIP_INSPECTBODY, SFX_M2_BODY_COUNTS_TOO_HIGH, SFX_M2_I_NEVER_LIKED_HIM_ANYWAY, SFX_M2_THAT_WAS_MY_BEST_FRIEND },
|
|
{ QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT },
|
|
{ QUIP_HITPLAYER, SFX_M2_SURRENDER_OR_DIE, SFX_M2_I_HAVE_YOU_NOW, SFX_M2_YOU_WANT_BEAT_ME },
|
|
{ QUIP_MISSEDPLAYER1, SFX_M2_DAMN_MISSED_AGAIN, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_DAMN_YOU },
|
|
{ QUIP_MISSEDPLAYER2, SFX_M2_HELL_SHES_GOOD, SFX_M2_STOP_MOVING, SFX_M2_NO_ESCAPE_FOR_YOU },
|
|
{ QUIP_GOTOCOVER2, SFX_M2_MOVE_IT_MOVE_IT, SFX_M2_GET_TO_COVER_NOW, SFX_M2_RUN_FOR_IT },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ QUIP_DIE, SFX_M2_NOOO, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE },
|
|
#else
|
|
{ QUIP_DIE, SFX_0411, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE },
|
|
#endif
|
|
{ QUIP_26, SFX_M2_IM_THE_MAN, SFX_M2_BOY_THAT_WAS_CLOSE, SFX_M2_DID_YOU_SEE_THAT },
|
|
{ QUIP_SEARCHSUCCESS, SFX_M2_GET_HER, SFX_M2_THERE_ATTACK, SFX_M2_HEY_YOU_STOP },
|
|
{ QUIP_SEEEYESPY, SFX_M2_IS_IT_DANGEROUS, SFX_M2_DONT_MOVE, SFX_M2_STAY_BACK },
|
|
{ QUIP_GREETING, SFX_M2_HELLO, SFX_M2_HELLO, SFX_M2_HEY_WHATS_UP },
|
|
{ QUIP_ASKWEAPON1, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_WHAT_ARE_YOU_DOING },
|
|
{ QUIP_ASKWEAPON2, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_WATCH_IT_THAT_THING_COULD_GO_OFF },
|
|
{ QUIP_UNCOVERDISGUISE1, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_ITS_A_TERRORIST },
|
|
{ QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ },
|
|
{ QUIP_GOFORALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM },
|
|
{ QUIP_SEARCHFAIL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_ANOTHER_FALSE_ALARM },
|
|
{ QUIP_ATTACK3, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS },
|
|
{ QUIP_ATTACK4, SFX_M2_DIE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE },
|
|
{ QUIP_KILLEDPLAYER2, SFX_M2_IM_THE_MAN, SFX_M2_ITS_ALL_OVER_FOR_THIS_ONE, SFX_M2_DID_YOU_SEE_THAT },
|
|
{ QUIP_GUNJAMMED, SFX_M2_GOD_DAMN_IT, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_GOD_DAMN_IT },
|
|
{ QUIP_UNCOVEREDDISGUISE2, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST },
|
|
// Voicebox 3 (female)
|
|
{ QUIP_ATTACK1, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_COME_ON },
|
|
{ QUIP_ATTACK2, SFX_0037, SFX_F_EVERYONE_GET_HER, SFX_F_ATTACK },
|
|
{ QUIP_GOTOCOVER1, SFX_F_COVER_ME, SFX_0037, SFX_F_TAKE_COVER },
|
|
{ QUIP_GRENADE1, SFX_F_LOOK_OUT, SFX_F_ITS_A_GRENADE, SFX_F_ITS_A_GRENADE },
|
|
{ QUIP_RETREAT1, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT },
|
|
{ QUIP_GRENADE2, SFX_F_CATCH_THIS, SFX_F_TIME_TO_DIE, SFX_0037 },
|
|
{ QUIP_RETREAT2, SFX_F_WITHDRAW, SFX_F_WITHDRAW, SFX_F_FALL_BACK },
|
|
{ QUIP_FLANK, SFX_0037, SFX_F_SPREAD_OUT, SFX_F_SPLIT_UP },
|
|
{ QUIP_SURRENDER, SFX_F_PLEASE_DONT, SFX_F_PLEASE_DONT, SFX_F_DONT_SHOOT },
|
|
{ QUIP_HEARNOISE, SFX_0037, SFX_F_0389, SFX_F_SOMEONES_SHOOTING },
|
|
{ QUIP_10, 0, 0, 0 },
|
|
{ QUIP_SEEPLAYER, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 },
|
|
{ QUIP_SHOTUNALERT, SFX_F_UNDER_FIRE, SFX_0037, SFX_F_WERE_UNDER_FIRE },
|
|
{ QUIP_INJURED1, SFX_0037, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT },
|
|
{ QUIP_INJURED2, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT, SFX_F_IM_IN_TROUBLE },
|
|
{ QUIP_KILLEDPLAYER1, 0, 0, 0 },
|
|
{ QUIP_WARNFRIENDS, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_0037 },
|
|
{ QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT },
|
|
{ QUIP_SURPRISED, SFX_0037, SFX_F_HEY, SFX_F_HUH },
|
|
{ QUIP_INSPECTBODY, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN },
|
|
{ QUIP_20, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_F_WERE_UNDER_FIRE },
|
|
{ QUIP_HITPLAYER, SFX_F_DID_THAT_HURT, SFX_F_YOU_WANT_SOME_MORE, SFX_0037 },
|
|
{ QUIP_MISSEDPLAYER1, SFX_F_THIS_GUNS_USELESS, SFX_0037, SFX_F_STAND_STILL },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_F_DAMN_SHES_GOOD },
|
|
#else
|
|
{ QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_M1_SCREAM },
|
|
#endif
|
|
{ QUIP_GOTOCOVER2, SFX_F_GO_FOR_IT, SFX_0037, SFX_F_RUN },
|
|
{ QUIP_DIE, SFX_F_WHY_ME, SFX_F_NOO, SFX_F_MY_GOD },
|
|
{ QUIP_26, SFX_F_IM_JUST_TOO_GOOD, SFX_0037, SFX_F_SUCH_A_WASTE },
|
|
{ QUIP_SEARCHSUCCESS, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 },
|
|
{ QUIP_SEEEYESPY, 0, 0, 0 },
|
|
{ QUIP_GREETING, SFX_0037, SFX_F_COME_ON, SFX_0037 },
|
|
{ QUIP_ASKWEAPON1, SFX_0037, SFX_F_COME_ON, SFX_0037 },
|
|
{ QUIP_ASKWEAPON2, SFX_0037, SFX_F_COME_ON, SFX_0037 },
|
|
{ QUIP_UNCOVERDISGUISE1, SFX_0037, SFX_F_COME_ON, SFX_0037 },
|
|
{ QUIP_LOSTGUN, SFX_F_HEY, SFX_F_HUH, SFX_F_HEY },
|
|
{ QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_FALL_BACK, SFX_F_EVACUATE_THE_AREA },
|
|
{ QUIP_SEARCHFAIL, 0, 0, 0 },
|
|
{ QUIP_ATTACK3, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_ATTACK },
|
|
{ QUIP_ATTACK4, SFX_F_ATTACK, SFX_F_ATTACK, SFX_F_COME_ON },
|
|
{ QUIP_KILLEDPLAYER2, SFX_F_GET_A_CLEANER, SFX_F_IM_JUST_TOO_GOOD, SFX_F_SUCH_A_WASTE },
|
|
{ QUIP_GUNJAMMED, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS },
|
|
{ QUIP_UNCOVEREDDISGUISE2, 0, 0, 0 },
|
|
};
|
|
|
|
s16 g_SpecialQuipBank[][4] = {
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ 0, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_YOU_WILL_REGRET, MP3_CASS_LEAVE_NOW },
|
|
#else
|
|
{ 0, 0x12f2, 0x12f3, 0x12f8 },
|
|
#endif
|
|
{ 1, MP3_SEC_PLEASE_DONT_KILL_ME, MP3_SEC_DONT_SHOOT, MP3_SEC_PLEASE_DONT_KILL_ME },
|
|
{ 2, SFX_DRCAROLL_COME_ON, SFX_DRCAROLL_TAKING_YOUR_TIME, SFX_DRCAROLL_GET_OUT_OF_HERE },
|
|
{ 3, SFX_DRCAROLL_KNOW_WHAT_YOURE_DOING, SFX_DRCAROLL_0249, SFX_DRCAROLL_GOING_TO_THE_HELIPAD },
|
|
{ 4, SFX_DRCAROLL_STOP_THAT, SFX_DRCAROLL_WHAT, SFX_ARGH_DRCAROLL_0240 },
|
|
{ 5, SFX_ARGH_DRCAROLL_024C, SFX_DRCAROLL_QUITE_ENOUGH, SFX_ARGH_DRCAROLL_0251 },
|
|
{ 6, SFX_DRCAROLL_I_CANT_MAKE_IT, SFX_DRCAROLL_YOU_WERE_SUPPOSED, SFX_DRCAROLL_SYSTEMS_FAILURE },
|
|
{ 7, SFX_DRCAROLL_OH_CRIKEY, SFX_DRCAROLL_GOODNESS_GRACIOUS, SFX_DRCAROLL_DONT_THEY_KNOW },
|
|
{ 8, MP3_K7_IM_NOT_SURE, MP3_K7_ONE_MORE_TIME, MP3_K7_I_DUNNO },
|
|
{ 9, MP3_SCI_AND_AGAIN, MP3_SCI_TRY_IT_NOW, MP3_SCI_AND_AGAIN },
|
|
{ 10, MP3_SCI_WHAT_ARE_YOU_DOING, MP3_SCI_HAVENT_SEEN_YOU, SFX_SCI_WHO_THE_HELL_ARE_YOU },
|
|
{ 11, MP3_JO_SHUT_DOWN_EXPERIMENTS, MP3_JO_PULL_THE_PLUG, MP3_JO_SWITCH_THIS_THING_OFF },
|
|
{ 12, MP3_SCI_ILL_SHUT_IT_DOWN, MP3_SCI_PLEASE_DONT_HURT_ME, MP3_SCI_ALLOW_ME_TO_ASSIST_YOU },
|
|
{ 13, MP3_SCI_MY_EXPERIMENTS, MP3_SCI_EXPERIMENT_IS_DOWN, MP3_SCI_LEAVE_THIS_AREA },
|
|
{ 14, MP3_SCI_SECURITY, MP3_SCI_IM_CALLING_SECURITY, MP3_SCI_ACCIDENTS_WILL_HAPPEN },
|
|
{ 15, MP3_SCI_HOW_DID_THAT_HAPPEN, MP3_SCI_OFF_ALREADY, MP3_SCI_HAVE_YOU_BEEN_TAMPERING },
|
|
{ 16, MP3_SCI_SOMEONES_BROKEN_MY_EQUIPMENT, MP3_SCI_WHATS_HAPPENED_TO_THE_TERMINAL, MP3_SCI_YOU_VANDAL },
|
|
{ 17, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D },
|
|
{ 18, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU },
|
|
{ 19, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING },
|
|
{ 20, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING },
|
|
{ 21, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY },
|
|
{ 22, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, SFX_CIV_HEY_BABY },
|
|
{ 23, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, SFX_CIV_WHISTLE },
|
|
{ 24, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, SFX_CIV_TAKE_THE_WALLET },
|
|
{ 25, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, SFX_CIV_GET_ME_OUT_OF_HERE },
|
|
{ 26, SFX_CIV_GUNS_DONT_SCARE_ME, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR },
|
|
{ 27, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY },
|
|
{ 28, SFX_SHOULD_HAVE_COME_HERE_GIRL, SFX_SECURE_THE_PERIMETER, SFX_WERE_TAKING_OVER },
|
|
{ 29, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY },
|
|
{ 30, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY },
|
|
{ 31, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE },
|
|
{ 32, MP3_COME_BACK_LATER_IM_BUSY, MP3_GO_AWAY, MP3_LOOK_I_CANT_HELP_YOU },
|
|
{ 33, MP3_PRES_STOP_SHOOTING, MP3_PRES_YOU_SURE_THIS_IS_THE_WAY, MP3_PRES_WHY_ARE_THEY_SHOOTING },
|
|
{ 34, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, 0 },
|
|
{ 35, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, 0 },
|
|
{ 36, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, MP3_SEC_PLEASE_DONT_KILL_ME },
|
|
{ 37, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, 0 },
|
|
{ 38, SFX_ELVIS_INTERGALACTIC_PEACE, SFX_ELVIS_EAT_HOT_LEAD_WEIRDOS, SFX_ELVIS_KISS_MY_ALIEN_BUTT },
|
|
{ 39, SFX_ELVIS_ILL_KICK_YOUR_ASS, SFX_ELVIS_FOR_YOUR_OWN_GOOD, SFX_ELVIS_YOU_DARE_SHOOT_AT_ME },
|
|
{ 40, SFX_ELVIS_DONT_MESS_WITH_THE_MAIAN, SFX_ELVIS_IM_BAD, SFX_ELVIS_HEHE },
|
|
{ 41, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_WATCH_THE_SUIT },
|
|
{ 42, MP3_M2_ITS_A_TERRORIST, MP3_M0_ITS_A_SPY, MP3_M1_STOP_RIGHT_THERE },
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
{ 43, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_LEAVE_NOW, MP3_CASS_LEAVE_NOW },
|
|
#else
|
|
{ 43, 0x12f2, 0x12f8, 0x12f8, },
|
|
#endif
|
|
{ 44, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE },
|
|
{ 45, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK },
|
|
};
|
|
|
|
s16 g_QuipTexts[][4] = {
|
|
{ 1, L_AME_083, L_AME_084, L_AME_085 }, // "How dare you disturb me!", "You will regret this intrusion, girl!", "If I were you, I'd leave...NOW!"
|
|
{ 2, L_AME_086, L_AME_087, L_AME_086 }, // "Please don't kill me!", "Don't shoot!"
|
|
{ 3, L_EAR_064, L_EAR_065, L_EAR_066 }, // "What are you doing in my lab?", "I haven't seen you before...", "Who the hell are you?"
|
|
{ 4, L_EAR_067, L_EAR_068, L_EAR_069 }, // "Shut down the experiment.", "Pull the plug on that, NOW.", "Switch this thing off."
|
|
{ 5, L_EAR_070, L_EAR_071, L_EAR_072 }, // "I'll shut it down.", "Please don't hurt me.", "Allow me to assist you."
|
|
{ 6, L_EAR_073, L_EAR_074, L_EAR_075 }, // "My experiments!", "There the experiment is down.", "Leave this area NOW!"
|
|
{ 7, L_EAR_076, L_EAR_077, L_EAR_078 }, // "Security!", "I'm calling security.", "Accidents will happen."
|
|
{ 8, L_EAR_079, L_EAR_080, L_EAR_081 }, // "How did that happen?", "Looks like it's off already.", "Have you been tampering with this?"
|
|
{ 9, L_EAR_082, L_EAR_083, L_EAR_084 }, // "Someone's broken my equipment.", "What's happened to the terminal?", "You vandal - you've broken it."
|
|
{ 10, L_WAX_010, L_WAX_012, L_WAX_012 }, // "How dare you disturb me!", "If I were you, I'd leave... NOW!"
|
|
};
|
|
|
|
s16 g_SkedarQuipBank[][4] = {
|
|
{ 1, SFX_SKEDAR_ROAR_0529, SFX_SKEDAR_ROAR_052A, SFX_SKEDAR_ROAR_052B },
|
|
{ 2, SFX_SKEDAR_ROAR_052D, SFX_SKEDAR_ROAR_052E, SFX_SKEDAR_ROAR_052F },
|
|
{ 3, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0531 },
|
|
{ 1, SFX_SKEDAR_ROAR_0532, SFX_SKEDAR_ROAR_0533, SFX_SKEDAR_ROAR_0534 },
|
|
{ 2, SFX_SKEDAR_ROAR_0536, SFX_SKEDAR_ROAR_0537, SFX_SKEDAR_ROAR_0538 },
|
|
{ 3, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_053A },
|
|
{ 0 },
|
|
};
|
|
|
|
s16 g_MaianQuipBank[][4] = {
|
|
{ 1, SFX_MAIAN_05E2, SFX_MAIAN_05E3, SFX_MAIAN_05E4 },
|
|
{ 2, SFX_MAIAN_05E5, SFX_MAIAN_05E6, SFX_MAIAN_05E7 },
|
|
{ 3, SFX_ARGH_MAIAN_05DF, SFX_ARGH_MAIAN_05E0, SFX_ARGH_MAIAN_05E1 },
|
|
{ 0 },
|
|
};
|
|
|
|
/**
|
|
* @cmd 0130
|
|
*/
|
|
#if VERSION >= VERSION_PAL_FINAL
|
|
GLOBAL_ASM(
|
|
glabel aiSayQuip
|
|
.late_rodata
|
|
glabel var7f1a9d64
|
|
.word 0x45dac000
|
|
.text
|
|
/* f05a454: 27bdff58 */ addiu $sp,$sp,-168
|
|
/* f05a458: afb00048 */ sw $s0,0x48($sp)
|
|
/* f05a45c: 3c10800a */ lui $s0,0x800a
|
|
/* f05a460: 2610a510 */ addiu $s0,$s0,-23280
|
|
/* f05a464: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f05a468: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f05a46c: afbf004c */ sw $ra,0x4c($sp)
|
|
/* f05a470: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05a474: 01cf1021 */ addu $v0,$t6,$t7
|
|
/* f05a478: 90450002 */ lbu $a1,0x2($v0)
|
|
/* f05a47c: 0fc12737 */ jal chrFindById
|
|
/* f05a480: afa2009c */ sw $v0,0x9c($sp)
|
|
/* f05a484: 8e18028c */ lw $t8,0x28c($s0)
|
|
/* f05a488: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a48c: 8fa8009c */ lw $t0,0x9c($sp)
|
|
/* f05a490: afb80078 */ sw $t8,0x78($sp)
|
|
/* f05a494: 94f90192 */ lhu $t9,0x192($a3)
|
|
/* f05a498: 91060003 */ lbu $a2,0x3($t0)
|
|
/* f05a49c: 00402825 */ move $a1,$v0
|
|
/* f05a4a0: 33291000 */ andi $t1,$t9,0x1000
|
|
/* f05a4a4: 10e00003 */ beqz $a3,.PF0f05a4b4
|
|
/* f05a4a8: a3a9006b */ sb $t1,0x6b($sp)
|
|
/* f05a4ac: 10000002 */ b .PF0f05a4b8
|
|
/* f05a4b0: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.PF0f05a4b4:
|
|
/* f05a4b4: 00001825 */ move $v1,$zero
|
|
.PF0f05a4b8:
|
|
/* f05a4b8: 24010001 */ li $at,0x1
|
|
/* f05a4bc: 14610007 */ bne $v1,$at,.PF0f05a4dc
|
|
/* f05a4c0: 3c0a8007 */ lui $t2,0x8007
|
|
/* f05a4c4: 254a93b8 */ addiu $t2,$t2,-27720
|
|
/* f05a4c8: 28c10006 */ slti $at,$a2,0x6
|
|
/* f05a4cc: 1420002a */ bnez $at,.PF0f05a578
|
|
/* f05a4d0: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f05a4d4: 10000028 */ b .PF0f05a578
|
|
/* f05a4d8: 00003025 */ move $a2,$zero
|
|
.PF0f05a4dc:
|
|
/* f05a4dc: 80eb0006 */ lb $t3,0x6($a3)
|
|
/* f05a4e0: 24030029 */ li $v1,0x29
|
|
/* f05a4e4: 3c0c8007 */ lui $t4,0x8007
|
|
/* f05a4e8: 146b000d */ bne $v1,$t3,.PF0f05a520
|
|
/* f05a4ec: 258c93f0 */ addiu $t4,$t4,-27664
|
|
/* f05a4f0: 28c10003 */ slti $at,$a2,0x3
|
|
/* f05a4f4: 14200020 */ bnez $at,.PF0f05a578
|
|
/* f05a4f8: afac0084 */ sw $t4,0x84($sp)
|
|
/* f05a4fc: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a500: 0c004ad4 */ jal random
|
|
/* f05a504: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f05a508: 30460001 */ andi $a2,$v0,0x1
|
|
/* f05a50c: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a510: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f05a514: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a518: 10000017 */ b .PF0f05a578
|
|
/* f05a51c: 8fa8009c */ lw $t0,0x9c($sp)
|
|
.PF0f05a520:
|
|
/* f05a520: 910e0007 */ lbu $t6,0x7($t0)
|
|
/* f05a524: 3c0b8007 */ lui $t3,0x8007
|
|
/* f05a528: 256b91f8 */ addiu $t3,$t3,-28168
|
|
/* f05a52c: 55c00012 */ bnezl $t6,.PF0f05a578
|
|
/* f05a530: afab0084 */ sw $t3,0x84($sp)
|
|
/* f05a534: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
/* f05a538: 240f0003 */ li $t7,0x3
|
|
/* f05a53c: 28410004 */ slti $at,$v0,0x4
|
|
/* f05a540: 14200004 */ bnez $at,.PF0f05a554
|
|
/* f05a544: 00000000 */ nop
|
|
/* f05a548: a0ef02b1 */ sb $t7,0x2b1($a3)
|
|
/* f05a54c: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a550: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
.PF0f05a554:
|
|
/* f05a554: 00430019 */ multu $v0,$v1
|
|
/* f05a558: 3c098007 */ lui $t1,0x8007
|
|
/* f05a55c: 25298cd8 */ addiu $t1,$t1,-29480
|
|
/* f05a560: 0000c012 */ mflo $t8
|
|
/* f05a564: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f05a568: 03295021 */ addu $t2,$t9,$t1
|
|
/* f05a56c: 10000002 */ b .PF0f05a578
|
|
/* f05a570: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f05a574: afab0084 */ sw $t3,0x84($sp)
|
|
.PF0f05a578:
|
|
/* f05a578: 54c0000e */ bnezl $a2,.PF0f05a5b4
|
|
/* f05a57c: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a580: 910c0004 */ lbu $t4,0x4($t0)
|
|
/* f05a584: 5580000b */ bnezl $t4,.PF0f05a5b4
|
|
/* f05a588: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a58c: 910d0006 */ lbu $t5,0x6($t0)
|
|
/* f05a590: 55a00008 */ bnezl $t5,.PF0f05a5b4
|
|
/* f05a594: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a598: ace00120 */ sw $zero,0x120($a3)
|
|
/* f05a59c: 8e0e0438 */ lw $t6,0x438($s0)
|
|
/* f05a5a0: 00001025 */ move $v0,$zero
|
|
/* f05a5a4: 25cf000a */ addiu $t7,$t6,0xa
|
|
/* f05a5a8: 10000208 */ b .PF0f05adcc
|
|
/* f05a5ac: ae0f0438 */ sw $t7,0x438($s0)
|
|
/* f05a5b0: 90e40125 */ lbu $a0,0x125($a3)
|
|
.PF0f05a5b4:
|
|
/* f05a5b4: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a5b8: 0fc133e6 */ jal teamGetChrIds
|
|
/* f05a5bc: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f05a5c0: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f05a5c4: afa20088 */ sw $v0,0x88($sp)
|
|
/* f05a5c8: afa00098 */ sw $zero,0x98($sp)
|
|
/* f05a5cc: afa00094 */ sw $zero,0x94($sp)
|
|
/* f05a5d0: 93190004 */ lbu $t9,0x4($t8)
|
|
/* f05a5d4: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a5d8: 24010005 */ li $at,0x5
|
|
/* f05a5dc: afb90090 */ sw $t9,0x90($sp)
|
|
/* f05a5e0: 80e30006 */ lb $v1,0x6($a3)
|
|
/* f05a5e4: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f05a5e8: 8fa90084 */ lw $t1,0x84($sp)
|
|
/* f05a5ec: 10610007 */ beq $v1,$at,.PF0f05a60c
|
|
/* f05a5f0: 3c0a8007 */ lui $t2,0x8007
|
|
/* f05a5f4: 2401000f */ li $at,0xf
|
|
/* f05a5f8: 10610004 */ beq $v1,$at,.PF0f05a60c
|
|
/* f05a5fc: 2401003a */ li $at,0x3a
|
|
/* f05a600: 10610002 */ beq $v1,$at,.PF0f05a60c
|
|
/* f05a604: 24010028 */ li $at,0x28
|
|
/* f05a608: 14610004 */ bne $v1,$at,.PF0f05a61c
|
|
.PF0f05a60c:
|
|
/* f05a60c: 254a91f8 */ addiu $t2,$t2,-28168
|
|
/* f05a610: 112a0002 */ beq $t1,$t2,.PF0f05a61c
|
|
/* f05a614: 00000000 */ nop
|
|
/* f05a618: afa00090 */ sw $zero,0x90($sp)
|
|
.PF0f05a61c:
|
|
/* f05a61c: 50a0001c */ beqzl $a1,.PF0f05a690
|
|
/* f05a620: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a624: 8ca4001c */ lw $a0,0x1c($a1)
|
|
/* f05a628: 50800019 */ beqzl $a0,.PF0f05a690
|
|
/* f05a62c: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a630: 908b0000 */ lbu $t3,0x0($a0)
|
|
/* f05a634: 24010006 */ li $at,0x6
|
|
/* f05a638: 55610015 */ bnel $t3,$at,.PF0f05a690
|
|
/* f05a63c: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a640: 0fc4a513 */ jal propGetPlayerNum
|
|
/* f05a644: 00000000 */ nop
|
|
/* f05a648: 8e030298 */ lw $v1,0x298($s0)
|
|
/* f05a64c: 00026080 */ sll $t4,$v0,0x2
|
|
/* f05a650: 00402025 */ move $a0,$v0
|
|
/* f05a654: 0460000a */ bltz $v1,.PF0f05a680
|
|
/* f05a658: 020c6821 */ addu $t5,$s0,$t4
|
|
/* f05a65c: 8dae0064 */ lw $t6,0x64($t5)
|
|
/* f05a660: 8dcf00d8 */ lw $t7,0xd8($t6)
|
|
/* f05a664: 11e00006 */ beqz $t7,.PF0f05a680
|
|
/* f05a668: 00000000 */ nop
|
|
/* f05a66c: 8e050294 */ lw $a1,0x294($s0)
|
|
/* f05a670: 14450003 */ bne $v0,$a1,.PF0f05a680
|
|
/* f05a674: 00a02025 */ move $a0,$a1
|
|
/* f05a678: 10000001 */ b .PF0f05a680
|
|
/* f05a67c: 00602025 */ move $a0,$v1
|
|
.PF0f05a680:
|
|
/* f05a680: 0fc4a4ff */ jal setCurrentPlayerNum
|
|
/* f05a684: 00000000 */ nop
|
|
/* f05a688: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a68c: 90e20126 */ lbu $v0,0x126($a3)
|
|
.PF0f05a690:
|
|
/* f05a690: 10400009 */ beqz $v0,.PF0f05a6b8
|
|
/* f05a694: 0002c080 */ sll $t8,$v0,0x2
|
|
/* f05a698: 0302c023 */ subu $t8,$t8,$v0
|
|
/* f05a69c: 8cf90120 */ lw $t9,0x120($a3)
|
|
/* f05a6a0: 0018c0c0 */ sll $t8,$t8,0x3
|
|
/* f05a6a4: 0302c021 */ addu $t8,$t8,$v0
|
|
/* f05a6a8: 0018c040 */ sll $t8,$t8,0x1
|
|
/* f05a6ac: 0319082a */ slt $at,$t8,$t9
|
|
/* f05a6b0: 102001c0 */ beqz $at,.PF0f05adb4
|
|
/* f05a6b4: 00000000 */ nop
|
|
.PF0f05a6b8:
|
|
/* f05a6b8: 0c004ad4 */ jal random
|
|
/* f05a6bc: 00000000 */ nop
|
|
/* f05a6c0: 8faa0090 */ lw $t2,0x90($sp)
|
|
/* f05a6c4: 304900ff */ andi $t1,$v0,0xff
|
|
/* f05a6c8: 8fab0088 */ lw $t3,0x88($sp)
|
|
/* f05a6cc: 012a082a */ slt $at,$t1,$t2
|
|
/* f05a6d0: 102001b8 */ beqz $at,.PF0f05adb4
|
|
/* f05a6d4: 00000000 */ nop
|
|
/* f05a6d8: 85640000 */ lh $a0,0x0($t3)
|
|
/* f05a6dc: 2401fffe */ li $at,-2
|
|
/* f05a6e0: 5081003e */ beql $a0,$at,.PF0f05a7dc
|
|
/* f05a6e4: 8fae0094 */ lw $t6,0x94($sp)
|
|
.PF0f05a6e8:
|
|
/* f05a6e8: 0fc0a226 */ jal chrFindByLiteralId
|
|
/* f05a6ec: 00000000 */ nop
|
|
/* f05a6f0: 50400033 */ beqzl $v0,.PF0f05a7c0
|
|
/* f05a6f4: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a6f8: 8c4c0020 */ lw $t4,0x20($v0)
|
|
/* f05a6fc: 00402025 */ move $a0,$v0
|
|
/* f05a700: 5180002f */ beqzl $t4,.PF0f05a7c0
|
|
/* f05a704: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a708: 0fc0e706 */ jal chrIsDead
|
|
/* f05a70c: afa20064 */ sw $v0,0x64($sp)
|
|
/* f05a710: 1440002a */ bnez $v0,.PF0f05a7bc
|
|
/* f05a714: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f05a718: 80cd0007 */ lb $t5,0x7($a2)
|
|
/* f05a71c: 24010005 */ li $at,0x5
|
|
/* f05a720: 51a10027 */ beql $t5,$at,.PF0f05a7c0
|
|
/* f05a724: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a728: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a72c: 90ce02a2 */ lbu $t6,0x2a2($a2)
|
|
/* f05a730: 90ef02a2 */ lbu $t7,0x2a2($a3)
|
|
/* f05a734: 55cf0022 */ bnel $t6,$t7,.PF0f05a7c0
|
|
/* f05a738: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a73c: 90d80113 */ lbu $t8,0x113($a2)
|
|
/* f05a740: 2b010064 */ slti $at,$t8,0x64
|
|
/* f05a744: 5420001e */ bnezl $at,.PF0f05a7c0
|
|
/* f05a748: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a74c: 84c50000 */ lh $a1,0x0($a2)
|
|
/* f05a750: 84f90000 */ lh $t9,0x0($a3)
|
|
/* f05a754: 00e02025 */ move $a0,$a3
|
|
/* f05a758: 50b90019 */ beql $a1,$t9,.PF0f05a7c0
|
|
/* f05a75c: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a760: 0fc12792 */ jal chrGetDistanceToChr
|
|
/* f05a764: afa60064 */ sw $a2,0x64($sp)
|
|
/* f05a768: 3c017f1b */ lui $at,0x7f1b
|
|
/* f05a76c: c424afd4 */ lwc1 $f4,-0x502c($at)
|
|
/* f05a770: 8fa90098 */ lw $t1,0x98($sp)
|
|
/* f05a774: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f05a778: 4604003c */ c.lt.s $f0,$f4
|
|
/* f05a77c: 252a0001 */ addiu $t2,$t1,0x1
|
|
/* f05a780: 4502000f */ bc1fl .PF0f05a7c0
|
|
/* f05a784: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a788: afaa0098 */ sw $t2,0x98($sp)
|
|
/* f05a78c: 8ccb0120 */ lw $t3,0x120($a2)
|
|
/* f05a790: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f05a794: 29610032 */ slti $at,$t3,0x32
|
|
/* f05a798: 50200009 */ beqzl $at,.PF0f05a7c0
|
|
/* f05a79c: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a7a0: 91820006 */ lbu $v0,0x6($t4)
|
|
/* f05a7a4: 240100ff */ li $at,0xff
|
|
/* f05a7a8: 50400005 */ beqzl $v0,.PF0f05a7c0
|
|
/* f05a7ac: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a7b0: 10410002 */ beq $v0,$at,.PF0f05a7bc
|
|
/* f05a7b4: 240d0001 */ li $t5,0x1
|
|
/* f05a7b8: afad0094 */ sw $t5,0x94($sp)
|
|
.PF0f05a7bc:
|
|
/* f05a7bc: 8fa20088 */ lw $v0,0x88($sp)
|
|
.PF0f05a7c0:
|
|
/* f05a7c0: 2401fffe */ li $at,-2
|
|
/* f05a7c4: 84440002 */ lh $a0,0x2($v0)
|
|
/* f05a7c8: 24420002 */ addiu $v0,$v0,0x2
|
|
/* f05a7cc: afa20088 */ sw $v0,0x88($sp)
|
|
/* f05a7d0: 1481ffc5 */ bne $a0,$at,.PF0f05a6e8
|
|
/* f05a7d4: 00000000 */ nop
|
|
/* f05a7d8: 8fae0094 */ lw $t6,0x94($sp)
|
|
.PF0f05a7dc:
|
|
/* f05a7dc: 8faf0098 */ lw $t7,0x98($sp)
|
|
/* f05a7e0: 15c00174 */ bnez $t6,.PF0f05adb4
|
|
/* f05a7e4: 00000000 */ nop
|
|
/* f05a7e8: 15e00007 */ bnez $t7,.PF0f05a808
|
|
/* f05a7ec: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f05a7f0: 93020006 */ lbu $v0,0x6($t8)
|
|
/* f05a7f4: 240100ff */ li $at,0xff
|
|
/* f05a7f8: 1040000a */ beqz $v0,.PF0f05a824
|
|
/* f05a7fc: 00000000 */ nop
|
|
/* f05a800: 10410008 */ beq $v0,$at,.PF0f05a824
|
|
/* f05a804: 00000000 */ nop
|
|
.PF0f05a808:
|
|
/* f05a808: 8fb90098 */ lw $t9,0x98($sp)
|
|
/* f05a80c: 8fa9009c */ lw $t1,0x9c($sp)
|
|
/* f05a810: 1b200168 */ blez $t9,.PF0f05adb4
|
|
/* f05a814: 00000000 */ nop
|
|
/* f05a818: 912a0006 */ lbu $t2,0x6($t1)
|
|
/* f05a81c: 19400165 */ blez $t2,.PF0f05adb4
|
|
/* f05a820: 00000000 */ nop
|
|
.PF0f05a824:
|
|
/* f05a824: 0c004ad4 */ jal random
|
|
/* f05a828: 00000000 */ nop
|
|
/* f05a82c: 24010003 */ li $at,0x3
|
|
/* f05a830: 0041001b */ divu $zero,$v0,$at
|
|
/* f05a834: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f05a838: 00001810 */ mfhi $v1
|
|
/* f05a83c: a3a300a7 */ sb $v1,0xa7($sp)
|
|
/* f05a840: 916c0007 */ lbu $t4,0x7($t3)
|
|
/* f05a844: 8fb80070 */ lw $t8,0x70($sp)
|
|
/* f05a848: 8fae0084 */ lw $t6,0x84($sp)
|
|
/* f05a84c: 318d0080 */ andi $t5,$t4,0x80
|
|
/* f05a850: 15a00009 */ bnez $t5,.PF0f05a878
|
|
/* f05a854: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f05a858: 01d94821 */ addu $t1,$t6,$t9
|
|
/* f05a85c: 306a00ff */ andi $t2,$v1,0xff
|
|
/* f05a860: 000a5840 */ sll $t3,$t2,0x1
|
|
/* f05a864: 012b6021 */ addu $t4,$t1,$t3
|
|
/* f05a868: afa90058 */ sw $t1,0x58($sp)
|
|
/* f05a86c: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f05a870: 1000000c */ b .PF0f05a8a4
|
|
/* f05a874: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.PF0f05a878:
|
|
/* f05a878: 8e0a0424 */ lw $t2,0x424($s0)
|
|
/* f05a87c: 8fae0070 */ lw $t6,0x70($sp)
|
|
/* f05a880: 8faf0084 */ lw $t7,0x84($sp)
|
|
/* f05a884: 914902b0 */ lbu $t1,0x2b0($t2)
|
|
/* f05a888: 000ec8c0 */ sll $t9,$t6,0x3
|
|
/* f05a88c: 01f91021 */ addu $v0,$t7,$t9
|
|
/* f05a890: 00095840 */ sll $t3,$t1,0x1
|
|
/* f05a894: 004b6021 */ addu $t4,$v0,$t3
|
|
/* f05a898: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f05a89c: afa20058 */ sw $v0,0x58($sp)
|
|
/* f05a8a0: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.PF0f05a8a4:
|
|
/* f05a8a4: 0fc13433 */ jal audioWasNotPlayedRecently
|
|
/* f05a8a8: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a8ac: 1440000a */ bnez $v0,.PF0f05a8d8
|
|
/* f05a8b0: 24010001 */ li $at,0x1
|
|
/* f05a8b4: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a8b8: 00001825 */ move $v1,$zero
|
|
/* f05a8bc: 24080001 */ li $t0,0x1
|
|
/* f05a8c0: 10e00003 */ beqz $a3,.PF0f05a8d0
|
|
/* f05a8c4: 3c0e8007 */ lui $t6,0x8007
|
|
/* f05a8c8: 10000001 */ b .PF0f05a8d0
|
|
/* f05a8cc: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.PF0f05a8d0:
|
|
/* f05a8d0: 54610092 */ bnel $v1,$at,.PF0f05ab1c
|
|
/* f05a8d4: 8fad0070 */ lw $t5,0x70($sp)
|
|
.PF0f05a8d8:
|
|
/* f05a8d8: 0fc13421 */ jal audioMarkAsRecentlyPlayed
|
|
/* f05a8dc: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a8e0: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f05a8e4: 2401034e */ li $at,0x34e
|
|
/* f05a8e8: 93ae006b */ lbu $t6,0x6b($sp)
|
|
/* f05a8ec: 57010005 */ bnel $t8,$at,.PF0f05a904
|
|
/* f05a8f0: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f05a8f4: 15c00002 */ bnez $t6,.PF0f05a900
|
|
/* f05a8f8: 240f034d */ li $t7,0x34d
|
|
/* f05a8fc: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.PF0f05a900:
|
|
/* f05a900: 8e190424 */ lw $t9,0x424($s0)
|
|
.PF0f05a904:
|
|
/* f05a904: 240103f7 */ li $at,0x3f7
|
|
/* f05a908: af200120 */ sw $zero,0x120($t9)
|
|
/* f05a90c: 8faa009c */ lw $t2,0x9c($sp)
|
|
/* f05a910: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f05a914: 91490005 */ lbu $t1,0x5($t2)
|
|
/* f05a918: a1690126 */ sb $t1,0x126($t3)
|
|
/* f05a91c: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a920: 90ec0332 */ lbu $t4,0x332($a3)
|
|
/* f05a924: 258d0001 */ addiu $t5,$t4,0x1
|
|
/* f05a928: a0ed0332 */ sb $t5,0x332($a3)
|
|
/* f05a92c: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f05a930: 13010022 */ beq $t8,$at,.PF0f05a9bc
|
|
/* f05a934: 24010331 */ li $at,0x331
|
|
/* f05a938: 13010020 */ beq $t8,$at,.PF0f05a9bc
|
|
/* f05a93c: 240103a1 */ li $at,0x3a1
|
|
/* f05a940: 1301001e */ beq $t8,$at,.PF0f05a9bc
|
|
/* f05a944: 24050009 */ li $a1,0x9
|
|
/* f05a948: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05a94c: 3406ffff */ li $a2,0xffff
|
|
/* f05a950: 0fc2496f */ jal func0f0926bc
|
|
/* f05a954: 8dc4001c */ lw $a0,0x1c($t6)
|
|
/* f05a958: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f05a95c: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05a960: 44810000 */ mtc1 $at,$f0
|
|
/* f05a964: 8de5001c */ lw $a1,0x1c($t7)
|
|
/* f05a968: 2419ffff */ li $t9,-1
|
|
/* f05a96c: 240a0008 */ li $t2,0x8
|
|
/* f05a970: 24090009 */ li $t1,0x9
|
|
/* f05a974: 240bffff */ li $t3,-1
|
|
/* f05a978: afab002c */ sw $t3,0x2c($sp)
|
|
/* f05a97c: afa9001c */ sw $t1,0x1c($sp)
|
|
/* f05a980: afaa0014 */ sw $t2,0x14($sp)
|
|
/* f05a984: afb90010 */ sw $t9,0x10($sp)
|
|
/* f05a988: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05a98c: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05a990: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05a994: 00002025 */ move $a0,$zero
|
|
/* f05a998: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05a99c: 2407ffff */ li $a3,-1
|
|
/* f05a9a0: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05a9a4: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05a9a8: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05a9ac: 0fc24e3a */ jal func0f0939f8
|
|
/* f05a9b0: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05a9b4: 10000026 */ b .PF0f05aa50
|
|
/* f05a9b8: 8faa009c */ lw $t2,0x9c($sp)
|
|
.PF0f05a9bc:
|
|
/* f05a9bc: 0fc131c6 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f05a9c0: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05a9c4: 18400003 */ blez $v0,.PF0f05a9d4
|
|
/* f05a9c8: 00021823 */ negu $v1,$v0
|
|
/* f05a9cc: 10000001 */ b .PF0f05a9d4
|
|
/* f05a9d0: 00401825 */ move $v1,$v0
|
|
.PF0f05a9d4:
|
|
/* f05a9d4: 28610033 */ slti $at,$v1,0x33
|
|
/* f05a9d8: 1420001c */ bnez $at,.PF0f05aa4c
|
|
/* f05a9dc: 24050009 */ li $a1,0x9
|
|
/* f05a9e0: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f05a9e4: 3406ffff */ li $a2,0xffff
|
|
/* f05a9e8: 0fc2496f */ jal func0f0926bc
|
|
/* f05a9ec: 8d84001c */ lw $a0,0x1c($t4)
|
|
/* f05a9f0: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f05a9f4: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05a9f8: 44810000 */ mtc1 $at,$f0
|
|
/* f05a9fc: 8da5001c */ lw $a1,0x1c($t5)
|
|
/* f05aa00: 2418ffff */ li $t8,-1
|
|
/* f05aa04: 240e0008 */ li $t6,0x8
|
|
/* f05aa08: 240f0009 */ li $t7,0x9
|
|
/* f05aa0c: 2419ffff */ li $t9,-1
|
|
/* f05aa10: afb9002c */ sw $t9,0x2c($sp)
|
|
/* f05aa14: afaf001c */ sw $t7,0x1c($sp)
|
|
/* f05aa18: afae0014 */ sw $t6,0x14($sp)
|
|
/* f05aa1c: afb80010 */ sw $t8,0x10($sp)
|
|
/* f05aa20: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05aa24: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05aa28: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05aa2c: 00002025 */ move $a0,$zero
|
|
/* f05aa30: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05aa34: 2407ffff */ li $a3,-1
|
|
/* f05aa38: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05aa3c: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05aa40: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05aa44: 0fc24e3a */ jal func0f0939f8
|
|
/* f05aa48: e7a00024 */ swc1 $f0,0x24($sp)
|
|
.PF0f05aa4c:
|
|
/* f05aa4c: 8faa009c */ lw $t2,0x9c($sp)
|
|
.PF0f05aa50:
|
|
/* f05aa50: 91420008 */ lbu $v0,0x8($t2)
|
|
/* f05aa54: 1040001a */ beqz $v0,.PF0f05aac0
|
|
/* f05aa58: 00000000 */ nop
|
|
/* f05aa5c: 91490007 */ lbu $t1,0x7($t2)
|
|
/* f05aa60: 93a300a7 */ lbu $v1,0xa7($sp)
|
|
/* f05aa64: 000260c0 */ sll $t4,$v0,0x3
|
|
/* f05aa68: 312b0080 */ andi $t3,$t1,0x80
|
|
/* f05aa6c: 15600014 */ bnez $t3,.PF0f05aac0
|
|
/* f05aa70: 28610003 */ slti $at,$v1,0x3
|
|
/* f05aa74: 14200002 */ bnez $at,.PF0f05aa80
|
|
/* f05aa78: 3c048007 */ lui $a0,0x8007
|
|
/* f05aa7c: 24030002 */ li $v1,0x2
|
|
.PF0f05aa80:
|
|
/* f05aa80: 00036840 */ sll $t5,$v1,0x1
|
|
/* f05aa84: 018dc021 */ addu $t8,$t4,$t5
|
|
/* f05aa88: 00982021 */ addu $a0,$a0,$t8
|
|
/* f05aa8c: 0fc5bdaa */ jal langGet
|
|
/* f05aa90: 84849362 */ lh $a0,-0x6c9e($a0)
|
|
/* f05aa94: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05aa98: 0c004062 */ jal sndIsFiltered
|
|
/* f05aa9c: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05aaa0: 144000c4 */ bnez $v0,.PF0f05adb4
|
|
/* f05aaa4: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05aaa8: 8fae009c */ lw $t6,0x9c($sp)
|
|
/* f05aaac: 24050006 */ li $a1,0x6
|
|
/* f05aab0: 0fc3799a */ jal hudmsgCreateWithColour
|
|
/* f05aab4: 91c60009 */ lbu $a2,0x9($t6)
|
|
/* f05aab8: 100000be */ b .PF0f05adb4
|
|
/* f05aabc: 00000000 */ nop
|
|
.PF0f05aac0:
|
|
/* f05aac0: 104000bc */ beqz $v0,.PF0f05adb4
|
|
/* f05aac4: 00000000 */ nop
|
|
/* f05aac8: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f05aacc: 000278c0 */ sll $t7,$v0,0x3
|
|
/* f05aad0: 3c048007 */ lui $a0,0x8007
|
|
/* f05aad4: 932a02b0 */ lbu $t2,0x2b0($t9)
|
|
/* f05aad8: 000a4840 */ sll $t1,$t2,0x1
|
|
/* f05aadc: 01e95821 */ addu $t3,$t7,$t1
|
|
/* f05aae0: 008b2021 */ addu $a0,$a0,$t3
|
|
/* f05aae4: 0fc5bdaa */ jal langGet
|
|
/* f05aae8: 84849362 */ lh $a0,-0x6c9e($a0)
|
|
/* f05aaec: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05aaf0: 0c004062 */ jal sndIsFiltered
|
|
/* f05aaf4: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05aaf8: 144000ae */ bnez $v0,.PF0f05adb4
|
|
/* f05aafc: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05ab00: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f05ab04: 24050006 */ li $a1,0x6
|
|
/* f05ab08: 0fc3799a */ jal hudmsgCreateWithColour
|
|
/* f05ab0c: 91860009 */ lbu $a2,0x9($t4)
|
|
/* f05ab10: 100000a8 */ b .PF0f05adb4
|
|
/* f05ab14: 00000000 */ nop
|
|
/* f05ab18: 8fad0070 */ lw $t5,0x70($sp)
|
|
.PF0f05ab1c:
|
|
/* f05ab1c: 25ce8cd8 */ addiu $t6,$t6,-29480
|
|
/* f05ab20: a7a000a4 */ sh $zero,0xa4($sp)
|
|
/* f05ab24: 000dc0c0 */ sll $t8,$t5,0x3
|
|
/* f05ab28: 030e1021 */ addu $v0,$t8,$t6
|
|
/* f05ab2c: afa2005c */ sw $v0,0x5c($sp)
|
|
.PF0f05ab30:
|
|
/* f05ab30: 8fa2005c */ lw $v0,0x5c($sp)
|
|
/* f05ab34: 00081840 */ sll $v1,$t0,0x1
|
|
/* f05ab38: 0043c821 */ addu $t9,$v0,$v1
|
|
/* f05ab3c: 87240000 */ lh $a0,0x0($t9)
|
|
/* f05ab40: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05ab44: 0fc13433 */ jal audioWasNotPlayedRecently
|
|
/* f05ab48: afa30054 */ sw $v1,0x54($sp)
|
|
/* f05ab4c: 8fa30054 */ lw $v1,0x54($sp)
|
|
/* f05ab50: 1040000d */ beqz $v0,.PF0f05ab88
|
|
/* f05ab54: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05ab58: 8faa0058 */ lw $t2,0x58($sp)
|
|
/* f05ab5c: 01432821 */ addu $a1,$t2,$v1
|
|
/* f05ab60: 84a40000 */ lh $a0,0x0($a1)
|
|
/* f05ab64: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05ab68: 0fc13433 */ jal audioWasNotPlayedRecently
|
|
/* f05ab6c: afa50050 */ sw $a1,0x50($sp)
|
|
/* f05ab70: 8fa50050 */ lw $a1,0x50($sp)
|
|
/* f05ab74: 10400004 */ beqz $v0,.PF0f05ab88
|
|
/* f05ab78: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05ab7c: 84af0000 */ lh $t7,0x0($a1)
|
|
/* f05ab80: 10000006 */ b .PF0f05ab9c
|
|
/* f05ab84: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.PF0f05ab88:
|
|
/* f05ab88: 25080001 */ addiu $t0,$t0,0x1
|
|
/* f05ab8c: 310900ff */ andi $t1,$t0,0xff
|
|
/* f05ab90: 29210004 */ slti $at,$t1,0x4
|
|
/* f05ab94: 1420ffe6 */ bnez $at,.PF0f05ab30
|
|
/* f05ab98: 01204025 */ move $t0,$t1
|
|
.PF0f05ab9c:
|
|
/* f05ab9c: 87ab00a4 */ lh $t3,0xa4($sp)
|
|
/* f05aba0: 1160007a */ beqz $t3,.PF0f05ad8c
|
|
/* f05aba4: 01602025 */ move $a0,$t3
|
|
/* f05aba8: 0fc13421 */ jal audioMarkAsRecentlyPlayed
|
|
/* f05abac: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05abb0: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f05abb4: 2401034e */ li $at,0x34e
|
|
/* f05abb8: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05abbc: 15810004 */ bne $t4,$at,.PF0f05abd0
|
|
/* f05abc0: 93ad006b */ lbu $t5,0x6b($sp)
|
|
/* f05abc4: 15a00002 */ bnez $t5,.PF0f05abd0
|
|
/* f05abc8: 2418034d */ li $t8,0x34d
|
|
/* f05abcc: a7b800a4 */ sh $t8,0xa4($sp)
|
|
.PF0f05abd0:
|
|
/* f05abd0: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05abd4: 240103f7 */ li $at,0x3f7
|
|
/* f05abd8: adc00120 */ sw $zero,0x120($t6)
|
|
/* f05abdc: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f05abe0: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f05abe4: 932a0005 */ lbu $t2,0x5($t9)
|
|
/* f05abe8: a1ea0126 */ sb $t2,0x126($t7)
|
|
/* f05abec: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05abf0: 90e90332 */ lbu $t1,0x332($a3)
|
|
/* f05abf4: 252b0001 */ addiu $t3,$t1,0x1
|
|
/* f05abf8: a0eb0332 */ sb $t3,0x332($a3)
|
|
/* f05abfc: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f05ac00: 11810024 */ beq $t4,$at,.PF0f05ac94
|
|
/* f05ac04: 24010331 */ li $at,0x331
|
|
/* f05ac08: 11810022 */ beq $t4,$at,.PF0f05ac94
|
|
/* f05ac0c: 240103a1 */ li $at,0x3a1
|
|
/* f05ac10: 51810021 */ beql $t4,$at,.PF0f05ac98
|
|
/* f05ac14: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05ac18: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f05ac1c: 24050009 */ li $a1,0x9
|
|
/* f05ac20: 3406ffff */ li $a2,0xffff
|
|
/* f05ac24: 8da4001c */ lw $a0,0x1c($t5)
|
|
/* f05ac28: 0fc2496f */ jal func0f0926bc
|
|
/* f05ac2c: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05ac30: 8e180424 */ lw $t8,0x424($s0)
|
|
/* f05ac34: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05ac38: 44810000 */ mtc1 $at,$f0
|
|
/* f05ac3c: 8f05001c */ lw $a1,0x1c($t8)
|
|
/* f05ac40: 240effff */ li $t6,-1
|
|
/* f05ac44: 24190008 */ li $t9,0x8
|
|
/* f05ac48: 240a0009 */ li $t2,0x9
|
|
/* f05ac4c: 240fffff */ li $t7,-1
|
|
/* f05ac50: afaf002c */ sw $t7,0x2c($sp)
|
|
/* f05ac54: afaa001c */ sw $t2,0x1c($sp)
|
|
/* f05ac58: afb90014 */ sw $t9,0x14($sp)
|
|
/* f05ac5c: afae0010 */ sw $t6,0x10($sp)
|
|
/* f05ac60: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05ac64: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05ac68: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05ac6c: 00002025 */ move $a0,$zero
|
|
/* f05ac70: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05ac74: 2407ffff */ li $a3,-1
|
|
/* f05ac78: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05ac7c: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05ac80: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05ac84: 0fc24e3a */ jal func0f0939f8
|
|
/* f05ac88: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05ac8c: 1000002a */ b .PF0f05ad38
|
|
/* f05ac90: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.PF0f05ac94:
|
|
/* f05ac94: 8e040424 */ lw $a0,0x424($s0)
|
|
.PF0f05ac98:
|
|
/* f05ac98: 0fc131c6 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f05ac9c: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05aca0: 18400003 */ blez $v0,.PF0f05acb0
|
|
/* f05aca4: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05aca8: 10000002 */ b .PF0f05acb4
|
|
/* f05acac: 00401825 */ move $v1,$v0
|
|
.PF0f05acb0:
|
|
/* f05acb0: 00021823 */ negu $v1,$v0
|
|
.PF0f05acb4:
|
|
/* f05acb4: 28610033 */ slti $at,$v1,0x33
|
|
/* f05acb8: 54200020 */ bnezl $at,.PF0f05ad3c
|
|
/* f05acbc: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f05acc0: 8e090424 */ lw $t1,0x424($s0)
|
|
/* f05acc4: 24050009 */ li $a1,0x9
|
|
/* f05acc8: 3406ffff */ li $a2,0xffff
|
|
/* f05accc: 8d24001c */ lw $a0,0x1c($t1)
|
|
/* f05acd0: 0fc2496f */ jal func0f0926bc
|
|
/* f05acd4: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05acd8: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f05acdc: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05ace0: 44810000 */ mtc1 $at,$f0
|
|
/* f05ace4: 8d65001c */ lw $a1,0x1c($t3)
|
|
/* f05ace8: 240cffff */ li $t4,-1
|
|
/* f05acec: 240d0008 */ li $t5,0x8
|
|
/* f05acf0: 24180009 */ li $t8,0x9
|
|
/* f05acf4: 240effff */ li $t6,-1
|
|
/* f05acf8: afae002c */ sw $t6,0x2c($sp)
|
|
/* f05acfc: afb8001c */ sw $t8,0x1c($sp)
|
|
/* f05ad00: afad0014 */ sw $t5,0x14($sp)
|
|
/* f05ad04: afac0010 */ sw $t4,0x10($sp)
|
|
/* f05ad08: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05ad0c: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05ad10: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05ad14: 00002025 */ move $a0,$zero
|
|
/* f05ad18: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05ad1c: 2407ffff */ li $a3,-1
|
|
/* f05ad20: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05ad24: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05ad28: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05ad2c: 0fc24e3a */ jal func0f0939f8
|
|
/* f05ad30: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05ad34: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.PF0f05ad38:
|
|
/* f05ad38: 8fb9009c */ lw $t9,0x9c($sp)
|
|
.PF0f05ad3c:
|
|
/* f05ad3c: 00087840 */ sll $t7,$t0,0x1
|
|
/* f05ad40: 3c048007 */ lui $a0,0x8007
|
|
/* f05ad44: 93220008 */ lbu $v0,0x8($t9)
|
|
/* f05ad48: 1040001a */ beqz $v0,.PF0f05adb4
|
|
/* f05ad4c: 000250c0 */ sll $t2,$v0,0x3
|
|
/* f05ad50: 014f4821 */ addu $t1,$t2,$t7
|
|
/* f05ad54: 00892021 */ addu $a0,$a0,$t1
|
|
/* f05ad58: 0fc5bdaa */ jal langGet
|
|
/* f05ad5c: 84849360 */ lh $a0,-0x6ca0($a0)
|
|
/* f05ad60: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05ad64: 0c004062 */ jal sndIsFiltered
|
|
/* f05ad68: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05ad6c: 14400011 */ bnez $v0,.PF0f05adb4
|
|
/* f05ad70: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05ad74: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f05ad78: 24050006 */ li $a1,0x6
|
|
/* f05ad7c: 0fc3799a */ jal hudmsgCreateWithColour
|
|
/* f05ad80: 91660009 */ lbu $a2,0x9($t3)
|
|
/* f05ad84: 1000000b */ b .PF0f05adb4
|
|
/* f05ad88: 00000000 */ nop
|
|
.PF0f05ad8c:
|
|
/* f05ad8c: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f05ad90: 3c050800 */ lui $a1,0x800
|
|
/* f05ad94: 24060001 */ li $a2,0x1
|
|
/* f05ad98: ad800120 */ sw $zero,0x120($t4)
|
|
/* f05ad9c: 8fad009c */ lw $t5,0x9c($sp)
|
|
/* f05ada0: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05ada4: 91b80005 */ lbu $t8,0x5($t5)
|
|
/* f05ada8: a1d80126 */ sb $t8,0x126($t6)
|
|
/* f05adac: 0fc127e8 */ jal chrUnsetFlags
|
|
/* f05adb0: 8e040424 */ lw $a0,0x424($s0)
|
|
.PF0f05adb4:
|
|
/* f05adb4: 0fc4a4ff */ jal setCurrentPlayerNum
|
|
/* f05adb8: 8fa40078 */ lw $a0,0x78($sp)
|
|
/* f05adbc: 8e190438 */ lw $t9,0x438($s0)
|
|
/* f05adc0: 00001025 */ move $v0,$zero
|
|
/* f05adc4: 272a000a */ addiu $t2,$t9,0xa
|
|
/* f05adc8: ae0a0438 */ sw $t2,0x438($s0)
|
|
.PF0f05adcc:
|
|
/* f05adcc: 8fbf004c */ lw $ra,0x4c($sp)
|
|
/* f05add0: 8fb00048 */ lw $s0,0x48($sp)
|
|
/* f05add4: 27bd00a8 */ addiu $sp,$sp,0xa8
|
|
/* f05add8: 03e00008 */ jr $ra
|
|
/* f05addc: 00000000 */ nop
|
|
);
|
|
#elif VERSION >= VERSION_NTSC_1_0
|
|
GLOBAL_ASM(
|
|
glabel aiSayQuip
|
|
.late_rodata
|
|
glabel var7f1a9d64
|
|
.word 0x45dac000
|
|
.text
|
|
/* f05a258: 27bdff58 */ addiu $sp,$sp,-168
|
|
/* f05a25c: afb00048 */ sw $s0,0x48($sp)
|
|
/* f05a260: 3c10800a */ lui $s0,%hi(g_Vars)
|
|
/* f05a264: 26109fc0 */ addiu $s0,$s0,%lo(g_Vars)
|
|
/* f05a268: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f05a26c: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f05a270: afbf004c */ sw $ra,0x4c($sp)
|
|
/* f05a274: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05a278: 01cf1021 */ addu $v0,$t6,$t7
|
|
/* f05a27c: 90450002 */ lbu $a1,0x2($v0)
|
|
/* f05a280: 0fc126d1 */ jal chrFindById
|
|
/* f05a284: afa2009c */ sw $v0,0x9c($sp)
|
|
/* f05a288: 8e18028c */ lw $t8,0x28c($s0)
|
|
/* f05a28c: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a290: 8fa8009c */ lw $t0,0x9c($sp)
|
|
/* f05a294: afb80078 */ sw $t8,0x78($sp)
|
|
/* f05a298: 94f90192 */ lhu $t9,0x192($a3)
|
|
/* f05a29c: 91060003 */ lbu $a2,0x3($t0)
|
|
/* f05a2a0: 00402825 */ or $a1,$v0,$zero
|
|
/* f05a2a4: 33291000 */ andi $t1,$t9,0x1000
|
|
/* f05a2a8: 10e00003 */ beqz $a3,.L0f05a2b8
|
|
/* f05a2ac: a3a9006b */ sb $t1,0x6b($sp)
|
|
/* f05a2b0: 10000002 */ b .L0f05a2bc
|
|
/* f05a2b4: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.L0f05a2b8:
|
|
/* f05a2b8: 00001825 */ or $v1,$zero,$zero
|
|
.L0f05a2bc:
|
|
/* f05a2bc: 24010001 */ addiu $at,$zero,0x1
|
|
/* f05a2c0: 14610007 */ bne $v1,$at,.L0f05a2e0
|
|
/* f05a2c4: 3c0a8007 */ lui $t2,%hi(g_SkedarQuipBank)
|
|
/* f05a2c8: 254a96d8 */ addiu $t2,$t2,%lo(g_SkedarQuipBank)
|
|
/* f05a2cc: 28c10006 */ slti $at,$a2,0x6
|
|
/* f05a2d0: 1420002a */ bnez $at,.L0f05a37c
|
|
/* f05a2d4: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f05a2d8: 10000028 */ b .L0f05a37c
|
|
/* f05a2dc: 00003025 */ or $a2,$zero,$zero
|
|
.L0f05a2e0:
|
|
/* f05a2e0: 80eb0006 */ lb $t3,0x6($a3)
|
|
/* f05a2e4: 24030029 */ addiu $v1,$zero,0x29
|
|
/* f05a2e8: 3c0c8007 */ lui $t4,%hi(g_MaianQuipBank)
|
|
/* f05a2ec: 146b000d */ bne $v1,$t3,.L0f05a324
|
|
/* f05a2f0: 258c9710 */ addiu $t4,$t4,%lo(g_MaianQuipBank)
|
|
/* f05a2f4: 28c10003 */ slti $at,$a2,0x3
|
|
/* f05a2f8: 14200020 */ bnez $at,.L0f05a37c
|
|
/* f05a2fc: afac0084 */ sw $t4,0x84($sp)
|
|
/* f05a300: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a304: 0c004b70 */ jal random
|
|
/* f05a308: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f05a30c: 30460001 */ andi $a2,$v0,0x1
|
|
/* f05a310: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a314: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f05a318: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a31c: 10000017 */ b .L0f05a37c
|
|
/* f05a320: 8fa8009c */ lw $t0,0x9c($sp)
|
|
.L0f05a324:
|
|
/* f05a324: 910e0007 */ lbu $t6,0x7($t0)
|
|
/* f05a328: 3c0b8007 */ lui $t3,%hi(g_SpecialQuipBank)
|
|
/* f05a32c: 256b9518 */ addiu $t3,$t3,%lo(g_SpecialQuipBank)
|
|
/* f05a330: 55c00012 */ bnezl $t6,.L0f05a37c
|
|
/* f05a334: afab0084 */ sw $t3,0x84($sp)
|
|
/* f05a338: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
/* f05a33c: 240f0003 */ addiu $t7,$zero,0x3
|
|
/* f05a340: 28410004 */ slti $at,$v0,0x4
|
|
/* f05a344: 14200004 */ bnez $at,.L0f05a358
|
|
/* f05a348: 00000000 */ nop
|
|
/* f05a34c: a0ef02b1 */ sb $t7,0x2b1($a3)
|
|
/* f05a350: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a354: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
.L0f05a358:
|
|
/* f05a358: 00430019 */ multu $v0,$v1
|
|
/* f05a35c: 3c098007 */ lui $t1,%hi(g_GuardQuipBank)
|
|
/* f05a360: 25298ff8 */ addiu $t1,$t1,%lo(g_GuardQuipBank)
|
|
/* f05a364: 0000c012 */ mflo $t8
|
|
/* f05a368: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f05a36c: 03295021 */ addu $t2,$t9,$t1
|
|
/* f05a370: 10000002 */ b .L0f05a37c
|
|
/* f05a374: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f05a378: afab0084 */ sw $t3,0x84($sp)
|
|
.L0f05a37c:
|
|
/* f05a37c: 54c0000e */ bnezl $a2,.L0f05a3b8
|
|
/* f05a380: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a384: 910c0004 */ lbu $t4,0x4($t0)
|
|
/* f05a388: 5580000b */ bnezl $t4,.L0f05a3b8
|
|
/* f05a38c: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a390: 910d0006 */ lbu $t5,0x6($t0)
|
|
/* f05a394: 55a00008 */ bnezl $t5,.L0f05a3b8
|
|
/* f05a398: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f05a39c: ace00120 */ sw $zero,0x120($a3)
|
|
/* f05a3a0: 8e0e0438 */ lw $t6,0x438($s0)
|
|
/* f05a3a4: 00001025 */ or $v0,$zero,$zero
|
|
/* f05a3a8: 25cf000a */ addiu $t7,$t6,0xa
|
|
/* f05a3ac: 10000206 */ b .L0f05abc8
|
|
/* f05a3b0: ae0f0438 */ sw $t7,0x438($s0)
|
|
/* f05a3b4: 90e40125 */ lbu $a0,0x125($a3)
|
|
.L0f05a3b8:
|
|
/* f05a3b8: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05a3bc: 0fc13380 */ jal teamGetChrIds
|
|
/* f05a3c0: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f05a3c4: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f05a3c8: afa20088 */ sw $v0,0x88($sp)
|
|
/* f05a3cc: afa00098 */ sw $zero,0x98($sp)
|
|
/* f05a3d0: afa00094 */ sw $zero,0x94($sp)
|
|
/* f05a3d4: 93190004 */ lbu $t9,0x4($t8)
|
|
/* f05a3d8: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a3dc: 24010005 */ addiu $at,$zero,0x5
|
|
/* f05a3e0: afb90090 */ sw $t9,0x90($sp)
|
|
/* f05a3e4: 80e30006 */ lb $v1,0x6($a3)
|
|
/* f05a3e8: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f05a3ec: 8fa90084 */ lw $t1,0x84($sp)
|
|
/* f05a3f0: 10610007 */ beq $v1,$at,.L0f05a410
|
|
/* f05a3f4: 3c0a8007 */ lui $t2,%hi(g_SpecialQuipBank)
|
|
/* f05a3f8: 2401000f */ addiu $at,$zero,0xf
|
|
/* f05a3fc: 10610004 */ beq $v1,$at,.L0f05a410
|
|
/* f05a400: 2401003a */ addiu $at,$zero,0x3a
|
|
/* f05a404: 10610002 */ beq $v1,$at,.L0f05a410
|
|
/* f05a408: 24010028 */ addiu $at,$zero,0x28
|
|
/* f05a40c: 14610004 */ bne $v1,$at,.L0f05a420
|
|
.L0f05a410:
|
|
/* f05a410: 254a9518 */ addiu $t2,$t2,%lo(g_SpecialQuipBank)
|
|
/* f05a414: 112a0002 */ beq $t1,$t2,.L0f05a420
|
|
/* f05a418: 00000000 */ nop
|
|
/* f05a41c: afa00090 */ sw $zero,0x90($sp)
|
|
.L0f05a420:
|
|
/* f05a420: 50a0001c */ beqzl $a1,.L0f05a494
|
|
/* f05a424: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a428: 8ca4001c */ lw $a0,0x1c($a1)
|
|
/* f05a42c: 50800019 */ beqzl $a0,.L0f05a494
|
|
/* f05a430: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a434: 908b0000 */ lbu $t3,0x0($a0)
|
|
/* f05a438: 24010006 */ addiu $at,$zero,0x6
|
|
/* f05a43c: 55610015 */ bnel $t3,$at,.L0f05a494
|
|
/* f05a440: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05a444: 0fc4a25f */ jal propGetPlayerNum
|
|
/* f05a448: 00000000 */ nop
|
|
/* f05a44c: 8e030298 */ lw $v1,0x298($s0)
|
|
/* f05a450: 00026080 */ sll $t4,$v0,0x2
|
|
/* f05a454: 00402025 */ or $a0,$v0,$zero
|
|
/* f05a458: 0460000a */ bltz $v1,.L0f05a484
|
|
/* f05a45c: 020c6821 */ addu $t5,$s0,$t4
|
|
/* f05a460: 8dae0064 */ lw $t6,0x64($t5)
|
|
/* f05a464: 8dcf00d8 */ lw $t7,0xd8($t6)
|
|
/* f05a468: 11e00006 */ beqz $t7,.L0f05a484
|
|
/* f05a46c: 00000000 */ nop
|
|
/* f05a470: 8e050294 */ lw $a1,0x294($s0)
|
|
/* f05a474: 14450003 */ bne $v0,$a1,.L0f05a484
|
|
/* f05a478: 00a02025 */ or $a0,$a1,$zero
|
|
/* f05a47c: 10000001 */ b .L0f05a484
|
|
/* f05a480: 00602025 */ or $a0,$v1,$zero
|
|
.L0f05a484:
|
|
/* f05a484: 0fc4a24b */ jal setCurrentPlayerNum
|
|
/* f05a488: 00000000 */ nop
|
|
/* f05a48c: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a490: 90e20126 */ lbu $v0,0x126($a3)
|
|
.L0f05a494:
|
|
/* f05a494: 10400007 */ beqz $v0,.L0f05a4b4
|
|
/* f05a498: 0002c100 */ sll $t8,$v0,0x4
|
|
/* f05a49c: 8cf90120 */ lw $t9,0x120($a3)
|
|
/* f05a4a0: 0302c023 */ subu $t8,$t8,$v0
|
|
/* f05a4a4: 0018c080 */ sll $t8,$t8,0x2
|
|
/* f05a4a8: 0319082a */ slt $at,$t8,$t9
|
|
/* f05a4ac: 102001c0 */ beqz $at,.L0f05abb0
|
|
/* f05a4b0: 00000000 */ nop
|
|
.L0f05a4b4:
|
|
/* f05a4b4: 0c004b70 */ jal random
|
|
/* f05a4b8: 00000000 */ nop
|
|
/* f05a4bc: 8faa0090 */ lw $t2,0x90($sp)
|
|
/* f05a4c0: 304900ff */ andi $t1,$v0,0xff
|
|
/* f05a4c4: 8fab0088 */ lw $t3,0x88($sp)
|
|
/* f05a4c8: 012a082a */ slt $at,$t1,$t2
|
|
/* f05a4cc: 102001b8 */ beqz $at,.L0f05abb0
|
|
/* f05a4d0: 00000000 */ nop
|
|
/* f05a4d4: 85640000 */ lh $a0,0x0($t3)
|
|
/* f05a4d8: 2401fffe */ addiu $at,$zero,-2
|
|
/* f05a4dc: 5081003e */ beql $a0,$at,.L0f05a5d8
|
|
/* f05a4e0: 8fae0094 */ lw $t6,0x94($sp)
|
|
.L0f05a4e4:
|
|
/* f05a4e4: 0fc0a1dd */ jal chrFindByLiteralId
|
|
/* f05a4e8: 00000000 */ nop
|
|
/* f05a4ec: 50400033 */ beqzl $v0,.L0f05a5bc
|
|
/* f05a4f0: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a4f4: 8c4c0020 */ lw $t4,0x20($v0)
|
|
/* f05a4f8: 00402025 */ or $a0,$v0,$zero
|
|
/* f05a4fc: 5180002f */ beqzl $t4,.L0f05a5bc
|
|
/* f05a500: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a504: 0fc0e6a5 */ jal chrIsDead
|
|
/* f05a508: afa20064 */ sw $v0,0x64($sp)
|
|
/* f05a50c: 1440002a */ bnez $v0,.L0f05a5b8
|
|
/* f05a510: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f05a514: 80cd0007 */ lb $t5,0x7($a2)
|
|
/* f05a518: 24010005 */ addiu $at,$zero,0x5
|
|
/* f05a51c: 51a10027 */ beql $t5,$at,.L0f05a5bc
|
|
/* f05a520: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a524: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a528: 90ce02a2 */ lbu $t6,0x2a2($a2)
|
|
/* f05a52c: 90ef02a2 */ lbu $t7,0x2a2($a3)
|
|
/* f05a530: 55cf0022 */ bnel $t6,$t7,.L0f05a5bc
|
|
/* f05a534: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a538: 90d80113 */ lbu $t8,0x113($a2)
|
|
/* f05a53c: 2b010064 */ slti $at,$t8,0x64
|
|
/* f05a540: 5420001e */ bnezl $at,.L0f05a5bc
|
|
/* f05a544: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a548: 84c50000 */ lh $a1,0x0($a2)
|
|
/* f05a54c: 84f90000 */ lh $t9,0x0($a3)
|
|
/* f05a550: 00e02025 */ or $a0,$a3,$zero
|
|
/* f05a554: 50b90019 */ beql $a1,$t9,.L0f05a5bc
|
|
/* f05a558: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a55c: 0fc1272c */ jal chrGetDistanceToChr
|
|
/* f05a560: afa60064 */ sw $a2,0x64($sp)
|
|
/* f05a564: 3c017f1b */ lui $at,%hi(var7f1a9d64)
|
|
/* f05a568: c4249d64 */ lwc1 $f4,%lo(var7f1a9d64)($at)
|
|
/* f05a56c: 8fa90098 */ lw $t1,0x98($sp)
|
|
/* f05a570: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f05a574: 4604003c */ c.lt.s $f0,$f4
|
|
/* f05a578: 252a0001 */ addiu $t2,$t1,0x1
|
|
/* f05a57c: 4502000f */ bc1fl .L0f05a5bc
|
|
/* f05a580: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a584: afaa0098 */ sw $t2,0x98($sp)
|
|
/* f05a588: 8ccb0120 */ lw $t3,0x120($a2)
|
|
/* f05a58c: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f05a590: 2961003c */ slti $at,$t3,0x3c
|
|
/* f05a594: 50200009 */ beqzl $at,.L0f05a5bc
|
|
/* f05a598: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a59c: 91820006 */ lbu $v0,0x6($t4)
|
|
/* f05a5a0: 240100ff */ addiu $at,$zero,0xff
|
|
/* f05a5a4: 50400005 */ beqzl $v0,.L0f05a5bc
|
|
/* f05a5a8: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05a5ac: 10410002 */ beq $v0,$at,.L0f05a5b8
|
|
/* f05a5b0: 240d0001 */ addiu $t5,$zero,0x1
|
|
/* f05a5b4: afad0094 */ sw $t5,0x94($sp)
|
|
.L0f05a5b8:
|
|
/* f05a5b8: 8fa20088 */ lw $v0,0x88($sp)
|
|
.L0f05a5bc:
|
|
/* f05a5bc: 2401fffe */ addiu $at,$zero,-2
|
|
/* f05a5c0: 84440002 */ lh $a0,0x2($v0)
|
|
/* f05a5c4: 24420002 */ addiu $v0,$v0,0x2
|
|
/* f05a5c8: afa20088 */ sw $v0,0x88($sp)
|
|
/* f05a5cc: 1481ffc5 */ bne $a0,$at,.L0f05a4e4
|
|
/* f05a5d0: 00000000 */ nop
|
|
/* f05a5d4: 8fae0094 */ lw $t6,0x94($sp)
|
|
.L0f05a5d8:
|
|
/* f05a5d8: 8faf0098 */ lw $t7,0x98($sp)
|
|
/* f05a5dc: 15c00174 */ bnez $t6,.L0f05abb0
|
|
/* f05a5e0: 00000000 */ nop
|
|
/* f05a5e4: 15e00007 */ bnez $t7,.L0f05a604
|
|
/* f05a5e8: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f05a5ec: 93020006 */ lbu $v0,0x6($t8)
|
|
/* f05a5f0: 240100ff */ addiu $at,$zero,0xff
|
|
/* f05a5f4: 1040000a */ beqz $v0,.L0f05a620
|
|
/* f05a5f8: 00000000 */ nop
|
|
/* f05a5fc: 10410008 */ beq $v0,$at,.L0f05a620
|
|
/* f05a600: 00000000 */ nop
|
|
.L0f05a604:
|
|
/* f05a604: 8fb90098 */ lw $t9,0x98($sp)
|
|
/* f05a608: 8fa9009c */ lw $t1,0x9c($sp)
|
|
/* f05a60c: 1b200168 */ blez $t9,.L0f05abb0
|
|
/* f05a610: 00000000 */ nop
|
|
/* f05a614: 912a0006 */ lbu $t2,0x6($t1)
|
|
/* f05a618: 19400165 */ blez $t2,.L0f05abb0
|
|
/* f05a61c: 00000000 */ nop
|
|
.L0f05a620:
|
|
/* f05a620: 0c004b70 */ jal random
|
|
/* f05a624: 00000000 */ nop
|
|
/* f05a628: 24010003 */ addiu $at,$zero,0x3
|
|
/* f05a62c: 0041001b */ divu $zero,$v0,$at
|
|
/* f05a630: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f05a634: 00001810 */ mfhi $v1
|
|
/* f05a638: a3a300a7 */ sb $v1,0xa7($sp)
|
|
/* f05a63c: 916c0007 */ lbu $t4,0x7($t3)
|
|
/* f05a640: 8fb80070 */ lw $t8,0x70($sp)
|
|
/* f05a644: 8fae0084 */ lw $t6,0x84($sp)
|
|
/* f05a648: 318d0080 */ andi $t5,$t4,0x80
|
|
/* f05a64c: 15a00009 */ bnez $t5,.L0f05a674
|
|
/* f05a650: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f05a654: 01d94821 */ addu $t1,$t6,$t9
|
|
/* f05a658: 306a00ff */ andi $t2,$v1,0xff
|
|
/* f05a65c: 000a5840 */ sll $t3,$t2,0x1
|
|
/* f05a660: 012b6021 */ addu $t4,$t1,$t3
|
|
/* f05a664: afa90058 */ sw $t1,0x58($sp)
|
|
/* f05a668: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f05a66c: 1000000c */ b .L0f05a6a0
|
|
/* f05a670: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.L0f05a674:
|
|
/* f05a674: 8e0a0424 */ lw $t2,0x424($s0)
|
|
/* f05a678: 8fae0070 */ lw $t6,0x70($sp)
|
|
/* f05a67c: 8faf0084 */ lw $t7,0x84($sp)
|
|
/* f05a680: 914902b0 */ lbu $t1,0x2b0($t2)
|
|
/* f05a684: 000ec8c0 */ sll $t9,$t6,0x3
|
|
/* f05a688: 01f91021 */ addu $v0,$t7,$t9
|
|
/* f05a68c: 00095840 */ sll $t3,$t1,0x1
|
|
/* f05a690: 004b6021 */ addu $t4,$v0,$t3
|
|
/* f05a694: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f05a698: afa20058 */ sw $v0,0x58($sp)
|
|
/* f05a69c: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.L0f05a6a0:
|
|
/* f05a6a0: 0fc133cd */ jal audioWasNotPlayedRecently
|
|
/* f05a6a4: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a6a8: 1440000a */ bnez $v0,.L0f05a6d4
|
|
/* f05a6ac: 24010001 */ addiu $at,$zero,0x1
|
|
/* f05a6b0: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a6b4: 00001825 */ or $v1,$zero,$zero
|
|
/* f05a6b8: 24080001 */ addiu $t0,$zero,0x1
|
|
/* f05a6bc: 10e00003 */ beqz $a3,.L0f05a6cc
|
|
/* f05a6c0: 3c0e8007 */ lui $t6,%hi(g_GuardQuipBank)
|
|
/* f05a6c4: 10000001 */ b .L0f05a6cc
|
|
/* f05a6c8: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.L0f05a6cc:
|
|
/* f05a6cc: 54610092 */ bnel $v1,$at,.L0f05a918
|
|
/* f05a6d0: 8fad0070 */ lw $t5,0x70($sp)
|
|
.L0f05a6d4:
|
|
/* f05a6d4: 0fc133bb */ jal audioMarkAsRecentlyPlayed
|
|
/* f05a6d8: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a6dc: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f05a6e0: 2401034e */ addiu $at,$zero,0x34e
|
|
/* f05a6e4: 93ae006b */ lbu $t6,0x6b($sp)
|
|
/* f05a6e8: 57010005 */ bnel $t8,$at,.L0f05a700
|
|
/* f05a6ec: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f05a6f0: 15c00002 */ bnez $t6,.L0f05a6fc
|
|
/* f05a6f4: 240f034d */ addiu $t7,$zero,0x34d
|
|
/* f05a6f8: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.L0f05a6fc:
|
|
/* f05a6fc: 8e190424 */ lw $t9,0x424($s0)
|
|
.L0f05a700:
|
|
/* f05a700: 240103f7 */ addiu $at,$zero,0x3f7
|
|
/* f05a704: af200120 */ sw $zero,0x120($t9)
|
|
/* f05a708: 8faa009c */ lw $t2,0x9c($sp)
|
|
/* f05a70c: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f05a710: 91490005 */ lbu $t1,0x5($t2)
|
|
/* f05a714: a1690126 */ sb $t1,0x126($t3)
|
|
/* f05a718: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a71c: 90ec0332 */ lbu $t4,0x332($a3)
|
|
/* f05a720: 258d0001 */ addiu $t5,$t4,0x1
|
|
/* f05a724: a0ed0332 */ sb $t5,0x332($a3)
|
|
/* f05a728: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f05a72c: 13010022 */ beq $t8,$at,.L0f05a7b8
|
|
/* f05a730: 24010331 */ addiu $at,$zero,0x331
|
|
/* f05a734: 13010020 */ beq $t8,$at,.L0f05a7b8
|
|
/* f05a738: 240103a1 */ addiu $at,$zero,0x3a1
|
|
/* f05a73c: 1301001e */ beq $t8,$at,.L0f05a7b8
|
|
/* f05a740: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f05a744: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05a748: 3406ffff */ dli $a2,0xffff
|
|
/* f05a74c: 0fc249af */ jal func0f0926bc
|
|
/* f05a750: 8dc4001c */ lw $a0,0x1c($t6)
|
|
/* f05a754: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f05a758: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05a75c: 44810000 */ mtc1 $at,$f0
|
|
/* f05a760: 8de5001c */ lw $a1,0x1c($t7)
|
|
/* f05a764: 2419ffff */ addiu $t9,$zero,-1
|
|
/* f05a768: 240a0008 */ addiu $t2,$zero,0x8
|
|
/* f05a76c: 24090009 */ addiu $t1,$zero,0x9
|
|
/* f05a770: 240bffff */ addiu $t3,$zero,-1
|
|
/* f05a774: afab002c */ sw $t3,0x2c($sp)
|
|
/* f05a778: afa9001c */ sw $t1,0x1c($sp)
|
|
/* f05a77c: afaa0014 */ sw $t2,0x14($sp)
|
|
/* f05a780: afb90010 */ sw $t9,0x10($sp)
|
|
/* f05a784: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05a788: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05a78c: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05a790: 00002025 */ or $a0,$zero,$zero
|
|
/* f05a794: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05a798: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f05a79c: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05a7a0: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05a7a4: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05a7a8: 0fc24e7e */ jal func0f0939f8
|
|
/* f05a7ac: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05a7b0: 10000026 */ b .L0f05a84c
|
|
/* f05a7b4: 8faa009c */ lw $t2,0x9c($sp)
|
|
.L0f05a7b8:
|
|
/* f05a7b8: 0fc13160 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f05a7bc: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05a7c0: 18400003 */ blez $v0,.L0f05a7d0
|
|
/* f05a7c4: 00021823 */ negu $v1,$v0
|
|
/* f05a7c8: 10000001 */ b .L0f05a7d0
|
|
/* f05a7cc: 00401825 */ or $v1,$v0,$zero
|
|
.L0f05a7d0:
|
|
/* f05a7d0: 28610033 */ slti $at,$v1,0x33
|
|
/* f05a7d4: 1420001c */ bnez $at,.L0f05a848
|
|
/* f05a7d8: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f05a7dc: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f05a7e0: 3406ffff */ dli $a2,0xffff
|
|
/* f05a7e4: 0fc249af */ jal func0f0926bc
|
|
/* f05a7e8: 8d84001c */ lw $a0,0x1c($t4)
|
|
/* f05a7ec: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f05a7f0: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05a7f4: 44810000 */ mtc1 $at,$f0
|
|
/* f05a7f8: 8da5001c */ lw $a1,0x1c($t5)
|
|
/* f05a7fc: 2418ffff */ addiu $t8,$zero,-1
|
|
/* f05a800: 240e0008 */ addiu $t6,$zero,0x8
|
|
/* f05a804: 240f0009 */ addiu $t7,$zero,0x9
|
|
/* f05a808: 2419ffff */ addiu $t9,$zero,-1
|
|
/* f05a80c: afb9002c */ sw $t9,0x2c($sp)
|
|
/* f05a810: afaf001c */ sw $t7,0x1c($sp)
|
|
/* f05a814: afae0014 */ sw $t6,0x14($sp)
|
|
/* f05a818: afb80010 */ sw $t8,0x10($sp)
|
|
/* f05a81c: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05a820: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05a824: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05a828: 00002025 */ or $a0,$zero,$zero
|
|
/* f05a82c: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05a830: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f05a834: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05a838: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05a83c: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05a840: 0fc24e7e */ jal func0f0939f8
|
|
/* f05a844: e7a00024 */ swc1 $f0,0x24($sp)
|
|
.L0f05a848:
|
|
/* f05a848: 8faa009c */ lw $t2,0x9c($sp)
|
|
.L0f05a84c:
|
|
/* f05a84c: 91420008 */ lbu $v0,0x8($t2)
|
|
/* f05a850: 1040001a */ beqz $v0,.L0f05a8bc
|
|
/* f05a854: 00000000 */ nop
|
|
/* f05a858: 91490007 */ lbu $t1,0x7($t2)
|
|
/* f05a85c: 93a300a7 */ lbu $v1,0xa7($sp)
|
|
/* f05a860: 000260c0 */ sll $t4,$v0,0x3
|
|
/* f05a864: 312b0080 */ andi $t3,$t1,0x80
|
|
/* f05a868: 15600014 */ bnez $t3,.L0f05a8bc
|
|
/* f05a86c: 28610003 */ slti $at,$v1,0x3
|
|
/* f05a870: 14200002 */ bnez $at,.L0f05a87c
|
|
/* f05a874: 3c048007 */ lui $a0,%hi(g_SpecialQuipBank+0x16a)
|
|
/* f05a878: 24030002 */ addiu $v1,$zero,0x2
|
|
.L0f05a87c:
|
|
/* f05a87c: 00036840 */ sll $t5,$v1,0x1
|
|
/* f05a880: 018dc021 */ addu $t8,$t4,$t5
|
|
/* f05a884: 00982021 */ addu $a0,$a0,$t8
|
|
/* f05a888: 0fc5b9f1 */ jal langGet
|
|
/* f05a88c: 84849682 */ lh $a0,%lo(g_SpecialQuipBank+0x16a)($a0)
|
|
/* f05a890: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05a894: 0c004103 */ jal sndIsFiltered
|
|
/* f05a898: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a89c: 144000c4 */ bnez $v0,.L0f05abb0
|
|
/* f05a8a0: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05a8a4: 8fae009c */ lw $t6,0x9c($sp)
|
|
/* f05a8a8: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f05a8ac: 0fc3780d */ jal hudmsgCreateWithColour
|
|
/* f05a8b0: 91c60009 */ lbu $a2,0x9($t6)
|
|
/* f05a8b4: 100000be */ b .L0f05abb0
|
|
/* f05a8b8: 00000000 */ nop
|
|
.L0f05a8bc:
|
|
/* f05a8bc: 104000bc */ beqz $v0,.L0f05abb0
|
|
/* f05a8c0: 00000000 */ nop
|
|
/* f05a8c4: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f05a8c8: 000278c0 */ sll $t7,$v0,0x3
|
|
/* f05a8cc: 3c048007 */ lui $a0,%hi(g_SpecialQuipBank+0x16a)
|
|
/* f05a8d0: 932a02b0 */ lbu $t2,0x2b0($t9)
|
|
/* f05a8d4: 000a4840 */ sll $t1,$t2,0x1
|
|
/* f05a8d8: 01e95821 */ addu $t3,$t7,$t1
|
|
/* f05a8dc: 008b2021 */ addu $a0,$a0,$t3
|
|
/* f05a8e0: 0fc5b9f1 */ jal langGet
|
|
/* f05a8e4: 84849682 */ lh $a0,%lo(g_SpecialQuipBank+0x16a)($a0)
|
|
/* f05a8e8: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05a8ec: 0c004103 */ jal sndIsFiltered
|
|
/* f05a8f0: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05a8f4: 144000ae */ bnez $v0,.L0f05abb0
|
|
/* f05a8f8: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05a8fc: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f05a900: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f05a904: 0fc3780d */ jal hudmsgCreateWithColour
|
|
/* f05a908: 91860009 */ lbu $a2,0x9($t4)
|
|
/* f05a90c: 100000a8 */ b .L0f05abb0
|
|
/* f05a910: 00000000 */ nop
|
|
/* f05a914: 8fad0070 */ lw $t5,0x70($sp)
|
|
.L0f05a918:
|
|
/* f05a918: 25ce8ff8 */ addiu $t6,$t6,%lo(g_GuardQuipBank)
|
|
/* f05a91c: a7a000a4 */ sh $zero,0xa4($sp)
|
|
/* f05a920: 000dc0c0 */ sll $t8,$t5,0x3
|
|
/* f05a924: 030e1021 */ addu $v0,$t8,$t6
|
|
/* f05a928: afa2005c */ sw $v0,0x5c($sp)
|
|
.L0f05a92c:
|
|
/* f05a92c: 8fa2005c */ lw $v0,0x5c($sp)
|
|
/* f05a930: 00081840 */ sll $v1,$t0,0x1
|
|
/* f05a934: 0043c821 */ addu $t9,$v0,$v1
|
|
/* f05a938: 87240000 */ lh $a0,0x0($t9)
|
|
/* f05a93c: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05a940: 0fc133cd */ jal audioWasNotPlayedRecently
|
|
/* f05a944: afa30054 */ sw $v1,0x54($sp)
|
|
/* f05a948: 8fa30054 */ lw $v1,0x54($sp)
|
|
/* f05a94c: 1040000d */ beqz $v0,.L0f05a984
|
|
/* f05a950: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05a954: 8faa0058 */ lw $t2,0x58($sp)
|
|
/* f05a958: 01432821 */ addu $a1,$t2,$v1
|
|
/* f05a95c: 84a40000 */ lh $a0,0x0($a1)
|
|
/* f05a960: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05a964: 0fc133cd */ jal audioWasNotPlayedRecently
|
|
/* f05a968: afa50050 */ sw $a1,0x50($sp)
|
|
/* f05a96c: 8fa50050 */ lw $a1,0x50($sp)
|
|
/* f05a970: 10400004 */ beqz $v0,.L0f05a984
|
|
/* f05a974: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05a978: 84af0000 */ lh $t7,0x0($a1)
|
|
/* f05a97c: 10000006 */ b .L0f05a998
|
|
/* f05a980: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.L0f05a984:
|
|
/* f05a984: 25080001 */ addiu $t0,$t0,0x1
|
|
/* f05a988: 310900ff */ andi $t1,$t0,0xff
|
|
/* f05a98c: 29210004 */ slti $at,$t1,0x4
|
|
/* f05a990: 1420ffe6 */ bnez $at,.L0f05a92c
|
|
/* f05a994: 01204025 */ or $t0,$t1,$zero
|
|
.L0f05a998:
|
|
/* f05a998: 87ab00a4 */ lh $t3,0xa4($sp)
|
|
/* f05a99c: 1160007a */ beqz $t3,.L0f05ab88
|
|
/* f05a9a0: 01602025 */ or $a0,$t3,$zero
|
|
/* f05a9a4: 0fc133bb */ jal audioMarkAsRecentlyPlayed
|
|
/* f05a9a8: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05a9ac: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f05a9b0: 2401034e */ addiu $at,$zero,0x34e
|
|
/* f05a9b4: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05a9b8: 15810004 */ bne $t4,$at,.L0f05a9cc
|
|
/* f05a9bc: 93ad006b */ lbu $t5,0x6b($sp)
|
|
/* f05a9c0: 15a00002 */ bnez $t5,.L0f05a9cc
|
|
/* f05a9c4: 2418034d */ addiu $t8,$zero,0x34d
|
|
/* f05a9c8: a7b800a4 */ sh $t8,0xa4($sp)
|
|
.L0f05a9cc:
|
|
/* f05a9cc: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05a9d0: 240103f7 */ addiu $at,$zero,0x3f7
|
|
/* f05a9d4: adc00120 */ sw $zero,0x120($t6)
|
|
/* f05a9d8: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f05a9dc: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f05a9e0: 932a0005 */ lbu $t2,0x5($t9)
|
|
/* f05a9e4: a1ea0126 */ sb $t2,0x126($t7)
|
|
/* f05a9e8: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f05a9ec: 90e90332 */ lbu $t1,0x332($a3)
|
|
/* f05a9f0: 252b0001 */ addiu $t3,$t1,0x1
|
|
/* f05a9f4: a0eb0332 */ sb $t3,0x332($a3)
|
|
/* f05a9f8: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f05a9fc: 11810024 */ beq $t4,$at,.L0f05aa90
|
|
/* f05aa00: 24010331 */ addiu $at,$zero,0x331
|
|
/* f05aa04: 11810022 */ beq $t4,$at,.L0f05aa90
|
|
/* f05aa08: 240103a1 */ addiu $at,$zero,0x3a1
|
|
/* f05aa0c: 51810021 */ beql $t4,$at,.L0f05aa94
|
|
/* f05aa10: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f05aa14: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f05aa18: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f05aa1c: 3406ffff */ dli $a2,0xffff
|
|
/* f05aa20: 8da4001c */ lw $a0,0x1c($t5)
|
|
/* f05aa24: 0fc249af */ jal func0f0926bc
|
|
/* f05aa28: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05aa2c: 8e180424 */ lw $t8,0x424($s0)
|
|
/* f05aa30: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05aa34: 44810000 */ mtc1 $at,$f0
|
|
/* f05aa38: 8f05001c */ lw $a1,0x1c($t8)
|
|
/* f05aa3c: 240effff */ addiu $t6,$zero,-1
|
|
/* f05aa40: 24190008 */ addiu $t9,$zero,0x8
|
|
/* f05aa44: 240a0009 */ addiu $t2,$zero,0x9
|
|
/* f05aa48: 240fffff */ addiu $t7,$zero,-1
|
|
/* f05aa4c: afaf002c */ sw $t7,0x2c($sp)
|
|
/* f05aa50: afaa001c */ sw $t2,0x1c($sp)
|
|
/* f05aa54: afb90014 */ sw $t9,0x14($sp)
|
|
/* f05aa58: afae0010 */ sw $t6,0x10($sp)
|
|
/* f05aa5c: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05aa60: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05aa64: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05aa68: 00002025 */ or $a0,$zero,$zero
|
|
/* f05aa6c: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05aa70: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f05aa74: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05aa78: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05aa7c: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05aa80: 0fc24e7e */ jal func0f0939f8
|
|
/* f05aa84: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05aa88: 1000002a */ b .L0f05ab34
|
|
/* f05aa8c: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.L0f05aa90:
|
|
/* f05aa90: 8e040424 */ lw $a0,0x424($s0)
|
|
.L0f05aa94:
|
|
/* f05aa94: 0fc13160 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f05aa98: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05aa9c: 18400003 */ blez $v0,.L0f05aaac
|
|
/* f05aaa0: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f05aaa4: 10000002 */ b .L0f05aab0
|
|
/* f05aaa8: 00401825 */ or $v1,$v0,$zero
|
|
.L0f05aaac:
|
|
/* f05aaac: 00021823 */ negu $v1,$v0
|
|
.L0f05aab0:
|
|
/* f05aab0: 28610033 */ slti $at,$v1,0x33
|
|
/* f05aab4: 54200020 */ bnezl $at,.L0f05ab38
|
|
/* f05aab8: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f05aabc: 8e090424 */ lw $t1,0x424($s0)
|
|
/* f05aac0: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f05aac4: 3406ffff */ dli $a2,0xffff
|
|
/* f05aac8: 8d24001c */ lw $a0,0x1c($t1)
|
|
/* f05aacc: 0fc249af */ jal func0f0926bc
|
|
/* f05aad0: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f05aad4: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f05aad8: 3c01bf80 */ lui $at,0xbf80
|
|
/* f05aadc: 44810000 */ mtc1 $at,$f0
|
|
/* f05aae0: 8d65001c */ lw $a1,0x1c($t3)
|
|
/* f05aae4: 240cffff */ addiu $t4,$zero,-1
|
|
/* f05aae8: 240d0008 */ addiu $t5,$zero,0x8
|
|
/* f05aaec: 24180009 */ addiu $t8,$zero,0x9
|
|
/* f05aaf0: 240effff */ addiu $t6,$zero,-1
|
|
/* f05aaf4: afae002c */ sw $t6,0x2c($sp)
|
|
/* f05aaf8: afb8001c */ sw $t8,0x1c($sp)
|
|
/* f05aafc: afad0014 */ sw $t5,0x14($sp)
|
|
/* f05ab00: afac0010 */ sw $t4,0x10($sp)
|
|
/* f05ab04: afa00028 */ sw $zero,0x28($sp)
|
|
/* f05ab08: afa00020 */ sw $zero,0x20($sp)
|
|
/* f05ab0c: afa00018 */ sw $zero,0x18($sp)
|
|
/* f05ab10: 00002025 */ or $a0,$zero,$zero
|
|
/* f05ab14: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f05ab18: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f05ab1c: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f05ab20: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f05ab24: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f05ab28: 0fc24e7e */ jal func0f0939f8
|
|
/* f05ab2c: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f05ab30: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.L0f05ab34:
|
|
/* f05ab34: 8fb9009c */ lw $t9,0x9c($sp)
|
|
.L0f05ab38:
|
|
/* f05ab38: 00087840 */ sll $t7,$t0,0x1
|
|
/* f05ab3c: 3c048007 */ lui $a0,%hi(g_SpecialQuipBank+0x168)
|
|
/* f05ab40: 93220008 */ lbu $v0,0x8($t9)
|
|
/* f05ab44: 1040001a */ beqz $v0,.L0f05abb0
|
|
/* f05ab48: 000250c0 */ sll $t2,$v0,0x3
|
|
/* f05ab4c: 014f4821 */ addu $t1,$t2,$t7
|
|
/* f05ab50: 00892021 */ addu $a0,$a0,$t1
|
|
/* f05ab54: 0fc5b9f1 */ jal langGet
|
|
/* f05ab58: 84849680 */ lh $a0,%lo(g_SpecialQuipBank+0x168)($a0)
|
|
/* f05ab5c: afa20080 */ sw $v0,0x80($sp)
|
|
/* f05ab60: 0c004103 */ jal sndIsFiltered
|
|
/* f05ab64: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f05ab68: 14400011 */ bnez $v0,.L0f05abb0
|
|
/* f05ab6c: 8fa40080 */ lw $a0,0x80($sp)
|
|
/* f05ab70: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f05ab74: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f05ab78: 0fc3780d */ jal hudmsgCreateWithColour
|
|
/* f05ab7c: 91660009 */ lbu $a2,0x9($t3)
|
|
/* f05ab80: 1000000b */ b .L0f05abb0
|
|
/* f05ab84: 00000000 */ nop
|
|
.L0f05ab88:
|
|
/* f05ab88: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f05ab8c: 3c050800 */ lui $a1,0x800
|
|
/* f05ab90: 24060001 */ addiu $a2,$zero,0x1
|
|
/* f05ab94: ad800120 */ sw $zero,0x120($t4)
|
|
/* f05ab98: 8fad009c */ lw $t5,0x9c($sp)
|
|
/* f05ab9c: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f05aba0: 91b80005 */ lbu $t8,0x5($t5)
|
|
/* f05aba4: a1d80126 */ sb $t8,0x126($t6)
|
|
/* f05aba8: 0fc12782 */ jal chrUnsetFlags
|
|
/* f05abac: 8e040424 */ lw $a0,0x424($s0)
|
|
.L0f05abb0:
|
|
/* f05abb0: 0fc4a24b */ jal setCurrentPlayerNum
|
|
/* f05abb4: 8fa40078 */ lw $a0,0x78($sp)
|
|
/* f05abb8: 8e190438 */ lw $t9,0x438($s0)
|
|
/* f05abbc: 00001025 */ or $v0,$zero,$zero
|
|
/* f05abc0: 272a000a */ addiu $t2,$t9,0xa
|
|
/* f05abc4: ae0a0438 */ sw $t2,0x438($s0)
|
|
.L0f05abc8:
|
|
/* f05abc8: 8fbf004c */ lw $ra,0x4c($sp)
|
|
/* f05abcc: 8fb00048 */ lw $s0,0x48($sp)
|
|
/* f05abd0: 27bd00a8 */ addiu $sp,$sp,0xa8
|
|
/* f05abd4: 03e00008 */ jr $ra
|
|
/* f05abd8: 00000000 */ nop
|
|
);
|
|
#else
|
|
GLOBAL_ASM(
|
|
glabel aiSayQuip
|
|
.late_rodata
|
|
glabel var7f1a9d64
|
|
.word 0x45dac000
|
|
.text
|
|
/* f0596c0: 27bdff58 */ addiu $sp,$sp,-168
|
|
/* f0596c4: afb00048 */ sw $s0,0x48($sp)
|
|
/* f0596c8: 3c10800a */ lui $s0,0x800a
|
|
/* f0596cc: 2610e6c0 */ addiu $s0,$s0,-6464
|
|
/* f0596d0: 8e0e0434 */ lw $t6,0x434($s0)
|
|
/* f0596d4: 8e0f0438 */ lw $t7,0x438($s0)
|
|
/* f0596d8: afbf004c */ sw $ra,0x4c($sp)
|
|
/* f0596dc: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f0596e0: 01cf1021 */ addu $v0,$t6,$t7
|
|
/* f0596e4: 90450002 */ lbu $a1,0x2($v0)
|
|
/* f0596e8: 0fc123d5 */ jal chrFindById
|
|
/* f0596ec: afa2009c */ sw $v0,0x9c($sp)
|
|
/* f0596f0: 8e18028c */ lw $t8,0x28c($s0)
|
|
/* f0596f4: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f0596f8: 8fa8009c */ lw $t0,0x9c($sp)
|
|
/* f0596fc: afb80078 */ sw $t8,0x78($sp)
|
|
/* f059700: 94f90192 */ lhu $t9,0x192($a3)
|
|
/* f059704: 91060003 */ lbu $a2,0x3($t0)
|
|
/* f059708: 00402825 */ or $a1,$v0,$zero
|
|
/* f05970c: 33291000 */ andi $t1,$t9,0x1000
|
|
/* f059710: 10e00003 */ beqz $a3,.NB0f059720
|
|
/* f059714: a3a9006b */ sb $t1,0x6b($sp)
|
|
/* f059718: 10000002 */ beqz $zero,.NB0f059724
|
|
/* f05971c: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.NB0f059720:
|
|
/* f059720: 00001825 */ or $v1,$zero,$zero
|
|
.NB0f059724:
|
|
/* f059724: 24010001 */ addiu $at,$zero,0x1
|
|
/* f059728: 14610007 */ bne $v1,$at,.NB0f059748
|
|
/* f05972c: 3c0a8007 */ lui $t2,0x8007
|
|
/* f059730: 254abdd8 */ addiu $t2,$t2,-16936
|
|
/* f059734: 28c10006 */ slti $at,$a2,0x6
|
|
/* f059738: 1420002a */ bnez $at,.NB0f0597e4
|
|
/* f05973c: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f059740: 10000028 */ beqz $zero,.NB0f0597e4
|
|
/* f059744: 00003025 */ or $a2,$zero,$zero
|
|
.NB0f059748:
|
|
/* f059748: 80eb0006 */ lb $t3,0x6($a3)
|
|
/* f05974c: 24030029 */ addiu $v1,$zero,0x29
|
|
/* f059750: 3c0c8007 */ lui $t4,0x8007
|
|
/* f059754: 146b000d */ bne $v1,$t3,.NB0f05978c
|
|
/* f059758: 258cbe10 */ addiu $t4,$t4,-16880
|
|
/* f05975c: 28c10003 */ slti $at,$a2,0x3
|
|
/* f059760: 14200020 */ bnez $at,.NB0f0597e4
|
|
/* f059764: afac0084 */ sw $t4,0x84($sp)
|
|
/* f059768: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05976c: 0c004d84 */ jal random
|
|
/* f059770: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f059774: 30460001 */ andi $a2,$v0,0x1
|
|
/* f059778: afa60070 */ sw $a2,0x70($sp)
|
|
/* f05977c: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f059780: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059784: 10000017 */ beqz $zero,.NB0f0597e4
|
|
/* f059788: 8fa8009c */ lw $t0,0x9c($sp)
|
|
.NB0f05978c:
|
|
/* f05978c: 910e0007 */ lbu $t6,0x7($t0)
|
|
/* f059790: 3c0b8007 */ lui $t3,0x8007
|
|
/* f059794: 256bbc18 */ addiu $t3,$t3,-17384
|
|
/* f059798: 55c00012 */ bnezl $t6,.NB0f0597e4
|
|
/* f05979c: afab0084 */ sw $t3,0x84($sp)
|
|
/* f0597a0: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
/* f0597a4: 240f0003 */ addiu $t7,$zero,0x3
|
|
/* f0597a8: 28410004 */ slti $at,$v0,0x4
|
|
/* f0597ac: 14200004 */ bnez $at,.NB0f0597c0
|
|
/* f0597b0: 00000000 */ sll $zero,$zero,0x0
|
|
/* f0597b4: a0ef02b1 */ sb $t7,0x2b1($a3)
|
|
/* f0597b8: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f0597bc: 90e202b1 */ lbu $v0,0x2b1($a3)
|
|
.NB0f0597c0:
|
|
/* f0597c0: 00430019 */ multu $v0,$v1
|
|
/* f0597c4: 3c098007 */ lui $t1,0x8007
|
|
/* f0597c8: 2529b6f8 */ addiu $t1,$t1,-18696
|
|
/* f0597cc: 0000c012 */ mflo $t8
|
|
/* f0597d0: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f0597d4: 03295021 */ addu $t2,$t9,$t1
|
|
/* f0597d8: 10000002 */ beqz $zero,.NB0f0597e4
|
|
/* f0597dc: afaa0084 */ sw $t2,0x84($sp)
|
|
/* f0597e0: afab0084 */ sw $t3,0x84($sp)
|
|
.NB0f0597e4:
|
|
/* f0597e4: 54c0000e */ bnezl $a2,.NB0f059820
|
|
/* f0597e8: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f0597ec: 910c0004 */ lbu $t4,0x4($t0)
|
|
/* f0597f0: 5580000b */ bnezl $t4,.NB0f059820
|
|
/* f0597f4: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f0597f8: 910d0006 */ lbu $t5,0x6($t0)
|
|
/* f0597fc: 55a00008 */ bnezl $t5,.NB0f059820
|
|
/* f059800: 90e40125 */ lbu $a0,0x125($a3)
|
|
/* f059804: ace00120 */ sw $zero,0x120($a3)
|
|
/* f059808: 8e0e0438 */ lw $t6,0x438($s0)
|
|
/* f05980c: 00001025 */ or $v0,$zero,$zero
|
|
/* f059810: 25cf000a */ addiu $t7,$t6,0xa
|
|
/* f059814: 100001fa */ beqz $zero,.NB0f05a000
|
|
/* f059818: ae0f0438 */ sw $t7,0x438($s0)
|
|
/* f05981c: 90e40125 */ lbu $a0,0x125($a3)
|
|
.NB0f059820:
|
|
/* f059820: afa60070 */ sw $a2,0x70($sp)
|
|
/* f059824: 0fc13019 */ jal teamGetChrIds
|
|
/* f059828: afa5007c */ sw $a1,0x7c($sp)
|
|
/* f05982c: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f059830: afa20088 */ sw $v0,0x88($sp)
|
|
/* f059834: afa00098 */ sw $zero,0x98($sp)
|
|
/* f059838: afa00094 */ sw $zero,0x94($sp)
|
|
/* f05983c: 93190004 */ lbu $t9,0x4($t8)
|
|
/* f059840: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059844: 24010005 */ addiu $at,$zero,0x5
|
|
/* f059848: afb90090 */ sw $t9,0x90($sp)
|
|
/* f05984c: 80e30006 */ lb $v1,0x6($a3)
|
|
/* f059850: 8fa5007c */ lw $a1,0x7c($sp)
|
|
/* f059854: 8fa90084 */ lw $t1,0x84($sp)
|
|
/* f059858: 10610007 */ beq $v1,$at,.NB0f059878
|
|
/* f05985c: 3c0a8007 */ lui $t2,0x8007
|
|
/* f059860: 2401000f */ addiu $at,$zero,0xf
|
|
/* f059864: 10610004 */ beq $v1,$at,.NB0f059878
|
|
/* f059868: 2401003a */ addiu $at,$zero,0x3a
|
|
/* f05986c: 10610002 */ beq $v1,$at,.NB0f059878
|
|
/* f059870: 24010028 */ addiu $at,$zero,0x28
|
|
/* f059874: 14610004 */ bne $v1,$at,.NB0f059888
|
|
.NB0f059878:
|
|
/* f059878: 254abc18 */ addiu $t2,$t2,-17384
|
|
/* f05987c: 112a0002 */ beq $t1,$t2,.NB0f059888
|
|
/* f059880: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059884: afa00090 */ sw $zero,0x90($sp)
|
|
.NB0f059888:
|
|
/* f059888: 50a0001c */ beqzl $a1,.NB0f0598fc
|
|
/* f05988c: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f059890: 8ca4001c */ lw $a0,0x1c($a1)
|
|
/* f059894: 50800019 */ beqzl $a0,.NB0f0598fc
|
|
/* f059898: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f05989c: 908b0000 */ lbu $t3,0x0($a0)
|
|
/* f0598a0: 24010006 */ addiu $at,$zero,0x6
|
|
/* f0598a4: 55610015 */ bnel $t3,$at,.NB0f0598fc
|
|
/* f0598a8: 90e20126 */ lbu $v0,0x126($a3)
|
|
/* f0598ac: 0fc48d6f */ jal propGetPlayerNum
|
|
/* f0598b0: 00000000 */ sll $zero,$zero,0x0
|
|
/* f0598b4: 8e030298 */ lw $v1,0x298($s0)
|
|
/* f0598b8: 00026080 */ sll $t4,$v0,0x2
|
|
/* f0598bc: 00402025 */ or $a0,$v0,$zero
|
|
/* f0598c0: 0460000a */ bltz $v1,.NB0f0598ec
|
|
/* f0598c4: 020c6821 */ addu $t5,$s0,$t4
|
|
/* f0598c8: 8dae0064 */ lw $t6,0x64($t5)
|
|
/* f0598cc: 8dcf00d8 */ lw $t7,0xd8($t6)
|
|
/* f0598d0: 11e00006 */ beqz $t7,.NB0f0598ec
|
|
/* f0598d4: 00000000 */ sll $zero,$zero,0x0
|
|
/* f0598d8: 8e050294 */ lw $a1,0x294($s0)
|
|
/* f0598dc: 14450003 */ bne $v0,$a1,.NB0f0598ec
|
|
/* f0598e0: 00a02025 */ or $a0,$a1,$zero
|
|
/* f0598e4: 10000001 */ beqz $zero,.NB0f0598ec
|
|
/* f0598e8: 00602025 */ or $a0,$v1,$zero
|
|
.NB0f0598ec:
|
|
/* f0598ec: 0fc48d5b */ jal setCurrentPlayerNum
|
|
/* f0598f0: 00000000 */ sll $zero,$zero,0x0
|
|
/* f0598f4: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f0598f8: 90e20126 */ lbu $v0,0x126($a3)
|
|
.NB0f0598fc:
|
|
/* f0598fc: 10400007 */ beqz $v0,.NB0f05991c
|
|
/* f059900: 0002c100 */ sll $t8,$v0,0x4
|
|
/* f059904: 8cf90120 */ lw $t9,0x120($a3)
|
|
/* f059908: 0302c023 */ subu $t8,$t8,$v0
|
|
/* f05990c: 0018c080 */ sll $t8,$t8,0x2
|
|
/* f059910: 0319082a */ slt $at,$t8,$t9
|
|
/* f059914: 102001b4 */ beqz $at,.NB0f059fe8
|
|
/* f059918: 00000000 */ sll $zero,$zero,0x0
|
|
.NB0f05991c:
|
|
/* f05991c: 0c004d84 */ jal random
|
|
/* f059920: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059924: 8faa0090 */ lw $t2,0x90($sp)
|
|
/* f059928: 304900ff */ andi $t1,$v0,0xff
|
|
/* f05992c: 8fab0088 */ lw $t3,0x88($sp)
|
|
/* f059930: 012a082a */ slt $at,$t1,$t2
|
|
/* f059934: 102001ac */ beqz $at,.NB0f059fe8
|
|
/* f059938: 00000000 */ sll $zero,$zero,0x0
|
|
/* f05993c: 85640000 */ lh $a0,0x0($t3)
|
|
/* f059940: 2401fffe */ addiu $at,$zero,-2
|
|
/* f059944: 5081003e */ beql $a0,$at,.NB0f059a40
|
|
/* f059948: 8fae0094 */ lw $t6,0x94($sp)
|
|
.NB0f05994c:
|
|
/* f05994c: 0fc0a048 */ jal chrFindByLiteralId
|
|
/* f059950: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059954: 50400033 */ beqzl $v0,.NB0f059a24
|
|
/* f059958: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05995c: 8c4c0020 */ lw $t4,0x20($v0)
|
|
/* f059960: 00402025 */ or $a0,$v0,$zero
|
|
/* f059964: 5180002f */ beqzl $t4,.NB0f059a24
|
|
/* f059968: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05996c: 0fc0e4ec */ jal chrIsDead
|
|
/* f059970: afa20064 */ sw $v0,0x64($sp)
|
|
/* f059974: 1440002a */ bnez $v0,.NB0f059a20
|
|
/* f059978: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f05997c: 80cd0007 */ lb $t5,0x7($a2)
|
|
/* f059980: 24010005 */ addiu $at,$zero,0x5
|
|
/* f059984: 51a10027 */ beql $t5,$at,.NB0f059a24
|
|
/* f059988: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f05998c: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059990: 90ce02a2 */ lbu $t6,0x2a2($a2)
|
|
/* f059994: 90ef02a2 */ lbu $t7,0x2a2($a3)
|
|
/* f059998: 55cf0022 */ bnel $t6,$t7,.NB0f059a24
|
|
/* f05999c: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f0599a0: 90d80113 */ lbu $t8,0x113($a2)
|
|
/* f0599a4: 2b010064 */ slti $at,$t8,0x64
|
|
/* f0599a8: 5420001e */ bnezl $at,.NB0f059a24
|
|
/* f0599ac: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f0599b0: 84c50000 */ lh $a1,0x0($a2)
|
|
/* f0599b4: 84f90000 */ lh $t9,0x0($a3)
|
|
/* f0599b8: 00e02025 */ or $a0,$a3,$zero
|
|
/* f0599bc: 50b90019 */ beql $a1,$t9,.NB0f059a24
|
|
/* f0599c0: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f0599c4: 0fc12430 */ jal chrGetDistanceToChr
|
|
/* f0599c8: afa60064 */ sw $a2,0x64($sp)
|
|
/* f0599cc: 3c017f1a */ lui $at,0x7f1a
|
|
/* f0599d0: c4244084 */ lwc1 $f4,0x4084($at)
|
|
/* f0599d4: 8fa90098 */ lw $t1,0x98($sp)
|
|
/* f0599d8: 8fa60064 */ lw $a2,0x64($sp)
|
|
/* f0599dc: 4604003c */ c.lt.s $f0,$f4
|
|
/* f0599e0: 252a0001 */ addiu $t2,$t1,0x1
|
|
/* f0599e4: 4502000f */ bc1fl .NB0f059a24
|
|
/* f0599e8: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f0599ec: afaa0098 */ sw $t2,0x98($sp)
|
|
/* f0599f0: 8ccb0120 */ lw $t3,0x120($a2)
|
|
/* f0599f4: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f0599f8: 2961003c */ slti $at,$t3,0x3c
|
|
/* f0599fc: 50200009 */ beqzl $at,.NB0f059a24
|
|
/* f059a00: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f059a04: 91820006 */ lbu $v0,0x6($t4)
|
|
/* f059a08: 240100ff */ addiu $at,$zero,0xff
|
|
/* f059a0c: 50400005 */ beqzl $v0,.NB0f059a24
|
|
/* f059a10: 8fa20088 */ lw $v0,0x88($sp)
|
|
/* f059a14: 10410002 */ beq $v0,$at,.NB0f059a20
|
|
/* f059a18: 240d0001 */ addiu $t5,$zero,0x1
|
|
/* f059a1c: afad0094 */ sw $t5,0x94($sp)
|
|
.NB0f059a20:
|
|
/* f059a20: 8fa20088 */ lw $v0,0x88($sp)
|
|
.NB0f059a24:
|
|
/* f059a24: 2401fffe */ addiu $at,$zero,-2
|
|
/* f059a28: 84440002 */ lh $a0,0x2($v0)
|
|
/* f059a2c: 24420002 */ addiu $v0,$v0,0x2
|
|
/* f059a30: afa20088 */ sw $v0,0x88($sp)
|
|
/* f059a34: 1481ffc5 */ bne $a0,$at,.NB0f05994c
|
|
/* f059a38: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059a3c: 8fae0094 */ lw $t6,0x94($sp)
|
|
.NB0f059a40:
|
|
/* f059a40: 8faf0098 */ lw $t7,0x98($sp)
|
|
/* f059a44: 15c00168 */ bnez $t6,.NB0f059fe8
|
|
/* f059a48: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059a4c: 15e00007 */ bnez $t7,.NB0f059a6c
|
|
/* f059a50: 8fb8009c */ lw $t8,0x9c($sp)
|
|
/* f059a54: 93020006 */ lbu $v0,0x6($t8)
|
|
/* f059a58: 240100ff */ addiu $at,$zero,0xff
|
|
/* f059a5c: 1040000a */ beqz $v0,.NB0f059a88
|
|
/* f059a60: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059a64: 10410008 */ beq $v0,$at,.NB0f059a88
|
|
/* f059a68: 00000000 */ sll $zero,$zero,0x0
|
|
.NB0f059a6c:
|
|
/* f059a6c: 8fb90098 */ lw $t9,0x98($sp)
|
|
/* f059a70: 8fa9009c */ lw $t1,0x9c($sp)
|
|
/* f059a74: 1b20015c */ blez $t9,.NB0f059fe8
|
|
/* f059a78: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059a7c: 912a0006 */ lbu $t2,0x6($t1)
|
|
/* f059a80: 19400159 */ blez $t2,.NB0f059fe8
|
|
/* f059a84: 00000000 */ sll $zero,$zero,0x0
|
|
.NB0f059a88:
|
|
/* f059a88: 0c004d84 */ jal random
|
|
/* f059a8c: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059a90: 24010003 */ addiu $at,$zero,0x3
|
|
/* f059a94: 0041001b */ divu $zero,$v0,$at
|
|
/* f059a98: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f059a9c: 00001810 */ mfhi $v1
|
|
/* f059aa0: a3a300a7 */ sb $v1,0xa7($sp)
|
|
/* f059aa4: 916c0007 */ lbu $t4,0x7($t3)
|
|
/* f059aa8: 8fb80070 */ lw $t8,0x70($sp)
|
|
/* f059aac: 8fae0084 */ lw $t6,0x84($sp)
|
|
/* f059ab0: 318d0080 */ andi $t5,$t4,0x80
|
|
/* f059ab4: 15a00009 */ bnez $t5,.NB0f059adc
|
|
/* f059ab8: 0018c8c0 */ sll $t9,$t8,0x3
|
|
/* f059abc: 01d94821 */ addu $t1,$t6,$t9
|
|
/* f059ac0: 306a00ff */ andi $t2,$v1,0xff
|
|
/* f059ac4: 000a5840 */ sll $t3,$t2,0x1
|
|
/* f059ac8: 012b6021 */ addu $t4,$t1,$t3
|
|
/* f059acc: afa90058 */ sw $t1,0x58($sp)
|
|
/* f059ad0: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f059ad4: 1000000c */ beqz $zero,.NB0f059b08
|
|
/* f059ad8: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.NB0f059adc:
|
|
/* f059adc: 8e0a0424 */ lw $t2,0x424($s0)
|
|
/* f059ae0: 8fae0070 */ lw $t6,0x70($sp)
|
|
/* f059ae4: 8faf0084 */ lw $t7,0x84($sp)
|
|
/* f059ae8: 914902b0 */ lbu $t1,0x2b0($t2)
|
|
/* f059aec: 000ec8c0 */ sll $t9,$t6,0x3
|
|
/* f059af0: 01f91021 */ addu $v0,$t7,$t9
|
|
/* f059af4: 00095840 */ sll $t3,$t1,0x1
|
|
/* f059af8: 004b6021 */ addu $t4,$v0,$t3
|
|
/* f059afc: 858d0002 */ lh $t5,0x2($t4)
|
|
/* f059b00: afa20058 */ sw $v0,0x58($sp)
|
|
/* f059b04: a7ad00a4 */ sh $t5,0xa4($sp)
|
|
.NB0f059b08:
|
|
/* f059b08: 0fc13066 */ jal audioWasNotPlayedRecently
|
|
/* f059b0c: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f059b10: 1440000a */ bnez $v0,.NB0f059b3c
|
|
/* f059b14: 24010001 */ addiu $at,$zero,0x1
|
|
/* f059b18: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059b1c: 00001825 */ or $v1,$zero,$zero
|
|
/* f059b20: 24080001 */ addiu $t0,$zero,0x1
|
|
/* f059b24: 10e00003 */ beqz $a3,.NB0f059b34
|
|
/* f059b28: 3c0e8007 */ lui $t6,0x8007
|
|
/* f059b2c: 10000001 */ beqz $zero,.NB0f059b34
|
|
/* f059b30: 90e302fe */ lbu $v1,0x2fe($a3)
|
|
.NB0f059b34:
|
|
/* f059b34: 5461008a */ bnel $v1,$at,.NB0f059d60
|
|
/* f059b38: 8fad0070 */ lw $t5,0x70($sp)
|
|
.NB0f059b3c:
|
|
/* f059b3c: 0fc13054 */ jal audioMarkAsRecentlyPlayed
|
|
/* f059b40: 87a400a4 */ lh $a0,0xa4($sp)
|
|
/* f059b44: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f059b48: 2401034e */ addiu $at,$zero,0x34e
|
|
/* f059b4c: 93ae006b */ lbu $t6,0x6b($sp)
|
|
/* f059b50: 57010005 */ bnel $t8,$at,.NB0f059b68
|
|
/* f059b54: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f059b58: 15c00002 */ bnez $t6,.NB0f059b64
|
|
/* f059b5c: 240f034d */ addiu $t7,$zero,0x34d
|
|
/* f059b60: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.NB0f059b64:
|
|
/* f059b64: 8e190424 */ lw $t9,0x424($s0)
|
|
.NB0f059b68:
|
|
/* f059b68: 240103f7 */ addiu $at,$zero,0x3f7
|
|
/* f059b6c: af200120 */ sw $zero,0x120($t9)
|
|
/* f059b70: 8faa009c */ lw $t2,0x9c($sp)
|
|
/* f059b74: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f059b78: 91490005 */ lbu $t1,0x5($t2)
|
|
/* f059b7c: a1690126 */ sb $t1,0x126($t3)
|
|
/* f059b80: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059b84: 90ec0332 */ lbu $t4,0x332($a3)
|
|
/* f059b88: 258d0001 */ addiu $t5,$t4,0x1
|
|
/* f059b8c: a0ed0332 */ sb $t5,0x332($a3)
|
|
/* f059b90: 87b800a4 */ lh $t8,0xa4($sp)
|
|
/* f059b94: 13010022 */ beq $t8,$at,.NB0f059c20
|
|
/* f059b98: 24010331 */ addiu $at,$zero,0x331
|
|
/* f059b9c: 13010020 */ beq $t8,$at,.NB0f059c20
|
|
/* f059ba0: 240103a1 */ addiu $at,$zero,0x3a1
|
|
/* f059ba4: 1301001e */ beq $t8,$at,.NB0f059c20
|
|
/* f059ba8: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f059bac: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f059bb0: 3406ffff */ dli $a2,0xffff
|
|
/* f059bb4: 0fc2433d */ jal func0f0926bc
|
|
/* f059bb8: 8dc4001c */ lw $a0,0x1c($t6)
|
|
/* f059bbc: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f059bc0: 3c01bf80 */ lui $at,0xbf80
|
|
/* f059bc4: 44810000 */ mtc1 $at,$f0
|
|
/* f059bc8: 8de5001c */ lw $a1,0x1c($t7)
|
|
/* f059bcc: 2419ffff */ addiu $t9,$zero,-1
|
|
/* f059bd0: 240a0008 */ addiu $t2,$zero,0x8
|
|
/* f059bd4: 24090009 */ addiu $t1,$zero,0x9
|
|
/* f059bd8: 240bffff */ addiu $t3,$zero,-1
|
|
/* f059bdc: afab002c */ sw $t3,0x2c($sp)
|
|
/* f059be0: afa9001c */ sw $t1,0x1c($sp)
|
|
/* f059be4: afaa0014 */ sw $t2,0x14($sp)
|
|
/* f059be8: afb90010 */ sw $t9,0x10($sp)
|
|
/* f059bec: afa00028 */ sw $zero,0x28($sp)
|
|
/* f059bf0: afa00020 */ sw $zero,0x20($sp)
|
|
/* f059bf4: afa00018 */ sw $zero,0x18($sp)
|
|
/* f059bf8: 00002025 */ or $a0,$zero,$zero
|
|
/* f059bfc: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f059c00: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f059c04: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f059c08: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f059c0c: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f059c10: 0fc24762 */ jal func0f0939f8
|
|
/* f059c14: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f059c18: 10000026 */ beqz $zero,.NB0f059cb4
|
|
/* f059c1c: 8faa009c */ lw $t2,0x9c($sp)
|
|
.NB0f059c20:
|
|
/* f059c20: 0fc12df9 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f059c24: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f059c28: 18400003 */ blez $v0,.NB0f059c38
|
|
/* f059c2c: 00021823 */ negu $v1,$v0
|
|
/* f059c30: 10000001 */ beqz $zero,.NB0f059c38
|
|
/* f059c34: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f059c38:
|
|
/* f059c38: 28610033 */ slti $at,$v1,0x33
|
|
/* f059c3c: 1420001c */ bnez $at,.NB0f059cb0
|
|
/* f059c40: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f059c44: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f059c48: 3406ffff */ dli $a2,0xffff
|
|
/* f059c4c: 0fc2433d */ jal func0f0926bc
|
|
/* f059c50: 8d84001c */ lw $a0,0x1c($t4)
|
|
/* f059c54: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f059c58: 3c01bf80 */ lui $at,0xbf80
|
|
/* f059c5c: 44810000 */ mtc1 $at,$f0
|
|
/* f059c60: 8da5001c */ lw $a1,0x1c($t5)
|
|
/* f059c64: 2418ffff */ addiu $t8,$zero,-1
|
|
/* f059c68: 240e0008 */ addiu $t6,$zero,0x8
|
|
/* f059c6c: 240f0009 */ addiu $t7,$zero,0x9
|
|
/* f059c70: 2419ffff */ addiu $t9,$zero,-1
|
|
/* f059c74: afb9002c */ sw $t9,0x2c($sp)
|
|
/* f059c78: afaf001c */ sw $t7,0x1c($sp)
|
|
/* f059c7c: afae0014 */ sw $t6,0x14($sp)
|
|
/* f059c80: afb80010 */ sw $t8,0x10($sp)
|
|
/* f059c84: afa00028 */ sw $zero,0x28($sp)
|
|
/* f059c88: afa00020 */ sw $zero,0x20($sp)
|
|
/* f059c8c: afa00018 */ sw $zero,0x18($sp)
|
|
/* f059c90: 00002025 */ or $a0,$zero,$zero
|
|
/* f059c94: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f059c98: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f059c9c: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f059ca0: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f059ca4: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f059ca8: 0fc24762 */ jal func0f0939f8
|
|
/* f059cac: e7a00024 */ swc1 $f0,0x24($sp)
|
|
.NB0f059cb0:
|
|
/* f059cb0: 8faa009c */ lw $t2,0x9c($sp)
|
|
.NB0f059cb4:
|
|
/* f059cb4: 91420008 */ lbu $v0,0x8($t2)
|
|
/* f059cb8: 10400016 */ beqz $v0,.NB0f059d14
|
|
/* f059cbc: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059cc0: 91490007 */ lbu $t1,0x7($t2)
|
|
/* f059cc4: 93a300a7 */ lbu $v1,0xa7($sp)
|
|
/* f059cc8: 000260c0 */ sll $t4,$v0,0x3
|
|
/* f059ccc: 312b0080 */ andi $t3,$t1,0x80
|
|
/* f059cd0: 15600010 */ bnez $t3,.NB0f059d14
|
|
/* f059cd4: 28610003 */ slti $at,$v1,0x3
|
|
/* f059cd8: 14200002 */ bnez $at,.NB0f059ce4
|
|
/* f059cdc: 3c048007 */ lui $a0,0x8007
|
|
/* f059ce0: 24030002 */ addiu $v1,$zero,0x2
|
|
.NB0f059ce4:
|
|
/* f059ce4: 00036840 */ sll $t5,$v1,0x1
|
|
/* f059ce8: 018dc021 */ addu $t8,$t4,$t5
|
|
/* f059cec: 00982021 */ addu $a0,$a0,$t8
|
|
/* f059cf0: 0fc5a4dd */ jal langGet
|
|
/* f059cf4: 8484bd82 */ lh $a0,-0x427e($a0)
|
|
/* f059cf8: 8fae009c */ lw $t6,0x9c($sp)
|
|
/* f059cfc: 00402025 */ or $a0,$v0,$zero
|
|
/* f059d00: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f059d04: 0fc36d93 */ jal hudmsgCreateWithColour
|
|
/* f059d08: 91c60009 */ lbu $a2,0x9($t6)
|
|
/* f059d0c: 100000b6 */ beqz $zero,.NB0f059fe8
|
|
/* f059d10: 00000000 */ sll $zero,$zero,0x0
|
|
.NB0f059d14:
|
|
/* f059d14: 104000b4 */ beqz $v0,.NB0f059fe8
|
|
/* f059d18: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059d1c: 8e190424 */ lw $t9,0x424($s0)
|
|
/* f059d20: 000278c0 */ sll $t7,$v0,0x3
|
|
/* f059d24: 3c048007 */ lui $a0,0x8007
|
|
/* f059d28: 932a02b0 */ lbu $t2,0x2b0($t9)
|
|
/* f059d2c: 000a4840 */ sll $t1,$t2,0x1
|
|
/* f059d30: 01e95821 */ addu $t3,$t7,$t1
|
|
/* f059d34: 008b2021 */ addu $a0,$a0,$t3
|
|
/* f059d38: 0fc5a4dd */ jal langGet
|
|
/* f059d3c: 8484bd82 */ lh $a0,-0x427e($a0)
|
|
/* f059d40: 8fac009c */ lw $t4,0x9c($sp)
|
|
/* f059d44: 00402025 */ or $a0,$v0,$zero
|
|
/* f059d48: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f059d4c: 0fc36d93 */ jal hudmsgCreateWithColour
|
|
/* f059d50: 91860009 */ lbu $a2,0x9($t4)
|
|
/* f059d54: 100000a4 */ beqz $zero,.NB0f059fe8
|
|
/* f059d58: 00000000 */ sll $zero,$zero,0x0
|
|
/* f059d5c: 8fad0070 */ lw $t5,0x70($sp)
|
|
.NB0f059d60:
|
|
/* f059d60: 25ceb6f8 */ addiu $t6,$t6,-18696
|
|
/* f059d64: a7a000a4 */ sh $zero,0xa4($sp)
|
|
/* f059d68: 000dc0c0 */ sll $t8,$t5,0x3
|
|
/* f059d6c: 030e1021 */ addu $v0,$t8,$t6
|
|
/* f059d70: afa2005c */ sw $v0,0x5c($sp)
|
|
.NB0f059d74:
|
|
/* f059d74: 8fa2005c */ lw $v0,0x5c($sp)
|
|
/* f059d78: 00081840 */ sll $v1,$t0,0x1
|
|
/* f059d7c: 0043c821 */ addu $t9,$v0,$v1
|
|
/* f059d80: 87240000 */ lh $a0,0x0($t9)
|
|
/* f059d84: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059d88: 0fc13066 */ jal audioWasNotPlayedRecently
|
|
/* f059d8c: afa30054 */ sw $v1,0x54($sp)
|
|
/* f059d90: 8fa30054 */ lw $v1,0x54($sp)
|
|
/* f059d94: 1040000d */ beqz $v0,.NB0f059dcc
|
|
/* f059d98: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f059d9c: 8faa0058 */ lw $t2,0x58($sp)
|
|
/* f059da0: 01432821 */ addu $a1,$t2,$v1
|
|
/* f059da4: 84a40000 */ lh $a0,0x0($a1)
|
|
/* f059da8: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059dac: 0fc13066 */ jal audioWasNotPlayedRecently
|
|
/* f059db0: afa50050 */ sw $a1,0x50($sp)
|
|
/* f059db4: 8fa50050 */ lw $a1,0x50($sp)
|
|
/* f059db8: 10400004 */ beqz $v0,.NB0f059dcc
|
|
/* f059dbc: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f059dc0: 84af0000 */ lh $t7,0x0($a1)
|
|
/* f059dc4: 10000006 */ beqz $zero,.NB0f059de0
|
|
/* f059dc8: a7af00a4 */ sh $t7,0xa4($sp)
|
|
.NB0f059dcc:
|
|
/* f059dcc: 25080001 */ addiu $t0,$t0,0x1
|
|
/* f059dd0: 310900ff */ andi $t1,$t0,0xff
|
|
/* f059dd4: 29210004 */ slti $at,$t1,0x4
|
|
/* f059dd8: 1420ffe6 */ bnez $at,.NB0f059d74
|
|
/* f059ddc: 01204025 */ or $t0,$t1,$zero
|
|
.NB0f059de0:
|
|
/* f059de0: 87ab00a4 */ lh $t3,0xa4($sp)
|
|
/* f059de4: 11600076 */ beqz $t3,.NB0f059fc0
|
|
/* f059de8: 01602025 */ or $a0,$t3,$zero
|
|
/* f059dec: 0fc13054 */ jal audioMarkAsRecentlyPlayed
|
|
/* f059df0: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059df4: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f059df8: 2401034e */ addiu $at,$zero,0x34e
|
|
/* f059dfc: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f059e00: 15810004 */ bne $t4,$at,.NB0f059e14
|
|
/* f059e04: 93ad006b */ lbu $t5,0x6b($sp)
|
|
/* f059e08: 15a00002 */ bnez $t5,.NB0f059e14
|
|
/* f059e0c: 2418034d */ addiu $t8,$zero,0x34d
|
|
/* f059e10: a7b800a4 */ sh $t8,0xa4($sp)
|
|
.NB0f059e14:
|
|
/* f059e14: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f059e18: 240103f7 */ addiu $at,$zero,0x3f7
|
|
/* f059e1c: adc00120 */ sw $zero,0x120($t6)
|
|
/* f059e20: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f059e24: 8e0f0424 */ lw $t7,0x424($s0)
|
|
/* f059e28: 932a0005 */ lbu $t2,0x5($t9)
|
|
/* f059e2c: a1ea0126 */ sb $t2,0x126($t7)
|
|
/* f059e30: 8e070424 */ lw $a3,0x424($s0)
|
|
/* f059e34: 90e90332 */ lbu $t1,0x332($a3)
|
|
/* f059e38: 252b0001 */ addiu $t3,$t1,0x1
|
|
/* f059e3c: a0eb0332 */ sb $t3,0x332($a3)
|
|
/* f059e40: 87ac00a4 */ lh $t4,0xa4($sp)
|
|
/* f059e44: 11810024 */ beq $t4,$at,.NB0f059ed8
|
|
/* f059e48: 24010331 */ addiu $at,$zero,0x331
|
|
/* f059e4c: 11810022 */ beq $t4,$at,.NB0f059ed8
|
|
/* f059e50: 240103a1 */ addiu $at,$zero,0x3a1
|
|
/* f059e54: 51810021 */ beql $t4,$at,.NB0f059edc
|
|
/* f059e58: 8e040424 */ lw $a0,0x424($s0)
|
|
/* f059e5c: 8e0d0424 */ lw $t5,0x424($s0)
|
|
/* f059e60: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f059e64: 3406ffff */ dli $a2,0xffff
|
|
/* f059e68: 8da4001c */ lw $a0,0x1c($t5)
|
|
/* f059e6c: 0fc2433d */ jal func0f0926bc
|
|
/* f059e70: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059e74: 8e180424 */ lw $t8,0x424($s0)
|
|
/* f059e78: 3c01bf80 */ lui $at,0xbf80
|
|
/* f059e7c: 44810000 */ mtc1 $at,$f0
|
|
/* f059e80: 8f05001c */ lw $a1,0x1c($t8)
|
|
/* f059e84: 240effff */ addiu $t6,$zero,-1
|
|
/* f059e88: 24190008 */ addiu $t9,$zero,0x8
|
|
/* f059e8c: 240a0009 */ addiu $t2,$zero,0x9
|
|
/* f059e90: 240fffff */ addiu $t7,$zero,-1
|
|
/* f059e94: afaf002c */ sw $t7,0x2c($sp)
|
|
/* f059e98: afaa001c */ sw $t2,0x1c($sp)
|
|
/* f059e9c: afb90014 */ sw $t9,0x14($sp)
|
|
/* f059ea0: afae0010 */ sw $t6,0x10($sp)
|
|
/* f059ea4: afa00028 */ sw $zero,0x28($sp)
|
|
/* f059ea8: afa00020 */ sw $zero,0x20($sp)
|
|
/* f059eac: afa00018 */ sw $zero,0x18($sp)
|
|
/* f059eb0: 00002025 */ or $a0,$zero,$zero
|
|
/* f059eb4: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f059eb8: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f059ebc: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f059ec0: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f059ec4: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f059ec8: 0fc24762 */ jal func0f0939f8
|
|
/* f059ecc: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f059ed0: 1000002a */ beqz $zero,.NB0f059f7c
|
|
/* f059ed4: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.NB0f059ed8:
|
|
/* f059ed8: 8e040424 */ lw $a0,0x424($s0)
|
|
.NB0f059edc:
|
|
/* f059edc: 0fc12df9 */ jal chrGetDistanceLostToTargetInLastSecond
|
|
/* f059ee0: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059ee4: 18400003 */ blez $v0,.NB0f059ef4
|
|
/* f059ee8: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
/* f059eec: 10000002 */ beqz $zero,.NB0f059ef8
|
|
/* f059ef0: 00401825 */ or $v1,$v0,$zero
|
|
.NB0f059ef4:
|
|
/* f059ef4: 00021823 */ negu $v1,$v0
|
|
.NB0f059ef8:
|
|
/* f059ef8: 28610033 */ slti $at,$v1,0x33
|
|
/* f059efc: 54200020 */ bnezl $at,.NB0f059f80
|
|
/* f059f00: 8fb9009c */ lw $t9,0x9c($sp)
|
|
/* f059f04: 8e090424 */ lw $t1,0x424($s0)
|
|
/* f059f08: 24050009 */ addiu $a1,$zero,0x9
|
|
/* f059f0c: 3406ffff */ dli $a2,0xffff
|
|
/* f059f10: 8d24001c */ lw $a0,0x1c($t1)
|
|
/* f059f14: 0fc2433d */ jal func0f0926bc
|
|
/* f059f18: a3a800a3 */ sb $t0,0xa3($sp)
|
|
/* f059f1c: 8e0b0424 */ lw $t3,0x424($s0)
|
|
/* f059f20: 3c01bf80 */ lui $at,0xbf80
|
|
/* f059f24: 44810000 */ mtc1 $at,$f0
|
|
/* f059f28: 8d65001c */ lw $a1,0x1c($t3)
|
|
/* f059f2c: 240cffff */ addiu $t4,$zero,-1
|
|
/* f059f30: 240d0008 */ addiu $t5,$zero,0x8
|
|
/* f059f34: 24180009 */ addiu $t8,$zero,0x9
|
|
/* f059f38: 240effff */ addiu $t6,$zero,-1
|
|
/* f059f3c: afae002c */ sw $t6,0x2c($sp)
|
|
/* f059f40: afb8001c */ sw $t8,0x1c($sp)
|
|
/* f059f44: afad0014 */ sw $t5,0x14($sp)
|
|
/* f059f48: afac0010 */ sw $t4,0x10($sp)
|
|
/* f059f4c: afa00028 */ sw $zero,0x28($sp)
|
|
/* f059f50: afa00020 */ sw $zero,0x20($sp)
|
|
/* f059f54: afa00018 */ sw $zero,0x18($sp)
|
|
/* f059f58: 00002025 */ or $a0,$zero,$zero
|
|
/* f059f5c: 87a600a4 */ lh $a2,0xa4($sp)
|
|
/* f059f60: 2407ffff */ addiu $a3,$zero,-1
|
|
/* f059f64: e7a00038 */ swc1 $f0,0x38($sp)
|
|
/* f059f68: e7a00034 */ swc1 $f0,0x34($sp)
|
|
/* f059f6c: e7a00030 */ swc1 $f0,0x30($sp)
|
|
/* f059f70: 0fc24762 */ jal func0f0939f8
|
|
/* f059f74: e7a00024 */ swc1 $f0,0x24($sp)
|
|
/* f059f78: 93a800a3 */ lbu $t0,0xa3($sp)
|
|
.NB0f059f7c:
|
|
/* f059f7c: 8fb9009c */ lw $t9,0x9c($sp)
|
|
.NB0f059f80:
|
|
/* f059f80: 00087840 */ sll $t7,$t0,0x1
|
|
/* f059f84: 3c048007 */ lui $a0,0x8007
|
|
/* f059f88: 93220008 */ lbu $v0,0x8($t9)
|
|
/* f059f8c: 10400016 */ beqz $v0,.NB0f059fe8
|
|
/* f059f90: 000250c0 */ sll $t2,$v0,0x3
|
|
/* f059f94: 014f4821 */ addu $t1,$t2,$t7
|
|
/* f059f98: 00892021 */ addu $a0,$a0,$t1
|
|
/* f059f9c: 0fc5a4dd */ jal langGet
|
|
/* f059fa0: 8484bd80 */ lh $a0,-0x4280($a0)
|
|
/* f059fa4: 8fab009c */ lw $t3,0x9c($sp)
|
|
/* f059fa8: 00402025 */ or $a0,$v0,$zero
|
|
/* f059fac: 24050006 */ addiu $a1,$zero,0x6
|
|
/* f059fb0: 0fc36d93 */ jal hudmsgCreateWithColour
|
|
/* f059fb4: 91660009 */ lbu $a2,0x9($t3)
|
|
/* f059fb8: 1000000b */ beqz $zero,.NB0f059fe8
|
|
/* f059fbc: 00000000 */ sll $zero,$zero,0x0
|
|
.NB0f059fc0:
|
|
/* f059fc0: 8e0c0424 */ lw $t4,0x424($s0)
|
|
/* f059fc4: 3c050800 */ lui $a1,0x800
|
|
/* f059fc8: 24060001 */ addiu $a2,$zero,0x1
|
|
/* f059fcc: ad800120 */ sw $zero,0x120($t4)
|
|
/* f059fd0: 8fad009c */ lw $t5,0x9c($sp)
|
|
/* f059fd4: 8e0e0424 */ lw $t6,0x424($s0)
|
|
/* f059fd8: 91b80005 */ lbu $t8,0x5($t5)
|
|
/* f059fdc: a1d80126 */ sb $t8,0x126($t6)
|
|
/* f059fe0: 0fc1247e */ jal chrUnsetFlags
|
|
/* f059fe4: 8e040424 */ lw $a0,0x424($s0)
|
|
.NB0f059fe8:
|
|
/* f059fe8: 0fc48d5b */ jal setCurrentPlayerNum
|
|
/* f059fec: 8fa40078 */ lw $a0,0x78($sp)
|
|
/* f059ff0: 8e190438 */ lw $t9,0x438($s0)
|
|
/* f059ff4: 00001025 */ or $v0,$zero,$zero
|
|
/* f059ff8: 272a000a */ addiu $t2,$t9,0xa
|
|
/* f059ffc: ae0a0438 */ sw $t2,0x438($s0)
|
|
.NB0f05a000:
|
|
/* f05a000: 8fbf004c */ lw $ra,0x4c($sp)
|
|
/* f05a004: 8fb00048 */ lw $s0,0x48($sp)
|
|
/* f05a008: 27bd00a8 */ addiu $sp,$sp,0xa8
|
|
/* f05a00c: 03e00008 */ jr $ra
|
|
/* f05a010: 00000000 */ sll $zero,$zero,0x0
|
|
);
|
|
#endif
|
|
|
|
// regalloc difference near 64c
|
|
//bool aiSayQuip(void)
|
|
//{
|
|
// u8 column; // 167
|
|
// s16 audioid; // 164
|
|
// u8 i; // 163
|
|
// u8 *cmd = g_Vars.ailist + g_Vars.aioffset; // 156
|
|
// s32 numnearbychrs; // 152
|
|
// bool issomeonetalking; // 148
|
|
// s32 probability; // 144
|
|
// u32 stack; // 140 - not referenced
|
|
// s16 *chrnums; // 136
|
|
// s16 (*bank)[4]; // 132
|
|
// char *text; // 128
|
|
// struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); // 124
|
|
// u32 prevplayernum = g_Vars.currentplayernum; // 120
|
|
// s32 distance; // 116 - not referenced
|
|
// s32 row = cmd[3]; // 112
|
|
// u32 playernum; // 108 - not referenced
|
|
// u8 headshotted = g_Vars.chrdata->hidden2 & CHRH2FLAG_HEADSHOTTED; // 107
|
|
// struct chrdata *loopchr; // 100
|
|
//
|
|
// // Choose bank
|
|
// // 2c0
|
|
// if (CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) {
|
|
// bank = g_SkedarQuipBank;
|
|
//
|
|
// if (row > 5) {
|
|
// row = 0;
|
|
// }
|
|
// // 2e0
|
|
// } else if (g_Vars.chrdata->headnum == HEAD_MAIAN_S) {
|
|
// bank = g_MaianQuipBank;
|
|
//
|
|
// if (row > 2) {
|
|
// row = random() & 1;
|
|
// }
|
|
// // 324
|
|
// } else if (cmd[7] == 0) {
|
|
// if (g_Vars.chrdata->voicebox > 3) {
|
|
// g_Vars.chrdata->voicebox = 3;
|
|
// }
|
|
//
|
|
// bank = &g_GuardQuipBank[g_Vars.chrdata->voicebox * 41];
|
|
// } else {
|
|
// // 37c
|
|
// bank = g_SpecialQuipBank;
|
|
// }
|
|
//
|
|
// // 37c
|
|
// if (!row && !cmd[4] && !cmd[6]) {
|
|
// g_Vars.chrdata->soundtimer = 0;
|
|
// g_Vars.aioffset += 10;
|
|
// return false;
|
|
// }
|
|
//
|
|
// // 3bc
|
|
// chrnums = teamGetChrIds(g_Vars.chrdata->team);
|
|
// numnearbychrs = 0;
|
|
// issomeonetalking = false;
|
|
// probability = cmd[4];
|
|
//
|
|
// // Make it impossible for Elvis and Jon to use anything but special phrases
|
|
// // 3f0
|
|
// if ((g_Vars.chrdata->headnum == HEAD_ELVIS
|
|
// || g_Vars.chrdata->headnum == HEAD_THEKING
|
|
// || g_Vars.chrdata->headnum == HEAD_ELVIS_GOGS
|
|
// || g_Vars.chrdata->headnum == HEAD_JONATHAN) &&
|
|
// bank != g_SpecialQuipBank) {
|
|
// probability = 0;
|
|
// }
|
|
//
|
|
// // If the person talking is a player, and they've just died,
|
|
// // try using the other coop player.
|
|
// // 420
|
|
// if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
// // 444
|
|
// playernum = propGetPlayerNum(chr->prop);
|
|
//
|
|
// if (g_Vars.coopplayernum >= 0 && g_Vars.players[playernum]->isdead) {
|
|
// // 470
|
|
// if (playernum == g_Vars.bondplayernum) {
|
|
// playernum = g_Vars.coopplayernum;
|
|
// } else {
|
|
// playernum = g_Vars.bondplayernum;
|
|
// }
|
|
// }
|
|
//
|
|
// setCurrentPlayerNum(playernum);
|
|
// }
|
|
//
|
|
// // If soundgap permits talking at this time and probability passes
|
|
// // 494
|
|
// if ((g_Vars.chrdata->soundgap == 0 || g_Vars.chrdata->soundgap * 60 < g_Vars.chrdata->soundtimer)
|
|
// && probability > (u8)random()) {
|
|
// // Try and find a chr in the same squadron who is currently talking
|
|
// // 4dc
|
|
// while (*chrnums != -2) {
|
|
// loopchr = chrFindByLiteralId(*chrnums);
|
|
//
|
|
// if (loopchr && loopchr->model
|
|
// && !chrIsDead(loopchr)
|
|
// && loopchr->actiontype != ACT_DEAD
|
|
// && g_Vars.chrdata->squadron == loopchr->squadron
|
|
// && loopchr->alertness >= 100
|
|
// && g_Vars.chrdata->chrnum != loopchr->chrnum
|
|
// && chrGetDistanceToChr(g_Vars.chrdata, loopchr->chrnum) < 7000) {
|
|
// // 584
|
|
// numnearbychrs++;
|
|
//
|
|
// // 594
|
|
// if (loopchr->soundtimer < 60 && cmd[6] != 0 && cmd[6] != 255) {
|
|
// issomeonetalking = true;
|
|
// }
|
|
// }
|
|
//
|
|
// chrnums++;
|
|
// }
|
|
//
|
|
// // 5dc
|
|
// if (!issomeonetalking &&
|
|
// ((numnearbychrs == 0 && (cmd[6] == 0 || cmd[6] == 255)) ||
|
|
// (numnearbychrs > 0 && cmd[6] > 0))) {
|
|
// column = random() % 3;
|
|
//
|
|
// // 64c
|
|
// if ((cmd[7] & 0x80) == 0) {
|
|
// audioid = bank[row][1 + column];
|
|
// } else {
|
|
// audioid = bank[row][1 + g_Vars.chrdata->tude];
|
|
// }
|
|
//
|
|
// // 6a0
|
|
// if (audioWasNotPlayedRecently(audioid) || CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) {
|
|
// // 6d4
|
|
// audioMarkAsRecentlyPlayed(audioid);
|
|
//
|
|
// // 6e8
|
|
// // Replace gurgle with "why me"
|
|
// if (audioid == 0x34e && !headshotted) {
|
|
// audioid = 0x34d;
|
|
// }
|
|
//
|
|
// // 700
|
|
// g_Vars.chrdata->soundtimer = 0;
|
|
// g_Vars.chrdata->soundgap = cmd[5];
|
|
// g_Vars.chrdata->propsoundcount++;
|
|
//
|
|
// // 72c
|
|
// if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) {
|
|
// func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff);
|
|
// // 7a8
|
|
// func0f0939f8(0, g_Vars.chrdata->prop, audioid, -1,
|
|
// -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1);
|
|
// } else {
|
|
// // Audio is "Stop moving", "Stop dodging" or "Stand still"
|
|
// distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata);
|
|
//
|
|
// if (ABS(distance) > 50) {
|
|
// func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff);
|
|
// // 840
|
|
// func0f0939f8(0, g_Vars.chrdata->prop, audioid, -1,
|
|
// -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1);
|
|
// }
|
|
// }
|
|
//
|
|
// // Consider putting text on screen
|
|
// // Note: if cmd[8] is 0 then it means no text, so the value
|
|
// // needs to be be decremented by one so it's 0-indexed.
|
|
// // 850
|
|
// if (cmd[8] && (cmd[7] & 0x80) == 0) {
|
|
// if (column > 2) {
|
|
// column = 2;
|
|
// }
|
|
//
|
|
// text = langGet(g_QuipTexts[cmd[8] - 1][1 + column]);
|
|
//
|
|
// if (!sndIsFiltered(audioid)) {
|
|
// // 8ac
|
|
// hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]);
|
|
// }
|
|
// } else if (cmd[8]) {
|
|
// text = langGet(g_QuipTexts[cmd[8] - 1][1 + g_Vars.chrdata->tude]);
|
|
//
|
|
// if (!sndIsFiltered(audioid)) {
|
|
// // 904
|
|
// hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]);
|
|
// }
|
|
// }
|
|
// } else {
|
|
// // Audio was played recently - try and find a different one
|
|
// audioid = 0;
|
|
//
|
|
// // 92c
|
|
// for (i = 1; i < 4; i++) {
|
|
// if (audioWasNotPlayedRecently(g_GuardQuipBank[row][i])
|
|
// && audioWasNotPlayedRecently(bank[row][i])) {
|
|
// audioid = bank[row][i];
|
|
// break;
|
|
// }
|
|
// }
|
|
//
|
|
// // 99c
|
|
// if (audioid) {
|
|
// audioMarkAsRecentlyPlayed(audioid);
|
|
//
|
|
// // Replace gurgle with "why me"
|
|
// if (audioid == 0x34e && !headshotted) {
|
|
// audioid = 0x34d;
|
|
// }
|
|
//
|
|
// g_Vars.chrdata->soundtimer = 0;
|
|
// g_Vars.chrdata->soundgap = cmd[5];
|
|
// g_Vars.chrdata->propsoundcount++;
|
|
//
|
|
// // 9fc
|
|
// if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) {
|
|
// func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff);
|
|
// // a80
|
|
// func0f0939f8(0, g_Vars.chrdata->prop, audioid, -1,
|
|
// -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1);
|
|
// } else {
|
|
// // Audio is "Stop moving", "Stop dodging" or "Stand still"
|
|
// // a90
|
|
// distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata);
|
|
//
|
|
// if (ABS(distance) > 50) {
|
|
// func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff);
|
|
// // b28
|
|
// func0f0939f8(0, g_Vars.chrdata->prop, audioid, -1,
|
|
// -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1);
|
|
// }
|
|
// }
|
|
//
|
|
// // b44
|
|
// if (cmd[8]) {
|
|
// text = langGet(g_QuipTexts[cmd[8] - 1][i]);
|
|
//
|
|
// if (!sndIsFiltered(audioid)) {
|
|
// // b78
|
|
// hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]);
|
|
// }
|
|
// }
|
|
// } else {
|
|
// g_Vars.chrdata->soundtimer = 0;
|
|
// g_Vars.chrdata->soundgap = cmd[5];
|
|
// chrUnsetFlags(g_Vars.chrdata, CHRFLAG1_TALKINGTODISGUISE, BANK_1);
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// setCurrentPlayerNum(prevplayernum);
|
|
//
|
|
// g_Vars.aioffset += 10;
|
|
//
|
|
// return false;
|
|
//}
|
|
|
|
void func0f05abdc(struct prop *prop)
|
|
{
|
|
if (prop && prop->chr && prop->chr->model && prop->chr->propsoundcount > 0) {
|
|
prop->chr->propsoundcount--;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a7
|
|
*/
|
|
bool aiIfChrNotTalking(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindByLiteralId(cmd[2]);
|
|
|
|
if (chr && chr->propsoundcount == 0) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0131
|
|
*/
|
|
bool aiIncreaseSquadronAlertness(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
|
|
|
|
for (; *chrnums != -2; chrnums++) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr &&
|
|
chr->model &&
|
|
!chrIsDead(chr) &&
|
|
chr->actiontype != ACT_DEAD &&
|
|
(g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 255) &&
|
|
g_Vars.chrdata->chrnum != chr->chrnum &&
|
|
(chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 1000 || chrHasFlag(g_Vars.chrdata, CHRFLAG0_SQUADALERTANYDIST, BANK_0))) {
|
|
incrementByte(&chr->alertness, cmd[2]);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0132
|
|
*/
|
|
bool aiSetAction(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
g_Vars.chrdata->myaction = cmd->b2;
|
|
|
|
if (cmd->b3 == 0) {
|
|
g_Vars.chrdata->orders = 0;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0133
|
|
*/
|
|
bool aiSetTeamOrders(void)
|
|
{
|
|
struct chrnumaction *chraction;
|
|
s32 chrcount = 1;
|
|
s16 *chrnums;
|
|
struct chrnumaction chractions[50];
|
|
s32 num;
|
|
u32 stack;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
// Get list of chrs in the current chr's squadron
|
|
chrnums = squadronGetChrIds(g_Vars.chrdata->squadron);
|
|
|
|
// Iterate chrs in squadron and build list of their actions.
|
|
// Put the current chr's action first.
|
|
chraction = chractions;
|
|
chraction->chrnum = g_Vars.chrdata->chrnum;
|
|
chraction->myaction = g_Vars.chrdata->myaction;
|
|
chraction++;
|
|
|
|
if (chrnums) {
|
|
while (*chrnums != -2) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->model
|
|
&& !chrIsDead(chr)
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS)
|
|
&& g_Vars.chrdata->chrnum != chr->chrnum) {
|
|
if (chr->myaction == MA_COVERWAIT
|
|
|| chr->myaction == MA_NORMAL
|
|
|| chr->myaction == MA_WAITING
|
|
|| chr->myaction == MA_SHOOTING) {
|
|
if (chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) {
|
|
chrcount++;
|
|
chraction->chrnum = chr->chrnum;
|
|
chraction->myaction = chr->myaction;
|
|
chraction++;
|
|
}
|
|
}
|
|
}
|
|
|
|
chrnums++;
|
|
}
|
|
}
|
|
|
|
chraction->myaction = MA_END;
|
|
|
|
// Iterate the list of chrs and decide how to reassign orders to them
|
|
// based on the current chr's action
|
|
if (chrcount != 1) {
|
|
chraction = &chractions[1];
|
|
num = 1;
|
|
|
|
while (chraction->myaction != MA_END) {
|
|
struct chrdata *chr = chrFindByLiteralId(chraction->chrnum);
|
|
|
|
switch (chractions[0].myaction) {
|
|
case MA_COVERGOTO:
|
|
if (!chrIsInTargetsFovX(chr, 45)) {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
break;
|
|
case MA_COVERBREAK:
|
|
if (!chrIsInTargetsFovX(chr, 30)) {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
num++;
|
|
break;
|
|
case MA_COVERSEEN:
|
|
if (!chrIsInTargetsFovX(chr, 30)) {
|
|
chr->orders = MA_SHOOTING;
|
|
g_Vars.chrdata->orders = MA_COVERGOTO;
|
|
}
|
|
num++;
|
|
break;
|
|
case MA_FLANKLEFT:
|
|
if (chrIsInTargetsFovX(chr, 50)) {
|
|
chr->orders = MA_FLANKRIGHT;
|
|
} else {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
num++;
|
|
g_Vars.chrdata->orders = MA_FLANKLEFT;
|
|
break;
|
|
case MA_FLANKRIGHT:
|
|
if (chrIsInTargetsFovX(chr, 50)) {
|
|
chr->orders = MA_FLANKLEFT;
|
|
} else {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
num++;
|
|
g_Vars.chrdata->orders = MA_FLANKRIGHT;
|
|
break;
|
|
case MA_DODGE:
|
|
if (!chrIsInTargetsFovX(chr, 30) &&
|
|
chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
|
|
chr->orders = MA_WITHDRAW;
|
|
} else {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
num++;
|
|
break;
|
|
case MA_GRENADE:
|
|
if (num < 2) {
|
|
chr->orders = MA_WAITING;
|
|
} else if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
|
|
chr->orders = MA_WITHDRAW;
|
|
}
|
|
num++;
|
|
break;
|
|
case MA_WAITSEEN:
|
|
if (chrIsInTargetsFovX(chr, 30) &&
|
|
chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
|
|
chr->orders = MA_WITHDRAW;
|
|
} else {
|
|
chr->orders = MA_SHOOTING;
|
|
}
|
|
num++;
|
|
break;
|
|
case MA_WITHDRAW:
|
|
if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) {
|
|
chr->orders = MA_WITHDRAW;
|
|
}
|
|
break;
|
|
}
|
|
|
|
chraction++;
|
|
}
|
|
|
|
if (num != 1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0134
|
|
*/
|
|
bool aiIfOrders(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
|
|
if (g_Vars.chrdata->orders == cmd->b3) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b4);
|
|
|
|
if (g_Vars.chrdata->orders == MA_WITHDRAW) {
|
|
// empty
|
|
}
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0135
|
|
*/
|
|
bool aiIfHasOrders(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->orders) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0136
|
|
*/
|
|
bool aiRetreat(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (cmd[3] == 0) {
|
|
chrRunFromPos(g_Vars.chrdata, cmd[2], (cmd[2] & 0x10) ? 400.0f : 10000.0f, &g_Vars.chrdata->runfrompos);
|
|
} else if (cmd[3] == 1) {
|
|
struct prop *target = chrGetTargetProp(g_Vars.chrdata);
|
|
chrRunFromPos(g_Vars.chrdata, cmd[2], 10000, &target->pos);
|
|
} else {
|
|
chrAssignCoverByCriteria(g_Vars.chrdata,
|
|
COVERCRITERIA_FURTHEREST
|
|
| COVERCRITERIA_DISTTOTARGET
|
|
| COVERCRITERIA_ONLYNEIGHBOURINGROOMS
|
|
| COVERCRITERIA_ROOMSFROMME, 0);
|
|
chrGoToCover(g_Vars.chrdata, cmd[2]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0137
|
|
*/
|
|
bool aiIfChrInSquadronDoingAction(void)
|
|
{
|
|
s32 ret;
|
|
s16 *chrnums = squadronGetChrIds(g_Vars.chrdata->squadron);
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
ret = 1;
|
|
|
|
if (chrnums) {
|
|
for (; *chrnums != -2; chrnums++) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->model && chrIsDead(chr) == false &&
|
|
chr->actiontype != ACT_DEAD &&
|
|
chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS) &&
|
|
g_Vars.chrdata->chrnum != chr->chrnum &&
|
|
chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500 &&
|
|
chr->myaction == cmd->b2) {
|
|
ret = 2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret != 1) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b3);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0139
|
|
*/
|
|
bool ai0139(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
struct coord pos;
|
|
|
|
func0f04c874(g_Vars.chrdata, flags, &pos, cmd[7], cmd[6]);
|
|
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013a
|
|
*/
|
|
bool aiSetChrPresetToUnalertedTeammate(void)
|
|
{
|
|
f32 closest_distance = 30999.9;
|
|
s16 candidate_chrnum = -1;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team);
|
|
|
|
if (g_Vars.chrdata->talktimer > PALDOWN(480) && g_Vars.chrdata->listening) {
|
|
g_Vars.chrdata->listening = 0;
|
|
}
|
|
|
|
for (; *chrnums != -2; chrnums++) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (cmd[3] == 0 && chr && chr->model &&
|
|
chrIsDead(chr) == false &&
|
|
chr->actiontype != ACT_DEAD &&
|
|
chr->actiontype != ACT_DIE &&
|
|
chr->actiontype != ACT_DRUGGEDKO &&
|
|
chr->actiontype != ACT_DRUGGEDDROP &&
|
|
chr->actiontype != ACT_DRUGGEDCOMINGUP &&
|
|
chr->alertness < 100 &&
|
|
(g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 0xff) &&
|
|
g_Vars.chrdata->chrnum != chr->chrnum) {
|
|
|
|
f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum);
|
|
|
|
if (distance < closest_distance &&
|
|
(distance < 100.0f * (s32)cmd[2] || cmd[2] == 0) &&
|
|
distance < closest_distance) {
|
|
closest_distance = distance;
|
|
|
|
if (cmd[3] != 1) {
|
|
candidate_chrnum = chr->chrnum;
|
|
} else if (distance > 200) {
|
|
candidate_chrnum = chr->chrnum;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (candidate_chrnum != -1) {
|
|
chrSetChrPreset(g_Vars.chrdata, candidate_chrnum);
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013b
|
|
*/
|
|
bool aiSetSquadron(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.chrdata->squadron = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013c
|
|
*/
|
|
bool aiFaceCover(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrFaceCover(g_Vars.chrdata)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013d
|
|
*/
|
|
bool aiIfDangerousObjectNearby(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrDetectDangerousObject(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013e
|
|
*/
|
|
bool ai013e(void)
|
|
{
|
|
if (func0f03aca0(g_Vars.chrdata, 400, true) == 0 && chrAssignCoverAwayFromDanger(g_Vars.chrdata, 1000, 12000) != -1) {
|
|
chrGoToCover(g_Vars.chrdata, SPEED_RUN);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 013f
|
|
*/
|
|
bool aiIfHeliWeaponsArmed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.hovercar) {
|
|
if (g_Vars.hovercar->weaponsarmed) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0140
|
|
*/
|
|
bool aiIfHoverbotNextStep(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.hovercar) {
|
|
if ((g_Vars.hovercar->nextstep > cmd[3] && cmd[2] == 1) ||
|
|
(g_Vars.hovercar->nextstep < cmd[3] && cmd[2] == 0)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0141
|
|
*/
|
|
bool aiShuffleInvestigationTerminals(void)
|
|
{
|
|
// 2 = goodtag
|
|
// 3 = badtag
|
|
// 4 = pc1
|
|
// 5 = pc2
|
|
// 6 = pc3
|
|
// 7 = pc4
|
|
// 8 = always 00
|
|
|
|
u8 rand1;
|
|
u8 rand2;
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct tag *goodtag = tagFindById(cmd[2]);
|
|
struct tag *badtag = tagFindById(cmd[3]);
|
|
struct tag *pc;
|
|
|
|
/**
|
|
* @bug: These should be using modulus 4. Because it's 1 short, the final
|
|
* else conditions are unreachable so only 3 of the 4 terminals can be
|
|
* selected as the destination.
|
|
*/
|
|
rand1 = random() % 3;
|
|
rand2 = random() % 3;
|
|
|
|
if (cmd[8] == 0) {
|
|
// Place the good terminal
|
|
if (rand1 == 0) {
|
|
pc = tagFindById(cmd[4]);
|
|
goodtag->cmdoffset = pc->cmdoffset;
|
|
goodtag->obj = pc->obj;
|
|
} else if (rand1 == 1) {
|
|
pc = tagFindById(cmd[5]);
|
|
goodtag->cmdoffset = pc->cmdoffset;
|
|
goodtag->obj = pc->obj;
|
|
} else if (rand1 == 2) {
|
|
pc = tagFindById(cmd[6]);
|
|
goodtag->cmdoffset = pc->cmdoffset;
|
|
goodtag->obj = pc->obj;
|
|
} else {
|
|
pc = tagFindById(cmd[7]);
|
|
goodtag->cmdoffset = pc->cmdoffset;
|
|
goodtag->obj = pc->obj;
|
|
}
|
|
|
|
// Handle both good and alarm terminals having the same destination
|
|
if (rand2 == rand1 && rand2 > 0) {
|
|
rand2--;
|
|
} else if (rand2 == rand1 && rand2 < 3) {
|
|
rand2++;
|
|
}
|
|
|
|
// Place the alarm terminal
|
|
if (rand2 == 0) {
|
|
pc = tagFindById(cmd[4]);
|
|
badtag->cmdoffset = pc->cmdoffset;
|
|
badtag->obj = pc->obj;
|
|
} else if (rand2 == 1) {
|
|
pc = tagFindById(cmd[5]);
|
|
badtag->cmdoffset = pc->cmdoffset;
|
|
badtag->obj = pc->obj;
|
|
} else if (rand2 == 2) {
|
|
pc = tagFindById(cmd[6]);
|
|
badtag->cmdoffset = pc->cmdoffset;
|
|
badtag->obj = pc->obj;
|
|
} else {
|
|
pc = tagFindById(cmd[7]);
|
|
badtag->cmdoffset = pc->cmdoffset;
|
|
badtag->obj = pc->obj;
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 9;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Used by the blow command, which makes Investigation scientists run to the
|
|
* computer terminals. The number of the left is the pad that the terminal sits
|
|
* on, and the number on the right is the pad that the scientist will run to
|
|
* when running to the terminal.
|
|
*/
|
|
u16 g_InvestigationPadMap[] = {
|
|
0x0246, 0x007b,
|
|
0x0247, 0x007d,
|
|
0x0248, 0x007e,
|
|
0x0249, 0x007c,
|
|
0x024a, 0x0093,
|
|
0x024b, 0x0091,
|
|
0x024c, 0x0092,
|
|
0x024d, 0x0093,
|
|
0x024e, 0x00ae,
|
|
0x024f, 0x00ac,
|
|
0x0250, 0x00ab,
|
|
0x0251, 0x00ad,
|
|
0x0252, 0x00a1,
|
|
0x0253, 0x009f,
|
|
0x0254, 0x00a0,
|
|
0x0255, 0x009e,
|
|
0x0256, 0x00bb,
|
|
0x0257, 0x00b8,
|
|
0x0258, 0x00b9,
|
|
0x0259, 0x00ba,
|
|
};
|
|
|
|
/**
|
|
* @cmd 0142
|
|
*/
|
|
bool aiSetPadPresetToInvestigationTerminal(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj) {
|
|
s16 objpad = obj->pad;
|
|
s32 i;
|
|
|
|
for (i = 0; i < sizeof(g_InvestigationPadMap) / sizeof(g_InvestigationPadMap[0]); i += 2) {
|
|
if (objpad == g_InvestigationPadMap[i]) {
|
|
chrSetPadPreset(g_Vars.chrdata, g_InvestigationPadMap[i + 1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0143
|
|
*/
|
|
bool aiHeliArmWeapons(void)
|
|
{
|
|
if (g_Vars.hovercar) {
|
|
chopperSetArmed(g_Vars.hovercar, true);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0144
|
|
*/
|
|
bool aiHeliUnarmWeapons(void)
|
|
{
|
|
if (g_Vars.hovercar) {
|
|
chopperSetArmed(g_Vars.hovercar, false);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0145
|
|
*/
|
|
bool aiRebuildTeams(void)
|
|
{
|
|
rebuildTeams();
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0146
|
|
*/
|
|
bool aiRebuildSquadrons(void)
|
|
{
|
|
rebuildSquadrons();
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0147
|
|
*/
|
|
bool aiIfSquadronIsDead(void)
|
|
{
|
|
/**
|
|
* @bug: anyalive is initialised to true here, and reset to false in each
|
|
* loop iteration. This causes it to use the last chr's status only.
|
|
*/
|
|
u32 stack[2];
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bool anyalive = true;
|
|
s16 *chrnums = squadronGetChrIds(cmd[2]);
|
|
|
|
if (chrnums) {
|
|
while (*chrnums != -2) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->model) {
|
|
anyalive = false;
|
|
|
|
if (!chrIsDead(chr) && chr->actiontype != ACT_DEAD) {
|
|
anyalive = true;
|
|
}
|
|
}
|
|
|
|
chrnums++;
|
|
}
|
|
}
|
|
|
|
if (!anyalive) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0148
|
|
*/
|
|
bool aiChrSetListening(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->listening == 0) {
|
|
chr->listening = cmd[3];
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0149
|
|
*/
|
|
bool aiIfChrListening(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd->b2);
|
|
|
|
if (cmd->b4 == 0) {
|
|
if (chr->listening == cmd->b3) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b5);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
} else {
|
|
if (g_Vars.chrdata->convtalk == 0) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b5);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 014a
|
|
*/
|
|
bool aiIfTrue(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 014b
|
|
*/
|
|
bool aiIfNotListening(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata->listening == 0) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0157
|
|
*/
|
|
bool aiSetTintedGlassEnabled(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_TintedGlassEnabled = cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0152
|
|
*/
|
|
bool aiIfNumChrsInSquadronGreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s32 count = 0;
|
|
s16 *chrnums = squadronGetChrIds(cmd[3]);
|
|
|
|
if (chrnums) {
|
|
while (*chrnums != -2) {
|
|
struct chrdata *chr = chrFindByLiteralId(*chrnums);
|
|
|
|
if (chr && chr->prop && chrIsDead(chr) == false
|
|
&& chr->actiontype != ACT_DEAD
|
|
&& chr->actiontype != ACT_DRUGGEDKO
|
|
&& chr->actiontype != ACT_DRUGGEDDROP
|
|
&& chr->actiontype != ACT_DRUGGEDCOMINGUP) {
|
|
count++;
|
|
}
|
|
|
|
chrnums++;
|
|
}
|
|
}
|
|
|
|
if (count > cmd[2]) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0165
|
|
*/
|
|
bool aiIfChrInjured(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && (chr->chrflags & CHRCFLAG_INJUREDTARGET)) {
|
|
chr->chrflags &= ~CHRCFLAG_INJUREDTARGET;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0166
|
|
*/
|
|
bool aiIfAction(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
|
|
if (g_Vars.chrdata->myaction == cmd->b2) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b3);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0167
|
|
*/
|
|
bool aiHovercopterFireRocket(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
chopperFireRocket(g_Vars.hovercar, cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0169
|
|
*/
|
|
bool aiIfNaturalAnim(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
|
|
if (g_Vars.chrdata->naturalanim == cmd->b2) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b3);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016a
|
|
*/
|
|
bool aiIfY(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = NULL;
|
|
f32 cutoff_y = ((cmd[4] | (cmd[3] << 8)) << 16) >> 16;
|
|
|
|
if (cmd[2] == CHR_TARGET && g_Vars.hovercar) {
|
|
struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar);
|
|
|
|
if (chopper) {
|
|
struct prop *target = chopperGetTargetProp(chopper);
|
|
|
|
if (target && (target->type == PROPTYPE_CHR || target->type == PROPTYPE_PLAYER)) {
|
|
chr = target->chr;
|
|
}
|
|
}
|
|
} else {
|
|
chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
}
|
|
|
|
if (chr && chr->prop && (
|
|
(chr->prop->pos.y < cutoff_y && cmd[5] == 0) ||
|
|
(chr->prop->pos.y > cutoff_y && cmd[5] == 1))) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016c
|
|
*/
|
|
bool aiNoOp016c(void)
|
|
{
|
|
g_Vars.aioffset += 2;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016d
|
|
*/
|
|
bool aiChrAdjustMotionBlur(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
if (cmd[4] == 0) {
|
|
chr->blurdrugamount -= PALDOWN(cmd[3]);
|
|
} else {
|
|
chr->blurdrugamount += PALDOWN(cmd[3]);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016e
|
|
*/
|
|
bool aiDamageChrByAmount(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct coord coord = {0, 0, 0};
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop) {
|
|
if (cmd[4] == 2) {
|
|
struct gset gset = {WEAPON_COMBATKNIFE, 0, 0, FUNC_POISON};
|
|
chrDamageByMisc(chr, (s32)cmd[3] * 0.03125f, &coord, &gset, NULL);
|
|
} else if (cmd[4] == 0) {
|
|
chrDamageByMisc(chr, (s32)cmd[3] * 0.03125f, &coord, NULL, NULL);
|
|
} else {
|
|
chrDamageByMisc(chr, (s32)cmd[3] * -0.03125f, &coord, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 016f
|
|
*/
|
|
bool aiIfChrHasGun(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->model && chr->gunprop == NULL) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0170
|
|
*/
|
|
bool aiDoGunCommand(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon;
|
|
|
|
if (cmd[2] == 0 || ((weapon->base.hidden & OBJHFLAG_AIRBORNE) == 0 && cmd[2] == 1)) {
|
|
if (cmd[2] == 0) {
|
|
chrGoToProp(g_Vars.chrdata, g_Vars.chrdata->gunprop, SPEED_JOG);
|
|
}
|
|
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0171
|
|
*/
|
|
bool aiIfDistanceToGunLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
f32 xdiff = 0;
|
|
f32 ydiff = 0;
|
|
f32 zdiff = 0;
|
|
|
|
if (g_Vars.chrdata->gunprop) {
|
|
xdiff = g_Vars.chrdata->prop->pos.x - g_Vars.chrdata->gunprop->pos.x;
|
|
ydiff = g_Vars.chrdata->prop->pos.y - g_Vars.chrdata->gunprop->pos.y;
|
|
zdiff = g_Vars.chrdata->prop->pos.z - g_Vars.chrdata->gunprop->pos.z;
|
|
}
|
|
|
|
if (ydiff < 200 && ydiff > -200 &&
|
|
xdiff < distance && xdiff > -distance &&
|
|
zdiff < distance && zdiff > -distance) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0172
|
|
*/
|
|
bool aiRecoverGun(void)
|
|
{ \
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct prop *prop = g_Vars.chrdata->gunprop;
|
|
g_Vars.chrdata->gunprop = NULL;
|
|
|
|
if (prop && prop->obj && prop->parent == NULL && prop->type == PROPTYPE_WEAPON) {
|
|
propDeregisterRooms(prop);
|
|
propDelist(prop);
|
|
propDisable(prop);
|
|
chrEquipWeapon(prop->weapon, g_Vars.chrdata);
|
|
}
|
|
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
|
|
if (1);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0173
|
|
*/
|
|
bool aiChrCopyProperties(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->model) {
|
|
g_Vars.chrdata->hearingscale = chr->hearingscale;
|
|
g_Vars.chrdata->visionrange = chr->visionrange;
|
|
g_Vars.chrdata->padpreset1 = chr->padpreset1;
|
|
g_Vars.chrdata->chrpreset1 = chr->chrpreset1;
|
|
g_Vars.chrdata->flags = chr->flags;
|
|
g_Vars.chrdata->flags2 = chr->flags2;
|
|
g_Vars.chrdata->team = chr->team;
|
|
g_Vars.chrdata->squadron = chr->squadron;
|
|
|
|
// @bug? Copying from self to self
|
|
g_Vars.chrdata->accuracyrating = g_Vars.chrdata->accuracyrating;
|
|
g_Vars.chrdata->speedrating = g_Vars.chrdata->speedrating;
|
|
|
|
g_Vars.chrdata->naturalanim = chr->naturalanim;
|
|
g_Vars.chrdata->myspecial = chr->myspecial;
|
|
g_Vars.chrdata->yvisang = chr->yvisang;
|
|
g_Vars.chrdata->teamscandist = chr->teamscandist;
|
|
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0177
|
|
*/
|
|
bool aiPlayerAutoWalk(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 pad_id = cmd[4] | (cmd[3] << 8);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
currentPlayerAutoWalk(pad_id, cmd[5], cmd[6], cmd[7], cmd[8]);
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 9;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0178
|
|
*/
|
|
bool aiIfPlayerAutoWalkFinished(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bool walking = false;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (g_Vars.tickmode == TICKMODE_AUTOWALK) {
|
|
walking = true;
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (walking) {
|
|
g_Vars.aioffset += 4;
|
|
} else {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0181
|
|
*/
|
|
bool aiIfPlayerLookingAtObject(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
bool pass = false;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (g_Vars.currentplayer->lookingatprop.prop == obj->prop) {
|
|
pass = true;
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0182
|
|
*/
|
|
bool aiPunchOrKick(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.chrdata && chrTryPunch(g_Vars.chrdata, cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0183
|
|
*/
|
|
bool aiIfTargetIsPlayer(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct prop *target = chrGetTargetProp(g_Vars.chrdata);
|
|
|
|
if (target->type == PROPTYPE_EYESPY || target->type == PROPTYPE_PLAYER) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0184
|
|
*/
|
|
bool ai0184(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
chrTryAttackAmount(g_Vars.chrdata, 512, 0, cmd[2], cmd[3]);
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0186
|
|
*/
|
|
bool aiIfSoundTimer(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s32 value = PALDOWN(cmd[3] | (cmd[2] << 8));
|
|
|
|
if ((g_Vars.chrdata->soundtimer > value && cmd[4] == 0) ||
|
|
(g_Vars.chrdata->soundtimer < value && cmd[4] == 1)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0187
|
|
*/
|
|
bool aiSetTargetToEyespyIfInSight(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 prevtarget = g_Vars.chrdata->target;
|
|
struct eyespy *eyespy = g_Vars.players[g_Vars.chrdata->p1p2]->eyespy;
|
|
|
|
if (eyespy) {
|
|
struct chrdata *chr = eyespy->prop->chr;
|
|
g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum);
|
|
|
|
if (chrCheckTargetInSight(g_Vars.chrdata)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
g_Vars.chrdata->target = prevtarget;
|
|
}
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0188
|
|
*/
|
|
bool aiIfLiftStationary(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_LIFT) {
|
|
struct liftobj *lift = (struct liftobj *)obj;
|
|
|
|
if ((obj->flags & OBJFLAG_DEACTIVATED) || lift->dist == 0) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0189
|
|
*/
|
|
bool aiLiftGoToStop(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_LIFT) {
|
|
struct liftobj *lift = (struct liftobj *)obj;
|
|
liftGoToStop(lift, cmd[3]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018a
|
|
*/
|
|
bool aiIfLiftAtStop(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
struct defaultobj *obj = objFindByTagId(cmd->b2);
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_LIFT) {
|
|
struct liftobj *lift = (struct liftobj *)obj;
|
|
|
|
if (lift->levelcur == cmd->b3 && lift->dist == 0) {
|
|
pass = true;
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b4);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018b
|
|
*/
|
|
bool aiConfigureRain(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
weatherConfigureRain(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b6
|
|
*/
|
|
bool aiConfigureSnow(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
weatherConfigureSnow(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018c
|
|
*/
|
|
bool aiChrToggleModelPart(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chrToggleModelPart(chr, cmd[3]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018d
|
|
*/
|
|
bool aiActivateLift(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
|
|
if (obj && obj->prop) {
|
|
liftActivate(obj->prop, cmd[2]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018e
|
|
*/
|
|
bool aiMiniSkedarTryPounce(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 thing = cmd[4] | (cmd[3] << 8);
|
|
|
|
if (chrTrySkJump(g_Vars.chrdata, g_Vars.chrdata->pouncebits, cmd[2], thing, cmd[5])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[6]);
|
|
} else {
|
|
g_Vars.aioffset += 7;
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 018f
|
|
*/
|
|
bool aiIfObjectDistanceToPadLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (f32)(cmd[4] | (cmd[3] << 8)) * 10;
|
|
f32 xdiff;
|
|
f32 ydiff;
|
|
f32 zdiff;
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 pad_id = (cmd[6] | (cmd[5] << 8)) & 0xffff;
|
|
#else
|
|
u16 pad_id = cmd[6] | (cmd[5] << 8);
|
|
#endif
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
struct pad pad;
|
|
bool pass = false;
|
|
|
|
if (obj && obj->prop) {
|
|
pad_id = chrResolvePadId(g_Vars.chrdata, pad_id);
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
if (pad_id >= 0)
|
|
#endif
|
|
{
|
|
padUnpack(pad_id, PADFIELD_POS, &pad);
|
|
xdiff = obj->prop->pos.x - pad.pos.x;
|
|
ydiff = obj->prop->pos.y - pad.pos.y;
|
|
zdiff = obj->prop->pos.z - pad.pos.z;
|
|
|
|
if (ydiff < 200 && ydiff > -200 &&
|
|
xdiff < distance && xdiff > -distance &&
|
|
zdiff < distance && zdiff > -distance) {
|
|
pass = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pass) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[7]);
|
|
} else {
|
|
g_Vars.aioffset += 8;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0190
|
|
*/
|
|
bool aiSetSavefileFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
gamefileSetFlag(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0191
|
|
*/
|
|
bool aiUnsetSavefileFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
gamefileUnsetFlag(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0192
|
|
*/
|
|
bool aiIfSavefileFlagIsSet(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (gamefileHasFlag(cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 0193
|
|
*/
|
|
bool aiIfSavefileFlagIsUnset(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (!gamefileHasFlag(cmd[2])) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 019e
|
|
*/
|
|
bool aiIfObjHealthLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s32 damage = cmd[4] | (cmd[3] << 8);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
bool condition_passes = false;
|
|
|
|
if (obj && obj->prop && obj->damage < damage) {
|
|
condition_passes = true;
|
|
}
|
|
|
|
if (condition_passes) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[5]);
|
|
} else {
|
|
g_Vars.aioffset += 6;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 019f
|
|
*/
|
|
bool aiSetObjHealth(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s32 damage = cmd[4] | (cmd[3] << 8);
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
obj->damage = damage;
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a0
|
|
*/
|
|
bool aiSetChrSpecialDeathAnimation(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->specialdie = cmd[3];
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a1
|
|
*/
|
|
bool aiSetRoomToSearch(void)
|
|
{
|
|
struct chrdata *target = chrFindById(g_Vars.chrdata, CHR_TARGET);
|
|
|
|
if (target && target->prop) {
|
|
g_Vars.chrdata->roomtosearch = target->prop->rooms[0];
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
s16 g_CiMainQuips[][3] = {
|
|
{ MP3_CARR_WHAT_IS_IT, MP3_CARR_A_LITTLE_BUSY, MP3_CARR_PROUD_OF_YOU },
|
|
{ MP3_CIFEM_FOSTER, MP3_CIFEM_COME_TO_SEE_ME, MP3_CIFEM_PRACTICE_MAKES_PERFECT },
|
|
{ MP3_GRIMSHAW_KNOW_YOUR_ENEMY, MP3_GRIMSHAW_ALL_EARS, MP3_GRIMSHAW_GAP_IN_RECORDS },
|
|
{ MP3_HOLO_LAST_MINUTE_TRAINING, MP3_HOLO_PRACTICE_MAKES_PERFECT, MP3_HOLO_HAVE_A_LIFE },
|
|
{ MP3_HANGERGUY_DONT_SCREW_UP, MP3_HANGERGUY_DONT_MAKE_A_MESS, MP3_HANGERGUY_HALF_HOUR_AGO },
|
|
{ MP3_FOSTER_WHAT_TO_SHOOT_AT, MP3_FOSTER_ZEROED_THE_SIGHTS, MP3_FOSTER_GOOD_SHOW },
|
|
};
|
|
|
|
s16 g_CiGreetingQuips[][3] = {
|
|
{ SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA },
|
|
{ SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE },
|
|
{ SFX_GRIMSHAW_WELCOME, SFX_GRIMSHAW_HI_THERE, SFX_GRIMSHAW_UMM_ERR_HI },
|
|
{ SFX_HOLO_HI, SFX_HOLO_HI, SFX_HOLO_HI },
|
|
{ SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT },
|
|
{ SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT },
|
|
{ SFX_CIM_HEY_THERE, SFX_CIM_HEY_THERE, SFX_CIM_HI },
|
|
{ SFX_CIM_HI, SFX_CIM_HOWS_IT_GOING, SFX_CIM_HOWS_IT_GOING },
|
|
{ SFX_CIFEM_HELLO, SFX_CIFEM_HELLO, SFX_CIFEM_HI_JO },
|
|
{ SFX_CIFEM_HI_JO, SFX_CIFEM_HOWS_IT_GOING, SFX_CIFEM_HOWS_IT_GOING },
|
|
};
|
|
|
|
s16 g_CiAnnoyedQuips[][3] = {
|
|
{ MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME },
|
|
{ MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE },
|
|
{ MP3_GRIMSHAW_BUG_OFF, MP3_GRIMSHAW_CRIMINAL_RECORD, MP3_GRIMSHAW_LOSER },
|
|
{ MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING },
|
|
{ MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG },
|
|
{ MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE },
|
|
{ MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE },
|
|
{ MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE },
|
|
{ MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE },
|
|
{ MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE },
|
|
};
|
|
|
|
s16 g_CiThanksQuips[] = {
|
|
0,
|
|
MP3_CIFEM_THANKS1,
|
|
MP3_GRIMSHAW_TOO_CLOSE,
|
|
MP3_CIFEM_THANKS2,
|
|
0,
|
|
MP3_FOSTER_RELY_ON_YOU,
|
|
MP3_CIM_THANKS_JO,
|
|
MP3_CIM_THANKS_JO,
|
|
MP3_CIFEM_THANKS3,
|
|
MP3_CIFEM_THANKS3,
|
|
};
|
|
|
|
/**
|
|
* @cmd 01a2
|
|
*/
|
|
bool aiSayCiStaffQuip(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 quip;
|
|
|
|
if (cmd[2] == CIQUIP_GREETING) {
|
|
quip = g_CiGreetingQuips[g_Vars.chrdata->morale][random() % 3];
|
|
audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0);
|
|
}
|
|
|
|
if (cmd[2] == CIQUIP_MAIN) {
|
|
quip = g_CiMainQuips[g_Vars.chrdata->morale][random() % 3];
|
|
audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0);
|
|
}
|
|
|
|
if (cmd[2] == CIQUIP_ANNOYED) {
|
|
quip = g_CiAnnoyedQuips[g_Vars.chrdata->morale][random() % 3];
|
|
audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0);
|
|
}
|
|
|
|
if (cmd[2] == CIQUIP_THANKS) {
|
|
quip = g_CiThanksQuips[g_Vars.chrdata->morale];
|
|
audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a3
|
|
*/
|
|
bool aiDoPresetAnimation(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
// These all appear to be talking animations
|
|
u16 anims[] = {
|
|
/* 0*/ ANIM_0296,
|
|
/* 1*/ ANIM_0297,
|
|
/* 2*/ ANIM_0298,
|
|
/* 3*/ ANIM_028A, // when value is 3 (1/2 chance)
|
|
/* 4*/ ANIM_028C, // when value is 3 (1/2 chance)
|
|
/* 5*/ ANIM_0290,
|
|
/* 6*/ ANIM_0291,
|
|
/* 7*/ ANIM_TALKING_00A3, // when value is 255 (1/8 chance)
|
|
/* 8*/ ANIM_028E, // when value is 255 (1/8 chance)
|
|
/* 9*/ ANIM_028F, // when value is 255 (1/8 chance)
|
|
/*10*/ ANIM_TALKING_0231, // when value is 255 (1/8 chance)
|
|
/*11*/ ANIM_TALKING_0232, // when value is 255 (1/8 chance)
|
|
/*12*/ ANIM_TALKING_0233, // when value is 255 (1/8 chance)
|
|
/*13*/ ANIM_TALKING_0234, // when value is 255 (1/8 chance)
|
|
/*14*/ ANIM_028D, // when value is 255 (1/8 chance)
|
|
};
|
|
|
|
if (cmd[2] == 255) {
|
|
chrTryStartAnim(g_Vars.chrdata, anims[7 + (random() % 8)], 0, -1, 0, 15, 0.5);
|
|
} else if (cmd[2] == 254) {
|
|
struct prop *prop0 = chrGetHeldProp(g_Vars.chrdata, 1);
|
|
struct prop *prop1 = chrGetHeldProp(g_Vars.chrdata, 0);
|
|
|
|
if (weaponIsOneHanded(prop0) || weaponIsOneHanded(prop1)) {
|
|
chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_EASY, 0, -1, 0, 5, 0.5);
|
|
} else {
|
|
chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_HARD, 0, -1, 0, 5, 0.5);
|
|
}
|
|
} else if (cmd[2] == 3) {
|
|
chrTryStartAnim(g_Vars.chrdata, anims[3 + (random() & 1)], 0, -1, 0, 15, 0.5);
|
|
} else {
|
|
chrTryStartAnim(g_Vars.chrdata, anims[cmd[2]], 0, -1, 0, 15, 0.5);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a5
|
|
*/
|
|
bool aiIfUsingLift(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (chrIsUsingLift(g_Vars.chrdata)) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01a6
|
|
*/
|
|
bool aiIfTargetYDifferenceLessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct prop *prop = chrGetTargetProp(g_Vars.chrdata);
|
|
f32 diff = prop->pos.y - g_Vars.chrdata->prop->pos.y;
|
|
|
|
if (diff < 0) {
|
|
diff = 0 - diff;
|
|
}
|
|
|
|
if (diff < (s32)cmd[2] * 10.0f) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01aa
|
|
*/
|
|
bool ai01aa(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 a = 3000;
|
|
|
|
func0f0056f4(
|
|
g_Vars.currentplayer->prop->rooms[0],
|
|
&g_Vars.currentplayer->prop->pos,
|
|
g_Vars.chrdata->prop->rooms[0],
|
|
&g_Vars.chrdata->prop->pos,
|
|
0, &a, 0);
|
|
|
|
if (a < 3000) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ae
|
|
*/
|
|
bool aiClearInventory(void)
|
|
{
|
|
u32 stackpadding[2];
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
s32 playernum;
|
|
|
|
for (playernum = 0; playernum < PLAYERCOUNT(); playernum++) {
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (g_Vars.currentplayer == g_Vars.bond || g_Vars.currentplayer == g_Vars.coop) {
|
|
invClear();
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
g_Vars.currentplayer->devicesactive = 0;
|
|
#endif
|
|
invGiveSingleWeapon(WEAPON_UNARMED);
|
|
bgunEquipWeapon(WEAPON_UNARMED);
|
|
}
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ad
|
|
*/
|
|
bool aiReleaseObject(void)
|
|
{
|
|
bmoveSetModeForAllPlayers(MOVEMODE_WALK);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01af
|
|
*/
|
|
bool aiChrGrabObject(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER && obj && obj->prop) {
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (g_Vars.currentplayer->bondmovemode == MOVEMODE_WALK
|
|
&& bmoveGetCrouchPos() == CROUCHPOS_STAND
|
|
&& g_Vars.currentplayer->crouchoffset == 0) {
|
|
bmoveGrabProp(obj->prop);
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b1
|
|
*/
|
|
bool aiShuffleRuinsPillars(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct tag *ptr1 = tagFindById(cmd[2]);
|
|
struct tag *ptr2 = tagFindById(cmd[3]);
|
|
struct tag *ptr3 = tagFindById(cmd[4]);
|
|
struct tag *src;
|
|
u8 marked1index = random() % 5;
|
|
u8 marked2index = random() % 5;
|
|
u8 marked3index = random() % 5;
|
|
u8 pillars[5];
|
|
u8 mines[5];
|
|
pillars[0] = cmd[5];
|
|
pillars[1] = cmd[6];
|
|
pillars[2] = cmd[7];
|
|
pillars[3] = cmd[8];
|
|
pillars[4] = cmd[9];
|
|
mines[0] = cmd[13];
|
|
mines[1] = cmd[14];
|
|
mines[2] = cmd[15];
|
|
mines[3] = cmd[16];
|
|
mines[4] = cmd[17];
|
|
|
|
while (marked2index == marked1index) {
|
|
marked2index = random() % 5;
|
|
}
|
|
|
|
while (marked3index == marked2index || marked3index == marked1index) {
|
|
marked3index = random() % 5;
|
|
}
|
|
|
|
// Pillar/mine 1
|
|
src = tagFindById(pillars[marked1index]);
|
|
ptr1->cmdoffset = src->cmdoffset;
|
|
ptr1->obj = src->obj;
|
|
|
|
ptr1 = tagFindById(cmd[10]);
|
|
src = tagFindById(mines[marked1index]);
|
|
ptr1->cmdoffset = src->cmdoffset;
|
|
ptr1->obj = src->obj;
|
|
|
|
// Pillar/mine 2
|
|
src = tagFindById(pillars[marked2index]);
|
|
ptr2->cmdoffset = src->cmdoffset;
|
|
ptr2->obj = src->obj;
|
|
|
|
ptr2 = tagFindById(cmd[11]);
|
|
src = tagFindById(mines[marked2index]);
|
|
ptr2->cmdoffset = src->cmdoffset;
|
|
ptr2->obj = src->obj;
|
|
|
|
// Pillar/mine 3
|
|
src = tagFindById(pillars[marked3index]);
|
|
ptr3->cmdoffset = src->cmdoffset;
|
|
ptr3->obj = src->obj;
|
|
|
|
ptr3 = tagFindById(cmd[12]);
|
|
src = tagFindById(mines[marked3index]);
|
|
ptr3->cmdoffset = src->cmdoffset;
|
|
ptr3->obj = src->obj;
|
|
|
|
g_Vars.aioffset += 18;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b2
|
|
*/
|
|
bool ai01b2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
var8007db84 = 0.1f * (s32)cmd[2];
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b3
|
|
*/
|
|
bool aiToggleP1P2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.coopplayernum >= 0) {
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
if (chr->p1p2 == g_Vars.bondplayernum && !g_Vars.coop->isdead) {
|
|
chr->p1p2 = g_Vars.coopplayernum;
|
|
} else if (!g_Vars.bond->isdead) {
|
|
chr->p1p2 = g_Vars.bondplayernum;
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b5
|
|
*/
|
|
bool aiChrSetP1P2(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (g_Vars.coopplayernum >= 0) {
|
|
struct chrdata *chr1 = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct chrdata *chr2 = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
|
|
if (chr1 && chr2 && chr2->prop && chr2->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr2->prop);
|
|
|
|
if (!g_Vars.players[playernum]->isdead) {
|
|
if (chr2->prop == g_Vars.coop->prop) {
|
|
chr1->p1p2 = g_Vars.coopplayernum;
|
|
} else {
|
|
chr1->p1p2 = g_Vars.bondplayernum;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b7
|
|
*/
|
|
bool aiChrSetCloaked(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop) {
|
|
if (!chrIsDead(chr)) {
|
|
if (cmd[3]) {
|
|
chrCloak(chr, cmd[4]);
|
|
} else {
|
|
chrUncloak(chr, cmd[4]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b8
|
|
*/
|
|
bool aiSetAutogunType(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop && obj->type == OBJTYPE_AUTOGUN) {
|
|
struct autogunobj *autogun = (struct autogunobj *)obj;
|
|
autogun->targetteam = cmd[3];
|
|
autogun->unka4 = 0;
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01b9
|
|
*/
|
|
bool aiShufflePelagicSwitches(void)
|
|
{
|
|
u8 buttonsdone[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
u8 i;
|
|
u8 j;
|
|
struct tag *tag;
|
|
struct tag *button;
|
|
u8 index;
|
|
|
|
for (i = 8; i < 16; i++) {
|
|
tag = tagFindById(i);
|
|
index = random() & 7;
|
|
|
|
if (buttonsdone[index] == 0) {
|
|
// Switch has not yet been mapped
|
|
button = tagFindById(index);
|
|
tag->cmdoffset = button->cmdoffset;
|
|
tag->obj = button->obj;
|
|
buttonsdone[index] = 1;
|
|
} else {
|
|
// Switch is already mapped - find first unmapped switch
|
|
for (j = 0; buttonsdone[j]; j++);
|
|
|
|
button = tagFindById(j);
|
|
tag->cmdoffset = button->cmdoffset;
|
|
tag->obj = button->obj;
|
|
buttonsdone[j] = 1;
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01bb
|
|
*/
|
|
bool aiNoOp01bb(void)
|
|
{
|
|
g_Vars.aioffset += 4;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01bc
|
|
*/
|
|
bool ai01bc(void)
|
|
{
|
|
struct bytelist *cmd = (struct bytelist *)(g_Vars.ailist + g_Vars.aioffset);
|
|
|
|
if (g_Vars.chrdata->pouncebits == cmd->b2) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd->b3);
|
|
} else {
|
|
g_Vars.aioffset += 4;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01bd
|
|
*/
|
|
bool aiIfTrainingPcHolographed(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct trainingdata *data = dtGetData();
|
|
|
|
if (data->holographedpc) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01be
|
|
*/
|
|
bool aiIfPlayerUsingDevice(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct prop *prop = chr ? chr->prop : NULL;
|
|
u8 active = false;
|
|
|
|
if (prop && prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(prop);
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
setCurrentPlayerNum(playernum);
|
|
|
|
if (currentPlayerGetDeviceState(cmd[3]) == DEVICESTATE_ACTIVE) {
|
|
active = true;
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
}
|
|
|
|
if (active) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01bf
|
|
*/
|
|
bool aiChrBeginOrEndTeleport(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u16 pad_id = cmd[3] | (cmd[2] << 8);
|
|
f32 fvalue;
|
|
struct chrdata *chr;
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 mainpri;
|
|
#endif
|
|
u32 playernum;
|
|
u32 prevplayernum;
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 audiopri;
|
|
#endif
|
|
struct sndstate *handle;
|
|
fvalue = 0.4;
|
|
chr = chrFindById(g_Vars.chrdata, cmd[4]);
|
|
prevplayernum = g_Vars.currentplayernum;
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
}
|
|
|
|
if (pad_id == 0) {
|
|
g_Vars.currentplayer->teleportstate = TELEPORTSTATE_EXITING;
|
|
g_Vars.currentplayer->teleporttime = 0;
|
|
} else {
|
|
g_Vars.currentplayer->teleporttime = 0;
|
|
g_Vars.currentplayer->teleportstate = TELEPORTSTATE_PREENTER;
|
|
g_Vars.currentplayer->teleportpad = pad_id;
|
|
g_Vars.currentplayer->teleportcamerapad = 0;
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
mainpri = osGetThreadPri(0);
|
|
audiopri = osGetThreadPri(&g_AudioManager.thread);
|
|
osSetThreadPri(0, audiopri + 1);
|
|
#endif
|
|
|
|
handle = sndStart(var80095200, SFX_RELOAD_FARSIGHT, NULL, -1, -1, -1, -1, -1);
|
|
|
|
if (handle) {
|
|
audioPostEvent(handle, 16, *(u32 *)&fvalue);
|
|
}
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
osSetThreadPri(0, mainpri);
|
|
#endif
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c0
|
|
*/
|
|
bool aiIfChrTeleportFullWhite(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]);
|
|
u32 prevplayernum = g_Vars.currentplayernum;
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 mainpri;
|
|
#endif
|
|
f32 fvalue;
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
s32 audiopri;
|
|
#endif
|
|
struct sndstate *handle;
|
|
|
|
if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) {
|
|
u32 playernum = propGetPlayerNum(chr->prop);
|
|
setCurrentPlayerNum(playernum);
|
|
}
|
|
|
|
if (g_Vars.currentplayer->teleportstate < TELEPORTSTATE_WHITE) {
|
|
g_Vars.aioffset += 4;
|
|
} else {
|
|
fvalue = 0.4;
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
mainpri = osGetThreadPri(0);
|
|
audiopri = osGetThreadPri(&g_AudioManager.thread);
|
|
osSetThreadPri(0, audiopri + 1);
|
|
#endif
|
|
|
|
handle = sndStart(var80095200, SFX_FIRE_SHOTGUN, NULL, -1, -1, -1, -1, -1);
|
|
|
|
if (handle) {
|
|
audioPostEvent(handle, 16, *(u32 *)&fvalue);
|
|
}
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
osSetThreadPri(0, mainpri);
|
|
#endif
|
|
|
|
g_Vars.currentplayer->teleportstate = TELEPORTSTATE_WHITE;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
}
|
|
|
|
setCurrentPlayerNum(prevplayernum);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c5
|
|
*/
|
|
bool aiAvoid(void)
|
|
{
|
|
chrAvoid(g_Vars.chrdata);
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c8
|
|
*/
|
|
bool aiTitleInitMode(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset += 3;
|
|
titleInitFromAiCmd(cmd[2]);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01c9
|
|
*/
|
|
bool aiTryExitTitle(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (titleIsChangingMode()) {
|
|
titleExit();
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset = g_Vars.aioffset + 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ca
|
|
*/
|
|
bool aiChrSetCutsceneWeapon(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
s32 model_id = weaponGetModel(cmd[3]);
|
|
s32 fallback_model_id = weaponGetModel(cmd[4]);
|
|
|
|
if (chr) {
|
|
if (cmd[3] == 0xff) {
|
|
if (cmd[4] == 0xff) {
|
|
if (chr->weapons_held[0]) {
|
|
struct weaponobj *weapon = chr->weapons_held[0]->weapon;
|
|
bool valid = true;
|
|
|
|
switch (weapon->weaponnum) {
|
|
case WEAPON_FALCON2:
|
|
case WEAPON_FALCON2_SILENCER:
|
|
case WEAPON_FALCON2_SCOPE:
|
|
case WEAPON_MAGSEC4:
|
|
case WEAPON_MAULER:
|
|
case WEAPON_PHOENIX:
|
|
case WEAPON_DY357MAGNUM:
|
|
case WEAPON_DY357LX:
|
|
case WEAPON_CMP150:
|
|
valid = false;
|
|
}
|
|
|
|
if (valid) {
|
|
chrSetWeaponReapable(chr, HAND_LEFT);
|
|
chrSetWeaponReapable(chr, HAND_RIGHT);
|
|
}
|
|
}
|
|
} else {
|
|
if (chr->weapons_held[0] == NULL && chr->weapons_held[1] == NULL && fallback_model_id >= 0) {
|
|
weaponCreateForChr(chr, fallback_model_id, cmd[4], 0, NULL, NULL);
|
|
}
|
|
}
|
|
} else {
|
|
chrSetWeaponReapable(chr, HAND_LEFT);
|
|
chrSetWeaponReapable(chr, HAND_RIGHT);
|
|
|
|
if (model_id >= 0) {
|
|
weaponCreateForChr(chr, model_id, cmd[3], 0, NULL, NULL);
|
|
}
|
|
|
|
if (fallback_model_id >= 0) {
|
|
weaponCreateForChr(chr, fallback_model_id, cmd[4], OBJFLAG_WEAPON_LEFTHANDED, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01cb
|
|
*/
|
|
bool aiFadeScreen(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
u32 color = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24);
|
|
s16 num_frames = (cmd[7] | (cmd[6] << 8));
|
|
lvConfigureFade(color, num_frames);
|
|
g_Vars.aioffset += 8;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01cc
|
|
*/
|
|
bool aiIfFadeComplete(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
|
|
if (lvIsFadeActive() == false) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01cd
|
|
*/
|
|
bool aiSetChrHudpieceVisible(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr && chr->prop && chr->model) {
|
|
chrSetHudpieceVisible(chr, cmd[3]);
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01ce
|
|
*/
|
|
bool aiSetPassiveMode(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bgunSetPassiveMode(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01cf
|
|
*/
|
|
bool aiChrSetFiringInCutscene(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
struct coord from = {0, 0, 0};
|
|
struct coord to = {0, 0, 0};
|
|
|
|
if (chr && chr->weapons_held[HAND_RIGHT]) {
|
|
if (cmd[3]) {
|
|
chrSetFiring(chr, HAND_RIGHT, true);
|
|
chrCreateFireslot(chr, HAND_RIGHT, true, false, &from, &to);
|
|
} else {
|
|
chrSetFiring(chr, HAND_RIGHT, false);
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 4;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d0
|
|
*/
|
|
bool aiSetPortalFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 portalnum = cmd[3] | (cmd[2] << 8);
|
|
|
|
g_BgPortals[portalnum].flags |= cmd[4];
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d1
|
|
*/
|
|
bool aiObjSetModelPartVisible(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct defaultobj *obj = objFindByTagId(cmd[2]);
|
|
|
|
if (obj && obj->prop) {
|
|
objSetModelPartVisible(obj, cmd[3], cmd[4]);
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d2
|
|
*/
|
|
bool aiChrEmitSparks(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chrDrCarollEmitSparks(chr);
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d3
|
|
*/
|
|
bool aiSetDrCarollImages(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *drcaroll = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (drcaroll) {
|
|
if (cmd[4] == 7) {
|
|
if ((g_Vars.lvframenum % 4) == 2) {
|
|
drcaroll->drcarollimage_left = random() % 6;
|
|
}
|
|
} else if (cmd[4] == 8) {
|
|
drcaroll->drcarollimage_left = random() % 6;
|
|
} else {
|
|
drcaroll->drcarollimage_left = cmd[4];
|
|
}
|
|
|
|
if (cmd[3] == 7) {
|
|
if ((g_Vars.lvframenum % 4) == 2) {
|
|
drcaroll->drcarollimage_right = random() % 6;
|
|
}
|
|
} else if (cmd[3] == 8) {
|
|
drcaroll->drcarollimage_right = random() % 6;
|
|
} else {
|
|
drcaroll->drcarollimage_right = cmd[3];
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 5;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d4
|
|
*/
|
|
bool aiSetRoomFlag(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 roomnum = cmd[3] | cmd[2] << 8;
|
|
s16 flag = cmd[5] | cmd[4] << 8;
|
|
|
|
g_Rooms[roomnum].flags |= flag;
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d5
|
|
*/
|
|
bool aiShowCutsceneChrs(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
bool show = cmd[2];
|
|
s32 i;
|
|
|
|
if (show) {
|
|
for (i = chrsGetNumSlots() - 1; i >= 0; i--) {
|
|
if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop && (g_ChrSlots[i].hidden2 & CHRH2FLAG_HIDDENFORCUTSCENE)) {
|
|
g_ChrSlots[i].hidden2 &= ~CHRH2FLAG_HIDDENFORCUTSCENE;
|
|
g_ChrSlots[i].chrflags &= ~CHRCFLAG_HIDDEN;
|
|
}
|
|
}
|
|
} else {
|
|
for (i = chrsGetNumSlots() - 1; i >= 0; i--) {
|
|
if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop &&
|
|
(g_ChrSlots[i].chrflags & (CHRCFLAG_UNPLAYABLE | CHRCFLAG_HIDDEN)) == 0) {
|
|
g_ChrSlots[i].hidden2 |= CHRH2FLAG_HIDDENFORCUTSCENE;
|
|
g_ChrSlots[i].chrflags |= CHRCFLAG_HIDDEN;
|
|
}
|
|
}
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d6
|
|
*/
|
|
bool aiConfigureEnvironment(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 room_id = (cmd[3] | (cmd[2] << 8));
|
|
s32 value = cmd[5];
|
|
s32 i;
|
|
|
|
switch (cmd[4]) {
|
|
case AIENVCMD_00:
|
|
var8006ae18 = value;
|
|
break;
|
|
case AIENVCMD_01:
|
|
var8006ae1c = value;
|
|
break;
|
|
case AIENVCMD_02:
|
|
var8006ae20 = value;
|
|
break;
|
|
case AIENVCMD_03:
|
|
var8006ae24 = value;
|
|
break;
|
|
case AIENVCMD_04:
|
|
var8006ae28 = value;
|
|
break;
|
|
case AIENVCMD_ROOM_SETAMBIENT:
|
|
g_Rooms[room_id].flags &= ~ROOMFLAG_PLAYAMBIENTTRACK;
|
|
if (value) {
|
|
g_Rooms[room_id].flags |= ROOMFLAG_PLAYAMBIENTTRACK;
|
|
}
|
|
break;
|
|
case AIENVCMD_ROOM_SETOUTDOORS:
|
|
g_Rooms[room_id].flags &= ~ROOMFLAG_OUTDOORS;
|
|
if (value) {
|
|
g_Rooms[room_id].flags |= ROOMFLAG_OUTDOORS;
|
|
}
|
|
break;
|
|
case AIENVCMD_07:
|
|
g_Rooms[room_id].bitfield.b = value;
|
|
break;
|
|
case AIENVCMD_08:
|
|
g_Rooms[room_id].unk4d = value;
|
|
break;
|
|
case AIENVCMD_SETAMBIENT:
|
|
for (i = 1; i < g_Vars.roomcount; i++) {
|
|
if (value) {
|
|
g_Rooms[i].flags |= ROOMFLAG_PLAYAMBIENTTRACK;
|
|
} else {
|
|
g_Rooms[i].flags &= ~ROOMFLAG_PLAYAMBIENTTRACK;
|
|
}
|
|
}
|
|
break;
|
|
case AIENVCMD_PLAYNOSEDIVE:
|
|
sndPlayNosedive(value);
|
|
break;
|
|
case AIENVCMD_TICKMUSICQUEUE:
|
|
musicTickEvents();
|
|
break;
|
|
case AIENVCMD_ROOM_SETFAULTYLIGHTS:
|
|
roomSetLightsFaulty(room_id, value);
|
|
break;
|
|
case AIENVCMD_STOPNOSEDIVE:
|
|
sndStopNosedive();
|
|
break;
|
|
case AIENVCMD_PLAYUFOHUM:
|
|
sndPlayUfo(value);
|
|
break;
|
|
case AIENVCMD_STOPUFOHUM:
|
|
sndStopUfo();
|
|
break;
|
|
}
|
|
|
|
g_Vars.aioffset += 6;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d7
|
|
*/
|
|
bool aiIfDistanceToTarget2LessThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceToTarget2(g_Vars.chrdata) < distance) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d8
|
|
*/
|
|
bool aiIfDistanceToTarget2GreaterThan(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
f32 distance = (cmd[3] | (cmd[2] << 8)) * 10.0f;
|
|
|
|
if (chrGetDistanceToTarget2(g_Vars.chrdata) > distance) {
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
|
|
} else {
|
|
g_Vars.aioffset += 5;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01d9
|
|
*/
|
|
bool aiPlaySoundFromProp(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
s16 audio_id = cmd[5] | (cmd[4] << 8);
|
|
s32 volumemaybe = cmd[7] | (cmd[6] << 8);
|
|
u16 unk1 = cmd[10] | (cmd[10] << 8); // @bug: Using 10 twice
|
|
s32 channel = (s8)cmd[2];
|
|
s16 unk2 = cmd[8];
|
|
struct defaultobj *obj = objFindByTagId(cmd[3]);
|
|
|
|
audioPlayFromProp(channel, audio_id, volumemaybe, obj->prop, unk2, unk1);
|
|
|
|
g_Vars.aioffset += 11;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01da
|
|
*/
|
|
bool aiPlayTemporaryPrimaryTrack(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
musicStartTemporaryPrimary(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01db
|
|
*/
|
|
bool aiChrKill(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]);
|
|
|
|
if (chr) {
|
|
chr->actiontype = ACT_DEAD;
|
|
chr->act_dead.fadetimer60 = -1;
|
|
chr->act_dead.fadenow = false;
|
|
chr->act_dead.fadewheninvis = false;
|
|
chr->act_dead.invistimer60 = 0;
|
|
chr->act_dead.notifychrindex = 0;
|
|
chr->sleep = 0;
|
|
chr->chrflags |= CHRCFLAG_KEEPCORPSEKO | CHRCFLAG_PERIMDISABLEDTMP;
|
|
}
|
|
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01dc
|
|
*/
|
|
bool aiRemoveWeaponFromInventory(void)
|
|
{
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
invRemoveItemByNum(cmd[2]);
|
|
g_Vars.aioffset += 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01dd
|
|
*/
|
|
bool aiIfMusicEventQueueIsEmpty(void)
|
|
{
|
|
f32 value = (u64)osGetCount() * 64 / 3000;
|
|
|
|
if (g_MusicEventQueueLength) {
|
|
g_Vars.aioffset += 4;
|
|
} else {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[3]);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @cmd 01de
|
|
*/
|
|
bool aiIfCoopMode(void)
|
|
{
|
|
if (g_Vars.normmplayerisrunning == false && g_MissionConfig.iscoop) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
/**
|
|
* @cmd 01e0
|
|
*/
|
|
bool aiRemoveReferencesToChr(void)
|
|
{
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop) {
|
|
u32 index = g_Vars.chrdata->prop - g_Vars.props;
|
|
chrClearReferences(index);
|
|
}
|
|
|
|
g_Vars.aioffset += 2;
|
|
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#if VERSION >= VERSION_NTSC_1_0
|
|
/**
|
|
* @cmd 01b4
|
|
*/
|
|
bool ai01b4(void)
|
|
{
|
|
if (g_Vars.chrdata && g_Vars.chrdata->prop &&
|
|
chr0f01f264(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, 0, false)) {
|
|
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
|
|
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[2]);
|
|
} else {
|
|
g_Vars.aioffset += 3;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
#endif
|