Warp Unit

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: WarpUnit Event Instruction
#       Parameters:
#           r4 = (params) Parameter array for this event instruction
#               Offsets:
#                   0x00: ENTD Unit ID (2 bytes)
#                   0x02: X Coordinate (1 byte)
#                   0x03: Y Coordinate (1 byte)
#                   0x04: Higher Elevation (1 byte)
#                   0x05: Facing Direction (1 byte)

80147e60: 27bdffd0 addiu r29,r29,-0x0030
80147e64: afb20028 sw r18,0x0028(r29)
80147e68: 00809021 addu r18,r4,r0
80147e6c: afbf002c sw r31,0x002c(r29)
80147e70: afb10024 sw r17,0x0024(r29)
80147e74: 0c05181e jal 0x80146078               #   UnitID = Load Halfword (params.UnitID);
80147e78: afb00020 sw r16,0x0020(r29)
80147e7c: 26520002 addiu r18,r18,0x0002         #   params + 2
80147e80: 00021400 sll r2,r2,0x10
80147e84: 00022403 sra r4,r2,0x10
80147e88: 0c060324 jal 0x80180c90               #   unitData = Find Unit Data Pointer For ENTD Unit ID (UnitID, resultCodePtr);
80147e8c: 27a50018 addiu r5,r29,0x0018          
80147e90: 00408821 addu r17,r2,r0               #   unitData
80147e94: 8fa30018 lw r3,0x0018(r29)            #   resultCode = *resultCodePtr
80147e98: 2402fffe addiu r2,r0,-0x0002          #   -2
80147e9c: 10620003 beq r3,r2,0x80147eac         
80147ea0: 00008021 addu r16,r0,r0               #   unitIndex = 0
80147ea4: 0460003a bltz r3,0x80147f90           #   if ((resultCode != -2) and (resultCode < 0)) return;
80147ea8: 00000000 nop                          #   do {
80147eac: 0c0602bf jal 0x80180afc               #       tempUnitData = Get Unit's Data Pointer (unitIndex)
80147eb0: 02002021 addu r4,r16,r0
80147eb4: 10510005 beq r2,r17,0x80147ecc        #       if (tempUnitData == unitData) break;
80147eb8: 00000000 nop
80147ebc: 26100001 addiu r16,r16,0x0001         #       unitIndex = unitIndex + 1
80147ec0: 2a020015 slti r2,r16,0x0015
80147ec4: 1440fff9 bne r2,r0,0x80147eac         #   } while (unitIndex < 21)
80147ec8: 00000000 nop
80147ecc: 92420000 lbu r2,0x0000(r18)           #   params.X
80147ed0: 00000000 nop
80147ed4: a2220047 sb r2,0x0047(r17)            #   unitData.X = params.X
80147ed8: 92420001 lbu r2,0x0001(r18)           #   params.Y
80147edc: 02002021 addu r4,r16,r0               #   unitIndex
80147ee0: a2220048 sb r2,0x0048(r17)            #   unitData.Y = params.Y
80147ee4: 92430002 lbu r3,0x0002(r18)           #   params.HigherElevation
80147ee8: 96220048 lhu r2,0x0048(r17)           #   unitData.CombinedValue0x48              // High byte: 0x49 flags; 0x80 bit is Higher Elevation; Low byte: Y coordinate
80147eec: 00031bc0 sll r3,r3,0x0f               #   params.HigherElevation << 15
80147ef0: 30427fff andi r2,r2,0x7fff            #   unitData.CombinedValue0x48 & 0x7fff
80147ef4: 00431025 or r2,r2,r3                  #   (unitData.CombinedValue0x48 & 0x7fff) | (params.HigherElevation << 15)
80147ef8: a6220048 sh r2,0x0048(r17)            #   unitData.CombinedValue0x48 = (unitData.CombinedValue0x48 & 0x7fff) | (params.HigherElevation << 15)
                                                #       // (Essentially, unitData.HigherElevation = params.HigherElevation)
80147efc: 92430003 lbu r3,0x0003(r18)           #   params.FacingDirection
80147f00: 3042f0ff andi r2,r2,0xf0ff            #   unitData.CombinedValue0x48 & 0xf0ff     // (Clear facing direction)
80147f04: 3063000f andi r3,r3,0x000f            #   params.FacingDirection & 0x0f
80147f08: 00031a00 sll r3,r3,0x08               #   (params.FacingDirection & 0x0f) << 8
80147f0c: 00431025 or r2,r2,r3                  #   (unitData.CombinedValue0x48 & 0xf0ff) | (params.FacingDirection & 0x0f) << 8)
80147f10: 0c023388 jal 0x8008ce20               #   MiscUnitID = Get Unit Misc ID By Unit Index (unitIndex);
80147f14: a6220048 sh r2,0x0048(r17)            #   unitData.CombinedValue0x48 = (unitData.CombinedValue0x48 & 0xf0ff) | (params.FacingDirection & 0x0f) << 8)
                                                #       // (Essentially, unitData.FacingDirection = params.FacingDirection)
80147f18: 00408021 addu r16,r2,r0               #   MiscUnitID
80147f1c: 2402ffff addiu r2,r0,-0x0001          #   -1
80147f20: 1202001b beq r16,r2,0x80147f90        #   if (MiscUnitID == -1) return;
80147f24: 02002021 addu r4,r16,r0               #   MiscUnitID
80147f28: 92220047 lbu r2,0x0047(r17)           #   unitData.X
80147f2c: 00000000 nop
80147f30: a7a20010 sh r2,0x0010(r29)            #   structData.X = unitData.X
80147f34: 96220048 lhu r2,0x0048(r17)           #   unitData.CombinedValue0x48
80147f38: 00000000 nop
80147f3c: 000213c2 srl r2,r2,0x0f               #   unitData.HigherElevation
80147f40: a7a20012 sh r2,0x0012(r29)            #   structData.HigherElevation = unitData.HigherElevation
80147f44: 92220048 lbu r2,0x0048(r17)           #   unitData.Y
80147f48: 3c058017 lui r5,0x8017
80147f4c: 24a5d9d8 addiu r5,r5,-0x2628          #   0x8016d9d8
80147f50: a7a20014 sh r2,0x0014(r29)            #   structData.Y = unitData.Y
80147f54: 001010c0 sll r2,r16,0x03              #   MiscUnitID * 8
80147f58: 00501023 subu r2,r2,r16               #   MiscUnitID * 7
80147f5c: 92430003 lbu r3,0x0003(r18)           #   params.FacingDirection
80147f60: 00451021 addu r2,r2,r5                #   ptr = 0x8016d9d8 + (MiscUnitID * 7)
80147f64: a0400006 sb r0,0x0006(r2)             #   *(ptr + 6) = 0
80147f68: a0400004 sb r0,0x0004(r2)             #   *(ptr + 4) = 0
80147f6c: 00031880 sll r3,r3,0x02               #   params.FacingDirection << 2
80147f70: a0430000 sb r3,0x0000(r2)             #   *ptr = params.FacingDirection << 2
80147f74: 92460003 lbu r6,0x0003(r18)           #   params.FacingDirection
80147f78: 0c02329f jal 0x8008ca7c               #   ? 0x8ca7c (MiscUnitID, structData, params.FacingDirection);
80147f7c: 27a50010 addiu r5,r29,0x0010          #   structData
80147f80: 92450003 lbu r5,0x0003(r18)           #   params.FacingDirection
80147f84: 02002021 addu r4,r16,r0               #   MiscUnitID
80147f88: 0c04b6c0 jal 0x8012db00               #   ? 0x12db00 (MiscUnitID, params.FacingDirection << 2);
80147f8c: 00052880 sll r5,r5,0x02               #   params.FacingDirection << 2
80147f90: 8fbf002c lw r31,0x002c(r29)
80147f94: 8fb20028 lw r18,0x0028(r29)
80147f98: 8fb10024 lw r17,0x0024(r29)
80147f9c: 8fb00020 lw r16,0x0020(r29)
80147fa0: 27bd0030 addiu r29,r29,0x0030
80147fa4: 03e00008 jr r31
80147fa8: 00000000 nop