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