Calculate Height Data

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search

Calculate Height Data

Parameters : r4 = previous routine stack pointer
             r5 = unit ID
Returns : r2 = previous routine stack pointer (r4)
          stack 0x00 = Unit X coordinates
          stack 0x01 = Unit Y coordinates
          stack 0x02 = Unit Elevation (0x00 or 0x01) +/- 0x80 (from ? on stack 0x12)
          stack 0x03 = Unit ID (0x80 if invalid Unit ID / crystal / treasure / dead)
                        + 0x20 flag if not a chocobo
                        + 0x40 flag if riding a unit (strickly two units at same coordinates)
          stack 0x04 = unit(s) height (check riding, frog, chicken) - 0x04 if frog-chicken, else 0x06 , + 0x02 if two units one same tile
          stack 0x05 = walking height (check float, depht + move on/in water) - Default : Tile Height (0x02) * 2 + Tile halves (0x03)
          stack 0x06 = total height (walking + unit)
--------------------------------------------------------------------------------------------------------------------------------------------------------
0017c158: 27bdffd8 addiu r29,r29,-0x0028    |
0017c15c: afb20020 sw r18,0x0020(r29)       |
0017c160: 00809021 addu r18,r4,r0           |r18 = Stack Pointer
0017c164: 00004021 addu r8,r0,r0            |r8 = 0 (serve as height mod)
0017c168: 000510c0 sll r2,r5,0x03           |r2 = Checked Unit ID * 8
0017c16c: 00451023 subu r2,r2,r5            |r2 = Checked Unit ID * 7
0017c170: 00021180 sll r2,r2,0x06           |r2 = Checked Unit ID * 448 (0x1c0)
0017c174: 3c048019 lui r4,0x8019            |
0017c178: 248408cc addiu r4,r4,0x08cc       |r4 = 0x801908cc (start of units data)
0017c17c: afb1001c sw r17,0x001c(r29)       |
0017c180: 00448821 addu r17,r2,r4           |r17 =  Checked Unit's Data Pointer 
0017c184: 2ca20015 sltiu r2,r5,0x0015       |r2 = 0x01 if  Checked unit ID < 0x15 (= valid)
0017c188: afbf0024 sw r31,0x0024(r29)       |
0017c18c: 10400076 beq r2,r0,0x0017c368     #If  Checked Unit ID is valid #Else branch near end (r2 = 0x80)
0017c190: afb00018 sw r16,0x0018(r29)            |
0017c194: 92230001 lbu r3,0x0001(r17)            |r3 = Checked Unit's ID
0017c198: 340200ff ori r2,r0,0x00ff              |r2 = 0x00ff
0017c19c: 10620073 beq r3,r2,0x0017c36c          #If  Checked Unit exists #Else branch near end (r2 = 0x80)
0017c1a0: 34020080 ori r2,r0,0x0080              |r2 = 0x80
0017c1a4: 96220058 lhu r2,0x0058(r17)                |r2 =  Checked Unit's Current Statuses 1&2
0017c1a8: 00000000 nop                               |
0017c1ac: 30420140 andi r2,r2,0x0140                 |r2 <> 0x00 if  Checked unit has crystal or treasure
0017c1b0: 1440006e bne r2,r0,0x0017c36c              #If  Checked Unit has neither crystal nor treasure #Else branch near end (r2 = 0x80)
0017c1b4: 34020080 ori r2,r0,0x0080                  |r2 = 0x80
0017c1b8: 92230003 lbu r3,0x0003(r17)                    |r3 =  Checked Unit's Job ID
0017c1bc: 00000000 nop                                   |
0017c1c0: 2462ffa2 addiu r2,r3,-0x005e                   |r2 =  Checked Unit Job ID - 0x5e
0017c1c4: 2c420003 sltiu r2,r2,0x0003                    |r2 = 0x01 if Job is chocobo (yellow, black and red)
0017c1c8: 14400002 bne r2,r0,0x0017c1d4                  #If  Checked Unit is not a chocobo #Branch if Job is a chocobo
0017c1cc: 00a08021 addu r16,r5,r0                        |r16 = Chocobo Checked Unit's ID
0017c1d0: 34b00020 ori r16,r5,0x0020                         |r16 =  Checked Unit ID with 0x20 Enabled (not chocobo)
0017c1d4: 00003821 addu r7,r0,r0                         |r7 = 0x00 (counter for next loop)
0017c1d8: 92220047 lbu r2,0x0047(r17)                    |r2 =  Checked Unit's X coordinate
0017c1dc: 00803021 addu r6,r4,r0                         |r6 = 0x801908cc
0017c1e0: 304900ff andi r9,r2,0x00ff                     |r9 = Checked Unit's X Coordinate (used in loop)
0017c1e4: a3a20010 sb r2,0x0010(r29)                     |Store  Checked unit X Coordinate on pointer
0017c1e8: 92240048 lbu r4,0x0048(r17)                    |r4 =  Checked Unit's Y Coordinate
0017c1ec: 93a20012 lbu r2,0x0012(r29)                    |Load ?
0017c1f0: 340a00ff ori r10,r0,0x00ff                     |r10 = 0x00ff
0017c1f4: a3a40011 sb r4,0x0011(r29)                     |Store Checked unit Y Coordinate on pointer
0017c1f8: 308400ff andi r4,r4,0x00ff                     |r4 =   Checked Unit's Y Coordinate
0017c1fc: 96230048 lhu r3,0x0048(r17)                    |r3 = Checked Unit's Y Coordinate + Elevation/facing byte
0017c200: 30420080 andi r2,r2,0x0080                     |? AND 0x80
0017c204: 00031bc2 srl r3,r3,0x0f                        |r3 = elevation bit (0x00 if not elevated, else 0x01)
0017c208: 00431025 or r2,r2,r3                           |r2 = 0x0, 0x01, 0x80, or 0x81
0017c20c: a3a20012 sb r2,0x0012(r29)                     |Store Higher Elevation + ? Flag on stack 0x012
                                                         LOOP through unit ID seeking a unit on same tile than Unit (from r5)
0017c210: 10e50017 beq r7,r5,0x0017c270                  @ LOOP #If Counter <>  Checked Unit ID /Else branch to next loop iteration 
0017c214: 00000000 nop                                           | 
0017c218: 90c20001 lbu r2,0x0001(r6)                             |r2 =Loop Unit's ID
0017c21c: 00000000 nop                                           |
0017c220: 104a0013 beq r2,r10,0x0017c270                         #If Loop unit exists /Else branch to next loop iteration
0017c224: 00000000 nop                                               |  
0017c228: 90c20047 lbu r2,0x0047(r6)                                 |r2 = Loop Unit's X Coordinate
0017c22c: 00000000 nop                                               |
0017c230: 1449000f bne r2,r9,0x0017c270                              #If Loop Unit  X coord  matches checked Unit X coord /Else branch to next loop iteration
0017c234: 00000000 nop                                                   |  
0017c238: 90c20048 lbu r2,0x0048(r6)                                     |r2 =Loop Unit's Y Coordinate
0017c23c: 00000000 nop                                                   |
0017c240: 1444000b bne r2,r4,0x0017c270                                  #If loop unit Y coord  matches checked unit Y coord /Else branch to next loop iteration
0017c244: 00000000 nop                                                       |  
0017c248: 94c20048 lhu r2,0x0048(r6)                                         |r2 = loop Unit's Y Coordinate + Elevation/facing Flags
0017c24c: 00000000 nop                                                       |
0017c250: 000213c2 srl r2,r2,0x0f                                            |r2 = elevation bit (0x00 if not elevated, else 0x01)
0017c254: 14430006 bne r2,r3,0x0017c270                                      #If loop Unit Elevation  matches checked Unit Elevation /Else branch to next loop iteration
0017c258: 32020020 andi r2,r16,0x0020                                            |r2 = 0x20 if checked Unit is not a chocobo
0017c25c: 10400002 beq r2,r0,0x0017c268                                          #If checked unit is not a chocobo
0017c260: 34080002 ori r8,r0,0x0002                                              |r8 = 0x02 (2 units on same tile)
0017c264: 00c08821 addu r17,r6,r0                                                    |r17 = Loop Unit Data Pointer - ridden unit ?
0017c268: 0805f0a0 j 0x0017c280                                                  >>Jump after loop
0017c26c: 36100040 ori r16,r16,0x0040                                            |r16 Unit ID with 0x40 Enabled (= same tile than Unit)
0017c270: 24e70001 addiu r7,r7,0x0001                        |r7 = loop counter + 1
0017c274: 28e20015 slti r2,r7,0x0015                         |r2 = 0x01 if r7 < 0x15
0017c278: 1440ffe5 bne r2,r0,0x0017c210                  Λ Loop while counter < 0x15
0017c27c: 24c601c0 addiu r6,r6,0x01c0                        |r6 = Unit Data Pointer += 0x1c0 (matching r7)
0017c280: a3b00013 sb r16,0x0013(r29)                    |Store updated checked Unit ID on stack 0x13
0017c284: 9230005a lbu r16,0x005a(r17)                   |r16 = Checked unit / Loop unit status set 3
0017c288: 00000000 nop                                       | 
0017c28c: 32020006 andi r2,r16,0x0006                    |r2 <> 0x00 if unit on ground has frog
0017c290: 14400002 bne r2,r0,0x0017c29c                  #If unit on ground don't have chiken nor frog /Else branch (unit height set to 0x04 +/- 0x02)
0017c294: 25020004 addiu r2,r8,0x0004                    |r2= 0x04 (or 0x06 if 2 units on same tile) 
0017c298: 25020006 addiu r2,r8,0x0006                        |r2 = 0x06 (or 0x08 if 2 units on same tile) - if unit don't have frog nor chicken
0017c29c: a3a20014 sb r2,0x0014(r29)                     |Store r2 (unit(s) height) on stack 0x14
0017c2a0: 92300095 lbu r16,0x0095(r17)                   |r16 = Unit's on ground Movement 3
0017c2a4: 0c060428 jal 0x001810a0                        |-->Map_Location_Calculation  returns r2 = Unit tile ID
0017c2a8: 02202021 addu r4,r17,r0                        |r4 = Unit on ground Data Pointer
0017c2ac: 000210c0 sll r2,r2,0x03                        |Unit on ground Tile ID * 8
0017c2b0: 3c038019 lui r3,0x8019                         |
0017c2b4: 2463f8cc addiu r3,r3,-0x0734                   |r3 = 0x8018f8cc (start of tiles data)
0017c2b8: 00431021 addu r2,r2,r3                         |r2 = Tile's Data Pointer
0017c2bc: 90440002 lbu r4,0x0002(r2)                     |r4 = Unit Tile's Height
0017c2c0: 90430003 lbu r3,0x0003(r2)                     |r3 = Unit Tile's Height/2 + Depth
0017c2c4: 90420003 lbu r2,0x0003(r2)                     |r2 = Unit's Tile's Height/2 + Depth
0017c2c8: 00042040 sll r4,r4,0x01                        |r4 = unit Tile's Height * 2
0017c2cc: 3063001f andi r3,r3,0x001f                     |r3 = unit tiles Height (halves)  slope ?
0017c2d0: 00832021 addu r4,r4,r3                         |r4 = unit Tiles Height * halves
0017c2d4: 00022942 srl r5,r2,0x05                        |r5 = unit tiles Depth
0017c2d8: 10a00014 beq r5,r0,0x0017c32c                  #If depht <> 0x00 / Branch if Depth = 0 (avoiding gestion of depht in height calculation
0017c2dc: 00801821 addu r3,r4,r0                         |r3 = Height * 2 + Halves
0017c2e0: 9222005a lbu r2,0x005a(r17)                        |r2 = Unit's Current Statuses 3
0017c2e4: 00000000 nop                                       |
0017c2e8: 30420040 andi r2,r2,0x0040                         |r2 = 0x40 if unit is floating
0017c2ec: 10400004 beq r2,r0,0x0017c300                      #If Unit is floating
0017c2f0: 00051040 sll r2,r5,0x01                                |r2 = Depth * 2
0017c2f4: 24420002 addiu r2,r2,0x0002                            |r2 = Depth * 2 + 2
0017c2f8: 0805f0d1 j 0x0017c344                                  >>Jump after depht section
0017c2fc: 00821821 addu r3,r4,r2                                 |r3 = Height*2 + Halves + Depth*2 + 2
0017c300: 32020080 andi r2,r16,0x0080                        #Else (not floating) r2 = 0x80 if unit as walk on water
0017c304: 10400003 beq r2,r0,0x0017c314                      #If Unit walk on water
0017c308: 00051040 sll r2,r5,0x01                                |r2 = Depth * 2
0017c30c: 0805f0d1 j 0x0017c344                                  >>Jump after depht section
0017c310: 00821821 addu r3,r4,r2                                 |r3 = Height*2 + Halves + Depth*2 
0017c314: 32020040 andi r2,r16,0x0040                        #Else (not floating - not walking on water) r2 = 0x40 if unit has move in water
0017c318: 1040000a beq r2,r0,0x0017c344                      #If unit use move in water /Else branch after depht section (Depht * 2 will be added to height)
0017c31c: 00051040 sll r2,r5,0x01                                |r2 = Depth * 2
0017c320: 2442fffe addiu r2,r2,0xfffe                            |r2 = Depth * 2 - 2
0017c324: 0805f0d1 j 0x0017c344                                  >>Jump after depht section
0017c328: 00821821 addu r3,r4,r2                                 |Height*2 + Halves + Depth*2 - 2
0017c32c: 9222005a lbu r2,0x005a(r17)                    #Else (depht = 0x00) r2 = Unit's Current Statuses 3
0017c330: 00000000 nop                                   | 
0017c334: 30420040 andi r2,r2,0x0040                     |r2 = 0x40 if unit have float
0017c338: 10400002 beq r2,r0,0x0017c344                  #If unit have float /Branch if Unit doesn't have Float (0 depth)
0017c33c: 00000000 nop                                       |
0017c340: 24830002 addiu r3,r4,0x0002                        |r3 = Height*2 + Halves + 2
0017c344: 93a20014 lbu r2,0x0014(r29)                    | r2 = unit(s) height /(jumps above landing site)
0017c348: a3a30015 sb r3,0x0015(r29)                     |Store walking Height at r29 0x15
0017c34c: 00621021 addu r2,r3,r2                         |r2 = walking height + unit(s) height = total height
0017c350: a3a20016 sb r2,0x0016(r29)                     |Store total Height at r29 0x16
0017c354: 92220058 lbu r2,0x0058(r17)                    |r2 = Unit's on ground Current Statuses 1
0017c358: 00000000 nop                                   |
0017c35c: 30420020 andi r2,r2,0x0020                     |r2 = 0x20 if unit on ground is dead
0017c360: 10400003 beq r2,r0,0x0017c370                  #If walking unit is dead #Branch if Unit isn't Dead
0017c364: 00000000 nop                                       | 
0017c368: 34020080 ori r2,r0,0x0080         #E               |r2 = 0x80 (Invalid unit ID branch)
0017c36c: a3a20013 sb r2,0x0013(r29)            #E           |Store checked Unit ID = 0x80 (Unit doesn't exists branch)
0017c370: 8ba20013 lwl r2,0x0013(r29)       |
0017c374: 9ba20010 lwr r2,0x0010(r29)       |r2 = X/Y/Elevation/ID (load unaligned word in two commands)
0017c378: 83a30014 lb r3,0x0014(r29)        |r3 = Unit(s) height
0017c37c: 83a40015 lb r4,0x0015(r29)        |r4 = walking height
0017c380: 83a50016 lb r5,0x0016(r29)        |r5 = total height
0017c384: aa420003 swl r2,0x0003(r18)       |r18 0x01 = Y coord / 0x02 = elevation / 0x03 = Unit ID (with flags))
0017c388: ba420000 swr r2,0x0000(r18)       |r18 0x00 = unit X coord
0017c38c: a2430004 sb r3,0x0004(r18)        |r18 0x04 = Unit(s) height
0017c390: a2440005 sb r4,0x0005(r18)        |r18 0x05 = walking height
0017c394: a2450006 sb r5,0x0006(r18)        |r18 0x06 = total height
0017c398: 02401021 addu r2,r18,r0           |r2 = Stack Pointer
0017c39c: 8fbf0024 lw r31,0x0024(r29)       END
0017c3a0: 8fb20020 lw r18,0x0020(r29)       
0017c3a4: 8fb1001c lw r17,0x001c(r29)       
0017c3a8: 8fb00018 lw r16,0x0018(r29)       
0017c3ac: 27bd0028 addiu r29,r29,0x0028     
0017c3b0: 03e00008 jr r31                   
0017c3b4: 00000000 nop

Return locations

0006a7f8: 0006a7c0_-_0006aa7c
0006aab8: 0006aa80_-_0006ad14
0006cd28: Some_Knockback_Handling
0006ce60: Some_Knockback_Handling
0007d108: Complex_Height_Data_from_unit_misc_data_and_coordinates
0017447c: Store_movement_stuff_into_scratch_pad
0017b094: Auxilary_targeting_validation
0017b0bc: Auxilary_targeting_validation
0017b2a8: Auxilary_targeting_validation
0017b300: Auxilary_targeting_validation
0017b380: Auxilary_targeting_validation
0017b41c: Height/coordinate_validation
0017b444: Height/coordinate_validation
0017b660: Calculator_Routine
0018246c: Monster_Skill_check_prep 
00182608: Monster_Skill_check