Check Battle Outcome

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: CHECK BATTLE OUTCOME
#       No parameters.
#       Returns:
#           r2 = {
#               0 ,  On player victory 
#               -1,  On player defeat
#               1 ,  If no outcome has been reached
#           }

80183374: 27bdffd0 addiu r29,r29,-0x0030
80183378: afb3001c sw r19,0x001c(r29)
8018337c: 00009821 addu r19,r0,r0                   #   playerUnitCount = 0
80183380: afb40020 sw r20,0x0020(r29)
80183384: 0000a021 addu r20,r0,r0                   #   enemyUnitCount = 0
80183388: afb20018 sw r18,0x0018(r29)
8018338c: 00009021 addu r18,r0,r0                   #   index = 0
80183390: afb50024 sw r21,0x0024(r29)
80183394: 0000a821 addu r21,r0,r0                   
80183398: afbf0028 sw r31,0x0028(r29)
8018339c: afb10014 sw r17,0x0014(r29)
801833a0: afb00010 sw r16,0x0010(r29)
                                                    #   do {
801833a4: 3c028019 lui r2,0x8019
801833a8: 244208cc addiu r2,r2,0x08cc               #       units
801833ac: 02a28821 addu r17,r21,r2                  #       units[index]
801833b0: 922201ba lbu r2,0x01ba(r17)               #       units[index].ModifiedENTDFlags
801833b4: 34030003 ori r3,r0,0x0003
801833b8: 30420003 andi r2,r2,0x0003
801833bc: 14430014 bne r2,r3,0x80183410             #       if (((units[index].ModifiedENTDFlags & 0x03) == 0x03)   // Unit is essential?
801833c0: 340200ff ori r2,r0,0x00ff
801833c4: 92230183 lbu r3,0x0183(r17)               
801833c8: 00000000 nop
801833cc: 10620010 beq r3,r2,0x80183410             #           && (units[index].0x183 != 0xff)
801833d0: 38620080 xori r2,r3,0x0080
801833d4: 2c500001 sltiu r16,r2,0x0001
801833d8: 02202021 addu r4,r17,r0
801833dc: 0c01786c jal 0x8005e1b0                   
801833e0: 34050001 ori r5,r0,0x0001
801833e4: 02028021 addu r16,r16,r2
801833e8: 12000009 beq r16,r0,0x80183410            #           && ((Does Unit Have Status In Set (units[index], 1)) || (units[index].0x183 == 0x80)))  // Checking Crystal, Invite, Treasure
801833ec: 00000000 nop                              #       {
801833f0: 922201ba lbu r2,0x01ba(r17)               
801833f4: 00000000 nop
801833f8: 30420030 andi r2,r2,0x0030
801833fc: 10400003 beq r2,r0,0x8018340c             #           if ((units[index].ModifiedENTDFlags & 0x30) != 0) {     //  Not on Player Team
80183400: 00000000 nop
80183404: 08060d04 j 0x80183410
80183408: 26940001 addiu r20,r20,0x0001             #               enemyUnitCount++;
                                                    #           } else {
8018340c: 26730001 addiu r19,r19,0x0001             #               playerUnitCount++;
                                                    #           }
                                                    #       }
80183410: 26520001 addiu r18,r18,0x0001             #       index++
80183414: 2a420015 slti r2,r18,0x0015
80183418: 1440ffe2 bne r2,r0,0x801833a4
8018341c: 26b501c0 addiu r21,r21,0x01c0
                                                    #   } while (index < 21);
80183420: 1660001b bne r19,r0,0x80183490            #   if (playerUnitCount != 0) return -1;        // Player defeat (if at least one essential player unit is gone)
80183424: 00000000 nop
80183428: 1680001a bne r20,r0,0x80183494            #   if (enemyUnitCount != 0) return 0;          // Player victory (if at least one essential enemy unit is gone)
8018342c: 00001021 addu r2,r0,r0
80183430: 00009021 addu r18,r0,r0                   #   index = 0
80183434: 3c118019 lui r17,0x8019
80183438: 263108cc addiu r17,r17,0x08cc             #   units[index]
                                                    #   do {
8018343c: 92230001 lbu r3,0x0001(r17)               #       units[index].UnitID
80183440: 340200ff ori r2,r0,0x00ff
80183444: 1062000c beq r3,r2,0x80183478             #       if ((units[index].UnitID != 0xff)
80183448: 02202021 addu r4,r17,r0
8018344c: 922201ba lbu r2,0x01ba(r17)
80183450: 00002821 addu r5,r0,r0
80183454: 0c01786c jal 0x8005e1b0
80183458: 30500030 andi r16,r2,0x0030
8018345c: 14400006 bne r2,r0,0x80183478             #           && (!Does Unit Have Status In Set (units[index], 0)))       //  Checking (not) Crystal, Dead, Petrify, Invite, Blood Suck, Treasure
80183460: 00000000 nop                              #       {
80183464: 12000003 beq r16,r0,0x80183474            #           if ((units[index].ModifiedENTDFlags & 0x30) != 0) {             //  Not on Player Team
80183468: 00000000 nop
8018346c: 08060d1e j 0x80183478
80183470: 26940001 addiu r20,r20,0x0001             #               enemyUnitCount++
                                                    #           } else {
80183474: 26730001 addiu r19,r19,0x0001             #               playerUnitCount++
                                                    #           }
                                                    #       }
80183478: 26520001 addiu r18,r18,0x0001             #       index++;
8018347c: 2a420015 slti r2,r18,0x0015
80183480: 1440ffee bne r2,r0,0x8018343c
80183484: 263101c0 addiu r17,r17,0x01c0
                                                    #   } while (index < 21);
80183488: 16600002 bne r19,r0,0x80183494            #   if (playerUnitCount != 0) return ((enemyUnitCount != 0) ? 1 : 0);       // No outcome if enemies remain; player victory if no enemies remain
8018348c: 0014102b sltu r2,r0,r20
80183490: 2402ffff addiu r2,r0,-0x0001              #   return -1;      // Player defeat (all player units defeated)
80183494: 8fbf0028 lw r31,0x0028(r29)
80183498: 8fb50024 lw r21,0x0024(r29)
8018349c: 8fb40020 lw r20,0x0020(r29)
801834a0: 8fb3001c lw r19,0x001c(r29)
801834a4: 8fb20018 lw r18,0x0018(r29)
801834a8: 8fb10014 lw r17,0x0014(r29)
801834ac: 8fb00010 lw r16,0x0010(r29)
801834b0: 27bd0030 addiu r29,r29,0x0030
801834b4: 03e00008 jr r31
801834b8: 00000000 nop