Advertisement
luckytyphlosion

npc_nonCutsceneMovementInit_809E704

Sep 18th, 2022
2,372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 3.38 KB | None | 0 0
  1.     thumb_local_start
  2. // movement seems to be done in values of 8?
  3. // speed to timer calculation:
  4. // timer = ((0x80000 / speed) + 0xfff) / 0x1000
  5. npc_nonCutsceneMovementInit_809E704:
  6.     push {lr}
  7.  
  8.     // load delta table
  9.     ldr r7, off_809E7C4 // =NPCMovementIterationDeltas
  10.  
  11.     // get direction
  12.     ldrb r0, [r5,#oOverworldNPCObject_MovementDirection]
  13.  
  14.     // r7 = &NPCMovementIterationDeltas[direction]
  15.     lsl r0, r0, #2
  16.     add r7, r7, r0
  17.  
  18.     // read x coordinate
  19.     ldr r0, [r5,#oOverworldNPCObject_X]
  20.  
  21.     // get x movement delta
  22.     mov r3, #0
  23.     ldrsh r1, [r7,r3]
  24.  
  25.     // convert from whole value to 16.16 fixed point
  26.     lsl r1, r1, #0x10
  27.  
  28.     // add to x coordinate
  29.     add r0, r0, r1
  30.  
  31.     // store in the new x coordinate for this iteration
  32.     str r0, [r5,#oOverworldNPCObject_Unk_70]
  33.  
  34.     // do the same for y coordinate
  35.     ldr r0, [r5,#oOverworldNPCObject_Y]
  36.     mov r3, #2
  37.     ldrsh r1, [r7,r3]
  38.     lsl r1, r1, #0x10
  39.     add r0, r0, r1
  40.     str r0, [r5,#oOverworldNPCObject_Unk_74]
  41.  
  42.     // calculate the amount of frames this iteration should take
  43.     // timer = ((0x80000 / speed) + 0xfff) / 0x1000
  44.     ldr r0, dword_809E7C8 // =0x80000
  45.     ldrb r1, [r5,#oOverworldNPCObject_MovementSpeed]
  46.     push {r5}
  47.     bl SWI_Div
  48.     pop {r5}
  49.  
  50.     // + 0xfff
  51.     ldr r1, dword_809E7D4 // =0xfff
  52.     add r0, r0, r1
  53.  
  54.     // / 0x1000
  55.     lsr r0, r0, #0xc
  56.  
  57.     // store
  58.     strh r0, [r5,#oOverworldNPCObject_Timer]
  59.  
  60.     // load sub delta table
  61.     ldr r7, off_809E7C0 // =NPCMovementSubiterationDeltas
  62.  
  63.     // get direction
  64.     ldrb r0, [r5,#oOverworldNPCObject_MovementDirection]
  65.  
  66.     // r7 = &NPCMovementSubiterationDeltas[direction]
  67.     add r0, r0, r0
  68.     add r7, r7, r0
  69.  
  70.     // get movement speed
  71.     ldrb r4, [r5,#oOverworldNPCObject_MovementSpeed]
  72.    
  73.     // get x movement sub delta
  74.     mov r3, #0
  75.     ldrsb r1, [r7,r3]
  76.  
  77.     // multiply subdelta with speed to get adjusted delta
  78.     mul r1, r4
  79.  
  80.     // scale and store
  81.     lsl r1, r1, #0xc // r1 * 0x1000
  82.     str r1, [r5,#oOverworldNPCObject_DeltaX]
  83.  
  84.     // do the same for delta y
  85.     mov r3, #1
  86.     ldrsb r1, [r7,r3]
  87.     mul r1, r4
  88.     lsl r1, r1, #0xc
  89.     str r1, [r5,#oOverworldNPCObject_DeltaY]
  90.  
  91.     // no delta for z coordinate
  92.     mov r0, #0
  93.     str r0, [r5,#oOverworldNPCObject_DeltaZ]
  94.  
  95.     // store next jumptable function
  96.     mov r0, #4
  97.     strb r0, [r5,#oOverworldNPCObject_MovementFlag_0a]
  98.  
  99.     // nextX = x + deltaX
  100.     ldr r1, [r5,#oOverworldNPCObject_DeltaX]
  101.     ldr r0, [r5,#oOverworldNPCObject_X]
  102.     add r0, r0, r1
  103.     str r0, [r5,#oOverworldNPCObject_NextX]
  104.  
  105.     // nextY = y + deltaY
  106.     ldr r1, [r5,#oOverworldNPCObject_DeltaY]
  107.     ldr r0, [r5,#oOverworldNPCObject_Y]
  108.     add r0, r0, r1
  109.     str r0, [r5,#oOverworldNPCObject_NextY]
  110.  
  111.     // nextZ = z + deltaZ
  112.     ldr r1, [r5,#oOverworldNPCObject_DeltaZ]
  113.     ldr r0, [r5,#oOverworldNPCObject_Z]
  114.     add r0, r0, r1
  115.     str r0, [r5,#oOverworldNPCObject_NextZ]
  116.     bl sub_809F5B0
  117.     pop {pc}
  118. NPCMovementIterationDeltas:
  119.     .hword  0,  0
  120.     .hword  8,  0
  121.     .hword  0,  0
  122.     .hword  0,  8
  123.     .hword  0,  0
  124.     .hword -8,  0
  125.     .hword  0,  0
  126.     .hword  0, -8
  127. NPCMovementSubiterationDeltas:
  128.     .byte  0,  0
  129.     .byte  1,  0
  130.     .byte  0,  0
  131.     .byte  0,  1
  132.     .byte  0,  0
  133.     .byte -1,  0
  134.     .byte  0,  0
  135.     .byte  0, -1
  136. byte_809E7AE: .byte 0x0, 0x9, 0x0, 0xB, 0x0, 0xD, 0x0, 0xF
  137. byte_809E7B6: .byte 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x7, 0x0, 0x0
  138. off_809E7C0: .word NPCMovementSubiterationDeltas
  139. off_809E7C4: .word NPCMovementIterationDeltas
  140. dword_809E7C8: .word 0x80000
  141.     .word byte_809E7AE
  142.     .word byte_809E7B6
  143. dword_809E7D4: .word 0xFFF
  144.     thumb_func_end npc_nonCutsceneMovementInit_809E704
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement