Difference between revisions of "Load ability data for skillset"
Jump to navigation
Jump to search
m |
|||
Line 5: | Line 5: | ||
0x001817C8: lw r4, 0x00B0(r29) unit data? | 0x001817C8: lw r4, 0x00B0(r29) unit data? | ||
0x001817CC: sw r20, 0x0118(r29) | 0x001817CC: sw r20, 0x0118(r29) | ||
− | 0x001817D0: lw r20, 0x0140(r29) 0x10 stack address | + | 0x001817D0: lw r20, 0x0140(r29) 0x10 stack address (Raw ability CT) |
0x001817D4: sw r18, 0x0110(r29) | 0x001817D4: sw r18, 0x0110(r29) | ||
− | 0x001817D8: lw r18, 0x0148(r29) 0x18 stack address | + | 0x001817D8: lw r18, 0x0148(r29) 0x18 stack address (Silence/reflect/performance checks |
0x001817DC: sw r17, 0x010C(r29) | 0x001817DC: sw r17, 0x010C(r29) | ||
− | 0x001817E0: lw r17, 0x014C(r29) 0x1c stack address | + | 0x001817E0: lw r17, 0x014C(r29) 0x1c stack address (#turns to complete) |
0x001817E4: sw r30, 0x0128(r29) | 0x001817E4: sw r30, 0x0128(r29) | ||
− | 0x001817E8: addu r30, r0, r0 | + | 0x001817E8: addu r30, r0, r0 No. Abilities default to 0 |
0x001817EC: sw r31, 0x012C(r29) | 0x001817EC: sw r31, 0x012C(r29) | ||
0x001817F0: sw r23, 0x0124(r29) | 0x001817F0: sw r23, 0x0124(r29) | ||
Line 18: | Line 18: | ||
0x001817FC: sw r19, 0x0114(r29) | 0x001817FC: sw r19, 0x0114(r29) | ||
0x00181800: sw r16, 0x0108(r29) | 0x00181800: sw r16, 0x0108(r29) | ||
− | 0x00181804: sw r6, 0x00C0(r29) | + | 0x00181804: sw r6, 0x00C0(r29) Ability ID pointer |
− | 0x00181808: sw r0, 0x00E0(r29) | + | 0x00181808: sw r0, 0x00E0(r29) Initialise Materia Blade flag |
− | 0x0018180C: sw r0, 0x00E8(r29) | + | 0x0018180C: sw r0, 0x00E8(r29) Initialise Sword Flag |
− | 0x00181810: sw r0, 0x00F0(r29) | + | 0x00181810: sw r0, 0x00F0(r29) Initialise short/non-charge flags |
− | 0x00181814: sw r0, 0x00F8(r29) | + | 0x00181814: sw r0, 0x00F8(r29) Initialise Half MP flag |
− | 0x00181818: sw r0, 0x0100(r29) | + | 0x00181818: sw r0, 0x0100(r29) Initialise frog flag |
− | 0x0018181C: sw r7, 0x00C8(r29) | + | 0x0018181C: sw r7, 0x00C8(r29) MP Cost pointer |
0x00181820: jal 0x001810D4 [[Get unit data pointer?]] (r2) | 0x00181820: jal 0x001810D4 [[Get unit data pointer?]] (r2) | ||
0x00181824: sb r5, 0x00B8(r29) store primary skillset | 0x00181824: sb r5, 0x00B8(r29) store primary skillset | ||
Line 30: | Line 30: | ||
0x0018182C: beq r16, r0, 0x00181B3C | 0x0018182C: beq r16, r0, 0x00181B3C | ||
0x00181830: addu r2, r0, r0 | 0x00181830: addu r2, r0, r0 | ||
− | 0x00181834: lbu r2, 0x005A(r16) load | + | 0x00181834: lbu r2, 0x005A(r16) load statuses |
0x00181838: nop | 0x00181838: nop | ||
0x0018183C: andi r2, r2, 0x0002 | 0x0018183C: andi r2, r2, 0x0002 | ||
Line 49: | Line 49: | ||
0x00181878: beq r2, r0, 0x00181888 branch if not non-charge | 0x00181878: beq r2, r0, 0x00181888 branch if not non-charge | ||
0x0018187C: ori r9, r0, 0x0002 | 0x0018187C: ori r9, r0, 0x0002 | ||
− | 0x00181880: j 0x00181898 | + | 0x00181880: j 0x00181898 |
− | 0x00181884: sw r9, 0x00F0(r29) non charge flag | + | 0x00181884: sw r9, 0x00F0(r29) non charge flag (0x2) |
0x00181888: andi r2, r3, 0x0008 | 0x00181888: andi r2, r3, 0x0008 | ||
0x0018188C: beq r2, r0, 0x00181898 branch if not short charge | 0x0018188C: beq r2, r0, 0x00181898 branch if not short charge | ||
0x00181890: ori r8, r0, 0x0001 | 0x00181890: ori r8, r0, 0x0001 | ||
− | 0x00181894: sw r8, 0x00F0(r29) short charge flag | + | 0x00181894: sw r8, 0x00F0(r29) short charge flag (0x1) |
− | 0x00181898: addiu r4, r29, 0x0010 | + | 0x00181898: addiu r4, r29, 0x0010 parse stack + 0x10 for? (does this point to AT list or smth?) |
0x0018189C: jal 0x0018370C [[Calculate AT List]] | 0x0018189C: jal 0x0018370C [[Calculate AT List]] | ||
− | 0x001818A0: addu r5, r0, r0 | + | 0x001818A0: addu r5, r0, r0 r5 = 0 |
0x001818A4: lbu r3, 0x0184(r16) load equipped flags | 0x001818A4: lbu r3, 0x0184(r16) load equipped flags | ||
0x001818A8: nop | 0x001818A8: nop | ||
Line 73: | Line 73: | ||
0x001818D8: andi r2, r2, 0x0020 | 0x001818D8: andi r2, r2, 0x0020 | ||
0x001818DC: bne r2, r0, 0x00181938 branch if not human | 0x001818DC: bne r2, r0, 0x00181938 branch if not human | ||
+ | |||
+ | Human Gender: | ||
0x001818E0: nop | 0x001818E0: nop | ||
0x001818E4: lbu r9, 0x00B8(r29) load primary skillset | 0x001818E4: lbu r9, 0x00B8(r29) load primary skillset | ||
Line 82: | Line 84: | ||
0x001818FC: nop | 0x001818FC: nop | ||
0x00181900: lbu r2, 0x00B8(r29) load primary skillset | 0x00181900: lbu r2, 0x00B8(r29) load primary skillset | ||
− | 0x00181904: j 0x0018193C | + | 0x00181904: j 0x0018193C Assume all abilities learnt if generic skillset |
− | 0x00181908: addiu r5, r2, 0xFFFB | + | 0x00181908: addiu r5, r2, 0xFFFB skillset - 5 |
− | 0x0018190C: lbu r2, 0x0012(r16) load primary skillset | + | 0x0018190C: lbu r2, 0x0012(r16) load unit's primary skillset |
− | 0x00181910: lbu r3, 0x00B8(r29) | + | 0x00181910: lbu r3, 0x00B8(r29) Load stored primary skillset |
0x00181914: nop | 0x00181914: nop | ||
0x00181918: beq r3, r2, 0x00181930 branch if loaded skillset = units primary skillset | 0x00181918: beq r3, r2, 0x00181930 branch if loaded skillset = units primary skillset | ||
− | 0x0018191C: addu r5, r0, r0 | + | 0x0018191C: addu r5, r0, r0 skillset = 0 |
− | 0x00181920: lbu r2, 0x0162(r16) load special skillset | + | 0x00181920: lbu r2, 0x0162(r16) load unit's special skillset |
0x00181924: nop | 0x00181924: nop | ||
− | 0x00181928: bne r3, r2, 0x00181938 branch if | + | 0x00181928: bne r3, r2, 0x00181938 branch if stored skillset <> unit's special skillset |
0x0018192C: nop | 0x0018192C: nop | ||
0x00181930: j 0x00181940 | 0x00181930: j 0x00181940 | ||
0x00181934: addiu r2, r0, 0xFFFF | 0x00181934: addiu r2, r0, 0xFFFF | ||
− | + | ||
+ | Monster Gender: | ||
0x00181938: addiu r5, r0, 0xFFFF | 0x00181938: addiu r5, r0, 0xFFFF | ||
0x0018193C: addiu r2, r0, 0xFFFF | 0x0018193C: addiu r2, r0, 0xFFFF | ||
− | 0x00181940: bne r5, r2, 0x00181954 branch if skillset | + | 0x00181940: bne r5, r2, 0x00181954 branch if skillset is not skillset 4 if loaded skillset is < 0x13. branch if unit's special skillset <> 0 if special skillset that is not primary skillset. |
0x00181944: lui r8, 0x00FF | 0x00181944: lui r8, 0x00FF | ||
store known abilities = all | store known abilities = all | ||
− | 0x00181948: ori r8, r8, 0xFFFF | + | 0x00181948: ori r8, r8, 0xFFFF if skillset is 4, or if secondary skillset is special that is not unit's special skillset, or if monster skillset: |
0x0018194C: j 0x00181960 | 0x0018194C: j 0x00181960 | ||
0x00181950: sw r8, 0x00D0(r29) store known abilities = all | 0x00181950: sw r8, 0x00D0(r29) store known abilities = all | ||
− | + | ||
− | 0x00181954: jal 0x0005E200 [[Get Known Abilities]] | + | 0x00181954: jal 0x0005E200 [[Get Known Abilities]] if generic skillset, or unique skillset equal to unit's unique skillset |
0x00181958: addu r4, r16, r0 | 0x00181958: addu r4, r16, r0 | ||
− | 0x0018195C: sw r2, 0x00D0(r29) store known abilities | + | 0x0018195C: sw r2, 0x00D0(r29) store known abilities |
− | |||
0x00181960: addu r19, r0, r0 | 0x00181960: addu r19, r0, r0 | ||
− | 0x00181964: addu r23, r30, r17 | + | 0x00181964: addu r23, r30, r17 #turns to complete for ability |
− | 0x00181968: addu r22, r30, r18 | + | 0x00181968: addu r22, r30, r18 Silence/reflect/Performance check for ability |
− | 0x0018196C: lw r9, 0x00C8(r29) | + | 0x0018196C: lw r9, 0x00C8(r29) Ability List |
− | 0x00181970: addu r21, r30, r20 | + | 0x00181970: addu r21, r30, r20 Raw Ability CT |
− | 0x00181974: addu r20, r30, r9 | + | 0x00181974: addu r20, r30, r9 Ability list + Counter |
0x00181978: lui r2, 0x0080 | 0x00181978: lui r2, 0x0080 | ||
− | 0x0018197C: lw r8, 0x00D0(r29) load known abilities | + | 0x0018197C: lw r8, 0x00D0(r29) load known abilities |
− | 0x00181980: srav r2, r2, r19 | + | 0x00181980: srav r2, r2, r19 0x00800000 bitmask >> r19 counter |
− | 0x00181984: and r2, r8, r2 known abilities | + | 0x00181984: and r2, r8, r2 known abilities AND bitmask flag |
− | 0x00181988: beq r2, r0, 0x00181B1C | + | 0x00181988: beq r2, r0, 0x00181B1C branch if this ability is not known |
0x0018198C: nop | 0x0018198C: nop | ||
0x00181990: lbu r4, 0x00B8(r29) load skillset | 0x00181990: lbu r4, 0x00B8(r29) load skillset | ||
0x00181994: jal 0x0005A568 [[Load Ability From Skillset]] | 0x00181994: jal 0x0005A568 [[Load Ability From Skillset]] | ||
− | 0x00181998: addu r5, r19, r0 | + | 0x00181998: addu r5, r19, r0 r5 = ability |
0x0018199C: lw r9, 0x0100(r29) load frog flag | 0x0018199C: lw r9, 0x0100(r29) load frog flag | ||
0x001819A0: addu r4, r2, r0 | 0x001819A0: addu r4, r2, r0 | ||
− | 0x001819A4: beq r9, r0, 0x001819C0 branch if | + | 0x001819A4: beq r9, r0, 0x001819C0 branch if frog status not present |
− | 0x001819A8: sh r4, 0x00D8(r29) store ability | + | 0x001819A8: sh r4, 0x00D8(r29) store ability (temp) |
if frog | if frog | ||
Line 136: | Line 138: | ||
0x001819B0: sra r2, r2, 0x10 | 0x001819B0: sra r2, r2, 0x10 | ||
0x001819B4: ori r3, r0, 0x001D | 0x001819B4: ori r3, r0, 0x001D | ||
− | 0x001819B8: bne r2, r3, 0x00181B1C branch if ability is not | + | 0x001819B8: bne r2, r3, 0x00181B1C branch if ability is not frog spell (don't save ability data if ability is not frog while frogged) |
0x001819BC: nop | 0x001819BC: nop | ||
+ | if frog not present OR if frog + spell = 0x1d(frog) | ||
0x001819C0: sll r2, r4, 0x10 | 0x001819C0: sll r2, r4, 0x10 | ||
0x001819C4: sra r3, r2, 0x10 | 0x001819C4: sra r3, r2, 0x10 | ||
Line 148: | Line 151: | ||
regular ability | regular ability | ||
− | 0x001819DC: sll r2, r3, 0x03 | + | 0x001819DC: sll r2, r3, 0x03 |
0x001819E0: subu r2, r2, r3 | 0x001819E0: subu r2, r2, r3 | ||
− | 0x001819E4: sll r2, r2, 0x01 | + | 0x001819E4: sll r2, r2, 0x01 ability ID * 14 |
0x001819E8: lui r3, 0x8006 | 0x001819E8: lui r3, 0x8006 | ||
0x001819EC: addiu r3, r3, 0xFBF0 load ability data pointer 2 | 0x001819EC: addiu r3, r3, 0xFBF0 load ability data pointer 2 | ||
0x001819F0: addu r4, r2, r3 | 0x001819F0: addu r4, r2, r3 | ||
− | 0x001819F4: lbu r3, 0x0006(r4) | + | 0x001819F4: lbu r3, 0x0006(r4) ability flags 4 |
0x001819F8: nop | 0x001819F8: nop | ||
0x001819FC: andi r2, r3, 0x0008 | 0x001819FC: andi r2, r3, 0x0008 | ||
− | 0x00181A00: beq r2, r0, 0x00181A18 ability requires sword check | + | 0x00181A00: beq r2, r0, 0x00181A18 if ability requires sword: (else, materia blade check) |
0x00181A04: nop | 0x00181A04: nop | ||
− | 0x00181A08: lw r8, 0x00E8(r29) | + | 0x00181A08: lw r8, 0x00E8(r29) load sword check from stack |
0x00181A0C: nop | 0x00181A0C: nop | ||
− | 0x00181A10: beq r8, r0, 0x00181B1C | + | 0x00181A10: beq r8, r0, 0x00181B1C if sword check is false, don't check for more requirements |
0x00181A14: nop | 0x00181A14: nop | ||
− | 0x00181A18: andi r2, r3, 0x0004 | + | 0x00181A18: andi r2, r3, 0x0004 |
− | 0x00181A1C: beq r2, r0, 0x00181A34 ability requires materia blade check | + | 0x00181A1C: beq r2, r0, 0x00181A34 if ability requires materia blade: (else, Half of MP check) |
0x00181A20: nop | 0x00181A20: nop | ||
− | 0x00181A24: lw r9, 0x00E0(r29) | + | 0x00181A24: lw r9, 0x00E0(r29) load materia blade check from stack |
0x00181A28: nop | 0x00181A28: nop | ||
− | 0x00181A2C: beq r9, r0, 0x00181B1C | + | 0x00181A2C: beq r9, r0, 0x00181B1C if materia blade check is false, don't check for more requirements |
0x00181A30: nop | 0x00181A30: nop | ||
− | 0x00181A34: lw r8, 0x00F8(r29) load | + | 0x00181A34: lw r8, 0x00F8(r29) load half of mp check |
0x00181A38: lbu r17, 0x000D(r4) load MP cost | 0x00181A38: lbu r17, 0x000D(r4) load MP cost | ||
− | 0x00181A3C: beq r8, r0, 0x00181A48 | + | 0x00181A3C: beq r8, r0, 0x00181A48 branch if half mp check is false |
0x00181A40: addiu r2, r17, 0x0001 | 0x00181A40: addiu r2, r17, 0x0001 | ||
− | 0x00181A44: sra r17, r2, 0x01 MP cost / 2 | + | 0x00181A44: sra r17, r2, 0x01 MP cost / 2 (rounded up) |
0x00181A48: lbu r2, 0x000C(r4) load CT | 0x00181A48: lbu r2, 0x000C(r4) load CT | ||
0x00181A4C: lbu r3, 0x0005(r4) load flags 3 | 0x00181A4C: lbu r3, 0x0005(r4) load flags 3 | ||
Line 181: | Line 184: | ||
0x00181A58: andi r2, r3, 0x0020 affected by silence | 0x00181A58: andi r2, r3, 0x0020 affected by silence | ||
0x00181A5C: srl r2, r2, 0x04 | 0x00181A5C: srl r2, r2, 0x04 | ||
− | 0x00181A60: andi r3, r3, 0x0004 | + | 0x00181A60: andi r3, r3, 0x0004 performance |
− | 0x00181A64: bne r3, r0, 0x00181A94 branch if | + | 0x00181A64: bne r3, r0, 0x00181A94 branch if performance is true |
− | 0x00181A68: or r18, r4, r2 r18 = silence and | + | 0x00181A68: or r18, r4, r2 r18 = silence and performance checks |
− | 0x00181A6C: lw r9, 0x00F0(r29) | + | 0x00181A6C: lw r9, 0x00F0(r29) short charge check |
0x00181A70: ori r2, r0, 0x0001 | 0x00181A70: ori r2, r0, 0x0001 | ||
− | 0x00181A74: bne r9, r2, 0x00181A80 short charge | + | 0x00181A74: bne r9, r2, 0x00181A80 branch if not short charge |
0x00181A78: addiu r2, r16, 0x0001 | 0x00181A78: addiu r2, r16, 0x0001 | ||
− | 0x00181A7C: sra r16, r2, 0x01 | + | 0x00181A7C: sra r16, r2, 0x01 CT / 2 (rounded up) |
− | 0x00181A80: lw r8, 0x00F0(r29) | + | 0x00181A80: lw r8, 0x00F0(r29) |
0x00181A84: ori r2, r0, 0x0002 | 0x00181A84: ori r2, r0, 0x0002 | ||
− | 0x00181A88: bne r8, r2, 0x00181A98 non-charge | + | 0x00181A88: bne r8, r2, 0x00181A98 branch if not non-charge |
− | 0x00181A8C: addu r5, r16, r0 store | + | 0x00181A8C: addu r5, r16, r0 store final CT |
0x00181A90: addu r16, r0, r0 | 0x00181A90: addu r16, r0, r0 | ||
− | 0x00181A94: addu r5, r16, r0 store 0 CT | + | 0x00181A94: addu r5, r16, r0 store 0 CT if non charge |
0x00181A98: lw r4, 0x00B0(r29) load Unit ID | 0x00181A98: lw r4, 0x00B0(r29) load Unit ID | ||
0x00181A9C: jal 0x00181720 [[Ability Loading?]] | 0x00181A9C: jal 0x00181720 [[Ability Loading?]] | ||
− | 0x00181AA0: addiu r6, r29, 0x0010 | + | 0x00181AA0: addiu r6, r29, 0x0010 AT list? |
− | 0x00181AA4: sb r17, 0x0000(r20) store MP cost | + | 0x00181AA4: sb r17, 0x0000(r20) store MP cost |
− | 0x00181AA8: sb r16, 0x0000(r21) store CT | + | 0x00181AA8: sb r16, 0x0000(r21) store Raw Ability CT to stack |
0x00181AAC: j 0x00181AF0 | 0x00181AAC: j 0x00181AF0 | ||
− | 0x00181AB0: sb r18, 0x0000(r22) store silence/persevere checks | + | 0x00181AB0: sb r18, 0x0000(r22) store silence/persevere checks to stack |
0x00181AB4: addiu r2, r4, 0xFE6A | 0x00181AB4: addiu r2, r4, 0xFE6A | ||
0x00181AB8: andi r2, r2, 0xFFFF | 0x00181AB8: andi r2, r2, 0xFFFF | ||
Line 207: | Line 210: | ||
0x00181AC0: beq r2, r0, 0x00181AF4 branch if not charge ability | 0x00181AC0: beq r2, r0, 0x00181AF4 branch if not charge ability | ||
0x00181AC4: sll r2, r3, 0x01 | 0x00181AC4: sll r2, r3, 0x01 | ||
− | 0x00181AC8: addiu r6, r29, 0x0010 | + | |
+ | if charge: | ||
+ | 0x00181AC8: addiu r6, r29, 0x0010 AT list? | ||
0x00181ACC: lui r1, 0x8006 | 0x00181ACC: lui r1, 0x8006 | ||
− | 0x00181AD0: addu r1, r1, r2 | + | 0x00181AD0: addu r1, r1, r2 Ability ID * 2 + data table area. |
− | 0x00181AD4: lbu r16, 0x0D18(r1) load CT | + | 0x00181AD4: lbu r16, 0x0D18(r1) load charge CT |
0x00181AD8: lw r4, 0x00B0(r29) unit id | 0x00181AD8: lw r4, 0x00B0(r29) unit id | ||
0x00181ADC: jal 0x00181720 [[Ability Loading?]] | 0x00181ADC: jal 0x00181720 [[Ability Loading?]] | ||
− | 0x00181AE0: addu r5, r16, r0 | + | 0x00181AE0: addu r5, r16, r0 Parse Charge CT |
− | 0x00181AE4: sb r0, 0x0000(r20) store 0 for mp cost | + | 0x00181AE4: sb r0, 0x0000(r20) store 0 for mp cost |
− | 0x00181AE8: sb r16, 0x0000(r21) store CT | + | 0x00181AE8: sb r16, 0x0000(r21) store CT |
− | 0x00181AEC: sb r0, 0x0000(r22) store | + | 0x00181AEC: sb r0, 0x0000(r22) store cannot be affected by silence/performance |
− | 0x00181AF0: sb r2, 0x0000(r23) store | + | 0x00181AF0: sb r2, 0x0000(r23) store #turns to complete |
− | 0x00181AF4: addiu r23, r23, 0x0001 | + | |
− | 0x00181AF8: addiu r22, r22, 0x0001 | + | All: |
− | 0x00181AFC: addiu r21, r21, 0x0001 | + | 0x00181AF4: addiu r23, r23, 0x0001 Increase #turns pointer by 1 (for next ability) |
− | 0x00181B00: addiu r20, r20, 0x0001 | + | 0x00181AF8: addiu r22, r22, 0x0001 increase silence/performance checks by 1 |
+ | 0x00181AFC: addiu r21, r21, 0x0001 increase Raw CT pointer by 1 | ||
+ | 0x00181B00: addiu r20, r20, 0x0001 mp cost pointer + 1 | ||
0x00181B04: lhu r8, 0x00D8(r29) load ability ID | 0x00181B04: lhu r8, 0x00D8(r29) load ability ID | ||
− | 0x00181B08: lw r9, 0x00C0(r29) load | + | 0x00181B08: lw r9, 0x00C0(r29) load Ability ID list |
− | 0x00181B0C: addiu r30, r30, 0x0001 | + | 0x00181B0C: addiu r30, r30, 0x0001 Increase number of learnt and usable abilities by 1 |
0x00181B10: sh r8, 0x0000(r9) store ability ID | 0x00181B10: sh r8, 0x0000(r9) store ability ID | ||
0x00181B14: addiu r9, r9, 0x0002 | 0x00181B14: addiu r9, r9, 0x0002 | ||
− | 0x00181B18: sw r9, 0x00C0(r29) store | + | 0x00181B18: sw r9, 0x00C0(r29) store next ability ID |
0x00181B1C: addiu r19, r19, 0x0001 | 0x00181B1C: addiu r19, r19, 0x0001 | ||
− | 0x00181B20: slti r2, r19, 0x0010 run 15 times | + | 0x00181B20: slti r2, r19, 0x0010 run 15 times, once for each ability (except the last one? aren't skillsets 16 entries long though...?) |
0x00181B24: bne r2, r0, 0x0018197C | 0x00181B24: bne r2, r0, 0x0018197C | ||
0x00181B28: lui r2, 0x0080 | 0x00181B28: lui r2, 0x0080 | ||
− | 0x00181B2C: lw r9, 0x00C0(r29) | + | 0x00181B2C: lw r9, 0x00C0(r29) Ability ID list |
0x00181B30: addiu r2, r0, 0xFFFF store end of list | 0x00181B30: addiu r2, r0, 0xFFFF store end of list | ||
− | 0x00181B34: sh r2, 0x0000(r9) store | + | 0x00181B34: sh r2, 0x0000(r9) store end of list |
− | 0x00181B38: addu r2, r30, r0 return number of abilities | + | 0x00181B38: addu r2, r30, r0 return number of learnt + usable abilities in r2 (only used for text purposes.) |
0x00181B3C: lw r31, 0x012C(r29) | 0x00181B3C: lw r31, 0x012C(r29) | ||
0x00181B40: lw r30, 0x0128(r29) | 0x00181B40: lw r30, 0x0128(r29) |
Revision as of 04:33, 19 February 2022
Load ability data for skillset (MP, CT, Turns, req. sword booleans) 0x001817C0: addiu r29, r29, 0xFED0 -130 0x001817C4: sw r4, 0x00B0(r29) 0x001817C8: lw r4, 0x00B0(r29) unit data? 0x001817CC: sw r20, 0x0118(r29) 0x001817D0: lw r20, 0x0140(r29) 0x10 stack address (Raw ability CT) 0x001817D4: sw r18, 0x0110(r29) 0x001817D8: lw r18, 0x0148(r29) 0x18 stack address (Silence/reflect/performance checks 0x001817DC: sw r17, 0x010C(r29) 0x001817E0: lw r17, 0x014C(r29) 0x1c stack address (#turns to complete) 0x001817E4: sw r30, 0x0128(r29) 0x001817E8: addu r30, r0, r0 No. Abilities default to 0 0x001817EC: sw r31, 0x012C(r29) 0x001817F0: sw r23, 0x0124(r29) 0x001817F4: sw r22, 0x0120(r29) 0x001817F8: sw r21, 0x011C(r29) 0x001817FC: sw r19, 0x0114(r29) 0x00181800: sw r16, 0x0108(r29) 0x00181804: sw r6, 0x00C0(r29) Ability ID pointer 0x00181808: sw r0, 0x00E0(r29) Initialise Materia Blade flag 0x0018180C: sw r0, 0x00E8(r29) Initialise Sword Flag 0x00181810: sw r0, 0x00F0(r29) Initialise short/non-charge flags 0x00181814: sw r0, 0x00F8(r29) Initialise Half MP flag 0x00181818: sw r0, 0x0100(r29) Initialise frog flag 0x0018181C: sw r7, 0x00C8(r29) MP Cost pointer 0x00181820: jal 0x001810D4 Get unit data pointer? (r2) 0x00181824: sb r5, 0x00B8(r29) store primary skillset 0x00181828: addu r16, r2, r0 0x0018182C: beq r16, r0, 0x00181B3C 0x00181830: addu r2, r0, r0 0x00181834: lbu r2, 0x005A(r16) load statuses 0x00181838: nop 0x0018183C: andi r2, r2, 0x0002 0x00181840: beq r2, r0, 0x00181850 branch if not frog 0x00181844: nop 0x00181848: ori r9, r0, 0x0001 0x0018184C: sw r9, 0x0100(r29) frog flag 0x00181850: lbu r2, 0x0090(r16) load support 2 0x00181854: nop 0x00181858: andi r2, r2, 0x0080 0x0018185C: beq r2, r0, 0x0018186C branch if not half of MP 0x00181860: nop 0x00181864: ori r8, r0, 0x0001 0x00181868: sw r8, 0x00F8(r29) half mp flag 0x0018186C: lbu r3, 0x0092(r16) load support 4 0x00181870: nop 0x00181874: andi r2, r3, 0x0004 0x00181878: beq r2, r0, 0x00181888 branch if not non-charge 0x0018187C: ori r9, r0, 0x0002 0x00181880: j 0x00181898 0x00181884: sw r9, 0x00F0(r29) non charge flag (0x2) 0x00181888: andi r2, r3, 0x0008 0x0018188C: beq r2, r0, 0x00181898 branch if not short charge 0x00181890: ori r8, r0, 0x0001 0x00181894: sw r8, 0x00F0(r29) short charge flag (0x1) 0x00181898: addiu r4, r29, 0x0010 parse stack + 0x10 for? (does this point to AT list or smth?) 0x0018189C: jal 0x0018370C Calculate AT List 0x001818A0: addu r5, r0, r0 r5 = 0 0x001818A4: lbu r3, 0x0184(r16) load equipped flags 0x001818A8: nop 0x001818AC: andi r2, r3, 0x0004 0x001818B0: beq r2, r0, 0x001818C0 branch if materia blade not equipped 0x001818B4: andi r2, r3, 0x0008 0x001818B8: ori r9, r0, 0x0001 0x001818BC: sw r9, 0x00E0(r29) materia blade flag 0x001818C0: beq r2, r0, 0x001818D0 branch if sword not equipped 0x001818C4: nop 0x001818C8: ori r8, r0, 0x0001 0x001818CC: sw r8, 0x00E8(r29) sword flag 0x001818D0: lbu r2, 0x0006(r16) load gender 0x001818D4: nop 0x001818D8: andi r2, r2, 0x0020 0x001818DC: bne r2, r0, 0x00181938 branch if not human Human Gender: 0x001818E0: nop 0x001818E4: lbu r9, 0x00B8(r29) load primary skillset 0x001818E8: nop 0x001818EC: addiu r2, r9, 0xFFFB primary skillset - 5 0x001818F0: andi r2, r2, 0x00FF 0x001818F4: sltiu r2, r2, 0x0013 0x001818F8: beq r2, r0, 0x0018190C branch if not a generic skillset 0x001818FC: nop 0x00181900: lbu r2, 0x00B8(r29) load primary skillset 0x00181904: j 0x0018193C Assume all abilities learnt if generic skillset 0x00181908: addiu r5, r2, 0xFFFB skillset - 5 0x0018190C: lbu r2, 0x0012(r16) load unit's primary skillset 0x00181910: lbu r3, 0x00B8(r29) Load stored primary skillset 0x00181914: nop 0x00181918: beq r3, r2, 0x00181930 branch if loaded skillset = units primary skillset 0x0018191C: addu r5, r0, r0 skillset = 0 0x00181920: lbu r2, 0x0162(r16) load unit's special skillset 0x00181924: nop 0x00181928: bne r3, r2, 0x00181938 branch if stored skillset <> unit's special skillset 0x0018192C: nop 0x00181930: j 0x00181940 0x00181934: addiu r2, r0, 0xFFFF Monster Gender: 0x00181938: addiu r5, r0, 0xFFFF 0x0018193C: addiu r2, r0, 0xFFFF 0x00181940: bne r5, r2, 0x00181954 branch if skillset is not skillset 4 if loaded skillset is < 0x13. branch if unit's special skillset <> 0 if special skillset that is not primary skillset. 0x00181944: lui r8, 0x00FF
store known abilities = all 0x00181948: ori r8, r8, 0xFFFF if skillset is 4, or if secondary skillset is special that is not unit's special skillset, or if monster skillset: 0x0018194C: j 0x00181960 0x00181950: sw r8, 0x00D0(r29) store known abilities = all 0x00181954: jal 0x0005E200 Get Known Abilities if generic skillset, or unique skillset equal to unit's unique skillset 0x00181958: addu r4, r16, r0 0x0018195C: sw r2, 0x00D0(r29) store known abilities
0x00181960: addu r19, r0, r0 0x00181964: addu r23, r30, r17 #turns to complete for ability 0x00181968: addu r22, r30, r18 Silence/reflect/Performance check for ability 0x0018196C: lw r9, 0x00C8(r29) Ability List 0x00181970: addu r21, r30, r20 Raw Ability CT 0x00181974: addu r20, r30, r9 Ability list + Counter 0x00181978: lui r2, 0x0080
0x0018197C: lw r8, 0x00D0(r29) load known abilities 0x00181980: srav r2, r2, r19 0x00800000 bitmask >> r19 counter 0x00181984: and r2, r8, r2 known abilities AND bitmask flag 0x00181988: beq r2, r0, 0x00181B1C branch if this ability is not known 0x0018198C: nop 0x00181990: lbu r4, 0x00B8(r29) load skillset 0x00181994: jal 0x0005A568 Load Ability From Skillset 0x00181998: addu r5, r19, r0 r5 = ability 0x0018199C: lw r9, 0x0100(r29) load frog flag 0x001819A0: addu r4, r2, r0 0x001819A4: beq r9, r0, 0x001819C0 branch if frog status not present 0x001819A8: sh r4, 0x00D8(r29) store ability (temp)
if frog
0x001819AC: sll r2, r4, 0x10 0x001819B0: sra r2, r2, 0x10 0x001819B4: ori r3, r0, 0x001D 0x001819B8: bne r2, r3, 0x00181B1C branch if ability is not frog spell (don't save ability data if ability is not frog while frogged) 0x001819BC: nop
if frog not present OR if frog + spell = 0x1d(frog)
0x001819C0: sll r2, r4, 0x10 0x001819C4: sra r3, r2, 0x10 0x001819C8: beq r3, r0, 0x00181B1C branch if ability = 0 0x001819CC: addiu r2, r4, 0xFFFF 0x001819D0: andi r2, r2, 0xFFFF 0x001819D4: sltiu r2, r2, 0x016F 0x001819D8: beq r2, r0, 0x00181AB4 branch if ability is not a regular ability
regular ability
0x001819DC: sll r2, r3, 0x03 0x001819E0: subu r2, r2, r3 0x001819E4: sll r2, r2, 0x01 ability ID * 14 0x001819E8: lui r3, 0x8006 0x001819EC: addiu r3, r3, 0xFBF0 load ability data pointer 2 0x001819F0: addu r4, r2, r3 0x001819F4: lbu r3, 0x0006(r4) ability flags 4 0x001819F8: nop 0x001819FC: andi r2, r3, 0x0008 0x00181A00: beq r2, r0, 0x00181A18 if ability requires sword: (else, materia blade check) 0x00181A04: nop 0x00181A08: lw r8, 0x00E8(r29) load sword check from stack 0x00181A0C: nop 0x00181A10: beq r8, r0, 0x00181B1C if sword check is false, don't check for more requirements 0x00181A14: nop 0x00181A18: andi r2, r3, 0x0004 0x00181A1C: beq r2, r0, 0x00181A34 if ability requires materia blade: (else, Half of MP check) 0x00181A20: nop 0x00181A24: lw r9, 0x00E0(r29) load materia blade check from stack 0x00181A28: nop 0x00181A2C: beq r9, r0, 0x00181B1C if materia blade check is false, don't check for more requirements 0x00181A30: nop 0x00181A34: lw r8, 0x00F8(r29) load half of mp check 0x00181A38: lbu r17, 0x000D(r4) load MP cost 0x00181A3C: beq r8, r0, 0x00181A48 branch if half mp check is false 0x00181A40: addiu r2, r17, 0x0001 0x00181A44: sra r17, r2, 0x01 MP cost / 2 (rounded up) 0x00181A48: lbu r2, 0x000C(r4) load CT 0x00181A4C: lbu r3, 0x0005(r4) load flags 3 0x00181A50: andi r16, r2, 0x007F r16 = CT 0x00181A54: srl r4, r3, 0x07 0x00181A58: andi r2, r3, 0x0020 affected by silence 0x00181A5C: srl r2, r2, 0x04 0x00181A60: andi r3, r3, 0x0004 performance 0x00181A64: bne r3, r0, 0x00181A94 branch if performance is true 0x00181A68: or r18, r4, r2 r18 = silence and performance checks 0x00181A6C: lw r9, 0x00F0(r29) short charge check 0x00181A70: ori r2, r0, 0x0001 0x00181A74: bne r9, r2, 0x00181A80 branch if not short charge 0x00181A78: addiu r2, r16, 0x0001 0x00181A7C: sra r16, r2, 0x01 CT / 2 (rounded up) 0x00181A80: lw r8, 0x00F0(r29) 0x00181A84: ori r2, r0, 0x0002 0x00181A88: bne r8, r2, 0x00181A98 branch if not non-charge 0x00181A8C: addu r5, r16, r0 store final CT 0x00181A90: addu r16, r0, r0 0x00181A94: addu r5, r16, r0 store 0 CT if non charge 0x00181A98: lw r4, 0x00B0(r29) load Unit ID 0x00181A9C: jal 0x00181720 Ability Loading? 0x00181AA0: addiu r6, r29, 0x0010 AT list? 0x00181AA4: sb r17, 0x0000(r20) store MP cost 0x00181AA8: sb r16, 0x0000(r21) store Raw Ability CT to stack 0x00181AAC: j 0x00181AF0 0x00181AB0: sb r18, 0x0000(r22) store silence/persevere checks to stack 0x00181AB4: addiu r2, r4, 0xFE6A 0x00181AB8: andi r2, r2, 0xFFFF 0x00181ABC: sltiu r2, r2, 0x0008 0x00181AC0: beq r2, r0, 0x00181AF4 branch if not charge ability 0x00181AC4: sll r2, r3, 0x01 if charge: 0x00181AC8: addiu r6, r29, 0x0010 AT list? 0x00181ACC: lui r1, 0x8006 0x00181AD0: addu r1, r1, r2 Ability ID * 2 + data table area. 0x00181AD4: lbu r16, 0x0D18(r1) load charge CT 0x00181AD8: lw r4, 0x00B0(r29) unit id 0x00181ADC: jal 0x00181720 Ability Loading? 0x00181AE0: addu r5, r16, r0 Parse Charge CT 0x00181AE4: sb r0, 0x0000(r20) store 0 for mp cost 0x00181AE8: sb r16, 0x0000(r21) store CT 0x00181AEC: sb r0, 0x0000(r22) store cannot be affected by silence/performance 0x00181AF0: sb r2, 0x0000(r23) store #turns to complete All: 0x00181AF4: addiu r23, r23, 0x0001 Increase #turns pointer by 1 (for next ability) 0x00181AF8: addiu r22, r22, 0x0001 increase silence/performance checks by 1 0x00181AFC: addiu r21, r21, 0x0001 increase Raw CT pointer by 1 0x00181B00: addiu r20, r20, 0x0001 mp cost pointer + 1 0x00181B04: lhu r8, 0x00D8(r29) load ability ID 0x00181B08: lw r9, 0x00C0(r29) load Ability ID list 0x00181B0C: addiu r30, r30, 0x0001 Increase number of learnt and usable abilities by 1 0x00181B10: sh r8, 0x0000(r9) store ability ID 0x00181B14: addiu r9, r9, 0x0002 0x00181B18: sw r9, 0x00C0(r29) store next ability ID 0x00181B1C: addiu r19, r19, 0x0001 0x00181B20: slti r2, r19, 0x0010 run 15 times, once for each ability (except the last one? aren't skillsets 16 entries long though...?) 0x00181B24: bne r2, r0, 0x0018197C 0x00181B28: lui r2, 0x0080
0x00181B2C: lw r9, 0x00C0(r29) Ability ID list 0x00181B30: addiu r2, r0, 0xFFFF store end of list 0x00181B34: sh r2, 0x0000(r9) store end of list 0x00181B38: addu r2, r30, r0 return number of learnt + usable abilities in r2 (only used for text purposes.) 0x00181B3C: lw r31, 0x012C(r29) 0x00181B40: lw r30, 0x0128(r29) 0x00181B44: lw r23, 0x0124(r29) 0x00181B48: lw r22, 0x0120(r29) 0x00181B4C: lw r21, 0x011C(r29) 0x00181B50: lw r20, 0x0118(r29) 0x00181B54: lw r19, 0x0114(r29) 0x00181B58: lw r18, 0x0110(r29) 0x00181B5C: lw r17, 0x010C(r29) 0x00181B60: lw r16, 0x0108(r29) 0x00181B64: addiu r29, r29, 0x0130 0x00181B68: jr r31 0x00181B6C: nop