Calculate Unit Jobs and Skillsets from ENTD

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: Calculate Unit Jobs and Skillsets from ENTD
#       Calculates a generated unit's jobs and skillsets from the ENTD.
#       Parameters:
#           r4 = (unit)         Unit in-battle data pointer
#           r5 = (ENTDUnit)     ENTD unit pointer

8005b2b4: 27bdffe0 addiu r29,r29,-0x0020
8005b2b8: afb00010 sw r16,0x0010(r29)
8005b2bc: 00808021 addu r16,r4,r0                   #   unit
8005b2c0: afb10014 sw r17,0x0014(r29)
8005b2c4: 00a08821 addu r17,r5,r0                   #   ENTDUnit
8005b2c8: 260400d2 addiu r4,r16,0x00d2
8005b2cc: afbf0018 sw r31,0x0018(r29)
8005b2d0: 0c017991 jal 0x8005e644                   #   Data Nullifying (&unit.JobLevels1, 10);             // Clear Job Levels
8005b2d4: 3405000a ori r5,r0,0x000a
8005b2d8: 1620000b bne r17,r0,0x8005b308            
8005b2dc: 00002821 addu r5,r0,r0                    #   jobsUnlocked = 0
                                                    #   if (ENTDUnit == null) {
8005b2e0: 0c016d77 jal 0x8005b5dc                   #       Transfer Job's Data to Unit's Data (unit);
8005b2e4: 02002021 addu r4,r16,r0
8005b2e8: 26040096 addiu r4,r16,0x0096
8005b2ec: 00002821 addu r5,r0,r0
8005b2f0: 34020020 ori r2,r0,0x0020                 #       FLAG_MONSTER
8005b2f4: a2000013 sb r0,0x0013(r16)                #       unit.SecondarySkillset = 0
8005b2f8: 0c0177b6 jal 0x8005ded8                   #       Store 3-Byte Data (&unit.JobsUnlocked1, 0);     // Clear Unlocked Jobs
8005b2fc: a2020006 sb r2,0x0006(r16)                #       unit.Flags = FLAG_MONSTER
8005b300: 08016d3a j 0x8005b4e8                     #       return;
8005b304: 00000000 nop                              #   }
8005b308: 922a0001 lbu r10,0x0001(r17)              #   ENTDUnit.Flags
8005b30c: 00000000 nop
8005b310: 31420020 andi r2,r10,0x0020               #   ENTDUnit.Flags & FLAG_MONSTER
8005b314: 14400042 bne r2,r0,0x8005b420             #   if ((ENTDUnit.Flags & FLAG_MONSTER) == 0) {
8005b318: 00000000 nop
8005b31c: 92260008 lbu r6,0x0008(r17)               #       ENTDUnit.JobUnlocked
8005b320: 00000000 nop
8005b324: 30c700ff andi r7,r6,0x00ff                #       ENTDUnit.JobUnlocked
8005b328: 2ce20014 sltiu r2,r7,0x0014
8005b32c: 1040003c beq r2,r0,0x8005b420             #       if (ENTDUnit.JobUnlocked < 20) {
8005b330: 00000000 nop
8005b334: 92220009 lbu r2,0x0009(r17)               #           ENTDUnit.JobLevel
8005b338: 00000000 nop
8005b33c: 3043000f andi r3,r2,0x000f                #           jobLevel = ENTDUnit.JobLevel & 0x0f     // Caps at 15
8005b340: 30c20001 andi r2,r6,0x0001                #           ENTDUnit.JobUnlocked & 0x01             // (Same as ENTDUnit.JobUnlocked % 2)
8005b344: 14400002 bne r2,r0,0x8005b350
8005b348: 00602021 addu r4,r3,r0                    #           jobLevelStoreValue = jobLevel
                                                    #           if ((ENTDUnit.JobUnlocked & 0x01) == 0) {
8005b34c: 00032100 sll r4,r3,0x04                   #               jobLevelStoreValue = jobLevel << 4
                                                    #           }
8005b350: 00071042 srl r2,r7,0x01                   #           ENTDUnit.JobUnlocked / 2
8005b354: 02021021 addu r2,r16,r2                   #           unit + (ENTDUnit.JobUnlocked / 2)
8005b358: a04400d2 sb r4,0x00d2(r2)                 #           *(&unit.JobLevels1 + (ENTDUnit.JobUnlocked / 2)) = jobLevelStoreValue
8005b35c: 00003021 addu r6,r0,r0                    #           index = 0
8005b360: 00e04821 addu r9,r7,r0                    #           ENTDUnit.JobUnlocked
8005b364: 3c038006 lui r3,0x8006
8005b368: 246360ba addiu r3,r3,0x60ba               #           jobUnlockRequirements
8005b36c: 00091080 sll r2,r9,0x02                   #           ENTDUnit.JobUnlocked * 4
8005b370: 00491021 addu r2,r2,r9                    #           ENTDUnit.JobUnlocked * 5
8005b374: 00021040 sll r2,r2,0x01                   #           ENTDUnit.JobUnlocked * 10
8005b378: 00434021 addu r8,r2,r3                    #           jobUnlockRequirementsPtr = jobUnlockRequirements + (ENTDUnit.JobUnlocked * 10)
                                                    #           do {
8005b37c: 11200004 beq r9,r0,0x8005b390             #               
8005b380: 02063821 addu r7,r16,r6                   #               unit + index
                                                    #               if (ENTDUnit.JobUnlocked != 0) {
8005b384: 91040000 lbu r4,0x0000(r8)                #                   jobUnlockLevel = *jobUnlockRequirementsPtr
8005b388: 08016ce8 j 0x8005b3a0
8005b38c: 00000000 nop                              #               } else {
8005b390: 10c00002 beq r6,r0,0x8005b39c             
8005b394: 34040001 ori r4,r0,0x0001                 #                   jobUnlockLevel = 1
                                                    #                   if (index != 0) {
8005b398: 34040011 ori r4,r0,0x0011                 #                       jobUnlockLevel = 0x11
                                                    #                   }
8005b39c: 02063821 addu r7,r16,r6
                                                    #               }
8005b3a0: 90e200d2 lbu r2,0x00d2(r7)                #               jobLevelValue = *(&unit.JobLevels1 + index)
8005b3a4: 00000000 nop
8005b3a8: 00821825 or r3,r4,r2                      #               combinedJobLevelValue = jobLevelValue | jobUnlockLevel
8005b3ac: 3062000f andi r2,r3,0x000f                #               combinedJobLevelValue & 0x0f
8005b3b0: 14400002 bne r2,r0,0x8005b3bc
8005b3b4: 00602021 addu r4,r3,r0                    #               newJobLevelValue = combinedJobLevelValue
                                                    #               if ((combinedJobLevelValue & 0x0f) == 0) {
8005b3b8: 34640001 ori r4,r3,0x0001                 #                   newJobLevelValue = combinedJobLevelValue | 1
                                                    #               }
8005b3bc: 308200f0 andi r2,r4,0x00f0                #               newJobLevelValue & 0xf0
8005b3c0: 14400002 bne r2,r0,0x8005b3cc
8005b3c4: 25080001 addiu r8,r8,0x0001               #               jobUnlockRequirementsPtr = jobUnlockRequirementsPtr + 1
                                                    #               if ((newJobLevelValue & 0xf0) == 0) {
8005b3c8: 34840010 ori r4,r4,0x0010                 #                   newJobLevelValue = newJobLevelValue | 0x10
                                                    #               }
8005b3cc: 24c60001 addiu r6,r6,0x0001               #               index = index + 1
8005b3d0: 28c2000a slti r2,r6,0x000a
8005b3d4: 1440ffe9 bne r2,r0,0x8005b37c
8005b3d8: a0e400d2 sb r4,0x00d2(r7)                 #               *(&unit.JobLevels1 + index) = newJobLevelValue
                                                    #           } while (index < 10);
8005b3dc: 31420040 andi r2,r10,0x0040                          
8005b3e0: 10400006 beq r2,r0,0x8005b3fc
8005b3e4: 31420080 andi r2,r10,0x0080               
                                                    #           if (ENTDUnit.Flags & FLAG_FEMALE) {
8005b3e8: 920200da lbu r2,0x00da(r16)               #               unit.CalcBardJobLevel
8005b3ec: 00000000 nop
8005b3f0: 304200f0 andi r2,r2,0x00f0                #               unit.CalcBardJobLevel & 0xf0        // Set Bard job level = 0  
8005b3f4: a20200da sb r2,0x00da(r16)                #               unit.CalcBardJobLevel = unit.CalcBardJobLevel & 0xf0    
8005b3f8: 31420080 andi r2,r10,0x0080
                                                    #           }
8005b3fc: 10400005 beq r2,r0,0x8005b414
8005b400: 260400d2 addiu r4,r16,0x00d2              #           &unit.JobLevels1
                                                    #           if (ENTDUnit.Flags & FLAG_MALE) {
8005b404: 920200db lbu r2,0x00db(r16)               #               unit.DancerMimeJobLevel
8005b408: 00000000 nop
8005b40c: 3042000f andi r2,r2,0x000f                #               unit.DancerMimeJobLevel & 0x0f               // Set Dancer job level = 0
8005b410: a20200db sb r2,0x00db(r16)                #               unit.DancerMimeJobLevel = unit.DancerMimeJobLevel & 0x0f
                                                    #           }
8005b414: 0c017705 jal 0x8005dc14                   #           jobsUnlocked = Calculate Unlocked Jobs (&unit.jobLevels1, ENTDUnit.Flags);
8005b418: 01402821 addu r5,r10,r0
8005b41c: 00402821 addu r5,r2,r0                    #           jobsUnlocked
                                                    #       }
                                                    #   }
8005b420: 0c0177b6 jal 0x8005ded8                   #   Store 3-Byte Data (&unit.JobsUnlocked1, jobsUnlocked);
8005b424: 26040096 addiu r4,r16,0x0096
8005b428: 9222000a lbu r2,0x000a(r17)               #   ENTDUnit.JobID
8005b42c: 02002021 addu r4,r16,r0                   
8005b430: 0c016d77 jal 0x8005b5dc                   #   Transfer Job's Data to Unit's Data (unit);
8005b434: a2020003 sb r2,0x0003(r16)                #   unit.JobID = ENTDUnit.JobID
8005b438: 9226001d lbu r6,0x001d(r17)               #   ENTDUnit.PrimarySkillset
8005b43c: 340200ff ori r2,r0,0x00ff
8005b440: 30c300ff andi r3,r6,0x00ff                #   ENTDUnit.PrimarySkillset
8005b444: 10620005 beq r3,r2,0x8005b45c             #   if ((ENTDUnit.PrimarySkillset != 0xff)
8005b448: 00000000 nop
8005b44c: 10600003 beq r3,r0,0x8005b45c             #       and (ENTDUnit.PrimarySkillset != 0))
                                                    #   {
8005b450: 340200ff ori r2,r0,0x00ff
8005b454: a2060012 sb r6,0x0012(r16)                #       unit.PrimarySkillset = ENTDUnit.PrimarySkillset
8005b458: a2020189 sb r2,0x0189(r16)                #       unit.0x189 = 0xff
                                                    #   }
8005b45c: 9226000b lbu r6,0x000b(r17)               #   ENTDUnit.SecondarySkillset
8005b460: 340200fe ori r2,r0,0x00fe
8005b464: 30c300ff andi r3,r6,0x00ff                #   ENTDUnit.SecondarySkillset
8005b468: 1462001e bne r3,r2,0x8005b4e4             #   if (ENTDUnit.SecondarySkillset == 0xfe) {
8005b46c: 00000000 nop
8005b470: 92020006 lbu r2,0x0006(r16)               #       unit.Flags
8005b474: 00000000 nop
8005b478: 30420020 andi r2,r2,0x0020                
8005b47c: 10400003 beq r2,r0,0x8005b48c             #       if (unit.Flags & FLAG_MONSTER) {
8005b480: 00000000 nop
8005b484: 08016d3a j 0x8005b4e8
8005b488: a2000013 sb r0,0x0013(r16)                #           unit.SecondarySkillset = 0
                                                    #           return;
                                                    #       }
8005b48c: 0c016d40 jal 0x8005b500                   #       jobID = Get Random Unlocked Job (unit);
8005b490: 02002021 addu r4,r16,r0
8005b494: 00402021 addu r4,r2,r0                    #       jobID
8005b498: 308300ff andi r3,r4,0x00ff                #       jobID
8005b49c: 10600009 beq r3,r0,0x8005b4c4
8005b4a0: 00031040 sll r2,r3,0x01                   #       jobID * 2
                                                    #       if (jobID != 0) {
8005b4a4: 00431021 addu r2,r2,r3                    #           jobID * 3
8005b4a8: 3c038006 lui r3,0x8006
8005b4ac: 8c636194 lw r3,0x6194(r3)                 #           baseJobDataPtr (*0x80066194 (= 0x800610b8))
8005b4b0: 00021100 sll r2,r2,0x04                   #           jobID * 48
8005b4b4: 00431021 addu r2,r2,r3                    #           job = baseJobDataPtr + (jobID * 48)
8005b4b8: 90430000 lbu r3,0x0000(r2)                #           skillset = job.Skillset
8005b4bc: 08016d32 j 0x8005b4c8
8005b4c0: 00000000 nop                              #       } else {
8005b4c4: 308300ff andi r3,r4,0x00ff                #           skillset = jobID    // skillset = 0 because jobID == 0
                                                    #       }
8005b4c8: 92020012 lbu r2,0x0012(r16)               #       unit.PrimarySkillset
8005b4cc: 00000000 nop
8005b4d0: 14620002 bne r3,r2,0x8005b4dc             #       if (unit.PrimarySkillset == skillset) {
8005b4d4: 00000000 nop
8005b4d8: 00001821 addu r3,r0,r0                    #           skillset = 0
                                                    #       }
8005b4dc: 08016d3a j 0x8005b4e8
8005b4e0: a2030013 sb r3,0x0013(r16)                #       unit.SecondarySkillset = skillset
                                                    #   } else {
8005b4e4: a2060013 sb r6,0x0013(r16)                #       unit.SecondarySkillset = ENTDUnit.SecondarySkillset
                                                    #   }
8005b4e8: 8fbf0018 lw r31,0x0018(r29)
8005b4ec: 8fb10014 lw r17,0x0014(r29)
8005b4f0: 8fb00010 lw r16,0x0010(r29)
8005b4f4: 27bd0020 addiu r29,r29,0x0020
8005b4f8: 03e00008 jr r31
8005b4fc: 00000000 nop