Find Unit Data Pointer For ENTD Unit ID

From Final Fantasy Hacktics Wiki
Revision as of 21:51, 2 December 2016 by Glain (talk | contribs) (Created page with " # ROUTINE: FIND UNIT DATA POINTER FOR ENTD UNIT ID # Parameters: # r4 = (param_ENTD_Unit_ID) # r5 = (&resultCode); resultCode = { # ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
#   ROUTINE: FIND UNIT DATA POINTER FOR ENTD UNIT ID
#       Parameters:
#           r4 = (param_ENTD_Unit_ID)
#           r5 = (&resultCode); resultCode = {
#               Unit index  , if the unit was found without crystal or treasure status;
#               -3          , if the unit was found with crystal or treasure status, or the unit could not be found at all (or 0x183 flags = 0x80?)
#               (Possibly -2 if 0x183 flags = 0, or -6 if 0x183 flags = 0x02, but not sure those cases can be hit?)
#           }
#       Returns:
#           r2 = (Unit in-battle pointer) for specified unit

80180c90: 00003821 addu r7,r0,r0                #   index = 0
80180c94: 340800ff ori r8,r0,0x00ff             #   0xff
80180c98: 308600ff andi r6,r4,0x00ff            #   param_ENTD_Unit_ID
80180c9c: 2409fffd addiu r9,r0,-0x0003          #   -3
80180ca0: 3c038019 lui r3,0x8019
80180ca4: 246308cc addiu r3,r3,0x08cc           #   unit = units[0]
                                                #   do {
80180ca8: 90620001 lbu r2,0x0001(r3)            #       unit.UnitID 
80180cac: 00000000 nop
80180cb0: 1048000e beq r2,r8,0x80180cec         #       if (unit.UnitID != 0xff) {
80180cb4: 00000000 nop
80180cb8: 90620161 lbu r2,0x0161(r3)            #           unit.ENTD_Unit_ID
80180cbc: 00000000 nop
80180cc0: 1446000a bne r2,r6,0x80180cec         #           if (unit.ENTD_Unit_ID == param_ENTD_Unit_ID) {
80180cc4: 00000000 nop
80180cc8: 94620058 lhu r2,0x0058(r3)            #               unit.CurrentStatuses1
80180ccc: 00000000 nop
80180cd0: 30420140 andi r2,r2,0x0140            #               unit.CurrentStatuses1 & 0x140       // Check for Crystal or Treasure status
80180cd4: 10400003 beq r2,r0,0x80180ce4         
80180cd8: 00601021 addu r2,r3,r0                #               result = unit
                                                #               if (unit.CurrentStatuses1 & 0x140) {
80180cdc: 0806036a j 0x80180da8
80180ce0: aca90000 sw r9,0x0000(r5)             #                   resultCode = -3; return result;
                                                #               } else {
80180ce4: 0806036a j 0x80180da8
80180ce8: aca70000 sw r7,0x0000(r5)             #                   resultCode = index; return result;
                                                #               }
                                                #           }
                                                #       }
80180cec: 24e70001 addiu r7,r7,0x0001           #       index = index + 1
80180cf0: 28e20015 slti r2,r7,0x0015
80180cf4: 1440ffec bne r2,r0,0x80180ca8
80180cf8: 246301c0 addiu r3,r3,0x01c0           #       unit = *(&unit + 1)     // Unit = (Next unit in array)
                                                #   } while (index < 21)
80180cfc: 00003821 addu r7,r0,r0                #   index = 0
80180d00: 340c00ff ori r12,r0,0x00ff            #   0xff
80180d04: 308400ff andi r4,r4,0x00ff            #   param_ENTD_Unit_ID
80180d08: 240bfffe addiu r11,r0,-0x0002         #   -2
80180d0c: 34090080 ori r9,r0,0x0080             #   0x80
80180d10: 240afffd addiu r10,r0,-0x0003         #   -3
80180d14: 34080002 ori r8,r0,0x0002             #   2
80180d18: 3c038019 lui r3,0x8019
80180d1c: 246308cc addiu r3,r3,0x08cc           #   unit = units[0]
                                                #   do {
80180d20: 90660001 lbu r6,0x0001(r3)            #       unit.UnitID 
80180d24: 00000000 nop
80180d28: 14cc0018 bne r6,r12,0x80180d8c        #       if (unit.UnitID != 0xff) {
80180d2c: 00000000 nop
80180d30: 90620161 lbu r2,0x0161(r3)            #           unit.ENTD_Unit_ID
80180d34: 00000000 nop
80180d38: 14440014 bne r2,r4,0x80180d8c         #           if (unit.ENTD_Unit_ID == param_ENTD_Unit_ID) {
80180d3c: 00000000 nop                          #               // Is it even possible to get in here? We would have returned out of the routine in the previous loop if these conditions were true!
80180d40: 90620183 lbu r2,0x0183(r3)            #               unit.Flags_0x183
80180d44: 00000000 nop
80180d48: 10460010 beq r2,r6,0x80180d8c         #               if (unit.Flags_0x183 != unit.UnitID) {
80180d4c: 00000000 nop
80180d50: 14400004 bne r2,r0,0x80180d64         #                   if (unit.Flags_0x183 == 0) {
80180d54: 00000000 nop
80180d58: acab0000 sw r11,0x0000(r5)            #                       resultCode = -2
80180d5c: 0806036a j 0x80180da8                 #                       return unit
80180d60: 00601021 addu r2,r3,r0                
                                                #                   }
80180d64: 14490004 bne r2,r9,0x80180d78         #                   if (unit.Flags_0x183 == 0x80) {
80180d68: 00000000 nop
80180d6c: acaa0000 sw r10,0x0000(r5)            #                       resultCode = -3
80180d70: 0806036a j 0x80180da8                 #                       return unit
80180d74: 00601021 addu r2,r3,r0                
                                                #                   }
80180d78: 14480004 bne r2,r8,0x80180d8c         #                   if (unit.Flags_0x183 == 0x02) {
80180d7c: 2402fffa addiu r2,r0,-0x0006          #                       -6
80180d80: aca20000 sw r2,0x0000(r5)             #                       resultCode = -6
80180d84: 0806036a j 0x80180da8                 #                       return unit
80180d88: 00601021 addu r2,r3,r0
                                                #                   }
                                                #               }
                                                #           }
                                                #       }
80180d8c: 24e70001 addiu r7,r7,0x0001           #       index = index + 1
80180d90: 28e20015 slti r2,r7,0x0015
80180d94: 1440ffe2 bne r2,r0,0x80180d20
80180d98: 246301c0 addiu r3,r3,0x01c0           #       unit = *(&unit + 1)     // Unit = (Next unit in array)
                                                #   } while (index < 21)   
80180d9c: 2402fffd addiu r2,r0,-0x0003          #   -3
80180da0: aca20000 sw r2,0x0000(r5)             #   resultCode = -3
80180da4: 00001021 addu r2,r0,r0                #   result = 0
80180da8: 03e00008 jr r31                       #   return result
80180dac: 00000000 nop