Generate Treasure

From Final Fantasy Hacktics Wiki
Revision as of 16:40, 11 October 2019 by Raijinili (talk | contribs) (More notes on section 3)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
# ROUTINE : GENERATE TREASURE FOR TREASURE CHEST
#
#    PARAMETERS:
#        r4  =   [Treasure unit]
#        
#    RETURNS:
#        r2  =   [Item]
# SECTION 1 : SET UP
00180a08: 3c028019 lui r2,0x8019
00180a0c: 8c42f5fc lw r2,-0x0a04(r2)                #   r2 = MEM[0x18f5fc]
00180a10: 27bdffe0 addiu r29,r29,0xffe0
00180a14: afbf001c sw r31,0x001c(r29)               #   IF (r2 != 0)
00180a18: 14400033 bne r2,r0,0x00180ae8             #       RETURN r2
00180a1c: afb00018 sw r16,0x0018(r29)
00180a20: 00008021 addu r16,r0,r0                   #   r16 = 0 [Count of valid items]
00180a24: 00003021 addu r6,r0,r0                    #   r6 = 0  [Current equipment slot index]
00180a28: 27a50010 addiu r5,r29,0x0010              #   r5 =    [Valid item array pointer]  
# SECTION 2 : FIND VALID ITEMS ON TREASURE UNIT (EQUIPMENT) 
                                                    #   DO {
00180a2c: 00861021 addu r2,r4,r6                    #       
00180a30: 9042001a lbu r2,0x001a(r2)                #       r2 = MEM[r4+r6+0x1a) [Equip] (Equipment in current slot of treasure unit)
00180a34: 00000000 nop
00180a38: a0a20000 sb r2,0x0000(r5)                 #       ValidItems[i] (MEM[r5]) = [Equip]
00180a3c: 90a30000 lbu r3,0x0000(r5)
00180a40: 00000000 nop                              #       r6++ (LoopCount++)
00180a44: 2c6200fe sltiu r2,r3,0x00fe               #       IF ([Equip] >= 0xFE) (empty)
00180a48: 10400005 beq r2,r0,0x00180a60             #           CONTINUE (skip this item)
00180a4c: 24c60001 addiu r6,r6,0x0001
00180a50: 10600004 beq r3,r0,0x00180a64             #       IF ([Equip] == 0x00)
00180a54: 28c20007 slti r2,r6,0x0007                #           CONTINUE (skip this item)
00180a58: 24a50001 addiu r5,r5,0x0001               #       r5++ 
00180a5c: 26100001 addiu r16,r16,0x0001             #       r16++ (ValidItemCount++)
00180a60: 28c20007 slti r2,r6,0x0007
00180a64: 1440fff1 bne r2,r0,0x00180a2c             #   } WHILE (r6 < 7)
00180a68: 00000000 nop 
# SECTION 3 : NO VALID ITEMS : FIND USABLE CHEMIST ITEM (EXCEPT ELIXIR)
00180a6c: 16000014 bne r16,r0,0x00180ac0            #   IF ([Valid item count] = 0)
00180a70: 00000000 nop                              #   {   
00180a74: 0c0088c3 jal 0x0002230c                   #       r2 = [Random number]
00180a78: 00000000 nop
00180a7c: 00021840 sll r3,r2,0x01                   #       r2 = [Random number] * 13
00180a80: 00621821 addu r3,r3,r2
00180a84: 00031880 sll r3,r3,0x02
00180a88: 00621021 addu r2,r3,r2                    
00180a8c: 04410002 bgez r2,0x00180a98               #       [Unnecessary negative check?]
00180a90: 00000000 nop                              
00180a94: 24427fff addiu r2,r2,0x7fff               
00180a98: 000213c3 sra r2,r2,0x0f                   #       r2 = roll(00,0D) #not including 0D
00180a9c: 2442fff0 addiu r2,r2,0xfff0               #       r2 = roll(F0,FD) #random Item except Phoenix Down.
00180aa0: a3a20010 sb r2,0x0010(r29)                #       ValidItems[0] (STACK[0x10]) = r2
00180aa4: 93a30010 lbu r3,0x0010(r29)               #       r3 = r2
00180aa8: 00000000 nop                              #       ValidItemCount (r16) = 1
00180aac: 2c6200f5 sltiu r2,r3,0x00f5               #       IF (r3 >= 0xf5) #F5 is Elixir
00180ab0: 14400003 bne r2,r0,0x00180ac0             #       {   # Shift up by 1 to skip Elixir.
00180ab4: 34100001 ori r16,r0,0x0001                #           r2 = r3 + 1 #Elixir-Remedy -> Antidote-Phoenix
00180ab8: 24620001 addiu r2,r3,0x0001               #           ValidItems[0] = r2
00180abc: a3a20010 sb r2,0x0010(r29)                #       }
# SECTION 4 : RETURN RANDOM ITEM FROM VALID ITEMS LIST
00180ac0: 0c0088c3 jal 0x0002230c                   #   r2 = [Random number]
00180ac4: 00000000 nop
00180ac8: 00500018 mult r2,r16
00180acc: 00001012 mflo r2                          #   r2 = [Random index]
00180ad0: 04410003 bgez r2,0x00180ae0
00180ad4: 000233c3 sra r6,r2,0x0f
00180ad8: 24427fff addiu r2,r2,0x7fff
00180adc: 000233c3 sra r6,r2,0x0f
00180ae0: 03a61021 addu r2,r29,r6                   
00180ae4: 90420010 lbu r2,0x0010(r2)                #   r2 = ValidItems[RandomIndex]
00180ae8: 8fbf001c lw r31,0x001c(r29)
00180aec: 8fb00018 lw r16,0x0018(r29)
00180af0: 27bd0020 addiu r29,r29,0x0020
00180af4: 03e00008 jr r31                           #   RETURN r2
00180af8: 00000000 nop


Return Locations

001805d8: Generate Crystal or Treasure