Calculate Reaction Targetting & Usage
(Redirected from Main reaction routine)
Jump to navigation
Jump to search
Returns: 8018f5f0 0 if no reaction 1 if reaction occurs
0017e178: 27bdffd0 addiu r29,r29,0xffd0 0017e17c: afb50024 sw r21,0x0024(r29) 0017e180: 0080a821 addu r21,r4,r0 0017e184: 3c038019 lui r3,0x8019 0017e188: 8c63f8c8 lw r3,-0x0738(r3) 0017e18c: 2402ffff addiu r2,r0,0xffff 0017e190: afbf002c sw r31,0x002c(r29) 0017e194: afb60028 sw r22,0x0028(r29) 0017e198: afb40020 sw r20,0x0020(r29) 0017e19c: afb3001c sw r19,0x001c(r29) 0017e1a0: afb20018 sw r18,0x0018(r29) 0017e1a4: afb10014 sw r17,0x0014(r29) 0017e1a8: 106200ee beq r3,r2,0x 0017e564 branch if acting unit ID does not exist 0017e1ac: afb00010 sw r16,0x0010(r29) return r2= 0xff 0017e1b0: 00009821 addu r19,r0,r0 0017e1b4: 34140001 ori r20,r0,0x0001 0017e1b8: 2416ffff addiu r22,r0,0xffff r22 = -0x01
<Loop>
0017e1bc: 3c028019 lui r2,0x8019 0017e1c0: 8c42f8c8 lw r2,-0x0738(r2) load acting unit ID 0017e1c4: 3c018019 lui r1,0x8019 0017e1c8: ac20f5f0 sw r0,-0x0a10(r1) Set attack phase - initial attack 0017e1cc: 126200de beq r19,r2,0x 0017e548 branch if considered unit = acting unit 0017e1d0: 001310c0 sll r2,r19,0x03 0017e1d4: 00531023 subu r2,r2,r19 0017e1d8: 00021180 sll r2,r2,0x06 0017e1dc: 3c038019 lui r3,0x8019 0017e1e0: 246308cc addiu r3,r3,0x08cc r4 = unit data 0017e1e4: 00438821 addu r17,r2,r3 0017e1e8: 02202021 addu r4,r17,r0 0017e1ec: 0c0604c3 jal 0x0018130c Weapon Guard Usability (check if unit can react) 0017e1f0: 2632016e addiu r18,r17,0x016e r18 = targeting data 0017e1f4: 144000d4 bne r2,r0,0x 0017e548 branch if defending unit can't react 0017e1f8: 340200ff ori r2,r0,0x00ff return 0xff 0017e1fc: 92230001 lbu r3,0x0001(r17) load unit ID 0017e200: 00000000 nop 0017e204: 106200d0 beq r3,r2,0x 0017e548 branch if unit doesn't exist 0017e208: 00000000 nop 0017e20c: 0c06325a jal 0x0018c968 Check if unit can react 0017e210: 02202021 addu r4,r17,r0 0017e214: 9630019a lhu r16,0x019a(r17) load reaction ID 0017e218: 14400006 bne r2,r0,0x 0017e234 branch if unit doesn't/can't reacts 0017e21c: 3203ffff andi r3,r16,0xffff r3 = reaction ID 0017e220: 3c028019 lui r2,0x8019 0017e224: 8c42f5fc lw r2,-0x0a04(r2) load control value 0017e228: 00000000 nop 0017e22c: 14540004 bne r2,r20,0x 0017e240 branch if reacting is allowed (not = 01) 0017e230: 00000000 nop
0017e234: 340201b8 ori r2,r0,0x01b8 0017e238: 146200c3 bne r3,r2,0x 0017e548 branch if reaction is not "reflect" 0017e23c: 00000000 nop 0017e240: 120000c1 beq r16,r0,0x 0017e548 branch if reaction ID = 0 0017e244: 00000000 nop 0017e248: 3c058019 lui r5,0x8019 0017e24c: 24a53848 addiu r5,r5,0x3848 r5 = units targetting data address 0017e250: 3c018019 lui r1,0x8019 0017e254: ac34f5f0 sw r20,-0x0a10(r1) store 01 into control value 0017e258: 0c01788b jal 0x0005e22c Transfer Target ID? Through Mount Data 0017e25c: 02402021 addu r4,r18,r0 jump to transfer target data 0017e260: 3c018019 lui r1,0x8019 0017e264: a4302d9c sh r16,0x2d9c(r1) store reaction ID 0017e268: a2530000 sb r19,0x0000(r18) store counter = target ID? 0017e26c: a2400001 sb r0,0x0001(r18) store last skillset used = 0 0017e270: 3c028019 lui r2,0x8019 0017e274: 94422d9c lhu r2,0x2d9c(r2) load reaction ID 0017e278: 34100001 ori r16,r0,0x0001 0017e27c: a6420002 sh r2,0x0002(r18) store reaction ID as last attack used 0017e280: 2442fe4e addiu r2,r2,0xfe4e reaction ID - 1b2 0017e284: 00021400 sll r2,r2,0x10 0017e288: 00021c03 sra r3,r2,0x10 0017e28c: 962601b2 lhu r6,0x01b2(r17) load last attack on self byte 0017e290: 2c620009 sltiu r2,r3,0x0009 set if reaction ID is between 0x1b2 and 0x1bb? 0017e294: 10400057 beq r2,r0,0x 0017e3f4 branch if not 0017e298: a620019a sh r0,0x019a(r17) store reaction ID = 0 0017e29c: 00031080 sll r2,r3,0x02 0017e2a0: 3c018017 lui r1,0x8017 0017e2a4: 00220821 addu r1,r1,r2 0017e2a8: 8c224120 lw r2,0x4120(r1) 0017e2ac: 00000000 nop 0017e2b0: 00400008 jr r2 0017e2b4: 00000000 nop
Table referred to in above code:
00174120: 8017e2d0 - Meatbone 00174124: 8017e2f8 - Counter magic 00174128: 8017e30c - Counter Tackle 0017412c: 8017e31c - Counter Flood 00174130: 8017e3f4 - Absorb used Mp 00174134: 8017e3f4 - Gilgame Heart 00174138: 8017e2b8 - Reflect 0017413c: 8017e360 - Auto Potion 00174140: 8017e3d0 - Counter
Reflect
0017e2b8: 0c05f964 jal 0x 0017e590 Counter magic targeting? 0017e2bc: 02202021 addu r4,r17,r0 0017e2c0: 2c420001 sltiu r2,r2,0x0001 Set r2 = 1 if reflect succeeded 0017e2c4: 00021023 subu r2,r0,r2 r2 = 0 if reflect failed, r2 = -0x1 if reflect succeeded 0017e2c8: 0805f906 j 0x 0017e418 0017e2cc: 30500003 andi r16,r2,0x0003 r16 = 0 if reflect failed, r16 = 0x03 if it succeeded
Meatbone Slash
0017e2d0: 02202021 addu r4,r17,r0 0017e2d4: 34050001 ori r5,r0,0x0001 skillset = attack 0017e2d8: 00003021 addu r6,r0,r0 ability = attack 0017e2dc: 0c05f994 jal 0x 0017e650 Store counter ability? 0017e2e0: 34070001 ori r7,r0,0x0001 0017e2e4: 14400041 bne r2,r0,0x 0017e3ec branch if ?? 0017e2e8: 34020005 ori r2,r0,0x0005 0017e2ec: a2540001 sb r20,0x0001(r18) store last used skillset as 1 (attack) 0017e2f0: 0805f906 j 0x 0017e418 0017e2f4: a242000a sb r2,0x000a(r18) store reaction ID = 05? (tile specific? can't attack someone out of range with meatbone slash?)
Counter Magic
0017e2f8: 02202021 addu r4,r17,r0 0017e2fc: 3405000b ori r5,r0,0x000b skillset = black magic 0017e300: 00063400 sll r6,r6,0x10 0017e304: 0805f8d3 j 0x 0017e34c 0017e308: 00063403 sra r6,r6,0x10 ability = last attack received
Counter Tackle
0017e30c: 02202021 addu r4,r17,r0 0017e310: 3405000b ori r5,r0,0x000b skillset = black magic? 0017e314: 0805f8f7 j 0x 0017e3dc 0017e318: 34060093 ori r6,r0,0x0093 store ability = dash
Counter Flood
0017e31c: 0c060428 jal 0x001810a0 Map Location Calculation 0017e320: 02202021 addu r4,r17,r0 0017e324: 02202021 addu r4,r17,r0 0017e328: 000210c0 sll r2,r2,0x03 0017e32c: 3c018019 lui r1,0x8019 0017e330: 00220821 addu r1,r1,r2 0017e334: 9022f8cc lbu r2,-0x0734(r1) load tile data 0017e338: 34050011 ori r5,r0,0x0011 skillset = elemental 0017e33c: 3042003f andi r2,r2,0x003f 0017e340: 3c018006 lui r1,0x8006 0017e344: 00220821 addu r1,r1,r2 0017e348: 9026e9d0 lbu r6,-0x1630(r1) get counter flood ability 0017e34c: 0c05f994 jal 0x 0017e650 Store counter ability? 0017e350: 00003821 addu r7,r0,r0 0017e354: 2c420001 sltiu r2,r2,0x0001 if can store ability, 1. 0017e358: 0805f906 j 0x 0017e418 0017e35c: 00028040 sll r16,r2,0x01 r16 = 2 if could store, otherwise 0.
Auto Potion
0017e360: 0c05f9e0 jal 0x 0017e780 Auto Potion Routine 0017e364: 02202021 addu r4,r17,r0 0017e368: 00401821 addu r3,r2,r0 0017e36c: 1076001f beq r3,r22,0x 0017e3ec branch if autopotion returned r22? (banned inventory ID? or -0x1?) 0017e370: 34020006 ori r2,r0,0x0006 0017e374: a2420001 sb r2,0x0001(r18) store 06 as used skillset ID? (attack) 0017e378: 34020005 ori r2,r0,0x0005 0017e37c: a2430008 sb r3,0x0008(r18) store used item ID 0017e380: a242000a sb r2,0x000a(r18) store tile specific into 0x178 in unit data 0017e384: a253000b sb r19,0x000b(r18) Store Target ID (0x11) 0017e388: 92220047 lbu r2,0x0047(r17) load X coordinate 0017e38c: 00000000 nop 0017e390: a642000c sh r2,0x000c(r18) store as target X coordinate 0017e394: 92220048 lbu r2,0x0048(r17) load Y coordinate 0017e398: 02402021 addu r4,r18,r0 r4 = address to 0x16e in unit data 0017e39c: a6420010 sh r2,0x0010(r18) store as target Y coordinate 0017e3a0: 96220048 lhu r2,0x0048(r17) load map level 0017e3a4: 34100002 ori r16,r0,0x0002 r16 = 2 0017e3a8: 000213c2 srl r2,r2,0x0f 0017e3ac: 0c05f0f7 jal 0x 0017c3dc Jump to set status flags for display 0017e3b0: a642000e sh r2,0x000e(r18) store map level 0017e3b4: 00401821 addu r3,r2,r0 0017e3b8: 340201b9 ori r2,r0,0x01b9 0017e3bc: 1076000b beq r3,r22,0x 0017e3ec jump if returned value doesn't equal r22? (-0x1?) 0017e3c0: a6220170 sh r2,0x0170(r17) store last attack used = 0x1b9 (auto potion) 0017e3c4: 2462fffe addiu r2,r3,0xfffe -0x3 (?) 0017e3c8: 0805f8f9 j 0x 0017e3e4 0017e3cc: 2c420002 sltiu r2,r2,0x0002 r2 = 1 always ?
Counter
0017e3d0: 02202021 addu r4,r17,r0 0017e3d4: 34050001 ori r5,r0,0x0001 0017e3d8: 00003021 addu r6,r0,r0 Counter ability = attack 0017e3dc: 0c05f994 jal 0x 0017e650 Store counter ability? 0017e3e0: 34070001 ori r7,r0,0x0001 0017e3e4: 1040000d beq r2,r0,0x 0017e41c if couldn't store counter ability (?), otherwise branch 0017e3e8: 2602ffff addiu r2,r16,0xffff r2 = 0 0017e3ec: 0805f906 j 0x 0017e418 0017e3f0: 00008021 addu r16,r0,r0 r16 = 0 (don't check silence/frog/mp)
All other reactions
0017e3f4: 3c028019 lui r2,0x8019 0017e3f8: 84422d9c lh r2,0x2d9c(r2) load current reaction ID 0017e3fc: 3c018006 lui r1,0x8006 0017e400: 00220821 addu r1,r1,r2 0017e404: 9022ea2a lbu r2,-0x15d6(r1) load reaction flags 0017e408: 00000000 nop 0017e40c: 30420030 andi r2,r2,0x0030 active/passive flag check? 0017e410: 2c420001 sltiu r2,r2,0x0001 1 if not active/passive 0017e414: 00028023 subu r16,r0,r2 r16 = -1 if not active/passive. 0 otherwise There's smth weird going on with r16 here, I'm going to note down its interactions with the below, and you can form your own opinions: r16 < 0: do not check if unit can use ability (frog, silence, mp cost), do not transfer target data, do not set weapon data reactions with this result: A-Save, MA-Save, Speed save, sunken state, caution, Dragon Spirit, Regenerator, brave UP, Face UP, Hp restore, MP restore, Critical Quick, Absorb used MP, Gilgame Heart, Distribute, Damage Split (reactions outside 0x1b2 and 0x1ba with neither passive/active flags set) r16 = 0: Do not check if unit can use ability, transfer unit data, do not set weapon data reactions with this result: Any reaction that fails and any reactions that fall outside the range of ID = 0x1b2 - 0x1ba with passive/active flags set r16 = 1 or 2: Checks if unit can use ability (frog, silence, mp cost), do not transfer target data, set weapon data Reactions with this result: Auto Potion (2), Counter Flood (2), Counter Magic (2), Counter tackle (2), Meatbone slash (1) r16 = 3: Do not check if unit can use ability, do not transfer unit data, set weapon data Reactions with this result: Reflect
0017e418: 2602ffff addiu r2,r16,0xffff r2 = r16 - 1 0017e41c: 2c420002 sltiu r2,r2,0x0002 set r2 = true if r16 = 2, or 1. 0017e420: 10400006 beq r2,r0,0x 0017e43c branch if r16 <> 1 or 2 0017e424: 00000000 nop 0017e428: 0c05f688 jal 0x 0017da20 Half of MP/MP cost section if r16 = 1 or 2 0017e42c: 02202021 addu r4,r17,r0 0017e430: 10400002 beq r2,r0,0x 0017e43c branch if unit can use ability 0017e434: 00000000 nop 0017e438: 00008021 addu r16,r0,r0 set r16 = 0 if unit just can't today. 0017e43c: 16000007 bne r16,r0,0x 0017e45c branch if r16 <> 0 0017e440: 2602ffff addiu r2,r16,0xffff r2 = r16 - 1 0017e444: 3c048019 lui r4,0x8019 0017e448: 24843848 addiu r4,r4,0x3848 0017e44c: 0c01788b jal 0x0005e22c transfer target data if r16 = 0 0017e450: 02402821 addu r5,r18,r0 0017e454: 0805f953 j 0x 0017e54c jump to end 0017e458: 26730001 addiu r19,r19,0x0001 r19 + 1
0017e45c: 2c420003 sltiu r2,r2,0x0003 set if r16 = 3, 2, or 1 0017e460: 10400005 beq r2,r0,0x 0017e478 branch if r16 = -1 0017e464: 00000000 nop 0017e468: 0c05f528 jal 0x 0017d4a0 Current Action Ability Data Setting / Multi Hit Formulas - if r16 = 1, 2, 3 0017e46c: 02202021 addu r4,r17,r0 0017e470: 0805f94c j 0x 0017e530 0017e474: 00000000 nop
0017e478: 3c018019 lui r1,0x8019 if r16 = -1 0017e47c: a03438c2 sb r20,0x38c2(r1) Store # of hits as 1 0017e480: 3c018019 lui r1,0x8019 0017e484: a02038c3 sb r0,0x38c3(r1) Store weapon Hand (Right) 0017e488: 3c018019 lui r1,0x8019 0017e48c: a42038c8 sh r0,0x38c8(r1) clear post action (reaction flag?) 0017e490: 3c018019 lui r1,0x8019 0017e494: a02038ed sb r0,0x38ed(r1) store no poach 0017e498: 9222001d lbu r2,0x001d(r17) 0017e49c: 3c018019 lui r1,0x8019 0017e4a0: a02238c4 sb r2,0x38c4(r1) store right arm equip 0017e4a4: 9222001f lbu r2,0x001f(r17) 0017e4a8: 3c018019 lui r1,0x8019 0017e4ac: a02238c5 sb r2,0x38c5(r1) store left arm equip 0017e4b0: 34020005 ori r2,r0,0x0005 0017e4b4: a2400001 sb r0,0x0001(r18) store last skillset used = 0 0017e4b8: a242000a sb r2,0x000a(r18) store reaction as tile specific 0017e4bc: a253000b sb r19,0x000b(r18) store target ID 0017e4c0: 3c038019 lui r3,0x8019 0017e4c4: 84632d9c lh r3,0x2d9c(r3) load reaction ID 0017e4c8: 340201be ori r2,r0,0x01be 0017e4cc: 1462000e bne r3,r2,0x 0017e508 branch if not damage split
Damage split (shift target to attacker)
0017e4d0: 00000000 nop 0017e4d4: 3c028019 lui r2,0x8019 0017e4d8: 9042f8c8 lbu r2,-0x0738(r2) load acting unit ID 0017e4dc: 00000000 nop 0017e4e0: a242000b sb r2,0x000b(r18) store acting unit ID as target ID 0017e4e4: 3c038019 lui r3,0x8019 0017e4e8: 8c63f8c8 lw r3,-0x0738(r3) load acting unit ID 0017e4ec: 00000000 nop 0017e4f0: 000310c0 sll r2,r3,0x03 0017e4f4: 00431023 subu r2,r2,r3 0017e4f8: 00021180 sll r2,r2,0x06 0017e4fc: 3c038019 lui r3,0x8019 0017e500: 246308cc addiu r3,r3,0x08cc 0017e504: 00438821 addu r17,r2,r3 r17 = acting unit's data
0017e508: 92220047 lbu r2,0x0047(r17) load target X coordinate 0017e50c: 00000000 nop 0017e510: a642000c sh r2,0x000c(r18) store target X coordinate in target data 0017e514: 92220048 lbu r2,0x0048(r17) Load target Y coordinate 0017e518: 00000000 nop 0017e51c: a6420010 sh r2,0x0010(r18) store target Y coordinate in target data 0017e520: 96220048 lhu r2,0x0048(r17) load Map level 0017e524: 00000000 nop 0017e528: 000213c2 srl r2,r2,0x0f 0017e52c: a642000e sh r2,0x000e(r18) store map level 0017e530: 3c038019 lui r3,0x8019 0017e534: 94632d9c lhu r3,0x2d9c(r3) load reaction ID 0017e538: 02601021 addu r2,r19,r0 r2 = target ID 0017e53c: a6a30000 sh r3,0x0000(r21) store reaction ID onto stack 0017e540: 0805f959 j 0x 0017e564 jump to end 0017e544: a2420000 sb r2,0x0000(r18) store target ID into attacker/self ID 0017e548: 26730001 addiu r19,r19,0x0001
Loop Tail
0017e54c: 2a620015 slti r2,r19,0x0015 0017e550: 1440ff1a bne r2,r0,0x 0017e1bc Check next unit for reactions 0017e554: 2402ffff addiu r2,r0,0xffff 0017e558: 3c018019 lui r1,0x8019 0017e55c: ac20f5f0 sw r0,-0x0a10(r1) store 0 in action byte? 0017e560: a6a00000 sh r0,0x0000(r21) store 0 as reaction ID 0017e564: 8fbf002c lw r31,0x002c(r29) 0017e568: 8fb60028 lw r22,0x0028(r29) 0017e56c: 8fb50024 lw r21,0x0024(r29) 0017e570: 8fb40020 lw r20,0x0020(r29) 0017e574: 8fb3001c lw r19,0x001c(r29) 0017e578: 8fb20018 lw r18,0x0018(r29) 0017e57c: 8fb10014 lw r17,0x0014(r29) 0017e580: 8fb00010 lw r16,0x0010(r29) 0017e584: 27bd0030 addiu r29,r29,0x0030 0017e588: 03e00008 jr r31 0017e58c: 00000000 nop