Difference between revisions of "Enemy AI"
m (Display fix) |
(Condition list updated.) |
||
Line 41: | Line 41: | ||
There is a total of 41 Conditions ($00-28) | There is a total of 41 Conditions ($00-28) | ||
− | <pre> | + | <pre>xx - unused, tt - targeting byte 80 - copy flag, copies $7E:AED8 to $7E:AECC, ignore Targeting 0x7F - targeting routine , ?? - unknown |
− | + | 00 xx xx xx - Default, always passes. | |
− | 01 | + | 01 tt xx xx - HP less than half (tt is usually set to 03 for current enemy, but other values could be used). |
− | 02 | + | 02 tt oo bb - Check for status. tt - Target, 00 for PCs, 01 for enemies. oo - Offset from battle data 0x1D (start of status flags). bb - Bits to check. |
− | 03 | + | 03 tt mm xx - Checks if something moved. mm - Monster/PC index |
− | 04 | + | 04 xx mm ss - Checks status of monster mm - monster index, ss - Status - 00 Alive, 01 - Dead. |
− | 05 nn | + | 05 nn xx xx - Checks for maximum number of living enemies. nn - number of enemies. |
− | 06 | + | 06 ff ff ff - Check if battle frame counter is at least ff. Value is little endian (lowest byte stored first). |
− | 07 | + | 07 vv cc xx - Check custom mode. vv - value, cc - Compare type - 00 >=, 01 <= |
− | 08 | + | 08 tt hh hh - Check if HP <= value. hh - HP to compare. Value is little endian (lowest byte stored first). |
− | 09 | + | 09 tt ss vv - Check if stat is less than value. ss - stat offset. vv - value |
− | 0A | + | 0A tt ss bb - Check if stat has bitflags set. ss - stat offset, bb - bitflags set. |
− | 0B | + | 0B tt ss vv - Check if stat is less than or equal to value. ss - stat offset, vv - value. |
− | + | 0C tt ff xx - Check if target is inside or outside of a 32 pixel radius. ff - 00 Inside, 01 Outside | |
− | 0D | + | 0D tt ff xx - Check if X distance against 32 pixels. ff - 00 >, 01 <= |
− | 0E ?? | + | 0E tt rr ?? - Distance related. rr - result check mode. |
− | 0F ?? | + | 0F tt rr ?? - Distance related. rr - result check mode. |
− | 10 | + | 10 xx bb aa - Likely distance related. aa - First calculation switch. bb - Second calculation switch |
− | 11 | + | 11 ee xx mm - Check if hit by tech type. ee - 00 player tech, 01 enemy tech. mm - 00 ==, 01 != |
− | 12 | + | 12 ee aa mm - Check if hit by specific tech. ee - 00 player tech, 01 enemy tech. aa - tech index. mm - 00 ==, 01 != |
− | 13 | + | 13 aa xx mm - Check Attacker. aa - 00 player, 01 enemy. mm - 0 ==, 01 != |
− | 14 | + | 14 vv mm ee - Check specific attacker. mm - mode 00 Check attacker against value vv, 01 buggy. ee - 00 ==, 01 !=. |
− | 15 ee | + | Only checks against player techs and attacks, or enemy techs without enemy vs enemy attack set. |
− | 16 | + | There is a minor bug in mode 00 when ee is 01. Set 0x019551 to 89 to fix in the Japanese and US releases. |
− | 17 | + | 15 ee xx ff - Checks element of attack, ff - 00 ==, 01 !=, ee - element 20 Ice, 10 Fire, 80 Lightning, 40 Shadow, 02 Magic, 04 Physical |
− | 18 vv | + | 16 xx xx xx - Copy of 00. |
− | 19 | + | 17 pp xx xx - Percent chance. pp - percent |
− | 1A mm | + | 18 vv tt ss - Check if stat is equal. vv - value, ss - stat offset. |
− | + | 19 xx xx xx - Copy of 00. | |
− | 1C | + | 1A mm aa ss - Check if monster type is alone or not. mm - monster index, aa - 0 - alone, 1 - with other types. |
− | 1D | + | ss - If with other types, should the condition succeed? 0 - fail, 1 - succeed. |
− | 1E | + | 1B pp xx xx - Count of living PCs is at least pp. |
− | 1F | + | 1C tt pp ll - Is PC present or absent. tt can load any targeting routine, but only routines 30-36 will produce expected results. |
− | 20 | + | pp - Presence status. 00 - Present, 01 - Absent. ll - Life status. 01 - may be dead. |
− | 21 | + | 1D tt xx aa - Check if target is alive or not. |
− | 22 ?? | + | 1E xx xx xx - Copy of 00 that sets $7E:AF24 (failure status) to 1 (failed). |
− | 23 | + | 1F tt ff xx - Check if target is inside or outside of a 48 pixel radius. ff - 00 Inside, 01 Outside |
− | 24 | + | 20 xx xx xx - Final Attack. |
− | 25 | + | 21 xx xx xx - $7E:AF15 related. |
− | 26 | + | 22 tt ?? cc - $7E:B158 related. cc - compare type 0 - Less than, 1 - Greater than or equal to. |
− | 27 | + | 23 vv tt ss - (same as 18) |
− | 28 | + | 24 vv tt ss - (same as 18) |
− | + | 25 vv tt ss - (same as 18) | |
− | + | 26 vv tt ss - (same as 18) | |
− | + | 27 vv tt ss - (same as 18) | |
− | + | 28 vv tt ss - (same as 18)</pre> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | </pre> | + | |
==Actions== | ==Actions== |
Revision as of 23:27, 24 September 2017
Notes on Enemy AI are currently incomplete; eventually, data will be decoded and added into Temporal Flux for functionality. Enemy AI information will be updated as new stuff comes.
Contents
Offsets
Directly from Geiger's Offsets.txt ___________________________________________________________________ 0C8B08 0C8D07 PTR No No Pointers to Enemy AI (local) 6/21/2004 0C8D08 0CCBC8 AI No No Enemy AI 7/14/2003 ___________________________________________________________________
Summary
Enemy AI is divided into two blocks that terminate with $FF.
AAAAAAAAFF BBBBBBBBFF
The first block contains actions that the enemy performs on its own. The second block contains reactions when the enemy is attacked.
Each block can be broken down into sections that alternate between Condition and Action.
Condition
Conditions are a multiple of 4 bytes, each of which is a boolean statement. All must be true for the following Action section to be executed. The section is terminated by $FE.
Action
Actions can contain one or more commands to perform. An enemy's attack meter must refill first before it can continue with the next command. The section is terminated by $FE.
Conditions
There is a total of 41 Conditions ($00-28)
xx - unused, tt - targeting byte 80 - copy flag, copies $7E:AED8 to $7E:AECC, ignore Targeting 0x7F - targeting routine , ?? - unknown 00 xx xx xx - Default, always passes. 01 tt xx xx - HP less than half (tt is usually set to 03 for current enemy, but other values could be used). 02 tt oo bb - Check for status. tt - Target, 00 for PCs, 01 for enemies. oo - Offset from battle data 0x1D (start of status flags). bb - Bits to check. 03 tt mm xx - Checks if something moved. mm - Monster/PC index 04 xx mm ss - Checks status of monster mm - monster index, ss - Status - 00 Alive, 01 - Dead. 05 nn xx xx - Checks for maximum number of living enemies. nn - number of enemies. 06 ff ff ff - Check if battle frame counter is at least ff. Value is little endian (lowest byte stored first). 07 vv cc xx - Check custom mode. vv - value, cc - Compare type - 00 >=, 01 <= 08 tt hh hh - Check if HP <= value. hh - HP to compare. Value is little endian (lowest byte stored first). 09 tt ss vv - Check if stat is less than value. ss - stat offset. vv - value 0A tt ss bb - Check if stat has bitflags set. ss - stat offset, bb - bitflags set. 0B tt ss vv - Check if stat is less than or equal to value. ss - stat offset, vv - value. 0C tt ff xx - Check if target is inside or outside of a 32 pixel radius. ff - 00 Inside, 01 Outside 0D tt ff xx - Check if X distance against 32 pixels. ff - 00 >, 01 <= 0E tt rr ?? - Distance related. rr - result check mode. 0F tt rr ?? - Distance related. rr - result check mode. 10 xx bb aa - Likely distance related. aa - First calculation switch. bb - Second calculation switch 11 ee xx mm - Check if hit by tech type. ee - 00 player tech, 01 enemy tech. mm - 00 ==, 01 != 12 ee aa mm - Check if hit by specific tech. ee - 00 player tech, 01 enemy tech. aa - tech index. mm - 00 ==, 01 != 13 aa xx mm - Check Attacker. aa - 00 player, 01 enemy. mm - 0 ==, 01 != 14 vv mm ee - Check specific attacker. mm - mode 00 Check attacker against value vv, 01 buggy. ee - 00 ==, 01 !=. Only checks against player techs and attacks, or enemy techs without enemy vs enemy attack set. There is a minor bug in mode 00 when ee is 01. Set 0x019551 to 89 to fix in the Japanese and US releases. 15 ee xx ff - Checks element of attack, ff - 00 ==, 01 !=, ee - element 20 Ice, 10 Fire, 80 Lightning, 40 Shadow, 02 Magic, 04 Physical 16 xx xx xx - Copy of 00. 17 pp xx xx - Percent chance. pp - percent 18 vv tt ss - Check if stat is equal. vv - value, ss - stat offset. 19 xx xx xx - Copy of 00. 1A mm aa ss - Check if monster type is alone or not. mm - monster index, aa - 0 - alone, 1 - with other types. ss - If with other types, should the condition succeed? 0 - fail, 1 - succeed. 1B pp xx xx - Count of living PCs is at least pp. 1C tt pp ll - Is PC present or absent. tt can load any targeting routine, but only routines 30-36 will produce expected results. pp - Presence status. 00 - Present, 01 - Absent. ll - Life status. 01 - may be dead. 1D tt xx aa - Check if target is alive or not. 1E xx xx xx - Copy of 00 that sets $7E:AF24 (failure status) to 1 (failed). 1F tt ff xx - Check if target is inside or outside of a 48 pixel radius. ff - 00 Inside, 01 Outside 20 xx xx xx - Final Attack. 21 xx xx xx - $7E:AF15 related. 22 tt ?? cc - $7E:B158 related. cc - compare type 0 - Less than, 1 - Greater than or equal to. 23 vv tt ss - (same as 18) 24 vv tt ss - (same as 18) 25 vv tt ss - (same as 18) 26 vv tt ss - (same as 18) 27 vv tt ss - (same as 18) 28 vv tt ss - (same as 18)
Actions
There is a total of 23 Actions ($00-16)
00 ?? jj ?? wander mode. jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index 01 aa jj ?? attack mode. aa - attack index jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index 02 tt jj jj jj ss tech mode. tt - tech index jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index ss - battle enemy message string 03 (nothing, no routines) 04 random action. uses a random number to determine which action in current section to start on. 05 ?? ?? unknown, possibly unused, and not confirmed if it is a 3 byte command. 06 (nothing, no routines) 07 mm aa hh become monster. mm - monster to turn into aa - animation? hh - hp 08 (nothing, no routines) 09 ?? display flashes for distant attack? 0A aa ss run away. aa - action to show ss - battle enemy message string 0B oo vv mm ss set stat. oo - offset from enemy stat set start vv - value to set/bitwise OR mm - mode, 00 set value 01 bitwise OR ss - battle enemy message string 0C oo vv ss stat math. oo - offset from enemy stat set start vv - multipurpose byte, 80 subtract flag, 7F amount to add/sub ss - battle enemy message string 0D ?? ss unknown, state change? ss - battle enemy message string 0E (nothing, no routines) 0F ss display text. ss - battle enemy message string 10 vv ee ss revive support enemies. vv - unk. stored to temp 7E000E ee - battle sound effect ss - battle enemy message string 11 oo vv oo vv oo vv oo vv ss multi stat set. oo - offset from enemy stat set start vv - value to set ss - battle enemy message string 12 ?? ?? jj jj oo vv oo vv oo vv oo vv oo vv ss special multi stat set. jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index oo - offset from enemy stat set start vv - value to set ss - battle enemy message string 13 jj vv unknown, possibly unused, and not confirmed if it is a 3 byte command. jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index vv - unknown value stored to temp 7E000E 14 oo vv oo vv oo vv oo vv ss multi stat math. oo - offset from enemy stat set start vv - multipurpose byte, 80 subtract flag, 7F amount to add/sub ss - battle enemy message string 15 ?? ?? jj jj oo vv oo vv oo vv oo vv oo vv ss special multi stat math. jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index oo - offset from enemy stat set start vv - multipurpose byte, 80 subtract flag, 7F amount to add/sub ss - battle enemy message string 16 -- tt oo vv oo vv oo vv oo vv ss multi revive and set stat. tt - tech/tech animation related index oo - offset from enemy stat set start vv - value to set ss - battle enemy message string
Older data not 100% confirmed:
00 WW XX YY - wander mode YY is how you wander, WW animation related? 02 WW 05 XX YY ZZ - Spell WW, Message ZZ, XX YY for double/triple?
Enemy AI Targeting subroutines
Used by Conditions: 01, 03, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 18, 1C*, 1D, 1F, 22, 23-28 Used by Actions: 00, 01, 02, 12, 13, 15
- Condition 1C does not treat the data obtained the from the routines the same way as the others, so it will have unexpected results.
jj - Multiply x2 + 0x01B8BB to obtain the pointer
00 - Nothing 01 - All PCs 02 - All enemies 03 - Current enemy 04 - Attacking PC 05 - Random PC 06 - Nearest PC 07 - Farthest PC 08 - PC with lowest HP. This routine does not properly check PC1's HP. To fix, replace 0x01A50C (unheadered US or Japanese ROM) with D0 05 EA EA. 09 - PCs with any flags on battle data 0x1D set. 80 is used for a dead PC, others are unknown. 0A - PCs with any negative status. 0B - PCs with any flags on battle data 0x1F (unknown) 0C - PCs with any positive status from set 1 (2x Evade/Unknown Status/2.5x Evade/Haste) 0D - PCs with any positive status from set 2 (Attack Power Up/Shield (Defense Up)/Max Attack Power Up/MP Regen/Barrier (M. Defense Up)/Berserk) 0E - Sleeping PCs 0F - Stopped PCs 10 - Confused PCs 11 - Shielded (Defense Up) PCs 12 - Barriered (M. Defense Up) PCs 13 - PCs with bit 10 of positive status set 2 (unused) 14 - PCs with bit 8 of battle data 01 (unknown) 15 - Other enemies 16 - Living enemies 17 - Nearest enemy 18 - Farthest enemy 19 - Enemy with lowest HP 1A - Other enemies with any battle data 0x1D flags set 1B - All enemies with any battle data 0x1D flags set 1C - Other enemies with any negative status 1D - All enemies with any negative status 1E - Other enemies with any flags on battle data 0x1F (unknown) 1F - All enemies with any flags on battle data 0x1F (unknown) 20 - Other Sleeping enemies 21 - Other Stopped enemies 22 - Other Confused enemies 23 - Other Barriered (M. Defense Up) enemies 24 - Other enemies with 0x1D bitflag 2 set 25 - Other enemies with 0x19 bitflag 1 set 26 - Enemy with lowest HP other than self 27 - Enemy 03. This and the following routines are mostly used with multi-part bosses. Enemy index is determined by event commands. 28 - Enemy 04 29 - Enemy 05 2A - Enemy 06 2B - Enemy 07 2C - Enemy 08 2D - Enemy 09 2E - Enemy 0A 2F - Random enemy with $7E:AF15 bit 80 set 30 - PC 1. This and the following routines were most likely designed for condition 1C, check for specific PC. If used in that condition, it would check for Crono. 31 - PC 2 32 - PC 3 33 - Enemy 3 34 - Enemy 4 35 - Enemy 5 36 - Enemy 6 37 - PC with highest HP 38 - Random enemy other than self
Supplemental Material
From: Offsets (Chrono Trigger)