papermario/src/code_181810.c

260 lines
7.7 KiB
C
Raw Normal View History

2020-10-15 05:49:49 +02:00
#include "common.h"
2020-10-17 05:47:10 +02:00
extern PrintContext* gSpeakingActorPrintCtx;
extern s32 gSpeakingActorPrintIsDone; // unk_08
extern s32 gSpeakingActorTalkAnim;
extern s32 gSpeakingActorIdleAnim;
extern Actor* gSpeakingActor;
extern ActorPart* gSpeakingActorPart;
#ifdef NON_MATCHING
void clamp_printer_coords(PrintContext* printer, f32 x, f32 y);
// Register allocation issues, otherwise equivalent (?)
ApiStatus ActorSpeak(ScriptInstance* script, s32 isInitialCall) {
2020-10-17 05:47:10 +02:00
Bytecode* args = script->ptrReadPos;
Actor* actor;
ActorPart* part;
2020-10-17 05:47:10 +02:00
s32 stringID;
s32 actorID;
s32 partIndex;
PrintContext** printContext;
2020-10-17 05:47:10 +02:00
s32 anim;
f32 headX, headY, headZ;
2020-10-17 05:47:10 +02:00
f32 screenX, screenY, screenZ;
2020-10-18 23:04:40 +02:00
s32 stringID2;
2020-10-17 05:47:10 +02:00
if (isInitialCall) {
stringID = get_variable(script, *args++);
actorID = get_variable(script, *args++);
partIndex = get_variable(script, *args++);
gSpeakingActorTalkAnim = get_variable(script, *args++);
gSpeakingActorIdleAnim = get_variable(script, *args++);
2020-10-18 23:04:40 +02:00
stringID2 = stringID;
2020-10-17 05:47:10 +02:00
2020-11-20 01:41:49 +01:00
if (actorID == ActorID_SELF) {
2020-10-21 01:02:05 +02:00
actorID = script->owner1.actorID;
2020-10-17 05:47:10 +02:00
}
2020-10-18 23:04:40 +02:00
2020-10-17 05:47:10 +02:00
actor = get_actor(actorID);
part = get_actor_part(actor, partIndex);
gSpeakingActor = actor;
gSpeakingActorPart = part;
headX = actor->currentPos.x + actor->headOffset.x;
2020-10-17 05:47:10 +02:00
if ((actor->flags & 0x8000) == 0) {
headY = actor->size.y + (actor->currentPos.y + actor->headOffset.y);
2020-10-17 05:47:10 +02:00
} else {
2020-10-18 23:04:40 +02:00
headY = actor->headOffset.y;
headY = headY + actor->currentPos.y + (actor->size.y / 2);
2020-10-17 05:47:10 +02:00
}
2020-10-18 23:04:40 +02:00
headZ = actor->currentPos.z + actor->headOffset.z;
get_screen_coords(Cam_BATTLE, headX, headY, headZ, &screenX, &screenY, &screenZ);
2020-10-17 05:47:10 +02:00
{
s32* isPrintDone = &gSpeakingActorPrintIsDone;
*isPrintDone = FALSE;
2020-10-18 23:04:40 +02:00
gSpeakingActorPrintCtx = load_string(stringID2, isPrintDone);
}
2020-10-17 05:47:10 +02:00
clamp_printer_coords(gSpeakingActorPrintCtx, screenX, screenY);
2020-10-26 02:12:01 +01:00
script->functionTemp[0].s = 0;
2020-10-17 05:47:10 +02:00
D_8009A650[0] |= 0x10;
if (gSpeakingActorTalkAnim >= 0) {
func_80263E08(actor, part, gSpeakingActorTalkAnim);
}
increment_status_menu_disabled();
}
2020-10-26 02:12:01 +01:00
if (script->functionTemp[0].s == 0) {
2020-10-17 05:47:10 +02:00
actor = gSpeakingActor;
part = gSpeakingActorPart;
headX = actor->currentPos.x + actor->headOffset.x;
2020-10-17 05:47:10 +02:00
if ((actor->flags & 0x8000) == 0) {
headY = actor->size.y + (actor->currentPos.y + actor->headOffset.y);
2020-10-17 05:47:10 +02:00
} else {
2020-10-18 23:04:40 +02:00
headY = actor->headOffset.y;
headY = headY + actor->currentPos.y + (actor->size.y / 2);
2020-10-17 05:47:10 +02:00
}
2020-10-18 23:04:40 +02:00
headZ = actor->currentPos.z + actor->headOffset.z;
get_screen_coords(Cam_BATTLE, headX, headY, headZ, &screenX, &screenY, &screenZ);
2020-10-17 05:47:10 +02:00
printContext = &gSpeakingActorPrintCtx;
clamp_printer_coords(*printContext, screenX, screenY);
if ((*printContext)->stateFlags & 0x40) {
2020-10-17 05:47:10 +02:00
decrement_status_menu_disabled();
return ApiStatus_DONE1;
}
if ((*printContext)->stateFlags & 0x80) { // "is talking" flag
2020-10-17 05:47:10 +02:00
anim = gSpeakingActorTalkAnim;
} else {
anim = gSpeakingActorIdleAnim;
}
if (anim >= 0) {
func_80263E08(actor, part, anim);
}
if (gSpeakingActorPrintIsDone == 1) {
decrement_status_menu_disabled();
D_8009A650[0] &= ~0x10;
return ApiStatus_DONE1;
}
}
return ApiStatus_BLOCK;
}
#else
INCLUDE_ASM(s32, "code_181810", ActorSpeak);
#endif
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", EndActorSpeech);
INCLUDE_ASM(s32, "code_181810", ShowBattleChoice);
2020-10-18 23:04:40 +02:00
ApiStatus func_802535B4(ScriptInstance* script, s32 isInitialCall) {
if (get_variable(script, *script->ptrReadPos)) {
decrement_status_menu_disabled();
} else {
increment_status_menu_disabled();
}
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
2020-10-17 05:47:10 +02:00
ApiStatus OverrideBattleDmaDest(ScriptInstance* script, s32 isInitialCall) {
gBattleDmaDest = get_variable(script, *script->ptrReadPos);
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", LoadBattleDmaData);
INCLUDE_ASM(s32, "code_181810", func_802536A8);
INCLUDE_ASM(s32, "code_181810", func_80253734);
INCLUDE_ASM(s32, "code_181810", func_802537C0);
2020-10-18 23:04:40 +02:00
ApiStatus PlaySoundAtActor(ScriptInstance* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
2020-11-20 01:41:49 +01:00
ActorID actorID = get_variable(script, *args++);
2020-10-18 23:04:40 +02:00
Bytecode soundID = *args++;
Actor* actor;
2020-11-20 01:41:49 +01:00
if (actorID == ActorID_SELF) {
2020-10-21 01:02:05 +02:00
actorID = script->owner1.actorID;
2020-10-18 23:04:40 +02:00
}
actor = get_actor(actorID);
play_sound_at_position(soundID, 0, actor->currentPos.x, actor->currentPos.y, actor->currentPos.z);
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", PlaySoundAtPart);
INCLUDE_ASM(s32, "code_181810", PlayLoopingSoundAtActor);
INCLUDE_ASM(s32, "code_181810", StopLoopingSoundAtActor);
2020-10-17 05:47:10 +02:00
ApiStatus SetForegroundModelsVisibleUnsafe(ScriptInstance* script, s32 isInitialCall) {
if (get_variable(script, *script->ptrReadPos)) {
show_foreground_models_unsafe();
} else {
hide_foreground_models_unsafe();
}
return ApiStatus_DONE2;
}
ApiStatus SetForegroundModelsVisible(ScriptInstance* script, s32 isInitialCall) {
if (get_variable(script, *script->ptrReadPos)) {
show_foreground_models();
} else {
hide_foreground_models();
}
return ApiStatus_DONE2;
}
ApiStatus func_80253B30(ScriptInstance* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Bytecode a0 = *args++;
Bytecode a1 = *args++;
s32 var1 = get_variable(script, *args++);
set_variable(script, a0, (a1 | 0xFE) | (var1 * 256));
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", MakeStatusField);
2020-11-26 21:34:10 +01:00
s32 is_actor_hp_bar_visible(Actor* actor) {
BattleStatus* battleStatus = BATTLE_STATUS;
s32 flags;
2020-10-15 05:49:49 +02:00
2020-11-26 21:34:10 +01:00
if (is_ability_active(Ability_PEEKABOO)) {
return TRUE;
}
flags = get_global_byte((actor->actorType >> 3) + 365);
if (actor->flags & 0x1000) {
flags |= battleStatus->tattleFlags[actor->actorType >> 3];
}
return (flags >> (actor->actorType & 7)) & 1;
}
s32 is_actortype_hpbar_visible(s32 actorType) {
BattleStatus* battleStatus = BATTLE_STATUS;
s32 idx;
if (is_ability_active(Ability_PEEKABOO)) {
return TRUE;
}
idx = actorType / 8;
return ((get_global_byte(idx + 365) | battleStatus->tattleFlags[idx]) >> (actorType - (idx * 8))) & 1;
}
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", save_tattle_flags);
INCLUDE_ASM(s32, "code_181810", load_tattle_flags);
2020-11-18 06:20:28 +01:00
ApiStatus func_80253FB0(ScriptInstance* script, s32 isInitialCall) {
gCurrentEncounter.battleOutcome = 3;
func_80241190(0x20);
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
2020-10-18 23:04:40 +02:00
ApiStatus MultiplyByActorScale(ScriptInstance* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
2020-10-21 01:02:05 +02:00
Actor* actor = get_actor(script->owner1.actorID);
2020-10-18 23:04:40 +02:00
set_float_variable(script, *args, get_float_variable(script, *args) * actor->scalingFactor);
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
INCLUDE_ASM(s32, "code_181810", MultiplyVec2ByActorScale);
INCLUDE_ASM(s32, "code_181810", MultiplyVec3ByActorScale);
2020-11-26 21:34:10 +01:00
ApiStatus ApplyShrinkFromOwner(ScriptInstance* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
Actor* actor = get_actor(script->owner1.actorID);
s32 amt = get_variable(script, *args);
if (actor->debuff == Debuff_SHRINK && amt > 0) {
amt /= 2;
}
set_variable(script, *args, amt);
return ApiStatus_DONE2;
}
2020-10-15 05:49:49 +02:00
2020-10-17 05:47:10 +02:00
ApiStatus StartRumble(ScriptInstance* script, s32 isInitialCall) {
start_rumble_type(get_variable(script, *script->ptrReadPos));
return ApiStatus_DONE2;
}