finish decomp of field_move

This commit is contained in:
red031000 2025-02-12 05:47:08 +00:00
parent e080be835f
commit af4d5207e1
No known key found for this signature in database
GPG Key ID: D27E50C050AE0CE1
16 changed files with 452 additions and 979 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -3,6 +3,8 @@
#include "field_system.h"
typedef struct FieldMoveTaskEnvironment FieldMoveTaskEnvironment;
enum MartType {
MART_ITEMS = 0,
MART_GOODS,

View File

@ -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_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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -1,7 +1,15 @@
#ifndef POKEDIAMOND_CONSTANTS_STD_SCRIPT_H
#define POKEDIAMOND_CONSTANTS_STD_SCRIPT_H
#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

View File

@ -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

View File

@ -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);

View File

@ -39,8 +39,4 @@ typedef struct StartMenuTaskData {
u8 filler3[0x4];
} StartMenuTaskData;
typedef struct FieldMoveData {
u32 partySlot;
} FieldMoveData;
#endif // POKEDIAMOND_START_MENU_H

View File

@ -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

View File

@ -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"