diff options
-rwxr-xr-x | asm/field_effect.s | 492 | ||||
-rwxr-xr-x | src/field_effect.c | 211 |
2 files changed, 211 insertions, 492 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index c23d85338..cad14c42e 100755 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -6,498 +6,6 @@ .text - thumb_func_start sub_80868E4 -sub_80868E4: @ 80868E4 - push {r4-r6,lr} - adds r4, r0, 0 - ldr r2, _08086990 @ =gPlayerAvatar - ldrb r1, [r2, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _08086994 @ =gMapObjects - adds r6, r0, r1 - ldrb r1, [r2, 0x4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _08086998 @ =gSprites - adds r5, r0, r1 - ldrh r0, [r4, 0xA] - ldrh r1, [r5, 0x26] - adds r0, r1 - strh r0, [r5, 0x26] - ldrh r2, [r4, 0xA] - movs r1, 0xA - ldrsh r0, [r4, r1] - cmp r0, 0x7 - bgt _08086926 - ldrh r1, [r4, 0xC] - adds r0, r2, r1 - strh r0, [r4, 0xC] - movs r1, 0xF - ands r0, r1 - cmp r0, 0 - beq _08086926 - lsls r0, r2, 1 - strh r0, [r4, 0xA] -_08086926: - ldrh r2, [r4, 0xE] - movs r1, 0xE - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _08086964 - movs r0, 0x26 - ldrsh r1, [r5, r0] - movs r0, 0x10 - negs r0, r0 - cmp r1, r0 - blt _08086964 - adds r0, r2, 0x1 - strh r0, [r4, 0xE] - ldrb r1, [r6, 0x3] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - strb r0, [r6, 0x3] - ldrb r1, [r4, 0x10] - adds r3, r5, 0 - adds r3, 0x42 - lsls r1, 6 - ldrb r2, [r3] - movs r0, 0x3F - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - ldrb r0, [r6] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r6] -_08086964: - movs r1, 0x26 - ldrsh r0, [r5, r1] - cmp r0, 0 - blt _08086988 - movs r0, 0xD6 - bl PlaySE - ldrb r0, [r6] - movs r1, 0x8 - orrs r0, r1 - movs r1, 0x20 - orrs r0, r1 - strb r0, [r6] - movs r0, 0 - strh r0, [r5, 0x26] - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08086988: - movs r0, 0 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08086990: .4byte gPlayerAvatar -_08086994: .4byte gMapObjects -_08086998: .4byte gSprites - thumb_func_end sub_80868E4 - - thumb_func_start sub_808699C -sub_808699C: @ 808699C - push {lr} - ldrh r1, [r0, 0x8] - adds r1, 0x1 - movs r2, 0 - strh r1, [r0, 0x8] - movs r1, 0x4 - strh r1, [r0, 0xA] - strh r2, [r0, 0xC] - movs r0, 0 - bl SetCameraPanningCallback - movs r0, 0x1 - pop {r1} - bx r1 - thumb_func_end sub_808699C - - thumb_func_start sub_80869B8 -sub_80869B8: @ 80869B8 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0xA - ldrsh r1, [r4, r0] - movs r0, 0 - bl SetCameraPanning - ldrh r0, [r4, 0xA] - negs r2, r0 - strh r2, [r4, 0xA] - ldrh r0, [r4, 0xC] - adds r0, 0x1 - strh r0, [r4, 0xC] - movs r1, 0x3 - ands r0, r1 - cmp r0, 0 - bne _080869E0 - lsls r0, r2, 16 - asrs r0, 17 - strh r0, [r4, 0xA] -_080869E0: - movs r1, 0xA - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080869EE - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_080869EE: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80869B8 - - thumb_func_start sub_80869F8 -sub_80869F8: @ 80869F8 - push {lr} - ldr r1, _08086A24 @ =gPlayerAvatar - movs r0, 0 - strb r0, [r1, 0x6] - bl ScriptContext2_Disable - bl CameraObjectReset1 - bl UnfreezeMapObjects - bl InstallCameraPanAheadCallback - ldr r0, _08086A28 @ =sub_8086774 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_08086A24: .4byte gPlayerAvatar -_08086A28: .4byte sub_8086774 - thumb_func_end sub_80869F8 - - thumb_func_start sub_8086A2C -sub_8086A2C: @ 8086A2C - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - lsls r1, 24 - lsrs r1, 24 - ldr r0, _08086A60 @ =sub_8086A68 - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08086A64 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r0, 0 - strh r0, [r1, 0xA] - cmp r4, 0x6A - bne _08086A58 - movs r0, 0x1 - strh r0, [r1, 0xA] -_08086A58: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08086A60: .4byte sub_8086A68 -_08086A64: .4byte gTasks - thumb_func_end sub_8086A2C - - thumb_func_start sub_8086A68 -sub_8086A68: @ 8086A68 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _08086A98 @ =gTasks - adds r4, r1, r0 - ldr r5, _08086A9C @ =gUnknown_0839F2E8 -_08086A7A: - movs r1, 0x8 - ldrsh r0, [r4, r1] - lsls r0, 2 - adds r0, r5 - ldr r1, [r0] - adds r0, r4, 0 - bl _call_via_r1 - lsls r0, 24 - cmp r0, 0 - bne _08086A7A - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08086A98: .4byte gTasks -_08086A9C: .4byte gUnknown_0839F2E8 - thumb_func_end sub_8086A68 - - thumb_func_start sub_8086AA0 -sub_8086AA0: @ 8086AA0 - push {r4,lr} - adds r4, r0, 0 - bl FreezeMapObjects - bl CameraObjectReset2 - ldrb r0, [r4, 0xA] - bl sub_80B4824 - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8086AA0 - - thumb_func_start sub_8086AC0 -sub_8086AC0: @ 8086AC0 - push {r4,r5,lr} - adds r5, r0, 0 - ldr r0, _08086B28 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _08086B2C @ =gMapObjects - adds r4, r0, r1 - adds r0, r4, 0 - bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive - lsls r0, 24 - cmp r0, 0 - beq _08086AEA - adds r0, r4, 0 - bl FieldObjectClearAnimIfSpecialAnimFinished - lsls r0, 24 - cmp r0, 0 - beq _08086B1E -_08086AEA: - bl player_get_direction_lower_nybble - lsls r0, 24 - lsrs r0, 24 - bl GetFaceDirectionAnimId - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl FieldObjectSetSpecialAnim - ldrh r0, [r5, 0x8] - adds r0, 0x1 - movs r1, 0 - strh r0, [r5, 0x8] - strh r1, [r5, 0xC] - strh r1, [r5, 0xE] - ldrb r0, [r5, 0xA] - cmp r0, 0 - bne _08086B18 - movs r0, 0x4 - strh r0, [r5, 0x8] -_08086B18: - movs r0, 0x50 - bl PlaySE -_08086B1E: - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08086B28: .4byte gPlayerAvatar -_08086B2C: .4byte gMapObjects - thumb_func_end sub_8086AC0 - - thumb_func_start sub_8086B30 -sub_8086B30: @ 8086B30 - push {r4,lr} - adds r4, r0, 0 - bl sub_8086B98 - movs r1, 0xC - ldrsh r0, [r4, r1] - cmp r0, 0x3 - ble _08086B4A - bl sub_8086C30 - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08086B4A: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8086B30 - - thumb_func_start sub_8086B54 -sub_8086B54: @ 8086B54 - push {lr} - bl sub_8086B98 - bl sub_8086C40 - movs r0, 0 - pop {r1} - bx r1 - thumb_func_end sub_8086B54 - - thumb_func_start sub_8086B64 -sub_8086B64: @ 8086B64 - push {r4,lr} - adds r4, r0, 0 - bl sub_8086BE4 - movs r1, 0xC - ldrsh r0, [r4, r1] - cmp r0, 0x3 - ble _08086B7E - bl sub_8086C30 - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08086B7E: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8086B64 - - thumb_func_start sub_8086B88 -sub_8086B88: @ 8086B88 - push {lr} - bl sub_8086BE4 - bl sub_8086C40 - movs r0, 0 - pop {r1} - bx r1 - thumb_func_end sub_8086B88 - - thumb_func_start sub_8086B98 -sub_8086B98: @ 8086B98 - push {r4,r5,lr} - adds r5, r0, 0 - ldr r0, _08086BDC @ =gPlayerAvatar - ldrb r0, [r0, 0x4] - lsls r4, r0, 4 - adds r4, r0 - lsls r4, 2 - ldr r0, _08086BE0 @ =gSprites - adds r4, r0 - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r0, 0x84 - bl Cos - strh r0, [r4, 0x24] - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r0, 0x94 - bl Sin - strh r0, [r4, 0x26] - ldrh r0, [r5, 0xE] - adds r0, 0x1 - strh r0, [r5, 0xE] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08086BD6 - ldrh r0, [r5, 0xC] - adds r0, 0x1 - strh r0, [r5, 0xC] -_08086BD6: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08086BDC: .4byte gPlayerAvatar -_08086BE0: .4byte gSprites - thumb_func_end sub_8086B98 - - thumb_func_start sub_8086BE4 -sub_8086BE4: @ 8086BE4 - push {r4,r5,lr} - adds r5, r0, 0 - ldr r0, _08086C28 @ =gPlayerAvatar - ldrb r0, [r0, 0x4] - lsls r4, r0, 4 - adds r4, r0 - lsls r4, 2 - ldr r0, _08086C2C @ =gSprites - adds r4, r0 - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r0, 0x7C - bl Cos - strh r0, [r4, 0x24] - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r0, 0x76 - bl Sin - strh r0, [r4, 0x26] - ldrh r0, [r5, 0xE] - adds r0, 0x1 - strh r0, [r5, 0xE] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08086C22 - ldrh r0, [r5, 0xC] - adds r0, 0x1 - strh r0, [r5, 0xC] -_08086C22: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08086C28: .4byte gPlayerAvatar -_08086C2C: .4byte gSprites - thumb_func_end sub_8086BE4 - - thumb_func_start sub_8086C30 -sub_8086C30: @ 8086C30 - push {lr} - bl sub_8053FF8 - bl fade_8080918 - pop {r0} - bx r0 - thumb_func_end sub_8086C30 - - thumb_func_start sub_8086C40 -sub_8086C40: @ 8086C40 - push {lr} - ldr r0, _08086C80 @ =gPaletteFade - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _08086C7C - bl sub_8054034 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08086C7C - bl sub_80B483C - bl warp_in - ldr r1, _08086C84 @ =gUnknown_0300485C - ldr r0, _08086C88 @ =sub_8086C94 - str r0, [r1] - ldr r0, _08086C8C @ =CB2_LoadMap - bl SetMainCallback2 - ldr r0, _08086C90 @ =sub_8086A68 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask -_08086C7C: - pop {r0} - bx r0 - .align 2, 0 -_08086C80: .4byte gPaletteFade -_08086C84: .4byte gUnknown_0300485C -_08086C88: .4byte sub_8086C94 -_08086C8C: .4byte CB2_LoadMap -_08086C90: .4byte sub_8086A68 - thumb_func_end sub_8086C40 - thumb_func_start sub_8086C94 sub_8086C94: @ 8086C94 push {lr} diff --git a/src/field_effect.c b/src/field_effect.c index a40b6d0cb..664e59ecf 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2,6 +2,7 @@ #include "asm.h" #include "data2.h" #include "script.h" +#include "trig.h" #include "main.h" #include "field_weather.h" #include "decompress.h" @@ -16,6 +17,7 @@ #include "field_player_avatar.h" #include "field_map_obj_helpers.h" #include "field_map_obj.h" +#include "field_camera.h" #include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -879,6 +881,7 @@ extern void pal_fill_for_map_transition(void); void sub_8086774(u8); extern const bool8 (*gUnknown_0839F2CC[7])(struct Task *); extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); void sub_8086748(void) { @@ -1001,4 +1004,212 @@ bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] } #endif +bool8 sub_80868E4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + mapObject->mapobj_bit_26 = 0; + sprite->subspriteMode = task->data[4]; + mapObject->mapobj_bit_2 = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_808699C(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80869B8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80869F8(struct Task *task) +{ + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_8086774)); + return FALSE; +} + +void sub_8086A68(u8); +extern const bool8 (*gUnknown_0839F2E8[6])(struct Task *); +extern void sub_80B4824(u8); +void sub_8086B98(struct Task *); +void sub_8086BE4(struct Task *); +void sub_8086C30(void); +void sub_8086C40(void); + +void sub_8086A2C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_8086A68, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_8086A68(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2E8[task->data[0]](task)); +} + +bool8 sub_8086AA0(struct Task *task) +{ + FreezeMapObjects(); + CameraObjectReset2(); + sub_80B4824(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086AC0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_8086B30(struct Task *task) +{ + sub_8086B98(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B54(struct Task *task) +{ + sub_8086B98(task); + sub_8086C40(); + return FALSE; +} + +bool8 sub_8086B64(struct Task *task) +{ + sub_8086BE4(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B88(struct Task *task) +{ + sub_8086BE4(task); + sub_8086C40(); + return FALSE; +} + +void sub_8086B98(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} +void sub_8086BE4(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +extern void sub_8053FF8(void); +extern void fade_8080918(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); + +void sub_8086C30(void) +{ + sub_8053FF8(); + fade_8080918(); +} + +void sub_8086C40(void) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_80B483C(); + warp_in(); + gUnknown_0300485C = sub_8086C94; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_8086A68)); + } +} |