2020-08-04 08:49:11 +02:00
|
|
|
#include "common.h"
|
|
|
|
|
2020-08-14 02:29:25 +02:00
|
|
|
s32 MakeLerp(script_context* script, s32 initialCall) {
|
|
|
|
s32* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
2020-08-15 02:17:20 +02:00
|
|
|
script->varTable[0xC] = get_variable(script, *ptrReadPos++); // start
|
|
|
|
script->varTable[0xD] = get_variable(script, *ptrReadPos++); // end
|
|
|
|
script->varTable[0xF] = get_variable(script, *ptrReadPos++); // duration
|
|
|
|
script->varTable[0xB] = get_variable(script, *ptrReadPos++); // easing type
|
2020-08-15 02:49:33 +02:00
|
|
|
script->varTable[0xE] = 0; // elapsed
|
2020-08-15 02:17:20 +02:00
|
|
|
|
2020-08-14 02:29:25 +02:00
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 02:49:33 +02:00
|
|
|
s32 UpdateLerp(script_context* script, s32 initialCall) {
|
|
|
|
script->varTable[0x0] = (s32) update_lerp(
|
|
|
|
script->varTable[0xB],
|
2020-08-15 05:12:30 +02:00
|
|
|
script->varTable[0xC],
|
|
|
|
script->varTable[0xD],
|
2020-08-15 02:49:33 +02:00
|
|
|
script->varTable[0xE],
|
|
|
|
script->varTable[0xF]
|
|
|
|
);
|
|
|
|
|
|
|
|
if (script->varTable[0xE] >= script->varTable[0xF]) {
|
|
|
|
script->varTable[0x1] = 0; // finished
|
|
|
|
} else {
|
|
|
|
script->varTable[0x1] = 1; // lerping
|
|
|
|
}
|
|
|
|
script->varTable[0xE]++;
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 05:25:48 +02:00
|
|
|
s32 RandInt(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
2020-08-15 07:00:29 +02:00
|
|
|
s32 max = get_variable(script, *ptrReadPos++);
|
2020-08-15 05:25:48 +02:00
|
|
|
bytecode outVar = *ptrReadPos++;
|
|
|
|
|
2020-08-15 07:00:29 +02:00
|
|
|
set_variable(script, outVar, rand_int(max));
|
2020-08-15 05:25:48 +02:00
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 06:27:01 +02:00
|
|
|
s32 GetAngleBetweenNPCs(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
|
|
|
NPC aID = get_variable(script, *ptrReadPos++);
|
|
|
|
NPC bID = get_variable(script, *ptrReadPos++);
|
|
|
|
bytecode outVar = *ptrReadPos++;
|
|
|
|
|
|
|
|
npc* a = resolve_npc(script, aID);
|
|
|
|
npc* b = resolve_npc(script, bID);
|
|
|
|
set_variable(script, outVar, atan2(a->pos.x, a->pos.z, b->pos.x, b->pos.z));
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 07:00:29 +02:00
|
|
|
s32 GetAngleToNPC(script_context* script, s32 initialCall) {
|
|
|
|
player_status* playerStatus = &gPlayerStatus;
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
|
|
|
NPC npcID = get_variable(script, *ptrReadPos++);
|
|
|
|
bytecode outVar = *ptrReadPos++;
|
|
|
|
|
|
|
|
npc* npc = resolve_npc(script, npcID);
|
|
|
|
set_variable(script, outVar, atan2(playerStatus->position.x, playerStatus->position.z, npc->pos.x, npc->pos.z));
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 07:00:29 +02:00
|
|
|
s32 GetAngleToPlayer(script_context* script, s32 initialCall) {
|
|
|
|
player_status* playerStatus = &gPlayerStatus;
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
|
|
|
NPC npcID = get_variable(script, *ptrReadPos++);
|
|
|
|
bytecode outVar = *ptrReadPos++;
|
|
|
|
|
|
|
|
npc* npc = resolve_npc(script, npcID);
|
|
|
|
set_variable(script, outVar, atan2(npc->pos.x, npc->pos.z, playerStatus->position.x, playerStatus->position.z));
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 07:55:16 +02:00
|
|
|
s32 AwaitPlayerApproach(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
player_status* playerStatus = &gPlayerStatus;
|
|
|
|
|
|
|
|
s32* targetX = &script->functionTemp[0];
|
|
|
|
s32* targetZ = &script->functionTemp[1];
|
|
|
|
s32* distanceRequired = &script->functionTemp[2];
|
|
|
|
|
|
|
|
f32 distance;
|
|
|
|
|
|
|
|
if (initialCall) {
|
|
|
|
*targetX = get_variable(script, *ptrReadPos++);
|
|
|
|
*targetZ = get_variable(script, *ptrReadPos++);
|
|
|
|
*distanceRequired = get_variable(script, *ptrReadPos++);
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 07:55:16 +02:00
|
|
|
distance = dist2D(
|
|
|
|
playerStatus->position.x, playerStatus->position.z,
|
|
|
|
*targetX, *targetZ
|
|
|
|
);
|
2020-08-04 08:49:11 +02:00
|
|
|
|
2020-08-15 07:55:16 +02:00
|
|
|
if (distance < *distanceRequired) {
|
|
|
|
return 2;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 IsPlayerWithin(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
player_status* playerStatus = &gPlayerStatus;
|
|
|
|
|
|
|
|
/* Function temporaries are redundant, stack should be used instead */
|
|
|
|
s32* targetX = &script->functionTemp[0];
|
|
|
|
s32* targetZ = &script->functionTemp[1];
|
|
|
|
s32* distanceRequired = &script->functionTemp[2];
|
|
|
|
|
|
|
|
f32 distance;
|
|
|
|
bytecode outVar = SI_VAR_0; /* Redundant */
|
|
|
|
|
|
|
|
if (initialCall) { /* Redundant condition, function always returns DONE */
|
|
|
|
*targetX = get_variable(script, *ptrReadPos++);
|
|
|
|
*targetZ = get_variable(script, *ptrReadPos++);
|
|
|
|
*distanceRequired = get_variable(script, *ptrReadPos++);
|
|
|
|
outVar = *ptrReadPos++;
|
|
|
|
}
|
|
|
|
|
|
|
|
distance = dist2D(
|
|
|
|
playerStatus->position.x, playerStatus->position.z,
|
|
|
|
*targetX, *targetZ
|
|
|
|
);
|
|
|
|
|
|
|
|
set_variable(script, outVar, 0);
|
|
|
|
if (distance < *distanceRequired) {
|
|
|
|
set_variable(script, outVar, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 AwaitPlayerLeave(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
player_status* playerStatus = &gPlayerStatus;
|
|
|
|
|
|
|
|
s32* targetX = &script->functionTemp[0];
|
|
|
|
s32* targetZ = &script->functionTemp[1];
|
|
|
|
s32* distanceRequired = &script->functionTemp[2];
|
|
|
|
|
|
|
|
f32 distance;
|
|
|
|
|
|
|
|
if (initialCall) {
|
|
|
|
*targetX = get_variable(script, *ptrReadPos++);
|
|
|
|
*targetZ = get_variable(script, *ptrReadPos++);
|
|
|
|
*distanceRequired = get_variable(script, *ptrReadPos++);
|
|
|
|
}
|
|
|
|
|
|
|
|
distance = dist2D(
|
|
|
|
playerStatus->position.x, playerStatus->position.z,
|
|
|
|
*targetX, *targetZ
|
|
|
|
);
|
|
|
|
|
|
|
|
if (distance > *distanceRequired) {
|
|
|
|
return 2;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2020-08-04 08:49:11 +02:00
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, AddVectorPolar);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, setup_path_data);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, func_802D5270);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, LoadPath);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, GetNextPathPos);
|
|
|
|
|
2020-08-15 07:55:16 +02:00
|
|
|
s32 GetDist2D(script_context* script, s32 initialCall) {
|
|
|
|
bytecode* ptrReadPos = script->ptrReadPos;
|
|
|
|
|
|
|
|
bytecode outVar = *ptrReadPos++;
|
|
|
|
set_float_variable(script, outVar, dist2D(
|
|
|
|
get_float_variable(script, *ptrReadPos++),
|
|
|
|
get_float_variable(script, *ptrReadPos++),
|
|
|
|
get_float_variable(script, *ptrReadPos++),
|
|
|
|
get_float_variable(script, *ptrReadPos++)
|
|
|
|
));
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, func_802D5830);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, func_802D585C);
|
2020-08-04 08:49:11 +02:00
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, SetValueByRef);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, GetValueByRef);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, EnableStatusMenu);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, ShowStatusMenu);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, SetGameMode);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, ClampAngleInt);
|
|
|
|
|
|
|
|
INCLUDE_ASM(code_f8f60_len_1560, ClampAngleFloat);
|