mirror of https://github.com/zeldaret/tmc.git
2152 lines
79 KiB
C
2152 lines
79 KiB
C
#include "script.h"
|
|
#include "main.h"
|
|
#include "screen.h"
|
|
#include "area.h"
|
|
#include "game.h"
|
|
#include "object.h"
|
|
#include "npc.h"
|
|
#include "kinstone.h"
|
|
#include "functions.h"
|
|
#include "item.h"
|
|
#include "ui.h"
|
|
|
|
void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script);
|
|
void sub_0807DE80(Entity*);
|
|
void DisablePauseMenu(void);
|
|
void ScriptCommandNop(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_BeginBlock(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_EndBlock(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_Jump(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpIf(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpIfNot(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpTable(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpAbsolute(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpAbsoluteIf(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpAbsoluteIfNot(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_JumpAbsoluteTable(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_Call(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CallWithArg(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_LoadRoomEntityList(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckSyncFlagAndClear(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckInventory1(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckInventory2(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckLocalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckLocalFlagByBank(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckGlobalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckRoomFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckPlayerInRegion(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckPlayerInRegion2(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckEntityInteractType(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_FacePlayerAndCheckDist(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_HasRupees(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_HasShells(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckTextboxResult(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckKinstoneFused(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_BuyItem(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckBottleContaining(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_HasRoomItemForSale(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_VariableBitSet(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_VariableOnlyBitSet(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_VariableEqual(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckPlayerFlags(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CheckPlayerMinish(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_EntityHasHeight(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ComparePlayerAction(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ComparePlayerAnimationState(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetSyncFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ClearSyncFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetLocalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetLocalFlagByBank(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ClearLocalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetGlobalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ClearGlobalFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetRoomFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ClearRoomFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_Wait(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitForSyncFlag(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitForSyncFlagAndClear(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitPlayerGetItem(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitForPlayerEnterRoom(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitFor_1(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitForFadeFinish(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFadeTime(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFadeMask(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_FadeInvert(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommandNop2(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFade4(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFade5(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFade6(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFade7(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFadeIris(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetFadeIrisInOut(Entity* entity, ScriptExecutionContext* context);
|
|
void SetFadeIrisForCameraTarget(u32);
|
|
void ScriptCommand_0807E858(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetPlayerIdle(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_EnablePlayerControl(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_DisablePlayerControl(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetPlayerAction(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_StartPlayerScript(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetPlayerAnimation(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807E8E4(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetAction(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetIntVariable(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetVariableToFrame(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetAnimation(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_TriggerInteract(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807E974(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_AddInteractableWhenBigObject(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_RemoveInteractableObject(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_AddInteractableWhenBigFuser(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_UpdateFusion(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EA4C(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_AddInteractableFuser(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WaitUntilTextboxCloses(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MessageFromTarget(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MessageNoOverlap(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MessageFromTargetPos(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MessageFromTargetTable(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MessageNoOverlapVar(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_EzloMessage(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EB38(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetAnimationState(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EB4C(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_FacePlayer(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_FaceAwayFromPlayer(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetEntityDirection(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetEntityDirectionWithAnimationState(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetEntitySpeed(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetEntityVelocity(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetEntityPositionRelative(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_OffsetEntityPosition(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_MoveEntityToPlayer(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommandNop3(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WalkForward(Entity* entity, ScriptExecutionContext* context);
|
|
void sub_0807EC44(Entity*, ScriptExecutionContext*);
|
|
void ScriptCommand_WalkNorth(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WalkEast(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WalkSouth(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_WalkWest(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807ED24(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EDD4(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EE04(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EE30(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EEB4(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EEF4(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807EF3C(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_DoPostScriptAction(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_DoPostScriptAction2(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_PlaySound(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_PlayBgm(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SoundReq(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_StopBgm(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ModRupees(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_ModHealth(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_IncreaseMaxHealth(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_GivePlayerItem(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_GiveKinstone(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_GetInventoryValue(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetInventoryValue(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_InitItemGetSequence(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CameraTargetEntity(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context);
|
|
void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context);
|
|
|
|
typedef void (*ScriptCommand)(Entity*, ScriptExecutionContext*);
|
|
|
|
extern u16* gUnk_08001A7C[];
|
|
extern u8 gUnk_08114F30[];
|
|
extern u8 gUnk_08114F34[];
|
|
extern const u16 gUnk_08016984;
|
|
extern ScriptExecutionContext gPlayerScriptExecutionContext;
|
|
extern ScriptExecutionContext gScriptExecutionContextArray[0x20];
|
|
|
|
void InitScriptData(void) {
|
|
MemClear(&gActiveScriptInfo, sizeof(gActiveScriptInfo));
|
|
MemClear(&gScriptExecutionContextArray, sizeof(gScriptExecutionContextArray));
|
|
MemClear(&gPlayerScriptExecutionContext, sizeof(gPlayerScriptExecutionContext));
|
|
gActiveScriptInfo.fadeSpeed = 8;
|
|
}
|
|
|
|
ScriptExecutionContext* CreateScriptExecutionContext(void) {
|
|
ScriptExecutionContext* context;
|
|
|
|
context = gScriptExecutionContextArray;
|
|
do {
|
|
if (context->scriptInstructionPointer == 0) {
|
|
return context;
|
|
}
|
|
context++;
|
|
} while (context < gScriptExecutionContextArray + ARRAY_COUNT(gScriptExecutionContextArray));
|
|
return NULL;
|
|
}
|
|
|
|
void DestroyScriptExecutionContext(ScriptExecutionContext* context) {
|
|
MemClear(context, sizeof(ScriptExecutionContext));
|
|
}
|
|
|
|
ScriptExecutionContext* StartCutscene(Entity* entity, Script* script) {
|
|
ScriptExecutionContext* context;
|
|
|
|
context = CreateScriptExecutionContext();
|
|
if (context) {
|
|
InitScriptForEntity(entity, context, script);
|
|
}
|
|
return context;
|
|
}
|
|
|
|
void InitScriptForEntity(Entity* entity, ScriptExecutionContext* context, Script* script) {
|
|
entity->flags |= ENT_SCRIPTED;
|
|
*(ScriptExecutionContext**)&entity->cutsceneBeh = context;
|
|
InitScriptExecutionContext(context, script);
|
|
}
|
|
|
|
void UnloadCutsceneData(Entity* entity) {
|
|
if (entity->flags & ENT_SCRIPTED) {
|
|
entity->flags &= ~ENT_SCRIPTED;
|
|
DestroyScriptExecutionContext(*(ScriptExecutionContext**)&entity->cutsceneBeh);
|
|
*(ScriptExecutionContext**)&entity->cutsceneBeh = NULL;
|
|
}
|
|
}
|
|
|
|
void StartPlayerScript(Script* script) {
|
|
Entity* player;
|
|
|
|
MemClear(&gPlayerScriptExecutionContext, sizeof(gPlayerScriptExecutionContext));
|
|
gPlayerScriptExecutionContext.scriptInstructionPointer = script;
|
|
player = &gPlayerEntity;
|
|
*(ScriptExecutionContext**)&player->cutsceneBeh = &gPlayerScriptExecutionContext;
|
|
gPlayerState.queued_action = PLAYER_SLEEP;
|
|
gPlayerState.field_0x3a = 0;
|
|
gPlayerState.field_0x39 = 0;
|
|
gPlayerState.field_0x38 = 0;
|
|
}
|
|
|
|
UNUSED ScriptExecutionContext* StartCutscene2(Entity* entity, Script* script) {
|
|
ScriptExecutionContext* context;
|
|
|
|
context = CreateScriptExecutionContext();
|
|
if (context) {
|
|
entity->flags |= ENT_SCRIPTED;
|
|
*(ScriptExecutionContext**)&entity->collisionFlags = context;
|
|
context->scriptInstructionPointer = script;
|
|
}
|
|
return context;
|
|
}
|
|
|
|
void InitScriptExecutionContext(ScriptExecutionContext* context, Script* script) {
|
|
MemClear(context, sizeof(ScriptExecutionContext));
|
|
context->scriptInstructionPointer = script;
|
|
}
|
|
|
|
void HandlePostScriptActions(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 bit;
|
|
// iterate over bits of context->postScriptActions, LSB first
|
|
while (context->postScriptActions) {
|
|
bit = (~context->postScriptActions + 1) & context->postScriptActions;
|
|
context->postScriptActions ^= bit;
|
|
switch (bit) {
|
|
case 1 << 0x00:
|
|
entity->field_0x80.HWORD = 0;
|
|
break;
|
|
case 1 << 0x01:
|
|
entity->field_0x80.HWORD = 4;
|
|
break;
|
|
case 1 << 0x02:
|
|
break;
|
|
case 1 << 0x03:
|
|
entity->zVelocity = Q_16_16(1.5);
|
|
break;
|
|
case 1 << 0x04:
|
|
CreateSpeechBubbleExclamationMark(entity, 8, -0x18);
|
|
break;
|
|
case 1 << 0x05:
|
|
CreateSpeechBubbleQuestionMark(entity, 8, -0x18);
|
|
break;
|
|
case 1 << 0x06:
|
|
DestroyScriptExecutionContext(context);
|
|
DeleteThisEntity();
|
|
case 1 << 0x07:
|
|
entity->spriteSettings.draw = 1;
|
|
break;
|
|
case 1 << 0x08:
|
|
entity->spriteSettings.draw = 0;
|
|
break;
|
|
case 1 << 0x09:
|
|
entity->spriteOffsetY = 0;
|
|
entity->spriteOffsetX = 0;
|
|
entity->field_0x82.HWORD = 0;
|
|
break;
|
|
case 1 << 0x0a:
|
|
entity->field_0x82.HWORD |= 2;
|
|
break;
|
|
case 1 << 0x0b:
|
|
entity->field_0x82.HWORD &= ~2;
|
|
break;
|
|
case 1 << 0x0c:
|
|
entity->field_0x82.HWORD &= ~1;
|
|
break;
|
|
case 1 << 0x0d:
|
|
entity->field_0x82.HWORD |= 1;
|
|
break;
|
|
case 1 << 0x0e:
|
|
entity->field_0x82.HWORD |= 8;
|
|
break;
|
|
case 1 << 0x0f:
|
|
entity->field_0x82.HWORD ^= 4;
|
|
break;
|
|
case 1 << 0x10:
|
|
entity->field_0x82.HWORD ^= 0x10;
|
|
break;
|
|
case 1 << 0x11:
|
|
entity->spriteSettings.flipX ^= 1;
|
|
break;
|
|
case 1 << 0x12:
|
|
entity->field_0x82.HWORD |= 0x20;
|
|
break;
|
|
case 1 << 0x13:
|
|
entity->field_0x82.HWORD &= ~0x20;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Init some script related variables, execute the script and do something regarding the animation.
|
|
void InitScriptForNPC(Entity* entity) {
|
|
sub_0807DD64(entity);
|
|
ExecuteScriptAndHandleAnimation(entity, NULL);
|
|
}
|
|
|
|
void sub_0807DD64(Entity* entity) {
|
|
entity->subtimer = entity->animationState;
|
|
entity->animIndex = 0xff;
|
|
entity->field_0x80.HWORD = 0;
|
|
entity->field_0x82.HWORD = 0;
|
|
}
|
|
|
|
void sub_0807DD80(Entity* entity, Script* script) {
|
|
InitScriptExecutionContext(*(ScriptExecutionContext**)&entity->cutsceneBeh, script);
|
|
sub_0807DD64(entity);
|
|
}
|
|
|
|
void ExecuteScriptAndHandleAnimation(Entity* entity, void (*postScriptCallback)(Entity*, ScriptExecutionContext*)) {
|
|
ExecuteScriptForEntity(entity, postScriptCallback);
|
|
HandleEntity0x82Actions(entity);
|
|
sub_0807DE80(entity);
|
|
}
|
|
|
|
void ExecuteScriptForEntity(Entity* entity, void (*postScriptCallback)(Entity*, ScriptExecutionContext*)) {
|
|
ScriptExecutionContext** piVar1;
|
|
|
|
piVar1 = (ScriptExecutionContext**)&entity->cutsceneBeh;
|
|
if (*piVar1) {
|
|
ExecuteScript(entity, *piVar1);
|
|
if (postScriptCallback) {
|
|
postScriptCallback(entity, *piVar1);
|
|
} else {
|
|
HandlePostScriptActions(entity, *piVar1);
|
|
}
|
|
if (entity->next == NULL) {
|
|
DeleteThisEntity();
|
|
}
|
|
}
|
|
}
|
|
|
|
void HandleEntity0x82Actions(Entity* entity) {
|
|
u32 temp;
|
|
u32 bit;
|
|
u32 loopVar;
|
|
|
|
loopVar = entity->field_0x82.HWORD;
|
|
while (loopVar) {
|
|
bit = (~loopVar + 1) & loopVar;
|
|
loopVar = loopVar ^ bit;
|
|
switch (bit) {
|
|
case 1 << 1:
|
|
if (entity->kind == NPC) {
|
|
sub_0806ED78(entity);
|
|
} else {
|
|
sub_0800445C(entity);
|
|
}
|
|
break;
|
|
case 1 << 3:
|
|
if (gRoomTransition.frameCount % 4 == 0) {
|
|
temp = (entity->subtimer + 2) & 7;
|
|
entity->animationState = temp;
|
|
entity->subtimer = temp;
|
|
}
|
|
break;
|
|
case 1 << 4:
|
|
if (gRoomTransition.frameCount % 2 == 0) {
|
|
static const s8 sOffsets[] = { -1, -2, 0, 1 };
|
|
entity->spriteOffsetX = sOffsets[Random() % 4];
|
|
}
|
|
break;
|
|
case 1 << 5:
|
|
GravityUpdate(entity, Q_8_8(32.0));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handles animation for NPCs? Uses u16 0x80 and 0x82 of the entity.
|
|
void sub_0807DE80(Entity* entity) {
|
|
u32 local1;
|
|
u16 local2;
|
|
|
|
u32 temp;
|
|
|
|
local2 = entity->field_0x80.HWORD;
|
|
if (local2 < 8) {
|
|
if (entity->field_0x82.HWORD & 1) {
|
|
u32 t1, t2;
|
|
t1 = local2 & 0xfc;
|
|
t2 = entity->subtimer >> 1;
|
|
local2 = t1 + t2;
|
|
} else {
|
|
u32 t1, t2;
|
|
t1 = local2 & 0xfc;
|
|
t2 = entity->animationState >> 1;
|
|
local2 = t1 + t2;
|
|
entity->subtimer = entity->animationState;
|
|
}
|
|
}
|
|
if (local2 != entity->animIndex) {
|
|
InitAnimationForceUpdate(entity, local2);
|
|
}
|
|
temp = entity->field_0x82.HWORD & 4;
|
|
local1 = 1;
|
|
if (temp) {
|
|
local1 = 2;
|
|
}
|
|
sub_080042BA(entity, local1);
|
|
}
|
|
|
|
void sub_0807DEDC(Entity* entity, ScriptExecutionContext* context, u32 x, u32 y) {
|
|
static const u8 sDirectionTable[] = { 0, 0, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 0, 0 };
|
|
int direction;
|
|
s32 xOffset, yOffset;
|
|
|
|
context->unk_19 = 8;
|
|
context->postScriptActions |= 2;
|
|
context->condition = 0;
|
|
context->x.HALF.HI = x;
|
|
context->y.HALF.HI = y;
|
|
xOffset = context->x.HALF.HI - entity->x.HALF.HI;
|
|
yOffset = context->y.HALF.HI - entity->y.HALF.HI;
|
|
direction = sub_080045DA(xOffset, yOffset);
|
|
entity->direction = direction;
|
|
entity->animationState = (entity->animationState & 0x80) | sDirectionTable[(u8)direction >> 4];
|
|
}
|
|
|
|
void DisablePauseMenuAndPutAwayItems(void) {
|
|
DisablePauseMenu();
|
|
PlayerDropHeldObject();
|
|
PutAwayItems();
|
|
}
|
|
|
|
void DisablePauseMenu(void) {
|
|
gUnk_0200AF00.unk_1 = 0xff;
|
|
gPauseMenuOptions.disabled = 0xff;
|
|
}
|
|
|
|
void EnablePauseMenu(void) {
|
|
gPauseMenuOptions.disabled = 0;
|
|
gUnk_0200AF00.unk_1 = 0;
|
|
RecoverUI(0, 0);
|
|
ResetPlayerAnimationAndAction();
|
|
PlayerDropHeldObject();
|
|
}
|
|
|
|
void ExecuteScript(Entity* entity, ScriptExecutionContext* context) {
|
|
static const ScriptCommand gScriptCommands[] = {
|
|
ScriptCommandNop,
|
|
ScriptCommand_BeginBlock,
|
|
ScriptCommand_EndBlock,
|
|
ScriptCommand_Jump,
|
|
ScriptCommand_JumpIf,
|
|
ScriptCommand_JumpIfNot,
|
|
ScriptCommand_JumpTable,
|
|
ScriptCommand_JumpAbsolute,
|
|
ScriptCommand_JumpAbsoluteIf,
|
|
ScriptCommand_JumpAbsoluteIfNot,
|
|
ScriptCommand_JumpAbsoluteTable,
|
|
ScriptCommand_Call,
|
|
ScriptCommand_CallWithArg,
|
|
ScriptCommand_LoadRoomEntityList,
|
|
ScriptCommand_CheckSyncFlagAndClear,
|
|
ScriptCommand_CheckInventory1,
|
|
ScriptCommand_CheckInventory2,
|
|
ScriptCommand_HasRoomItemForSale,
|
|
ScriptCommand_CheckLocalFlag,
|
|
ScriptCommand_CheckLocalFlagByBank,
|
|
ScriptCommand_CheckGlobalFlag,
|
|
ScriptCommand_CheckRoomFlag,
|
|
ScriptCommand_CheckPlayerInRegion,
|
|
ScriptCommand_CheckPlayerInRegion2,
|
|
ScriptCommand_CheckEntityInteractType,
|
|
ScriptCommand_FacePlayerAndCheckDist,
|
|
ScriptCommand_HasRupees,
|
|
ScriptCommand_HasShells,
|
|
ScriptCommand_CheckTextboxResult,
|
|
ScriptCommand_CheckKinstoneFused,
|
|
ScriptCommand_BuyItem,
|
|
ScriptCommand_CheckBottleContaining,
|
|
ScriptCommand_VariableBitSet,
|
|
ScriptCommand_VariableOnlyBitSet,
|
|
ScriptCommand_VariableEqual,
|
|
ScriptCommand_CheckPlayerFlags,
|
|
ScriptCommand_CheckPlayerMinish,
|
|
ScriptCommand_EntityHasHeight,
|
|
ScriptCommand_ComparePlayerAction,
|
|
ScriptCommand_ComparePlayerAnimationState,
|
|
ScriptCommand_SetSyncFlag,
|
|
ScriptCommand_ClearSyncFlag,
|
|
ScriptCommand_SetLocalFlag,
|
|
ScriptCommand_SetLocalFlagByBank,
|
|
ScriptCommand_ClearLocalFlag,
|
|
ScriptCommand_SetGlobalFlag,
|
|
ScriptCommand_ClearGlobalFlag,
|
|
ScriptCommand_SetRoomFlag,
|
|
ScriptCommand_ClearRoomFlag,
|
|
ScriptCommand_Wait,
|
|
ScriptCommand_WaitForSyncFlag,
|
|
ScriptCommand_WaitForSyncFlagAndClear,
|
|
ScriptCommand_WaitPlayerGetItem,
|
|
ScriptCommand_WaitForPlayerEnterRoom,
|
|
ScriptCommand_WaitFor_1,
|
|
ScriptCommand_WaitForFadeFinish,
|
|
ScriptCommand_SetFadeTime,
|
|
ScriptCommand_SetFadeMask,
|
|
ScriptCommand_FadeInvert,
|
|
ScriptCommandNop2,
|
|
ScriptCommand_SetFade4,
|
|
ScriptCommand_SetFade5,
|
|
ScriptCommand_SetFade6,
|
|
ScriptCommand_SetFade7,
|
|
ScriptCommand_SetFadeIris,
|
|
ScriptCommand_SetFadeIrisInOut,
|
|
ScriptCommand_0807E858,
|
|
ScriptCommand_SetPlayerIdle,
|
|
ScriptCommand_EnablePlayerControl,
|
|
ScriptCommand_DisablePlayerControl,
|
|
ScriptCommand_SetPlayerAction,
|
|
ScriptCommand_StartPlayerScript,
|
|
ScriptCommand_SetPlayerAnimation,
|
|
ScriptCommand_0807E8E4,
|
|
ScriptCommand_0807E8E4,
|
|
ScriptCommand_0807E8E4,
|
|
ScriptCommand_0807E8E4,
|
|
ScriptCommand_SetAction,
|
|
ScriptCommand_SetIntVariable,
|
|
ScriptCommand_SetVariableToFrame,
|
|
ScriptCommand_SetAnimation,
|
|
ScriptCommand_TriggerInteract,
|
|
ScriptCommand_0807E974,
|
|
ScriptCommand_AddInteractableWhenBigObject,
|
|
ScriptCommand_RemoveInteractableObject,
|
|
ScriptCommand_AddInteractableWhenBigFuser,
|
|
ScriptCommand_UpdateFusion,
|
|
ScriptCommand_0807EA4C,
|
|
ScriptCommand_AddInteractableFuser,
|
|
ScriptCommand_WaitUntilTextboxCloses,
|
|
ScriptCommand_MessageFromTarget,
|
|
ScriptCommand_MessageNoOverlap,
|
|
ScriptCommand_MessageFromTargetPos,
|
|
ScriptCommand_MessageFromTargetTable,
|
|
ScriptCommand_MessageNoOverlapVar,
|
|
ScriptCommand_EzloMessage,
|
|
ScriptCommand_0807EB38,
|
|
ScriptCommand_SetAnimationState,
|
|
ScriptCommand_0807EB4C,
|
|
ScriptCommand_FacePlayer,
|
|
ScriptCommand_FaceAwayFromPlayer,
|
|
ScriptCommand_SetEntityDirection,
|
|
ScriptCommand_SetEntityDirectionWithAnimationState,
|
|
ScriptCommand_SetEntitySpeed,
|
|
ScriptCommand_SetEntityVelocity,
|
|
ScriptCommand_SetEntityPositionRelative,
|
|
ScriptCommand_OffsetEntityPosition,
|
|
ScriptCommand_MoveEntityToPlayer,
|
|
ScriptCommandNop3,
|
|
ScriptCommand_WalkForward,
|
|
ScriptCommand_WalkNorth,
|
|
ScriptCommand_WalkEast,
|
|
ScriptCommand_WalkSouth,
|
|
ScriptCommand_WalkWest,
|
|
ScriptCommand_0807ED24,
|
|
ScriptCommand_0807EDD4,
|
|
ScriptCommand_0807EE04,
|
|
ScriptCommand_0807EE30,
|
|
ScriptCommand_0807EEB4,
|
|
ScriptCommand_0807EEF4,
|
|
ScriptCommand_0807EF3C,
|
|
ScriptCommand_DoPostScriptAction,
|
|
ScriptCommand_DoPostScriptAction2,
|
|
ScriptCommand_PlaySound,
|
|
ScriptCommand_PlayBgm,
|
|
ScriptCommand_SoundReq,
|
|
ScriptCommand_StopBgm,
|
|
ScriptCommand_ModRupees,
|
|
ScriptCommand_ModHealth,
|
|
ScriptCommand_IncreaseMaxHealth,
|
|
ScriptCommand_GivePlayerItem,
|
|
ScriptCommand_GiveKinstone,
|
|
ScriptCommand_GetInventoryValue,
|
|
ScriptCommand_SetInventoryValue,
|
|
ScriptCommand_InitItemGetSequence,
|
|
ScriptCommand_CameraTargetEntity,
|
|
ScriptCommand_CameraTargetPlayer,
|
|
ScriptCommand_SetScrollSpeed,
|
|
ScriptCommand_0807F0C8,
|
|
};
|
|
|
|
if (!context->scriptInstructionPointer)
|
|
return;
|
|
if (context->wait) {
|
|
context->wait--;
|
|
} else {
|
|
ActiveScriptInfo* activeScriptInfo = &gActiveScriptInfo;
|
|
activeScriptInfo->flags = 0;
|
|
do {
|
|
u32 cmd = GetNextScriptCommandHalfword(context->scriptInstructionPointer);
|
|
u16* lastInstruction;
|
|
if (cmd == 0xFFFF)
|
|
return;
|
|
activeScriptInfo->commandSize = cmd >> 0xA;
|
|
activeScriptInfo->commandIndex = cmd & 0x3FF;
|
|
lastInstruction = context->scriptInstructionPointer;
|
|
activeScriptInfo->flags &= ~1;
|
|
gScriptCommands[activeScriptInfo->commandIndex](entity, context);
|
|
context->scriptInstructionPointer += activeScriptInfo->commandSize;
|
|
if (lastInstruction != context->scriptInstructionPointer) {
|
|
context->unk_18 = 0;
|
|
}
|
|
} while (activeScriptInfo->flags & 3);
|
|
}
|
|
}
|
|
|
|
void ScriptCommandNop(Entity* entity, ScriptExecutionContext* context) {
|
|
}
|
|
|
|
// not entirely sure this name is acurate
|
|
void ScriptCommand_BeginBlock(Entity* entity, ScriptExecutionContext* context) {
|
|
gActiveScriptInfo.flags |= 2;
|
|
}
|
|
|
|
// not entirely sure this name is acurate
|
|
void ScriptCommand_EndBlock(Entity* entity, ScriptExecutionContext* context) {
|
|
gActiveScriptInfo.flags &= ~2;
|
|
}
|
|
|
|
void ScriptCommand_Jump(Entity* entity, ScriptExecutionContext* context) {
|
|
s16 tmp;
|
|
context->scriptInstructionPointer++;
|
|
tmp = GetNextScriptCommandHalfword(context->scriptInstructionPointer);
|
|
context->scriptInstructionPointer += (tmp / 2);
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void ScriptCommand_JumpIf(Entity* entity, ScriptExecutionContext* context) {
|
|
if (context->condition) {
|
|
ScriptCommand_Jump(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_JumpIfNot(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->condition) {
|
|
ScriptCommand_Jump(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_JumpTable(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gActiveScriptInfo.commandSize > context->intVariable) {
|
|
context->scriptInstructionPointer += context->intVariable;
|
|
ScriptCommand_Jump(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_JumpAbsolute(Entity* entity, ScriptExecutionContext* context) {
|
|
context->scriptInstructionPointer =
|
|
(u16*)GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void ScriptCommand_JumpAbsoluteIf(Entity* entity, ScriptExecutionContext* context) {
|
|
if (context->condition) {
|
|
ScriptCommand_JumpAbsolute(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_JumpAbsoluteIfNot(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->condition) {
|
|
ScriptCommand_JumpAbsolute(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_JumpAbsoluteTable(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gActiveScriptInfo.commandSize > (context->intVariable << 1) + 1) {
|
|
context->scriptInstructionPointer += context->intVariable << 1;
|
|
ScriptCommand_JumpAbsolute(entity, context);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_Call(Entity* entity, ScriptExecutionContext* context) {
|
|
((ScriptCommand)GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer))(entity, context);
|
|
}
|
|
|
|
// the called function can read an argument from context->intVariable
|
|
void ScriptCommand_CallWithArg(Entity* entity, ScriptExecutionContext* context) {
|
|
ScriptCommand tmp = (ScriptCommand)GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
context->intVariable = GetNextScriptCommandWord(context->scriptInstructionPointer + 3);
|
|
tmp(entity, context);
|
|
}
|
|
|
|
void ScriptCommand_LoadRoomEntityList(Entity* entity, ScriptExecutionContext* context) {
|
|
LoadRoomEntityList((EntityData*)GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer));
|
|
}
|
|
|
|
void ScriptCommand_CheckSyncFlagAndClear(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 flag = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
u32 set = 0;
|
|
u32 field = gActiveScriptInfo.syncFlags;
|
|
if ((field & flag) == flag)
|
|
set = 1;
|
|
context->condition = set;
|
|
gActiveScriptInfo.syncFlags = field & ~flag;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckInventory1(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp;
|
|
u32 tmp2 = GetNextScriptCommandHalfwordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
switch (tmp2) {
|
|
case ITEM_SMALL_KEY:
|
|
tmp = HasDungeonSmallKey();
|
|
break;
|
|
case ITEM_BIG_KEY:
|
|
tmp = HasDungeonBigKey();
|
|
break;
|
|
case ITEM_COMPASS:
|
|
tmp = HasDungeonCompass();
|
|
break;
|
|
case ITEM_DUNGEON_MAP:
|
|
tmp = HasDungeonMap();
|
|
break;
|
|
default:
|
|
tmp = GetInventoryValue(tmp2);
|
|
}
|
|
context->condition = tmp;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckInventory2(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = GetInventoryValue(context->scriptInstructionPointer[1]) == 2;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckLocalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = CheckLocalFlag(context->scriptInstructionPointer[1]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckLocalFlagByBank(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition =
|
|
CheckLocalFlagByBank(context->scriptInstructionPointer[1], context->scriptInstructionPointer[2]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckGlobalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition =
|
|
CheckGlobalFlag(GetNextScriptCommandHalfwordAfterCommandMetadata(context->scriptInstructionPointer));
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckRoomFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = CheckRoomFlag(context->scriptInstructionPointer[1]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckPlayerInRegion(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 x, y, width, height;
|
|
width = context->scriptInstructionPointer[3];
|
|
height = width >> 8;
|
|
width &= 0xFF;
|
|
x = context->scriptInstructionPointer[1];
|
|
y = context->scriptInstructionPointer[2];
|
|
context->condition = CheckPlayerInRegion(x, y, width, height);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckPlayerInRegion2(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 x, y, width, height;
|
|
width = context->scriptInstructionPointer[1] & 0xFF;
|
|
height = context->scriptInstructionPointer[1] >> 8;
|
|
x = entity->x.HALF.HI - gRoomControls.origin_x;
|
|
y = entity->y.HALF.HI - gRoomControls.origin_y;
|
|
context->condition = CheckPlayerInRegion(x, y, width, height);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckEntityInteractType(Entity* entity, ScriptExecutionContext* context) {
|
|
if (entity->interactType) {
|
|
entity->interactType = INTERACTION_NONE;
|
|
context->condition = 1;
|
|
} else {
|
|
context->condition = 0;
|
|
}
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_FacePlayerAndCheckDist(Entity* entity, ScriptExecutionContext* context) {
|
|
if ((context->unk_1A & 0xF) == 0 && (gPlayerState.flags & PL_MINISH) == 0 &&
|
|
EntityInRectRadius(entity, &gPlayerEntity, 40, 40)) {
|
|
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
|
|
}
|
|
context->unk_1A++;
|
|
if (entity->interactType) {
|
|
entity->interactType = INTERACTION_NONE;
|
|
context->condition = 1;
|
|
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
|
|
} else {
|
|
context->condition = 0;
|
|
}
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_HasRupees(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = (context->scriptInstructionPointer[1] <= gSave.stats.rupees);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_HasShells(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = (context->scriptInstructionPointer[1] <= gSave.stats.shells);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckTextboxResult(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = !gUnk_02000040.unk_01;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckKinstoneFused(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = CheckKinstoneFused(context->scriptInstructionPointer[1]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_BuyItem(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 item, tmp2;
|
|
s32 price;
|
|
item = context->scriptInstructionPointer[1];
|
|
tmp2 = context->scriptInstructionPointer[2];
|
|
if (!item) {
|
|
item = gRoomVars.shopItemType;
|
|
tmp2 = gRoomVars.shopItemType2;
|
|
}
|
|
price = GetItemPrice(item);
|
|
context->condition = (price <= gSave.stats.rupees);
|
|
if (context->condition) {
|
|
ModRupees(-price);
|
|
InitItemGetSequence(item, tmp2, 0);
|
|
gRoomVars.shopItemType = 0;
|
|
gRoomVars.shopItemType2 = 0;
|
|
}
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckBottleContaining(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = GetBottleContaining(context->scriptInstructionPointer[1]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_HasRoomItemForSale(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = !!gRoomVars.shopItemType;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_VariableBitSet(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = !!(context->intVariable & context->scriptInstructionPointer[1]);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_VariableOnlyBitSet(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp = context->scriptInstructionPointer[1];
|
|
context->condition = tmp == (tmp & context->intVariable);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_VariableEqual(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp = context->scriptInstructionPointer[1];
|
|
context->condition = tmp == context->intVariable;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckPlayerFlags(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition =
|
|
!!(GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer) & gPlayerState.flags);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_CheckPlayerMinish(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = (gPlayerState.flags >> 7) & 1;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_EntityHasHeight(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = entity->z.WORD != 0;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_ComparePlayerAction(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = context->scriptInstructionPointer[1] == gPlayerEntity.action;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_ComparePlayerAnimationState(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = context->scriptInstructionPointer[1] == gPlayerEntity.animationState;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_SetSyncFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
gActiveScriptInfo.syncFlags |= GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_ClearSyncFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
gActiveScriptInfo.syncFlags &= ~GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_SetLocalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
SetLocalFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_SetLocalFlagByBank(Entity* entity, ScriptExecutionContext* context) {
|
|
SetLocalFlagByBank(context->scriptInstructionPointer[1], context->scriptInstructionPointer[2]);
|
|
}
|
|
|
|
void ScriptCommand_ClearLocalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
ClearLocalFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_SetGlobalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
SetGlobalFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_ClearGlobalFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
ClearGlobalFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_SetRoomFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
SetRoomFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_ClearRoomFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
ClearRoomFlag(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_Wait(Entity* entity, ScriptExecutionContext* context) {
|
|
context->wait = GetNextScriptCommandHalfwordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_WaitForSyncFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 flag = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
if ((gActiveScriptInfo.syncFlags & flag) != flag) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WaitForSyncFlagAndClear(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 flag = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
if ((gActiveScriptInfo.syncFlags & flag) != flag) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
} else {
|
|
gActiveScriptInfo.syncFlags &= ~flag;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WaitPlayerGetItem(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerEntity.action == PLAYER_ITEMGET) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
} else {
|
|
context->wait = 45;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WaitForPlayerEnterRoom(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerEntity.action != PLAYER_ROOMTRANSITION) {
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WaitFor_1(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gRoomControls.scroll_flags & 4) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
} else {
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WaitForFadeFinish(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gFadeControl.active) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_SetFadeTime(Entity* entity, ScriptExecutionContext* context) {
|
|
gActiveScriptInfo.fadeSpeed = context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_SetFadeMask(Entity* entity, ScriptExecutionContext* context) {
|
|
gFadeControl.mask = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_FadeInvert(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFadeInverted(gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommandNop2(Entity* entity, ScriptExecutionContext* context) {
|
|
}
|
|
|
|
void ScriptCommand_SetFade4(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFade(FADE_INSTANT, gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommand_SetFade5(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFade(FADE_IN_OUT | FADE_INSTANT, gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommand_SetFade6(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFade(FADE_BLACK_WHITE | FADE_INSTANT, gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommand_SetFade7(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommand_SetFadeIris(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFadeIrisForCameraTarget(FADE_IRIS);
|
|
}
|
|
|
|
void ScriptCommand_SetFadeIrisInOut(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFadeIrisForCameraTarget(FADE_IN_OUT | FADE_IRIS);
|
|
}
|
|
|
|
void SetFadeIrisForCameraTarget(u32 type) {
|
|
Entity* cameraTarget = gRoomControls.camera_target;
|
|
u32 x, y;
|
|
if (cameraTarget) {
|
|
x = cameraTarget->x.HALF.HI - gRoomControls.scroll_x;
|
|
y = cameraTarget->y.HALF.HI - gRoomControls.scroll_y;
|
|
} else {
|
|
x = DISPLAY_WIDTH / 2;
|
|
y = DISPLAY_HEIGHT / 2;
|
|
}
|
|
SetFadeIris(x, y, type, gActiveScriptInfo.fadeSpeed);
|
|
}
|
|
|
|
void ScriptCommand_0807E858(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFadeProgress(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_SetPlayerIdle(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.controlMode = CONTROL_DISABLED;
|
|
sub_08078B48();
|
|
}
|
|
|
|
void ScriptCommand_EnablePlayerControl(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.controlMode = CONTROL_1;
|
|
}
|
|
|
|
void ScriptCommand_DisablePlayerControl(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.controlMode = CONTROL_DISABLED;
|
|
}
|
|
|
|
void ScriptCommand_SetPlayerAction(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
gPlayerState.queued_action = tmp;
|
|
gPlayerState.field_0x38 = tmp >> 8;
|
|
gPlayerState.field_0x39 = tmp >> 0x10;
|
|
gPlayerState.field_0x3a = tmp >> 0x18;
|
|
}
|
|
|
|
void ScriptCommand_StartPlayerScript(Entity* entity, ScriptExecutionContext* context) {
|
|
StartPlayerScript((u16*)GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer));
|
|
}
|
|
|
|
void ScriptCommand_SetPlayerAnimation(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.animation = context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_0807E8E4(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp = (gUnk_08016984 & 0x3FF);
|
|
u32 tmp2;
|
|
gPlayerEntity.animationState = tmp2 = (context->scriptInstructionPointer[0] - tmp) << 1;
|
|
}
|
|
|
|
void ScriptCommand_SetAction(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->action = context->scriptInstructionPointer[1];
|
|
entity->subAction = 0;
|
|
}
|
|
|
|
void ScriptCommand_SetIntVariable(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_SetVariableToFrame(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = entity->frame;
|
|
entity->frame = 0;
|
|
}
|
|
|
|
void ScriptCommand_SetAnimation(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->field_0x80.HWORD = context->scriptInstructionPointer[1];
|
|
InitAnimationForceUpdate(entity, context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_TriggerInteract(Entity* entity, ScriptExecutionContext* context) {
|
|
if (entity->interactType) {
|
|
entity->interactType = INTERACTION_NONE;
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807E974(Entity* entity, ScriptExecutionContext* context) {
|
|
switch (context->unk_18) {
|
|
default:
|
|
if (!--context->unk_19)
|
|
return;
|
|
break;
|
|
case 0:
|
|
if (!entity->interactType)
|
|
break;
|
|
entity->interactType = INTERACTION_NONE;
|
|
context->unk_18++;
|
|
MessageFromTarget(context->scriptInstructionPointer[1]);
|
|
break;
|
|
case 1:
|
|
if (gMessage.doTextBox & 0x7F)
|
|
break;
|
|
context->unk_18 = 2;
|
|
context->unk_19 = 0xF;
|
|
break;
|
|
}
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void ScriptCommand_AddInteractableWhenBigObject(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractableWhenBigObject(entity);
|
|
}
|
|
|
|
void ScriptCommand_RemoveInteractableObject(Entity* entity, ScriptExecutionContext* context) {
|
|
RemoveInteractableObject(entity);
|
|
}
|
|
|
|
void ScriptCommand_AddInteractableWhenBigFuser(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractableWhenBigFuser(entity, context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_UpdateFusion(Entity* entity, ScriptExecutionContext* context) {
|
|
bool32 isFusionSuccessful;
|
|
PerformFuseAction();
|
|
isFusionSuccessful = TRUE;
|
|
switch (gFuseInfo.fusionState) {
|
|
default:
|
|
isFusionSuccessful = FALSE;
|
|
break;
|
|
case FUSION_STATE_2:
|
|
gPlayerState.controlMode = CONTROL_DISABLED;
|
|
gPauseMenuOptions.disabled = isFusionSuccessful;
|
|
context->condition = isFusionSuccessful;
|
|
break;
|
|
case FUSION_STATE_1:
|
|
context->condition = 0;
|
|
break;
|
|
}
|
|
|
|
if (isFusionSuccessful) {
|
|
PlayerResetStateFromFusion();
|
|
gPlayerState.controlMode = CONTROL_1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807EA4C(Entity* entity, ScriptExecutionContext* context) {
|
|
if (entity->interactType == INTERACTION_FUSE) {
|
|
InitializeFuseInfo(entity, 0, 0, 0);
|
|
entity->interactType = INTERACTION_NONE;
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_AddInteractableFuser(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractableFuser(entity, context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_WaitUntilTextboxCloses(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gMessage.doTextBox & 0x7F) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_MessageFromTarget(Entity* entity, ScriptExecutionContext* context) {
|
|
MessageFromTarget(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_MessageNoOverlap(Entity* entity, ScriptExecutionContext* context) {
|
|
MessageNoOverlap(context->scriptInstructionPointer[1], entity);
|
|
}
|
|
|
|
void ScriptCommand_MessageFromTargetPos(Entity* entity, ScriptExecutionContext* context) {
|
|
MessageFromTarget(context->scriptInstructionPointer[1]);
|
|
gMessage.textWindowPosX = 1;
|
|
gMessage.textWindowPosY = context->scriptInstructionPointer[2];
|
|
}
|
|
|
|
void ScriptCommand_MessageFromTargetTable(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gActiveScriptInfo.commandSize > context->intVariable) {
|
|
u16* tmp = context->scriptInstructionPointer + context->intVariable;
|
|
MessageFromTarget(tmp[1]);
|
|
} else {
|
|
MessageFromTarget(0);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_MessageNoOverlapVar(Entity* entity, ScriptExecutionContext* context) {
|
|
MessageNoOverlap(context->intVariable, entity);
|
|
}
|
|
|
|
void ScriptCommand_EzloMessage(Entity* entity, ScriptExecutionContext* context) {
|
|
CreateEzloHint(context->scriptInstructionPointer[1], 0);
|
|
}
|
|
|
|
void ScriptCommand_0807EB38(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = gUnk_02000040.unk_01;
|
|
}
|
|
|
|
void ScriptCommand_SetAnimationState(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->animationState = context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_0807EB4C(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->animationState = GetAnimationStateForDirection8(
|
|
sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
|
|
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
|
|
}
|
|
|
|
void ScriptCommand_FacePlayer(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
|
|
}
|
|
|
|
void ScriptCommand_FaceAwayFromPlayer(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerEntity.animationState = GetAnimationStateForDirection8(GetFacingDirection(&gPlayerEntity, entity)) & ~1;
|
|
}
|
|
|
|
void ScriptCommand_SetEntityDirection(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->direction = context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_SetEntityDirectionWithAnimationState(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->direction = context->scriptInstructionPointer[1];
|
|
entity->animationState = entity->direction / 4;
|
|
}
|
|
|
|
void ScriptCommand_SetEntitySpeed(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->speed = context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_SetEntityVelocity(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->zVelocity = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer);
|
|
}
|
|
|
|
void ScriptCommand_SetEntityPositionRelative(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->x.HALF.HI = gRoomControls.origin_x + context->scriptInstructionPointer[1];
|
|
entity->y.HALF.HI = gRoomControls.origin_y + context->scriptInstructionPointer[2];
|
|
}
|
|
|
|
void ScriptCommand_OffsetEntityPosition(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->x.HALF.HI += context->scriptInstructionPointer[1];
|
|
entity->y.HALF.HI += context->scriptInstructionPointer[2];
|
|
}
|
|
|
|
void ScriptCommand_MoveEntityToPlayer(Entity* entity, ScriptExecutionContext* context) {
|
|
CopyPosition(&gPlayerEntity, entity);
|
|
}
|
|
|
|
void ScriptCommandNop3(Entity* entity, ScriptExecutionContext* context) {
|
|
}
|
|
|
|
void ScriptCommand_WalkForward(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[1];
|
|
context->postScriptActions |= 2;
|
|
}
|
|
sub_0807EC44(entity, context);
|
|
}
|
|
|
|
void sub_0807EC44(Entity* entity, ScriptExecutionContext* context) {
|
|
LinearMoveUpdate(entity);
|
|
if (--context->unk_12) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_WalkNorth(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[1];
|
|
entity->animationState = 0;
|
|
entity->direction = DirectionNorth;
|
|
context->postScriptActions |= 2;
|
|
}
|
|
sub_0807EC44(entity, context);
|
|
}
|
|
|
|
void ScriptCommand_WalkEast(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[1];
|
|
entity->animationState = 2;
|
|
entity->direction = DirectionEast;
|
|
context->postScriptActions |= 2;
|
|
}
|
|
sub_0807EC44(entity, context);
|
|
}
|
|
|
|
void ScriptCommand_WalkSouth(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[1];
|
|
entity->animationState = 4;
|
|
entity->direction = DirectionSouth;
|
|
context->postScriptActions |= 2;
|
|
}
|
|
sub_0807EC44(entity, context);
|
|
}
|
|
|
|
void ScriptCommand_WalkWest(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[1];
|
|
entity->animationState = 6;
|
|
entity->direction = DirectionWest;
|
|
context->postScriptActions |= 2;
|
|
}
|
|
sub_0807EC44(entity, context);
|
|
}
|
|
|
|
void ScriptCommand_0807ED24(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
s32 tmp, tmp2, tmp3;
|
|
context->unk_18 = 1;
|
|
context->unk_12 = context->scriptInstructionPointer[3];
|
|
tmp = context->scriptInstructionPointer[1];
|
|
tmp2 = entity->x.HALF.HI - gRoomControls.origin_x;
|
|
context->x.WORD = ((tmp - tmp2) << 0x10) / context->unk_12;
|
|
tmp = context->scriptInstructionPointer[2];
|
|
tmp3 = entity->y.HALF.HI - gRoomControls.origin_y;
|
|
context->y.WORD = ((tmp - tmp3) << 0x10) / context->unk_12;
|
|
entity->animationState = GetAnimationStateForDirection8(
|
|
sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
|
|
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
|
|
context->postScriptActions |= 2;
|
|
} else {
|
|
if (!--context->unk_12) {
|
|
entity->x.HALF.HI = context->scriptInstructionPointer[1] + gRoomControls.origin_x;
|
|
entity->y.HALF.HI = context->scriptInstructionPointer[2] + gRoomControls.origin_y;
|
|
return;
|
|
}
|
|
entity->x.WORD += context->x.WORD;
|
|
entity->y.WORD += context->y.WORD;
|
|
}
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
// player movement?
|
|
void ScriptCommand_0807EDD4(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
ScriptCommand_0807EE04(entity, context);
|
|
}
|
|
ScriptCommand_0807EE30(entity, context);
|
|
if (!context->condition) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807EE04(Entity* entity, ScriptExecutionContext* context) {
|
|
sub_0807DEDC(entity, context, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
|
|
context->scriptInstructionPointer[2] + gRoomControls.origin_y);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_0807EE30(Entity* entity, ScriptExecutionContext* context) {
|
|
s32 tmp, tmp2;
|
|
if (!--context->unk_19) {
|
|
context->unk_19 = 8;
|
|
entity->direction =
|
|
sub_080045DA(context->x.HALF.HI - entity->x.HALF.HI, context->y.HALF.HI - entity->y.HALF.HI);
|
|
}
|
|
tmp = entity->x.HALF.HI - context->x.HALF.HI;
|
|
tmp2 = entity->y.HALF.HI - context->y.HALF.HI;
|
|
LinearMoveAngle(entity, entity->speed, entity->direction);
|
|
tmp *= entity->x.HALF.HI - context->x.HALF.HI;
|
|
tmp2 *= entity->y.HALF.HI - context->y.HALF.HI;
|
|
if (tmp <= 0 && tmp2 <= 0) {
|
|
entity->x.HALF.HI = context->x.HALF.HI;
|
|
entity->y.HALF.HI = context->y.HALF.HI;
|
|
context->condition = 1;
|
|
} else {
|
|
context->condition = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807EEB4(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
sub_0807DEDC(entity, context, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI);
|
|
}
|
|
ScriptCommand_0807EE30(entity, context);
|
|
if (!context->condition) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807EEF4(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
sub_0807DEDC(entity, context, entity->x.HALF.HI + ((s16)context->scriptInstructionPointer[1]),
|
|
entity->y.HALF.HI + ((s16)context->scriptInstructionPointer[2]));
|
|
}
|
|
ScriptCommand_0807EE30(entity, context);
|
|
if (!context->condition) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_0807EF3C(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18) {
|
|
context->unk_18 = 1;
|
|
entity->zVelocity = ((s16)context->scriptInstructionPointer[1]) << 8;
|
|
context->x.HALF.LO = context->scriptInstructionPointer[2] << 8;
|
|
GravityUpdate(entity, (u16)context->x.HALF.LO);
|
|
} else {
|
|
if (!GravityUpdate(entity, (u16)context->x.HALF.LO))
|
|
return;
|
|
}
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void ScriptCommand_DoPostScriptAction(Entity* entity, ScriptExecutionContext* context) {
|
|
context->postScriptActions |= 1 << context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_DoPostScriptAction2(Entity* entity, ScriptExecutionContext* context) {
|
|
context->postScriptActions |= 1 << context->scriptInstructionPointer[1];
|
|
}
|
|
|
|
void ScriptCommand_PlaySound(Entity* entity, ScriptExecutionContext* context) {
|
|
SoundReq(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_PlayBgm(Entity* entity, ScriptExecutionContext* context) {
|
|
if (context->scriptInstructionPointer[1] >= 100) {
|
|
SoundReq(gArea.bgm);
|
|
} else {
|
|
SoundReq(context->scriptInstructionPointer[1]);
|
|
}
|
|
}
|
|
|
|
void ScriptCommand_SoundReq(Entity* entity, ScriptExecutionContext* context) {
|
|
SoundReq(GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer));
|
|
}
|
|
|
|
void ScriptCommand_StopBgm(Entity* entity, ScriptExecutionContext* context) {
|
|
SoundReq(SONG_STOP_BGM);
|
|
}
|
|
|
|
void ScriptCommand_ModRupees(Entity* entity, ScriptExecutionContext* context) {
|
|
ModRupees((s16)context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_ModHealth(Entity* entity, ScriptExecutionContext* context) {
|
|
ModHealth(context->scriptInstructionPointer[1]);
|
|
}
|
|
|
|
void ScriptCommand_IncreaseMaxHealth(Entity* entity, ScriptExecutionContext* context) {
|
|
gSave.stats.maxHealth = min(gSave.stats.maxHealth + 8, 0xA0);
|
|
gSave.stats.health = gSave.stats.maxHealth;
|
|
}
|
|
|
|
void ScriptCommand_GivePlayerItem(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 tmp = 0;
|
|
if (context->scriptInstructionPointer[1] == ITEM_SHELLS) {
|
|
tmp = context->intVariable;
|
|
}
|
|
InitItemGetSequence(context->scriptInstructionPointer[1], tmp, 0);
|
|
}
|
|
|
|
void ScriptCommand_GiveKinstone(Entity* entity, ScriptExecutionContext* context) {
|
|
InitItemGetSequence(0x5C, context->scriptInstructionPointer[1], 0);
|
|
}
|
|
|
|
void ScriptCommand_GetInventoryValue(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = GetInventoryValue(context->scriptInstructionPointer[1]);
|
|
context->condition = context->intVariable != 0;
|
|
}
|
|
|
|
void ScriptCommand_SetInventoryValue(Entity* entity, ScriptExecutionContext* context) {
|
|
SetInventoryValue(context->scriptInstructionPointer[1], context->scriptInstructionPointer[2]);
|
|
}
|
|
|
|
void ScriptCommand_InitItemGetSequence(Entity* entity, ScriptExecutionContext* context) {
|
|
InitItemGetSequence(context->scriptInstructionPointer[1], 0, 3);
|
|
}
|
|
|
|
void ScriptCommand_CameraTargetEntity(Entity* entity, ScriptExecutionContext* context) {
|
|
gRoomControls.camera_target = entity;
|
|
}
|
|
|
|
void ScriptCommand_CameraTargetPlayer(Entity* entity, ScriptExecutionContext* context) {
|
|
gRoomControls.camera_target = &gPlayerEntity;
|
|
}
|
|
|
|
void ScriptCommand_SetScrollSpeed(Entity* entity, ScriptExecutionContext* context) {
|
|
gRoomControls.scrollSpeed = context->scriptInstructionPointer[1] & 7;
|
|
}
|
|
|
|
void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context) {
|
|
InitScreenShake(context->scriptInstructionPointer[1], context->scriptInstructionPointer[2]);
|
|
}
|
|
|
|
extern u8 gUnk_0811E750[];
|
|
extern u8 gUnk_0811E758[];
|
|
extern u8 gUnk_0811E760[];
|
|
|
|
void CheckAnyKeyPressed(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = !!gInput.newKeys;
|
|
}
|
|
|
|
void GetRandomInt(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = (s32)Random() % (s32)context->intVariable;
|
|
}
|
|
|
|
void sub_0807F100(Entity* entity, ScriptExecutionContext* context) {
|
|
static const u8 sValues[] = { 0xa, 0x14, 0x1e, 0x12, 0x1c, 0x26, 0xc, 0x18 };
|
|
|
|
u32 rand = Random();
|
|
entity->animationState = rand & 6;
|
|
context->unk_1A = sValues[(rand >> 8) % 8];
|
|
}
|
|
|
|
void sub_0807F128(Entity* entity, ScriptExecutionContext* context) {
|
|
static const u8 sAnimationStates[] = { IdleWest, IdleEast, IdleWest, IdleEast,
|
|
IdleSouth, IdleWest, IdleSouth, IdleEast };
|
|
static const u8 sValues[] = { 0xa, 0x14, 0x1e, 0x12, 0x1c, 0x26, 0xc, 0x18 };
|
|
|
|
u32 rand = Random();
|
|
entity->animationState = sAnimationStates[rand & 7];
|
|
context->unk_1A = sValues[(rand >> 8) % 8];
|
|
}
|
|
|
|
void SetCollisionLayer1(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->collisionLayer = 1;
|
|
UpdateSpriteForCollisionLayer(entity);
|
|
}
|
|
|
|
void SetPlayerCollisionLayer1(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerEntity.collisionLayer = 1;
|
|
UpdateSpriteForCollisionLayer(&gPlayerEntity);
|
|
}
|
|
|
|
void SetCollisionLayer2(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->collisionLayer = 2;
|
|
UpdateSpriteForCollisionLayer(entity);
|
|
}
|
|
|
|
void sub_0807F190(Entity* entity, ScriptExecutionContext* context) {
|
|
SetFade(FADE_INSTANT, 256);
|
|
}
|
|
|
|
void sub_0807F1A0(Entity* entity, ScriptExecutionContext* context) {
|
|
sub_0807DEDC(entity, context, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void sub_0807F1C4(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerState.flags & PL_NO_CAP) {
|
|
gPlayerState.animation = ANIM_DIE1_NOCAP;
|
|
} else {
|
|
gPlayerState.animation = ANIM_DIE1;
|
|
}
|
|
}
|
|
|
|
void sub_0807F1E8(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerState.flags & PL_NO_CAP) {
|
|
gPlayerState.animation = ANIM_DIE2_NOCAP;
|
|
} else {
|
|
gPlayerState.animation = ANIM_DIE2;
|
|
}
|
|
}
|
|
|
|
void sub_0807F210(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerState.flags & PL_NO_CAP) {
|
|
gPlayerState.animation = ANIM_HOP_NOCAP;
|
|
} else {
|
|
gPlayerState.animation = ANIM_HOP;
|
|
}
|
|
}
|
|
|
|
void SetPlayerAnimation2(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.animation = context->intVariable;
|
|
}
|
|
|
|
void EquipItem(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 slot;
|
|
u32 item;
|
|
|
|
item = context->intVariable & 0xFFFF;
|
|
slot = context->intVariable >> 0x10;
|
|
item &= 0xFFFF;
|
|
switch (item) {
|
|
case ITEM_SMITH_SWORD:
|
|
case ITEM_GREEN_SWORD:
|
|
case ITEM_RED_SWORD:
|
|
case ITEM_BLUE_SWORD:
|
|
case ITEM_FOURSWORD:
|
|
// Pick greatest sword unlocked
|
|
item = ITEM_SMITH_SWORD;
|
|
if (GetInventoryValue(ITEM_GREEN_SWORD))
|
|
item = ITEM_GREEN_SWORD;
|
|
if (GetInventoryValue(ITEM_RED_SWORD))
|
|
item = ITEM_RED_SWORD;
|
|
if (GetInventoryValue(ITEM_BLUE_SWORD))
|
|
item = ITEM_BLUE_SWORD;
|
|
if (GetInventoryValue(ITEM_FOURSWORD))
|
|
item = ITEM_FOURSWORD;
|
|
break;
|
|
}
|
|
ForceEquipItem(item, slot);
|
|
}
|
|
|
|
void SetPlayerMacro(Entity* entity, ScriptExecutionContext* context) {
|
|
InitPlayerMacro((PlayerMacroEntry*)context->intVariable);
|
|
}
|
|
|
|
void WaitForPlayerMacro(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerState.playerInput.playerMacro == NULL) {
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void WaitForAnimDone(Entity* entity, ScriptExecutionContext* context) {
|
|
if ((entity->frame & ANIM_DONE) != 0) {
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void WaitForPlayerAnim(Entity* entity, ScriptExecutionContext* context) {
|
|
if ((gPlayerEntity.frame & ANIM_DONE) != 0) {
|
|
gActiveScriptInfo.flags |= 1;
|
|
} else {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void DeleteHitbox(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->hitbox = NULL;
|
|
entity->followerFlag &= ~1;
|
|
}
|
|
|
|
void SetPriorityMessage(Entity* entity, ScriptExecutionContext* context) {
|
|
SetDefaultPriority(entity, PRIO_MESSAGE);
|
|
}
|
|
|
|
void SetPriorityPlayerEvent(Entity* entity, ScriptExecutionContext* context) {
|
|
SetDefaultPriority(entity, PRIO_PLAYER_EVENT);
|
|
}
|
|
|
|
void SetPriorityHighest(Entity* entity, ScriptExecutionContext* context) {
|
|
SetDefaultPriority(entity, PRIO_NO_BLOCK);
|
|
}
|
|
|
|
void sub_0807F36C(Entity* entity, ScriptExecutionContext* context) {
|
|
Entity* fx;
|
|
fx = CreateFx(entity, FX_REFLECT4, 0);
|
|
if (fx != NULL) {
|
|
fx->spritePriority.b0 = 1;
|
|
PositionRelative(entity, fx, 0, Q_16_16(-8.0));
|
|
if (Random() & 1)
|
|
fx->spriteSettings.flipX = 1;
|
|
if (Random() & 1)
|
|
fx->spriteSettings.flipY = 1;
|
|
}
|
|
}
|
|
|
|
void sub_0807F3C8(Entity* entity, ScriptExecutionContext* context) {
|
|
sub_0807F36C(entity, context);
|
|
SoundReq(SFX_BUTTON_DEPRESS);
|
|
}
|
|
|
|
void sub_0807F3D8(Entity* entity, ScriptExecutionContext* context) {
|
|
InitAnimationForceUpdate(entity, context->intVariable + (entity->animationState >> 1));
|
|
entity->field_0x80.HWORD = entity->animIndex;
|
|
}
|
|
|
|
void CreatePlayerExclamationMark(Entity* entity, ScriptExecutionContext* context) {
|
|
CreateSpeechBubbleExclamationMark(&gPlayerEntity, 8, -24);
|
|
}
|
|
|
|
void CreatePlayerQuestionMark(Entity* entity, ScriptExecutionContext* context) {
|
|
CreateSpeechBubbleQuestionMark(&gPlayerEntity, 8, -24);
|
|
}
|
|
|
|
void LoadMenu(Entity* entity, ScriptExecutionContext* context) {
|
|
MenuFadeIn(context->intVariable & 0xff, (u8)(context->intVariable >> 8));
|
|
}
|
|
|
|
void CheckInteractType(Entity* entity, ScriptExecutionContext* context) {
|
|
switch (entity->interactType) {
|
|
case INTERACTION_TALK:
|
|
entity->interactType = INTERACTION_NONE;
|
|
context->intVariable = 1;
|
|
break;
|
|
case INTERACTION_FUSE:
|
|
entity->interactType = INTERACTION_NONE;
|
|
context->intVariable = 2;
|
|
break;
|
|
default:
|
|
context->intVariable = 0;
|
|
break;
|
|
}
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void sub_0807F464(Entity* entity, ScriptExecutionContext* context) {
|
|
s32 s32Var;
|
|
|
|
if (!context->unk_18) {
|
|
context->unk_18++;
|
|
context->postScriptActions |= 2;
|
|
s32Var = context->intVariable;
|
|
context->x.HALF.HI = gRoomControls.origin_x + s32Var;
|
|
context->y.HALF.HI = entity->y.HALF.HI;
|
|
if (s32Var > entity->x.HALF.HI - gRoomControls.origin_x) {
|
|
entity->direction = 64;
|
|
entity->animationState = (entity->animationState & 0x80) | 2;
|
|
} else {
|
|
entity->direction = -64;
|
|
entity->animationState = (entity->animationState & 0x80) | 6;
|
|
}
|
|
}
|
|
LinearMoveAngle(entity, entity->speed, entity->direction);
|
|
if (((context->x.HALF.HI - entity->x.HALF.HI) ^ ((entity->direction & 0x80) << 24)) < 0)
|
|
entity->x.HALF.HI = context->x.HALF.HI;
|
|
else
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void sub_0807F4F8(Entity* entity, ScriptExecutionContext* context) {
|
|
s32 s32Var;
|
|
|
|
if (!context->unk_18) {
|
|
context->unk_18++;
|
|
context->postScriptActions |= 2;
|
|
s32Var = context->intVariable;
|
|
context->x.HALF.HI = entity->x.HALF.HI;
|
|
context->y.HALF.HI = gRoomControls.origin_y + s32Var;
|
|
if (s32Var > entity->y.HALF.HI - gRoomControls.origin_y) {
|
|
entity->direction = 128;
|
|
entity->animationState = (entity->animationState & 0x80) | 4;
|
|
} else {
|
|
entity->direction = 0;
|
|
entity->animationState = (entity->animationState & 0x80);
|
|
}
|
|
}
|
|
LinearMoveAngle(entity, entity->speed, entity->direction);
|
|
if (((context->y.HALF.HI - entity->y.HALF.HI) ^ ((entity->direction & 0x80) << 24)) >= 0)
|
|
entity->y.HALF.HI = context->y.HALF.HI;
|
|
else
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void ReadPlayerAnimationState(Entity* entity, ScriptExecutionContext* context) {
|
|
context->intVariable = gPlayerEntity.animationState >> 1;
|
|
}
|
|
|
|
void WaitForPlayerIdle(Entity* entity, ScriptExecutionContext* context) {
|
|
if (gPlayerState.framestate)
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void sub_0807F5B0(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.field_0x27[0] = context->intVariable;
|
|
}
|
|
|
|
void WaitForCameraTouchRoomBorder(Entity* entity, ScriptExecutionContext* context) {
|
|
s32 left;
|
|
s32 bottom;
|
|
|
|
if (gRoomControls.camera_target != NULL) {
|
|
left = gRoomControls.camera_target->x.HALF.HI - DISPLAY_WIDTH / 2;
|
|
bottom = gRoomControls.camera_target->y.HALF.HI - DISPLAY_HEIGHT / 2;
|
|
|
|
if (left < gRoomControls.origin_x)
|
|
left = gRoomControls.origin_x;
|
|
if (left > gRoomControls.origin_x + gRoomControls.width - DISPLAY_WIDTH)
|
|
left = gRoomControls.origin_x + gRoomControls.width - DISPLAY_WIDTH;
|
|
if (bottom < gRoomControls.origin_y)
|
|
bottom = gRoomControls.origin_y;
|
|
if (bottom > gRoomControls.origin_y + gRoomControls.height - DISPLAY_HEIGHT)
|
|
bottom = gRoomControls.origin_y + gRoomControls.height - DISPLAY_HEIGHT;
|
|
|
|
if (left == gRoomControls.scroll_x && bottom == gRoomControls.scroll_y)
|
|
gActiveScriptInfo.flags |= 1;
|
|
else
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|
|
|
|
void sub_0807F634(Entity* entity, ScriptExecutionContext* context) {
|
|
u16* textIndices = (u16*)context->intVariable;
|
|
InitializeFuseInfo(entity, textIndices[0], textIndices[1], textIndices[2]);
|
|
gPlayerState.controlMode = CONTROL_DISABLED;
|
|
}
|
|
|
|
void sub_0807F650(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 fuserId = GetFuserId(entity);
|
|
InitializeFuseInfo(entity, gUnk_08001A7C[fuserId][0], gUnk_08001A7C[fuserId][1], gUnk_08001A7C[fuserId][2]);
|
|
gPlayerState.controlMode = CONTROL_DISABLED;
|
|
}
|
|
|
|
void sub_0807F680(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x > (s32)(context->intVariable & 0xffff);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void sub_0807F6B4(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y > (s32)(context->intVariable & 0xffff);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void SetPlayerFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.flags |= context->intVariable;
|
|
}
|
|
|
|
void ResetPlayerFlag(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.flags &= ~context->intVariable;
|
|
}
|
|
|
|
void ScriptCommand_ShowNPCDialogue(Entity* entity, ScriptExecutionContext* context) {
|
|
ShowNPCDialogue(entity, (Dialog*)context->intVariable);
|
|
}
|
|
|
|
void sub_0807F714(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->spriteRendering.b3 = gUnk_08114F30[entity->spriteRendering.b3];
|
|
SortEntityAbove(entity, entity);
|
|
}
|
|
|
|
void sub_0807F738(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->spriteRendering.b3 = gUnk_08114F34[entity->spriteRendering.b3];
|
|
SortEntityBelow(entity, entity);
|
|
}
|
|
|
|
void SetPlayerPos(Entity* entity, ScriptExecutionContext* context) {
|
|
s32 s32Var = context->intVariable;
|
|
gPlayerEntity.x.HALF.HI = (s32Var >> 16) + gRoomControls.origin_x;
|
|
gPlayerEntity.y.HALF.HI = (s32Var & 0xffff) + gRoomControls.origin_y;
|
|
}
|
|
|
|
void GetConditionSet(Entity* entity, ScriptExecutionContext* context) {
|
|
if (context->condition)
|
|
context->intVariable = 1;
|
|
else
|
|
context->intVariable = 0;
|
|
}
|
|
|
|
void ScriptCommand_SaleItemConfirmMessage(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 item = context->intVariable;
|
|
u32 msg;
|
|
u32 price;
|
|
|
|
if (context->intVariable == 0)
|
|
item = gRoomVars.shopItemType;
|
|
|
|
msg = GetSaleItemConfirmMessageID(item);
|
|
price = GetItemPrice(item);
|
|
MessageNoOverlap(msg, entity);
|
|
gMessage.rupees = (u16)price;
|
|
}
|
|
|
|
void ScriptCommand_CheckShopItemPrice(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 item = context->intVariable;
|
|
|
|
if (context->intVariable == 0)
|
|
item = gRoomVars.shopItemType;
|
|
|
|
context->condition = GetItemPrice(item) <= gSave.stats.rupees;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_BuyShopItem(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 item = context->intVariable;
|
|
u32 price;
|
|
|
|
if (context->intVariable == 0)
|
|
item = gRoomVars.shopItemType;
|
|
|
|
price = GetItemPrice(item);
|
|
ModRupees(-price);
|
|
InitItemGetSequence(item, 0, 0);
|
|
gRoomVars.shopItemType = 0;
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void ScriptCommand_PlayerDropHeldObject(Entity* entity, ScriptExecutionContext* context) {
|
|
PlayerDropHeldObject();
|
|
}
|
|
|
|
void sub_0807F844(Entity* entity, ScriptExecutionContext* context) {
|
|
gRoomControls.camera_target = entity;
|
|
sub_080809D4();
|
|
}
|
|
|
|
void ScriptCommand_SetMessageValue(Entity* entity, ScriptExecutionContext* context) {
|
|
u32 value;
|
|
u32 idx;
|
|
|
|
idx = (context->intVariable >> 0x10) & 3;
|
|
value = context->intVariable & 0xffff;
|
|
switch (idx) {
|
|
case SMV_DEFAULT:
|
|
case SMV_RUPEES:
|
|
gMessage.rupees = value;
|
|
break;
|
|
case SMV_FIELD_0X14:
|
|
gMessage.field_0x14 = value;
|
|
break;
|
|
case SMV_FIELD_0X18:
|
|
gMessage.field_0x18 = value;
|
|
break;
|
|
case SMV_FIELD_0X1C:
|
|
gMessage.field_0x1c = value;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CheckEntityOnScreen(Entity* entity, ScriptExecutionContext* context) {
|
|
if (CheckOnScreen(entity))
|
|
context->condition = 1;
|
|
else
|
|
context->condition = 0;
|
|
}
|
|
|
|
void DoGravity(Entity* entity, ScriptExecutionContext* context) {
|
|
GravityUpdate(entity, context->intVariable);
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void sub_0807F8E8(Entity* entity, ScriptExecutionContext* context) {
|
|
Entity* c = CreateObjectWithParent(entity, SANCTUARY_STONE_TABLET, 0, 0);
|
|
if (c != NULL) {
|
|
c->parent = entity;
|
|
c->field_0x86.HWORD = (context->intVariable & 0x3ff) | 0x8000;
|
|
}
|
|
}
|
|
|
|
void PutItemAnySlot(Entity* entity, ScriptExecutionContext* context) {
|
|
PutItemOnSlot(context->intVariable);
|
|
}
|
|
|
|
void MakeInteractableAsMinish(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractableAsMinishObject(entity);
|
|
}
|
|
|
|
void MakePedestalInteractable(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractablePedestal(entity);
|
|
}
|
|
|
|
void MakeCheckableObjectInteractable(Entity* entity, ScriptExecutionContext* context) {
|
|
AddInteractableCheckableObject(entity);
|
|
}
|
|
|
|
void sub_0807F93C(Entity* entity, ScriptExecutionContext* context) {
|
|
CreateSpeechBubbleSleep(entity, (context->intVariable >> 8) & 0xff, context->intVariable & 0xff);
|
|
}
|
|
|
|
void DeleteThoughtBubble(Entity* entity, ScriptExecutionContext* context) {
|
|
Entity* c = FindEntity(OBJECT, THOUGHT_BUBBLE, 6, 0, 2);
|
|
if (c != NULL)
|
|
DeleteEntity(c);
|
|
}
|
|
|
|
void CheckMessageEqual(Entity* entity, ScriptExecutionContext* context) {
|
|
context->condition = context->intVariable == gTextRender.curToken.textIndex;
|
|
}
|
|
|
|
void SetEntityHeight(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->z.WORD = context->intVariable;
|
|
}
|
|
|
|
void SetSpriteOffset(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->spriteOffsetX = (s32)context->intVariable >> 0x10;
|
|
entity->spriteOffsetY = context->intVariable & 0xffff;
|
|
}
|
|
|
|
void WaitForPlayerNormal(Entity* entity, ScriptExecutionContext* context) {
|
|
switch (gPlayerState.framestate) {
|
|
case PL_STATE_THROW:
|
|
case PL_STATE_SWIM:
|
|
case PL_STATE_PARACHUTE:
|
|
case PL_STATE_FALL:
|
|
case PL_STATE_JUMP:
|
|
case PL_STATE_C:
|
|
case PL_STATE_D:
|
|
case PL_STATE_USEPORTAL:
|
|
case PL_STATE_F:
|
|
case PL_STATE_TRAPPED:
|
|
case PL_STATE_11:
|
|
case PL_STATE_DIE:
|
|
case PL_STATE_TALKEZLO:
|
|
case PL_STATE_CAPE:
|
|
case PL_STATE_ITEMGET:
|
|
case PL_STATE_DROWN:
|
|
case PL_STATE_HOLE:
|
|
case PL_STATE_CLIMB:
|
|
case PL_STATE_SINKING:
|
|
case PL_STATE_STAIRS:
|
|
gActiveScriptInfo.commandSize = 0;
|
|
break;
|
|
default:
|
|
gActiveScriptInfo.flags |= 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void WaitForPlayerNormalOrTalkEzlo(Entity* entity, ScriptExecutionContext* context) {
|
|
switch (gPlayerState.framestate) {
|
|
case PL_STATE_THROW:
|
|
case PL_STATE_SWIM:
|
|
case PL_STATE_PARACHUTE:
|
|
case PL_STATE_FALL:
|
|
case PL_STATE_JUMP:
|
|
case PL_STATE_C:
|
|
case PL_STATE_D:
|
|
case PL_STATE_USEPORTAL:
|
|
case PL_STATE_F:
|
|
case PL_STATE_TRAPPED:
|
|
case PL_STATE_11:
|
|
case PL_STATE_DIE:
|
|
case PL_STATE_CAPE:
|
|
case PL_STATE_ITEMGET:
|
|
case PL_STATE_DROWN:
|
|
case PL_STATE_HOLE:
|
|
case PL_STATE_CLIMB:
|
|
case PL_STATE_SINKING:
|
|
case PL_STATE_STAIRS:
|
|
gActiveScriptInfo.commandSize = 0;
|
|
break;
|
|
default:
|
|
gActiveScriptInfo.flags |= 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_0807FADC(Entity* entity, ScriptExecutionContext* context) {
|
|
switch (context->unk_18) {
|
|
case 0:
|
|
context->unk_18++;
|
|
sub_0808C650(entity, context->intVariable);
|
|
break;
|
|
case 1:
|
|
if (sub_0808C67C())
|
|
context->unk_18++;
|
|
break;
|
|
case 2:
|
|
sub_0808C688();
|
|
return;
|
|
}
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void sub_0807FB28(Entity* entity, ScriptExecutionContext* context) {
|
|
if (!context->unk_18)
|
|
SetFillColor(0x7fff, 1);
|
|
|
|
context->unk_18++;
|
|
if (context->unk_18 >= context->intVariable)
|
|
SetFillColor(0, 0);
|
|
else
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
void SetPlayerIFrames(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerEntity.iframes = context->intVariable;
|
|
}
|
|
|
|
void DisablePlayerSwimState(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.swim_state = 0;
|
|
gPlayerEntity.collisionFlags &= ~4;
|
|
}
|
|
|
|
void sub_0807FB94(Entity* entity, ScriptExecutionContext* context) {
|
|
SetTask(TASK_STAFFROLL);
|
|
}
|
|
|
|
void sub_0807FBA0(Entity* entity, ScriptExecutionContext* context) {
|
|
entity->x.HALF.HI = gRoomControls.scroll_x + 120;
|
|
entity->y.HALF.HI = gRoomControls.scroll_y + 80;
|
|
}
|
|
|
|
void sub_0807FBB4(Entity* entity, ScriptExecutionContext* context) {
|
|
gPlayerState.mobility |= 0x80;
|
|
}
|
|
|
|
void sub_0807FBC4(Entity* entity, ScriptExecutionContext* context) {
|
|
RequestPriorityOverPlayer(entity);
|
|
}
|
|
|
|
void sub_0807FBCC(Entity* entity, ScriptExecutionContext* context) {
|
|
RevokePriorityOverPlayer(entity);
|
|
}
|
|
|
|
void sub_0807FBD4(Entity* entity, ScriptExecutionContext* context) {
|
|
LinearMoveAngle(entity, entity->speed, entity->direction);
|
|
if (CheckOnScreen(entity))
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
|
|
#ifndef EU
|
|
void sub_0807FBFC(Entity* entity, ScriptExecutionContext* context) {
|
|
gSave.stats.charm = 0;
|
|
gSave.stats.charmTimer = 0;
|
|
gSave.stats.picolyteType = 0;
|
|
gSave.stats.picolyteTimer = 0;
|
|
gSave.stats.effect = 0;
|
|
gSave.stats.effectTimer = 0;
|
|
}
|
|
|
|
#if defined(USA) || defined(DEMO_USA) || defined(DEMO_JP)
|
|
void sub_0807FC24(Entity* entity, ScriptExecutionContext* context) {
|
|
#if defined(DEMO_JP)
|
|
u32 idx = gRoomControls.room == 1 ? 0xcf : 0xd0;
|
|
#else
|
|
u32 idx = gRoomControls.room == 1 ? 0xcf : 0xd1;
|
|
#endif
|
|
SetLocalFlag(idx);
|
|
}
|
|
#endif
|
|
#endif
|