Difference between revisions of "AI Target Priority Super Routine (001999c8)"
Jump to navigation
Jump to search
m (Dokurider moved page 001999c8 - 00199b94 to AI Target Priority Super Routine (001999c8): Renaming and adding new documentation) |
|||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
− | + | '''BATTLE.BIN : ''' : - AI_Target_Priority_Super_Routine_(001999c8) | |
+ | Set Priority score for each reachable tiles and store it at AI 0x5f4 as a negative value (0 - AI 0x32) | ||
+ | ------------------------------------------------------------------------------------------ | ||
+ | Parameter : Nothing | ||
+ | Return : r2 = 0x00 Default value | ||
+ | r2 = -0x01 if routine Abort while looping (Seems to be tied to [[VSync_call]] - Update screen and com back ?) | ||
+ | ------------------------------------------------------------------------------------------ | ||
+ | 001999c8: 3c02801a lui r2,0x801a | | ||
+ | 001999cc: 90420d7b lbu r2,0x0d7b(r2) |{{f/load|AI 0x19b7}} | ||
+ | 001999d0: 27bdffc8 addiu r29,r29,-0x0038 | | ||
+ | 001999d4: afb3002c sw r19,0x002c(r29) | | ||
+ | 001999d8: 3c13801a lui r19,0x801a | | ||
+ | 001999dc: 2673f3c4 addiu r19,r19,-0x0c3c |{{f/adr|0x8019f3c4 }} | ||
+ | 001999e0: afbf0034 sw r31,0x0034(r29) | | ||
+ | 001999e4: afb40030 sw r20,0x0030(r29) | | ||
+ | 001999e8: afb20028 sw r18,0x0028(r29) | | ||
+ | 001999ec: afb10024 sw r17,0x0024(r29) | | ||
− | + | {{f/sec|<nowiki>=== AI 0x19b7 <> 0x00 (resume where code returns -0x01 ?) ===</nowiki>}} | |
− | + | 001999f0: 10400019 beq r2,r0,0x00199a58 {{f/Cond|If 0x19b7 <> 0x00 }} | |
− | + | 001999f4: afb00020 sw r16,0x0020(r29) | | |
− | + | 001999f8: 3c10801a lui r16,0x801a | | |
− | + | 001999fc: 9210f3dc lbu r16,-0x0c24(r16) |{{f/load|Caster/ Focused X coordonates}} {{f/std|Could be the last coord. That caused the routine to returns -0x01}} | |
− | + | 00199a00: 3c11801a lui r17,0x801a | | |
− | + | 00199a04: 9231f3de lbu r17,-0x0c22(r17) |{{f/load|Caster/ Focused Y coordonates}} | |
− | + | 00199a08: 3c02801a lui r2,0x801a | | |
− | + | 00199a0c: 904201f1 lbu r2,0x01f1(r2) |{{f/load|AI 0xe2d}} {{f/std|Offset for reachable Tile Table (0x0 All tiles, 0x1 Closer to target, 0x2 Away from target)}} | |
− | + | 00199a10: 3c12801a lui r18,0x801a | | |
− | 001999f0: 10400019 beq r2,r0,0x00199a58 | + | 00199a14: 9252f3dd lbu r18,-0x0c23(r18) |{{f/load|Elevation}} |
− | 001999f4: afb00020 sw r16,0x0020(r29) | + | 00199a18: 000218c0 sll r3,r2,0x03 |{{f/std|ID*8}} |
− | 001999f8: 3c10801a lui r16,0x801a | + | 00199a1c: 00621821 addu r3,r3,r2 |{{f/std|ID*9}} |
− | 001999fc: 9210f3dc lbu r16,-0x0c24(r16) | + | 00199a20: 000318c0 sll r3,r3,0x03 |{{f/std|0x2ed Offset (0x48)}} |
− | 00199a00: 3c11801a lui r17,0x801a | + | 00199a24: 00731821 addu r3,r3,r19 | |
− | 00199a04: 9231f3de lbu r17,-0x0c22(r17) | + | 00199a28: 24630a74 addiu r3,r3,0x0a74 |{{f/std|Prepare pointer to reachable tiles}} |
− | 00199a08: 3c02801a lui r2,0x801a | + | 00199a2c: 001210c0 sll r2,r18,0x03 | |
− | 00199a0c: 904201f1 lbu r2,0x01f1(r2) | + | 00199a30: 00521021 addu r2,r2,r18 | |
− | 00199a10: 3c12801a lui r18,0x801a | + | 00199a34: 00021080 sll r2,r2,0x02 |{{f/std|Elevation offset (0x24)}} |
− | 00199a14: 9252f3dd lbu r18,-0x0c23(r18) | + | 00199a38: 00431021 addu r2,r2,r3 | |
− | 00199a18: 000218c0 sll r3,r2,0x03 | + | 00199a3c: 00111840 sll r3,r17,0x01 |{{f/std|Y row offset (Halfword)}} |
− | 00199a1c: 00621821 addu r3,r3,r2 | + | 00199a40: 00621821 addu r3,r3,r2 |{{f/adr|Pointer to AI Reachable Tiles (+offset based on 0xe2d)}} |
− | 00199a20: 000318c0 sll r3,r3,0x03 | + | 00199a44: 94740000 lhu r20,0x0000(r3) |{{f/load|ConsideredY row tiles flags}} |
− | 00199a24: 00731821 addu r3,r3,r19 | + | 00199a48: 080666bc j 0x00199af0 {{f/jump|Jump/Return where routines stops}} {{f/loc|*Set Priority via [[AI End of turn, in between turn, etc.]]}} |
− | 00199a28: 24630a74 addiu r3,r3,0x0a74 | + | 00199a4c: 00000000 nop | |
− | 00199a2c: 001210c0 sll r2,r18,0x03 | + | |
− | 00199a30: 00521021 addu r2,r2,r18 | + | {{f/sec|---Exit Section (reached by backward Jump)---}} |
− | 00199a34: 00021080 sll r2,r2,0x02 | + | 00199a50: 080666dd j 0x00199b74 {{f/jump|Jump to }} {{f/loc|END}} {{f/Returns|Return -0x01}} |
− | 00199a38: 00431021 addu r2,r2,r3 | + | 00199a54: 2402ffff addiu r2,r0,-0x0001 | |
− | 00199a3c: 00111840 sll r3,r17,0x01 | + | |
− | 00199a40: 00621821 addu r3,r3,r2 | + | {{f/sec|<nowiki>=== SET PRIORITY for ALL CONSIDERED TILES ===</nowiki>}} |
− | 00199a44: 94740000 lhu r20,0x0000(r3) | + | '''<nowiki>Else 19b7 = 0x00</nowiki>''' |
− | 00199a48: 080666bc j 0x00199af0 | + | 00199a58: 00009021 addu r18,r0,r0 |{{f/std|Elevation counter}} |
− | 00199a4c: 00000000 nop | + | 00199a5c: 3c01801a lui r1,0x801a | |
− | 00199a50: 080666dd j 0x00199b74 | + | 00199a60: a020f3d8 sb r0,-0x0c28(r1) |{{f/store|Reset AI 0x14}} {{f/std|?? Used AI_End_of_turn,_in_between_turn,_etc. (seems to depend on whether the caster has to move or not)}} |
− | 00199a54: 2402ffff addiu r2,r0, | + | 00199a64: 3c01801a lui r1,0x801a | |
− | 00199a58: 00009021 addu r18,r0,r0 | + | 00199a68: a020f3e1 sb r0,-0x0c1f(r1) |{{f/store|<nowiki>Set considered Skillset = 0x00 </nowiki>}} {{f/std|Tell the code This is a movement simulation only ?}} |
− | 00199a5c: 3c01801a lui r1,0x801a | + | {{f/bloop|LOOP - both elevation}} |
− | 00199a60: a020f3d8 sb r0,-0x0c28(r1) | + | 00199a6c: 92620e3b lbu r2,0x0e3b(r19) |{{f/load|Load Map Max Y}} |
− | 00199a64: 3c01801a lui r1,0x801a | + | 00199a70: 00000000 nop | |
− | 00199a68: a020f3e1 sb r0,-0x0c1f(r1) | + | 00199a74: 18400038 blez r2,0x00199b58 {{f/Cond|If Max Y is invalid : branch to}} {{f/loc|next Elevation iteration}} |
− | 00199a6c: 92620e3b lbu r2,0x0e3b(r19) | + | 00199a78: 00008821 addu r17,r0,r0 |{{f/std|Y counter}} |
− | 00199a70: 00000000 nop | + | {{f/bloop|LOOP - All Y rows}} |
− | 00199a74: 18400038 blez r2,0x00199b58 | + | 00199a7c: 92620e2d lbu r2,0x0e2d(r19) |{{f/load|AI 0xe2d}} {{f/std|Offset for reachable Tile Table (0x0 All tiles, 0x1 Closer to target, 0x2 Away from target)}} |
− | 00199a78: 00008821 addu r17,r0,r0 | + | 00199a80: 00000000 nop | |
− | 00199a7c: 92620e2d lbu r2,0x0e2d(r19) | + | 00199a84: 000218c0 sll r3,r2,0x03 | |
− | 00199a80: 00000000 nop | + | 00199a88: 00621821 addu r3,r3,r2 | |
− | 00199a84: 000218c0 sll r3,r2,0x03 | + | 00199a8c: 000318c0 sll r3,r3,0x03 |{{f/std|0xe2d Offset (0x48)}} |
− | 00199a88: 00621821 addu r3,r3,r2 | + | 00199a90: 00731821 addu r3,r3,r19 | |
− | 00199a8c: 000318c0 sll r3,r3,0x03 | + | 00199a94: 24630a74 addiu r3,r3,0x0a74 |{{f/adr|AI 0xa74 Pointer (reachable tiles) + 0xe2d (0x48)}} |
− | 00199a90: 00731821 addu r3,r3,r19 | + | 00199a98: 001210c0 sll r2,r18,0x03 | |
− | 00199a94: 24630a74 addiu r3,r3,0x0a74 | + | 00199a9c: 00521021 addu r2,r2,r18 | |
− | 00199a98: 001210c0 sll r2,r18,0x03 | + | 00199aa0: 00021080 sll r2,r2,0x02 |{{f/std|Elevation offset (0x24)}} |
− | 00199a9c: 00521021 addu r2,r2,r18 | + | 00199aa4: 00431021 addu r2,r2,r3 | |
− | 00199aa0: 00021080 sll r2,r2,0x02 | + | 00199aa8: 00111840 sll r3,r17,0x01 |{{f/std|Y offset (halfword)}} |
− | 00199aa4: 00431021 addu r2,r2,r3 | + | 00199aac: 00621821 addu r3,r3,r2 |{{f/adr|This iteration 0xa74 Pointer (Elevation and Y row) + 0xe2d offset(0x48) }} {{f/std|Reachable +/- Get closer or further offset}} |
− | 00199aa8: 00111840 sll r3,r17,0x01 | + | 00199ab0: 94740000 lhu r20,0x0000(r3) |{{f/load|This Y row tiles flags}} |
− | 00199aac: 00621821 addu r3,r3,r2 | + | 00199ab4: 00000000 nop | |
− | 00199ab0: 94740000 lhu r20,0x0000(r3) | + | 00199ab8: 12800022 beq r20,r0,0x00199b44 {{f/Cond|If no flags in this row : branch to }} {{f/loc|Next Y row}} |
− | 00199ab4: 00000000 nop | + | 00199abc: 00000000 nop | |
− | 00199ab8: 12800022 beq r20,r0,0x00199b44 | + | 00199ac0: 92620e3a lbu r2,0x0e3a(r19) |{{f/load|Load Map Max X}} |
− | 00199abc: 00000000 nop | + | 00199ac4: 00000000 nop | |
− | 00199ac0: 92620e3a lbu r2,0x0e3a(r19) | + | 00199ac8: 1840001e blez r2,0x00199b44 {{f/Cond|If Max X is invalid : branch to }} {{f/loc|Next Y row}} |
− | 00199ac4: 00000000 nop | + | 00199acc: 00008021 addu r16,r0,r0 |{{f/std|Reset X counter}} |
− | 00199ac8: 1840001e blez r2,0x00199b44 | + | 00199ad0: 02141004 sllv r2,r20,r16 |{{f/std|Shift Row flags : flag of interest is in 0x8000 position}} |
− | 00199acc: 00008021 addu r16,r0,r0 | + | {{f/bloop|LOOP - All X Tiles in row}} |
− | 00199ad0: 02141004 sllv r2,r20,r16 | + | 00199ad4: 30428000 andi r2,r2,0x8000 | |
− | 00199ad4: 30428000 andi r2,r2,0x8000 | + | 00199ad8: 10400015 beq r2,r0,0x00199b30 {{f/Cond|If This tile is OFF : branch to }} {{f/loc|Next Tile}} |
− | 00199ad8: 10400015 beq r2,r0,0x00199b30 | + | 00199adc: 00000000 nop | |
− | 00199adc: 00000000 nop | + | 00199ae0: a2700018 sb r16,0x0018(r19) |{{f/store|Save Current X}} |
− | 00199ae0: a2700018 sb r16,0x0018(r19) | + | 00199ae4: a271001a sb r17,0x001a(r19) |{{f/store|Save Current Y}} |
− | 00199ae4: a271001a sb r17,0x001a(r19) | + | 00199ae8: 0c066ec8 jal 0x0019bb20 |{{f/jal|AI_Check_if_Unit_is_a_Crystal/Treasure_(0019bb20)|AI_Check_if_Unit_is_a_Crystal/Treasure_(0019bb20)}} {{f/std|Set Value of AI 0xcbf ( 801a0083 )}} |
− | 00199ae8: 0c066ec8 jal 0x0019bb20 | + | 00199aec: a2720019 sb r18,0x0019(r19) |{{f/store|Save Current Map Level}} |
− | 00199aec: a2720019 sb r18,0x0019(r19) | + | {{f/sec|19b7 <> 0x00 jump here}} |
− | 00199af0: 0c0674df jal 0x0019d37c | + | 00199af0: 0c0674df jal 0x0019d37c |{{f/jal|AI End of turn, in between turn, etc.|AI End of turn, in between turn, etc.}} {{f/std| Set Priority score (AI 0x32) for each considered Tile}} |
− | 00199af4: 00000000 nop | + | 00199af4: 00000000 nop | |
− | 00199af8: 2403ffff addiu r3,r0, | + | 00199af8: 2403ffff addiu r3,r0,-0x0001 | |
− | 00199afc: 1043ffd4 beq r2,r3,0x00199a50 | + | 00199afc: 1043ffd4 beq r2,r3,0x00199a50 {{f/Cond|If Routine above returns -0x01}} {{f/loc|Exit}} {{f/Returns|Return -0x01}} |
− | 00199b00: 001210c0 sll r2,r18,0x03 | + | 00199b00: 001210c0 sll r2,r18,0x03 | |
− | 00199b04: 00521021 addu r2,r2,r18 | + | 00199b04: 00521021 addu r2,r2,r18 | |
− | 00199b08: 00021180 sll r2,r2,0x06 | + | 00199b08: 00021180 sll r2,r2,0x06 |{{f/std|Elevation offset (0x240)}} |
− | 00199b0c: 00531021 addu r2,r2,r19 | + | 00199b0c: 00531021 addu r2,r2,r19 |{{f/std|AI Pointer + Map Level offset}} |
− | 00199b10: 244205f4 addiu r2,r2,0x05f4 | + | 00199b10: 244205f4 addiu r2,r2,0x05f4 |{{f/adr|Prepare pointer to AI 0x5f4 Table (each tile priority score)}} |
− | 00199b14: 00111940 sll r3,r17,0x05 | + | 00199b14: 00111940 sll r3,r17,0x05 |{{f/std|Y Row offset (0x20)}} |
− | 00199b18: 00621821 addu r3,r3,r2 | + | 00199b18: 00621821 addu r3,r3,r2 | |
− | 00199b1c: 00102040 sll r4,r16,0x01 | + | 00199b1c: 00102040 sll r4,r16,0x01 |{{f/std|X offset (1 halfword per tile)}} |
− | 00199b20: 96620032 lhu r2,0x0032(r19) | + | 00199b20: 96620032 lhu r2,0x0032(r19) |{{f/load|This Tile Priority Score}} {{f/std|Tile Priority (could change because of crystal / Treasure/Poison Marsh etc...)}} |
− | 00199b24: 00832021 addu r4,r4,r3 | + | 00199b24: 00832021 addu r4,r4,r3 |{{f/adr|Pointer to 0x8019f3c4 + 0x5f4 + Tile offset}} |
− | 00199b28: 00021023 subu r2,r0,r2 | + | 00199b28: 00021023 subu r2,r0,r2 |{{f/std|-Priority}} |
− | 00199b2c: a4820000 sh r2,0x0000(r4) | + | 00199b2c: a4820000 sh r2,0x0000(r4) |{{f/store|Save Tile Priority }} |
− | 00199b30: 92620e3a lbu r2,0x0e3a(r19) | + | 00199b30: 92620e3a lbu r2,0x0e3a(r19) |{{f/load|Load Max X}} |
− | 00199b34: 26100001 addiu r16,r16,0x0001 | + | 00199b34: 26100001 addiu r16,r16,0x0001 |{{f/std|Current X++}} |
− | 00199b38: 0202102a slt r2,r16,r2 | + | 00199b38: 0202102a slt r2,r16,r2 | |
− | 00199b3c: 1440ffe5 bne r2,r0,0x00199ad4 | + | 00199b3c: 1440ffe5 bne r2,r0,0x00199ad4 {{f/eloop|<nowiki>Loop until X = Max X</nowiki>}} |
− | 00199b40: 02141004 sllv r2,r20,r16 | + | 00199b40: 02141004 sllv r2,r20,r16 |{{f/std|Row Coordinate * Current X}} |
− | 00199b44: 92620e3b lbu r2,0x0e3b(r19) | + | 00199b44: 92620e3b lbu r2,0x0e3b(r19) |{{f/load|Load Max Y}} |
− | 00199b48: 26310001 addiu r17,r17,0x0001 | + | 00199b48: 26310001 addiu r17,r17,0x0001 |{{f/std|Current Y++}} |
− | 00199b4c: 0222102a slt r2,r17,r2 | + | 00199b4c: 0222102a slt r2,r17,r2 |{{f/std|Check if Y counter < max Y}} |
− | 00199b50: 1440ffca bne r2,r0,0x00199a7c | + | 00199b50: 1440ffca bne r2,r0,0x00199a7c {{f/eloop|<nowiki>Loop until Y = Max Y</nowiki>}} |
− | 00199b54: 00000000 nop | + | 00199b54: 00000000 nop | |
− | 00199b58: 26520001 addiu r18,r18,0x0001 | + | 00199b58: 26520001 addiu r18,r18,0x0001 |{{f/std|Map Level++}} |
− | 00199b5c: 2a420002 slti r2,r18,0x0002 | + | 00199b5c: 2a420002 slti r2,r18,0x0002 | |
− | 00199b60: 1440ffc2 bne r2,r0,0x00199a6c | + | 00199b60: 1440ffc2 bne r2,r0,0x00199a6c {{f/eloop|Loop for both low and high tiles}} |
− | 00199b64: 00000000 nop | + | 00199b64: 00000000 nop | |
− | 00199b68: 0c067c96 jal 0x0019f258 | + | 00199b68: 0c067c96 jal 0x0019f258 |{{f/jal|Store units coordinates|Store units coordinates}} {{f/std|Retore acting Units coordinates}} |
− | 00199b6c: 26640e30 addiu r4,r19,0x0e30 | + | 00199b6c: 26640e30 addiu r4,r19,0x0e30 |{{f/std|Pointer to 0x8019f3c4 + 0xe30}} |
− | 00199b70: 00001021 addu r2,r0,r0 | + | 00199b70: 00001021 addu r2,r0,r0 |{{f/Returns|Return 0x00}} |
00199b74: 8fbf0034 lw r31,0x0034(r29) | 00199b74: 8fbf0034 lw r31,0x0034(r29) | ||
00199b78: 8fb40030 lw r20,0x0030(r29) | 00199b78: 8fb40030 lw r20,0x0030(r29) | ||
Line 117: | Line 133: | ||
00199b90: 03e00008 jr r31 | 00199b90: 03e00008 jr r31 | ||
00199b94: 00000000 nop | 00199b94: 00000000 nop | ||
− | + | ===Return locations=== | |
+ | '''BATTLE.BIN''' | ||
+ | 00196688: [[Map_movement_decision/data_setting]] | ||
+ | 0019722c: [[Set_chosen_ability/target_for_AI_status]] | ||
+ | 001981cc: [[Fight_for_Life_-_Auto_Battle_(00197ff4)]] | ||
+ | 00198580: [[Protect_Allies_-_Auto_Battle_(001984ec)]] | ||
+ | 001990a8: [[0019905c_-_00199120]] |
Latest revision as of 08:19, 20 June 2024
BATTLE.BIN : : - AI_Target_Priority_Super_Routine_(001999c8) Set Priority score for each reachable tiles and store it at AI 0x5f4 as a negative value (0 - AI 0x32) ------------------------------------------------------------------------------------------ Parameter : Nothing Return : r2 = 0x00 Default value r2 = -0x01 if routine Abort while looping (Seems to be tied to VSync_call - Update screen and com back ?) ------------------------------------------------------------------------------------------ 001999c8: 3c02801a lui r2,0x801a | 001999cc: 90420d7b lbu r2,0x0d7b(r2) |AI 0x19b7 001999d0: 27bdffc8 addiu r29,r29,-0x0038 | 001999d4: afb3002c sw r19,0x002c(r29) | 001999d8: 3c13801a lui r19,0x801a | 001999dc: 2673f3c4 addiu r19,r19,-0x0c3c |0x8019f3c4 001999e0: afbf0034 sw r31,0x0034(r29) | 001999e4: afb40030 sw r20,0x0030(r29) | 001999e8: afb20028 sw r18,0x0028(r29) | 001999ec: afb10024 sw r17,0x0024(r29) | === AI 0x19b7 <> 0x00 (resume where code returns -0x01 ?) === 001999f0: 10400019 beq r2,r0,0x00199a58 #If 0x19b7 <> 0x00 001999f4: afb00020 sw r16,0x0020(r29) | 001999f8: 3c10801a lui r16,0x801a | 001999fc: 9210f3dc lbu r16,-0x0c24(r16) |Caster/ Focused X coordonates Could be the last coord. That caused the routine to returns -0x01 00199a00: 3c11801a lui r17,0x801a | 00199a04: 9231f3de lbu r17,-0x0c22(r17) |Caster/ Focused Y coordonates 00199a08: 3c02801a lui r2,0x801a | 00199a0c: 904201f1 lbu r2,0x01f1(r2) |AI 0xe2d Offset for reachable Tile Table (0x0 All tiles, 0x1 Closer to target, 0x2 Away from target) 00199a10: 3c12801a lui r18,0x801a | 00199a14: 9252f3dd lbu r18,-0x0c23(r18) |Elevation 00199a18: 000218c0 sll r3,r2,0x03 |ID*8 00199a1c: 00621821 addu r3,r3,r2 |ID*9 00199a20: 000318c0 sll r3,r3,0x03 |0x2ed Offset (0x48) 00199a24: 00731821 addu r3,r3,r19 | 00199a28: 24630a74 addiu r3,r3,0x0a74 |Prepare pointer to reachable tiles 00199a2c: 001210c0 sll r2,r18,0x03 | 00199a30: 00521021 addu r2,r2,r18 | 00199a34: 00021080 sll r2,r2,0x02 |Elevation offset (0x24) 00199a38: 00431021 addu r2,r2,r3 | 00199a3c: 00111840 sll r3,r17,0x01 |Y row offset (Halfword) 00199a40: 00621821 addu r3,r3,r2 |Pointer to AI Reachable Tiles (+offset based on 0xe2d) 00199a44: 94740000 lhu r20,0x0000(r3) |ConsideredY row tiles flags 00199a48: 080666bc j 0x00199af0 >>Jump/Return where routines stops *Set Priority via AI End of turn, in between turn, etc. 00199a4c: 00000000 nop | ---Exit Section (reached by backward Jump)--- 00199a50: 080666dd j 0x00199b74 >>Jump to END Return -0x01 00199a54: 2402ffff addiu r2,r0,-0x0001 | === SET PRIORITY for ALL CONSIDERED TILES === Else 19b7 = 0x00 00199a58: 00009021 addu r18,r0,r0 |Elevation counter 00199a5c: 3c01801a lui r1,0x801a | 00199a60: a020f3d8 sb r0,-0x0c28(r1) |Reset AI 0x14 ?? Used AI_End_of_turn,_in_between_turn,_etc. (seems to depend on whether the caster has to move or not) 00199a64: 3c01801a lui r1,0x801a | 00199a68: a020f3e1 sb r0,-0x0c1f(r1) |Set considered Skillset = 0x00 Tell the code This is a movement simulation only ? @LOOP - both elevation 00199a6c: 92620e3b lbu r2,0x0e3b(r19) |Load Map Max Y 00199a70: 00000000 nop | 00199a74: 18400038 blez r2,0x00199b58 #If Max Y is invalid : branch to next Elevation iteration 00199a78: 00008821 addu r17,r0,r0 |Y counter @LOOP - All Y rows 00199a7c: 92620e2d lbu r2,0x0e2d(r19) |AI 0xe2d Offset for reachable Tile Table (0x0 All tiles, 0x1 Closer to target, 0x2 Away from target) 00199a80: 00000000 nop | 00199a84: 000218c0 sll r3,r2,0x03 | 00199a88: 00621821 addu r3,r3,r2 | 00199a8c: 000318c0 sll r3,r3,0x03 |0xe2d Offset (0x48) 00199a90: 00731821 addu r3,r3,r19 | 00199a94: 24630a74 addiu r3,r3,0x0a74 |AI 0xa74 Pointer (reachable tiles) + 0xe2d (0x48) 00199a98: 001210c0 sll r2,r18,0x03 | 00199a9c: 00521021 addu r2,r2,r18 | 00199aa0: 00021080 sll r2,r2,0x02 |Elevation offset (0x24) 00199aa4: 00431021 addu r2,r2,r3 | 00199aa8: 00111840 sll r3,r17,0x01 |Y offset (halfword) 00199aac: 00621821 addu r3,r3,r2 |This iteration 0xa74 Pointer (Elevation and Y row) + 0xe2d offset(0x48) Reachable +/- Get closer or further offset 00199ab0: 94740000 lhu r20,0x0000(r3) |This Y row tiles flags 00199ab4: 00000000 nop | 00199ab8: 12800022 beq r20,r0,0x00199b44 #If no flags in this row : branch to Next Y row 00199abc: 00000000 nop | 00199ac0: 92620e3a lbu r2,0x0e3a(r19) |Load Map Max X 00199ac4: 00000000 nop | 00199ac8: 1840001e blez r2,0x00199b44 #If Max X is invalid : branch to Next Y row 00199acc: 00008021 addu r16,r0,r0 |Reset X counter 00199ad0: 02141004 sllv r2,r20,r16 |Shift Row flags : flag of interest is in 0x8000 position @LOOP - All X Tiles in row 00199ad4: 30428000 andi r2,r2,0x8000 | 00199ad8: 10400015 beq r2,r0,0x00199b30 #If This tile is OFF : branch to Next Tile 00199adc: 00000000 nop | 00199ae0: a2700018 sb r16,0x0018(r19) |Save Current X 00199ae4: a271001a sb r17,0x001a(r19) |Save Current Y 00199ae8: 0c066ec8 jal 0x0019bb20 |-->AI_Check_if_Unit_is_a_Crystal/Treasure_(0019bb20) Set Value of AI 0xcbf ( 801a0083 ) 00199aec: a2720019 sb r18,0x0019(r19) |Save Current Map Level 19b7 <> 0x00 jump here 00199af0: 0c0674df jal 0x0019d37c |-->AI End of turn, in between turn, etc. Set Priority score (AI 0x32) for each considered Tile 00199af4: 00000000 nop | 00199af8: 2403ffff addiu r3,r0,-0x0001 | 00199afc: 1043ffd4 beq r2,r3,0x00199a50 #If Routine above returns -0x01 Exit Return -0x01 00199b00: 001210c0 sll r2,r18,0x03 | 00199b04: 00521021 addu r2,r2,r18 | 00199b08: 00021180 sll r2,r2,0x06 |Elevation offset (0x240) 00199b0c: 00531021 addu r2,r2,r19 |AI Pointer + Map Level offset 00199b10: 244205f4 addiu r2,r2,0x05f4 |Prepare pointer to AI 0x5f4 Table (each tile priority score) 00199b14: 00111940 sll r3,r17,0x05 |Y Row offset (0x20) 00199b18: 00621821 addu r3,r3,r2 | 00199b1c: 00102040 sll r4,r16,0x01 |X offset (1 halfword per tile) 00199b20: 96620032 lhu r2,0x0032(r19) |This Tile Priority Score Tile Priority (could change because of crystal / Treasure/Poison Marsh etc...) 00199b24: 00832021 addu r4,r4,r3 |Pointer to 0x8019f3c4 + 0x5f4 + Tile offset 00199b28: 00021023 subu r2,r0,r2 |-Priority 00199b2c: a4820000 sh r2,0x0000(r4) |Save Tile Priority 00199b30: 92620e3a lbu r2,0x0e3a(r19) |Load Max X 00199b34: 26100001 addiu r16,r16,0x0001 |Current X++ 00199b38: 0202102a slt r2,r16,r2 | 00199b3c: 1440ffe5 bne r2,r0,0x00199ad4 Λ Loop until X = Max X 00199b40: 02141004 sllv r2,r20,r16 |Row Coordinate * Current X 00199b44: 92620e3b lbu r2,0x0e3b(r19) |Load Max Y 00199b48: 26310001 addiu r17,r17,0x0001 |Current Y++ 00199b4c: 0222102a slt r2,r17,r2 |Check if Y counter < max Y 00199b50: 1440ffca bne r2,r0,0x00199a7c Λ Loop until Y = Max Y 00199b54: 00000000 nop | 00199b58: 26520001 addiu r18,r18,0x0001 |Map Level++ 00199b5c: 2a420002 slti r2,r18,0x0002 | 00199b60: 1440ffc2 bne r2,r0,0x00199a6c Λ Loop for both low and high tiles 00199b64: 00000000 nop | 00199b68: 0c067c96 jal 0x0019f258 |-->Store units coordinates Retore acting Units coordinates 00199b6c: 26640e30 addiu r4,r19,0x0e30 |Pointer to 0x8019f3c4 + 0xe30 00199b70: 00001021 addu r2,r0,r0 |Return 0x00 00199b74: 8fbf0034 lw r31,0x0034(r29) 00199b78: 8fb40030 lw r20,0x0030(r29) 00199b7c: 8fb3002c lw r19,0x002c(r29) 00199b80: 8fb20028 lw r18,0x0028(r29) 00199b84: 8fb10024 lw r17,0x0024(r29) 00199b88: 8fb00020 lw r16,0x0020(r29) 00199b8c: 27bd0038 addiu r29,r29,0x0038 00199b90: 03e00008 jr r31 00199b94: 00000000 nop
Return locations
BATTLE.BIN 00196688: Map_movement_decision/data_setting 0019722c: Set_chosen_ability/target_for_AI_status 001981cc: Fight_for_Life_-_Auto_Battle_(00197ff4) 00198580: Protect_Allies_-_Auto_Battle_(001984ec) 001990a8: 0019905c_-_00199120