Get Random Unlocked Job

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
#   ROUTINE: GET RANDOM UNLOCKED JOB
#       Gets a random unlocked job ID for this unit.
#       Parameters:
#           r4 = (unit) Unit in-battle data pointer
#       Returns:
#           r2 = JobID corresponding to random unlocked job for this unit, or 0 if no jobs are unlocked

8005b500: 27bdffd0 addiu r29,r29,-0x0030
8005b504: 00804021 addu r8,r4,r0                    #   unit
8005b508: 3c060080 lui r6,0x0080                    #   jobMask = 0x800000
8005b50c: afb00028 sw r16,0x0028(r29)
8005b510: 00008021 addu r16,r0,r0                   #   numJobs = 0
8005b514: 00002821 addu r5,r0,r0                    #   jobIndex = 0
8005b518: 27a70010 addiu r7,r29,0x0010              #   jobArrayPtr = &jobArray[0]
8005b51c: afbf002c sw r31,0x002c(r29)
8005b520: 91020096 lbu r2,0x0096(r8)                #   unit.UnlockedJobs1
8005b524: 91030097 lbu r3,0x0097(r8)                #   unit.UnlockedJobs2
8005b528: 91040098 lbu r4,0x0098(r8)                #   unit.UnlockedJobs3
8005b52c: 00021400 sll r2,r2,0x10                   #   unit.UnlockedJobs1 << 16
8005b530: 00031a00 sll r3,r3,0x08                   #   unit.UnlockedJobs2 << 8
8005b534: 00431021 addu r2,r2,r3                    #   (unit.UnlockedJobs1 << 16) + (unit.UnlockedJobs2 << 8)
8005b538: 00442021 addu r4,r2,r4                    #   unlockedJobs = (unit.UnlockedJobs1 << 16) + (unit.UnlockedJobs2 << 8) + unit.UnlockedJobs3
                                                    #   do {
8005b53c: 00861024 and r2,r4,r6                     #       unlockedJobs & jobMask            
8005b540: 1040000d beq r2,r0,0x8005b578             #       if (unlockedJobs & jobMask) {
8005b544: 00000000 nop
8005b548: 14a00008 bne r5,r0,0x8005b56c
8005b54c: 24a3004a addiu r3,r5,0x004a               #           jobID = jobIndex + 0x4a     // 0x4A Squire
                                                    #           if (jobIndex == 0) {
8005b550: 91030000 lbu r3,0x0000(r8)                #               unit.BaseClass
8005b554: 00000000 nop
8005b558: 306200ff andi r2,r3,0x00ff
8005b55c: 2c420080 sltiu r2,r2,0x0080
8005b560: 14400002 bne r2,r0,0x8005b56c             #               if (unit.BaseClass >= 0x80) {
8005b564: 00000000 nop
8005b568: 3403004a ori r3,r0,0x004a                 #                   jobID = 0x4A        // 0x4A Squire
                                                    #               }
                                                    #           }
8005b56c: a0e30000 sb r3,0x0000(r7)                 #           *jobArrayPtr = jobID
8005b570: 24e70001 addiu r7,r7,0x0001               #           jobArrayPtr = jobArrayPtr + 1
8005b574: 26100001 addiu r16,r16,0x0001             #           numJobs = numJobs + 1
                                                    #       }
8005b578: 24a50001 addiu r5,r5,0x0001               #       jobIndex = jobIndex + 1
8005b57c: 000617c2 srl r2,r6,0x1f
8005b580: 00c21021 addu r2,r6,r2
8005b584: 00023043 sra r6,r2,0x01                   #       jobMask = jobMask >> 1
8005b588: 28a20013 slti r2,r5,0x0013
8005b58c: 1440ffeb bne r2,r0,0x8005b53c
8005b590: 00000000 nop
                                                    #   } while (jobIndex < 20);
8005b594: 1200000c beq r16,r0,0x8005b5c8            #   if (numJobs == 0) return 0;
8005b598: 00001021 addu r2,r0,r0
8005b59c: 0c0088c3 jal 0x8002230c                   #   rngResult = rand()
8005b5a0: 00000000 nop
8005b5a4: 00500018 mult r2,r16                      
8005b5a8: 00001012 mflo r2                          #   rngResult * numJobs
8005b5ac: 04410003 bgez r2,0x8005b5bc
8005b5b0: 00021bc2 srl r3,r2,0x0f                   #   randomJobID = (rngResult * numJobs) >> 15
8005b5b4: 24427fff addiu r2,r2,0x7fff
8005b5b8: 00021bc2 srl r3,r2,0x0f
8005b5bc: 306200ff andi r2,r3,0x00ff
8005b5c0: 03a21021 addu r2,r29,r2                   #   &jobArray[randomJobID]
8005b5c4: 90420010 lbu r2,0x0010(r2)                #   return jobArray[randomJobID];
8005b5c8: 8fbf002c lw r31,0x002c(r29)
8005b5cc: 8fb00028 lw r16,0x0028(r29)
8005b5d0: 27bd0030 addiu r29,r29,0x0030
8005b5d4: 03e00008 jr r31
8005b5d8: 00000000 nop