mirror of https://github.com/pmret/papermario.git
889 lines
25 KiB
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;
|
|
}
|