;;; $AC1C..B65D: Magdollite ;;; { ;;; $AC1C: Palette - enemy $E83F (Magdollite) and glow palettes ;;; { ; Only these four colors are used by glow ; |$A8:AC2E | $A8:AC1C dw 3800,001F,001C,0018,0015,7FFF,3BE0,2680,1580, 023F,00BD,0014,0010, 0000,0000,0000, ; |$A8:AC4E | $A8:AC3C dw 3800,0000,0000,0000,0000,0000,0000,0000,0000, 00BD,0014,0010,023F, 0000,0000,0000, ; |$A8:AC6E | $A8:AC5C dw 3800,0000,0000,0000,0000,0000,0000,0000,0000, 0014,0010,023F,00BD, 0000,0000,0000, ; |$A8:AC8E | $A8:AC7C dw 3800,0000,0000,0000,0000,0000,0000,0000,0000, 0010,023F,00BD,0014, 0000,0000,0000 } ;;; $AC9C..AE11: Instruction lists - Magdollite ;;; { ;;; $AC9C: Instruction list - Idling, facing left ;;; { ; idling, facing left ; idle and cycle head sprites ; runs for enemy0 $A8:AC9C dx 000D,B448, ; head, facing left 000D,B459, ; head, facing left 000D,B46A, ; head, facing left 000D,B459, ; head, facing left 80ED,AC9C ; Go to $AC9C } ;;; $ACB0: Instruction list - Slave 2 - Throw fireballs, facing left ;;; { ; facing left ; runs when reached target height, until it starts to shrink again ; runs for enemy2 $A8:ACB0 dx AE12,0061, ; Queue sound 0061h, sound library 2, max queued sounds allowed = 6 AE3A, ; Set $7E7802 AF44, ; Slave 2 - Set cooldown timer to $100 001A,B47B, ; fist, facing left 0008,B48C, ; fist, facing left AEE4, ; shift enemy2 left by 8 pixels, up by 4 0005,B49D, ; hand, fingers straight, facing left AEBA, ; Spawn Magdollite lava enemy projectile 0005,B49D, ; hand, fingers straight, facing left AEBA, ; Spawn Magdollite lava enemy projectile 0005,B49D, ; hand, fingers straight, facing left AEBA, ; Spawn Magdollite lava enemy projectile AF18, ; shift enemy2 left by 8 pixels, up by 4 0005,B4A9, ; hand, fingers curled, facing left AE45, ; Reset $7E7802 812F ; Sleep } ;;; $ACDE: Instruction list - Splash into lava and form base pillar, facing left ;;; { ; facing left ; run when triggered to attack, until base pillar done growing ; runs for enemy0 $A8:ACDE dx AE3A, ; Set $7E7802 0005,B459, ; head, facing left AE26, ; move enemy0 down by 2 pixels 0005,B459, ; head, facing left 0005,B4CF, ; head, poking out of lava, facing left 0005,B4E0, ; head, barely poking out of lava, facing left AE26, ; move enemy0 down by 2 pixels 0005,B4E0, ; head, barely poking out of lava, facing left AE64, ; move down by $18, set slaves as visible 8123,0018 ; Timer = 0018h $A8:ACFE dx AE50, ; move enemies 0-1 up 1 pixel 0001,B4C1, ; wide pillar section, facing left 8110,ACFE, ; Decrement timer and go to $ACFE if non-zero AE45, ; Reset $7E7802 812F ; Sleep } ;;; $AD0C: Instruction list - Unform base pillar and splash back to idling, facing left ;;; { ; facing left ; runs after shrinking back to base, until back to idle position ; runs for enemy0 $A8:AD0C dx AE3A, ; Set $7E7802 AE88, ; set enemies 0-1 Y position back to initial 8123,0018 ; Timer = 0018h $A8:AD14 dx AE5A, ; move enemies 0-1 down 1 pixel 0001,B4C1, ; wide pillar section, facing left 8110,AD14, ; Decrement timer and go to $AD14 if non-zero AE96, ; move down by 4, set slaves as invisible 0005,B4E0, ; head, barely poking out of lava, facing left AE30, ; move enemy0 up by 2 pixels 0005,B4E0, ; head, barely poking out of lava, facing left 0005,B4CF, ; head, poking out of lava, facing left 0005,B459, ; head, facing left AE30, ; move enemy0 up by 2 pixels 0005,B459, ; head, facing left AE45, ; Reset $7E7802 812F ; Sleep } ;;; $AD3C: Instruction list - Idling, facing right ;;; { ; initial, facing right ; idle and cycle head sprites ; runs for enemy0 $A8:AD3C dx 000D,B4F1, ; head, facing right 000D,B502, ; head, facing right 000D,B513, ; head, facing right 000D,B502, ; head, facing right 80ED,AD3C ; Go to $AD3C } ;;; $AD50: Instruction list - Slave 2 - Throw fireballs, facing right ;;; { ; facing right ; runs when reached target height, until it starts to shrink again ; runs for enemy2 $A8:AD50 dx AE12,0061, ; Queue sound 0061h, sound library 2, max queued sounds allowed = 6 AE3A, ; Set $7E7802 AF44, ; Slave 2 - Set cooldown timer to $100 001A,B524, ; fist, facing right 0008,B535, ; fist, facing right AECA, ; shift enemy2 right by 8 pixels, up by 4 0005,B546, ; hand, fingers straight, facing right AEBA, ; Spawn Magdollite lava enemy projectile 0005,B546, ; hand, fingers straight, facing right AEBA, ; Spawn Magdollite lava enemy projectile 0005,B546, ; hand, fingers straight, facing right AEBA, ; Spawn Magdollite lava enemy projectile AEFE, ; shift enemy2 right by 8 pixels, up by 4 0005,B552, ; hand, fingers curled, facing right AE45, ; Reset $7E7802 812F ; Sleep } ;;; $AD7E: Instruction list - Splash into lava and form base pillar, facing right ;;; { ; facing right ; run when triggered to attack, until base pillar done growing ; runs for enemy0 $A8:AD7E dx AE3A, ; Set $7E7802 0005,B502, ; head, facing right AE26, ; move enemy0 down by 2 pixels 0005,B502, ; head, facing right 0005,B578, ; head, poking out of lava, facing right 0005,B589, ; head, barely poking out of lava, facing right AE26, ; move enemy0 down by 2 pixels 0005,B589, ; head, barely poking out of lava, facing right AE64, ; move down by $18, set slaves as visible 8123,0018 ; Timer = 0018h $A8:AD9E dx AE50, ; move enemies 0-1 up 1 pixel 0001,B56A, ; wide pillar section, facing right 8110,AD9E, ; Decrement timer and go to $AD9E if non-zero AE45, ; Reset $7E7802 812F ; Sleep } ;;; $ADAC: Instruction list - Unform base pillar and splash back to idling, facing right ;;; { ; facing right ; runs after shrinking back to base, until back to idle position ; runs for enemy0 $A8:ADAC dx AE3A, ; Set $7E7802 AE88, ; set enemies 0-1 Y position back to initial 8123,0018 ; Timer = 0018h $A2:ADB4 dx AE5A, ; move enemies 0-1 down 1 pixel 0001,B56A, ; wide pillar section, facing right 8110,ADB4, ; Decrement timer and go to $ADB4 if non-zero AE96, ; move down by 4, set slaves as invisible 0005,B589, ; head, barely poking out of lava, facing right AE30, ; move enemy0 up by 2 pixels 0005,B589, ; head, barely poking out of lava, facing right 0005,B578, ; head, poking out of lava, facing right 0005,B502, ; head, facing right AE30, ; move enemy0 up by 2 pixels 0005,B502, ; head, facing right AE45, ; Reset $7E7802 812F ; Sleep } ;;; $ADDC: Instruction list - Slave 1 - Narrow pillar, facing left ;;; { ; initial for enemy1 ; facing left $A8:ADDC dx 0001,B59A, ; narrow pillar section, facing left 812F ; Sleep } ;;; $ADE2: Instruction list - Slave 1 - Narrow pillar, facing right ;;; { ; facing right ; runs for enemy1 $A8:ADE2 dx 0001,B5A1, ; narrow pillar section, facing right 812F ; Sleep } ;;; $ADE8: Instruction list - Slave 1 - 3x pillar stack ;;; { ; runs for enemy1 $A8:ADE8 dx 0001,B5AD, ; 3x pillar stack 812F ; Sleep } ;;; $ADEE: Instruction list - Slave 1 - 4x pillar stack ;;; { ; runs for enemy1 $A8:ADEE dx 0001,B5BE, ; 4x pillar stack 812F ; Sleep } ;;; $ADF4: Instruction list - Slave 1 - 5x pillar stack ;;; { ; runs for enemy1 $A8:ADF4 dx 0001,B5D4, ; 5x pillar stack 812F ; Sleep } ;;; $ADFA: Instruction list - Slave 1 - 6x pillar stack ;;; { ; runs for enemy1 $A8:ADFA dx 0001,B5EF, ; 6x pillar stack 812F ; Sleep } ;;; $AE00: Instruction list - Slave 1 - 7x pillar stack ;;; { ; runs for enemy1 $A8:AE00 dx 0001,B60F, ; 7x pillar stack 812F ; Sleep } ;;; $AE06: Instruction list - Slave 1 - 8x pillar stack ;;; { ; runs for enemy1 $A8:AE06 dx 0001,B634, ; 8x pillar stack 812F ; Sleep } ;;; $AE0C: Instruction list - Slave 2 - Pillar cap ;;; { ; initial for enemy2 $A8:AE0C dx 0001,B4B5, ; pillar cap, facing left 812F ; Sleep } } ;;; $AE12..AF4E: Magdollite instructions ;;; { ;;; $AE12: Instruction - Slave 2 - queue sound [[Y]], sound library 2, max queued sounds allowed = 6, if enemy is on-screen ;;; { ; used by enemy2 instruction lists $A8:AE12 DA PHX $A8:AE13 5A PHY $A8:AE14 22 70 AD A0 JSL $A0AD70[$A0:AD70] ;\ $A8:AE18 D0 07 BNE $07 [$AE21] ;} If enemy center is on screen: $A8:AE1A B9 00 00 LDA $0000,y[$A8:AD52] $A8:AE1D 22 CB 90 80 JSL $8090CB[$80:90CB] $A8:AE21 7A PLY $A8:AE22 FA PLX $A8:AE23 C8 INY $A8:AE24 C8 INY $A8:AE25 6B RTL } ;;; $AE26: Instruction ;;; { ; used by enemy0 instruction lists ; move down by 2 pixels $A8:AE26 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE29 FE 7E 0F INC $0F7E,x[$7E:0F7E] $A8:AE2C FE 7E 0F INC $0F7E,x[$7E:0F7E] ; enemy0 Y position += 2 $A8:AE2F 6B RTL } ;;; $AE30: Instruction ;;; { ; move enemy0 up by 2 pixels ; used by enemy0 instruction lists $A8:AE30 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE33 DE 7E 0F DEC $0F7E,x[$7E:0F7E] $A8:AE36 DE 7E 0F DEC $0F7E,x[$7E:0F7E] ; enemy0 Y position -= 2 $A8:AE39 6B RTL } ;;; $AE3A: Instruction ;;; { ; set $7E7802 ; used by enemies 0 and 2 instruction lists $A8:AE3A AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE3D A9 01 00 LDA #$0001 $A8:AE40 9F 02 78 7E STA $7E7802,x[$7E:7802] $A8:AE44 6B RTL } ;;; $AE45: Instruction ;;; { ; reset $7E7802 ; used by enemies 0 and 2 instruction lists $A8:AE45 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE48 A9 00 00 LDA #$0000 $A8:AE4B 9F 02 78 7E STA $7E7802,x[$7E:7802] $A8:AE4F 6B RTL } ;;; $AE50: Instruction - move enemies 0-1 up 1 pixel ;;; { ; used by enemy0 instruction lists $A8:AE50 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE53 DE 7E 0F DEC $0F7E,x[$7E:0F7E] ; enemy0 Y position -= 1 $A8:AE56 DE BE 0F DEC $0FBE,x[$7E:0FBE] ; enemy1 Y position -= 1 $A8:AE59 6B RTL } ;;; $AE5A: Instruction - move enemies 0-1 down 1 pixel ;;; { ; used by enemy0 instruction lists $A8:AE5A AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE5D FE 7E 0F INC $0F7E,x[$7E:0F7E] ; enemy0 Y position += 1 $A8:AE60 FE BE 0F INC $0FBE,x[$7E:0FBE] ; enemy1 Y position += 1 $A8:AE63 6B RTL } ;;; $AE64: Instruction ;;; { ; move down by $18, set slaves as visible ; used by enemy0 instruction lists $A8:AE64 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE67 BF 06 78 7E LDA $7E7806,x[$7E:7806] $A8:AE6B 18 CLC $A8:AE6C 69 18 00 ADC #$0018 $A8:AE6F 9D 7E 0F STA $0F7E,x[$7E:0F7E] $A8:AE72 9D BE 0F STA $0FBE,x[$7E:0FBE] ; enemy2 Y position $A8:AE75 BD C6 0F LDA $0FC6,x[$7E:0FC6] $A8:AE78 29 FF FE AND #$FEFF $A8:AE7B 9D C6 0F STA $0FC6,x[$7E:0FC6] ; enemy1 set as visible $A8:AE7E BD 06 10 LDA $1006,x[$7E:1006] $A8:AE81 29 FF FE AND #$FEFF $A8:AE84 9D 06 10 STA $1006,x[$7E:1006] ; enemy2 set as visible $A8:AE87 6B RTL } ;;; $AE88: Instruction ;;; { ; used by enemy0 instruction lists ; runs when pillar has shrunk back down to its base ; sets enemies 0-1 Y position back to initial $A8:AE88 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE8B BF 06 78 7E LDA $7E7806,x[$7E:7806] $A8:AE8F 9D 7E 0F STA $0F7E,x[$7E:0F7E] ; enemy0 Y position $A8:AE92 9D BE 0F STA $0FBE,x[$7E:0FBE] ; enemy1 Y position $A8:AE95 6B RTL } ;;; $AE96: Instruction ;;; { ; move down by 4, set slaves as invisible ; used by enemy0 instruction lists $A8:AE96 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AE99 BF 06 78 7E LDA $7E7806,x[$7E:7806] $A8:AE9D 18 CLC $A8:AE9E 69 04 00 ADC #$0004 $A8:AEA1 9D 7E 0F STA $0F7E,x[$7E:0F7E] $A8:AEA4 9D BE 0F STA $0FBE,x[$7E:0FBE] ; enemy1 Y position $A8:AEA7 BD C6 0F LDA $0FC6,x[$7E:0FC6] $A8:AEAA 09 00 01 ORA #$0100 $A8:AEAD 9D C6 0F STA $0FC6,x[$7E:0FC6] ; enemy1 set as invisible $A8:AEB0 BD 06 10 LDA $1006,x[$7E:1006] $A8:AEB3 09 00 01 ORA #$0100 $A8:AEB6 9D 06 10 STA $1006,x[$7E:1006] ; enemy2 set as invisible $A8:AEB9 6B RTL } ;;; $AEBA: Instruction - Slave 2 - Spawn Magdollite lava enemy projectile ;;; { ; used by enemy2 instruction lists $A8:AEBA 5A PHY $A8:AEBB AE 54 0E LDX $0E54 [$7E:0E54] $A8:AEBE A0 E0 E0 LDY #$E0E0 ;\ $A8:AEC1 BD AA 0F LDA $0FAA,x[$7E:102A] ;} Spawn Magdollite lava enemy projectile $A8:AEC4 22 27 80 86 JSL $868027[$86:8027] ;/ $A8:AEC8 7A PLY $A8:AEC9 6B RTL } ;;; $AECA: Instruction - Slave 2 - ;;; { ; facing right ; shift enemy2 right by 8 pixels, up by 4 ; used by enemy2 instruction list $A8:AECA AE 54 0E LDX $0E54 [$7E:0E54] $A8:AECD BF 24 78 7E LDA $7E7824,x[$7E:78A4] $A8:AED1 18 CLC $A8:AED2 69 08 00 ADC #$0008 $A8:AED5 9D 7A 0F STA $0F7A,x[$7E:0FFA] $A8:AED8 BF 26 78 7E LDA $7E7826,x[$7E:78A6] $A8:AEDC 18 CLC $A8:AEDD 69 FC FF ADC #$FFFC $A8:AEE0 9D 7E 0F STA $0F7E,x[$7E:0FFE] $A8:AEE3 6B RTL } ;;; $AEE4: Instruction - Slave 2 - ;;; { ; facing left ; shift enemy2 left by 8 pixels, up by 4 ; used by enemy2 instruction list $A8:AEE4 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AEE7 BF 24 78 7E LDA $7E7824,x[$7E:7A24] $A8:AEEB 18 CLC $A8:AEEC 69 F8 FF ADC #$FFF8 $A8:AEEF 9D 7A 0F STA $0F7A,x[$7E:117A] $A8:AEF2 BF 26 78 7E LDA $7E7826,x[$7E:7A26] $A8:AEF6 18 CLC $A8:AEF7 69 FC FF ADC #$FFFC $A8:AEFA 9D 7E 0F STA $0F7E,x[$7E:117E] $A8:AEFD 6B RTL } ;;; $AEFE: Instruction - Slave 2 - ;;; { ; facing right ; shift enemy2 right by 8 pixels, up by 4 ; used by enemy2 instruction list ; clone of $AECA $A8:AEFE AE 54 0E LDX $0E54 [$7E:0E54] $A8:AF01 BF 24 78 7E LDA $7E7824,x[$7E:78A4] $A8:AF05 18 CLC $A8:AF06 69 08 00 ADC #$0008 $A8:AF09 9D 7A 0F STA $0F7A,x[$7E:0FFA] $A8:AF0C BF 26 78 7E LDA $7E7826,x[$7E:78A6] $A8:AF10 18 CLC $A8:AF11 69 F8 FF ADC #$FFF8 $A8:AF14 9D 7E 0F STA $0F7E,x[$7E:0FFE] $A8:AF17 6B RTL } ;;; $AF18: Instruction - Slave 2 - ;;; { ; facing left ; shift enemy2 left by 8 pixels, up by 4 ; used by enemy2 instruction list ; clone of $AEE4 $A8:AF18 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AF1B BF 24 78 7E LDA $7E7824,x[$7E:7A24] $A8:AF1F 18 CLC $A8:AF20 69 F8 FF ADC #$FFF8 $A8:AF23 9D 7A 0F STA $0F7A,x[$7E:117A] $A8:AF26 BF 26 78 7E LDA $7E7826,x[$7E:7A26] $A8:AF2A 18 CLC $A8:AF2B 69 FC FF ADC #$FFFC $A8:AF2E 9D 7E 0F STA $0F7E,x[$7E:117E] $A8:AF31 6B RTL } ;;; $AF32: Unused ;;; { $A8:AF32 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AF35 BF 24 78 7E LDA $7E7824,x $A8:AF39 9D 7A 0F STA $0F7A,x $A8:AF3C BF 26 78 7E LDA $7E7826,x $A8:AF40 9D 7E 0F STA $0F7E,x $A8:AF43 6B RTL } ;;; $AF44: Instruction - Slave 2 - Set cooldown timer to $100 ;;; { ; enemy2 cooldown timer = $100 ; used by enemy2 instruction lists $A8:AF44 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AF47 A9 00 01 LDA #$0100 $A8:AF4A 9F 08 78 7E STA $7E7808,x[$7E:7888]; enemy2 cooldown timer = $100 $A8:AF4E 6B RTL } } ;;; $AF4F: Initialization AI function pointers ;;; { ; init AI function pointers, indexed by $0FB4 $A8:AF4F dw AF9D, AFE2, B020 } ;;; $AF55: Magdollite constants ;;; { ; probably related to extra tall stacks ; all indexed by $0FAA $A8:AF55 dw 0000, 0010, 0020, 0030, 0040, 0050, 0060, 0070, 0080 ; compared to $0FB0 $A8:AF67 dw ADDC, ADDC, ADE2, ADE8, ADEE, ADF4, ADFA, AE00, AE06 ; instruction list pointers for enemy1 $A8:AF79 dw 000C, 000C, 0014, 001C, 0024, 002C, 0034, 003C, 0044 ; Y offset for comparing to Samus height, puts enemy2 at correct height to aim at Samus? } ;;; $AF8B: Initialization AI - enemy $E83F (Magdollite) ;;; { $A8:AF8B AE 54 0E LDX $0E54 [$7E:0E54] ; every one of these is useless except these in init routines $A8:AF8E BD B4 0F LDA $0FB4,x[$7E:0FB4] ; enemy part index $A8:AF91 0A ASL A $A8:AF92 AA TAX $A8:AF93 FC 4F AF JSR ($AF4F,x)[$A8:AF9D] $A8:AF96 20 5E B0 JSR $B05E [$A8:B05E] ; sets some speed values based on speed2 low byte $A8:AF99 20 88 B0 JSR $B088 [$A8:B088] ; set Magdollite graphics drawn hook $A8:AF9C 6B RTL } ;;; $AF9D: Init function - Master Magdollite ;;; { ; enemy0 init function $A8:AF9D AE 54 0E LDX $0E54 [$7E:0E54] $A8:AFA0 A9 00 00 LDA #$0000 $A8:AFA3 9D AC 0F STA $0FAC,x[$7E:0FAC] ; reset previous instruction list pointer $A8:AFA6 9F 00 78 7E STA $7E7800,x[$7E:7800]; facing direction = left $A8:AFAA 9F 04 78 7E STA $7E7804,x[$7E:7804]; reset flag for communicating with enemy1 $A8:AFAE BD 7E 0F LDA $0F7E,x[$7E:0F7E] $A8:AFB1 9F 06 78 7E STA $7E7806,x[$7E:7806]; $7E7806 = enemy0 Y position $A8:AFB5 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\ $A8:AFB9 10 07 BPL $07 [$AFC2] ;} If [Samus X position] < [enemy X position]: $A8:AFBB A9 01 00 LDA #$0001 $A8:AFBE 9F 00 78 7E STA $7E7800,x[$7E:7800]; facing direction = right $A8:AFC2 BF 00 78 7E LDA $7E7800,x[$7E:7800]; >_<; $A8:AFC6 A9 9C AC LDA #$AC9C ; Idling, facing left $A8:AFC9 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:AFCC BF 00 78 7E LDA $7E7800,x[$7E:7800] $A8:AFD0 D0 06 BNE $06 [$AFD8] ; if facing left: >.< (backwards) $A8:AFD2 A9 3C AD LDA #$AD3C ; Idling, facing right $A8:AFD5 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:AFD8 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:AFDB A9 1A B1 LDA #$B11A ; Wait for Samus to get near $A8:AFDE 9D B2 0F STA $0FB2,x[$7E:0FB2] ; next function pointer $A8:AFE1 60 RTS } ;;; $AFE2: Init function - Slave 1 ;;; { ; enemy1 init function $A8:AFE2 AE 54 0E LDX $0E54 [$7E:0E54] $A8:AFE5 BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:AFE8 9F 06 78 7E STA $7E7806,x[$7E:7846]; $7E7806 = enemy0 Y position $A8:AFEC A9 00 00 LDA #$0000 $A8:AFEF 9D AC 0F STA $0FAC,x[$7E:0FEC] ; reset previous instruction list pointer $A8:AFF2 9F 18 78 7E STA $7E7818,x[$7E:7858]; reset done growing flag $A8:AFF6 A9 01 00 LDA #$0001 $A8:AFF9 9F 1A 78 7E STA $7E781A,x[$7E:785A]; set waiting flag $A8:AFFD A9 DC AD LDA #$ADDC ; Slave 1 - Narrow pillar, facing left $A8:B000 9D AE 0F STA $0FAE,x[$7E:0FEE] ; instruction list pointer $A8:B003 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B006 BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B009 18 CLC $A8:B00A 69 20 00 ADC #$0020 $A8:B00D 9D 7E 0F STA $0F7E,x[$7E:0FBE] ; enemy1 Y position += $20 $A8:B010 A9 DD B1 LDA #$B1DD ; Wait for attack to be triggered $A8:B013 9D B2 0F STA $0FB2,x[$7E:0FF2] ; next function pointer $A8:B016 BD 86 0F LDA $0F86,x[$7E:0FC6] $A8:B019 09 00 01 ORA #$0100 $A8:B01C 9D 86 0F STA $0F86,x[$7E:0FC6] ; set as invisible $A8:B01F 60 RTS } ;;; $B020: Init function - Slave 2 ;;; { ; enemy2 init function $A8:B020 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B023 BD 7E 0F LDA $0F7E,x[$7E:0FFE] $A8:B026 9F 06 78 7E STA $7E7806,x[$7E:7886]; never read? ($7E7886) $A8:B02A BD 7A 0F LDA $0F7A,x[$7E:0FFA] $A8:B02D 9F 22 78 7E STA $7E7822,x[$7E:78A2]; never read? ($7E78A2) $A8:B031 A9 00 00 LDA #$0000 $A8:B034 9D AC 0F STA $0FAC,x[$7E:102C] ; reset previous instruction list pointer $A8:B037 9F 08 78 7E STA $7E7808,x[$7E:7888]; reset cooldown timer $A8:B03B A9 0C AE LDA #$AE0C ; Slave 2 - Pillar cap $A8:B03E 9D AE 0F STA $0FAE,x[$7E:102E] ; instruction list pointer $A8:B041 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B044 BD 7E 0F LDA $0F7E,x[$7E:0FFE] $A8:B047 18 CLC $A8:B048 69 20 00 ADC #$0020 $A8:B04B 9D 7E 0F STA $0F7E,x[$7E:0FFE] ; enemy2 Y position -= $20 $A8:B04E A9 0D B3 LDA #$B30D ; Slave 2 - Idling, waiting for trigger $A8:B051 9D B2 0F STA $0FB2,x[$7E:1032] ; next function pointer $A8:B054 BD 86 0F LDA $0F86,x[$7E:1006] $A8:B057 09 00 01 ORA #$0100 $A8:B05A 9D 86 0F STA $0F86,x[$7E:1006] ; set as invisible $A8:B05D 60 RTS } ;;; $B05E: ;;; { ; only called from init AI, all parts run this code ; sets some speed values based on speed2 low byte $A8:B05E AE 54 0E LDX $0E54 [$7E:0E54] $A8:B061 BD B7 0F LDA $0FB7,x[$7E:0FB7] ; high byte of $0FB6, $3A for first part, 0 for the rest? $A8:B064 29 FF 00 AND #$00FF $A8:B067 0A ASL A $A8:B068 0A ASL A $A8:B069 0A ASL A $A8:B06A A8 TAY ; Y = low byte of speed2 * 8 = $1D0 or 0 for slave parts $A8:B06B B9 87 81 LDA $8187,y[$A8:8357] ; common speed table $A8:B06E 9F 10 78 7E STA $7E7810,x[$7E:7810]; $7E7810 = 3 for enemy0, 0 for enemies 1-2 $A8:B072 B9 89 81 LDA $8189,y[$A8:8359] $A8:B075 9F 0E 78 7E STA $7E780E,x[$7E:780E]; $7E780E = $A000 for enemy0, 0 for enemies 1-2 $A8:B079 B9 8B 81 LDA $818B,y[$A8:835B] $A8:B07C 9F 14 78 7E STA $7E7814,x[$7E:7814]; $7E7814 = $FFFC for enemy0, 0 for enemies 1-2 $A8:B080 B9 8D 81 LDA $818D,y[$A8:835D] $A8:B083 9F 12 78 7E STA $7E7812,x[$7E:7812]; $7E7812 = $6000 for enemy0, 0 for enemies 1-2 $A8:B087 60 RTS } ;;; $B088: Set Magdollite graphics drawn hook ;;; { ; only called from init AI, all parts run this code $A8:B088 A9 B2 B0 LDA #$B0B2 $A8:B08B 8D 8C 17 STA $178C [$7E:178C] ; Enemy graphics drawn hook = Magdollite - periodically cycle between palettes $A8:B08E A9 A8 00 LDA #$00A8 $A8:B091 8D 8E 17 STA $178E [$7E:178E] ; bank = $A8 $A8:B094 BD 96 0F LDA $0F96,x[$7E:0F96] ; palette index, $E00 $A8:B097 29 00 0E AND #$0E00 $A8:B09A 4A LSR A $A8:B09B 4A LSR A $A8:B09C 4A LSR A $A8:B09D 4A LSR A $A8:B09E 18 CLC $A8:B09F 69 00 01 ADC #$0100 $A8:B0A2 8D 94 17 STA $1794 [$7E:1794] ; Enemy palette cycle enemy palette index = $E00 / $10 + $100 = $1E0 $A8:B0A5 A9 08 00 LDA #$0008 $A8:B0A8 8D 98 17 STA $1798 [$7E:1798] ; palette cycle timer = 8 $A8:B0AB A9 00 00 LDA #$0000 $A8:B0AE 8D 96 17 STA $1796 [$7E:1796] ; palette cycle color set index = 0 $A8:B0B1 60 RTS } ;;; $B0B2: Enemy graphics drawn hook - Magdollite - periodically cycle between palettes ;;; { ; Why is this one implemented differently to the others? >_<; $A8:B0B2 AD 97 07 LDA $0797 [$7E:0797] ;\ $A8:B0B5 D0 52 BNE $52 [$B109] ;} If currently transitioning the room: return $A8:B0B7 AE 54 0E LDX $0E54 [$7E:0E54] ; >_< $A8:B0BA AD 98 17 LDA $1798 [$7E:1798] ;\ $A8:B0BD 3A DEC A ;} Decrement enemy palette cycle timer $A8:B0BE 8D 98 17 STA $1798 [$7E:1798] ;/ $A8:B0C1 D0 46 BNE $46 [$B109] ; If [enemy palette cycle timer] != 0: return $A8:B0C3 A9 08 00 LDA #$0008 ;\ $A8:B0C6 8D 98 17 STA $1798 [$7E:1798] ;} Enemy palette cycle timer = 8 $A8:B0C9 AD 96 17 LDA $1796 [$7E:1796] ;\ $A8:B0CC 1A INC A ;} Increment enemy palette cycle color set index $A8:B0CD 8D 96 17 STA $1796 [$7E:1796] ;/ $A8:B0D0 29 03 00 AND #$0003 ;\ $A8:B0D3 0A ASL A ;| $A8:B0D4 0A ASL A ;| $A8:B0D5 0A ASL A ;| $A8:B0D6 0A ASL A ;| $A8:B0D7 0A ASL A ;| $A8:B0D8 A8 TAY ;| Y = palette cycle color set index % 3 * $20 $A8:B0D9 B9 2E AC LDA $AC2E,y[$A8:AC4E] ;| $A8:B0DC 85 12 STA $12 [$7E:0012] ;| $A8:B0DE B9 30 AC LDA $AC30,y[$A8:AC50] ;| $A8:B0E1 85 14 STA $14 [$7E:0014] ;| $A8:B0E3 B9 32 AC LDA $AC32,y[$A8:AC52] ;| $A8:B0E6 85 16 STA $16 [$7E:0016] ;} Copy 4 colors from $AC2E + [enemy palette cycle color set index] % 4 * 20h to enemy palette colors 9..Ch $A8:B0E8 B9 34 AC LDA $AC34,y[$A8:AC54] ;| $A8:B0EB 85 18 STA $18 [$7E:0018] ;| $A8:B0ED AD 94 17 LDA $1794 [$7E:1794] ;| $A8:B0F0 AA TAX ;| $A8:B0F1 A5 12 LDA $12 [$7E:0012] ;| $A8:B0F3 9F 12 C0 7E STA $7EC012,x[$7E:C1F2];| $A8:B0F7 A5 14 LDA $14 [$7E:0014] ;| $A8:B0F9 9F 14 C0 7E STA $7EC014,x[$7E:C1F4];| $A8:B0FD A5 16 LDA $16 [$7E:0016] ;| $A8:B0FF 9F 16 C0 7E STA $7EC016,x[$7E:C1F6];| $A8:B103 A5 18 LDA $18 [$7E:0018] ;| $A8:B105 9F 18 C0 7E STA $7EC018,x[$7E:C1F8];/ $A8:B109 6B RTL } ;;; $B10A: Main AI - enemy $E83F (Magdollite) ;;; { $A8:B10A AE 54 0E LDX $0E54 [$7E:0E54] $A8:B10D BF 08 78 7E LDA $7E7808,x[$7E:7808] $A8:B111 3A DEC A $A8:B112 9F 08 78 7E STA $7E7808,x[$7E:7808]; only enemy2's cooldown timer ($7E7888) is used $A8:B116 FC B2 0F JSR ($0FB2,x)[$A8:B11A] $A8:B119 6B RTL } ;;; $B11A: Function - Wait for Samus to get near ;;; { ; triggers attack when Samus in proximity and enemy2 cooldown expired ; first function when speed2 = 0 (enemy0) ; only runs for enemy0 $A8:B11A AE 54 0E LDX $0E54 [$7E:0E54] $A8:B11D A9 00 00 LDA #$0000 $A8:B120 9F 00 78 7E STA $7E7800,x[$7E:7800]; facing direction = left $A8:B124 A9 9C AC LDA #$AC9C ; Idling, facing left $A8:B127 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B12A 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\ $A8:B12E 30 0D BMI $0D [$B13D] ;} If [Samus X position] >= [enemy X position]: $A8:B130 A9 3C AD LDA #$AD3C ; Idling, facing right $A8:B133 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B136 A9 01 00 LDA #$0001 $A8:B139 9F 00 78 7E STA $7E7800,x[$7E:7800]; facing direction = right ; facing direction chosen $A8:B13D 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B140 BF 88 78 7E LDA $7E7888,x[$7E:7888] $A8:B144 10 2E BPL $2E [$B174] ; if enemy2 cooldown timer < 0: $A8:B146 A9 00 00 LDA #$0000 $A8:B149 9F 88 78 7E STA $7E7888,x[$7E:7888]; reset enemy2 cooldown timer $A8:B14D BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\ $A8:B150 29 FF 00 AND #$00FF ;| $A8:B153 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;} If Samus is not within (always $60) [enemy $0FB6] pixel columns of enemy: return $A8:B157 F0 1B BEQ $1B [$B174] ;/ if Samus is in proximity: $A8:B159 A9 DE AC LDA #$ACDE ; Splash into lava and form base pillar, facing left $A8:B15C 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B15F BF 00 78 7E LDA $7E7800,x[$7E:7800] $A8:B163 F0 06 BEQ $06 [$B16B] ; if facing right: $A8:B165 A9 7E AD LDA #$AD7E ; Splash into lava and form base pillar, facing right $A8:B168 9D AE 0F STA $0FAE,x[$7E:112E] ; instruction list pointer ; facing direction chosen $A8:B16B 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B16E A9 75 B1 LDA #$B175 ; Wait until base pillar formed $A8:B171 9D B2 0F STA $0FB2,x[$7E:0FB2] ; next function pointer $A8:B174 60 RTS } ;;; $B175: Function - Wait until base pillar formed ;;; { ; only runs for enemy0 ; runs when triggered to attack, until base pillar formed $A8:B175 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B178 BF 02 78 7E LDA $7E7802,x[$7E:7802] $A8:B17C D0 14 BNE $14 [$B192] ; if base pillar formed: $A8:B17E A9 01 00 LDA #$0001 $A8:B181 9F 04 78 7E STA $7E7804,x[$7E:7804]; set enemy0 waiting flag $A8:B185 A9 00 00 LDA #$0000 $A8:B188 9F 5A 78 7E STA $7E785A,x[$7E:785A]; reset enemy1's $7E781A $A8:B18C A9 93 B1 LDA #$B193 ; Wait for other parts to finish $A8:B18F 9D B2 0F STA $0FB2,x[$7E:0FB2] ; next function pointer $A8:B192 60 RTS } ;;; $B193: Function - Wait for other parts to finish ;;; { ; only runs for enemy0 ; runs when the base pillar is formed, until the base pillar starts unforming $A8:B193 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B196 BF 04 78 7E LDA $7E7804,x[$7E:7804] $A8:B19A D0 1B BNE $1B [$B1B7] ; if waiting flag reset: $A8:B19C A9 0C AD LDA #$AD0C ; Unform base pillar and splash back to idling, facing left $A8:B19F 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B1A2 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\ $A8:B1A6 30 06 BMI $06 [$B1AE] ;} If [Samus X position] >= [enemy X position]: $A8:B1A8 A9 AC AD LDA #$ADAC ; Unform base pillar and splash back to idling, facing right $A8:B1AB 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer ; facing direction chosen $A8:B1AE 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B1B1 A9 B8 B1 LDA #$B1B8 ; Unform base pillar back to head idling $A8:B1B4 9D B2 0F STA $0FB2,x[$7E:0FB2] ; next function pointer $A8:B1B7 60 RTS } ;;; $B1B8: Function - Unform base pillar back to head idling ;;; { ; only runs for enemy0 ; runs when base pillar unforms, until head is back at idle $A8:B1B8 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B1BB BF 02 78 7E LDA $7E7802,x[$7E:7802] $A8:B1BF D0 1B BNE $1B [$B1DC] ; if waiting flag reset: $A8:B1C1 A9 9C AC LDA #$AC9C ; Idling, facing left $A8:B1C4 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B1C7 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\ $A8:B1CB 30 06 BMI $06 [$B1D3] ;} If [Samus X position] >= [enemy X position]: $A8:B1CD A9 3C AD LDA #$AD3C ; Idling, facing right $A8:B1D0 9D AE 0F STA $0FAE,x[$7E:0FAE] ; instruction list pointer ; facing direction chosen $A8:B1D3 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B1D6 A9 1A B1 LDA #$B11A ; Wait for Samus to get near $A8:B1D9 9D B2 0F STA $0FB2,x[$7E:0FB2] ; next function pointer $A8:B1DC 60 RTS } ;;; $B1DD: Function - Slave 1 - Wait for attack to be triggered ;;; { ; only runs for enemy1 ; runs while idle $A8:B1DD AE 54 0E LDX $0E54 [$7E:0E54] $A8:B1E0 BF 1A 78 7E LDA $7E781A,x[$7E:785A] $A8:B1E4 D0 1D BNE $1D [$B203] ; if waiting flag reset: (by enemy0) $A8:B1E6 A9 04 B2 LDA #$B204 ; Slave 1 - Handle pillar growth $A8:B1E9 9D B2 0F STA $0FB2,x[$7E:0FF2] ; next function pointer $A8:B1EC A9 00 00 LDA #$0000 $A8:B1EF 9D B0 0F STA $0FB0,x[$7E:0FF0] $A8:B1F2 9F 1A 78 7E STA $7E781A,x[$7E:785A]; >.< $A8:B1F6 A9 02 00 LDA #$0002 $A8:B1F9 9D AA 0F STA $0FAA,x[$7E:0FEA] ; pillar growth index = 2 $A8:B1FC BF 06 78 7E LDA $7E7806,x[$7E:7846] $A8:B200 9D 7E 0F STA $0F7E,x[$7E:0FBE] $A8:B203 60 RTS } ;;; $B204: Function - Slave 1 - Handle pillar growth ;;; { ; only runs for enemy1 ; runs after triggered to attack, until reached target height ; handles pillar growth $A8:B204 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B207 18 CLC $A8:B208 BD 80 0F LDA $0F80,x[$7E:0FC0] $A8:B20B 7F D2 77 7E ADC $7E77D2,x[$7E:7812]; $6000 $A8:B20F 9D 80 0F STA $0F80,x[$7E:0FC0] ; enemy Y subposition += common speed table value $A8:B212 90 03 BCC $03 [$B217] ; if carry set: $A8:B214 FE B0 0F INC $0FB0,x[$7E:0FF0] ; $0FB0 += 1 ; handled subpixel rollover $A8:B217 BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B21A 7F D4 77 7E ADC $7E77D4,x[$7E:7814]; $FFFC $A8:B21E 9D 7E 0F STA $0F7E,x[$7E:0FBE] ; enemy Y position += growth rate $A8:B221 18 CLC $A8:B222 BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B225 7F D4 77 7E ADC $7E77D4,x[$7E:7814]; $FFFC $A8:B229 9D B0 0F STA $0FB0,x[$7E:0FF0] ; pillar growth += growth rate $A8:B22C 20 30 B2 JSR $B230 [$A8:B230] ; Slave 1 - Add pillar stacks until it reaches Samus' height $A8:B22F 60 RTS ; >.< pointless JSR + RTS } ;;; $B230: Slave 1 - Add pillar stacks until it reaches Samus' height ;;; { ; only runs for enemy1 ; only called by $B204 above $A8:B230 BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B233 49 FF FF EOR #$FFFF $A8:B236 1A INC A $A8:B237 C9 6C 00 CMP #$006C $A8:B23A 10 1D BPL $1D [$B259] ; if pillar growth < $6C (max height, 1 tile below ceiling): $A8:B23C BC AA 0F LDY $0FAA,x[$7E:0FEA] $A8:B23F BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B242 38 SEC $A8:B243 F9 79 AF SBC $AF79,y[$A8:AF7B] $A8:B246 CD FA 0A CMP $0AFA [$7E:0AFA] $A8:B249 30 0E BMI $0E [$B259] ; if enemy Y position - $AF79,Y >= Samus Y position: $A8:B24B BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B24E 49 FF FF EOR #$FFFF $A8:B251 1A INC A $A8:B252 D9 55 AF CMP $AF55,y[$A8:AF57] $A8:B255 10 1D BPL $1D [$B274] ; if pillar growth < $AF55,Y: return $A8:B257 80 37 BRA $37 [$B290] ; >.< ; done growing $A8:B259 A9 91 B2 LDA #$B291 ; RTS $A8:B25C 9D B2 0F STA $0FB2,x[$7E:0FF2] ; next function pointer $A8:B25F A9 01 00 LDA #$0001 $A8:B262 9F 18 78 7E STA $7E7818,x[$7E:7858]; set waiting flag $A8:B266 BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B269 49 FF FF EOR #$FFFF $A8:B26C 1A INC A $A8:B26D D9 55 AF CMP $AF55,y[$A8:AF57] $A8:B270 10 02 BPL $02 [$B274] ; if pillar growth < $AF55,Y: return $A8:B272 80 1C BRA $1C [$B290] ; >.< ; increase pillar stack $A8:B274 FE AA 0F INC $0FAA,x[$7E:0FEA] $A8:B277 FE AA 0F INC $0FAA,x[$7E:0FEA] ; pillar growth index += 2 $A8:B27A BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B27D 18 CLC $A8:B27E 69 08 00 ADC #$0008 $A8:B281 9D 7E 0F STA $0F7E,x[$7E:0FBE] ; Y position += 8 $A8:B284 BC AA 0F LDY $0FAA,x[$7E:0FEA] $A8:B287 B9 67 AF LDA $AF67,y[$A8:AF6B] ; instruction list pointers for enemy1 $A8:B28A 9D AE 0F STA $0FAE,x[$7E:0FEE] ; instruction list pointer $A8:B28D 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B290 60 RTS } ;;; $B291: Function - Slave 1 - RTS ;;; { ; only runs for enemy1 ; runs after reaching target height, until done with hand animation $A8:B291 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B294 60 RTS } ;;; $B295: Function - Slave 1 - Handle pillar shrinking ;;; { ; only runs for enemy1 ; runs after firing projectiles, until done shrinking ; probably handles how many pillar stacks are needed ; lowers enemy1 Y position based on common speed table $A8:B295 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B298 BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B29B 18 CLC $A8:B29C 7F D0 77 7E ADC $7E77D0,x[$7E:7810]; 3 $A8:B2A0 9D 7E 0F STA $0F7E,x[$7E:0FBE] ; enemy Y position += common speed table value $A8:B2A3 BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B2A6 18 CLC $A8:B2A7 7F D0 77 7E ADC $7E77D0,x[$7E:7810]; 3 $A8:B2AB 9D B0 0F STA $0FB0,x[$7E:0FF0] ; $0FB0 += common speed table value $A8:B2AE BD 80 0F LDA $0F80,x[$7E:0FC0] $A8:B2B1 18 CLC $A8:B2B2 7F CE 77 7E ADC $7E77CE,x[$7E:780E]; $A000 $A8:B2B6 90 06 BCC $06 [$B2BE] $A8:B2B8 FE 7E 0F INC $0F7E,x[$7E:0FBE] ; enemy Y position += 1 $A8:B2BB FE B0 0F INC $0FB0,x[$7E:0FF0] ; pillar growth += 1 $A8:B2BE 9D 80 0F STA $0F80,x[$7E:0FC0] ; enemy Y subposition = enemy Y subposition + common speed table value $A8:B2C1 20 C5 B2 JSR $B2C5 [$A8:B2C5] ; Remove pillar stacks until back to base height $A8:B2C4 60 RTS ; >.< pointless JSR + RTS } ;;; $B2C5: Remove pillar stacks until back to base height ;;; { ; only called by $B295 above, for enemy1 ; probably handles how many pillar stacks were needed ; handles pillar shrinking $A8:B2C5 BC AA 0F LDY $0FAA,x[$7E:0FEA] $A8:B2C8 88 DEY $A8:B2C9 88 DEY $A8:B2CA BD B0 0F LDA $0FB0,x[$7E:0FF0] $A8:B2CD 10 29 BPL $29 [$B2F8] ; if pillar growth < 0: $A8:B2CF 49 FF FF EOR #$FFFF $A8:B2D2 1A INC A $A8:B2D3 D9 55 AF CMP $AF55,y[$A8:AF57] $A8:B2D6 30 02 BMI $02 [$B2DA] ; if pillar growth >= $AF55,Y: return $A8:B2D8 80 32 BRA $32 [$B30C] ; >.< ; growth < table, so remove a tile and recenter Y position $A8:B2DA DE AA 0F DEC $0FAA,x[$7E:0FEA] $A8:B2DD DE AA 0F DEC $0FAA,x[$7E:0FEA] ; pillar growth index -= 2 $A8:B2E0 BD 7E 0F LDA $0F7E,x[$7E:0FBE] $A8:B2E3 38 SEC $A8:B2E4 E9 08 00 SBC #$0008 $A8:B2E7 9D 7E 0F STA $0F7E,x[$7E:0FBE] ; Y position -= 8 $A8:B2EA BC AA 0F LDY $0FAA,x[$7E:0FEA] $A8:B2ED B9 67 AF LDA $AF67,y[$A8:AF69] ; instruction list pointers for enemy1 $A8:B2F0 9D AE 0F STA $0FAE,x[$7E:0FEE] ; instruction list pointer $A8:B2F3 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B2F6 80 14 BRA $14 [$B30C] ; >.< ; done shrinking $A8:B2F8 A9 01 00 LDA #$0001 $A8:B2FB 9F 1A 78 7E STA $7E781A,x[$7E:785A]; set waiting flag $A8:B2FF A9 00 00 LDA #$0000 $A8:B302 9F C4 77 7E STA $7E77C4,x[$7E:7804]; reset enemy0's waiting flag $A8:B306 A9 DD B1 LDA #$B1DD ; Wait for attack to be triggered $A8:B309 9D B2 0F STA $0FB2,x[$7E:0FF2] ; next function pointer $A8:B30C 60 RTS } ;;; $B30D: Function - Slave 2 - Idling, waiting for trigger ;;; { ; initial function for enemy2 $A8:B30D AE 54 0E LDX $0E54 [$7E:0E54] $A8:B310 BD 32 0F LDA $0F32,x[$7E:0FB2] $A8:B313 C9 75 B1 CMP #$B175 $A8:B316 D0 06 BNE $06 [$B31E] ; if enemy0 function pointer = $B175 Wait until base pillar formed $A8:B318 A9 56 B3 LDA #$B356 ; Slave 2 - Set to throw fireballs after finsihed growing $A8:B31B 9D B2 0F STA $0FB2,x[$7E:1032] ; next function pointer $A8:B31E 60 RTS } ;;; $B31F: Function - Slave 2 - Trigger slave 1 to shrink after throwing fireballs ;;; { ; runs for enemy2, after reaching target height, until done spawning projectiles $A8:B31F AE 54 0E LDX $0E54 [$7E:0E54] $A8:B322 BF 02 78 7E LDA $7E7802,x[$7E:7882] $A8:B326 D0 2A BNE $2A [$B352] ; if waiting flag = 0: (done throwing fireballs instruction) $A8:B328 A9 0C AE LDA #$AE0C ; Slave 2 - Pillar cap $A8:B32B 9D AE 0F STA $0FAE,x[$7E:102E] ; instruction list pointer $A8:B32E 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B331 A9 95 B2 LDA #$B295 ; Slave 1 - Handle pillar shrinking $A8:B334 9D 72 0F STA $0F72,x[$7E:0FF2] ; enemy2 setting enemy1 next function pointer $A8:B337 A9 A7 B3 LDA #$B3A7 ; Slave 2 - Go back to idling after pillar shrinks $A8:B33A 9D B2 0F STA $0FB2,x[$7E:1032] ; next function pointer $A8:B33D A9 00 00 LDA #$0000 $A8:B340 9F D8 77 7E STA $7E77D8,x[$7E:7858]; reset enemy1 done growing flag $A8:B344 BF 24 78 7E LDA $7E7824,x[$7E:78A4] $A8:B348 9D 7A 0F STA $0F7A,x[$7E:0FFA] ; enemy X position = previous X position $A8:B34B BF 26 78 7E LDA $7E7826,x[$7E:78A6] $A8:B34F 9D 7E 0F STA $0F7E,x[$7E:0FFE] ; enemy Y position = previous Y position ; waiting / done $A8:B352 20 CB B3 JSR $B3CB [$A8:B3CB] ; Set Master's Y radius $A8:B355 60 RTS } ;;; $B356: Function - Slave 2 - Set to throw fireballs after finsihed growing ;;; { ; only runs for enemy2 when enemy0's function pointer is $B175 ; runs when attack triggered, until target height reached $A8:B356 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B359 BF D8 77 7E LDA $7E77D8,x[$7E:7858] $A8:B35D F0 37 BEQ $37 [$B396] ; if waiting flag != 0: $A8:B35F A9 B0 AC LDA #$ACB0 ; Slave 2 - Throw fireballs, facing left $A8:B362 9D AE 0F STA $0FAE,x[$7E:102E] ; instruction list pointer $A8:B365 A9 00 00 LDA #$0000 $A8:B368 9D AA 0F STA $0FAA,x[$7E:102A] ; projectile facing left $A8:B36B 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\ $A8:B36F 30 0C BMI $0C [$B37D] ;} If [Samus X position] >= [enemy X position]: $A8:B371 A9 50 AD LDA #$AD50 ; Slave 2 - Throw fireballs, facing right $A8:B374 9D AE 0F STA $0FAE,x[$7E:102E] ; instruction list pointer $A8:B377 A9 01 00 LDA #$0001 $A8:B37A 9D AA 0F STA $0FAA,x[$7E:102A] ; projectile facing right ; direction chosen $A8:B37D 20 E5 B3 JSR $B3E5 [$A8:B3E5] ; Check if instruction list changed $A8:B380 A9 1F B3 LDA #$B31F ; Slave 2 - Trigger slave 1 to shrink after throwing fireballs $A8:B383 9D B2 0F STA $0FB2,x[$7E:1032] ; next function pointer $A8:B386 BD 7A 0F LDA $0F7A,x[$7E:0FFA] $A8:B389 9F 24 78 7E STA $7E7824,x[$7E:78A4]; previous X position = enemy X position $A8:B38D BD 7E 0F LDA $0F7E,x[$7E:0FFE] $A8:B390 9F 26 78 7E STA $7E7826,x[$7E:78A6]; previous Y position = enemy Y position $A8:B394 80 0D BRA $0D [$B3A3] ; still waiting for pillar to finish growing $A8:B396 BC 6A 0F LDY $0F6A,x[$7E:0FEA] ; enemy2 using enemy1's pillar growth index $A8:B399 BD 3E 0F LDA $0F3E,x[$7E:0FBE] ; enemy2 using enemy1's Y position $A8:B39C 38 SEC $A8:B39D F9 79 AF SBC $AF79,y[$A8:AF79] $A8:B3A0 9D 7E 0F STA $0F7E,x[$7E:0FFE] ; enemy2 Y position = enemy1 Y position - $AF79,Y $A8:B3A3 20 CB B3 JSR $B3CB [$A8:B3CB] ; Set Master's Y radius $A8:B3A6 60 RTS } ;;; $B3A7: Function - Slave 2 - Go back to idling after pillar shrinks ;;; { ; only runs for enemy2 ; runs after firing projectiles, until back to idle $A8:B3A7 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B3AA BD 32 0F LDA $0F32,x[$7E:0FB2] $A8:B3AD C9 1A B1 CMP #$B11A $A8:B3B0 D0 08 BNE $08 [$B3BA] ; if enemy0 function pointer = $B11A Wait for Samus to get near: $A8:B3B2 A9 0D B3 LDA #$B30D ; Slave 2 - Idling, waiting for trigger $A8:B3B5 9D B2 0F STA $0FB2,x[$7E:1032] ; next function pointer $A8:B3B8 80 0D BRA $0D [$B3C7] $A8:B3BA BC 6A 0F LDY $0F6A,x[$7E:0FEA] ; enemy2 using enemy1's pillar growth index $A8:B3BD BD 3E 0F LDA $0F3E,x[$7E:0FBE] ; enemy2 using enemy1's Y position $A8:B3C0 38 SEC $A8:B3C1 F9 79 AF SBC $AF79,y[$A8:AF7B] $A8:B3C4 9D 7E 0F STA $0F7E,x[$7E:0FFE] ; enemy2 Y position = enemy1 Y position - $AF79,Y ; done $A8:B3C7 20 CB B3 JSR $B3CB [$A8:B3CB] ; Set Master's Y radius $A8:B3CA 60 RTS } ;;; $B3CB: Set Master's Y radius ;;; { ; called at the end of several functions ; sets enemy0's Y radius $A8:B3CB BD FE 0E LDA $0EFE,x[$7E:0F7E] ; enemy2 checking enemy0 Y position $A8:B3CE 38 SEC $A8:B3CF FD 7E 0F SBC $0F7E,x[$7E:0FFE] ; enemy2 Y position $A8:B3D2 18 CLC $A8:B3D3 69 02 00 ADC #$0002 $A8:B3D6 9D 04 0F STA $0F04,x[$7E:0F84] ; enemy2 Y radius = enemy0 Y position - enemy2 Y position + 2 $A8:B3D9 C9 08 00 CMP #$0008 $A8:B3DC 10 06 BPL $06 [$B3E4] ; if enemy2 Y radius < 8: $A8:B3DE A9 08 00 LDA #$0008 $A8:B3E1 9D 04 0F STA $0F04,x[$7E:0F84] ; minimum 8 $A8:B3E4 60 RTS } ;;; $B3E5: Check if instruction list changed ;;; { ; gets called a lot ; check if instruction list pointer changed and sets timers to 1 if so $A8:B3E5 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B3E8 BD AE 0F LDA $0FAE,x[$7E:0FAE] ; instruction list pointer $A8:B3EB DD AC 0F CMP $0FAC,x[$7E:0FAC] ; previous instruction list pointer $A8:B3EE F0 0F BEQ $0F [$B3FF] ; if inst list pointer != previous inst list pointer: $A8:B3F0 9D 92 0F STA $0F92,x[$7E:0F92] ; init param = inst list pointer $A8:B3F3 9D AC 0F STA $0FAC,x[$7E:0FAC] ; previous instruction list pointer = inst list pointer $A8:B3F6 A9 01 00 LDA #$0001 $A8:B3F9 9D 94 0F STA $0F94,x[$7E:0F94] ; instruction timer = 1 $A8:B3FC 9E 90 0F STZ $0F90,x[$7E:0F90] ; timer = 1 $A8:B3FF 60 RTS } ;;; $B400: Power bomb reaction - enemy $E83F (Magdollite) ;;; { $A8:B400 22 37 80 A8 JSL $A88037[$A8:8037] ; Normal enemy power bomb AI $A8:B404 80 0A BRA $0A [$B410] } ;;; $B406: Enemy touch - enemy $E83F (Magdollite) ;;; { $A8:B406 22 23 80 A8 JSL $A88023[$A8:8023] ; Normal enemy touch AI $A8:B40A 80 04 BRA $04 [$B410] } ;;; $B40C: Enemy shot - enemy $E83F (Magdollite) ;;; { $A8:B40C 22 3D A6 A0 JSL $A0A63D[$A0:A63D] ; Normal enemy shot AI } ;;; $B410: Magdollite shared contact reaction ;;; { $A8:B410 AE 54 0E LDX $0E54 [$7E:0E54] $A8:B413 BD 8C 0F LDA $0F8C,x[$7E:104C] $A8:B416 D0 12 BNE $12 [$B42A] ; if Magdollite health = 0: $A8:B418 BD C6 0F LDA $0FC6,x $A8:B41B 09 00 02 ORA #$0200 $A8:B41E 9D C6 0F STA $0FC6,x ; mark enemy1 for deletion $A8:B421 BD 06 10 LDA $1006,x $A8:B424 09 00 02 ORA #$0200 $A8:B427 9D 06 10 STA $1006,x ; mark enemy2 for deletion ; not dead $A8:B42A BD 9E 0F LDA $0F9E,x[$7E:105E] $A8:B42D F0 18 BEQ $18 [$B447] ; if frozen: $A8:B42F 9D DE 0F STA $0FDE,x ; enemy1 = frozen $A8:B432 9D 1E 10 STA $101E,x ; enemy2 = frozen $A8:B435 BD CA 0F LDA $0FCA,x $A8:B438 09 04 00 ORA #$0004 $A8:B43B 9D CA 0F STA $0FCA,x ; enemy1 AI handler = frozen $A8:B43E BD 0A 10 LDA $100A,x $A8:B441 09 04 00 ORA #$0004 $A8:B444 9D 0A 10 STA $100A,x ; enemy2 AI handler = frozen $A8:B447 6B RTL } ;;; $B448: Magdollite spritemaps ;;; { $A8:B448 dx 0003, 0004,FF,2123, 0004,F7,2122, 81F4,F7,210A ; head, facing left $A8:B459 dx 0003, 0004,00,2123, 0004,F8,2122, 81F4,F8,210A ; head, facing left $A8:B46A dx 0003, 0004,01,2123, 0004,F9,2122, 81F4,F9,210A ; head, facing left $A8:B47B dx 0003, 0000,04,2121, 01F8,04,2120, 81F8,F4,2108 ; fist, facing left $A8:B48C dx 0003, 01FD,04,2121, 01F5,04,2120, 81F9,F5,2108 ; fist, facing left $A8:B49D dx 0002, 8000,FC,2106, 81F0,F9,2104 ; hand, fingers straight, facing left $A8:B4A9 dx 0002, 8000,F8,2102, 81F0,F8,2100 ; hand, fingers curled, facing left $A8:B4B5 dx 0002, 0000,FC,2125, 01F8,FC,2124 ; pillar cap, facing left $A8:B4C1 dx 0001, 81F8,F8,210E ; wide pillar section, facing left $A8:B4C8 dx 0001, 81F8,F8,210C ; unused, seems blank $A8:B4CF dx 0003, 0004,FC,2128, 01FC,FC,2127, 01F4,FC,2126 ; head, poking out of lava, facing left $A8:B4E0 dx 0003, 0004,FC,212B, 01FC,FC,212A, 01F4,FC,2129 ; head, barely poking out of lava, facing left $A8:B4F1 dx 0003, 01F4,FF,6123, 01F4,F7,6122, 81FC,F7,610A ; head, facing right $A8:B502 dx 0003, 01F4,00,6123, 01F4,F8,6122, 81FC,F8,610A ; head, facing right $A8:B513 dx 0003, 01F4,01,6123, 01F4,F9,6122, 81FC,F9,610A ; head, facing right $A8:B524 dx 0003, 01F8,04,6121, 0000,04,6120, 81F8,F4,6108 ; fist, facing right $A8:B535 dx 0003, 01FB,04,6121, 0003,04,6120, 81F7,F5,6108 ; fist, facing right $A8:B546 dx 0002, 81F0,FC,6106, 8000,F9,6104 ; hand, fingers straight, facing right $A8:B552 dx 0002, 81F0,F8,6102, 8000,F8,6100 ; hand, fingers curled, facing right $A8:B55E dx 0002, 01F8,FC,6125, 0000,FC,6124 ; unused pillar cap, facing right $A8:B56A dx 0001, 81F8,F8,610E ; wide pillar section, facing right $A8:B571 dx 0001, 81F8,F8,610C ; unused, narrow pillar section $A8:B578 dx 0003, 01F4,FC,6128, 01FC,FC,6127, 0004,FC,6126 ; head, poking out of lava, facing right $A8:B589 dx 0003, 01F4,FC,612B, 01FC,FC,612A, 0004,FC,6129 ; head, barely poking out of lava, facing right $A8:B59A dx 0001, 81F8,F8,210C ; narrow pillar section, facing left $A8:B5A1 dx 0002, 81F8,00,210C, 81F8,F0,210C ; narrow pillar section, facing right ; narrow pillar stacks, 3x to 8x $A8:B5AD dx 0003, 81F8,08,210C, 81F8,E8,210C, 81F8,F8,210C $A8:B5BE dx 0004, 81F8,10,210C, 81F8,00,210C, 81F8,F0,210C, 81F8,E0,210C $A8:B5D4 dx 0005, 81F8,18,210C, 81F8,08,210C, 81F8,D8,210C, 81F8,F8,210C, 81F8,E8,210C $A8:B5EF dx 0006, 81F8,10,210C, 81F8,20,210C, 81F8,00,210C, 81F8,F0,210C, 81F8,E0,210C, 81F8,D0,210C $A8:B60F dx 0007, 81F8,28,210C, 81F8,18,210C, 81F8,08,210C, 81F8,F8,210C, 81F8,E8,210C, 81F8,D8,210C, 81F8,C8,210C $A8:B634 dx 0008, 81F8,30,210C, 81F8,00,210C, 81F8,20,210C, 81F8,10,210C, 81F8,F0,210C, 81F8,E0,210C, 81F8,D0,210C, 81F8,C0,210C } }