Difference between revisions of "Enemy AI"

From Chrono Compendium
Jump to: navigation, search
(Actions)
m (formatting)
 
(15 intermediate revisions by 4 users not shown)
Line 16: Line 16:
 
==Summary==
 
==Summary==
  
Enemy AI is divided into two blocks that terminate with FF.
+
Enemy AI is divided into two blocks that terminate with $FF.
  
 
<pre>
 
<pre>
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,
00 ?? ?? ?? nothing. continue with following Action
+
tt - targeting byte 80 - copy flag, copies $7E:AED8 to $7E:AECC, ignore Targeting 0x7F - targeting routine,
01 hh ?? ?? check health.  hh - 03=50%
+
?? - unknown
02 ?? ?? ??
+
00 xx xx xx - Default, always passes.
03 ?? mm ?? unknown. mm - monster index
+
01 tt xx xx - HP less than half (tt is usually set to 03 for current enemy,
04 ?? mm ?? check if monster is alive.  mm - monster index
+
              but other values could be used).
05 nn ?? ?? check number of enemies. nn - minimum? number of enemies that must exist for the following Action to be executed
+
02 tt oo bb - Check for status. tt - Target, 00 for PCs, 01 for enemies. oo - Offset from
06 ?? ?? ??
+
              battle data 0x1D (start of status flags). bb - Bits to check.
07 nn ?? ?? check times attacked. nn - number of times the enemy must be attacked for the following Action section to be executed
+
03 tt mm xx - Checks if something moved. mm - Monster/PC index
08 ?? ?? ??
+
04 xx mm ss - Checks status of monster mm - monster index, ss - Status - 00 Alive, 01 - Dead.
09 ?? ?? ??
+
05 nn xx xx - Checks for maximum number of living enemies. nn - number of enemies.
0A ?? ?? ??
+
06 ff ff ff - Check if battle frame counter is at least ff.
0B ?? ?? ??
+
              Value is little endian (lowest byte stored first).
0C ?? ?? ??
+
07 vv cc xx - Check custom mode. vv - value, cc - Compare type - 00 >=, 01 <=
0D ?? ?? ??
+
08 tt hh hh - Check if HP <= value. hh - HP to compare.
0E ?? ?? ??
+
              Value is little endian (lowest byte stored first).
0F ?? ?? ??
+
09 tt ss vv - Check if stat is less than value. ss - stat offset. vv - value
10 ?? ?? ?? (only used once for Enemy $F8 R Series?)
+
0A tt ss bb - Check if stat has bitflags set. ss - stat offset, bb - bitflags set.
11 ?? ?? ??
+
0B tt ss vv - Check if stat is less than or equal to value. ss - stat offset, vv - value.
12 ?? tt ?? if hit with tech.  tt - tech index
+
0C tt ff xx - Check if target is inside or outside of a 32 pixel radius. ff - 00 Inside, 01 Outside
13 ?? ?? ??
+
0D tt ff xx - Check if X distance against 32 pixels. ff - 00 >, 01 <=
14 ?? ?? ??
+
0E tt ff rr - Distance - multiple options.  ff - 00 Inside, 01 Outside rr - routine
15 ee ?? ?? if hit by attack. ee - 80=lightning
+
              00 - below this enemy
16 ?? ?? ?? (possibly unused)
+
              01 - to the left of this enemy
17 cc ?? ?? load random number. cc - chance to execute following Action
+
              02 - in a 32 pixel radius (angle considered)
18 ii ?? ?? if hit by specific weapon. ii - weapon index
+
              03 - on bottom half of screen
19 ?? ?? ??
+
              04 - on top half of screen
1A mm nn ?? if  number monsters alive?? -- mm monster index, nn number needed to be alive
+
              05 - on right 176 pixels of screen
1B nn ?? ?? if num pc's  (alive?) -- number of pc's
+
              06 - on left 80 pixels of screen
1C ?? ?? ??
+
              07 - unknown distance 0x0c (routines are part of larger list that cannot be called,
1D ?? ?? ??
+
                  hence the labeling here)
1E ?? ?? ??
+
              08 - in a 48 pixel radius
1F ?? ?? ?? check distance.
+
0F tt ff ?? - Check if target is inside or outside of a 32 pixel radius, considering angle as a factor. Specifics unknown. ff - 00 Inside, 01 Outside.
20 ?? ?? ?? check if defeated.
+
10 xx SV NC - NCSV - Needlessly complicated simple value. NC is the 2 bit, and SV is the 1 bit. (0-3)
21 ?? ?? ??
+
              If position of the current enemy is in a certain range.
22 ?? ?? ??
+
              0 - 128px or more from the top of the screen.
23 ?? ?? ?? (same as 18)
+
              1 - less than 128px from the top of the screen.
24 ?? ?? ?? (same as 18)
+
              2 - less than 80px from the left of the screen.
25 ?? ?? ?? (same as 18)
+
              3 - 176px or more from the left of the screen.
26 ?? ?? ?? (same as 18)
+
11 ee xx mm - Check if hit by tech type. ee - 00 player tech, 01 enemy tech. mm - 00 ==, 01 !=
27 ?? ?? ?? (same as 18)
+
12 ee aa mm - Check if hit by specific tech.  ee - 00 player tech, 01 enemy tech. aa - tech index.
28 ?? ?? ?? (same as 18)
+
              mm - 00 ==, 01 !=
</pre>
+
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 !=.
'''Older data not 100% confirmed:'''
+
              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.
<pre>
+
15 ee xx ff - Checks element of attack, ff - 00 ==, 01 !=, ee - element 20 Ice, 10 Fire,
05 XX 00 00 - number of enemies atleast XX
+
              80 Lightning, 40 Shadow, 02 Magic, 04 Physical
40 00 XX 01 - If monster XX is dead...byte 2/4 unexplored
+
16 xx xx xx - Copy of 00.
09 00 00 00 - Physical Counter.
+
17 pp xx xx - Percent chance. pp - percent
10 00 00 00 - Always Counter.
+
18 vv tt ss - Check if stat is equal. vv - value, ss - stat offset.
11 00 00 00 - Magical Counter.
+
19 xx xx xx - Copy of 00.
15 XX 00 00 - Elemental Counter - 20 Ice, 10 Fire, 80 Lightning, 40 Shadow, 00 Physical. (02 and 04 have been used, only saw them skimming the listings)
+
1A mm aa ss - Check if monster type is alone or not. mm - monster index, aa - 0 - alone,
1F 04 XX 00 - Is enemy distant (non-zero) or up close (zero)?
+
              1 - with other types.
</pre>
+
              ss - If with other types, should the condition succeed? 0 - fail, 1 - succeed.
 +
1B pp xx xx - Count of living PCs is at most 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 - If current enemy is dead or unknown $7E:AF15 & 40 is set. Possible revival reaction.
 +
22 tt aa cc - aa - Maximum ATB value, determined by a combination of speed and battle speed settings.
 +
              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)</pre>
  
 
==Actions==
 
==Actions==
Line 104: Line 121:
  
 
<pre>
 
<pre>
00 ?? ?? ??  wander mode.
+
00 ?? jj ??  wander mode. jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index
01 aa ww ??  attack mode.  aa - attack index ww - who to attack: 05 random pc 06 nearest pc 08 pc using unknown hp conditions
+
01 aa jj ??  attack mode.  aa - attack index jj - multipurpose byte, 80 copy flag: 7EAED8 to 7EAECC, 7F subroutine index
02 tt ww ?? ?? ss  tech mode.  tt - tech index ww - who to attack: 05 random pc 06 nearest pc 08 pc using unknown hp conditions ss - battle enemy message string
+
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)
 
03 (nothing, no routines)
 
04  random action.  uses a random number to determine which action in current section to start on.
 
04  random action.  uses a random number to determine which action in current section to start on.
Line 120: Line 137:
 
0E (nothing, no routines)
 
0E (nothing, no routines)
 
0F ss  display text.  ss - battle enemy message string
 
0F ss  display text.  ss - battle enemy message string
10 vv ee ss  revive support enemies.  vv - unk. stored to 7E000E ee - battle sound effect 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
 
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
 
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
Line 128: Line 145:
 
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
 
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
 
</pre>
 
</pre>
 +
 +
inuksuk: Action 12 calls an enemy tech with the two bytes "?? ??". The first byte lists the enemy tech and the second ?? is the target. You can see examples in the Masa & Mune and Nizbel scripts.
  
  
Line 137: Line 156:
 
02 WW 05 XX YY ZZ      - Spell WW, Message ZZ, XX YY for double/triple?
 
02 WW 05 XX YY ZZ      - Spell WW, Message ZZ, XX YY for double/triple?
 
</pre>
 
</pre>
 +
 +
==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
 +
 +
<pre>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</pre>
  
 
==Supplemental Material==
 
==Supplemental Material==
Line 142: Line 228:
 
*[[Enemy AI_Listings]]
 
*[[Enemy AI_Listings]]
  
''From'': [[Offsets (Chrono Trigger)]]
+
''From'': [[Modification]]

Latest revision as of 04:12, 21 September 2024

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.

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 ff rr - Distance - multiple options.  ff - 00 Inside, 01 Outside rr - routine
              00 - below this enemy
              01 - to the left of this enemy
              02 - in a 32 pixel radius (angle considered)
              03 - on bottom half of screen 
              04 - on top half of screen
              05 - on right 176 pixels of screen
              06 - on left 80 pixels of screen
              07 - unknown distance 0x0c (routines are part of larger list that cannot be called, 
                   hence the labeling here)
              08 - in a 48 pixel radius
0F tt ff ?? - Check if target is inside or outside of a 32 pixel radius, considering angle as a factor. Specifics unknown. ff - 00 Inside, 01 Outside.
10 xx SV NC - NCSV - Needlessly complicated simple value. NC is the 2 bit, and SV is the 1 bit. (0-3)
              If position of the current enemy is in a certain range.
              0 - 128px or more from the top of the screen.
              1 - less than 128px from the top of the screen.
              2 - less than 80px from the left of the screen.
              3 - 176px or more from the left of the screen.
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 most 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 - If current enemy is dead or unknown $7E:AF15 & 40 is set. Possible revival reaction.
22 tt aa cc - aa - Maximum ATB value, determined by a combination of speed and battle speed settings. 
              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

inuksuk: Action 12 calls an enemy tech with the two bytes "?? ??". The first byte lists the enemy tech and the second ?? is the target. You can see examples in the Masa & Mune and Nizbel scripts.


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: Modification