papermario/src/encounter_api.c

889 lines
25 KiB
C

#include "common.h"
#include "npc.h"
#include "effects.h"
#include "battle/battle.h"
ApiStatus SetEncounterStatusFlags(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
EncounterStatus* currentEncounter = &gCurrentEncounter;
s32 flagBits = *args++;
if (evt_get_variable(script, *args++)) {
currentEncounter->flags |= flagBits;
} else {
currentEncounter->flags &= ~flagBits;
}
return ApiStatus_DONE2;
}
ApiStatus IsStartingConversation(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
s32 outVar = *args++;
evt_set_variable(script, outVar, is_starting_conversation());
return ApiStatus_DONE2;
}
ApiStatus func_80044238(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
func_80072BCC(evt_get_variable(script, *args++));
return ApiStatus_DONE2;
}
ApiStatus LoadDemoBattle(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
load_demo_battle(evt_get_variable(script, *args++));
return ApiStatus_DONE2;
}
ApiStatus func_80044290(Evt* script, s32 isInitialCall) {
return ApiStatus_DONE2;
}
ApiStatus MakeNpcs(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall) {
script->functionTemp[0] = 0;
}
switch (script->functionTemp[0]) {
case 0:
make_npcs(evt_get_variable(script, *args++), gGameStatusPtr->mapID, (s32*) evt_get_variable(script, *args++));
script->functionTemp[0] = 1;
break;
case 1:
if (gEncounterState != ENCOUNTER_STATE_CREATE) {
return ApiStatus_DONE2;
}
}
return ApiStatus_BLOCK;
}
ApiStatus RemoveNpc(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
ApiStatus ret = ApiStatus_DONE1;
s32 id = evt_get_variable(script, *args++);
EncounterStatus* currentEncounter = &gCurrentEncounter;
s32 i, j;
if ((s32)enemy != NPC_SELF) {
if (id == NPC_SELF) {
id = enemy->npcID;
ret = ApiStatus_FINISH;
} else {
if (enemy->npcID == id) {
Evt* scriptTemp = script;
while (TRUE) {
if (scriptTemp->blockingParent != NULL) {
scriptTemp = scriptTemp->blockingParent;
} else {
break;
}
}
if (scriptTemp == enemy->aiScript) {
ret = ApiStatus_FINISH;
}
} else {
get_enemy(id);
}
}
} else {
get_enemy(id);
}
for (i = 0; i < currentEncounter->numEncounters; i++) {
Encounter* encounter = currentEncounter->encounterList[i];
if (encounter != NULL) {
for (j = 0; j < encounter->count; j++) {
enemy = encounter->enemy[j];
if (enemy != NULL && enemy->npcID == id) {
kill_enemy(enemy);
return ret;
}
}
}
}
return ret;
}
ApiStatus RemoveEncounter(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
s32 id = evt_get_variable(script, *args++);
EncounterStatus* currentEncounter = &gCurrentEncounter;
ApiStatus ret = ApiStatus_DONE1;
s32 i, j;
if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
id = enemy->npcID;
ret = ApiStatus_FINISH;
} else {
get_enemy(id);
}
for (i = 0; i < currentEncounter->numEncounters; i++) {
Encounter* encounter = currentEncounter->encounterList[i];
if (encounter != NULL) {
for (j = 0; j < encounter->count; j++) {
enemy = encounter->enemy[j];
if (enemy != NULL && enemy->npcID == id) {
kill_encounter(enemy);
return ret;
}
}
}
}
return ret;
}
ApiStatus GetBattleOutcome(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, gCurrentEncounter.battleOutcome);
return ApiStatus_DONE2;
}
ApiStatus func_800445A8(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, script->owner1.enemy->unk_C4);
return ApiStatus_DONE2;
}
ApiStatus func_800445D4(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, script->owner1.enemy->unk_C8);
return ApiStatus_DONE2;
}
ApiStatus GetOwnerEncounterTrigger(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, script->owner1.enemy->encountered);
return ApiStatus_DONE2;
}
ApiStatus DoNpcDefeat(Evt* script, s32 isInitialCall) {
Enemy* owner = script->owner1.enemy;
Npc* npc = get_npc_unsafe(owner->npcID);
Evt* newScript;
kill_script(script);
npc->currentAnim = owner->animList[6];
newScript = start_script(&EVS_NpcDefeat, EVT_PRIORITY_A, 0);
owner->defeatScript = newScript;
owner->defeatScriptID = newScript->id;
newScript->owner1.enemy = owner;
newScript->owner2.npcID = owner->npcID;
newScript->groupFlags = owner->scriptGroup;
return ApiStatus_FINISH;
}
void start_battle(Evt* script, s32 songID) {
EncounterStatus* currentEncounter = &gCurrentEncounter;
Enemy* enemy = script->owner1.enemy;
Encounter* encounter;
s32 i;
resume_all_group(EVT_GROUP_01);
currentEncounter->hitType = ENCOUNTER_TRIGGER_NONE;
enemy->encountered = TRUE;
currentEncounter->currentEnemy = enemy;
currentEncounter->currentEncounter = currentEncounter->encounterList[enemy->encounterIndex];
currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
currentEncounter->allowFleeing = FALSE;
currentEncounter->songID = songID;
currentEncounter->unk_18 = -1;
if (enemy->aiScript != NULL) {
suspend_all_script(enemy->aiScriptID);
}
if (enemy->auxScript != NULL) {
suspend_all_script(enemy->auxScriptID);
}
disable_player_input();
partner_disable_input();
encounter = currentEncounter->currentEncounter;
for (i = 0; i < encounter->count; i++) {
enemy = encounter->enemy[i];
if (enemy != NULL && (!(enemy->flags & ENEMY_FLAG_ENABLE_HIT_SCRIPT) || enemy == currentEncounter->currentEnemy)) {
if (enemy->hitBytecode != NULL) {
Evt* hitEvtInstance;
enemy->encountered = TRUE;
hitEvtInstance = start_script(enemy->hitBytecode, EVT_PRIORITY_A, 0);
enemy->hitScript = hitEvtInstance;
enemy->hitScriptID = hitEvtInstance->id;
hitEvtInstance = enemy->hitScript;
hitEvtInstance->owner1.enemy = enemy;
hitEvtInstance->owner2.npcID = enemy->npcID;
hitEvtInstance->groupFlags = enemy->scriptGroup;
}
}
}
currentEncounter->fadeOutAmount = 0;
currentEncounter->unk_94 = 0;
currentEncounter->scriptedBattle = TRUE;
gEncounterState = ENCOUNTER_STATE_PRE_BATTLE;
D_8009A678 = 1;
gEncounterSubState = ENCOUNTER_SUBSTATE_PRE_BATTLE_INIT;
}
ApiStatus StartBattle(Evt* script, s32 isInitialCall) {
start_battle(script, -1);
return ApiStatus_DONE1;
}
ApiStatus StartBattleWith(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
start_battle(script, evt_get_variable(script, *args++));
return ApiStatus_DONE1;
}
ApiStatus StartBossBattle(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
EncounterStatus* currentEncounter = &gCurrentEncounter;
Enemy* enemy = script->owner1.enemy;
s32 songID = evt_get_variable(script, *args++);
Encounter* encounter;
s32 i;
resume_all_group(EVT_GROUP_01);
currentEncounter->hitType = ENCOUNTER_TRIGGER_NONE;
enemy->encountered = TRUE;
currentEncounter->currentEnemy = enemy;
currentEncounter->currentEncounter = currentEncounter->encounterList[enemy->encounterIndex];
currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
currentEncounter->allowFleeing = TRUE;
currentEncounter->songID = songID;
currentEncounter->unk_18 = -1;
if (enemy->aiScript != NULL) {
suspend_all_script(enemy->aiScriptID);
}
if (enemy->auxScript != NULL) {
suspend_all_script(enemy->auxScriptID);
}
disable_player_input();
partner_disable_input();
encounter = currentEncounter->currentEncounter;
for (i = 0; i < encounter->count; i++) {
enemy = encounter->enemy[i];
if ((enemy != NULL && (
!(enemy->flags & ENEMY_FLAG_ENABLE_HIT_SCRIPT) || enemy == currentEncounter->currentEnemy)
) && enemy->hitBytecode != NULL) {
enemy->encountered = TRUE;
script = start_script(enemy->hitBytecode, EVT_PRIORITY_A, 0);
enemy->hitScript = script;
enemy->hitScriptID = script->id;
script = enemy->hitScript;
script->owner1.enemy = enemy;
script->owner2.npcID = enemy->npcID;
script->groupFlags = enemy->scriptGroup;
}
}
currentEncounter->fadeOutAmount = 0;
currentEncounter->unk_94 = 0;
currentEncounter->scriptedBattle = TRUE;
gEncounterState = ENCOUNTER_STATE_PRE_BATTLE;
D_8009A678 = 1;
gEncounterSubState = ENCOUNTER_SUBSTATE_PRE_BATTLE_INIT;
return ApiStatus_DONE1;
}
ApiStatus SetBattleMusic(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Bytecode songID = evt_get_variable(script, *args++);
EncounterStatus* currentEncounter = &gCurrentEncounter;
currentEncounter->allowFleeing = TRUE;
currentEncounter->songID = songID;
currentEncounter->unk_18 = -1;
return ApiStatus_DONE2;
}
ApiStatus BindNpcAI(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
s32 id = evt_get_variable(script, *args++);
EvtScript* newScriptSource = (EvtScript*)evt_get_variable(script, *args++);
Evt* scriptTemp = script;
ApiStatus ret = ApiStatus_DONE2;
Evt* aiScript;
s32 groupFlags;
if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
id = enemy->npcID;
while (TRUE) {
if (scriptTemp->blockingParent != NULL) {
scriptTemp = scriptTemp->blockingParent;
} else {
break;
}
}
aiScript = enemy->aiScript;
if (scriptTemp == aiScript) {
ret = ApiStatus_FINISH;
}
} else {
enemy = get_enemy(id);
}
if (enemy->flags & ENEMY_FLAG_PASSIVE) {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02;
} else {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02 | EVT_GROUP_01;
}
if (enemy->aiScript != NULL) {
#if VERSION_JP
groupFlags = enemy->aiScript->groupFlags;
#endif
kill_script_by_ID(enemy->aiScriptID);
}
enemy->unk_C8 = 100;
enemy->aiBytecode = newScriptSource;
scriptTemp = start_script(newScriptSource, EVT_PRIORITY_A, 0);
enemy->aiScript = scriptTemp;
enemy->aiScriptID = scriptTemp->id;
scriptTemp->owner1.enemy = enemy;
scriptTemp->owner2.npcID = id;
scriptTemp->groupFlags = groupFlags;
return ret;
}
ApiStatus BindNpcIdle(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
EvtScript* aiBytecode = (EvtScript*)evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = owner->npcID;
}
owner = get_enemy(npcID);
owner->aiBytecode = aiBytecode;
return ApiStatus_DONE2;
}
ApiStatus RestartNpcAI(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
Evt* newScript;
s32 groupFlags;
if (npcID == NPC_SELF) {
npcID = enemy->npcID;
}
enemy = get_enemy(npcID);
if (enemy->flags & ENEMY_FLAG_PASSIVE) {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02;
} else {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02 | EVT_GROUP_01;
}
if (enemy->aiScript != NULL) {
#if VERSION_JP
groupFlags = enemy->aiScript->groupFlags;
#endif
kill_script_by_ID(enemy->aiScriptID);
}
enemy->unk_C8 = 100;
newScript = start_script(enemy->aiBytecode, EVT_PRIORITY_A, 0);
enemy->aiScript = newScript;
enemy->aiScriptID = newScript->id;
newScript->owner1.enemy = enemy;
newScript->owner2.npc = script->owner2.npc;
newScript->groupFlags = groupFlags;
return ApiStatus_DONE2;
}
ApiStatus EnableNpcAI(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
s32 var2 = evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
if (var2 != 0) {
if (npc->aiScript != NULL) {
resume_all_script(npc->aiScriptID);
}
} else if (npc->aiScript != NULL) {
suspend_all_script(npc->aiScriptID);
}
return ApiStatus_DONE2;
}
ApiStatus SetNpcAux(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
s32 id = evt_get_variable(script, *args++);
EvtScript* newScriptSource = (EvtScript*)evt_get_variable(script, *args++);
Evt* scriptTemp = script;
ApiStatus ret = ApiStatus_DONE2;
Evt* auxScript;
if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
id = enemy->npcID;
while (TRUE) {
if (scriptTemp->blockingParent != NULL) {
scriptTemp = scriptTemp->blockingParent;
} else {
break;
}
}
auxScript = enemy->auxScript;
if (scriptTemp == auxScript) {
ret = ApiStatus_FINISH;
}
} else {
enemy = get_enemy(id);
auxScript = enemy->auxScript;
}
if (auxScript != NULL) {
kill_script_by_ID(enemy->auxScriptID);
}
if (newScriptSource != NULL) {
enemy->auxBytecode = newScriptSource;
scriptTemp = start_script(newScriptSource, EVT_PRIORITY_A, 0);
enemy->auxScript = scriptTemp;
enemy->auxScriptID = scriptTemp->id;
scriptTemp->owner1.enemy = enemy;
scriptTemp->owner2.npcID = id;
scriptTemp->groupFlags = script->groupFlags;
}
return ret;
}
ApiStatus BindNpcAux(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
EvtScript* auxBytecode = (EvtScript*)evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
npc->auxBytecode = auxBytecode;
return ApiStatus_DONE2;
}
ApiStatus RestartNpcAux(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
Evt* newScript;
s32 groupFlags;
if (npcID == NPC_SELF) {
npcID = enemy->npcID;
}
enemy = get_enemy(npcID);
if (enemy->flags & ENEMY_FLAG_PASSIVE) {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02;
} else {
groupFlags = EVT_GROUP_08 | EVT_GROUP_02 | EVT_GROUP_01;
}
if (enemy->auxScript != NULL) {
#if VERSION_JP
groupFlags = enemy->auxScript->groupFlags;
#endif
kill_script_by_ID(enemy->auxScriptID);
}
newScript = start_script(enemy->auxBytecode, EVT_PRIORITY_A, 0);
enemy->auxScript = newScript;
enemy->auxScriptID = newScript->id;
newScript->owner1.enemy = enemy;
newScript->owner2.npcID = npcID;
newScript->groupFlags = groupFlags;
return ApiStatus_DONE2;
}
ApiStatus EnableNpcAux(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
s32 var2 = evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
if (var2 != 0) {
if (npc->auxScript != NULL) {
resume_all_script(npc->auxScriptID);
}
} else if (npc->auxScript != NULL) {
suspend_all_script(npc->auxScriptID);
}
return ApiStatus_DONE2;
}
ApiStatus BindNpcInteract(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
EvtScript* interactBytecode = (EvtScript*)evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
if (npc->interactScript != NULL) {
kill_script_by_ID(npc->interactScriptID);
}
npc->interactBytecode = interactBytecode;
return ApiStatus_DONE2;
}
ApiStatus BindNpcHit(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
EvtScript* hitBytecode = (EvtScript*)evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
if (npc->hitScript != NULL) {
kill_script_by_ID(npc->hitScriptID);
}
npc->hitBytecode = hitBytecode;
return ApiStatus_DONE2;
}
ApiStatus BindNpcDefeat(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
EvtScript* defeatBytecode = (EvtScript*)evt_get_variable(script, *args++);
if (npcID == -1) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
npc->defeatBytecode = defeatBytecode;
return ApiStatus_DONE2;
}
ApiStatus SetSelfVar(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
s32 index = evt_get_variable(script, *args++);
s32 value = evt_get_variable(script, *args++);
owner->varTable[index] = value;
return ApiStatus_DONE2;
}
ApiStatus GetSelfVar(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
s32 var1 = evt_get_variable(script, *args++);
s32 var0 = *args++;
evt_set_variable(script, var0, owner->varTable[var1]);
return ApiStatus_DONE2;
}
ApiStatus SetNpcVar(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
s32 varIdx = evt_get_variable(script, *args++);
s32 val = evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
npc->varTable[varIdx] = val;
return ApiStatus_DONE2;
}
ApiStatus GetNpcVar(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
s32 varIdx = evt_get_variable(script, *args++);
s32 var3 = *args++;
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
evt_set_variable(script, var3, npc->varTable[varIdx]);
return ApiStatus_DONE2;
}
ApiStatus SetSelfRotation(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Npc* self = get_npc_unsafe(script->owner2.npcID);
s32 rotX = evt_get_variable(script, *args++);
s32 rotY = evt_get_variable(script, *args++);
s32 rotZ = evt_get_variable(script, *args++);
self->rotation.x = rotX;
self->rotation.y = rotY;
self->rotation.z = rotZ;
return ApiStatus_DONE2;
}
ApiStatus SetSelfEnemyFlags(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
script->owner1.enemy->flags = *args++;
return ApiStatus_DONE2;
}
ApiStatus SetSelfEnemyFlagBits(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
s32 bits = *args++;
s32 mode = evt_get_variable(script, *args++);
if (mode) {
owner->flags |= bits;
} else {
owner->flags &= ~bits;
}
return ApiStatus_DONE2;
}
ApiStatus SelfEnemyOverrideSyncPos(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
Npc* npc = get_npc_unsafe(script->owner2.npcID);
owner->hitboxIsActive = evt_get_variable(script, *args++);
owner->unk_10.x = npc->pos.x;
owner->unk_10.y = npc->pos.y;
owner->unk_10.z = npc->pos.z;
return ApiStatus_DONE2;
}
ApiStatus GetSelfNpcID(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, script->owner1.enemy->npcID);
return ApiStatus_DONE2;
}
ApiStatus ClearDefeatedEnemies(Evt* script, s32 isInitialCall) {
EncounterStatus* currentEncounter = &gCurrentEncounter;
s32 i;
s32 j;
for (i = 0; i < ARRAY_COUNT(currentEncounter->defeatFlags); i++) {
for (j = 0; j < ARRAY_COUNT(currentEncounter->defeatFlags[0]); j++) {
currentEncounter->defeatFlags[i][j] = 0;
}
}
return ApiStatus_DONE2;
}
ApiStatus SetEnemyFlagBits(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* npc = script->owner1.enemy;
s32 npcID = evt_get_variable(script, *args++);
s32 bits = *args++;
s32 mode = evt_get_variable(script, *args++);
if (npcID == NPC_SELF) {
npcID = npc->npcID;
}
npc = get_enemy(npcID);
if (mode) {
npc->flags |= bits;
} else {
npc->flags &= ~bits;
}
return ApiStatus_DONE2;
}
ApiStatus func_8004572C(Evt* script, s32 isInitialCall) {
return ApiStatus_DONE2;
}
ApiStatus GetSelfAnimationFromTable(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* owner = script->owner1.enemy;
s32 animIdx = evt_get_variable(script, *args++);
evt_set_variable(script, *args++, owner->animList[animIdx]);
return ApiStatus_DONE2;
}
ApiStatus func_80045798(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
gPartnerStatus.unk_358 = evt_get_variable(script, *args++);
return ApiStatus_DONE2;
}
ApiStatus SetOwnerInstigatorValue(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Enemy* enemy = script->owner1.enemy;
enemy->instigatorValue = evt_get_variable(script, *args++);
return ApiStatus_DONE2;
}
ApiStatus SetBattleAsScripted(Evt* script, s32 isInitialCall) {
gCurrentEncounter.scriptedBattle = TRUE;
return ApiStatus_DONE2;
}
ApiStatus GetEncounterTriggerHitTier(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, gCurrentEncounter.hitTier);
return ApiStatus_DONE2;
}
ApiStatus func_80045838(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
s32 npcID = evt_get_variable(script, *args++);
s32 soundID = evt_get_variable(script, *args++);
s32 upperSoundFLags = evt_get_variable(script, *args++);
Npc* npc = resolve_npc(script, npcID);
if (npc == NULL) {
return ApiStatus_DONE2;
}
ai_enemy_play_sound(npc, soundID, upperSoundFLags);
return ApiStatus_DONE2;
}
ApiStatus func_800458CC(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
evt_set_variable(script, *args++, script->owner1.enemy->npcSettings->actionFlags & AI_ACTION_08);
return ApiStatus_DONE2;
}
ApiStatus OnPlayerFled(Evt* script, s32 isInitialCall) {
Enemy* enemy = script->owner1.enemy;
Npc* npc = get_npc_unsafe(enemy->npcID);
Bytecode* args = script->ptrReadPos;
s32 skipReaction = evt_get_variable(script, *args++);
enemy->aiFlags |= ENEMY_AI_FLAG_SUSPEND;
if (!skipReaction) {
s32 unk;
if (!(enemy->aiFlags & ENEMY_AI_FLAG_10)) {
npc->currentAnim = *enemy->animList;
}
if (!(enemy->aiFlags & ENEMY_AI_FLAG_8)) {
fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 0.0f, -20.0f, 40, &unk);
}
if ((npc->flags & (NPC_FLAG_GRAVITY | NPC_FLAG_JUMPING | NPC_FLAG_8)) == (NPC_FLAG_JUMPING | NPC_FLAG_8)) {
f32 x = npc->pos.x;
f32 y = npc->pos.y + npc->collisionHeight;
f32 z = npc->pos.z;
f32 a = 100.0f;
if (npc_raycast_down_sides(npc->collisionChannel, &x, &y, &z, &a) != 0) {
npc->pos.y = y;
}
npc->flags &= ~NPC_FLAG_JUMPING;
}
}
return ApiStatus_DONE2;
}
ApiStatus SetTattleMessage(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
s32 enemyId = evt_get_variable(script, *args++);
u32 tattleMsg = evt_get_variable(script, *args++);
Enemy* npc = get_enemy(enemyId);
npc->tattleMsg = tattleMsg;
return ApiStatus_DONE2;
}