Botwoon Consists of $0F parts total (including head and tail) $0F78 - enemy pointer $0F7A - enemy X pos (from room pop) $0F7C - enemy sub-pixel X pos. Often unused. $0F7E - enemy Y pos (from room pop_) $0F80 - enemy sub-pixel Y pos. Often unused. $0F82 - enemy collision width (1/2 pixel value from center) $0F84 - enemy collision height (1/2 pixel value from center) $0F86 - Property bits (from room pop: prop bits) (FEDC BA98 7654 3210) F makes their hitbox solid to Samus, E respawns the enemies if they die, D tells the game to process the enemy's graphic AI, C makes the enemy block Plasma shots B makes the enemy process even when offscreen, A makes the enemy ignore Samus/Projectiles, 9 instantly deletes the enemy, 8 makes the enemy invisible? 1 and 0 used by geemers as orientation $0F88 - extra property bits (FEDC BA98 7654 3210) F signifies that the enemy processed a new enemy instruction with $0F92, update graphics. 2 enables multiple hitbox/reactions (indepth $0F8E) 0 disables processing of the enemy's movement AI, I think. Isn't disabled if 0F86 A is set (ignore Samus/Projectiles) $0F8A - AI handler. Lowest bit set determines which AI pointer in enemy data to use (None = 18, 1 = 1A, 2 = 1C, 4 = 1E, 8 = 20) $0F8C - Enemy HP $0F8E - Main graphics/hitbox pointer Byte 0 is a counter of some sort. Byte 1 is unused, I think. Bytes 2-3 are X pixel offset. Bytes 4-5 are Y pixel offset. Bytes 6-7 are a pointer to a tilemap, I think. Bytes 8-9 are a pointer to collision detection: Byte 0 is a counter of some sort. Byte 1 is unused, I think. Bytes 2-3 are X pixel offset to left border. Bytes 4-5 are Y pixel offset to bottom border. Bytes 6-7 are X pixel offset to right border. Bytes 8-9 are Y pixel offset to top border. Bytes A-B are for collisions with Samus. Bytes C-D bytes are pointer to code for collision with projectiles. Bytes 2-D repeat 'byte 0' times. Total length is 2 + (n*C), n = byte 0. Bytes 2-9 repeat 'byte 0' times. Total length is 2 + (n*8), n = byte 0 $0F90 - ??? (Used by Mochtroid) (LN Chozo uses it as a loop counter) $0F92 - pointer to AI structure. Acts like PLMs instruction pointer ($1D27,X). Positive Enemy instructions set delay timer and 0F8E, and highest bit of 0F88 $0F94 - action delay (apparantly) (Used with above?) $0F96 - Which SNES palette the enemy uses (when drawing the sprite, from enemy set number). ORAed with other data to stick directly into OAM. $0F98 - Index to graphics in VRAM $0F9A - Layer control $0F9C - Set to (0F78),#$0D + #$08 when shot? This - 8 = timer for using Hurt AI. $0F9E - Enemy frozen timer $0FA0 - Counter, forces a different kind of processing. Used when hit by Plasma Beam (powerbombs?) $0FA2 - A value that works concurrently with $0FA4 to modify vertical position of sprite $0FA4 - Value that determines if sprite vertical position is lowered or raised (with $0FA2). For many enemies it's used as come sort of counter though $0FA6 - Bank of enemy data $0FA7 - $0FA8 - initialized to #$0018, used as counter to spawn projectile #$EBA0 (run 14 (dec) times) $0FAA - $0FAC - initialized to #$94BD (table of some sort (value of #$0018)) $0FAE - general AI variable run routine. (initialized to #$9878 (unknown routine)) $0FB0 - initialized to #$9BB7 (unknown routine) $0FB2 - initialized to #$9DC0 (unknown routine) $0FB4 - Speed in SMILE $0FB6 - Speed2 in SMILE $8000 - (hide timer?) initialized to #$0100 $8002 - $8004 - hit counter? die if #$0100 or greater $8006 - used for explosions during breaking wall (height value for explosions while breaking wall?) $8008 - used for explosions during breaking wall (timer delay between explosions) $800A - used for explosions during breaking wall (secondary timer delay between explosions, works concurrently with $8008) $8010 - $801E - never initialized $8020 - set to #$0001 by routine $96C6 $8026 - initialized to #$0001 $8028 - initialized to #$0001 $802C - initialized to #$FFFF $802E - initialized to #$0000 $8030 - initialized to #$94BB (table of some sort (value of #$0002)) $8032 - initialized to #$0001 $8036 - part control graphic index? Initialized to #$9389 (blank tilemap) $8038 - never initialized $803C - never initialized $803E - never initialized $8800 - $8816 - $881C - enemy palette, divided by 16, plus #$0100. $881E - damage palette index (used for palette shift) $8820 - part control, initialized to enemy x position $8822 - part control, initialized to enemy y position $8824 - part control, initialized to enemy x position $8826 - part control, initialized to enemy y position $8828 - part control, initialized to enemy x position $882A - part control, initialized to enemy y position $882C - part control, initialized to enemy x position $882E - part control, initialized to enemy y position $8832 - $8836 - initialized to enemy HP $8838 - initialized to 1/2 enemy HP $883A - initialized to 1/4 enemy HP $883E - timer between death and wall breaking? routines used in AI: $96C6 - if both $801E and $803C are set, STA #$0001 to $8020, #$9A46 to $0FAE,x (general AI variable run routine) #$00F0 to $8004 (hit counter?), and zero $801E and $803C. $982B - damage palette shift routine $9878 - Hide timer? if negative set $0FAE,x to #$989D $989D - if $8038 is set, run series of JSR's, if not then zero $8038 and $12, if $8026, $8032, or $803E are negative then branch (skip random number then AND #$000E STA $12), zero $8832 load $12 into x and JMP $988D,x (will either be $98EC or $9913) (series of JSR's: $0FB0,x (initialized to 9BB7) $9C7B: $9C90: $0FB2,X (initialized to #$9DC0): $9D4D: $9D3C: $9F93) $98EC - sets $0FAE,x to #$99A4; $0FB0,x to #$E250; zeros $8002; $0FB2,x to #$9DC0; zeros $8816, then JSR $9933. $9913 - sets $0FAE,x to #$99E4; $0FB2,x to #$9E7D; $8002 to #$0030; makes sure #$0400 is NOT set in property bits $9933 - $99A4 - $99E4 - $9A46 - INC $8004 (hit counter?), if greater than or equal to #$0100 set $0FAE,x to #$9A5E $9A5E - fall and explode when dead routine: adjusts enemy y position, if less than #$00C8 add #$00C0 to $8010, if not, store #$C8 to enemy Y, #$9ACA to $0FAE (general AI variable run routine) and spawn bomb blast gfx and sound, make invisible $9ACA - check death/wall break timer, when timer is out set #$9AF9 to $0FAE (general AI variable run routine) and JSR $9ADD $9ADD - run Wall break PLM, JSL $A0BA3E (spawn item drops?) and set $8006, $8008, and $800A to #$0000 $9AF9 - if $8006 is over #$C0 set boss bit, delete enemy, and change music. If over #$40, branch to $9B22. Otherwise JMP to $9BAD $9B22 - generates explosions for breaking wall $9BAD - just incriments $8006 $9BB7 - $9C7B - $9C90 - $9D3C - $9D4D - $9DC0 - $9E7D - $9F93 - $E250 -