Set Unit Status By ENTD Unit ID

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: SET UNIT STATUS BY ENTD UNIT ID
#       Parameters:
#           r4 = (ENTDUnitID) ENTD Unit ID
#           r5 = (statusIndex) Index of status effect, going from 0 to 39, in order of storage in status flags.  0 = (Blank Status), 39 = Death Sentence
#           r6 = (isInfliction) Inflicts status if true (1), otherwise removes status
#           r7 = (useLessStrictStatusRemoval) Use less strict status removal during status validation

80149100: 27bdffd8 addiu r29,r29,-0x0028
80149104: afb00010 sw r16,0x0010(r29)
80149108: 00a08021 addu r16,r5,r0
8014910c: afb20018 sw r18,0x0018(r29)
80149110: 00c09021 addu r18,r6,r0
80149114: afb3001c sw r19,0x001c(r29)
80149118: 00e09821 addu r19,r7,r0
8014911c: afbf0020 sw r31,0x0020(r29)
80149120: 0c04b72b jal 0x8012dcac                   #   battleUnitIndex = Get Battle Unit Index By ENTD Unit ID (ENTDUnitID);
80149124: afb10014 sw r17,0x0014(r29)
80149128: 00408821 addu r17,r2,r0                   #   battleUnitIndex
8014912c: 340207d0 ori r2,r0,0x07d0                 #   2000
80149130: 12220021 beq r17,r2,0x801491b8            #   if (battleUnitIndex == 2000) return;
80149134: 00000000 nop
80149138: 0c0602bf jal 0x80180afc                   #   unit = Get Unit's Data Pointer (battleUnitIndex);
8014913c: 02202021 addu r4,r17,r0
80149140: 00402821 addu r5,r2,r0                    #   unit
80149144: 00001821 addu r3,r0,r0                    #   statusByteIndex = 0
                                                    #   do {
80149148: 00a31021 addu r2,r5,r3                    
8014914c: 24630001 addiu r3,r3,0x0001               #       statusByteIndex = statusByteIndex + 1
80149150: a04001a7 sb r0,0x01a7(r2)                 #       unit.actionStatusInfliction[statusByteIndex] = 0
80149154: a04001ac sb r0,0x01ac(r2)                 #       unit.actionStatusRemoval[statusByteIndex] = 0
80149158: 28620005 slti r2,r3,0x0005
8014915c: 1440fffa bne r2,r0,0x80149148             #   } while (statusByteIndex < 5);
80149160: 00000000 nop
80149164: 06010002 bgez r16,0x80149170
80149168: 02001021 addu r2,r16,r0
8014916c: 26020007 addiu r2,r16,0x0007
80149170: 000220c3 sra r4,r2,0x03                   #   statusByteIndex = statusIndex / 8  // (integer division)
80149174: 000410c0 sll r2,r4,0x03
80149178: 02021023 subu r2,r16,r2                   #   statusIndex % 8  // (modulo)
8014917c: 34030001 ori r3,r0,0x0001                 #   1
80149180: 12400004 beq r18,r0,0x80149194
80149184: 00431804 sllv r3,r3,r2                    #   statusValue = 1 << (statusIndex % 8)
                                                    #   if (isInfliction) {
80149188: 00a41021 addu r2,r5,r4
8014918c: 08052467 j 0x8014919c
80149190: a04301a7 sb r3,0x01a7(r2)                 #       unit.actionStatusInfliction[statusByteIndex] = statusValue
                                                    #   } else {
80149194: 00a41021 addu r2,r5,r4
80149198: a04301ac sb r3,0x01ac(r2)                 #       unit.actionStatusRemoval[statusByteIndex] = statusValue
                                                    #   }
8014919c: 3c028019 lui r2,0x8019
801491a0: 2442e07c addiu r2,r2,-0x1f84              #   0x8018e07c
801491a4: 3c018017 lui r1,0x8017
801491a8: ac223ca8 sw r2,0x3ca8(r1)                 #   routine = 0x8018e07c (Post Ability Hardcoding?)
801491ac: 02202021 addu r4,r17,r0
801491b0: 0c0533ad jal 0x8014ceb4                   #   Call Inner Subroutine (battleUnitIndex, useLessStrictStatusRemoval); (routine = 0x8018e07c Post Ability Hardcoding?)
801491b4: 02602821 addu r5,r19,r0
801491b8: 8fbf0020 lw r31,0x0020(r29)
801491bc: 8fb3001c lw r19,0x001c(r29)
801491c0: 8fb20018 lw r18,0x0018(r29)
801491c4: 8fb10014 lw r17,0x0014(r29)
801491c8: 8fb00010 lw r16,0x0010(r29)
801491cc: 27bd0028 addiu r29,r29,0x0028
801491d0: 03e00008 jr r31
801491d4: 00000000 nop