diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2021-11-06 00:33:07 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2021-11-06 00:33:07 +0100 |
| commit | a6d133e42dfec121b42028eb0d3a38fa4345d18d (patch) | |
| tree | ac7d0d5684c7b236bfbc996cf5a01a530f123e16 /src/script.c | |
| parent | 1a0f416bacbd8ceefa3197fcb71015ee721e43fb (diff) | |
| parent | 3592e47cd6167082e866b1a391781995df253c3b (diff) | |
Merge branch 'master' into asset-extraction
Diffstat (limited to 'src/script.c')
| -rw-r--r-- | src/script.c | 705 |
1 files changed, 667 insertions, 38 deletions
diff --git a/src/script.c b/src/script.c index 28b469b9..655eb3b5 100644 --- a/src/script.c +++ b/src/script.c @@ -11,6 +11,8 @@ #include "random.h" #include "audio.h" #include "functions.h" +#include "main.h" +#include "effects.h" void InitScriptForEntity(Entity*, ScriptExecutionContext*, u16*); void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script); @@ -73,7 +75,7 @@ void ScriptCommand_WaitForPlayerAction0x17(Entity* entity, ScriptExecutionContex void ScriptCommand_WaitFor_1(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_WaitFor_2(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807E778(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_0807E788(Entity* entity, ScriptExecutionContext* context); +void ScriptCommand_SetFadeMask(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807E79C(Entity* entity, ScriptExecutionContext* context); void ScriptCommandNop2(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_DoFade4(Entity* entity, ScriptExecutionContext* context); @@ -104,11 +106,11 @@ void ScriptCommand_0807E9F0(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807EA4C(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807EA88(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_WaitUntilTextboxCloses(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_TextboxNoOverlapFollow(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_TextboxNoOverlap(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_TextboxNoOverlapFollowPos(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_TextboxNoOverlapFollowTable(Entity* entity, ScriptExecutionContext* context); -void ScriptCommand_TextboxNoOverlapVar(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_0807EB28(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807EB38(Entity* entity, ScriptExecutionContext* context); void ScriptCommand_0807EB44(Entity* entity, ScriptExecutionContext* context); @@ -157,7 +159,7 @@ void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context); extern void CreateSpeechBubbleExclamationMark(Entity*, u32, u32); extern void CreateSpeechBubbleQuestionMark(Entity*, u32, u32); -extern void sub_0801C4A0(u32); +extern void RecoverUI(u32); typedef void (*ScriptCommand)(Entity*, ScriptExecutionContext*); @@ -218,7 +220,7 @@ const ScriptCommand gScriptCommands[] = { ScriptCommandNop, ScriptCommand_WaitFor_1, ScriptCommand_WaitFor_2, ScriptCommand_0807E778, - ScriptCommand_0807E788, + ScriptCommand_SetFadeMask, ScriptCommand_0807E79C, ScriptCommandNop2, ScriptCommand_DoFade4, @@ -251,11 +253,11 @@ const ScriptCommand gScriptCommands[] = { ScriptCommandNop, ScriptCommand_0807EA4C, ScriptCommand_0807EA88, ScriptCommand_WaitUntilTextboxCloses, - ScriptCommand_TextboxNoOverlapFollow, - ScriptCommand_TextboxNoOverlap, - ScriptCommand_TextboxNoOverlapFollowPos, - ScriptCommand_TextboxNoOverlapFollowTable, - ScriptCommand_TextboxNoOverlapVar, + ScriptCommand_MessageFromTarget, + ScriptCommand_MessageNoOverlap, + ScriptCommand_MessageFromTargetPos, + ScriptCommand_MessageFromTargetTable, + ScriptCommand_MessageNoOverlapVar, ScriptCommand_0807EB28, ScriptCommand_0807EB38, ScriptCommand_0807EB44, @@ -301,6 +303,9 @@ const ScriptCommand gScriptCommands[] = { ScriptCommandNop, ScriptCommand_0807F0B4, ScriptCommand_0807F0C8 }; +extern u16* gUnk_08001A7C[]; +extern u8 gUnk_08114F30[]; +extern u8 gUnk_08114F34[]; extern const u16 gUnk_08016984; extern u8 gUnk_0811E514[]; extern u8 gUnk_0811E510[]; @@ -401,7 +406,7 @@ void HandlePostScriptActions(Entity* entity, ScriptExecutionContext* context) { case 1 << 0x02: break; case 1 << 0x03: - entity->field_0x20 = 0x18000; + entity->hVelocity = 0x18000; break; case 1 << 0x04: CreateSpeechBubbleExclamationMark(entity, 8, -0x18); @@ -597,7 +602,7 @@ void sub_0807DF38(void) { void sub_0807DF50(void) { gUnk_02034490[0] = 0; gUnk_0200AF00.filler0[1] = 0; - sub_0801C4A0(0); + RecoverUI(0); sub_080791D0(); sub_08079184(); } @@ -801,7 +806,7 @@ void ScriptCommand_CheckEntityInteractType(Entity* entity, ScriptExecutionContex } void ScriptCommand_0807E30C(Entity* entity, ScriptExecutionContext* context) { - if ((context->unk_1A & 0xF) == 0 && (gPlayerState.flags.all & 0x80) == 0 && + if ((context->unk_1A & 0xF) == 0 && (gPlayerState.flags & 0x80) == 0 && sub_080041A0(entity, &gPlayerEntity, 0x28, 0x28)) { entity->animationState = sub_0806F5B0(GetFacingDirection(entity, &gPlayerEntity)); } @@ -885,12 +890,12 @@ void ScriptCommand_0807E514(Entity* entity, ScriptExecutionContext* context) { void ScriptCommand_CheckPlayerFlags(Entity* entity, ScriptExecutionContext* context) { context->condition = - !!(GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer) & gPlayerState.flags.all); + !!(GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer) & gPlayerState.flags); gActiveScriptInfo.flags |= 1; } void ScriptCommand_0807E564(Entity* entity, ScriptExecutionContext* context) { - context->condition = (gPlayerState.flags.all >> 7) & 1; + context->condition = (gPlayerState.flags >> 7) & 1; gActiveScriptInfo.flags |= 1; } @@ -1000,8 +1005,8 @@ void ScriptCommand_0807E778(Entity* entity, ScriptExecutionContext* context) { gActiveScriptInfo.unk_08 = context->scriptInstructionPointer[1]; } -void ScriptCommand_0807E788(Entity* entity, ScriptExecutionContext* context) { - gFadeControl.field_0x4 = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer); +void ScriptCommand_SetFadeMask(Entity* entity, ScriptExecutionContext* context) { + gFadeControl.mask = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer); } void ScriptCommand_0807E79C(Entity* entity, ScriptExecutionContext* context) { @@ -1126,10 +1131,10 @@ void ScriptCommand_0807E974(Entity* entity, ScriptExecutionContext* context) { break; entity->interactType = 0; context->unk_18++; - TextboxNoOverlapFollow(context->scriptInstructionPointer[1]); + MessageFromTarget(context->scriptInstructionPointer[1]); break; case 1: - if (gTextBox.doTextBox & 0x7F) + if (gMessage.doTextBox & 0x7F) break; context->unk_18 = 2; context->unk_19 = 0xF; @@ -1190,36 +1195,36 @@ void ScriptCommand_0807EA88(Entity* entity, ScriptExecutionContext* context) { } void ScriptCommand_WaitUntilTextboxCloses(Entity* entity, ScriptExecutionContext* context) { - if (gTextBox.doTextBox & 0x7F) { + if (gMessage.doTextBox & 0x7F) { gActiveScriptInfo.commandSize = 0; } } -void ScriptCommand_TextboxNoOverlapFollow(Entity* entity, ScriptExecutionContext* context) { - TextboxNoOverlapFollow(context->scriptInstructionPointer[1]); +void ScriptCommand_MessageFromTarget(Entity* entity, ScriptExecutionContext* context) { + MessageFromTarget(context->scriptInstructionPointer[1]); } -void ScriptCommand_TextboxNoOverlap(Entity* entity, ScriptExecutionContext* context) { - TextboxNoOverlap(context->scriptInstructionPointer[1], entity); +void ScriptCommand_MessageNoOverlap(Entity* entity, ScriptExecutionContext* context) { + MessageNoOverlap(context->scriptInstructionPointer[1], entity); } -void ScriptCommand_TextboxNoOverlapFollowPos(Entity* entity, ScriptExecutionContext* context) { - TextboxNoOverlapFollow(context->scriptInstructionPointer[1]); - gTextBox.textWindowPosX = 1; - gTextBox.textWindowPosY = context->scriptInstructionPointer[2]; +void ScriptCommand_MessageFromTargetPos(Entity* entity, ScriptExecutionContext* context) { + MessageFromTarget(context->scriptInstructionPointer[1]); + gMessage.textWindowPosX = 1; + gMessage.textWindowPosY = context->scriptInstructionPointer[2]; } -void ScriptCommand_TextboxNoOverlapFollowTable(Entity* entity, ScriptExecutionContext* context) { +void ScriptCommand_MessageFromTargetTable(Entity* entity, ScriptExecutionContext* context) { if (gActiveScriptInfo.commandSize > context->intVariable) { u16* tmp = context->scriptInstructionPointer + context->intVariable; - TextboxNoOverlapFollow(tmp[1]); + MessageFromTarget(tmp[1]); } else { - TextboxNoOverlapFollow(0); + MessageFromTarget(0); } } -void ScriptCommand_TextboxNoOverlapVar(Entity* entity, ScriptExecutionContext* context) { - TextboxNoOverlap(context->intVariable, entity); +void ScriptCommand_MessageNoOverlapVar(Entity* entity, ScriptExecutionContext* context) { + MessageNoOverlap(context->intVariable, entity); } void ScriptCommand_0807EB28(Entity* entity, ScriptExecutionContext* context) { @@ -1262,7 +1267,7 @@ void ScriptCommand_SetEntitySpeed(Entity* entity, ScriptExecutionContext* contex } void ScriptCommand_SetEntity0x20(Entity* entity, ScriptExecutionContext* context) { - entity->field_0x20 = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer); + entity->hVelocity = GetNextScriptCommandWordAfterCommandMetadata(context->scriptInstructionPointer); } void ScriptCommand_SetEntityPositionRelative(Entity* entity, ScriptExecutionContext* context) { @@ -1433,7 +1438,7 @@ void ScriptCommand_0807EEF4(Entity* entity, ScriptExecutionContext* context) { void ScriptCommand_0807EF3C(Entity* entity, ScriptExecutionContext* context) { if (!context->unk_18) { context->unk_18 = 1; - entity->field_0x20 = ((s16)context->scriptInstructionPointer[1]) << 8; + entity->hVelocity = ((s16)context->scriptInstructionPointer[1]) << 8; context->x.HALF.LO = context->scriptInstructionPointer[2] << 8; sub_08003FC4(entity, (u16)context->x.HALF.LO); } else { @@ -1524,3 +1529,627 @@ void ScriptCommand_0807F0B4(Entity* entity, ScriptExecutionContext* context) { void ScriptCommand_0807F0C8(Entity* entity, ScriptExecutionContext* context) { sub_08080964(context->scriptInstructionPointer[1], context->scriptInstructionPointer[2]); } + +extern u8 gUnk_0811E750[]; +extern u8 gUnk_0811E758[]; +extern u8 gUnk_0811E760[]; + +void sub_0807F0D8(Entity* entity, ScriptExecutionContext* context) { + context->condition = (-(u32)gInput.newKeys | ((u32)gInput.newKeys)) >> 0x1f; +} + +void sub_0807F0EC(Entity* entity, ScriptExecutionContext* context) { + context->intVariable = (s32)Random() % (s32)context->intVariable; +} + +void sub_0807F100(Entity* entity, ScriptExecutionContext* context) { + u32 rand; + + rand = Random(); + entity->animationState = rand & 6; + context->unk_1A = gUnk_0811E750[(rand >> 8) & 7]; +} + +void sub_0807F128(Entity* entity, ScriptExecutionContext* context) { + u32 rand; + + rand = Random(); + entity->animationState = gUnk_0811E758[rand & 7]; + context->unk_1A = gUnk_0811E760[(rand >> 8) & 7]; +} + +void sub_0807F158(Entity* entity, ScriptExecutionContext* context) { + entity->collisionLayer = 1; + UpdateSpriteForCollisionLayer(entity); +} + +void sub_0807F168(Entity* entity, ScriptExecutionContext* context) { + gPlayerEntity.collisionLayer = 1; + UpdateSpriteForCollisionLayer(&gPlayerEntity); +} + +void sub_0807F180(Entity* entity, ScriptExecutionContext* context) { + entity->collisionLayer = 2; + UpdateSpriteForCollisionLayer(entity); +} + +void sub_0807F190(Entity* entity, ScriptExecutionContext* context) { + DoFade(4, 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 & 8) != 0) { + gPlayerState.field_0x8 = 0x459; + } else { + gPlayerState.field_0x8 = 0x1bc; + } +} + +void sub_0807F1E8(Entity* entity, ScriptExecutionContext* context) { + if ((gPlayerState.flags & 8) != 0) { + gPlayerState.field_0x8 = 0x45a; + } else { + gPlayerState.field_0x8 = 0x2bd; + } +} + +void sub_0807F210(Entity* entity, ScriptExecutionContext* context) { + if ((gPlayerState.flags & 8) != 0) { + gPlayerState.field_0x8 = 0x41c; + } else { + gPlayerState.field_0x8 = 0x80c; + } +} + +void sub_0807F238(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.field_0x8 = context->intVariable; +} + +void sub_0807F244(Entity* entity, ScriptExecutionContext* context) { + u32 slot; + u32 item; + + item = context->intVariable & 0xFFFF; + slot = context->intVariable >> 0x10; + item &= 0xFFFF; + switch (item) { + case 1: + case 2: + case 3: + case 4: + case 6: + // Pick greatest sword unlocked + item = 1; + if (GetInventoryValue(2)) + item = 2; + if (GetInventoryValue(3)) + item = 3; + if (GetInventoryValue(4)) + item = 4; + if (GetInventoryValue(6)) + item = 6; + break; + } + ForceEquipItem(item, slot); +} + +void sub_0807F29C(Entity* entity, ScriptExecutionContext* context) { + sub_0805ED14((void*)context->intVariable); +} + +void sub_0807F2A8(Entity* entity, ScriptExecutionContext* context) { + if (gPlayerState.field_0x9c == 0) { + gActiveScriptInfo.flags |= 1; + } else { + gActiveScriptInfo.commandSize = 0; + } +} + +void sub_0807F2D4(Entity* entity, ScriptExecutionContext* context) { + if ((entity->frames.all & 0x80) != 0) { + gActiveScriptInfo.flags |= 1; + } else { + gActiveScriptInfo.commandSize = 0; + } +} + +void sub_0807F304(Entity* entity, ScriptExecutionContext* context) { + if ((gPlayerEntity.frames.all & 0x80) != 0) { + gActiveScriptInfo.flags |= 1; + } else { + gActiveScriptInfo.commandSize = 0; + } +} + +void sub_0807F338(Entity* entity, ScriptExecutionContext* context) { + entity->hitbox = NULL; + entity->field_0x17 &= ~1; +} + +void sub_0807F348(Entity* entity, ScriptExecutionContext* context) { + sub_0805E3A0(entity, 2); +} + +void sub_0807F354(Entity* entity, ScriptExecutionContext* context) { + sub_0805E3A0(entity, 6); +} + +void sub_0807F360(Entity* entity, ScriptExecutionContext* context) { + sub_0805E3A0(entity, 3); +} + +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, -524288); + if (Random() & 1) + fx->spriteSettings.b.flipX = 1; + if (Random() & 1) + fx->spriteSettings.b.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 sub_0807F3F8(Entity* entity, ScriptExecutionContext* context) { + CreateSpeechBubbleExclamationMark(&gPlayerEntity, 8, -24); +} + +void sub_0807F40C(Entity* entity, ScriptExecutionContext* context) { + CreateSpeechBubbleQuestionMark(&gPlayerEntity, 8, -24); +} + +void sub_0807F420(Entity* entity, ScriptExecutionContext* context) { + MenuFadeIn(context->intVariable & 0xff, (u8)(context->intVariable >> 8)); +} + +void sub_0807F434(Entity* entity, ScriptExecutionContext* context) { + switch (entity->interactType) { + case 1: + entity->interactType = 0; + context->intVariable = 1; + break; + case 2: + entity->interactType = 0; + 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.roomOriginX + s32Var; + context->y.HALF.HI = entity->y.HALF.HI; + if (s32Var > entity->x.HALF.HI - gRoomControls.roomOriginX) { + entity->direction = 64; + entity->animationState = (entity->animationState & 0x80) | 2; + } else { + entity->direction = -64; + entity->animationState = (entity->animationState & 0x80) | 6; + } + } + sub_0806F62C(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.roomOriginY + s32Var; + if (s32Var > entity->y.HALF.HI - gRoomControls.roomOriginY) { + entity->direction = 128; + entity->animationState = (entity->animationState & 0x80) | 4; + } else { + entity->direction = 0; + entity->animationState = (entity->animationState & 0x80); + } + } + sub_0806F62C(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 sub_0807F584(Entity* entity, ScriptExecutionContext* context) { + context->intVariable = gPlayerEntity.animationState >> 1; +} + +void sub_0807F594(Entity* entity, ScriptExecutionContext* context) { + if (gPlayerState.field_0xa8) + gActiveScriptInfo.commandSize = 0; +} + +void sub_0807F5B0(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.field_0x27[0] = context->intVariable; +} + +void sub_0807F5C0(Entity* entity, ScriptExecutionContext* context) { + s32 left; + s32 bottom; + + if (gRoomControls.cameraTarget != NULL) { + left = gRoomControls.cameraTarget->x.HALF.HI - DISPLAY_WIDTH / 2; + bottom = gRoomControls.cameraTarget->y.HALF.HI - DISPLAY_HEIGHT / 2; + + if (left < gRoomControls.roomOriginX) + left = gRoomControls.roomOriginX; + if (left > gRoomControls.roomOriginX + gRoomControls.width - DISPLAY_WIDTH) + left = gRoomControls.roomOriginX + gRoomControls.width - DISPLAY_WIDTH; + if (bottom < gRoomControls.roomOriginY) + bottom = gRoomControls.roomOriginY; + if (bottom > gRoomControls.roomOriginY + gRoomControls.height - DISPLAY_HEIGHT) + bottom = gRoomControls.roomOriginY + gRoomControls.height - DISPLAY_HEIGHT; + + if (left == gRoomControls.roomScrollX && bottom == gRoomControls.roomScrollY) + gActiveScriptInfo.flags |= 1u; + else + gActiveScriptInfo.commandSize = 0; + } +} + +void sub_0807F634(Entity* entity, ScriptExecutionContext* context) { + u16* p = (u16*)context->intVariable; + sub_0801DFB4(entity, p[0], p[1], p[2]); + gPlayerState.field_0x8b = 3; +} + +void sub_0807F650(Entity* entity, ScriptExecutionContext* context) { + u32 p = sub_08002632(entity); + sub_0801DFB4(entity, gUnk_08001A7C[p][0], gUnk_08001A7C[p][1], gUnk_08001A7C[p][2]); + gPlayerState.field_0x8b = 3; +} + +void sub_0807F680(Entity* entity, ScriptExecutionContext* context) { + context->condition = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX > (s32)(context->intVariable & 0xffff); + gActiveScriptInfo.flags |= 1; +} + +void sub_0807F6B4(Entity* entity, ScriptExecutionContext* context) { + context->condition = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY > (s32)(context->intVariable & 0xffff); + gActiveScriptInfo.flags |= 1; +} + +void sub_0807F6E8(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.flags |= context->intVariable; +} + +void sub_0807F6F8(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.flags &= ~context->intVariable; +} + +void sub_0807F708(Entity* entity, ScriptExecutionContext* context) { + ShowNPCDialogue(entity, (Dialog*)context->intVariable); +} + +void sub_0807F714(Entity* entity, ScriptExecutionContext* context) { + entity->spriteRendering.b3 = gUnk_08114F30[entity->spriteRendering.b3]; + ResolveEntityOnTop(entity, entity); +} + +void sub_0807F738(Entity* entity, ScriptExecutionContext* context) { + entity->spriteRendering.b3 = gUnk_08114F34[entity->spriteRendering.b3]; + sub_0806FAD8(entity, entity); +} + +void sub_0807F75C(Entity* entity, ScriptExecutionContext* context) { + s32 s32Var = context->intVariable; + gPlayerEntity.x.HALF.HI = (s32Var >> 16) + gRoomControls.roomOriginX; + gPlayerEntity.y.HALF.HI = (s32Var & 0xffff) + gRoomControls.roomOriginY; +} + +void sub_0807F77C(Entity* entity, ScriptExecutionContext* context) { + if (context->condition) + context->intVariable = 1; + else + context->intVariable = 0; +} + +void sub_0807F78C(Entity* entity, ScriptExecutionContext* context) { + u32 item = context->intVariable; + u32 msg; + u32 price; + + if (context->intVariable == 0) + item = gRoomVars.itemForSaleIndex; + + msg = GetSaleItemConfirmMessageID(item); + price = GetItemPrice(item); + MessageNoOverlap(msg, entity); + gMessage.field_0x10 = (u16)price; +} + +void sub_0807F7C4(Entity* entity, ScriptExecutionContext* context) { + u32 item = context->intVariable; + u32 msg; + u32 price; + + if (context->intVariable == 0) + item = gRoomVars.itemForSaleIndex; + + context->condition = GetItemPrice(item) <= gSave.stats.rupees; + gActiveScriptInfo.flags |= 1; +} + +void sub_0807F800(Entity* entity, ScriptExecutionContext* context) { + u32 item = context->intVariable; + u32 msg; + u32 price; + + if (context->intVariable == 0) + item = gRoomVars.itemForSaleIndex; + + price = GetItemPrice(item); + ModRupees(-price); + sub_080A7C18(item, 0, 0); + gRoomVars.itemForSaleIndex = 0; + gActiveScriptInfo.flags |= 1; +} + +void sub_0807F83C(Entity* entity, ScriptExecutionContext* context) { + sub_08079184(); +} + +void sub_0807F844(Entity* entity, ScriptExecutionContext* context) { + gRoomControls.cameraTarget = entity; + sub_080809D4(); +} + +void sub_0807F854(Entity* entity, ScriptExecutionContext* context) { + u32 value; + u32 idx; + + idx = (context->intVariable >> 0x10) & 3; + value = context->intVariable & 0xffff; + switch (idx) { + case 0: + case 1: + gMessage.field_0x10 = value; + break; + case 2: + gMessage.field_0x14 = value; + break; + case 3: + gMessage.field_0x18 = value; + break; + case 4: + gMessage.field_0x1c = value; + break; + } +} + +void sub_0807F8BC(Entity* entity, ScriptExecutionContext* context) { + if (sub_080040A8(entity)) + context->condition = 1; + else + context->condition = 0; +} + +void sub_0807F8D0(Entity* entity, ScriptExecutionContext* context) { + sub_08003FC4(entity, context->intVariable); + gActiveScriptInfo.flags |= 1; +} + +void sub_0807F8E8(Entity* entity, ScriptExecutionContext* context) { + Entity* c = CreateObjectWithParent(entity, 0xA6, 0, 0); + if (c != NULL) { + c->parent = entity; + c->field_0x86.HWORD = (context->intVariable & 0x3ff) | 0x8000; + } +} + +void sub_0807F918(Entity* entity, ScriptExecutionContext* context) { + PutItemOnSlot(context->intVariable); +} + +void sub_0807F924(Entity* entity, ScriptExecutionContext* context) { + sub_0807879C(entity); +} + +void sub_0807F92C(Entity* entity, ScriptExecutionContext* context) { + sub_080787C0(entity); +} + +void sub_0807F934(Entity* entity, ScriptExecutionContext* context) { + sub_080787B4(entity); +} + +void sub_0807F93C(Entity* entity, ScriptExecutionContext* context) { + CreateSpeechBubbleSleep(entity, (context->intVariable >> 8) & 0xff, context->intVariable & 0xff); +} + +void sub_0807F950(Entity* entity, ScriptExecutionContext* context) { + Entity* c = FindEntity(6, 0x56, 6, 0, 2); + if (c != NULL) + DeleteEntity(c); +} + +void sub_0807F970(Entity* entity, ScriptExecutionContext* context) { + context->condition = context->intVariable == gTextRender.curToken.textIndex; +} + +void sub_0807F98C(Entity* entity, ScriptExecutionContext* context) { + entity->height.WORD = context->intVariable; +} + +void sub_0807F994(Entity* entity, ScriptExecutionContext* context) { + entity->spriteOffsetX = (s32)context->intVariable >> 0x10; + entity->spriteOffsetY = context->intVariable & 0xffff; +} + +void sub_0807F9A4(Entity* entity, ScriptExecutionContext* context) { + switch (gPlayerState.field_0xa8) { + case 5: + case 7: + case 8: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 27: + case 28: + gActiveScriptInfo.commandSize = 0; + break; + default: + gActiveScriptInfo.flags |= 1u; + break; + } +} + +void sub_0807FA40(Entity* entity, ScriptExecutionContext* context) { + switch (gPlayerState.field_0xa8) { + case 5: + case 7: + case 8: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 20: + case 21: + case 22: + case 23: + case 24: + case 27: + case 28: + gActiveScriptInfo.commandSize = 0; + break; + default: + gActiveScriptInfo.flags |= 1u; + 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) + sub_0801D7BC(0x7fff, 1); + + context->unk_18++; + if (context->unk_18 >= context->intVariable) + sub_0801D7BC(0, 0); + else + gActiveScriptInfo.commandSize = 0; +} + +void sub_0807FB64(Entity* entity, ScriptExecutionContext* context) { + gPlayerEntity.iframes = context->intVariable; +} + +void sub_0807FB74(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.swimState = 0; + gPlayerEntity.field_0x3c &= ~4; +} + +void sub_0807FB94(Entity* entity, ScriptExecutionContext* context) { + InitScreen(SCREEN_CREDITS); +} + +void sub_0807FBA0(Entity* entity, ScriptExecutionContext* context) { + entity->x.HALF.HI = gRoomControls.roomScrollX + 120; + entity->y.HALF.HI = gRoomControls.roomScrollY + 80; +} + +void sub_0807FBB4(Entity* entity, ScriptExecutionContext* context) { + gPlayerState.field_0x1a[0] |= 0x80; +} + +void sub_0807FBC4(Entity* entity, ScriptExecutionContext* context) { + sub_0805E4A0(entity); +} + +void sub_0807FBCC(Entity* entity, ScriptExecutionContext* context) { + sub_0805E4CC(entity); +} + +void sub_0807FBD4(Entity* entity, ScriptExecutionContext* context) { + sub_0806F62C(entity, entity->speed, entity->direction); + if (sub_080040A8(entity)) + gActiveScriptInfo.commandSize = 0; +} + +#ifndef EU +void sub_0807FBFC(Entity* entity, ScriptExecutionContext* context) { + gSave.stats.charm = 0; + gSave.stats.charmTimer = 0; + gSave.stats.unkB = 0; + gSave.stats.unkTimer = 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.roomID == 1 ? 0xcf : 0xd0; +#else + u32 idx = gRoomControls.roomID == 1 ? 0xcf : 0xd1; +#endif + SetLocalFlag(idx); +} +#endif +#endif |
