papermario/src/ECAA80.c

278 lines
9.4 KiB
C

#include "dead.h"
#include "common.h"
#include "dead_structs.h"
// Copy of flo_08 (CAFAC0.c)
#define NAMESPACE ECAA80
extern s32 D_802462F0[];
extern s32 D_80246460_EC9D00[91];
extern s32 D_802465CC;
void func_80241364_ECB064(Evt* script, NpcAISettings* npcAISettings, EnemyTerritoryThing* territory);
void func_80240D80_ECAA80(Evt* script, NpcAISettings* npcAISettings, EnemyTerritoryThing* territory) {
Enemy* enemy = script->owner1.enemy;
Npc* npc = get_npc_unsafe(enemy->npcID);
f32 temp_f0;
f32 temp_f20;
f64 temp_f2;
f32 phi_f22;
f32 phi_f24;
f32 phi_f26;
s32 phi_s3;
f32 subroutine_arg8;
f32 subroutine_arg9;
f32 subroutine_argA;
f32 subroutine_argB;
f32 subroutine_argC;
f32 subroutine_argD;
f32 subroutine_argE;
f32 subroutine_argF;
f32 subroutine_arg10;
npc->duration = npcAISettings->unk_20 / 2 + rand_int(npcAISettings->unk_20 / 2 + 1);
npc->currentAnim.w = enemy->animList[3];
npc->moveSpeed = npcAISettings->chaseSpeed;
phi_s3 = FALSE;
temp_f20 = clamp_angle(atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->position.x,
gPlayerStatusPtr->position.z) + 180.0f);
temp_f0 = get_clamped_angle_diff(npc->yaw, temp_f20);
if (npcAISettings->unk_1C.s < fabsf(temp_f0)) {
temp_f20 = npc->yaw;
if (temp_f0 < 0.0f) {
temp_f20 += -npcAISettings->unk_1C.s;
} else {
temp_f20 += npcAISettings->unk_1C.s;
}
}
npc->yaw = clamp_angle(temp_f20);
subroutine_arg8 = npc->pos.x;
subroutine_arg9 = npc->pos.y;
subroutine_argA = npc->pos.z;
temp_f20 = clamp_angle(atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->position.x,
gPlayerStatusPtr->position.z) + 180.0f);
phi_f22 = 0.0f;
phi_f24 = 0.0f;
phi_f26 = 0.0f;
if (npc_test_move_simple_without_slipping(npc->collisionChannel, &subroutine_arg8, &subroutine_arg9, &subroutine_argA, npc->moveSpeed * 4.5, temp_f20,
npc->collisionHeight, npc->collisionRadius)) {
phi_f22 = dist2D(npc->pos.x, npc->pos.z, subroutine_arg8, subroutine_argA);
subroutine_argB = npc->pos.x;
subroutine_argC = npc->pos.y;
subroutine_argD = npc->pos.z;
if (npc_test_move_simple_without_slipping(npc->collisionChannel, &subroutine_argB, &subroutine_argC, &subroutine_argD, npc->moveSpeed * 4.5,
clamp_angle(temp_f20 + 35.0f), npc->collisionHeight, npc->collisionRadius)) {
phi_f24 = dist2D(npc->pos.x, npc->pos.z, subroutine_argB, subroutine_argD);
}
subroutine_argE = npc->pos.x;
subroutine_argF = npc->pos.y;
subroutine_arg10 = npc->pos.z;
if (npc_test_move_simple_without_slipping(npc->collisionChannel, &subroutine_argE, &subroutine_argF, &subroutine_arg10, npc->moveSpeed * 4.5,
clamp_angle(temp_f20 - 35.0f), npc->collisionHeight, npc->collisionRadius)) {
phi_f26 = dist2D(npc->pos.x, npc->pos.z, subroutine_argE, subroutine_arg10);
}
dist2D(npc->pos.x, npc->pos.z, gPlayerStatusPtr->position.x, gPlayerStatusPtr->position.z);
if ((phi_f22 < npc->moveSpeed * 1.5) && (phi_f24 < npc->moveSpeed * 1.5) && (phi_f26 < npc->moveSpeed * 1.5) &&
(func_800490B4(territory, enemy, npcAISettings->alertRadius, npcAISettings->unk_10.f, 0))) {
phi_s3 = TRUE;
}
if (!phi_s3) {
if ((phi_f24 < phi_f22) && (phi_f26 < phi_f24)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_arg8, subroutine_argA);
} else if ((phi_f24 < phi_f22) && (phi_f24 < phi_f26)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_arg8, subroutine_argA);
} else if ((phi_f22 < phi_f24) && (phi_f26 < phi_f22)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_argB, subroutine_argD);
} else if ((phi_f26 < phi_f24) && (phi_f22 < phi_f26)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_argB, subroutine_argD);
} else if ((phi_f22 < phi_f26) && (phi_f24 < phi_f22)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_argE, subroutine_arg10);
} else if ((phi_f24 < phi_f26) && (phi_f22 < phi_f24)) {
temp_f20 = atan2(npc->pos.x, npc->pos.z, subroutine_argE, subroutine_arg10);
}
temp_f0 = get_clamped_angle_diff(npc->yaw, temp_f20);
if (npcAISettings->unk_1C.s < fabsf(temp_f0)) {
temp_f20 = npc->yaw;
if (temp_f0 < 0.0f) {
temp_f20 += -npcAISettings->unk_1C.s;
} else {
temp_f20 += npcAISettings->unk_1C.s;
}
}
npc->yaw = clamp_angle(temp_f20);
}
}
if (phi_s3) {
npc->duration = 0xA;
npc->currentAnim.w = enemy->animList[8];
}
script->functionTemp[0] = 0xD;
}
INCLUDE_ASM(s32, "ECAA80", func_80241364_ECB064);
void func_802414C8_ECB1C8(Evt* script, NpcAISettings* aiSettings, EnemyTerritoryThing* territory) {
Npc* npc = get_npc_unsafe(script->owner1.enemy->npcID);
npc->duration--;
if (npc->duration == 0) {
script->functionTemp[0] = 0;
}
}
ApiStatus func_8024150C_ECB20C(Evt* script, s32 isInitialCall) {
DeadEnemy* enemy = (DeadEnemy*) script->owner1.enemy;
Npc *npc = get_npc_unsafe(enemy->npcID);
Bytecode* args = script->ptrReadPos;
EnemyTerritoryThing territory;
EnemyTerritoryThing* territoryPtr = &territory;
NpcAISettings* npcAISettings = (NpcAISettings*)evt_get_variable(script, *args++);
territory.unk_00 = 0;
territory.shape = enemy->territory->wander.detectShape;
territory.pointX = enemy->territory->wander.detect.x;
territory.pointZ = enemy->territory->wander.detect.z;
territory.sizeX = enemy->territory->wander.detectSizeX;
territory.sizeZ = enemy->territory->wander.detectSizeZ;
territory.unk_18 = 100.0f;
territory.unk_1C = 0;
enemy->unk_108.x = npc->pos.x;
enemy->unk_108.y = npc->pos.y;
enemy->unk_108.z = npc->pos.z;
enemy->unk_114 = 0.01f;
enemy->unk_118 = 0.01f;
if (isInitialCall || (enemy->unk_B0 & 4)) {
script->functionTemp[0] = 0;
npc->duration = 0;
npc->currentAnim.w = enemy->animList[0];
npc->flags &= ~NPC_FLAG_NO_Y_MOVEMENT;
if (!enemy->territory->wander.isFlying) {
npc->flags = (npc->flags | NPC_FLAG_GRAVITY) & ~NPC_FLAG_ENABLE_HIT_SCRIPT;
} else {
npc->flags = (npc->flags & ~NPC_FLAG_GRAVITY) | NPC_FLAG_ENABLE_HIT_SCRIPT;
}
if (enemy->unk_B0 & 4) {
script->functionTemp[0] = 99;
script->functionTemp[1] = 0;
enemy->unk_B0 &= ~4;
}
}
switch (script->functionTemp[0]) {
case 0:
func_800495A0(script, npcAISettings, territoryPtr);
case 1:
func_800496B8(script, npcAISettings, territoryPtr);
break;
case 2:
base_UnkNpcAIFunc1(script, npcAISettings, territoryPtr);
case 3:
func_80049C04(script, npcAISettings, territoryPtr);
break;
case 10:
func_80049E3C(script, npcAISettings, territoryPtr);
case 11:
func_80049ECC(script, npcAISettings, territoryPtr);
break;
case 12:
func_80240D80_ECAA80(script, npcAISettings, territoryPtr);
case 13:
func_80241364_ECB064(script, npcAISettings, territoryPtr);
break;
case 14:
func_802414C8_ECB1C8(script, npcAISettings, territoryPtr);
break;
case 99:
func_8004A73C(script);
}
return ApiStatus_BLOCK;
}
#include "world/common/GetNpcCollisionHeight.inc.c"
#include "world/common/AddPlayerHandsOffset.inc.c"
INCLUDE_ASM(s32, "ECAA80", func_8024199C_ECB69C);
INCLUDE_ASM(s32, "ECAA80", func_802419F0_ECB6F0);
ApiStatus func_80241A28_ECB728(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
s32* ptr = (s32*) evt_get_variable(script, *args);
s32 i;
if (ptr != NULL) {
for (i = 0; ptr[i] != 0; i++) {
D_802462F0[i] = ptr[i];
}
D_802462F0[i] = 0;
} else {
for (i = 0; i < 91; i++) {
D_802462F0[i] = i + 128;
D_802462F0[91] = 0;
}
}
return ApiStatus_DONE2;
}
ApiStatus func_80241AC4_ECB7C4(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
s32 itemIdx = evt_get_variable(script, *args++);
s32 var1 = evt_get_variable(script, *args++);
s32 var2 = evt_get_variable(script, *args++);
s32 var3 = evt_get_variable(script, *args++);
ItemEntity* item = get_item_entity(itemIdx);
item->position.x = var1;
item->position.y = var2;
item->position.z = var3;
return ApiStatus_DONE2;
}
ApiStatus func_80241B88_ECB888(Evt* script, s32 isInitialCall) {
s32 itemId = evt_get_variable(script, *script->ptrReadPos);
ItemData* item = &gItemTable[itemId];
if (itemId == ITEM_YUMMY_MEAL) {
script->varTable[9] = 2;
} else if (item->typeFlags & 0x80) {
script->varTable[9] = 1;
} else {
script->varTable[9] = 0;
}
return ApiStatus_DONE2;
}
ApiStatus func_80241BF8_ECB8F8(Evt* script, s32 isInitialCall) {
s32 i;
for (i = 0; i <= 90; i++) {
D_80246460_EC9D00[i] = 128 + i;
}
D_802465CC = 0;
return ApiStatus_DONE2;
}