Set Animation Based On Unit Status

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: SET ANIMATION BASED ON UNIT STATUS
#       Parameters:
#           r4 = (miscUnit) Unit misc data pointer

80082eec: 27bdffe0 addiu r29,r29,-0x0020
80082ef0: afb10014 sw r17,0x0014(r29)
80082ef4: 00808821 addu r17,r4,r0                   #   miscUnit
80082ef8: afbf0018 sw r31,0x0018(r29)
80082efc: 0c0209e3 jal 0x8008278c                   #   result = Movement validation - float/fly? (miscUnit);
80082f00: afb00010 sw r16,0x0010(r29)
80082f04: 304200ff andi r2,r2,0x00ff                #   result = result & 0xff
80082f08: 0440007f bltz r2,0x80083108
80082f0c: 00008021 addu r16,r0,r0                   #   value = 0
                                                    #   if ((result >= 0)          
80082f10: 28420002 slti r2,r2,0x0002
80082f14: 1040007c beq r2,r0,0x80083108             #       and (result < 2))                                        // if unit is flying, submerged with swim, or crystallised, branch
80082f18: 00000000 nop                              #   {
80082f1c: 8e230144 lw r3,0x0144(r17)                #       miscUnit.statusFlagsWord2
80082f20: 00000000 nop
80082f24: 30620001 andi r2,r3,0x0001                #       miscUnit.statusFlagsWord2 & STATUS_MISC_CRYSTAL
80082f28: 14400097 bne r2,r0,0x80083188             #       if (miscUnit.statusFlagsWord2 & STATUS_MISC_CRYSTAL) value = 9;                                // If crystal, use animation 0x12 & 13
80082f2c: 30620008 andi r2,r3,0x0008
80082f30: 1440007e bne r2,r0,0x8008312c             #       else if (miscUnit.statusFlagsWord2 & STATUS_MISC_TREASURE) value = 21;                         // if treasure, use animation 0x2A & 2B
80082f34: 00000000 nop                              #       else {
80082f38: 8e230140 lw r3,0x0140(r17)                #           miscUnit.statusFlagsWord1                        // 1st 4 bytes of misc unit status flags
80082f3c: 00000000 nop
80082f40: 30623fff andi r2,r3,0x3fff                #           miscUnit.statusFlagsWord1 & 0x03ff               // (Masks off Reflect and Undead)
                                                    #           if (miscUnit.statusFlagsWord1 & 0x03ff) == 0) useHeight3 = true;
80082f44: 10400069 beq r2,r0,0x800830ec             #           else {
80082f48: 00000000 nop
80082f4c: 92220006 lbu r2,0x0006(r17)               #               miscUnit.spritesheetID
80082f50: 00000000 nop
80082f54: 00021080 sll r2,r2,0x02                   #               (miscUnit.spritesheetID * 4)
80082f58: 3c018009 lui r1,0x8009
80082f5c: 00220821 addu r1,r1,r2
80082f60: 90224749 lbu r2,0x4749(r1)                #               spritesheetData[miscUnit.spritesheetID].SEQ_ID
80082f64: 00000000 nop
80082f68: 2c420005 sltiu r2,r2,0x0005               
80082f6c: 1440001b bne r2,r0,0x80082fdc             #               if (spritesheetData[miscUnit.spritesheetID].SEQ_ID < 5) {                              // animations for all types except RUKA, ARUTE, KANZEN.
80082f70: 30620004 andi r2,r3,0x0004
80082f74: 14400076 bne r2,r0,0x80083150             #                   if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEAD) value = 26;
80082f78: 30620010 andi r2,r3,0x0010
80082f7c: 14400054 bne r2,r0,0x800830d0             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_STOP) value = 2;                  // animation 2 points to stopped animations.
80082f80: 30620040 andi r2,r3,0x0040
80082f84: 14400026 bne r2,r0,0x80083020             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_SLEEP) value = 36;
80082f88: 30620020 andi r2,r3,0x0020
80082f8c: 14400050 bne r2,r0,0x800830d0             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_PETRIFY) value = 2;
80082f90: 30620080 andi r2,r3,0x0080
80082f94: 14400028 bne r2,r0,0x80083038             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_CONFUSION) value = 37;
80082f98: 30620100 andi r2,r3,0x0100
80082f9c: 1440002c bne r2,r0,0x80083050             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_PERFORMING) useAbilityID = true;
80082fa0: 30620200 andi r2,r3,0x0200
80082fa4: 1440002a bne r2,r0,0x80083050             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_CHARGING) useAbilityID = true;
80082fa8: 30620400 andi r2,r3,0x0400
80082fac: 14400032 bne r2,r0,0x80083078             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEFENDING) value = 23;
80082fb0: 30620800 andi r2,r3,0x0800
80082fb4: 14400034 bne r2,r0,0x80083088             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_SLOW) useHeight1 = true;
80082fb8: 30621000 andi r2,r3,0x1000
80082fbc: 1440003b bne r2,r0,0x800830ac             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_HASTE) useHeight2 = true;
80082fc0: 30622000 andi r2,r3,0x2000
80082fc4: 14400042 bne r2,r0,0x800830d0             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_CURSED) value = 2;
80082fc8: 30620001 andi r2,r3,0x0001
80082fcc: 1440006f bne r2,r0,0x8008318c             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_BLANK) value = 33;
80082fd0: 34100021 ori r16,r0,0x0021
80082fd4: 08020c3b j 0x800830ec
80082fd8: 00000000 nop
                                                    #               } else {
80082fdc: 1440005c bne r2,r0,0x80083150             #                   if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEAD) value = 26;
80082fe0: 30620002 andi r2,r3,0x0002
80082fe4: 1440005e bne r2,r0,0x80083160             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_MOUNT) value = 34;
80082fe8: 30620008 andi r2,r3,0x0008
80082fec: 10400005 beq r2,r0,0x80083004             #                   else
                                                    #                       if ((miscUnit.statusFlagsWord1 & STATUS_MISC_CRITICAL)
80082ff0: 34020002 ori r2,r0,0x0002
80082ff4: 92230130 lbu r3,0x0130(r17)               #                           
80082ff8: 00000000 nop
80082ffc: 14620008 bne r3,r2,0x80083020             #                           and (miscUnit.mountRiderValue == 2))  // Unit is a mount
80083000: 00000000 nop                              #                               value = 36;
80083004: 8e230140 lw r3,0x0140(r17)
80083008: 00000000 nop
8008300c: 30620010 andi r2,r3,0x0010
80083010: 1440002f bne r2,r0,0x800830d0             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_STOP) value = 2;
80083014: 30620040 andi r2,r3,0x0040
80083018: 10400003 beq r2,r0,0x80083028             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_SLEEP) value = 36;
8008301c: 30620020 andi r2,r3,0x0020
80083020: 08020c63 j 0x8008318c
80083024: 34100024 ori r16,r0,0x0024
80083028: 14400029 bne r2,r0,0x800830d0             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_PETRIFY) value = 2;
8008302c: 30620080 andi r2,r3,0x0080
80083030: 10400003 beq r2,r0,0x80083040             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_CONFUSION) value = 37;
80083034: 30620100 andi r2,r3,0x0100
80083038: 08020c63 j 0x8008318c
8008303c: 34100025 ori r16,r0,0x0025
80083040: 14400003 bne r2,r0,0x80083050             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_PERFORMING) useAbilityID = true;                   
80083044: 30620200 andi r2,r3,0x0200
80083048: 10400009 beq r2,r0,0x80083070             #                   else if (miscUnit.statusFlagsWord1 & STATUS_MISC_CHARGING) moreStatusChecks = true;
8008304c: 30620400 andi r2,r3,0x0400
                                                    #               }
                                                    #           }
                                                    #           if (useAbilityID) {
80083050: 8e220134 lw r2,0x0134(r17)                #               battleUnit = miscUnit.battleUnit
80083054: 00000000 nop
80083058: 94420170 lhu r2,0x0170(r2)                #               battleUnit.lastAbilityUsedID
8008305c: 02202021 addu r4,r17,r0
80083060: 0c020ae0 jal 0x80082b80                   #               value = Set attack animation flags and facing 2 (miscUnit);
80083064: a6220138 sh r2,0x0138(r17)                #               miscUnit.usedAbilityID = battleUnit.lastAbilityUsedID
80083068: 08020c63 j 0x8008318c
8008306c: 00000000 nop                              #           }
                                                    #           if (moreStatusChecks) {
80083070: 10400003 beq r2,r0,0x80083080             #               if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEFENDING)
80083074: 30620800 andi r2,r3,0x0800
80083078: 08020c63 j 0x8008318c
8008307c: 34100017 ori r16,r0,0x0017                #                   value = 23
80083080: 10400008 beq r2,r0,0x800830a4             #               if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEFENDING) useHeight1 = true; else moreStatusChecks2 = true;
80083084: 30621000 andi r2,r3,0x1000
                                                    #           }
                                                    #           if (useHeight1) {
80083088: 92240006 lbu r4,0x0006(r17)
8008308c: 0c0206bc jal 0x80081af0                   #               height = Get Spritesheet Graphic Height (miscUnit.spritesheetID);
80083090: 34100008 ori r16,r0,0x0008                #               value = 8                     <-- value if unit sprite is flying (idle fly haste (for monsters))
80083094: 1440003d bne r2,r0,0x8008318c             #               if (height == 0)              // if unit is not flying
80083098: 00000000 nop
8008309c: 08020c63 j 0x8008318c
800830a0: 34100005 ori r16,r0,0x0005                #                   value = 5
                                                    #           }
                                                    #           if (moreStatusChecks2) {
800830a4: 10400008 beq r2,r0,0x800830c8             #               if (miscUnit.statusFlagsWord1 & STATUS_MISC_HASTE) useHeight2 = true; else moreStatusChecks3 = true;
800830a8: 30622000 andi r2,r3,0x2000
                                                    #           }
                                                    #           if (useHeight2) {
800830ac: 92240006 lbu r4,0x0006(r17)
800830b0: 0c0206bc jal 0x80081af0                   #               height = Get Spritesheet Graphic Height (miscUnit.spritesheetID);
800830b4: 34100007 ori r16,r0,0x0007                #               value = 7                     <-- value if unit sprite is flying (idle fly (for monsters))
800830b8: 14400034 bne r2,r0,0x8008318c             #               if (height == 0)               // if unit is not flying
800830bc: 00000000 nop
800830c0: 08020c63 j 0x8008318c
800830c4: 34100004 ori r16,r0,0x0004                #                   value = 4
                                                    #           }
                                                    #           if (moreStatusChecks3) {
800830c8: 10400003 beq r2,r0,0x800830d8             #               if (miscUnit.statusFlagsWord1 & STATUS_MISC_HASTE) {
800830cc: 00000000 nop
800830d0: 08020c63 j 0x8008318c
800830d4: 34100002 ori r16,r0,0x0002                #                   value = 2
                                                    #               } else {
800830d8: 8e220140 lw r2,0x0140(r17)                #                   miscUnit.statusFlagsWord1
800830dc: 00000000 nop
800830e0: 30420001 andi r2,r2,0x0001                #                   miscUnit.statusFlagsWord1 & STATUS_MISC_BLANK
800830e4: 14400029 bne r2,r0,0x8008318c             #                   if (miscUnit.statusFlagsWord1 & STATUS_MISC_BLANK) value = 33; else useHeight3 = true;
800830e8: 34100021 ori r16,r0,0x0021
                                                    #               }
                                                    #           }
                                                    #           if (useHeight3) {
800830ec: 92240006 lbu r4,0x0006(r17)
800830f0: 0c0206bc jal 0x80081af0                   #               height = Get Spritesheet Graphic Height (miscUnit.spritesheetID);
800830f4: 34100006 ori r16,r0,0x0006
800830f8: 14400024 bne r2,r0,0x8008318c             #               if (height != 0) value = 6; else value = 3;
800830fc: 00000000 nop
80083100: 08020c63 j 0x8008318c
80083104: 34100003 ori r16,r0,0x0003
                                                    #           }
                                                    #       }
                                                    #   } else { 
80083108: 8e230144 lw r3,0x0144(r17)                #       miscUnit.statusFlagsWord2                           // if unit sprite is flagged flying, or is submerged/crystalised
8008310c: 00000000 nop
80083110: 3062000f andi r2,r3,0x000f
80083114: 10400007 beq r2,r0,0x80083134             #       if (miscUnit.statusFlagsWord2 & 0x0f) {         // Charm, Silence, Death Sentence, Darkness
80083118: 30620001 andi r2,r3,0x0001
8008311c: 1440001a bne r2,r0,0x80083188             #           if (miscUnit.statusFlagsWord2 & STATUS_MISC_CHARM) value = 9;
80083120: 30620008 andi r2,r3,0x0008
80083124: 10400019 beq r2,r0,0x8008318c             #           else if (miscUnit.statusFlagsWord2 & STATUS_MISC_TREASURE)
80083128: 00000000 nop
8008312c: 08020c63 j 0x8008318c
80083130: 34100015 ori r16,r0,0x0015                #               value = 21;
                                                    #       } else {
80083134: 8e230140 lw r3,0x0140(r17)                #           miscUnit.statusFlagsWord1
80083138: 00000000 nop
8008313c: 30623fff andi r2,r3,0x3fff                #           miscUnit.statusFlagsWord1 & 0x03ff           // (Masks off Reflect and Undead)
80083140: 10400011 beq r2,r0,0x80083188             #           if ((miscUnit.statusFlagsWord1 & 0x03ff) == 0) value = 9;
80083144: 30620004 andi r2,r3,0x0004
80083148: 10400003 beq r2,r0,0x80083158             #           else if (miscUnit.statusFlagsWord1 & STATUS_MISC_DEAD)
8008314c: 30620002 andi r2,r3,0x0002
80083150: 08020c63 j 0x8008318c
80083154: 3410001a ori r16,r0,0x001a                #               value = 26;
80083158: 10400003 beq r2,r0,0x80083168             #           else if (miscUnit.statusFlagsWord1 & STATUS_MISC_MOUNT)
8008315c: 30621000 andi r2,r3,0x1000
80083160: 08020c63 j 0x8008318c
80083164: 34100032 ori r16,r0,0x0032                #               value = 50;
80083168: 10400003 beq r2,r0,0x80083178             #           else if (miscUnit.statusFlagsWord1 & STATUS_MISC_HASTE)
8008316c: 30620800 andi r2,r3,0x0800
80083170: 08020c63 j 0x8008318c
80083174: 3410000a ori r16,r0,0x000a                #               value = 10;
80083178: 10400004 beq r2,r0,0x8008318c             #           else if (miscUnit.statusFlagsWord1 & STATUS_MISC_SLOW)
8008317c: 34100009 ori r16,r0,0x0009
80083180: 08020c63 j 0x8008318c
80083184: 3410000b ori r16,r0,0x000b                #               value = 11;
80083188: 34100009 ori r16,r0,0x0009                #           else value = 9;            // covers hasted flying monster case (idle fly haste)
                                                    #       }
                                                    #   }
8008318c: 12000004 beq r16,r0,0x800831a0            #   if (value != 0) {
80083190: 02002021 addu r4,r16,r0
80083194: 86250070 lh r5,0x0070(r17)
80083198: 0c02065e jal 0x80081978                   #       Store unit animation and facing value (value, miscUnit.currentFacing, miscUnit);
8008319c: 02203021 addu r6,r17,r0
                                                    #   }
800831a0: 8fbf0018 lw r31,0x0018(r29)
800831a4: 8fb10014 lw r17,0x0014(r29)
800831a8: 8fb00010 lw r16,0x0010(r29)
800831ac: 27bd0020 addiu r29,r29,0x0020
800831b0: 03e00008 jr r31
800831b4: 00000000 nop