Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- thumb_local_start
- // movement seems to be done in values of 8?
- // speed to timer calculation:
- // timer = ((0x80000 / speed) + 0xfff) / 0x1000
- npc_nonCutsceneMovementInit_809E704:
- push {lr}
- // load delta table
- ldr r7, off_809E7C4 // =NPCMovementIterationDeltas
- // get direction
- ldrb r0, [r5,#oOverworldNPCObject_MovementDirection]
- // r7 = &NPCMovementIterationDeltas[direction]
- lsl r0, r0, #2
- add r7, r7, r0
- // read x coordinate
- ldr r0, [r5,#oOverworldNPCObject_X]
- // get x movement delta
- mov r3, #0
- ldrsh r1, [r7,r3]
- // convert from whole value to 16.16 fixed point
- lsl r1, r1, #0x10
- // add to x coordinate
- add r0, r0, r1
- // store in the new x coordinate for this iteration
- str r0, [r5,#oOverworldNPCObject_Unk_70]
- // do the same for y coordinate
- ldr r0, [r5,#oOverworldNPCObject_Y]
- mov r3, #2
- ldrsh r1, [r7,r3]
- lsl r1, r1, #0x10
- add r0, r0, r1
- str r0, [r5,#oOverworldNPCObject_Unk_74]
- // calculate the amount of frames this iteration should take
- // timer = ((0x80000 / speed) + 0xfff) / 0x1000
- ldr r0, dword_809E7C8 // =0x80000
- ldrb r1, [r5,#oOverworldNPCObject_MovementSpeed]
- push {r5}
- bl SWI_Div
- pop {r5}
- // + 0xfff
- ldr r1, dword_809E7D4 // =0xfff
- add r0, r0, r1
- // / 0x1000
- lsr r0, r0, #0xc
- // store
- strh r0, [r5,#oOverworldNPCObject_Timer]
- // load sub delta table
- ldr r7, off_809E7C0 // =NPCMovementSubiterationDeltas
- // get direction
- ldrb r0, [r5,#oOverworldNPCObject_MovementDirection]
- // r7 = &NPCMovementSubiterationDeltas[direction]
- add r0, r0, r0
- add r7, r7, r0
- // get movement speed
- ldrb r4, [r5,#oOverworldNPCObject_MovementSpeed]
- // get x movement sub delta
- mov r3, #0
- ldrsb r1, [r7,r3]
- // multiply subdelta with speed to get adjusted delta
- mul r1, r4
- // scale and store
- lsl r1, r1, #0xc // r1 * 0x1000
- str r1, [r5,#oOverworldNPCObject_DeltaX]
- // do the same for delta y
- mov r3, #1
- ldrsb r1, [r7,r3]
- mul r1, r4
- lsl r1, r1, #0xc
- str r1, [r5,#oOverworldNPCObject_DeltaY]
- // no delta for z coordinate
- mov r0, #0
- str r0, [r5,#oOverworldNPCObject_DeltaZ]
- // store next jumptable function
- mov r0, #4
- strb r0, [r5,#oOverworldNPCObject_MovementFlag_0a]
- // nextX = x + deltaX
- ldr r1, [r5,#oOverworldNPCObject_DeltaX]
- ldr r0, [r5,#oOverworldNPCObject_X]
- add r0, r0, r1
- str r0, [r5,#oOverworldNPCObject_NextX]
- // nextY = y + deltaY
- ldr r1, [r5,#oOverworldNPCObject_DeltaY]
- ldr r0, [r5,#oOverworldNPCObject_Y]
- add r0, r0, r1
- str r0, [r5,#oOverworldNPCObject_NextY]
- // nextZ = z + deltaZ
- ldr r1, [r5,#oOverworldNPCObject_DeltaZ]
- ldr r0, [r5,#oOverworldNPCObject_Z]
- add r0, r0, r1
- str r0, [r5,#oOverworldNPCObject_NextZ]
- bl sub_809F5B0
- pop {pc}
- NPCMovementIterationDeltas:
- .hword 0, 0
- .hword 8, 0
- .hword 0, 0
- .hword 0, 8
- .hword 0, 0
- .hword -8, 0
- .hword 0, 0
- .hword 0, -8
- NPCMovementSubiterationDeltas:
- .byte 0, 0
- .byte 1, 0
- .byte 0, 0
- .byte 0, 1
- .byte 0, 0
- .byte -1, 0
- .byte 0, 0
- .byte 0, -1
- byte_809E7AE: .byte 0x0, 0x9, 0x0, 0xB, 0x0, 0xD, 0x0, 0xF
- byte_809E7B6: .byte 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x7, 0x0, 0x0
- off_809E7C0: .word NPCMovementSubiterationDeltas
- off_809E7C4: .word NPCMovementIterationDeltas
- dword_809E7C8: .word 0x80000
- .word byte_809E7AE
- .word byte_809E7B6
- dword_809E7D4: .word 0xFFF
- thumb_func_end npc_nonCutsceneMovementInit_809E704
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement