diff options
-rw-r--r-- | asm/field_effect.s | 304 | ||||
-rw-r--r-- | data/field_effect.s | 8 | ||||
-rw-r--r-- | include/event_object_movement.h | 2 | ||||
-rw-r--r-- | include/overworld.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 109 |
5 files changed, 110 insertions, 314 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index afd25e8b3..7e95d422c 100644 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -5,310 +5,6 @@ .text - thumb_func_start FldEff_LavaridgeGymWarp -FldEff_LavaridgeGymWarp: @ 808534C - push {r4,lr} - ldr r4, _080853A4 @ =gFieldEffectArguments - adds r1, r4, 0x4 - adds r0, r4, 0 - movs r2, 0x8 - movs r3, 0x8 - bl sub_8063BC4 - ldr r0, _080853A8 @ =gFieldEffectObjectTemplatePointers - adds r0, 0x84 - ldr r0, [r0] - movs r2, 0 - ldrsh r1, [r4, r2] - movs r3, 0x4 - ldrsh r2, [r4, r3] - ldrb r3, [r4, 0x8] - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r0, 24 - ldr r1, _080853AC @ =gSprites - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - adds r2, r1 - movs r1, 0x3 - ldrb r3, [r4, 0xC] - ands r3, r1 - lsls r3, 2 - ldrb r4, [r2, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r4 - orrs r1, r3 - strb r1, [r2, 0x5] - adds r2, 0x3E - ldrb r1, [r2] - movs r3, 0x2 - orrs r1, r3 - strb r1, [r2] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080853A4: .4byte gFieldEffectArguments -_080853A8: .4byte gFieldEffectObjectTemplatePointers -_080853AC: .4byte gSprites - thumb_func_end FldEff_LavaridgeGymWarp - - thumb_func_start SpriteCB_LavaridgeGymWarp -SpriteCB_LavaridgeGymWarp: @ 80853B0 - push {lr} - adds r2, r0, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080853C8 - adds r0, r2, 0 - movs r1, 0x32 - bl FieldEffectStop -_080853C8: - pop {r0} - bx r0 - thumb_func_end SpriteCB_LavaridgeGymWarp - - thumb_func_start StartLavaridgeGym1FWarp -StartLavaridgeGym1FWarp: @ 80853CC - push {lr} - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldr r0, _080853E0 @ =Task_LavaridgeGym1FWarp - bl CreateTask - pop {r0} - bx r0 - .align 2, 0 -_080853E0: .4byte Task_LavaridgeGym1FWarp - thumb_func_end StartLavaridgeGym1FWarp - - thumb_func_start Task_LavaridgeGym1FWarp -Task_LavaridgeGym1FWarp: @ 80853E4 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - ldr r6, _0808542C @ =sLavaridgeGym1FWarpEffectFuncs - ldr r2, _08085430 @ =gTasks - ldr r5, _08085434 @ =gPlayerAvatar - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r4, r1, r2 -_080853F8: - movs r0, 0x8 - ldrsh r3, [r4, r0] - lsls r3, 2 - adds r3, r6 - ldrb r0, [r5, 0x5] - lsls r1, r0, 3 - adds r1, r0 - lsls r1, 2 - ldr r0, _08085438 @ =gObjectEvents - adds r1, r0 - ldrb r0, [r5, 0x4] - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - ldr r0, _0808543C @ =gSprites - adds r2, r0 - ldr r3, [r3] - adds r0, r4, 0 - bl _call_via_r3 - lsls r0, 24 - cmp r0, 0 - bne _080853F8 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0808542C: .4byte sLavaridgeGym1FWarpEffectFuncs -_08085430: .4byte gTasks -_08085434: .4byte gPlayerAvatar -_08085438: .4byte gObjectEvents -_0808543C: .4byte gSprites - thumb_func_end Task_LavaridgeGym1FWarp - - thumb_func_start LavaridgeGym1FWarpEffect_1 -LavaridgeGym1FWarpEffect_1: @ 8085440 - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - bl FreezeObjectEvents - bl CameraObjectReset2 - ldr r1, _0808546C @ =gPlayerAvatar - movs r0, 0x1 - strb r0, [r1, 0x6] - ldrb r0, [r4, 0x3] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r4, 0x3] - ldrh r0, [r5, 0x8] - adds r0, 0x1 - strh r0, [r5, 0x8] - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0808546C: .4byte gPlayerAvatar - thumb_func_end LavaridgeGym1FWarpEffect_1 - - thumb_func_start LavaridgeGym1FWarpEffect_2 -LavaridgeGym1FWarpEffect_2: @ 8085470 - push {r4-r6,lr} - adds r5, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - adds r0, r4, 0 - bl ObjectEventClearHeldMovementIfFinished - lsls r0, 24 - cmp r0, 0 - beq _080854E4 - ldrh r1, [r5, 0xA] - movs r2, 0xA - ldrsh r0, [r5, r2] - cmp r0, 0x3 - ble _080854C4 - ldr r1, _080854C0 @ =gFieldEffectArguments - movs r2, 0x10 - ldrsh r0, [r4, r2] - str r0, [r1] - movs r2, 0x12 - ldrsh r0, [r4, r2] - str r0, [r1, 0x4] - adds r0, r6, 0 - adds r0, 0x43 - ldrb r0, [r0] - subs r0, 0x1 - str r0, [r1, 0x8] - ldrb r0, [r6, 0x5] - lsls r0, 28 - lsrs r0, 30 - str r0, [r1, 0xC] - movs r0, 0x31 - bl FieldEffectStart - strh r0, [r5, 0xA] - ldrh r0, [r5, 0x8] - adds r0, 0x1 - strh r0, [r5, 0x8] - b _080854E4 - .align 2, 0 -_080854C0: .4byte gFieldEffectArguments -_080854C4: - adds r0, r1, 0x1 - strh r0, [r5, 0xA] - ldrb r0, [r4, 0x18] - lsls r0, 28 - lsrs r0, 28 - bl GetStepInPlaceDelay4AnimId - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl ObjectEventSetHeldMovement - movs r0, 0x21 - bl PlaySE -_080854E4: - movs r0, 0 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end LavaridgeGym1FWarpEffect_2 - - thumb_func_start LavaridgeGym1FWarpEffect_3 -LavaridgeGym1FWarpEffect_3: @ 80854EC - push {r4,lr} - adds r3, r0, 0 - adds r4, r1, 0 - ldr r2, _08085520 @ =gSprites - movs r0, 0xA - ldrsh r1, [r3, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - adds r0, 0x2B - ldrb r0, [r0] - cmp r0, 0x2 - bne _08085516 - ldrb r0, [r4, 0x1] - movs r1, 0x20 - orrs r0, r1 - strb r0, [r4, 0x1] - ldrh r0, [r3, 0x8] - adds r0, 0x1 - strh r0, [r3, 0x8] -_08085516: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08085520: .4byte gSprites - thumb_func_end LavaridgeGym1FWarpEffect_3 - - thumb_func_start LavaridgeGym1FWarpEffect_4 -LavaridgeGym1FWarpEffect_4: @ 8085524 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x31 - bl FieldEffectActiveListContains - lsls r0, 24 - cmp r0, 0 - bne _08085542 - bl TryFadeOutOldMapMusic - bl WarpFadeOutScreen - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08085542: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end LavaridgeGym1FWarpEffect_4 - - thumb_func_start LavaridgeGym1FWarpEffect_5 -LavaridgeGym1FWarpEffect_5: @ 808554C - push {lr} - ldr r0, _0808558C @ =gPaletteFade - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _08085584 - bl BGMusicStopped - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085584 - bl WarpIntoMap - ldr r1, _08085590 @ =gFieldCallback - ldr r0, _08085594 @ =FieldCB_FallWarpExit - str r0, [r1] - ldr r0, _08085598 @ =CB2_LoadMap - bl SetMainCallback2 - ldr r0, _0808559C @ =Task_LavaridgeGym1FWarp - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask -_08085584: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_0808558C: .4byte gPaletteFade -_08085590: .4byte gFieldCallback -_08085594: .4byte FieldCB_FallWarpExit -_08085598: .4byte CB2_LoadMap -_0808559C: .4byte Task_LavaridgeGym1FWarp - thumb_func_end LavaridgeGym1FWarpEffect_5 - thumb_func_start FldEff_PopOutOfAsh FldEff_PopOutOfAsh: @ 80855A0 push {r4,lr} diff --git a/data/field_effect.s b/data/field_effect.s index 7d9a50f3f..c3fd0f35f 100644 --- a/data/field_effect.s +++ b/data/field_effect.s @@ -7,14 +7,6 @@ .align 2 .align 2 -sLavaridgeGym1FWarpEffectFuncs:: @ 83CC0CC dataptr - .4byte LavaridgeGym1FWarpEffect_1 - .4byte LavaridgeGym1FWarpEffect_2 - .4byte LavaridgeGym1FWarpEffect_3 - .4byte LavaridgeGym1FWarpEffect_4 - .4byte LavaridgeGym1FWarpEffect_5 - - .align 2 gEscapeRopeFieldEffectFuncs:: @ 83CC0E0 dataptr .4byte EscapeRopeFieldEffect_Step0 .4byte EscapeRopeFieldEffect_Step1 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index bbf34a23b..29254ec5d 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -41,7 +41,7 @@ void sub_808E16C(s16, s16); void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat); void sub_8092FF0(s16, s16, s16 *, s16 *); u8 ObjectEventDirectionToImageAnimId(u8); -void sub_80930E0(s16 *, s16 *, s16, s16); +void sub_8063BC4(s16 *, s16 *, s16, s16); void ObjectEventClearAnim(struct ObjectEvent *); void ObjectEventClearAnimIfSpecialAnimActive(struct ObjectEvent *); void SpawnObjectEventsInView(s16, s16); diff --git a/include/overworld.h b/include/overworld.h index 754094907..90c11443f 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -87,7 +87,6 @@ void player_avatar_init_params_reset(void); void Overworld_SetFlashLevel(s32 a1); u8 Overworld_GetFlashLevel(void); -void LavaridgeGym1FWarpEffect_4(u16); void Overworld_SetSavedMusic(u16); void Overworld_ChangeMusicToDefault(void); diff --git a/src/field_effect.c b/src/field_effect.c index 5f07311e2..81ba91b1c 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1874,3 +1874,112 @@ bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task * task, struct ObjectEvent * o } return FALSE; } + +void Task_LavaridgeGym1FWarp(u8 taskId); +bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); + +bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) = { + LavaridgeGym1FWarpEffect_1, + LavaridgeGym1FWarpEffect_2, + LavaridgeGym1FWarpEffect_3, + LavaridgeGym1FWarpEffect_4, + LavaridgeGym1FWarpEffect_5 +}; + +// For the ash puff effect when warping off the B1F ash tiles +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void SpriteCB_LavaridgeGymWarp(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void StartLavaridgeGym1FWarp(u8 priority) +{ + CreateTask(Task_LavaridgeGym1FWarp, priority); +} + +void Task_LavaridgeGym1FWarp(u8 taskId) +{ + while(sLavaridgeGym1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + FreezeObjectEvents(); + CameraObjectReset2(); + gPlayerAvatar.preventStep = TRUE; + objectEvent->fixedPriority = 1; + task->data[0]++; + return FALSE; +} + +bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + if (task->data[1] > 3) + { + gFieldEffectArguments[0] = objectEvent->currentCoords.x; + gFieldEffectArguments[1] = objectEvent->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + ObjectEventSetHeldMovement(objectEvent, GetStepInPlaceDelay4AnimId(objectEvent->facingDirection)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + objectEvent->invisible = TRUE; + task->data[0]++; + } + return FALSE; +} + +bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + TryFadeOutOldMapMusic(); + WarpFadeOutScreen(); + task->data[0]++; + } + return FALSE; +} + +bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (!gPaletteFade.active && BGMusicStopped() == TRUE) + { + WarpIntoMap(); + gFieldCallback = FieldCB_FallWarpExit; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(Task_LavaridgeGym1FWarp)); + } + return FALSE; +} |