Store status,modified ENTD for current attack
Jump to navigation
Jump to search
------------------------------------- Need : r4 = Target unit ID r5 = 0x00 or ? used in Modify_Status_Inflictions (as r4) ------------------------------------- Summary here 0018e310: 27bdffd0 addiu r29,r29,0xffd0 0018e314: afb3001c sw r19,0x001c(r29) 0018e318: 00809821 addu r19,r4,r0 |r19 = r4 (Target unit ID) 0018e31c: afb60028 sw r22,0x0028(r29) 0018e320: 00a0b021 addu r22,r5,r0 |r22 = r5 (r0 from two jal investigated) 0018e324: afb10014 sw r17,0x0014(r29) 0018e328: 00008821 addu r17,r0,r0 |r17 = 0x00 Status counter (counter from 0x00 to 0x27 = 40 loops) 0018e32c: afb50024 sw r21,0x0024(r29) 0018e330: 0000a821 addu r21,r0,r0 |r21 = 0x00 (counter + 0x0010 each turn ? ) 0018e334: afb40020 sw r20,0x0020(r29) 0018e338: 3c148006 lui r20,0x8006 0018e33c: 26945def addiu r20,r20,0x5def |r20 = 1st status "can't stack on" flags 1 0018e340: 001310c0 sll r2,r19,0x03 |r2 = Target ID * 8 0018e344: 00531023 subu r2,r2,r19 |r2 = Target ID * 7 0018e348: 00021180 sll r2,r2,0x06 |r2 = Target ID * 448 0018e34c: 3c038019 lui r3,0x8019 0018e350: 246308cc addiu r3,r3,0x08cc |r3 = 0x801908cc (1st unit data pointer) 0018e354: 00432021 addu r4,r2,r3 |r4 = Target Data pointer 0018e358: 2463018c addiu r3,r3,0x018c |r3 = 1st unit action data pointer 0018e35c: 00431021 addu r2,r2,r3 |r2 = Target current action (TCA) data pointer 0018e360: afbf002c sw r31,0x002c(r29) 0018e364: afb20018 sw r18,0x0018(r29) 0018e368: afb00010 sw r16,0x0010(r29) 0018e36c: 3c018019 lui r1,0x8019 0018e370: a03338c1 sb r19,0x38c1(r1) |Store target ID in current ability section at 0x801938c1 0018e374: 3c018019 lui r1,0x8019 0018e378: ac242d98 sw r4,0x2d98(r1) |Store Target data pointer in current ability section at 0x80192d98 0018e37c: 3c018019 lui r1,0x8019 0018e380: ac222d90 sw r2,0x2d90(r1) |Store TCA data pointer in current ability section at 0x80192d90 0018e384: 06210002 bgez r17,0x0018e390 @# LOOP 1 - If r17 < 0x00 / Branch if >= 0x00 (40 loops - 1 per statuses) three counter r17 step 0x01 and r20,r21 step 0x10 0018e388: 02201021 addu r2,r17,r0 |r2 = r17 (0x00 to 0x27) 0018e38c: 26220007 addiu r2,r17,0x0007 |r2 = r17 + 0x0007 (? never true) 0018e390: 000280c3 sra r16,r2,0x03 |r16 = r2/8 (Status set offset - will be equal at 0x01 at the 9th loop : check all sets) 0018e394: 32240007 andi r4,r17,0x0007 |r4 = 7 lasts nimbles of r17 (cycle from 0 to 7) 0018e398: 34030080 ori r3,r0,0x0080 |r3 = 0x80 0018e39c: 3c028019 lui r2,0x8019 0018e3a0: 8c422d90 lw r2,0x2d90(r2) |r2 = TCA data pointer 0018e3a4: 00831807 srav r3,r3,r4 |r3 = r3/2^r4 (r3 = 0x80 0x40 .... 0x01 - check all statuses from each set while looping) 0018e3a8: 00501021 addu r2,r2,r16 |r2 = r2 + r16 (TCA data pointer + status set offset (0x00 to 0x04 while looping)) 0018e3ac: 9042001b lbu r2,0x001b(r2) |r2 = CURRENT ATTACK STATUS INFLICTION 1 + set offset (0x001b to 0x001f) 0018e3b0: 00000000 nop 0018e3b4: 00431024 and r2,r2,r3 |r2 = CHECKED STATUS from checked set (each statuses while looping) 0018e3b8: 10400076 beq r2,r0,0x0018e594 #If checked status is inflicted - current action 0x001b (r2 <> 0x00) / Else branch to |next status 0018e3bc: 00609021 addu r18,r3,r0 |r18 = r3 (0x80 to 0x0) = checked status byte 0018e3c0: 00003821 addu r7,r0,r0 |r7 = 0x00 0018e3c4: 00002021 addu r4,r0,r0 |r4 = 0x00 - Loop 2 counter 0018e3c8: 3c068019 lui r6,0x8019 0018e3cc: 8cc62d98 lw r6,0x2d98(r6) |r6 = Target data pointer 0018e3d0: 02802821 addu r5,r20,r0 |r5 = r20 ("status can't stack on" flag 1) - will increased by 0x0010 each loop (matching statuses table) 0018e3d4: 00c41021 addu r2,r6,r4 @LOOP 2 - r2 = Target data pointer + loop 2 offset // (5 loops) 0018e3d8: 904201bb lbu r2,0x01bb(r2) |r2 = TARGET INFLICTED STATUS LIST (0x01bb to 0x01bf while looping) 0018e3dc: 90a30000 lbu r3,0x0000(r5) |r3 = CHECKED STATUS "status can't stack on" flag 1 (to 5 while looping) 0018e3e0: 00000000 nop 0018e3e4: 00431024 and r2,r2,r3 |r2 <> 0x00 if Checked status can't stack on some inflicted status from checked list 0018e3e8: 1440002c bne r2,r0,0x0018e49c |#If r2 = 0x00 - Checked status can stack on checked inflicted status list / Else branch avoiding other checks 0018e3ec: 24840001 addiu r4,r4,0x0001 |r4 = r4 + 0x01 0018e3f0: 28820005 slti r2,r4,0x0005 |r2 = 0x01 if r4 < 0x0005 (5 loops) 0018e3f4: 1440fff7 bne r2,r0,0x0018e3d4 > Loop while r2 <> 0x00 0018e3f8: 24a50001 addiu r5,r5,0x0001 |r5 = r5 + 0x0001 (next "can't stack on" byte) 0018e3fc: 14e00065 bne r7,r0,0x0018e594 W #if r7 = 0x00 stay Else branch to next status (If checked status can't stack, the routine come back here with r7 = 0x01) 0018e400: 00002021 addu r4,r0,r0 |r4 = 0x00 (loop 3 counter) 0018e404: 3c028006 lui r2,0x8006 0018e408: 24425dea addiu r2,r2,0x5dea |r2 = 1st status cancel's flag 1 0018e40c: 02a22821 addu r5,r21,r2 |r5 = Checked status cancel's flags 1(r21 = counter with step 0x10) 0018e410: 3c028019 lui r2,0x8019 @ LOOP 3 (store the 5 cancel's status flag from checked status in action removal status) 0018e414: 8c422d90 lw r2,0x2d90(r2) |r2 = TCA data pointer 0018e418: 90a30000 lbu r3,0x0000(r5) |r3 = Checked status cancel's flag 1 to 5 (while looping) 0018e41c: 00441021 addu r2,r2,r4 |r2 = TCA data pointer + offset (0x00 to 0x04) 0018e420: 24840001 addiu r4,r4,0x0001 |r4 = r4 + 1 0018e424: a0430020 sb r3,0x0020(r2) |Store canceled status in TCA status removal (1 to 5 while looping) 0018e428: 28820005 slti r2,r4,0x0005 |r2 = 0x01 while r4 < 0x05 (counter and offset for TCA's status removal 1 to 5) 0018e42c: 1440fff8 bne r2,r0,0x0018e410 > Loop while r2 <> 0x00 (5 cycles) 0018e430: 24a50001 addiu r5,r5,0x0001 |r5 = r5 + 1 (offset for checked status cancel's flags) 0018e434: 0c0612c9 jal 0x00184b24 |-->Modify_Status_Inflictions (Nullify somes statuses from current action infliction/removal bytes) return r2 = 0x00 if no statuses are inflicted 0018e438: 02c02021 addu r4,r22,r0 |r4 = r22 ???? Inherited from previous routines (checked = 0x00) 0018e43c: 0c063892 jal 0x0018e248 |-->Inflicted_status_CT_setting,_xfer_last_used_CT - Check Unit 0x01ac (current action removing status) and update what's needed 0018e440: 02602021 addu r4,r19,r0 |r4 = r19 (Target ID) 0018e444: 3c038019 lui r3,0x8019 0018e448: 8c632d98 lw r3,0x2d98(r3) |r3 = Target data pointer 0018e44c: 00000000 nop 0018e450: 00701821 addu r3,r3,r16 |r3 = Target data pointer + status set offset (matching checked status) 0018e454: 907001bb lbu r16,0x01bb(r3) |r16 = Target status infliction list 1 to 5 (while looping - matching checked status) 0018e458: 02202821 addu r5,r17,r0 |r5 = r17 (Loop1 counter : 0x00 to 0x27) 0018e45c: 02121025 or r2,r16,r18 |r2 = Target status infliction list 1 to 5 updated with checked status 0018e460: a06201bb sb r2,0x01bb(r3) |Store updated status infliction list (unit 0x01bb) 0018e464: 3c048019 lui r4,0x8019 0018e468: 8c842d98 lw r4,0x2d98(r4) |r4 = Target data pointer 0018e46c: 0c0176dc jal 0x0005db70 |-->Status_CT_Setting return r2 = 0x00 (0xffff if DS re-inflicted) 0018e470: 00003021 addu r6,r0,r0 |r6 = 0x00 0018e474: 14400047 bne r2,r0,0x0018e594 #If r2 = 0x00 (from jal above) / Else branch to next next status (r2 = 0x00 if checked status is not death sentence being re-inflicted) 0018e478: 02121024 and r2,r16,r18 |r2 <> 0x00 if Checked status is already in inflicted list 0018e47c: 10400009 beq r2,r0,0x0018e4a4 #If r2 <> 0x00 ( if Checked status is already in inflicted list unit 0x01bb ) / Else branch 0018e480: 34020001 ori r2,r0,0x0001 |r2 = 0x01 0018e484: 12220007 beq r17,r2,0x0018e4a4 #If Status is not crystal (LOOP1 counter <> 0x01 ) / Else branch 0018e488: 34020010 ori r2,r0,0x0010 |r2 = 0x10 0018e48c: 12220005 beq r17,r2,0x0018e4a4 #If status is not treasure (LOOP 1 counter <> 0x10) / Else branch 0018e490: 26240001 addiu r4,r17,0x0001 |r4 = LOOP1 counter +1 0018e494: 0806392b j 0x0018e4ac |>> Jump (keeping r5 at 0x0002) to next jal 0018e498: 34050002 ori r5,r0,0x0002 |r5 = 0x0002 (skip next jal - r5 = 2 if already inflicted and not crystal nor treasure) 0018e49c: 080638ff j 0x0018e3fc (( << Jump back to r7 check between loop2 and loop3 - Landing site of jump for checked status that "can't stack on" )) 0018e4a0: 34070001 ori r7,r0,0x0001 ((r7 = 0x01)) - those two lines are inserted here (island like - ronly reachable from 18e3e8) 0018e4a4: 26240001 addiu r4,r17,0x0001 |r4 = LOOP1 counter +1 0018e4a8: 34050001 ori r5,r0,0x0001 |r5 = 0x0001 (status is crystal or treasure or already in 0018e4ac: 0c063a6f jal 0x0018e9bc E# E# E# -->Determine_if_Status_Flags_can_be_Enabled 0018e4b0: 02603021 addu r6,r19,r0 |r6 = Target ID 0018e4b4: 34020013 ori r2,r0,0x0013 |r2 = 0x0013 0018e4b8: 16220005 bne r17,r2,0x0018e4d0 # If Status X is transparent (loop1 counter = 0x13) 0018e4bc: 34050009 ori r5,r0,0x0009 |r5 = 0x0009 0018e4c0: 3c028019 lui r2,0x8019 0018e4c4: 8c422d98 lw r2,0x2d98(r2) |r2 = Target data pointer 0018e4c8: 00000000 nop 0018e4cc: a0400027 sb r0,0x0027(r2) |Store not target turn ? 0018e4d0: 12250003 beq r17,r5,0x0018e4e0 # If Status X is not invite (loop counter <> 0x09) Branch if = 0x09 0018e4d4: 34020022 ori r2,r0,0x0022 |r2 = 0x0022 0018e4d8: 16220021 bne r17,r2,0x0018e560 |# If status is Charm (loop counter = 0x22) Else branch skipping team section 0018e4dc: 00000000 nop 0018e4e0: 3c048019 lui r4,0x8019 E# (if the code is here status X is invite or charm) 0018e4e4: 8c842d98 lw r4,0x2d98(r4) |r4 = Target data pointer 0018e4e8: 3c028019 lui r2,0x8019 0018e4ec: 8c422d94 lw r2,0x2d94(r2) |r2 = Attacker data pointer 0018e4f0: 90830005 lbu r3,0x0005(r4) |r2 = Target ENTD flag 0018e4f4: 90420005 lbu r2,0x0005(r2) |r2 = Attacker ENTD flag 0018e4f8: 306300cf andi r3,r3,0x00cf |r3 = Target ENTD flag with team filter out 0018e4fc: 30420030 andi r2,r2,0x0030 |r2 = Attacker's team 0018e500: 00628025 or r16,r3,r2 |r16 = Target ENTD flags + Attacker team 0018e504: 16250016 bne r17,r5,0x0018e560 |# If Status X is invite (branch if charm) 0018e508: a0900005 sb r16,0x0005(r4) |store Target ENTD flags (with new team) 0018e50c: 3c058019 lui r5,0x8019 0018e510: 8ca52d98 lw r5,0x2d98(r5) |r5 = Target data pointer 0018e514: 3c028019 lui r2,0x8019 0018e518: 8c422d94 lw r2,0x2d94(r2) |r2 = Attacker data pointer 0018e51c: 3c048019 lui r4,0x8019 0018e520: 8c842d90 lw r4,0x2d90(r4) |r4 = Target current action data pointer 0018e524: 90a301ba lbu r3,0x01ba(r5) |r3 = Target modified ENTD flags 0018e528: 90420005 lbu r2,0x0005(r2) |r2 = Attacker ENTD flags 0018e52c: a480000e sh r0,0x000e(r4) |Nullify target reaction 0018e530: 306300c7 andi r3,r3,0x00c7 |r3 = Target modified ENTD flags with team and control filterd out 0018e534: 30420030 andi r2,r2,0x0030 |r2 = Attacker team 0018e538: 00628025 or r16,r3,r2 |r16 = Target modified ENTD flags without control and with attacker team 0018e53c: a0b001ba sb r16,0x01ba(r5) |Store Target modified ENTD (switch team and lost control) 0018e540: 3c028019 lui r2,0x8019 0018e544: 8c422d98 lw r2,0x2d98(r2) |r2 = Target data pointer 0018e548: 00000000 nop 0018e54c: a04001b8 sb r0,0x01b8(r2) |Nullify target auto battle flag 0018e550: 3c028019 lui r2,0x8019 0018e554: 8c422d98 lw r2,0x2d98(r2) |r2 = Target data pointer 0018e558: 00000000 nop 0018e55c: a04001b9 sb r0,0x01b9(r2) |Nullify target main target ID 0018e560: 3c028019 lui r2,0x8019 0018e564: 8c422d98 lw r2,0x2d98(r2) |r2 = Target data pointer 0018e568: 00000000 nop 0018e56c: 904201ba lbu r2,0x01ba(r2) |r2 = Target modified ENTD flags 0018e570: 00000000 nop 0018e574: 30420030 andi r2,r2,0x0030 |r2 = Target team 0018e578: 14400006 bne r2,r0,0x0018e594 |#If target team = 0x00 (player team) 0018e57c: 2622ffff addiu r2,r17,0xffff |r2 = Loop counter -1 0018e580: 2c420002 sltiu r2,r2,0x0002 |r2 = 1 if statux X is Crystal or Death 0018e584: 10400003 beq r2,r0,0x0018e594 |If Statux X is crystal or death 0018e588: 34020001 ori r2,r0,0x0001 |r2 = 0x01 0018e58c: 3c018019 lui r1,0x8019 0018e590: a0223898 sb r2,0x3898(r1) |store 0x01 at 80193898 (?) 0018e594: 26b50010 addiu r21,r21,0x0010 |r21 + 0x10 Status table offset 0018e598: 26310001 addiu r17,r17,0x0001 |r17 + 0x01 Status counter 0018e59c: 2a220028 slti r2,r17,0x0028 |Check counter limit (r2 = 0x00 if above) 0018e5a0: 1440ff78 bne r2,r0,0x0018e384 >LOOP1 0018e5a4: 26940010 addiu r20,r20,0x0010 |r20 + 0x10 Status table offset 0018e5a8: 3c048019 lui r4,0x8019 0018e5ac: 8c842d98 lw r4,0x2d98(r4) |r4 = Target pointer 0018e5b0: 0c0179d1 jal 0x0005e744 |-->Store_Current_Statuses Store Target 0x1bb + Innate target statuses (0x004e) in current target status (0x0058) 0018e5b4: 00000000 nop 0018e5b8: 8fbf002c lw r31,0x002c(r29) 0018e5bc: 8fb60028 lw r22,0x0028(r29) 0018e5c0: 8fb50024 lw r21,0x0024(r29) 0018e5c4: 8fb40020 lw r20,0x0020(r29) 0018e5c8: 8fb3001c lw r19,0x001c(r29) 0018e5cc: 8fb20018 lw r18,0x0018(r29) 0018e5d0: 8fb10014 lw r17,0x0014(r29) 0018e5d4: 8fb00010 lw r16,0x0010(r29) 0018e5d8: 27bd0030 addiu r29,r29,0x0030 0018e5dc: 03e00008 jr r31 0018e5e0: 00000000 nop
Return location
0018e120: Post_Ability_Hardcoding?
Summary
Check each status (loop1 40 cycles) If check status (status X) is not in Current action 0x001b (to 0x001f) go to next status |If Status X can't stack on target inflicted status list (0x01bb to 0x01bf - through loop 2) go to next status (with a weird double jump) |Add Every Statuses canceled by Status X in current action status removal (0x0020 to 0x0024) |Call a few routine to process those new statuses removal Modify_Status_Inflictions Inflicted_status_CT_setting,_xfer_last_used_CT |Update Target 0x01bb with status X |Status_CT_Setting |Determine_if_Status_Flags_can_be_Enabled with r5 = 0x01 (enable) or 0x02 (if already inflicted not crystal nor treasure status X - will skip the routine) |If Status X is transparent : set unit 0x27 = 0x00 (not unit turn ?) |If Status X is invite or charm : deal with team issues |If Team is 0x00 (player team) and status X is crystal or dead : store 0x01 at 0x80193898 (? sprite related ? ) Store_Current_Statuses store target 0x01bb and innate target statuses in current target statuses (0x058)