diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index fb04a8ad3..bf8eec514 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -241,8 +241,7 @@ Static arm9 Object unk_0206367C.o Object unk_02063888.o Object field_move.o - Object field_move_s.o - Object unk_0206439C.o + Object field_move_environment.o Object unk_020643C0.o Object unk_020647A4.o Object unk_02064CA8.o diff --git a/arm9/asm/field_move_s.s b/arm9/asm/field_move_s.s deleted file mode 100644 index c0ab85c0d..000000000 --- a/arm9/asm/field_move_s.s +++ /dev/null @@ -1,878 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .extern FieldMove_CreateUseEnvironment - .extern FieldMove_DeleteUseEnvironment - - .text - - thumb_func_start sub_02063CE0 -sub_02063CE0: ; 0x02063CE0 - push {r4, lr} - add r4, r0, #0x0 - ldr r1, [r4, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02063CF2 - mov r0, #0x1 - pop {r4, pc} -_02063CF2: - ldr r0, [r1, #0xc] - bl Save_PlayerData_GetProfile - mov r1, #0x5 - bl PlayerProfile_TestBadgeFlag - cmp r0, #0x0 - bne _02063D06 - mov r0, #0x2 - pop {r4, pc} -_02063D06: - ldrh r1, [r4, #0xc] - mov r0, #0x8 - tst r0, r1 - beq _02063D12 - mov r0, #0x0 - pop {r4, pc} -_02063D12: - mov r0, #0x1 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02063D18 -sub_02063D18: ; 0x02063D18 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _02063D48 ; =sub_02063D4C - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_02063D48: .word sub_02063D4C - - thumb_func_start sub_02063D4C -sub_02063D4C: ; 0x02063D4C - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02063D84 ; =0x0000271A - ldr r2, [r4, #0x4] - add r0, r5, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02063D84: .word 0x0000271A - - thumb_func_start sub_02063D88 -sub_02063D88: ; 0x02063D88 - push {r4, lr} - add r4, r0, #0x0 - ldr r1, [r4, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02063D9A - mov r0, #0x1 - pop {r4, pc} -_02063D9A: - ldr r0, [r1, #0xc] - bl Save_PlayerData_GetProfile - mov r1, #0x3 - bl PlayerProfile_TestBadgeFlag - cmp r0, #0x0 - bne _02063DAE - mov r0, #0x2 - pop {r4, pc} -_02063DAE: - ldrh r1, [r4, #0xc] - mov r0, #0x10 - tst r0, r1 - beq _02063DBA - mov r0, #0x0 - pop {r4, pc} -_02063DBA: - mov r0, #0x1 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02063DC0 -sub_02063DC0: ; 0x02063DC0 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _02063DF0 ; =sub_02063DF4 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_02063DF0: .word sub_02063DF4 - - thumb_func_start sub_02063DF4 -sub_02063DF4: ; 0x02063DF4 - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02063E2C ; =0x0000271E - add r0, r5, #0x0 - mov r2, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02063E2C: .word 0x0000271E - - thumb_func_start sub_02063E30 -sub_02063E30: ; 0x02063E30 - push {r4, lr} - add r4, r0, #0x0 - ldr r1, [r4, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02063E42 - mov r0, #0x1 - pop {r4, pc} -_02063E42: - ldr r0, [r1, #0xc] - bl Save_PlayerData_GetProfile - mov r1, #0x0 - bl PlayerProfile_TestBadgeFlag - cmp r0, #0x0 - bne _02063E56 - mov r0, #0x2 - pop {r4, pc} -_02063E56: - ldrh r1, [r4, #0xc] - mov r0, #0x20 - tst r0, r1 - beq _02063E62 - mov r0, #0x0 - pop {r4, pc} -_02063E62: - mov r0, #0x1 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02063E68 -sub_02063E68: ; 0x02063E68 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _02063E98 ; =sub_02063E9C - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_02063E98: .word sub_02063E9C - - thumb_func_start sub_02063E9C -sub_02063E9C: ; 0x02063E9C - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02063ED4 ; =0x00002719 - ldr r2, [r4, #0x4] - add r0, r5, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02063ED4: .word 0x00002719 - - thumb_func_start sub_02063ED8 -sub_02063ED8: ; 0x02063ED8 - push {r4, lr} - add r4, r0, #0x0 - ldr r1, [r4, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02063EEA - mov r0, #0x1 - pop {r4, pc} -_02063EEA: - ldr r0, [r1, #0xc] - bl Save_PlayerData_GetProfile - mov r1, #0x7 - bl PlayerProfile_TestBadgeFlag - cmp r0, #0x0 - bne _02063EFE - mov r0, #0x2 - pop {r4, pc} -_02063EFE: - ldrh r1, [r4, #0xc] - mov r0, #0x40 - tst r0, r1 - beq _02063F0A - mov r0, #0x0 - pop {r4, pc} -_02063F0A: - mov r0, #0x1 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02063F10 -sub_02063F10: ; 0x02063F10 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _02063F40 ; =sub_02063F44 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_02063F40: .word sub_02063F44 - - thumb_func_start sub_02063F44 -sub_02063F44: ; 0x02063F44 - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02063F7C ; =0x0000271D - add r0, r5, #0x0 - mov r2, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02063F7C: .word 0x0000271D - - thumb_func_start sub_02063F80 -sub_02063F80: ; 0x02063F80 - push {r4, lr} - add r4, r0, #0x0 - ldr r1, [r4, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02063F92 - mov r0, #0x1 - pop {r4, pc} -_02063F92: - ldr r0, [r1, #0xc] - bl Save_PlayerData_GetProfile - mov r1, #0x6 - bl PlayerProfile_TestBadgeFlag - cmp r0, #0x0 - bne _02063FA6 - mov r0, #0x2 - pop {r4, pc} -_02063FA6: - ldrh r1, [r4, #0xc] - mov r0, #0x80 - tst r0, r1 - bne _02063FB2 - mov r0, #0x1 - pop {r4, pc} -_02063FB2: - ldr r0, [r4, #0x4] - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckHaveFollower - cmp r0, #0x1 - bne _02063FC6 - mov r0, #0x3 - pop {r4, pc} -_02063FC6: - mov r0, #0x0 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02063FCC -sub_02063FCC: ; 0x02063FCC - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _02063FFC ; =sub_02064000 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_02063FFC: .word sub_02064000 - - thumb_func_start sub_02064000 -sub_02064000: ; 0x02064000 - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02064038 ; =0x0000271B - add r0, r5, #0x0 - mov r2, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02064038: .word 0x0000271B - - thumb_func_start sub_0206403C -sub_0206403C: ; 0x0206403C - ldr r1, [r0, #0x4] - ldr r1, [r1, #0x6c] - sub r1, r1, #0x2 - cmp r1, #0x1 - bhi _0206404A - mov r0, #0x1 - bx lr -_0206404A: - ldrh r1, [r0, #0xc] - mov r0, #0x1 - lsl r0, r0, #0x8 - tst r0, r1 - beq _02064058 - mov r0, #0x0 - bx lr -_02064058: - mov r0, #0x1 - bx lr - - thumb_func_start sub_0206405C -sub_0206405C: ; 0x0206405C - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - ldr r0, [r6, #0x4] - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _0206408C ; =sub_02064090 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - .balign 4 -_0206408C: .word sub_02064090 - - thumb_func_start sub_02064090 -sub_02064090: ; 0x02064090 - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _020640C8 ; =0x0000271F - add r0, r5, #0x0 - mov r2, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_020640C8: .word 0x0000271F - - thumb_func_start sub_020640CC -sub_020640CC: ; 0x020640CC - push {r4, lr} - add r4, r0, #0x0 - ldr r0, [r4, #0x4] - ldr r0, [r0, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _020640DE - mov r0, #0x1 - pop {r4, pc} -_020640DE: - ldr r0, [r4, #0x0] - bl MapHeader_IsOutdoorNotTown - cmp r0, #0x0 - bne _020640EC - mov r0, #0x1 - pop {r4, pc} -_020640EC: - ldr r0, [r4, #0x4] - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckHaveFollower - cmp r0, #0x1 - bne _02064100 - mov r0, #0x3 - pop {r4, pc} -_02064100: - ldr r0, [r4, #0x4] - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckSafariSysFlag - cmp r0, #0x1 - beq _02064120 - ldr r0, [r4, #0x4] - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckPalParkSysFlag - cmp r0, #0x1 - bne _02064124 -_02064120: - mov r0, #0x1 - b _02064126 -_02064124: - mov r0, #0x0 -_02064126: - cmp r0, #0x1 - bne _0206412E - mov r0, #0x1 - pop {r4, pc} -_0206412E: - mov r0, #0x0 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_02064134 -sub_02064134: ; 0x02064134 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r0, [r5, #0x0] - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r6, #0x0 - bl FieldSystem_LoadFieldOverlay - ldrh r1, [r5, #0x4] - ldr r2, [r6, #0xc] - mov r0, #0xb - lsl r1, r1, #0x18 - lsr r1, r1, #0x18 - bl sub_0206439C - mov r1, #0x72 - ldr r2, _02064170 ; =sub_02064174 - lsl r1, r1, #0x2 - str r2, [r4, r1] - add r1, #0x30 - str r0, [r4, r1] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - nop -_02064170: .word sub_02064174 - - thumb_func_start sub_02064174 -sub_02064174: ; 0x02064174 - push {r4-r6, lr} - add r5, r0, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - ldr r1, [r4, #0x0] - add r0, r6, #0x0 - mov r2, #0x4 - bl ov06_0224CB30 - add r6, r0, #0x0 - add r0, r4, #0x0 - bl FreeToHeap - ldr r1, _020641A8 ; =ov06_0224CB54 - add r0, r5, #0x0 - add r2, r6, #0x0 - bl TaskManager_Jump - mov r0, #0x0 - pop {r4-r6, pc} - nop -_020641A8: .word ov06_0224CB54 - - thumb_func_start sub_020641AC -sub_020641AC: ; 0x020641AC - push {r4, lr} - add r4, r0, #0x0 - ldr r0, [r4, #0x4] - ldr r0, [r0, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _020641BE - mov r0, #0x1 - pop {r4, pc} -_020641BE: - ldr r0, [r4, #0x0] - bl MapHeader_IsCave - cmp r0, #0x1 - bne _020641D2 - ldr r0, [r4, #0x0] - bl MapHeader_IsEscapeRopeAllowed - cmp r0, #0x1 - beq _020641D6 -_020641D2: - mov r0, #0x1 - pop {r4, pc} -_020641D6: - ldr r0, [r4, #0x4] - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckHaveFollower - cmp r0, #0x1 - bne _020641EA - mov r0, #0x3 - pop {r4, pc} -_020641EA: - mov r0, #0x0 - pop {r4, pc} - .balign 4 - - thumb_func_start sub_020641F0 -sub_020641F0: ; 0x020641F0 - push {r4-r6, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r0, [r5, #0x0] - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r6, #0x0 - bl FieldSystem_LoadFieldOverlay - ldrh r1, [r5, #0x4] - ldr r2, [r6, #0xc] - mov r0, #0xb - lsl r1, r1, #0x18 - lsr r1, r1, #0x18 - bl sub_0206439C - mov r1, #0x72 - ldr r2, _0206422C ; =sub_02064230 - lsl r1, r1, #0x2 - str r2, [r4, r1] - add r1, #0x30 - str r0, [r4, r1] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r4-r6, pc} - nop -_0206422C: .word sub_02064230 - - thumb_func_start sub_02064230 -sub_02064230: ; 0x02064230 - push {r3-r7, lr} - add r5, r0, #0x0 - bl TaskManager_GetFieldSystem - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetEnvironment - add r6, r0, #0x0 - ldr r1, [r6, #0x0] - add r0, r4, #0x0 - mov r2, #0xb - bl ov06_0224CA88 - ldr r1, [r4, #0x1c] - add r7, r0, #0x0 - ldr r1, [r1, #0x0] - mov r0, #0xa - lsl r1, r1, #0x10 - lsr r1, r1, #0x10 - mov r2, #0x4 - bl sub_0202914C - add r4, #0x98 - add r1, r0, #0x0 - ldr r0, [r4, #0x0] - mov r2, #0x1 - bl sub_02028AD4 - add r0, r6, #0x0 - bl FreeToHeap - ldr r1, _02064280 ; =ov06_0224CAAC - add r0, r5, #0x0 - add r2, r7, #0x0 - bl TaskManager_Jump - mov r0, #0x0 - pop {r3-r7, pc} - nop -_02064280: .word ov06_0224CAAC - - thumb_func_start sub_02064284 -sub_02064284: ; 0x02064284 - push {r3, lr} - ldr r1, [r0, #0x4] - ldr r0, [r1, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _02064294 - mov r0, #0x1 - pop {r3, pc} -_02064294: - ldr r0, [r1, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckPalParkSysFlag - cmp r0, #0x1 - bne _020642A6 - mov r0, #0x1 - b _020642A8 -_020642A6: - mov r0, #0x0 -_020642A8: - cmp r0, #0x1 - bne _020642B0 - mov r0, #0x1 - pop {r3, pc} -_020642B0: - mov r0, #0x0 - pop {r3, pc} - - thumb_func_start sub_020642B4 -sub_020642B4: ; 0x020642B4 - push {r4-r6, lr} - add r6, r0, #0x0 - ldr r0, [r6, #0x0] - bl TaskManager_GetFieldSystem - add r5, r0, #0x0 - ldr r0, [r6, #0x0] - bl TaskManager_GetEnvironment - ldrh r1, [r6, #0x4] - add r4, r0, #0x0 - ldr r2, [r5, #0xc] - lsl r1, r1, #0x18 - mov r0, #0xb - lsr r1, r1, #0x18 - bl sub_0206439C - add r6, r0, #0x0 - add r0, r5, #0x0 - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _0206430C ; =ov05_021F6360 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r6, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - ldr r1, [r5, #0x1c] - mov r0, #0xb - ldr r1, [r1, #0x0] - add r2, r0, #0x0 - lsl r1, r1, #0x10 - lsr r1, r1, #0x10 - bl sub_0202914C - add r5, #0x98 - add r1, r0, #0x0 - ldr r0, [r5, #0x0] - mov r2, #0x1 - bl sub_02028AD4 - pop {r4-r6, pc} - .balign 4 -_0206430C: .word ov05_021F6360 - - thumb_func_start sub_02064310 -sub_02064310: ; 0x02064310 - ldr r0, [r0, #0x4] - ldr r0, [r0, #0x6c] - sub r0, r0, #0x2 - cmp r0, #0x1 - bhi _0206431E - mov r0, #0x1 - bx lr -_0206431E: - mov r0, #0x0 - bx lr - .balign 4 - - thumb_func_start sub_02064324 -sub_02064324: ; 0x02064324 - push {r3-r7, lr} - add r5, r0, #0x0 - ldr r0, [r5, #0x0] - add r6, r1, #0x0 - bl TaskManager_GetFieldSystem - add r7, r0, #0x0 - ldr r0, [r5, #0x0] - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FieldMove_CreateUseEnvironment - add r5, r0, #0x0 - add r0, r7, #0x0 - bl FieldSystem_LoadFieldOverlay - mov r0, #0x72 - ldr r1, _0206435C ; =sub_02064360 - lsl r0, r0, #0x2 - str r1, [r4, r0] - add r0, #0x30 - str r5, [r4, r0] - mov r0, #0xa - strh r0, [r4, #0x2a] - pop {r3-r7, pc} - .balign 4 -_0206435C: .word sub_02064360 - - thumb_func_start sub_02064360 -sub_02064360: ; 0x02064360 - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - bl TaskManager_GetEnvironment - add r4, r0, #0x0 - add r0, r5, #0x0 - bl TaskManager_GetFieldSystem - add r6, r0, #0x0 - ldr r1, _02064398 ; =0x000022C4 - add r0, r5, #0x0 - mov r2, #0x0 - bl StartScriptFromMenu - mov r2, #0x0 - str r2, [sp, #0x0] - ldrh r1, [r4, #0xc] - add r0, r6, #0x0 - add r3, r2, #0x0 - bl FieldMove_SetArgs - add r0, r4, #0x0 - bl FieldMove_DeleteUseEnvironment - mov r0, #0x0 - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02064398: .word 0x000022C4 diff --git a/arm9/global.inc b/arm9/global.inc index 5c249d868..dd5678142 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -2508,7 +2508,7 @@ .extern MapHeader_IsEscapeRopeAllowed .extern MapHeader_IsFlyAllowed .extern MapHeader_IsBikeAllowed -.extern MapHeader_IsOutdoorNotTown +.extern MapHeader_IsTeleportAllowed .extern MapHeader_MapIsOnMainMatrix .extern MapHeader_IsCave .extern MapHeader_IsBuilding @@ -4691,7 +4691,7 @@ .extern sub_020638BC .extern FieldMove_GetMoveFunc .extern FieldMove_InitCheckData -.extern sub_0206439C +.extern FieldMove_CreateEnvironment .extern sub_020643C0 .extern sub_020643F0 .extern sub_020644E4 @@ -6954,7 +6954,7 @@ .extern ov05_021F6234 .extern ov05_021F6240 .extern ov05_021F6254 -.extern ov05_021F6360 +.extern Task_UseSweetScentInField .extern ov06_02239944 .extern ov06_02239AAC .extern ov06_0223BA04 @@ -7166,10 +7166,10 @@ .extern ov06_0224C8C8 .extern ov06_0224C8E8 .extern ov06_0224CA58 -.extern ov06_0224CA88 -.extern ov06_0224CAAC -.extern ov06_0224CB30 -.extern ov06_0224CB54 +.extern FieldMoveTask_CreateDigEnvironment +.extern Task_FieldDig +.extern FieldMoveTask_CreateTeleportEnvironment +.extern Task_FieldTeleport .extern ov06_0224CBB0 .extern ov06_0224CC24 .extern ov06_0224CE30 @@ -9168,8 +9168,8 @@ .extern ov18_02244DB0 .extern ov18_02247544 .extern ov18_0224A7C8 -.extern ov06_0224CAAC -.extern ov06_0224CB54 +.extern Task_FieldDig +.extern Task_FieldTeleport .extern gSineTable .extern CARDi_IdentifyBackupCore .extern CARDi_InitCommon diff --git a/arm9/overlays/05/asm/ov05_021F6360.s b/arm9/overlays/05/asm/ov05_021F6360.s index abd04d0fd..23603435f 100644 --- a/arm9/overlays/05/asm/ov05_021F6360.s +++ b/arm9/overlays/05/asm/ov05_021F6360.s @@ -3,8 +3,8 @@ .section .text .balign 4, 0 - thumb_func_start ov05_021F6360 -ov05_021F6360: ; 0x021F6360 + thumb_func_start Task_UseSweetScentInField +Task_UseSweetScentInField: ; 0x021F6360 push {r3, r4, r5, r6, r7, lr} add r7, r0, #0 bl TaskManager_GetFieldSystem diff --git a/arm9/overlays/06/asm/overlay_06.s b/arm9/overlays/06/asm/overlay_06.s index 0f8287ca8..250e1f4c1 100644 --- a/arm9/overlays/06/asm/overlay_06.s +++ b/arm9/overlays/06/asm/overlay_06.s @@ -39524,8 +39524,8 @@ _0224CA78: mov r0, #2 pop {r4, pc} - thumb_func_start ov06_0224CA88 -ov06_0224CA88: ; 0x0224CA88 + thumb_func_start FieldMoveTask_CreateDigEnvironment +FieldMoveTask_CreateDigEnvironment: ; 0x0224CA88 push {r4, r5, r6, lr} add r5, r0, #0 add r6, r1, #0 @@ -39543,8 +39543,8 @@ ov06_0224CA88: ; 0x0224CA88 add r0, r4, #0 pop {r4, r5, r6, pc} - thumb_func_start ov06_0224CAAC -ov06_0224CAAC: ; 0x0224CAAC + thumb_func_start Task_FieldDig +Task_FieldDig: ; 0x0224CAAC push {r3, r4, r5, r6, r7, lr} add r6, r0, #0 bl TaskManager_GetFieldSystem @@ -39613,8 +39613,8 @@ _0224CB1E: pop {r4, pc} .align 2, 0 - thumb_func_start ov06_0224CB30 -ov06_0224CB30: ; 0x0224CB30 + thumb_func_start FieldMoveTask_CreateTeleportEnvironment +FieldMoveTask_CreateTeleportEnvironment: ; 0x0224CB30 push {r4, r5, r6, lr} add r5, r0, #0 add r6, r1, #0 @@ -39632,8 +39632,8 @@ ov06_0224CB30: ; 0x0224CB30 add r0, r4, #0 pop {r4, r5, r6, pc} - thumb_func_start ov06_0224CB54 -ov06_0224CB54: ; 0x0224CB54 + thumb_func_start Task_FieldTeleport +Task_FieldTeleport: ; 0x0224CB54 push {r3, r4, r5, r6, r7, lr} add r6, r0, #0 bl TaskManager_GetFieldSystem diff --git a/arm9/overlays/06/include/overlay_06.h b/arm9/overlays/06/include/overlay_06.h index b51884360..3cabbb601 100644 --- a/arm9/overlays/06/include/overlay_06.h +++ b/arm9/overlays/06/include/overlay_06.h @@ -3,6 +3,8 @@ #include "field_system.h" +typedef struct FieldMoveTaskEnvironment FieldMoveTaskEnvironment; + enum MartType { MART_ITEMS = 0, MART_GOODS, diff --git a/arm9/src/field_move.c b/arm9/src/field_move.c index 712eed3b3..4083aa8ad 100644 --- a/arm9/src/field_move.c +++ b/arm9/src/field_move.c @@ -9,16 +9,18 @@ #include "constants/std_script.h" #include "constants/weather.h" +#include "field_move_environment.h" #include "map_header.h" #include "map_object.h" +#include "overlay_06.h" #include "player_data.h" #include "save_local_field_data.h" #include "start_menu.h" #include "unk_0205EC84.h" #include "unk_0205F7A0.h" -/*static*/ FieldUseMoveEnvironment *FieldMove_CreateUseEnvironment(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -/*static*/ void FieldMove_DeleteUseEnvironment(FieldUseMoveEnvironment *environment); +static FieldUseMoveEnvironment *FieldMove_CreateUseEnvironment(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static void FieldMove_DeleteUseEnvironment(FieldUseMoveEnvironment *environment); static u32 FieldMove_CheckCut(const FieldMoveCheckData *checkData); static void FieldMove_UseCut(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); static BOOL Task_UseCutInField(TaskManager *taskManager); @@ -27,27 +29,36 @@ static void FieldMove_UseFly(FieldMoveUseData *useData, const FieldMoveCheckData static u32 FieldMove_CheckSurf(const FieldMoveCheckData *checkData); static void FieldMove_UseSurf(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); static BOOL Task_UseSurfInField(TaskManager *taskManager); +static u32 FieldMove_CheckStrength(const FieldMoveCheckData *checkData); +static void FieldMove_UseStrength(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseStrengthInField(TaskManager *taskManager); +static u32 FieldMove_CheckDefog(const FieldMoveCheckData *checkData); +static void FieldMove_UseDefog(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseDefogInField(TaskManager *taskManager); +static u32 FieldMove_CheckRockSmash(const FieldMoveCheckData *checkData); +static void FieldMove_UseRockSmash(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseRockSmashInField(TaskManager *taskManager); +static u32 FieldMove_CheckWaterfall(const FieldMoveCheckData *checkData); +static void FieldMove_UseWaterfall(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseWaterfallInField(TaskManager *taskManager); +static u32 FieldMove_CheckRockClimb(const FieldMoveCheckData *checkData); +static void FieldMove_UseRockClimb(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseRockClimbInField(TaskManager *taskManager); +static u32 FieldMove_CheckFlash(const FieldMoveCheckData *checkData); +static void FieldMove_UseFlash(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseFlashInField(TaskManager *taskManager); +static u32 FieldMove_CheckTeleport(const FieldMoveCheckData *checkData); +static void FieldMove_UseTeleport(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseTeleportInField(TaskManager *taskManager); +static u32 FieldMove_CheckDig(const FieldMoveCheckData *checkData); +static void FieldMove_UseDig(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseDigInField(TaskManager *taskManager); +static u32 FieldMove_CheckSweetScent(const FieldMoveCheckData *checkData); +static void FieldMove_UseSweetScent(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static u32 FieldMove_CheckChatter(const FieldMoveCheckData *checkData); +static void FieldMove_UseChatter(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); +static BOOL Task_UseChatterInField(TaskManager *taskManager); -extern void sub_02063D18(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02063CE0(const FieldMoveCheckData *checkData); -extern void sub_02063DC0(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02063D88(const FieldMoveCheckData *checkData); -extern void sub_02063E68(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02063E30(const FieldMoveCheckData *checkData); -extern void sub_02063F10(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02063ED8(const FieldMoveCheckData *checkData); -extern void sub_02063FCC(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02063F80(const FieldMoveCheckData *checkData); -extern void sub_0206405C(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_0206403C(const FieldMoveCheckData *checkData); -extern void sub_02064134(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_020640CC(const FieldMoveCheckData *checkData); -extern void sub_020641F0(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_020641AC(const FieldMoveCheckData *checkData); -extern void sub_020642B4(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02064284(const FieldMoveCheckData *checkData); -extern void sub_02064324(FieldMoveUseData *useData, const FieldMoveCheckData *checkData); -extern u32 sub_02064310(const FieldMoveCheckData *checkData); extern void FieldSystem_GetFacingObject(FieldSystem *fieldSystem, LocalMapObject **object); extern u16 GetPlayerXCoord(PlayerAvatar *playerAvatar); extern u16 GetPlayerZCoord(PlayerAvatar *playerAvatar); @@ -66,21 +77,28 @@ extern void TownMap_Init(FieldSystem *fieldSystem, TownMapAppData *townMap, u32 extern void TownMap_Show(FieldSystem *fieldSystem, TownMapAppData *townMap); extern void StartMenu_SetExitTaskFunc(StartMenuTaskData *startMenu, TaskFunc taskFunc); extern u32 PlayerAvatar_GetState(PlayerAvatar *avatar); +extern FieldMoveTaskEnvironment *FieldMoveTask_CreateTeleportEnvironment(FieldSystem *fieldSystem, Pokemon *mon, HeapID heapId); +extern BOOL Task_FieldTeleport(TaskManager *taskManager); +extern FieldMoveTaskEnvironment *FieldMoveTask_CreateDigEnvironment(FieldSystem *fieldSystem, Pokemon *mon, HeapID heapId); +extern BOOL Task_FieldDig(TaskManager *taskManager); +extern void *sub_0202914C(u32 param0, u16 mapId, u32 param2); +extern void sub_02028AD4(u32 *param0, void *param1, u32 param2); +extern BOOL Task_UseSweetScentInField(TaskManager *taskManager); static const FieldMoveFuncData sFieldMoveFuncTable[] = { - { FieldMove_UseCut, FieldMove_CheckCut }, - { FieldMove_UseFly, FieldMove_CheckFly }, - { FieldMove_UseSurf, FieldMove_CheckSurf }, - { sub_02063D18, sub_02063CE0 }, - { sub_02063DC0, sub_02063D88 }, - { sub_02063E68, sub_02063E30 }, - { sub_02063F10, sub_02063ED8 }, - { sub_02063FCC, sub_02063F80 }, - { sub_0206405C, sub_0206403C }, - { sub_02064134, sub_020640CC }, - { sub_020641F0, sub_020641AC }, - { sub_020642B4, sub_02064284 }, - { sub_02064324, sub_02064310 } + { FieldMove_UseCut, FieldMove_CheckCut }, + { FieldMove_UseFly, FieldMove_CheckFly }, + { FieldMove_UseSurf, FieldMove_CheckSurf }, + { FieldMove_UseStrength, FieldMove_CheckStrength }, + { FieldMove_UseDefog, FieldMove_CheckDefog }, + { FieldMove_UseRockSmash, FieldMove_CheckRockSmash }, + { FieldMove_UseWaterfall, FieldMove_CheckWaterfall }, + { FieldMove_UseRockClimb, FieldMove_CheckRockClimb }, + { FieldMove_UseFlash, FieldMove_CheckFlash }, + { FieldMove_UseTeleport, FieldMove_CheckTeleport }, + { FieldMove_UseDig, FieldMove_CheckDig }, + { FieldMove_UseSweetScent, FieldMove_CheckSweetScent }, + { FieldMove_UseChatter, FieldMove_CheckChatter } }; static inline BOOL FieldMove_CheckSafariOrPalPark(const FieldMoveCheckData *checkData) { @@ -91,6 +109,22 @@ static inline BOOL FieldMove_CheckSafariOrPalPark(const FieldMoveCheckData *chec } } +static inline BOOL FieldMove_CheckPalPark(const FieldMoveCheckData *checkData) { + if (Save_VarsFlags_CheckPalParkSysFlag(Save_VarsFlags_Get(checkData->fieldSystem->saveData)) == TRUE) { + return TRUE; + } else { + return FALSE; + } +} + +static inline BOOL FieldMove_CheckFlag(const FieldMoveCheckData *checkData, u32 flag) { + if (checkData->flag & flag) { + return TRUE; + } else { + return FALSE; + } +} + void *FieldMove_GetMoveFunc(FieldMoveFuncType funcType, u16 fieldMoveIndex) { if (funcType == FIELD_MOVE_FUNC_USE) { return sFieldMoveFuncTable[fieldMoveIndex].use; @@ -149,7 +183,7 @@ void FieldMove_InitCheckData(FieldSystem *fieldSystem, FieldMoveCheckData *check } } -/*static*/ FieldUseMoveEnvironment *FieldMove_CreateUseEnvironment(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { +static FieldUseMoveEnvironment *FieldMove_CreateUseEnvironment(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { FieldUseMoveEnvironment *environment = AllocFromHeap(HEAP_ID_32, sizeof(FieldUseMoveEnvironment)); environment->magic = 0x19740205; environment->facingObject = checkData->facingObject; @@ -157,7 +191,7 @@ void FieldMove_InitCheckData(FieldSystem *fieldSystem, FieldMoveCheckData *check return environment; } -/*static*/ void FieldMove_DeleteUseEnvironment(FieldUseMoveEnvironment *environment) { +static void FieldMove_DeleteUseEnvironment(FieldUseMoveEnvironment *environment) { GF_ASSERT(environment->magic == 0x19740205); FreeToHeap(environment); } @@ -169,7 +203,7 @@ static u32 FieldMove_CheckCut(const FieldMoveCheckData *checkData) { if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_FOREST)) { return FIELD_MOVE_RESPONSE_NEED_BADGE; } - if (checkData->flag & FIELD_MOVE_CHECK_TREE) { + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_TREE)) { return FIELD_MOVE_RESPONSE_OK; } @@ -237,7 +271,7 @@ static u32 FieldMove_CheckSurf(const FieldMoveCheckData *checkData) { if (PlayerAvatar_GetState(checkData->fieldSystem->playerAvatar) == PLAYER_STATE_SURFING) { return FIELD_MOVE_RESPONSE_ALREADY_SURFING; } - if (!(checkData->flag & FIELD_MOVE_CHECK_WATER)) { + if (!FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_WATER)) { return FIELD_MOVE_RESPONSE_NOT_HERE; } if (Save_VarsFlags_CheckHaveFollower(Save_VarsFlags_Get(checkData->fieldSystem->saveData)) == TRUE) { @@ -264,3 +298,314 @@ static BOOL Task_UseSurfInField(TaskManager *taskManager) { FieldMove_DeleteUseEnvironment(useMoveEnvironment); return FALSE; } + +static u32 FieldMove_CheckStrength(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_MINE)) { + return FIELD_MOVE_RESPONSE_NEED_BADGE; + } + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_ROCK)) { + return FIELD_MOVE_RESPONSE_OK; + } + + return FIELD_MOVE_RESPONSE_NOT_HERE; +} + +static void FieldMove_UseStrength(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseStrengthInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseStrengthInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_strength, useMoveEnvironment->facingObject); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckDefog(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_FEN)) { + return FIELD_MOVE_RESPONSE_NEED_BADGE; + } + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_DEFOG)) { + return FIELD_MOVE_RESPONSE_OK; + } + + return FIELD_MOVE_RESPONSE_NOT_HERE; +} + +static void FieldMove_UseDefog(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseDefogInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseDefogInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_defog, NULL); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckRockSmash(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_COAL)) { + return FIELD_MOVE_RESPONSE_NEED_BADGE; + } + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_BREAKROCK)) { + return FIELD_MOVE_RESPONSE_OK; + } + + return FIELD_MOVE_RESPONSE_NOT_HERE; +} + +static void FieldMove_UseRockSmash(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseRockSmashInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseRockSmashInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_rock_smash, useMoveEnvironment->facingObject); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckWaterfall(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_BEACON)) { + return FIELD_MOVE_RESPONSE_NEED_BADGE; + } + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_WATERFALL)) { + return FIELD_MOVE_RESPONSE_OK; + } + + return FIELD_MOVE_RESPONSE_NOT_HERE; +} + +static void FieldMove_UseWaterfall(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseWaterfallInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseWaterfallInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_waterfall, NULL); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckRockClimb(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!PlayerProfile_TestBadgeFlag(Save_PlayerData_GetProfile(checkData->fieldSystem->saveData), BADGE_ICICLE)) { + return FIELD_MOVE_RESPONSE_NEED_BADGE; + } + if (!FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_ROCKCLIMB)) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (Save_VarsFlags_CheckHaveFollower(Save_VarsFlags_Get(checkData->fieldSystem->saveData)) == TRUE) { + return FIELD_MOVE_RESPONSE_HAVE_FOLLOWER; + } + + return FIELD_MOVE_RESPONSE_OK; +} + +static void FieldMove_UseRockClimb(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseRockClimbInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseRockClimbInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_rock_climb, NULL); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckFlash(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (FieldMove_CheckFlag(checkData, FIELD_MOVE_CHECK_FLASH)) { + return FIELD_MOVE_RESPONSE_OK; + } + + return FIELD_MOVE_RESPONSE_NOT_HERE; +} + +static void FieldMove_UseFlash(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(checkData->fieldSystem); + startMenu->exitTaskFunc = Task_UseFlashInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseFlashInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_flash, NULL); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckTeleport(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (!MapHeader_IsTeleportAllowed(checkData->mapId)) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (Save_VarsFlags_CheckHaveFollower(Save_VarsFlags_Get(checkData->fieldSystem->saveData)) == TRUE) { + return FIELD_MOVE_RESPONSE_HAVE_FOLLOWER; + } + if (FieldMove_CheckSafariOrPalPark(checkData) == TRUE) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + + return FIELD_MOVE_RESPONSE_OK; +} + +static void FieldMove_UseTeleport(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(useData->taskManager); + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldSystem_LoadFieldOverlay(fieldSystem); + FieldMoveEnvironment *fieldMoveEnvironment = FieldMove_CreateEnvironment(HEAP_ID_FIELD, useData->partySlot, fieldSystem->saveData); + startMenu->exitTaskFunc = Task_UseTeleportInField; + startMenu->exitTaskEnvironment = fieldMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseTeleportInField(TaskManager *taskManager) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + FieldMoveEnvironment *fieldMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldMoveTaskEnvironment *fieldMoveTaskEnvironment = FieldMoveTask_CreateTeleportEnvironment(fieldSystem, fieldMoveEnvironment->mon, HEAP_ID_4); + FreeToHeap(fieldMoveEnvironment); + TaskManager_Jump(taskManager, Task_FieldTeleport, fieldMoveTaskEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckDig(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (MapHeader_IsCave(checkData->mapId) != TRUE || MapHeader_IsEscapeRopeAllowed(checkData->mapId) != TRUE) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (Save_VarsFlags_CheckHaveFollower(Save_VarsFlags_Get(checkData->fieldSystem->saveData)) == TRUE) { + return FIELD_MOVE_RESPONSE_HAVE_FOLLOWER; + } + + return FIELD_MOVE_RESPONSE_OK; +} + +static void FieldMove_UseDig(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(useData->taskManager); + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldSystem_LoadFieldOverlay(fieldSystem); + FieldMoveEnvironment *fieldMoveEnvironment = FieldMove_CreateEnvironment(HEAP_ID_FIELD, useData->partySlot, fieldSystem->saveData); + startMenu->exitTaskFunc = Task_UseDigInField; + startMenu->exitTaskEnvironment = fieldMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseDigInField(TaskManager *taskManager) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + FieldMoveEnvironment *fieldMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldMoveTaskEnvironment *fieldMoveTaskEnvironment = FieldMoveTask_CreateDigEnvironment(fieldSystem, fieldMoveEnvironment->mon, HEAP_ID_FIELD); + sub_02028AD4(fieldSystem->unk98, sub_0202914C(10, fieldSystem->location->mapId, 4), 1); + FreeToHeap(fieldMoveEnvironment); + TaskManager_Jump(taskManager, Task_FieldDig, fieldMoveTaskEnvironment); + return FALSE; +} + +static u32 FieldMove_CheckSweetScent(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + if (FieldMove_CheckPalPark(checkData) == TRUE) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + + return FIELD_MOVE_RESPONSE_OK; +} + +static void FieldMove_UseSweetScent(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(useData->taskManager); + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldMoveEnvironment *fieldMoveEnvironment = FieldMove_CreateEnvironment(HEAP_ID_FIELD, useData->partySlot, fieldSystem->saveData); + FieldSystem_LoadFieldOverlay(fieldSystem); + startMenu->exitTaskFunc = Task_UseSweetScentInField; + startMenu->exitTaskEnvironment = fieldMoveEnvironment; + startMenu->state = START_MENU_STATE_10; + sub_02028AD4(fieldSystem->unk98, sub_0202914C(11, fieldSystem->location->mapId, 11), 1); +} + +static u32 FieldMove_CheckChatter(const FieldMoveCheckData *checkData) { + if (checkData->fieldSystem->unk6C == 2 || checkData->fieldSystem->unk6C == 3) { + return FIELD_MOVE_RESPONSE_NOT_HERE; + } + + return FIELD_MOVE_RESPONSE_OK; +} + +static void FieldMove_UseChatter(FieldMoveUseData *useData, const FieldMoveCheckData *checkData) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(useData->taskManager); + StartMenuTaskData *startMenu = TaskManager_GetEnvironment(useData->taskManager); + FieldUseMoveEnvironment *useMoveEnvironment = FieldMove_CreateUseEnvironment(useData, checkData); + FieldSystem_LoadFieldOverlay(fieldSystem); + startMenu->exitTaskFunc = Task_UseChatterInField; + startMenu->exitTaskEnvironment = useMoveEnvironment; + startMenu->state = START_MENU_STATE_10; +} + +static BOOL Task_UseChatterInField(TaskManager *taskManager) { + FieldUseMoveEnvironment *useMoveEnvironment = TaskManager_GetEnvironment(taskManager); + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + StartScriptFromMenu(taskManager, std_menu_chatter, NULL); + FieldMove_SetArgs(fieldSystem, useMoveEnvironment->useData.partySlot, 0, 0, 0); + FieldMove_DeleteUseEnvironment(useMoveEnvironment); + return FALSE; +} diff --git a/arm9/src/field_move_environment.c b/arm9/src/field_move_environment.c new file mode 100644 index 000000000..d8eb68d59 --- /dev/null +++ b/arm9/src/field_move_environment.c @@ -0,0 +1,14 @@ +#include "field_move_environment.h" + +#include "global.h" + +#include "heap.h" +#include "party.h" +#include "save.h" + +FieldMoveEnvironment *FieldMove_CreateEnvironment(HeapID heapId, u8 slotNo, SaveData *saveData) { + FieldMoveEnvironment *environment = AllocFromHeapAtEnd(heapId, sizeof(FieldMoveEnvironment)); + environment->mon = Party_GetMonByIndex(SaveArray_Party_Get(saveData), slotNo); + environment->moveData = NULL; + return environment; +} diff --git a/arm9/src/map_header.c b/arm9/src/map_header.c index 214df50c5..74dd099d6 100644 --- a/arm9/src/map_header.c +++ b/arm9/src/map_header.c @@ -751,7 +751,7 @@ u8 MapHeader_GetMapType(u32 mapno) { return sMapHeaders[mapno].map_type; } -BOOL MapHeader_IsOutdoorNotTown(u32 mapno) { +BOOL MapHeader_IsTeleportAllowed(u32 mapno) { if (!MapHeader_IsFlyAllowed(mapno)) { return FALSE; } diff --git a/arm9/src/unk_0206439C.c b/arm9/src/unk_0206439C.c deleted file mode 100644 index 301bf5764..000000000 --- a/arm9/src/unk_0206439C.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "unk_0206439C.h" - -#include "global.h" - -#include "heap.h" -#include "party.h" -#include "save.h" - -UnkStruct_0206439C *sub_0206439C(HeapID heapId, u8 mon_idx, SaveData *save) { - UnkStruct_0206439C *ret = AllocFromHeapAtEnd(heapId, sizeof(UnkStruct_0206439C)); - Party *party = SaveArray_Party_Get(save); - - ret->pokemon = Party_GetMonByIndex(party, mon_idx); - ret->unk4 = NULL; - - return ret; -} diff --git a/include/constants/std_script.h b/include/constants/std_script.h index 6380584d8..6bae27ac2 100644 --- a/include/constants/std_script.h +++ b/include/constants/std_script.h @@ -1,7 +1,15 @@ #ifndef POKEDIAMOND_CONSTANTS_STD_SCRIPT_H #define POKEDIAMOND_CONSTANTS_STD_SCRIPT_H -#define std_menu_cut 10008 -#define std_menu_surf 10012 +#define std_menu_chatter 8900 + +#define std_menu_cut 10008 +#define std_menu_rock_smash 10009 +#define std_menu_strength 10010 +#define std_menu_rock_climb 10011 +#define std_menu_surf 10012 +#define std_menu_waterfall 10013 +#define std_menu_defog 10014 +#define std_menu_flash 10015 #endif // POKEDIAMOND_CONSTANTS_STD_SCRIPT_H diff --git a/include/field_move_environment.h b/include/field_move_environment.h new file mode 100644 index 000000000..c21fec170 --- /dev/null +++ b/include/field_move_environment.h @@ -0,0 +1,19 @@ +#ifndef POKEDIAMOND_FIELD_MOVE_ENVIRONMENT_H +#define POKEDIAMOND_FIELD_MOVE_ENVIRONMENT_H + +#include "heap.h" +#include "pokemon.h" +#include "save.h" + +typedef struct FieldMoveData { + u32 partySlot; +} FieldMoveData; + +typedef struct FieldMoveEnvironment { + Pokemon *mon; + FieldMoveData *moveData; +} FieldMoveEnvironment; + +FieldMoveEnvironment *FieldMove_CreateEnvironment(HeapID heapId, u8 slotNo, SaveData *saveData); + +#endif // POKEDIAMOND_FIELD_MOVE_ENVIRONMENT_H diff --git a/include/map_header.h b/include/map_header.h index 67a77cf64..ca5d22e44 100644 --- a/include/map_header.h +++ b/include/map_header.h @@ -44,7 +44,7 @@ u8 MapHeader_IsEscapeRopeAllowed(u32 mapno); u8 MapHeader_IsFlyAllowed(u32 mapno); u8 MapHeader_IsBikeAllowed(u32 mapno); u8 MapHeader_GetMapType(u32 mapno); -BOOL MapHeader_IsOutdoorNotTown(u32 mapno); +BOOL MapHeader_IsTeleportAllowed(u32 mapno); BOOL MapHeader_MapIsOnMainMatrix(u32 mapno); BOOL MapHeader_IsPokemonCenter(u32 mapno); BOOL MapHeader_IsCave(u32 mapno); diff --git a/include/start_menu.h b/include/start_menu.h index f870eabe9..5065e169e 100644 --- a/include/start_menu.h +++ b/include/start_menu.h @@ -39,8 +39,4 @@ typedef struct StartMenuTaskData { u8 filler3[0x4]; } StartMenuTaskData; -typedef struct FieldMoveData { - u32 partySlot; -} FieldMoveData; - #endif // POKEDIAMOND_START_MENU_H diff --git a/include/unk_0206439C.h b/include/unk_0206439C.h deleted file mode 100644 index a68c5053d..000000000 --- a/include/unk_0206439C.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef POKEDIAMOND_UNK_0206439C_H -#define POKEDIAMOND_UNK_0206439C_H - -#include "heap.h" -#include "pokemon.h" -#include "save.h" - -typedef struct UnkStruct_0206439C { - Pokemon *pokemon; - void *unk4; -} UnkStruct_0206439C; - -UnkStruct_0206439C *sub_0206439C(HeapID heapId, u8 mon_idx, SaveData *save); - -#endif diff --git a/m2ctx.sh b/m2ctx.sh index 150a2580f..a7d2f1b3f 100644 --- a/m2ctx.sh +++ b/m2ctx.sh @@ -4,7 +4,7 @@ OUT_FILE=ctx.c GCC=gcc FLAGS="-E -P -dD -undef" -INCLUDES="-Iinclude -Iinclude/constants -Iinclude/nitro -Iinclude-mw -Ifiles -Iarm9/lib/NitroSDK/include -Iarm9/lib/MSL_C/include -Iarm9/lib/libnns/include -Iarm9/overlays/21/include -Iarm9/overlays/52/include -Iarm9/overlays/59/include" +INCLUDES="-Iinclude -Iinclude/constants -Iinclude/nitro -Iinclude-mw -Ifiles -Iarm9/lib/NitroSDK/include -Iarm9/lib/MSL_C/include -Iarm9/lib/libnns/include -Iarm9/overlays/06/include -Iarm9/overlays/21/include -Iarm9/overlays/52/include -Iarm9/overlays/59/include" DEFINES="-DDIAMOND"