;;; $A0F5..EFB0: Ridley ;;; { ;;; $A0F5: Initialisation AI - enemy $E13F/$E17F (Ridley) ;;; { $A6:A0F5 AE 9F 07 LDX $079F [$7E:079F] ; Area index $A6:A0F8 BF 28 D8 7E LDA $7ED828,x[$7E:D82E] $A6:A0FC 29 01 00 AND #$0001 ; this dev knows how to check an event bit manually :D $A6:A0FF F0 0D BEQ $0D [$A10E] ; if (area) Ridley is dead: $A6:A101 AD 86 0F LDA $0F86 [$7E:0F86] $A6:A104 29 FF FF AND #$FFFF ; >.< $A6:A107 09 00 07 ORA #$0700 $A6:A10A 8D 86 0F STA $0F86 [$7E:0F86] ; set as intangible and invisible, and mark for deletion $A6:A10D 6B RTL ; not dead $A6:A10E 8B PHB $A6:A10F F4 7E 7E PEA $7E7E $A6:A112 AB PLB $A6:A113 AB PLB $A6:A114 A9 00 00 LDA #$0000 $A6:A117 A2 FE 0F LDX #$0FFE $A6:A11A 9D 00 20 STA $2000,x[$7E:2FFE] $A6:A11D CA DEX $A6:A11E CA DEX $A6:A11F 10 F9 BPL $F9 [$A11A] ; clear $2000..2FFF for tail $A6:A121 AB PLB $A6:A122 22 E2 A7 90 JSL $90A7E2[$90:A7E2] ; Disable mini-map and mark boss room map tiles as explored $A6:A126 9C B4 0F STZ $0FB4 [$7E:0FB4] $A6:A129 9C B6 0F STZ $0FB6 [$7E:0FB6] $A6:A12C A9 38 E5 LDA #$E538 ; Initial, facing left $A6:A12F 20 67 D4 JSR $D467 [$A6:D467] ; Ridley instruction list $A6:A132 A9 00 0E LDA #$0E00 $A6:A135 8D 96 0F STA $0F96 [$7E:0F96] $A6:A138 8F 18 78 7E STA $7E7818[$7E:7818] ; palette index = $E00 $A6:A13C AD 88 0F LDA $0F88 [$7E:0F88] $A6:A13F 09 04 00 ORA #$0004 $A6:A142 8D 88 0F STA $0F88 [$7E:0F88] ; enable extended spritemap format $A6:A145 A9 00 00 LDA #$0000 $A6:A148 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley inactive $A6:A14C 8F 1A 78 7E STA $7E781A[$7E:781A] ; reset hits taken $A6:A150 9C 3E 18 STZ $183E [$7E:183E] ; Earthquake type = 0 $A6:A153 9C 40 18 STZ $1840 [$7E:1840] ; Earthquake timer = 0 $A6:A156 20 D6 D2 JSR $D2D6 [$A6:D2D6] ; "Initializes a ton of variables from 7E:2012 to 7E:20A7. I'm *guessing* they're for his tail" $A6:A159 20 FD D9 JSR $D9FD [$A6:D9FD] ; "Initialize rib animation" $A6:A15C AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:A15F C9 02 00 CMP #$0002 $A6:A162 F0 03 BEQ $03 [$A167] ; if area != norfair: $A6:A164 4C EE A1 JMP $A1EE [$A6:A1EE] ; goto BRANCH_CERES ; Norfair $A6:A167 AD 86 0F LDA $0F86 [$7E:0F86] ; else, norfair $A6:A16A 09 00 14 ORA #$1400 $A6:A16D 8D 86 0F STA $0F86 [$7E:0F86] ; set to block plasma and intangible $A6:A170 A9 60 00 LDA #$0060 $A6:A173 8D 7A 0F STA $0F7A [$7E:0F7A] ; Ridley X position = $60 $A6:A176 A9 8A 01 LDA #$018A $A6:A179 8D 7E 0F STA $0F7E [$7E:0F7E] ; Ridley Y position = $18A $A6:A17C A9 F3 B2 LDA #$B2F3 ; >_<; $A6:A17F A9 5B A3 LDA #$A35B ; Startup, first run $A6:A182 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A185 9C AA 0F STZ $0FAA [$7E:0FAA] $A6:A188 9C AC 0F STZ $0FAC [$7E:0FAC] ; reset Ridley X/Y speed $A6:A18B A9 05 00 LDA #$0005 $A6:A18E 8D 9A 0F STA $0F9A [$7E:0F9A] ; layer = 5? $A6:A191 A9 00 00 LDA #$0000 $A6:A194 8F 02 78 7E STA $7E7802[$7E:7802] ; >.< Ridley already inactive $A6:A198 1A INC A $A6:A199 8F 04 78 7E STA $7E7804[$7E:7804] ; Ceres Ridley active flag = 1 (always in Norfair) $A6:A19D A9 40 00 LDA #$0040 $A6:A1A0 8F 00 80 7E STA $7E8000[$7E:8000] ; top boundary = $40 $A6:A1A4 A9 A0 01 LDA #$01A0 $A6:A1A7 8F 02 80 7E STA $7E8002[$7E:8002] ; bottom boundary = $1A0 $A6:A1AB A9 40 00 LDA #$0040 $A6:A1AE 8F 04 80 7E STA $7E8004[$7E:8004] ; left boundary = $40 $A6:A1B2 A9 E0 00 LDA #$00E0 $A6:A1B5 8F 06 80 7E STA $7E8006[$7E:8006] ; right boundary = $E0 $A6:A1B9 A9 02 00 LDA #$0002 $A6:A1BC 8F 20 78 7E STA $7E7820[$7E:7820] ; Ridley direction = right $A6:A1C0 A9 78 00 LDA #$0078 $A6:A1C3 8F 38 78 7E STA $7E7838[$7E:7838] ; Contact damage = $78 (120) $A6:A1C7 A0 CF E1 LDY #$E1CF $A6:A1CA A2 40 01 LDX #$0140 $A6:A1CD A9 20 00 LDA #$0020 $A6:A1D0 22 F6 D2 A9 JSL $A9D2F6[$A9:D2F6] ; Write $20 colors from $7E:E1CF to target color index $140 (Sprite palette 2) $A6:A1D4 A2 E2 00 LDX #$00E2 $A6:A1D7 A2 00 00 LDX #$0000 $A6:A1DA A0 0F 00 LDY #$000F $A6:A1DD A9 00 00 LDA #$0000 ; clear BG and Sprite palettes 7 $A6:A1E0 9F E2 C2 7E STA $7EC2E2,x[$7E:C2E2]; $C2E2..2FF, BG palette 7 $A6:A1E4 9F E2 C3 7E STA $7EC3E2,x[$7E:C3E2]; $C3E2..3FF, Sprite palette 7 $A6:A1E8 E8 INX $A6:A1E9 E8 INX $A6:A1EA 88 DEY $A6:A1EB D0 F3 BNE $F3 [$A1E0] $A6:A1ED 6B RTL ; BRANCH_CERES $A6:A1EE AD 86 0F LDA $0F86 [$7E:0F86] $A6:A1F1 09 00 14 ORA #$1400 $A6:A1F4 8D 86 0F STA $0F86 [$7E:0F86] ; set to block plasma and intangible $A6:A1F7 A9 BA 00 LDA #$00BA $A6:A1FA 8D 7A 0F STA $0F7A [$7E:0F7A] $A6:A1FD A9 A9 00 LDA #$00A9 $A6:A200 8D 7E 0F STA $0F7E [$7E:0F7E] $A6:A203 A9 00 00 LDA #$0000 $A6:A206 8D 3F 09 STA $093F [$7E:093F] ; [Ceres status] = 0 (Before Ridley escape) $A6:A209 8F 20 78 7E STA $7E7820[$7E:7820] ; Ridley direction = left $A6:A20D 8F 04 78 7E STA $7E7804[$7E:7804] ; Ceres Ridley active flag = 0 $A6:A211 1A INC A $A6:A212 8F 02 20 7E STA $7E2002[$7E:2002] $A6:A216 A9 0F 00 LDA #$000F $A6:A219 8F 38 78 7E STA $7E7838[$7E:7838] $A6:A21D A9 5B A3 LDA #$A35B ; "startup, first run" $A6:A220 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A223 9C AA 0F STZ $0FAA [$7E:0FAA] $A6:A226 9C AC 0F STZ $0FAC [$7E:0FAC] $A6:A229 A9 E0 FF LDA #$FFE0 $A6:A22C 8F 00 80 7E STA $7E8000[$7E:8000] ; top boundary = $FFE0 $A6:A230 A9 B0 00 LDA #$00B0 $A6:A233 8F 02 80 7E STA $7E8002[$7E:8002] ; bottom boundary = $B0 $A6:A237 A9 28 00 LDA #$0028 $A6:A23A 8F 04 80 7E STA $7E8004[$7E:8004] ; left boundary = $28 $A6:A23E A9 E0 00 LDA #$00E0 $A6:A241 8F 06 80 7E STA $7E8006[$7E:8006] ; right boundary = $E0 $A6:A245 A0 6F E1 LDY #$E16F $A6:A248 A2 40 01 LDX #$0140 $A6:A24B A9 20 00 LDA #$0020 $A6:A24E 22 F6 D2 A9 JSL $A9D2F6[$A9:D2F6] ; Write $20 colors from $7E:E16F to target color index $140 (Sprite palette 2) $A6:A252 A2 E2 01 LDX #$01E2 $A6:A255 A0 0F 00 LDY #$000F $A6:A258 A9 00 00 LDA #$0000 $A6:A25B 9F 00 C2 7E STA $7EC200,x[$7E:C3E2]; clear Sprite palette 7 $A6:A25F E8 INX $A6:A260 E8 INX $A6:A261 88 DEY $A6:A262 D0 F7 BNE $F7 [$A25B] $A6:A264 A9 31 BF LDA #$BF31 ; "sit still and look cute" $A6:A267 8F 06 78 7E STA $7E7806[$7E:7806] ; set Baby metroid instruction list $A6:A26B A9 01 00 LDA #$0001 $A6:A26E 8F 08 78 7E STA $7E7808[$7E:7808] ; Baby Metroid counter = 1 $A6:A272 A9 9C BE LDA #$BE9C ; Update Baby Metroid capsule position while carried in arms $A6:A275 8F 00 88 7E STA $7E8800[$7E:8800] ; Baby Metroid function pointer $A6:A279 A9 05 00 LDA #$0005 $A6:A27C 8F 0E 78 7E STA $7E780E[$7E:780E] ; wing flap animation frame = 5 $A6:A280 A9 00 00 LDA #$0000 ;\ $A6:A283 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue music stop $A6:A287 6B RTL } ;;; $A288: Main AI - enemy $E13F (Ceres Ridley) ;;; { $A6:A288 A9 FF 7F LDA #$7FFF $A6:A28B 8D 8C 0F STA $0F8C [$7E:0F8C] ; max health $A6:A28E F4 93 A2 PEA $A293 $A6:A291 6C A8 0F JMP ($0FA8)[$A6:A35B] ; execute function pointer ; PEA return $A6:A294 AD 3F 09 LDA $093F [$7E:093F] $A6:A297 D0 23 BNE $23 [$A2BC] ; if Ceres status != 0 (Before Ridley escape): return $A6:A299 AF 04 78 7E LDA $7E7804[$7E:7804] $A6:A29D F0 3D BEQ $3D [$A2DC] ; if Ceres Ridley is active: $A6:A29F 20 DA D4 JSR $D4DA [$A6:D4DA] ; "Make wings/tail flash when hit" $A6:A2A2 20 6B D8 JSR $D86B [$A6:D86B] ; "Handles movement and main body wall collisions" $A6:A2A5 20 7D D9 JSR $D97D [$A6:D97D] ; "Handle wing flapping" $A6:A2A8 20 BD A2 JSR $A2BD [$A6:A2BD] ; "RNG chance to choose new tail attack pattern" $A6:A2AB 20 F5 CA JSR $CAF5 [$A6:CAF5] ; "Run Tail AI: Sound, control AI, X/Y positions, tail extension, hurt Samus" $A6:A2AE 20 B5 D4 JSR $D4B5 [$A6:D4B5] ; "Determine and set Ridley's color pallete" $A6:A2B1 20 0C DA JSR $DA0C [$A6:DA0C] ; "Animate Ridley's ribs" $A6:A2B4 20 2A DB JSR $DB2A [$A6:DB2A] ; "Draw tail" $A6:A2B7 20 D8 DA JSR $DAD8 [$A6:DAD8] ; "Drawing routine for Ridley's wings" $A6:A2BA 80 20 BRA $20 [$A2DC] ; "Handle Baby Metroid capsule interactions" $A6:A2BC 6B RTL } ;;; $A2BD: RNG chance to choose new tail swing delay ;;; { ; Ceres Ridley ; 1/100 chance of setting 7E:201E to $8-17 (all hex numbers) $A6:A2BD AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:A2C0 C9 00 FF CMP #$FF00 $A6:A2C3 90 0D BCC $0D [$A2D2] ; if RNG >= $FF00: $A6:A2C5 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:A2C8 29 0F 00 AND #$000F $A6:A2CB 69 07 00 ADC #$0007 ; carry is set $A6:A2CE 8F 1E 20 7E STA $7E201E[$7E:201E] ; set to 8-17h, causes tail to do different things $A6:A2D2 60 RTS } ;;; $A2D3: Hurt AI - enemy $E13F (Ceres Ridley) ;;; { $A6:A2D3 20 DA D4 JSR $D4DA [$A6:D4DA] ; "Make wings/tail flash when hit" $A6:A2D6 20 2A DB JSR $DB2A [$A6:DB2A] ; "Draw tail" $A6:A2D9 20 D8 DA JSR $DAD8 [$A6:DAD8] ; "Drawing routine for Ridley's wings" } ;;; $A2DC: ;;; { ; Ceres Ridley ; Handle Baby Metroid capsule interactions $A6:A2DC 20 93 BE JSR $BE93 [$A6:BE93] ; Handle carrying Baby Metroid capsule $A6:A2DF AF 04 78 7E LDA $7E7804[$7E:7804] $A6:A2E3 F0 0D BEQ $0D [$A2F2] ; if Ceres Ridley active flag != 0: $A6:A2E5 A9 00 A6 LDA #$A600 $A6:A2E8 8D 8D 17 STA $178D [$7E:178D] ; bank byte = $A6 $A6:A2EB A9 F2 A2 LDA #$A2F2 ; draw Baby Metroid and door $A6:A2EE 8D 8C 17 STA $178C [$7E:178C] ; set enemy graphics drawn hook $A6:A2F1 6B RTL } ;;; $A2F2: Enemy graphics drawn hook - Ceres Ridley - draw Baby Metroid and door ;;; { ; Enemy 1 is the Ceres door $A6:A2F2 AD 3F 09 LDA $093F [$7E:093F] ;\ $A6:A2F5 D0 03 BNE $03 [$A2FA] ;} If [Ceres status] = before Ridley escape: $A6:A2F7 20 1A BF JSR $BF1A [$A6:BF1A] ; Draw Baby Metroid $A6:A2FA AD EA 0F LDA $0FEA [$7E:0FEA] ;\ $A6:A2FD F0 21 BEQ $21 [$A320] ;} If [enemy 1 drawn by Ridley flag] = 0: return $A6:A2FF AD 40 18 LDA $1840 [$7E:1840] ;\ $A6:A302 29 03 00 AND #$0003 ;| $A6:A305 AA TAX ;| $A6:A306 BD 21 A3 LDA $A321,x[$A6:A321] ;} Spritemap Y position = [$A321 + [earthquake timer] % 4] + [enemy 1 X position] $A6:A309 18 CLC ;| $A6:A30A 6D BA 0F ADC $0FBA [$7E:0FBA] ;| $A6:A30D 85 14 STA $14 [$7E:0014] ;/ $A6:A30F AD BE 0F LDA $0FBE [$7E:0FBE] ;\ $A6:A312 85 12 STA $12 [$7E:0012] ;} Spritemap X position = [enemy 1 Y position] $A6:A314 A9 00 04 LDA #$0400 ;\ $A6:A317 85 16 STA $16 [$7E:0016] ;} Spritemap palette bits = 400h (palette 2) $A6:A319 A0 29 A3 LDY #$A329 ; Spritemap address = $A329 (Ceres Ridley door) $A6:A31C 22 9F 87 81 JSL $81879F[$81:879F] ; Add spritemap to OAM $A6:A320 6B RTL } ;;; $A321: Ceres Ridley door X offsets during earthquake ;;; { ; Actually, this table is being indexed in one byte increments, meaning these values should have been 8-bit. ; Only the lower 8 bits are used in practice, so the resulting actual read values are as if: ; db 00, 00, FC, FF $A6:A321 dw 0000, FFFC, FFFF, 0003 } ;;; $A329: Spritemap - Ceres Ridley door ;;; { $A6:A329 dx 0008, 0000,18,A0D1, 0000,E0,20D1, 0000,10,A0D3, 0000,E8,20D3, 0000,00,A0F2, 0000,08,A0E2, 0000,F8,20F2, 0000,F0,20E2 } ;;; $A353: RTL ;;; { $A6:A353 6B RTL } ;;; $A354: Ridley function ;;; { ; Ceres / Norfair Ridley ; Clear speeds, that's it ; Runs during liftoff and right before the Ceres door opens $A6:A354 9C AA 0F STZ $0FAA [$7E:0FAA] $A6:A357 9C AC 0F STZ $0FAC [$7E:0FAC] $A6:A35A 60 RTS } ;;; $A35B: Ridley function ;;; { ; Ceres / Norfair Ridley ; Startup, 1st run $A6:A35B AD 97 07 LDA $0797 [$7E:0797] ; Door transition flag $A6:A35E D0 28 BNE $28 [$A388] ; if not in door transition: $A6:A360 A9 77 A3 LDA #$A377 ; Startup, initial wait $A6:A363 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A366 A9 00 02 LDA #$0200 ; 512 frames $A6:A369 AC 9F 07 LDY $079F [$7E:079F] ; Area index $A6:A36C C0 02 00 CPY #$0002 $A6:A36F D0 03 BNE $03 [$A374] ; if area = norfair: $A6:A371 A9 AA 00 LDA #$00AA ; 170 frames ; not Norfair $A6:A374 8D B2 0F STA $0FB2 [$7E:0FB2] ; set function timer } ;;; $A377: Ridley function ;;; { ; Ceres Ridley ; Startup, initial wait $A6:A377 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A37A 10 0C BPL $0C [$A388] ; if function timer < 0: $A6:A37C A9 89 A3 LDA #$A389 ; Startup, eyes appear + wait $A6:A37F 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A382 9C B0 0F STZ $0FB0 [$7E:0FB0] $A6:A385 9C B2 0F STZ $0FB2 [$7E:0FB2] ; function timer = 0 $A6:A388 60 RTS } ;;; $A389: Ridley function ;;; { ; Ceres Ridley ; Startup, eyes appear + wait 31h more frames $A6:A389 AD B0 0F LDA $0FB0 [$7E:0FB0] $A6:A38C 30 3F BMI $3F [$A3CD] ; >.< it counts up, not down $A6:A38E A8 TAY $A6:A38F EE B2 0F INC $0FB2 [$7E:0FB2] $A6:A392 AD B2 0F LDA $0FB2 [$7E:0FB2] $A6:A395 C9 01 00 CMP #$0001 $A6:A398 90 33 BCC $33 [$A3CD] ; if $0FB2 was already > 0: return >.< $A6:A39A 9C B2 0F STZ $0FB2 [$7E:0FB2] $A6:A39D BB TYX $A6:A39E BD 69 E2 LDA $E269,x[$A6:E269] ; starts at $F and counts down to a lot of zeroes, $40 bytes plus $FF terminator $A6:A3A1 29 FF 00 AND #$00FF $A6:A3A4 C9 FF 00 CMP #$00FF ; terminator $A6:A3A7 F0 25 BEQ $25 [$A3CE] ; if index table ($E269) + $0FB0 = $FF: goto BRANCH_DONE $A6:A3A9 85 12 STA $12 [$7E:0012] $A6:A3AB 0A ASL A $A6:A3AC 18 CLC $A6:A3AD 65 12 ADC $12 [$7E:0012] $A6:A3AF 0A ASL A ; $0FB0 * 6 $A6:A3B0 A8 TAY ; index into eye glow fade in color table $A6:A3B1 E8 INX $A6:A3B2 8E B0 0F STX $0FB0 [$7E:0FB0] ; $0FB0 + 1 $A6:A3B5 A2 F8 01 LDX #$01F8 ; >.< $A6:A3B8 B9 AA E2 LDA $E2AA,y[$A6:E304] ; eye glow fade in table $A6:A3BB 9F 00 C0 7E STA $7EC000,x[$7E:C1F8]; $7EC1F8 $A6:A3BF B9 AC E2 LDA $E2AC,y[$A6:E306] $A6:A3C2 9F 02 C0 7E STA $7EC002,x[$7E:C1FA]; $7EC1FA $A6:A3C6 B9 AE E2 LDA $E2AE,y[$A6:E308] $A6:A3C9 9F 04 C0 7E STA $7EC004,x[$7E:C1FC]; $7EC1FC $A6:A3CD 60 RTS ; BRANCH_DONE $A6:A3CE 9C B0 0F STZ $0FB0 [$7E:0FB0] $A6:A3D1 A9 DF A3 LDA #$A3DF ; Startup, main body appears $A6:A3D4 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A3D7 A9 01 00 LDA #$0001 $A6:A3DA 8F 04 78 7E STA $7E7804[$7E:7804] ; Ceres Ridley active flag = 1 $A6:A3DE 60 RTS } ;;; $A3DF: Ridley function ;;; { ; Ceres / Norfair Ridley ; Startup, main body appears $A6:A3DF EE B2 0F INC $0FB2 [$7E:0FB2] $A6:A3E2 AD B2 0F LDA $0FB2 [$7E:0FB2] $A6:A3E5 C9 02 00 CMP #$0002 $A6:A3E8 90 39 BCC $39 [$A423] ; if $0FB2 was already > 1: return $A6:A3EA 9C B2 0F STZ $0FB2 [$7E:0FB2] $A6:A3ED AC B0 0F LDY $0FB0 [$7E:0FB0] $A6:A3F0 A9 22 01 LDA #$0122 $A6:A3F3 85 12 STA $12 [$7E:0012] ; index into Sprite palette 1 $A6:A3F5 A9 E2 01 LDA #$01E2 $A6:A3F8 85 14 STA $14 [$7E:0014] ; index into Sprite palette 7 $A6:A3FA A9 0B 00 LDA #$000B ; loop $A6:A3FD 48 PHA ; loop counter = Bh $A6:A3FE B9 0A E3 LDA $E30A,y[$A6:E30A] ; $180 bytes of colors $A6:A401 A6 12 LDX $12 [$7E:0012] $A6:A403 9F 00 C0 7E STA $7EC000,x[$7E:C122] $A6:A407 A6 14 LDX $14 [$7E:0014] $A6:A409 9F 00 C0 7E STA $7EC000,x[$7E:C1E2] $A6:A40D C8 INY $A6:A40E C8 INY $A6:A40F E6 12 INC $12 [$7E:0012] $A6:A411 E6 12 INC $12 [$7E:0012] $A6:A413 E6 14 INC $14 [$7E:0014] $A6:A415 E6 14 INC $14 [$7E:0014] $A6:A417 68 PLA $A6:A418 3A DEC A $A6:A419 D0 E2 BNE $E2 [$A3FD] ; copy Bh words from color table to palette RAM $A6:A41B C0 60 01 CPY #$0160 $A6:A41E B0 04 BCS $04 [$A424] ; if index > $160: goto BRANCH_DONE $A6:A420 8C B0 0F STY $0FB0 [$7E:0FB0] ; $0FB0 + 16h every frame $A6:A423 60 RTS ; BRANCH_DONE $A6:A424 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:A427 C9 02 00 CMP #$0002 $A6:A42A D0 06 BNE $06 [$A432] ; if area != norfair: $A6:A42C A9 02 00 LDA #$0002 $A6:A42F 8D 9A 0F STA $0F9A [$7E:0F9A] ; layer = 2 $A6:A432 AD 86 0F LDA $0F86 [$7E:0F86] $A6:A435 29 FF FB AND #$FBFF $A6:A438 8D 86 0F STA $0F86 [$7E:0F86] ; set as tangible $A6:A43B A0 00 00 LDY #$0000 $A6:A43E 8C B0 0F STY $0FB0 [$7E:0FB0] $A6:A441 A9 55 A4 LDA #$A455 ; Startup, Ridley roars $A6:A444 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A447 A9 04 00 LDA #$0004 $A6:A44A 8D B2 0F STA $0FB2 [$7E:0FB2] ; function timer = 4 $A6:A44D A9 05 00 LDA #$0005 ;\ $A6:A450 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue song 0 music track $A6:A454 60 RTS } ;;; $A455: Ridley function ;;; { ; Ceres / Norfair Ridley ; Startup, Ridley roars $A6:A455 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A458 10 1D BPL $1D [$A477] ; wait 4 frames $A6:A45A A9 90 E6 LDA #$E690 $A6:A45D 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:A460 9C B2 0F STZ $0FB2 [$7E:0FB2] $A6:A463 A9 78 A4 LDA #$A478 ; "Startup, color background in Norfair, raise acid, start main AI" $A6:A466 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A469 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:A46C C9 02 00 CMP #$0002 $A6:A46F F0 06 BEQ $06 [$A477] ; if area != norfair: $A6:A471 A9 FC 00 LDA #$00FC $A6:A474 8D B2 0F STA $0FB2 [$7E:0FB2] ; function timer = 4.2 seconds $A6:A477 60 RTS } ;;; $A478: Ridley function ;;; { ; Ceres / Norfair Ridley ; Startup, color background in Norfair, raise acid, start main AI $A6:A478 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:A47B C9 02 00 CMP #$0002 $A6:A47E D0 2C BNE $2C [$A4AC] ; if area = norfair: $A6:A480 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A483 10 F2 BPL $F2 [$A477] ; if function timer < 0: $A6:A485 A9 02 00 LDA #$0002 $A6:A488 8D B2 0F STA $0FB2 [$7E:0FB2] $A6:A48B AD B0 0F LDA $0FB0 [$7E:0FB0] $A6:A48E 1A INC A $A6:A48F 8D B0 0F STA $0FB0 [$7E:0FB0] $A6:A492 3A DEC A $A6:A493 20 D6 A4 JSR $A4D6 [$A6:A4D6] ; Adjust background colors if necessary $A6:A496 90 DF BCC $DF [$A477] ; if done adjusting colors: $A6:A498 A9 B8 01 LDA #$01B8 $A6:A49B 8D 7A 19 STA $197A [$7E:197A] ; FX target Y position = $1B8 $A6:A49E A9 A0 FF LDA #$FFA0 $A6:A4A1 8D 7C 19 STA $197C [$7E:197C] ; FX Y subvelocity = $FFA0 $A6:A4A4 A9 20 00 LDA #$0020 $A6:A4A7 8D 80 19 STA $1980 [$7E:1980] ; FX timer = $20 $A6:A4AA 80 05 BRA $05 [$A4B1] ; Ceres $A6:A4AC CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A4AF 10 C6 BPL $C6 [$A477] ; if function timer >= 0: return ; merge $A6:A4B1 9C B0 0F STZ $0FB0 [$7E:0FB0] $A6:A4B4 A9 1D E9 LDA #$E91D $A6:A4B7 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:A4BA A9 08 00 LDA #$0008 $A6:A4BD 8F 10 78 7E STA $7E7810[$7E:7810] $A6:A4C1 8F 12 78 7E STA $7E7812[$7E:7812] $A6:A4C5 20 D9 D3 JSR $D3D9 [$A6:D3D9] ; Set all tail parts to moving $A6:A4C8 A9 01 00 LDA #$0001 $A6:A4CB 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "flinging at Samus" $A6:A4CF A9 54 A3 LDA #$A354 ; "clear speeds" $A6:A4D2 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A4D5 60 RTS } ;;; $A4D6: ;;; { ; Norfair Ridley ; Adjust background colors if necessary ; A = index ; carry = set if done adjusting background colors, clear otherwise $A6:A4D6 0A ASL A $A6:A4D7 AA TAX $A6:A4D8 BC EB A4 LDY $A4EB,x[$A6:A4EB] ; Y = palette pointer $A6:A4DB D0 02 BNE $02 [$A4DF] $A6:A4DD 38 SEC $A6:A4DE 60 RTS $A6:A4DF A2 E2 00 LDX #$00E2 $A6:A4E2 A9 0E 00 LDA #$000E $A6:A4E5 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write $E colors from $A6:[Y] to color index $E2 $A6:A4E9 18 CLC $A6:A4EA 60 RTS ; palette pointers $A6:A4EB dw A50B, A527, A543, A55F, A57B, A597, A5B3, A5CF, A5EB, A607, A623, A63F, A65B, A677, A693, 0000 ; palettes $A6:A50B dw 0001,0001,0001,0000,0000,0000,0000,0001,0000,0000,0000,0000,0000,0842 $A6:A527 dw 0023,0003,0003,0001,0001,0000,0000,0001,0001,0000,0000,0001,0001,1084 $A6:A543 dw 0044,0024,0004,0402,0001,0000,0000,0002,0001,0000,0000,0001,0001,18C6 $A6:A55F dw 0065,0025,0005,0403,0002,0001,0000,0003,0002,0001,0000,0002,0002,2108 $A6:A57B dw 0087,0047,0007,0404,0402,0001,0000,0004,0003,0001,0000,0402,0003,294A $A6:A597 dw 0088,0048,0008,0804,0403,0001,0000,0005,0003,0001,0000,0403,0003,318C $A6:A5B3 dw 00AA,004A,002A,0805,0403,0001,0000,0406,0004,0001,0000,0403,0004,39CE $A6:A5CF dw 00CB,006B,002B,0806,0404,0002,0000,0407,0004,0002,0000,0404,0004,4210 $A6:A5EB dw 00ED,006D,002D,0C07,0404,0002,0000,0408,0005,0002,0000,0404,0005,4A52 $A6:A607 dw 010E,008E,002E,0C08,0805,0002,0000,0409,0006,0002,0000,0805,0006,5294 $A6:A623 dw 0110,0090,0030,0C08,0805,0003,0000,040A,0006,0003,0000,0805,0006,5AD6 $A6:A63F dw 0131,0091,0031,1009,0806,0003,0000,040B,0007,0003,0000,0806,0007,6318 $A6:A65B dw 0153,00B3,0033,100A,0807,0003,0000,040C,0007,0003,0000,0807,0007,6B5A $A6:A677 dw 0574,04B4,0434,100B,0807,0403,0000,040D,0408,0003,0000,0807,0408,77BD $A6:A693 dw 0596,04D6,0456,140C,0C08,0404,0000,080E,0409,0004,0000,0C08,0409,7FFF } ;;; $A6AF: Ridley function ;;; { ; Ceres Ridley ; Startup liftoff, facing left (Ceres) $A6:A6AF AD AC 0F LDA $0FAC [$7E:0FAC] $A6:A6B2 18 CLC $A6:A6B3 69 F0 FF ADC #$FFF0 $A6:A6B6 8D AC 0F STA $0FAC [$7E:0FAC] ; Y speed =- $10 $A6:A6B9 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:A6BC C9 70 00 CMP #$0070 $A6:A6BF 30 01 BMI $01 [$A6C2] ; if Y position >= $70: return $A6:A6C1 60 RTS $A6:A6C2 A9 C8 A6 LDA #$A6C8 ; Startup liftoff, facing left and slowing down (Ceres) $A6:A6C5 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer } ;;; $A6C8: Ridley function ;;; { ; Ceres Ridley ; Startup liftoff, facing left and slowing down (Ceres) $A6:A6C8 AD AC 0F LDA $0FAC [$7E:0FAC] $A6:A6CB 18 CLC $A6:A6CC 69 14 00 ADC #$0014 $A6:A6CF 8D AC 0F STA $0FAC [$7E:0FAC] ; Y speed =+ $14 $A6:A6D2 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:A6D5 C9 50 00 CMP #$0050 $A6:A6D8 10 0D BPL $0D [$A6E7] ; if Y position >= 50: return $A6:A6DA A9 E8 A6 LDA #$A6E8 ; "Ceres main AI?" $A6:A6DD 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A6E0 A9 01 00 LDA #$0001 $A6:A6E3 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley active $A6:A6E7 60 RTS } ;;; $A6E8: Ridley function ;;; { ; Ceres Ridley ; Ceres main AI? $A6:A6E8 AF 1A 78 7E LDA $7E781A[$7E:781A] $A6:A6EC C9 64 00 CMP #$0064 $A6:A6EF B0 18 BCS $18 [$A709] ; if Ridley hits taken < $64: $A6:A6F1 AD C2 09 LDA $09C2 [$7E:09C2] $A6:A6F4 C9 1E 00 CMP #$001E $A6:A6F7 10 20 BPL $20 [$A719] ; if samus energy < $30: $A6:A6F9 A9 00 00 LDA #$0000 $A6:A6FC 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley inactive $A6:A700 A9 71 A9 LDA #$A971 ; "Fly away after Samus has low energy or after he picks up Baby Metroid" $A6:A703 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A706 4C 71 A9 JMP $A971 [$A6:A971] ; shot 100 times $A6:A709 A9 00 00 LDA #$0000 $A6:A70C 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley inactive $A6:A710 A9 9A BD LDA #$BD9A ; "Ceres Ridley initialise baby metroid drop" $A6:A713 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A716 4C 9A BD JMP $BD9A [$A6:BD9A] ; Samus not low energy $A6:A719 20 63 A7 JSR $A763 [$A6:A763] ; "Ceres Ridley attack cooldown; fly towards (C0h, 64h) (return carry set if reached, carry clear otherwise)" $A6:A71C 90 0F BCC $0F [$A72D] ; if reached target: $A6:A71E AF 00 78 7E LDA $7E7800[$7E:7800] $A6:A722 1A INC A $A6:A723 8F 00 78 7E STA $7E7800[$7E:7800] ; counter =+ 1 $A6:A727 C9 7C 00 CMP #$007C $A6:A72A 90 16 BCC $16 [$A742] ; if $7E7800 < $7C: return $A6:A72C EA NOP ; Wild NOP appears! ; not reached target $A6:A72D AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:A730 29 0F 00 AND #$000F $A6:A733 0A ASL A $A6:A734 AA TAX $A6:A735 BD 43 A7 LDA $A743,x ; random Ridley attack function $A6:A738 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A73B A9 00 00 LDA #$0000 $A6:A73E 8F 00 78 7E STA $7E7800[$7E:7800] $A6:A742 60 RTS ; A782 = fireball, A83C = lunge, A88D = swoop $A6:A743 dw A782, A782, A782, A782, A83C, A83C, A83C, A83C, A83C, A782, A88D, A88D, A88D, A88D, A88D, A782 } ;;; $A763: ;;; { ; Ceres Ridley ; Ceres Ridley attack cooldown; fly towards (C0h, 64h) (return carry set if reached, carry clear otherwise) $A6:A763 A2 C0 00 LDX #$00C0 $A6:A766 A0 64 00 LDY #$0064 $A6:A769 86 12 STX $12 [$7E:0012] ; target X position = $C0 $A6:A76B 84 14 STY $14 [$7E:0014] ; target Y position = $64 $A6:A76D A2 00 00 LDX #$0000 ; enemy index $A6:A770 A0 00 00 LDY #$0000 ; divisor index $A6:A773 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A776 A9 08 00 LDA #$0008 $A6:A779 85 16 STA $16 [$7E:0016] ; target X radius = 8 $A6:A77B 85 18 STA $18 [$7E:0018] ; target Y radius = 8 $A6:A77D 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle, clear = collision $A6:A781 60 RTS } ;;; $A782: Ridley function ;;; { ; Ceres Ridley ; Ceres Ridley fireballing ; Only executes once per round (not per volley) $A6:A782 AD AC 0F LDA $0FAC [$7E:0FAC] ; Ridley Y speed $A6:A785 10 04 BPL $04 [$A78B] $A6:A787 49 FF FF EOR #$FFFF $A6:A78A 1A INC A $A6:A78B C9 80 00 CMP #$0080 $A6:A78E B0 03 BCS $03 [$A793] $A6:A790 A9 80 00 LDA #$0080 ; minumum $80 $A6:A793 2C AC 0F BIT $0FAC [$7E:0FAC] ; Ridley Y speed $A6:A796 10 04 BPL $04 [$A79C] $A6:A798 49 FF FF EOR #$FFFF $A6:A79B 1A INC A $A6:A79C 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed $A6:A79F AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:A7A2 85 12 STA $12 [$7E:0012] ; target X position = Ridley X Position $A6:A7A4 A9 58 00 LDA #$0058 $A6:A7A7 85 14 STA $14 [$7E:0014] ; target Y position = $58 $A6:A7A9 A2 00 00 LDX #$0000 ; enemy index $A6:A7AC A0 00 00 LDY #$0000 ; divisor index $A6:A7AF 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A7B2 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:A7B5 C9 50 00 CMP #$0050 $A6:A7B8 30 2A BMI $2A [$A7E4] ; if Ridley Y position >= $50: $A6:A7BA C9 80 00 CMP #$0080 $A6:A7BD 10 24 BPL $24 [$A7E3] ; if Ridley Y position >= $80: return $A6:A7BF AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:A7C2 8F 2E 78 7E STA $7E782E[$7E:782E] ; target X position when holding = Ridley X Position $A6:A7C6 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:A7C9 8F 30 78 7E STA $7E7830[$7E:7830] ; target Y position when holding = Ridley Y Position $A6:A7CD A9 3A E7 LDA #$E73A ; "Fireballing" $A6:A7D0 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:A7D3 A9 F9 A7 LDA #$A7F9 ; "adjust X/Y speeds during fireball attacks" $A6:A7D6 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A7D9 A9 E0 00 LDA #$00E0 $A6:A7DC 8F 00 78 7E STA $7E7800[$7E:7800] ; timer = $E0 $A6:A7E0 4C F9 A7 JMP $A7F9 [$A6:A7F9] ; "adjust X/Y speeds during fireball attacks" $A6:A7E3 60 RTS ; reached target $A6:A7E4 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:A7E8 1A INC A $A6:A7E9 8F 00 78 7E STA $7E7800[$7E:7800] ; counter =+ 1 $A6:A7ED C9 30 00 CMP #$0030 $A6:A7F0 90 F1 BCC $F1 [$A7E3] ; if counter < 30: return $A6:A7F2 A9 8D A8 LDA #$A88D ; "Ceres Ridley start swoop" $A6:A7F5 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A7F8 60 RTS } ;;; $A7F9: Ridley function ;;; { ; Ceres Ridley ; Calls the routine to adjust X/Y speeds for $E0 frames ; Runs during fireball attacks $A6:A7F9 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:A7FC 29 07 00 AND #$0007 $A6:A7FF 2C E5 05 BIT $05E5 [$7E:05E5] $A6:A802 10 04 BPL $04 [$A808] ; if random number < 0: $A6:A804 49 FF FF EOR #$FFFF $A6:A807 1A INC A $A6:A808 85 16 STA $16 [$7E:0016] ; $16 = random number 0-7 $A6:A80A AF 2E 78 7E LDA $7E782E[$7E:782E] $A6:A80E 65 16 ADC $16 [$7E:0016] $A6:A810 85 12 STA $12 [$7E:0012] ; target X position = Ridley X position + rand(0-7) $A6:A812 AF 30 78 7E LDA $7E7830[$7E:7830] $A6:A816 65 16 ADC $16 [$7E:0016] $A6:A818 85 14 STA $14 [$7E:0014] ; target Y position = Ridley Y position + rand(0-7) $A6:A81A A2 00 00 LDX #$0000 ; enemy index $A6:A81D A0 00 00 LDY #$0000 ; divisor index $A6:A820 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A823 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:A827 3A DEC A $A6:A828 8F 00 78 7E STA $7E7800[$7E:7800] $A6:A82C 10 0D BPL $0D [$A83B] ; if timer < 0: $A6:A82E A9 00 00 LDA #$0000 $A6:A831 8F 00 78 7E STA $7E7800[$7E:7800] ; reset timer $A6:A835 A9 E8 A6 LDA #$A6E8 ; Ceres main AI? $A6:A838 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A83B 60 RTS } ;;; $A83C: Ridley function ;;; { ; Ceres Ridley ; Ceres Ridley start lunging $A6:A83C A9 48 E5 LDA #$E548 ; lunging, facing left $A6:A83F 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:A842 A9 4E A8 LDA #$A84E ; Ceres Ridley lunging $A6:A845 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A848 A9 40 00 LDA #$0040 $A6:A84B 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $40 } ;;; $A84E: Ridley function ;;; { ; Ceres Ridley ; lunging $A6:A84E AD F6 0A LDA $0AF6 [$7E:0AF6] $A6:A851 85 12 STA $12 [$7E:0012] ; target X position = Samus X position $A6:A853 AD FA 0A LDA $0AFA [$7E:0AFA] ; Samus Y position $A6:A856 38 SEC $A6:A857 E9 44 00 SBC #$0044 $A6:A85A C9 40 00 CMP #$0040 $A6:A85D 10 03 BPL $03 [$A862] ; if Samus Y Position < $84: $A6:A85F A9 40 00 LDA #$0040 ; minimum $40 $A6:A862 85 14 STA $14 [$7E:0014] ; target Y position $A6:A864 A2 00 00 LDX #$0000 ; enemy index $A6:A867 A0 0D 00 LDY #$000D ; divisor index $A6:A86A 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A86D A9 02 00 LDA #$0002 $A6:A870 85 16 STA $16 [$7E:0016] ; target X radius = 2 $A6:A872 85 18 STA $18 [$7E:0018] ; target Y radius = 2 $A6:A874 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle, clear = collision $A6:A878 90 05 BCC $05 [$A87F] ; if no collision: $A6:A87A CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A87D 10 0D BPL $0D [$A88C] ; if function timer >= 0: return ; collision $A6:A87F A9 00 00 LDA #$0000 $A6:A882 8F 00 78 7E STA $7E7800[$7E:7800] ; reset counter $A6:A886 A9 E8 A6 LDA #$A6E8 ; Ceres main AI? $A6:A889 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A88C 60 RTS } ;;; $A88D: Ridley function ;;; { ; Ceres Ridley start swoop $A6:A88D A9 A4 A8 LDA #$A8A4 ; fly toward swooping position $A6:A890 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A893 A9 0A 00 LDA #$000A $A6:A896 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $A $A6:A899 A9 00 00 LDA #$0000 $A6:A89C 8F 14 78 7E STA $7E7814[$7E:7814] $A6:A8A0 8F 02 20 7E STA $7E2002[$7E:2002] ; disable tail fling? } ;;; $A8A4: Ridley function ;;; { ; Ceres Ridley fly towards (C0h, 50h) to swoop $A6:A8A4 A2 C0 00 LDX #$00C0 $A6:A8A7 A0 50 00 LDY #$0050 $A6:A8AA 86 12 STX $12 [$7E:0012] ; target X position = $C0 $A6:A8AC 84 14 STY $14 [$7E:0014] ; target Y position = $50 $A6:A8AE A2 00 00 LDX #$0000 ; enemy index $A6:A8B1 A0 01 00 LDY #$0001 ; divisor index $A6:A8B4 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A8B7 AD 7E 0F LDA $0F7E [$7E:0F7E] ; Ridley Y position $A6:A8BA C9 60 00 CMP #$0060 $A6:A8BD 30 01 BMI $01 [$A8C0] ; if Ridley Y position < 60: $A6:A8BF 60 RTS ; reached target $A6:A8C0 A9 D4 A8 LDA #$A8D4 ; Ceres Ridley swoop $A6:A8C3 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A8C6 A9 0A 00 LDA #$000A $A6:A8C9 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $A $A6:A8CC A9 00 00 LDA #$0000 $A6:A8CF 8F 14 78 7E STA $7E7814[$7E:7814] $A6:A8D3 60 RTS } ;;; $A8D4: Ridley function ;;; { ; Ceres Ridley swoop $A6:A8D4 A9 E0 FF LDA #$FFE0 $A6:A8D7 85 12 STA $12 [$7E:0012] $A6:A8D9 A9 00 FC LDA #$FC00 $A6:A8DC 85 14 STA $14 [$7E:0014] $A6:A8DE A9 00 03 LDA #$0300 $A6:A8E1 85 16 STA $16 [$7E:0016] $A6:A8E3 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:A8E6 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A8E9 10 0C BPL $0C [$A8F7] ; if timer < 0: $A6:A8EB A9 F8 A8 LDA #$A8F8 ; swooping down-left $A6:A8EE 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A8F1 A9 24 00 LDA #$0024 $A6:A8F4 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $24 $A6:A8F7 60 RTS } ;;; $A8F8: Ridley function ;;; { ; Ceres Ridley ; when swooping down-left $A6:A8F8 A9 00 FE LDA #$FE00 $A6:A8FB 85 12 STA $12 [$7E:0012] $A6:A8FD A9 00 C0 LDA #$C000 $A6:A900 85 14 STA $14 [$7E:0014] $A6:A902 A9 00 03 LDA #$0300 $A6:A905 85 16 STA $16 [$7E:0016] $A6:A907 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:A90A CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A90D 10 13 BPL $13 [$A922] ; if timer < 0: $A6:A90F A9 23 A9 LDA #$A923 ; "swooping back up-left $A6:A912 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A915 A9 1C 00 LDA #$001C $A6:A918 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $1C $A6:A91B A9 01 00 LDA #$0001 $A6:A91E 8F 04 20 7E STA $7E2004[$7E:2004] ; trigger tail fling $A6:A922 60 RTS } ;;; $A923: Ridley function ;;; { ; Ceres Ridley ; when swooping back up-left $A6:A923 A9 00 FE LDA #$FE00 $A6:A926 85 12 STA $12 [$7E:0012] $A6:A928 A9 00 88 LDA #$8800 $A6:A92B 85 14 STA $14 [$7E:0014] $A6:A92D A9 00 03 LDA #$0300 $A6:A930 85 16 STA $16 [$7E:0016] $A6:A932 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:A935 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A938 10 0C BPL $0C [$A946] ; if timer < 0: $A6:A93A A9 47 A9 LDA #$A947 ; end of swooping $A6:A93D 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A940 A9 01 00 LDA #$0001 $A6:A943 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = 1 $A6:A946 60 RTS } ;;; $A947: Ridley function ;;; { ; Ceres Ridley ; end of swooping ; only runs two frames $A6:A947 A9 00 FD LDA #$FD00 $A6:A94A 85 12 STA $12 [$7E:0012] $A6:A94C A9 00 88 LDA #$8800 $A6:A94F 85 14 STA $14 [$7E:0014] $A6:A951 A9 00 03 LDA #$0300 $A6:A954 85 16 STA $16 [$7E:0016] $A6:A956 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:A959 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A95C 10 12 BPL $12 [$A970] ; if timer < 0: $A6:A95E A9 E8 A6 LDA #$A6E8 ; Ceres main AI? $A6:A961 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A964 A9 00 00 LDA #$0000 $A6:A967 8F 00 78 7E STA $7E7800[$7E:7800] ; reset counter $A6:A96B 1A INC A $A6:A96C 8F 02 20 7E STA $7E2002[$7E:2002] ; allow tail flings $A6:A970 60 RTS } ;;; $A971: Ridley function ;;; { ; Ceres Ridley flying away after Samus has low energy or after he picks up baby metroid $A6:A971 A9 40 FF LDA #$FF40 $A6:A974 8F 00 80 7E STA $7E8000[$7E:8000] ; top boundary = $FF40 $A6:A978 A9 C0 00 LDA #$00C0 $A6:A97B 85 12 STA $12 [$7E:0012] ; target X position = $C0 $A6:A97D A9 80 FF LDA #$FF80 $A6:A980 85 14 STA $14 [$7E:0014] ; target X position = $FF80 $A6:A982 A2 00 00 LDX #$0000 ; enemy index $A6:A985 A0 01 00 LDY #$0001 ; divisor index $A6:A988 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:A98B AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:A98E C9 80 FF CMP #$FF80 $A6:A991 30 01 BMI $01 [$A994] ; if Ridley Y position >= $FF80: $A6:A993 60 RTS ; reached target Y $A6:A994 A9 A0 A9 LDA #$A9A0 ; "spawn walls and update palettes for mode7 getaway" $A6:A997 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A99A A9 40 00 LDA #$0040 $A6:A99D 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $40 } ;;; $A9A0: Ridley function ;;; { ; Ceres Ridley ; spawn walls and update palettes for mode7 getaway $A6:A9A0 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:A9A3 10 EE BPL $EE [$A993] ; if function timer < 0: return $A6:A9A5 20 20 AA JSR $AA20 [$A6:AA20] ; Spawn walls during Ceres Ridley getaway cutscene $A6:A9A8 9C AA 0F STZ $0FAA [$7E:0FAA] ; reset X speed $A6:A9AB 9C AC 0F STZ $0FAC [$7E:0FAC] ; reset Y speed $A6:A9AE A9 00 00 LDA #$0000 $A6:A9B1 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = RTS $A6:A9B5 A9 11 AA LDA #$AA11 $A6:A9B8 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:A9BB A0 E3 A9 LDY #$A9E3 $A6:A9BE A2 A2 00 LDX #$00A2 $A6:A9C1 A9 0F 00 LDA #$000F $A6:A9C4 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write $F colors from $A6:A9E3 to color index $A2 (BG1/2 palette 5) $A6:A9C8 A0 01 AA LDY #$AA01 $A6:A9CB A2 42 00 LDX #$0042 $A6:A9CE A9 08 00 LDA #$0008 $A6:A9D1 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write 8 colors from $A6:AA01 to color index $42 (BG1/2 palette 2) $A6:A9D5 A0 01 AA LDY #$AA01 $A6:A9D8 A2 E2 01 LDX #$01E2 $A6:A9DB A9 08 00 LDA #$0008 $A6:A9DE 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write 8 colors from $A6:AA01 to color index $1E2 (Sprite palette 7) $A6:A9E2 60 RTS ; BG1/2 palette 5 colors 1..Fh $A6:A9E3 dw 0421, 0401, 0000, 0000, 0421, 0001, 0000, 0000, 0422, 0002, 0001, 0022, 0021, 0001, 0000 ; BG1/2 palette 2 / Sprite palette 7 colors 1..8 $A6:AA01 dw 7E20, 6560, 2060, 1000, 7940, 5D00, 4CA0, 3CA0 } ;;; $AA11: Ridley function ;;; { ; Disable Ridley AI and setup for mode7 getaway $A6:AA11 A9 4F AA LDA #$AA4F ; RTS $A6:AA14 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:AA17 A9 01 00 LDA #$0001 $A6:AA1A 8D 3F 09 STA $093F [$7E:093F] ; Ceres status = during escape $A6:AA1D 4C 54 AA JMP $AA54 [$A6:AA54] } ;;; $AA20: Spawn walls during Ceres Ridley getaway cutscene ;;; { $A6:AA20 A2 2F AA LDX #$AA2F ;\ $A6:AA23 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn left wall $A6:AA27 A2 3F AA LDX #$AA3F ;\ $A6:AA2A 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn right wall $A6:AA2E 60 RTS ; ______________________________________ Enemy ID ; | _________________________________ X position ; | | ____________________________ Y position ; | | | _______________________ Initialisation parameter ; | | | | __________________ Properties ; | | | | | _____________ Extra properties ; | | | | | | ________ Parameter 1 ; | | | | | | | ___ Parameter 2 ; | | | | | | | | $A6:AA2F dw E23F,0008,007F,0000,2800,0000,0005,0000 ; Ceres door $A6:AA3F dw E23F,00F8,007F,0000,2800,0000,0006,0000 ; Ceres door } ;;; $AA4F: RTS. Ridley function ;;; { $A6:AA4F 60 RTS } ;;; $AA50: Ridley function ;;; { ; Cycle EMERGENCY text colors ; Ceres Ridley $A6:AA50 20 9C C1 JSR $C19C [$A6:C19C] ; Cycle EMERGENCY text colors $A6:AA53 60 RTS } ;;; $AA54: ;;; { ; Ceres Ridley ; setup for mode7 getaway $A6:AA54 E2 20 SEP #$20 $A6:AA56 A9 07 LDA #$07 ;\ $A6:AA58 85 56 STA $56 [$7E:0056] ;} Fake BG mode = 7 $A6:AA5A C2 20 REP #$20 $A6:AA5C A9 01 00 LDA #$0001 $A6:AA5F 8D 83 07 STA $0783 [$7E:0783] ; enable mode7 $A6:AA62 E2 20 SEP #$20 ;\ $A6:AA64 A9 80 LDA #$80 ;| $A6:AA66 85 5F STA $5F [$7E:005F] ;} Set mode 7 BG map overflowing tiles as transparent, no screen flip $A6:AA68 C2 20 REP #$20 ;/ $A6:AA6A A9 00 01 LDA #$0100 ;\ $A6:AA6D 85 78 STA $78 [$7E:0078] ;| $A6:AA6F 85 7A STA $7A [$7E:007A] ;} Mode 7 transformation matrix = identity $A6:AA71 85 7C STA $7C [$7E:007C] ;| $A6:AA73 85 7E STA $7E [$7E:007E] ;/ $A6:AA75 A9 40 00 LDA #$0040 ;\ $A6:AA78 85 80 STA $80 [$7E:0080] ;} Mode 7 transformation origin = (40h, 40h) $A6:AA7A 85 82 STA $82 [$7E:0082] ;/ $A6:AA7C A9 00 00 LDA #$0000 $A6:AA7F 8F 24 80 7E STA $7E8024[$7E:8024] ; clear getaway completed flag $A6:AA83 8F 26 80 7E STA $7E8026[$7E:8026] ; reset flight data index $A6:AA87 A9 01 00 LDA #$0001 $A6:AA8A 8F 14 78 7E STA $7E7814[$7E:7814] $A6:AA8E A9 80 FF LDA #$FF80 $A6:AA91 8F 28 80 7E STA $7E8028[$7E:8028] ; getaway X velocity = $FF80 $A6:AA95 85 B1 STA $B1 [$7E:00B1] ; BG1 X scroll = $FF80 $A6:AA97 A9 20 00 LDA #$0020 $A6:AA9A 8F 2A 80 7E STA $7E802A[$7E:802A] ; getaway Y velocity = $20 $A6:AA9E 85 B3 STA $B3 [$7E:00B3] ; BG1 X scroll = $20 $A6:AAA0 A9 00 08 LDA #$0800 $A6:AAA3 8F 20 80 7E STA $7E8020[$7E:8020] ; useless, will be overwritten by $AABD $A6:AAA7 A9 00 04 LDA #$0400 $A6:AAAA 8F 22 80 7E STA $7E8022[$7E:8022] $A6:AAAE 60 RTS } ;;; $AAAF: Handle Ceres Ridley getaway cutscene ;;; { ; Ceres Ridley $A6:AAAF 8B PHB $A6:AAB0 4B PHK $A6:AAB1 AB PLB $A6:AAB2 AF 24 80 7E LDA $7E8024[$7E:8024] $A6:AAB6 D0 03 BNE $03 [$AABB] $A6:AAB8 20 BD AA JSR $AABD [$A6:AABD] $A6:AABB AB PLB $A6:AABC 6B RTL } ;;; $AABD: ;;; { ; Handle Ceres Ridley mode7 getaway ; Ceres Ridley ; Play getaway SFX, process flight data, earthquake $A6:AABD AF 26 80 7E LDA $7E8026[$7E:8026] $A6:AAC1 AA TAX $A6:AAC2 1A INC A $A6:AAC3 1A INC A $A6:AAC4 8F 26 80 7E STA $7E8026[$7E:8026] $A6:AAC8 E0 00 00 CPX #$0000 $A6:AACB D0 07 BNE $07 [$AAD4] ; if first execution: $A6:AACD A9 4E 00 LDA #$004E ;\ $A6:AAD0 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 4Eh, sound library 2, max queued sounds allowed = 6 (Ceres Ridley getaway) ; Samus push + quake $A6:AAD4 E0 D0 00 CPX #$00D0 $A6:AAD7 D0 10 BNE $10 [$AAE9] ; after 68h frames: $A6:AAD9 22 19 E1 90 JSL $90E119[$90:E119] ; Set Samus to be pushed out of Ceres Ridley's way $A6:AADD A9 23 00 LDA #$0023 ;\ $A6:AAE0 8D 3E 18 STA $183E [$7E:183E] ;} Earthquake type = BG2 only and enemies, 3 pixel displacement, diagonal $A6:AAE3 A9 40 00 LDA #$0040 ;\ $A6:AAE6 8D 40 18 STA $1840 [$7E:1840] ;} Earthquake timer = 40h ; skip pushing Samus $A6:AAE9 BD 4D AE LDA $AE4D,x[$A6:AE4D] ; Mode7 flyby zoom level? $A6:AAEC C9 FF FF CMP #$FFFF $A6:AAEF F0 3D BEQ $3D [$AB2E] ; if not terminated: $A6:AAF1 8F 20 80 7E STA $7E8020[$7E:8020] $A6:AAF5 AF 2A 80 7E LDA $7E802A[$7E:802A] $A6:AAF9 18 CLC $A6:AAFA 7D 2F AF ADC $AF2F,x[$A6:AF2F] ; Ceres Ridley getaway Y velocity table $A6:AAFD 8F 2A 80 7E STA $7E802A[$7E:802A] $A6:AB01 85 B3 STA $B3 [$7E:00B3] $A6:AB03 AF 28 80 7E LDA $7E8028[$7E:8028] $A6:AB07 38 SEC $A6:AB08 FD 0F B0 SBC $B00F,x[$A6:B00F] ; Ceres Ridley getaway X velocity table $A6:AB0B 8F 28 80 7E STA $7E8028[$7E:8028] $A6:AB0F 85 B1 STA $B1 [$7E:00B1] $A6:AB11 AF 20 80 7E LDA $7E8020[$7E:8020] $A6:AB15 20 EF B0 JSR $B0EF [$A6:B0EF] ; "Update BG1/2 palette 5 colours 1..Fh" $A6:AB18 AF 14 78 7E LDA $7E7814[$7E:7814] $A6:AB1C 18 CLC $A6:AB1D 69 30 00 ADC #$0030 $A6:AB20 8F 14 78 7E STA $7E7814[$7E:7814] $A6:AB24 20 5F AB JSR $AB5F [$A6:AB5F] ; >_<; $A6:AB27 20 BC AC JSR $ACBC [$A6:ACBC] ; "Animate Mode 7 Baby Metroid capsule" $A6:AB2A 20 27 AD JSR $AD27 [$A6:AD27] ; "Animate Mode 7 Ridley wings" $A6:AB2D 60 RTS ; done mode7 $A6:AB2E AF 24 80 7E LDA $7E8024[$7E:8024] $A6:AB32 1A INC A $A6:AB33 8F 24 80 7E STA $7E8024[$7E:8024] ; getaway completed $A6:AB37 E2 20 SEP #$20 $A6:AB39 A9 09 LDA #$09 $A6:AB3B 85 56 STA $56 [$7E:0056] ; fake BG mode and tile size = 9 $A6:AB3D C2 20 REP #$20 ; >.< $A6:AB3F E2 20 SEP #$20 ; >.< $A6:AB41 64 5F STZ $5F [$7E:005F] $A6:AB43 C2 20 REP #$20 $A6:AB45 64 78 STZ $78 [$7E:0078] ;\ $A6:AB47 64 7A STZ $7A [$7E:007A] ;| $A6:AB49 64 7C STZ $7C [$7E:007C] ;} Mode 7 transformation matrix = 0 $A6:AB4B 64 7E STZ $7E [$7E:007E] ;/ $A6:AB4D 64 80 STZ $80 [$7E:0080] ;\ $A6:AB4F 64 82 STZ $82 [$7E:0082] ;} Mode 7 transformation origin = (0, 0) $A6:AB51 64 B1 STZ $B1 [$7E:00B1] ; BG1 X scroll = 0 $A6:AB53 64 B3 STZ $B3 [$7E:00B3] ; BG1 Y scroll = 0 $A6:AB55 A9 4E C0 LDA #$C04E ; "Ceres Ridley post-mode7 function handler" $A6:AB58 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:AB5B 9C B2 0F STZ $0FB2 [$7E:0FB2] $A6:AB5E 60 RTS } ;;; $AB5F: ;;; { ; Handle mode7 transformation matrix ; Ceres Ridley ; >_<; $A6:AB5F AF 14 78 7E LDA $7E7814[$7E:7814] $A6:AB63 EB XBA $A6:AB64 29 FF 00 AND #$00FF $A6:AB67 85 12 STA $12 [$7E:0012] $A6:AB69 A9 00 01 LDA #$0100 $A6:AB6C 22 1E AC A6 JSL $A6AC1E[$A6:AC1E] $A6:AB70 85 18 STA $18 [$7E:0018] $A6:AB72 24 18 BIT $18 [$7E:0018] $A6:AB74 10 04 BPL $04 [$AB7A] $A6:AB76 49 FF FF EOR #$FFFF $A6:AB79 1A INC A $A6:AB7A 85 26 STA $26 [$7E:0026] $A6:AB7C AF 20 80 7E LDA $7E8020[$7E:8020] $A6:AB80 85 28 STA $28 [$7E:0028] $A6:AB82 20 58 AC JSR $AC58 [$A6:AC58] $A6:AB85 A5 2B LDA $2B [$7E:002B] $A6:AB87 24 18 BIT $18 [$7E:0018] $A6:AB89 10 04 BPL $04 [$AB8F] $A6:AB8B 49 FF FF EOR #$FFFF $A6:AB8E 1A INC A $A6:AB8F 85 78 STA $78 [$7E:0078] $A6:AB91 A9 00 01 LDA #$0100 $A6:AB94 22 0E AC A6 JSL $A6AC0E[$A6:AC0E] $A6:AB98 85 18 STA $18 [$7E:0018] $A6:AB9A 24 18 BIT $18 [$7E:0018] $A6:AB9C 10 04 BPL $04 [$ABA2] $A6:AB9E 49 FF FF EOR #$FFFF $A6:ABA1 1A INC A $A6:ABA2 85 26 STA $26 [$7E:0026] $A6:ABA4 AF 20 80 7E LDA $7E8020[$7E:8020] $A6:ABA8 85 28 STA $28 [$7E:0028] $A6:ABAA 20 58 AC JSR $AC58 [$A6:AC58] $A6:ABAD A5 2B LDA $2B [$7E:002B] $A6:ABAF 24 18 BIT $18 [$7E:0018] $A6:ABB1 10 04 BPL $04 [$ABB7] $A6:ABB3 49 FF FF EOR #$FFFF $A6:ABB6 1A INC A $A6:ABB7 85 7A STA $7A [$7E:007A] $A6:ABB9 A9 00 01 LDA #$0100 ;\ $A6:ABBC 22 0E AC A6 JSL $A6AC0E[$A6:AC0E] ;| $A6:ABC0 49 FF FF EOR #$FFFF ;| $A6:ABC3 1A INC A ;| $A6:ABC4 85 18 STA $18 [$7E:0018] ;| $A6:ABC6 24 18 BIT $18 [$7E:0018] ;| $A6:ABC8 10 04 BPL $04 [$ABCE] ;| $A6:ABCA 49 FF FF EOR #$FFFF ;| $A6:ABCD 1A INC A ;| ;| $A6:ABCE 85 26 STA $26 [$7E:0026] ;} Mode 7 transformation matrix parameter C = -[mode 7 transformation matrix parameter B] $A6:ABD0 AF 20 80 7E LDA $7E8020[$7E:8020] ;| $A6:ABD4 85 28 STA $28 [$7E:0028] ;| $A6:ABD6 20 58 AC JSR $AC58 [$A6:AC58] ;| $A6:ABD9 A5 2B LDA $2B [$7E:002B] ;| $A6:ABDB 24 18 BIT $18 [$7E:0018] ;| $A6:ABDD 10 04 BPL $04 [$ABE3] ;| $A6:ABDF 49 FF FF EOR #$FFFF ;| $A6:ABE2 1A INC A ;| ;| $A6:ABE3 85 7C STA $7C [$7E:007C] ;/ $A6:ABE5 A9 00 01 LDA #$0100 ;\ $A6:ABE8 22 1E AC A6 JSL $A6AC1E[$A6:AC1E] ;| $A6:ABEC 85 18 STA $18 [$7E:0018] ;| $A6:ABEE 24 18 BIT $18 [$7E:0018] ;| $A6:ABF0 10 04 BPL $04 [$ABF6] ;| $A6:ABF2 49 FF FF EOR #$FFFF ;| $A6:ABF5 1A INC A ;| ;| $A6:ABF6 85 26 STA $26 [$7E:0026] ;| $A6:ABF8 AF 20 80 7E LDA $7E8020[$7E:8020] ;} Mode 7 transformation matrix parameter D = [mode 7 transformation matrix parameter A] $A6:ABFC 85 28 STA $28 [$7E:0028] ;| $A6:ABFE 20 58 AC JSR $AC58 [$A6:AC58] ;| $A6:AC01 A5 2B LDA $2B [$7E:002B] ;| $A6:AC03 24 18 BIT $18 [$7E:0018] ;| $A6:AC05 10 04 BPL $04 [$AC0B] ;| $A6:AC07 49 FF FF EOR #$FFFF ;| $A6:AC0A 1A INC A ;| ;| $A6:AC0B 85 7E STA $7E [$7E:007E] ;/ $A6:AC0D 60 RTS } ;;; $AC0E: ;;; { $A6:AC0E 85 14 STA $14 [$7E:0014] $A6:AC10 24 14 BIT $14 [$7E:0014] $A6:AC12 10 04 BPL $04 [$AC18] $A6:AC14 49 FF FF EOR #$FFFF $A6:AC17 1A INC A $A6:AC18 85 26 STA $26 [$7E:0026] $A6:AC1A A5 12 LDA $12 [$7E:0012] $A6:AC1C 80 12 BRA $12 [$AC30] } ;;; $AC1E: ;;; { $A6:AC1E 85 14 STA $14 [$7E:0014] $A6:AC20 24 14 BIT $14 [$7E:0014] $A6:AC22 10 04 BPL $04 [$AC28] $A6:AC24 49 FF FF EOR #$FFFF $A6:AC27 1A INC A $A6:AC28 85 26 STA $26 [$7E:0026] $A6:AC2A A5 12 LDA $12 [$7E:0012] $A6:AC2C 18 CLC $A6:AC2D 69 40 00 ADC #$0040 } ;;; $AC30: ;;; { $A6:AC30 0A ASL A $A6:AC31 29 FE 01 AND #$01FE $A6:AC34 AA TAX $A6:AC35 BF 43 B4 A0 LDA $A0B443,x[$A0:B4C3] $A6:AC39 F0 1C BEQ $1C [$AC57] $A6:AC3B 85 16 STA $16 [$7E:0016] $A6:AC3D 10 04 BPL $04 [$AC43] $A6:AC3F 49 FF FF EOR #$FFFF $A6:AC42 1A INC A $A6:AC43 85 28 STA $28 [$7E:0028] $A6:AC45 20 58 AC JSR $AC58 [$A6:AC58] $A6:AC48 A5 14 LDA $14 [$7E:0014] $A6:AC4A 45 16 EOR $16 [$7E:0016] $A6:AC4C 30 03 BMI $03 [$AC51] $A6:AC4E A5 2B LDA $2B [$7E:002B] $A6:AC50 6B RTL $A6:AC51 A5 2B LDA $2B [$7E:002B] $A6:AC53 49 FF FF EOR #$FFFF $A6:AC56 1A INC A $A6:AC57 6B RTL } ;;; $AC58: ;;; { $A6:AC58 DA PHX $A6:AC59 5A PHY $A6:AC5A 48 PHA $A6:AC5B 08 PHP $A6:AC5C C2 20 REP #$20 $A6:AC5E E2 10 SEP #$10 $A6:AC60 A6 26 LDX $26 [$7E:0026] $A6:AC62 8E 02 42 STX $4202 [$7E:4202] $A6:AC65 A6 28 LDX $28 [$7E:0028] $A6:AC67 8E 03 42 STX $4203 [$7E:4203] $A6:AC6A EA NOP $A6:AC6B EA NOP $A6:AC6C EA NOP $A6:AC6D AD 16 42 LDA $4216 [$7E:4216] $A6:AC70 85 2A STA $2A [$7E:002A] $A6:AC72 A6 27 LDX $27 [$7E:0027] $A6:AC74 8E 02 42 STX $4202 [$7E:4202] $A6:AC77 A6 29 LDX $29 [$7E:0029] $A6:AC79 8E 03 42 STX $4203 [$7E:4203] $A6:AC7C EA NOP $A6:AC7D EA NOP $A6:AC7E EA NOP $A6:AC7F AE 16 42 LDX $4216 [$7E:4216] $A6:AC82 86 2C STX $2C [$7E:002C] $A6:AC84 AC 17 42 LDY $4217 [$7E:4217] $A6:AC87 A6 27 LDX $27 [$7E:0027] $A6:AC89 8E 02 42 STX $4202 [$7E:4202] $A6:AC8C A6 28 LDX $28 [$7E:0028] $A6:AC8E 8E 03 42 STX $4203 [$7E:4203] $A6:AC91 EA NOP $A6:AC92 EA NOP $A6:AC93 A5 2B LDA $2B [$7E:002B] $A6:AC95 18 CLC $A6:AC96 6D 16 42 ADC $4216 [$7E:4216] $A6:AC99 85 2B STA $2B [$7E:002B] $A6:AC9B 90 01 BCC $01 [$AC9E] $A6:AC9D C8 INY $A6:AC9E A6 26 LDX $26 [$7E:0026] $A6:ACA0 8E 02 42 STX $4202 [$7E:4202] $A6:ACA3 A6 29 LDX $29 [$7E:0029] $A6:ACA5 8E 03 42 STX $4203 [$7E:4203] $A6:ACA8 EA NOP $A6:ACA9 EA NOP $A6:ACAA A5 2B LDA $2B [$7E:002B] $A6:ACAC 18 CLC $A6:ACAD 6D 16 42 ADC $4216 [$7E:4216] $A6:ACB0 85 2B STA $2B [$7E:002B] $A6:ACB2 90 01 BCC $01 [$ACB5] $A6:ACB4 C8 INY $A6:ACB5 84 2D STY $2D [$7E:002D] $A6:ACB7 28 PLP $A6:ACB8 68 PLA $A6:ACB9 7A PLY $A6:ACBA FA PLX $A6:ACBB 60 RTS } ;;; $ACBC: ;;; { ; Animate mode 7 Baby Metroid capsule during mode7 getaway $A6:ACBC AD B6 05 LDA $05B6 [$7E:05B6] $A6:ACBF 29 03 00 AND #$0003 $A6:ACC2 D0 15 BNE $15 [$ACD9] ; every 4th frame: $A6:ACC4 AF 2C 80 7E LDA $7E802C[$7E:802C] $A6:ACC8 1A INC A $A6:ACC9 29 03 00 AND #$0003 $A6:ACCC 8F 2C 80 7E STA $7E802C[$7E:802C] $A6:ACD0 0A ASL A $A6:ACD1 A8 TAY $A6:ACD2 BE DA AC LDX $ACDA,y[$A6:ACDC] $A6:ACD5 22 4F 8B 80 JSL $808B4F[$80:8B4F] ; Queue mode 7 transfers $A6:ACD9 60 RTS $A6:ACDA dw ACE2, ACF5, AD08, ACF5 ; ______________________ Control. 80h = write to VRAM tilemap ; | ___________________ Source address ; | | ____________ Size ; | | | _______ Destination address (VRAM) ; | | | | __ VRAM address increment mode ; | | | | | $A6:ACE2 dx 80,A6AD1B,0002,0504,00, 80,A6AD1D,0002,0584,00, 00 $A6:ACF5 dx 80,A6AD1F,0002,0504,00, 80,A6AD21,0002,0584,00, 00 $A6:AD08 dx 80,A6AD23,0002,0504,00, 80,A6AD25,0002,0584,00, 00 $A6:AD1B db 59,5A $A6:AD1D db 69,6A $A6:AD1F db 8A,8B $A6:AD21 db 8C,8D $A6:AD23 db 8E,8F $A6:AD25 db 9D,9E } ;;; $AD27: ;;; { ; Animate mode 7 Ridley wings $A6:AD27 AD B6 05 LDA $05B6 [$7E:05B6] $A6:AD2A 29 07 00 AND #$0007 $A6:AD2D D0 15 BNE $15 [$AD44] ; every 8th frame: $A6:AD2F AF 2E 80 7E LDA $7E802E[$7E:802E] $A6:AD33 1A INC A $A6:AD34 29 01 00 AND #$0001 $A6:AD37 8F 2E 80 7E STA $7E802E[$7E:802E] $A6:AD3B 0A ASL A $A6:AD3C A8 TAY $A6:AD3D BE 45 AD LDX $AD45,y[$A6:AD47] $A6:AD40 22 4F 8B 80 JSL $808B4F[$80:8B4F] ; Queue mode 7 transfers $A6:AD44 60 RTS $A6:AD45 dw AD49, AD80 ; ______________________ Control. 80h = write to VRAM tilemap ; | ___________________ Source address ; | | ____________ Size ; | | | _______ Destination address (VRAM) ; | | | | __ VRAM address increment mode ; | | | | | $A6:AD49 dx 80,A6ADB7,0004,000B,00, 80,A6ADBF,000E,0080,00, 80,A6ADDB,000E,0100,00, 80,A6ADF7,000C,0181,00, 80,A6AE0F,000F,0201,00, 80,A6AE2D,0010,0280,00, 00 $A6:AD80 dx 80,A6ADBB,0004,000B,00, 80,A6ADCD,000E,0080,00, 80,A6ADE9,000E,0100,00, 80,A6AE03,000C,0181,00, 80,A6AE1E,000F,0201,00, 80,A6AE3D,0010,0280,00, 00 $A6:ADB7 db 00, 01, 02, 03 $A6:ADBB db FF, FF, FF, FF $A6:ADBF db 04, 05, 06, 07, 08, 09, FF, FF, 0A, 0B, 0C, 0D, 0E, 0F $A6:ADCD db FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF $A6:ADDB db 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, A8 $A6:ADE9 db FF, FF, FF, FF, FF, FF, 20, 17, AA, FF, FF, FF, FF, FF $A6:ADF7 db 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 2C $A6:AE03 db FF, FF, FF, FF, FF, 26, 27, 28, FF, FF, FF, FF $A6:AE0F db FF, FF, 1D, 1E, 1F, 30, 31, 32, 33, 34, FF, FF, FF, FF, FF $A6:AE1E db 91, 92, 93, 94, 95, 30, 31, 32, 96, 97, 98, 99, 9A, 98, 9C $A6:AE2D db FF, FF, FF, FF, 2E, 2F, 40, 41, 42, 43, 44, FF, FF, FF, FF, FF $A6:AE3D db 90, 9F, A0, A1, A2, A3, 40, 41, 42, A4, A5, A6, A7, 7D, 83, 2D } ;;; $AE4D: ;;; { ; Ceres Ridley mode7 getaway background parameters ; high byte * $20 = index into $A6B107 palettes $A6:AE4D dw 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 0800, 07F0, 07E0, 07D0, 07C0, 07B0, 07A0, 0790, 0780, 0770, 0760, 0750, 0740, 0730, 0720, 0710, 0700, 06E0, 06C0, 06A0, 0680, 0660, 0640, 0620, 0600, 05E0, 05C0, 05A0, 0580, 0560, 0540, 0520, 0500, 04E0, 04C0, 04A0, 0480, 0460, 0440, 0430, 0400, 03E0, 03C0, 03A0, 0380, 0360, 0340, 0320, 0300, 02E0, 02C0, 02A0, 0280, 0260, 0240, 0230, 0200, 01E0, 01C0, 01A0, 0180, 0160, 0140, 0120, 0100, 00F0, 00E0, 00D0, 00C0, 00B0, 00A0, 0090, 0080, 0070, 0060, 0050, 0040, 0030, 0020, 0020, 0020, FFFF } ;;; $AF2F: Ceres Ridley getaway Y velocity table ;;; { $A6:AF2F dw FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFA, FFFC, FFFC, FFFC, FFFC, FFFC, FFFC, FFFC, FFFC, FFFC, FFFC, FFFE, FFFE, FFFE, FFFE, FFFE, FFFE, FFFE, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0003, 0004, 0006, 0008, 000A, 000C, 000E, 0010, 0014, 0018, 002C, 0030, 0080, 0100, 0100, 0100 } ;;; $B00F: Ceres Ridley getaway X velocity table ;;; { $A6:B00F dw FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, FFFF, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0002, 0002, 0003, 0003, 0004, 0004, 0005, 0005, 0008, 000C, 0010, 0014, 0020, 0020, 0020, 0020 } ;;; $B0EF: ;;; { ; Update BG1/2 palette 5 $A6:B0EF EB XBA $A6:B0F0 29 FF 00 AND #$00FF $A6:B0F3 0A ASL A $A6:B0F4 0A ASL A $A6:B0F5 0A ASL A $A6:B0F6 0A ASL A $A6:B0F7 0A ASL A $A6:B0F8 69 07 B1 ADC #$B107 $A6:B0FB A8 TAY $A6:B0FC A2 A2 00 LDX #$00A2 $A6:B0FF A9 0F 00 LDA #$000F $A6:B102 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write $F colors from $A6:[Y] to color index $A2 (BG1/2 palette 5) $A6:B106 60 RTS ; BG1/2 palette 5 colors 1..Fh $A6:B107 dw 56BA,41B2,1447,0403,4E15,3570,24CB,1868,5E5F,183F,1014,031F,01DA,00F5,0C63,0000 $A6:B127 dw 4E78,3D90,1026,0402,45F3,314F,20AA,1447,561D,143D,0C12,02DD,01B8,00D3,0842,0000 $A6:B147 dw 4A56,356F,1026,0002,41B2,2D2D,1CA9,1447,51FA,141A,0C11,029A,0196,00D2,0842,0000 $A6:B167 dw 4214,314E,1025,0002,3D90,290C,1C88,1046,49D8,1018,0C10,0278,0174,00B0,0842,0000 $A6:B187 dw 3DF3,2D2D,0C25,0002,396F,250B,1888,1045,41B6,1016,0C0E,0236,0153,00AF,0842,0000 $A6:B1A7 dw 39D1,290C,0C24,0002,314E,20EA,1887,1045,3D94,1014,080D,0214,0131,008E,0842,0000 $A6:B1C7 dw 318F,24EA,0C24,0001,2D2C,1CC9,1466,0C24,3552,0C12,080C,01D2,010F,008C,0421,0000 $A6:B1E7 dw 252C,1CC8,0823,0001,20E9,18A7,1045,0823,290E,080E,0409,016E,00CC,0069,0421,0000 $A6:B207 dw 1CE8,1486,0402,0001,18A7,1065,0C43,0822,1CCA,080A,0406,010A,0088,0047,0421,0000 } ;;; $B227: Main AI - enemy $E17F (Ridley) ;;; { $A6:B227 AF 08 80 7E LDA $7E8008[$7E:8008] $A6:B22B 38 SEC $A6:B22C E9 04 00 SBC #$0004 $A6:B22F 10 03 BPL $03 [$B234] $A6:B231 A9 00 00 LDA #$0000 $A6:B234 8F 08 80 7E STA $7E8008[$7E:8008] $A6:B238 20 B4 BC JSR $BCB4 [$A6:BCB4] ; "Handles Enemy/Samus interaction bit" $A6:B23B 20 2C BD JSR $BD2C [$A6:BD2C] ; "Power Bomb Check/Reaction" $A6:B23E F4 43 B2 PEA $B243 $A6:B241 6C A8 0F JMP ($0FA8)[$A6:A35B] ; PEA return $A6:B244 AF 04 78 7E LDA $7E7804[$7E:7804] $A6:B248 F0 21 BEQ $21 [$B26B] ; if Ceres Ridley active: $A6:B24A 20 DA D4 JSR $D4DA [$A6:D4DA] ; "Make wings/tail flash when hit" $A6:B24D 20 6B D8 JSR $D86B [$A6:D86B] ; "Handles movement and main body wall collisions" $A6:B250 20 7D D9 JSR $D97D [$A6:D97D] ; "Handle wing flapping" $A6:B253 20 F5 CA JSR $CAF5 [$A6:CAF5] ; "Run Tail AI: Sound, control AI, X/Y positions, tail extension, hurt Samus" $A6:B256 20 88 E0 JSR $E088 [$A6:E088] ; "Tail tip kills projectiles" $A6:B259 20 2A DB JSR $DB2A [$A6:DB2A] ; "Draw tail" $A6:B25C 20 D8 DA JSR $DAD8 [$A6:DAD8] ; "Drawing routine for Ridley's wings" $A6:B25F 20 0C DA JSR $DA0C [$A6:DA0C] ; "Animate Ridley's ribs" $A6:B262 AF 36 78 7E LDA $7E7836[$7E:7836] $A6:B266 F0 03 BEQ $03 [$B26B] ; if holding Samus: $A6:B268 20 E1 B9 JSR $B9E1 [$A6:B9E1] ; "If holding Samus, move Samus to within Ridley's claws" ; not holding Samus $A6:B26B 20 74 D4 JSR $D474 [$A6:D474] ; "Determine and set Norfair Ridley's speed and color pallete" $A6:B26E 6B RTL } ;;; $B26F: ;;; { ; Seems unused $A6:B26F AF 3C 78 7E LDA $7E783C[$7E:783C] $A6:B273 0F 36 78 7E ORA $7E7836[$7E:7836] $A6:B277 D0 0B BNE $0B [$B284] ; if grab cooldown timer expired and not holding Samus: $A6:B279 A2 04 00 LDX #$0004 $A6:B27C A0 04 00 LDY #$0004 $A6:B27F 20 65 B8 JSR $B865 [$A6:B865] ; "Attempt to grab Samus" $A6:B282 B0 01 BCS $01 [$B285] $A6:B284 60 RTS $A6:B285 4C 68 BC JMP $BC68 [$A6:BC68] ; "Grab Samus" } ;;; $B288: ;;; { $A6:B288 dw 0008 } ;;; $B28A: Time is frozen AI - enemy $E17F (Ridley) ;;; { ; The only time is frozen AI in the game! $A6:B28A A9 00 00 LDA #$0000 $A6:B28D 8F 08 80 7E STA $7E8008[$7E:8008] $A6:B291 A9 01 00 LDA #$0001 $A6:B294 8D A4 0F STA $0FA4 [$7E:0FA4] ; frame counter = 1 } ;;; $B297: Hurt AI - enemy $E17F (Ridley) ;;; { ; Norfair Ridley $A6:B297 AD A4 0F LDA $0FA4 [$7E:0FA4] $A6:B29A 29 01 00 AND #$0001 $A6:B29D D0 1B BNE $1B [$B2BA] ; if frame counter is even: $A6:B29F 20 B4 BC JSR $BCB4 [$A6:BCB4] ; "Handles Enemy/Samus interaction bit" $A6:B2A2 20 2C BD JSR $BD2C [$A6:BD2C] ; "Power Bomb Check/Reaction" $A6:B2A5 F4 AA B2 PEA $B2AA $A6:B2A8 6C A8 0F JMP ($0FA8)[$A6:A478] ; PEA return $A6:B2AB AF 04 78 7E LDA $7E7804[$7E:7804] $A6:B2AF F0 38 BEQ $38 [$B2E9] ; if Ceres Ridley active: $A6:B2B1 20 6B D8 JSR $D86B [$A6:D86B] ; "Handles movement and main body wall collisions" $A6:B2B4 20 7D D9 JSR $D97D [$A6:D97D] ; "Handle wing flapping" $A6:B2B7 20 F5 CA JSR $CAF5 [$A6:CAF5] ; "Run Tail AI: Sound, control AI, X/Y positions, tail extension, hurt Samus" $A6:B2BA 20 88 E0 JSR $E088 [$A6:E088] ; "Tail tip kills projectiles" $A6:B2BD 20 DA D4 JSR $D4DA [$A6:D4DA] ; "Make wings/tail flash when hit" $A6:B2C0 20 2A DB JSR $DB2A [$A6:DB2A] ; "Draw tail" $A6:B2C3 20 D8 DA JSR $DAD8 [$A6:DAD8] ; "Drawing routine for Ridley's wings" $A6:B2C6 20 74 D4 JSR $D474 [$A6:D474] ; "Determine and set Norfair Ridley's speed and color pallete" $A6:B2C9 20 0C DA JSR $DA0C [$A6:DA0C] ; "Animate Ridley's ribs" $A6:B2CC AF 08 80 7E LDA $7E8008[$7E:8008] $A6:B2D0 18 CLC $A6:B2D1 69 01 00 ADC #$0001 $A6:B2D4 CD 88 B2 CMP $B288 [$A6:B288] $A6:B2D7 30 03 BMI $03 [$B2DC] $A6:B2D9 AD 88 B2 LDA $B288 [$A6:B288] $A6:B2DC 8F 08 80 7E STA $7E8008[$7E:8008] $A6:B2E0 AF 08 80 7E LDA $7E8008[$7E:8008] ; >.< $A6:B2E4 CD 88 B2 CMP $B288 [$A6:B288] $A6:B2E7 30 09 BMI $09 [$B2F2] $A6:B2E9 AF 36 78 7E LDA $7E7836[$7E:7836] $A6:B2ED F0 03 BEQ $03 [$B2F2] ; if holding Samus: $A6:B2EF 20 E1 B9 JSR $B9E1 [$A6:B9E1] ; "If holding Samus, move Samus to within Ridley's claws" $A6:B2F2 6B RTL } ;;; $B2F3: Ridley function ;;; { ; Startup liftoff, facing right ; Norfair Ridley $A6:B2F3 A2 40 00 LDX #$0040 $A6:B2F6 A0 00 01 LDY #$0100 $A6:B2F9 86 12 STX $12 [$7E:0012] ; target X position = $40 $A6:B2FB 84 14 STY $14 [$7E:0014] ; target Y position = $100 $A6:B2FD A2 00 00 LDX #$0000 $A6:B300 A0 0E 00 LDY #$000E $A6:B303 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:B306 A9 08 00 LDA #$0008 $A6:B309 85 16 STA $16 [$7E:0016] ; target X radius = 8 $A6:B30B 85 18 STA $18 [$7E:0018] ; target Y radius = 8 $A6:B30D 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle, clear = collision $A6:B311 90 01 BCC $01 [$B314] ; if carry clear: BRANCH_COLLISION $A6:B313 60 RTS ; BRANCH_COLLISION $A6:B314 A9 01 00 LDA #$0001 $A6:B317 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley active $A6:B31B A9 21 B3 LDA #$B321 ; "Get new AI script" $A6:B31E 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer } ;;; $B321: Ridley function ;;; { ; Get new AI script (main battle engine) $A6:B321 20 35 B3 JSR $B335 [$A6:B335] ; "Get new AI script" $A6:B324 22 11 81 80 JSL $808111[$80:8111] ; Generate random number $A6:B328 29 07 00 AND #$0007 $A6:B32B 0A ASL A $A6:B32C A8 TAY $A6:B32D B1 12 LDA ($12),y[$A6:B3C8] $A6:B32F 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B332 6C A8 0F JMP ($0FA8)[$A6:B6A7] } ;;; $B335: ;;; { ; Get new AI script ; Norfair Ridley $A6:B335 AD 1F 0A LDA $0A1F [$7E:0A1F] $A6:B338 29 FF 00 AND #$00FF $A6:B33B C9 03 00 CMP #$0003 $A6:B33E D0 06 BNE $06 [$B346] ; if Samus is spin jumping: $A6:B340 A9 CC B3 LDA #$B3CC $A6:B343 85 12 STA $12 [$7E:0012] $A6:B345 60 RTS $A6:B346 AD 8C 0F LDA $0F8C [$7E:0F8C] ; else, not spin jumping $A6:B349 D0 0F BNE $0F [$B35A] ; if Ridley health = 0: $A6:B34B A9 DC B3 LDA #$B3DC $A6:B34E 85 12 STA $12 [$7E:0012] $A6:B350 AF 0A 80 7E LDA $7E800A[$7E:800A] $A6:B354 1A INC A $A6:B355 8F 0A 80 7E STA $7E800A[$7E:800A] $A6:B359 60 RTS $A6:B35A C9 40 38 CMP #$3840 ; else, not dead $A6:B35D 10 06 BPL $06 [$B365] ; if health < 14,400: $A6:B35F A0 8C B3 LDY #$B38C $A6:B362 84 12 STY $12 [$7E:0012] $A6:B364 60 RTS $A6:B365 20 20 BD JSR $BD20 [$A6:BD20] ; "Check if Samus Y is below #$0160 (tail bounce Y position threshold?)" $A6:B368 90 06 BCC $06 [$B370] ; if Samus Y >= $160: $A6:B36A A0 BC B3 LDY #$B3BC $A6:B36D 84 12 STY $12 [$7E:0012] $A6:B36F 60 RTS ; Samus Y below $160 $A6:B370 20 F1 BC JSR $BCF1 [$A6:BCF1] ; "CLC if spin jump, grappling, or spin back from hurt" $A6:B373 90 06 BCC $06 [$B37B] $A6:B375 A0 AC B3 LDY #$B3AC $A6:B378 84 12 STY $12 [$7E:0012] $A6:B37A 60 RTS } ;;; $B37B: ;;; { ; Check if Ridley is below half health ; Why is this a separate function? What points here besides the above branch? $A6:B37B A0 8C B3 LDY #$B38C $A6:B37E AD 8C 0F LDA $0F8C [$7E:0F8C] $A6:B381 C9 28 23 CMP #$2328 $A6:B384 10 03 BPL $03 [$B389] ; if Ridley health < 9,000 (half): $A6:B386 A0 9C B3 LDY #$B39C $A6:B389 84 12 STY $12 [$7E:0012] $A6:B38B 60 RTS } ;;; $B38C: ;;; { ; function pointers, indexed randomly $A6:B38C dw B6A7,B6A7,B6A7,B6A7,B441,B441,B441,B441 ; > half health $A6:B39C dw B441,B441,B441,B441,B6A7,B6A7,B6A7,B6A7 ; < half health $A6:B3AC dw BAB7,BAB7,BAB7,BAB7,BAB7,BAB7,B6A7,B6A7 ; not spin jump, grappling, or spin back from hurt $A6:B3BC dw B6A7,B6A7,B6A7,B6A7,B6A7,B6A7,B6A7,B6A7 ; Samus Y above $160 (tail bounce threshold?) $A6:B3CC dw B5C4,B5C4,B5C4,B5C4,B5C4,B5C4,B5C4,B5C4 ; spin jumping $A6:B3DC dw BAB7,BAB7,BAB7,BAB7,BAB7,BAB7,BAB7,BAB7 ; 0 health } ;;; $B3EC: Ridley function ;;; { ; Initailize movement to center $A6:B3EC A9 F8 B3 LDA #$B3F8 $A6:B3EF 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B3F2 A9 80 00 LDA #$0080 $A6:B3F5 8D B2 0F STA $0FB2 [$7E:0FB2] } ;;; $B3F8: Ridley function ;;; { ; Move to center side $A6:B3F8 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:B3FB 30 2A BMI $2A [$B427] $A6:B3FD A2 C0 00 LDX #$00C0 $A6:B400 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B404 F0 03 BEQ $03 [$B409] ; if not facing left: $A6:B406 A2 60 00 LDX #$0060 ; facing left $A6:B409 86 12 STX $12 [$7E:0012] ; target X position $A6:B40B A0 00 01 LDY #$0100 $A6:B40E 84 14 STY $14 [$7E:0014] ; target Y position = $100 $A6:B410 20 2E B4 JSR $B42E [$A6:B42E] ; "Y = 4, 8, A, or C, depending on general speed byte" $A6:B413 A2 00 00 LDX #$0000 $A6:B416 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:B419 A9 08 00 LDA #$0008 $A6:B41C 85 16 STA $16 [$7E:0016] ; Rectangle X radius = 8 $A6:B41E 85 18 STA $18 [$7E:0018] ; Rectangle Y radius = 8 $A6:B420 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle $A6:B424 90 01 BCC $01 [$B427] ; if no collision: $A6:B426 60 RTS $A6:B427 A9 21 B3 LDA #$B321 ; "Get new AI script (main battle engine)" $A6:B42A 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B42D 60 RTS } ;;; $B42E: ;;; { ; Y = 4, 8, A, or C, depending on general speed byte $A6:B42E AF 24 78 7E LDA $7E7824[$7E:7824] $A6:B432 0A ASL A $A6:B433 A8 TAY $A6:B434 B9 39 B4 LDA $B439,y[$A6:B439] $A6:B437 A8 TAY $A6:B438 60 RTS $A6:B439 dw 0004, 0008, 000A, 000C } ;;; $B441: Ridley function ;;; { ; Chose to do a U swoop $A6:B441 A9 55 B4 LDA #$B455 $A6:B444 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B447 A9 0A 00 LDA #$000A $A6:B44A 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B44E A9 00 00 LDA #$0000 $A6:B451 8F 14 78 7E STA $7E7814[$7E:7814] } ;;; $B455: Ridley function ;;; { ; Fly to U swoop start $A6:B455 A2 C0 00 LDX #$00C0 $A6:B458 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B45C F0 03 BEQ $03 [$B461] ; if not facing left: $A6:B45E A2 40 00 LDX #$0040 ; facing left $A6:B461 86 12 STX $12 [$7E:0012] ; target X position $A6:B463 A0 80 00 LDY #$0080 $A6:B466 84 14 STY $14 [$7E:0014] ; target Y position = $80 $A6:B468 A2 00 00 LDX #$0000 $A6:B46B A0 01 00 LDY #$0001 $A6:B46E 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:B471 A9 08 00 LDA #$0008 $A6:B474 85 16 STA $16 [$7E:0016] ; target X radius = 8 $A6:B476 85 18 STA $18 [$7E:0018] ; target Y radius = 8 $A6:B478 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle, clear = collision $A6:B47C B0 14 BCS $14 [$B492] ; if no collision: return $A6:B47E A9 93 B4 LDA #$B493 $A6:B481 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B484 A9 20 00 LDA #$0020 $A6:B487 8F 00 78 7E STA $7E7800[$7E:7800] ; timer = $20 $A6:B48B A9 00 00 LDA #$0000 $A6:B48E 8F 14 78 7E STA $7E7814[$7E:7814] $A6:B492 60 RTS } ;;; $B493: Ridley function ;;; { ; U swoop, first dive $A6:B493 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B497 D0 0C BNE $0C [$B4A5] ; if facing left: $A6:B499 A9 E0 FF LDA #$FFE0 $A6:B49C 85 12 STA $12 [$7E:0012] $A6:B49E A9 00 FE LDA #$FE00 $A6:B4A1 85 14 STA $14 [$7E:0014] $A6:B4A3 80 0A BRA $0A [$B4AF] $A6:B4A5 A9 20 00 LDA #$0020 ; else, facing right $A6:B4A8 85 12 STA $12 [$7E:0012] $A6:B4AA A9 00 02 LDA #$0200 $A6:B4AD 85 14 STA $14 [$7E:0014] $A6:B4AF A9 80 04 LDA #$0480 $A6:B4B2 85 16 STA $16 [$7E:0016] $A6:B4B4 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:B4B7 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:B4BB F0 06 BEQ $06 [$B4C3] ; if timer != 0: $A6:B4BD 3A DEC A $A6:B4BE 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B4C2 60 RTS $A6:B4C3 A9 D1 B4 LDA #$B4D1 $A6:B4C6 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B4C9 A9 14 00 LDA #$0014 $A6:B4CC 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B4D0 60 RTS } ;;; $B4D1: Ridley function ;;; { ; U swoop, dive to half point $A6:B4D1 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B4D5 D0 0C BNE $0C [$B4E3] ; if facing left: $A6:B4D7 A9 C0 FE LDA #$FEC0 $A6:B4DA 85 12 STA $12 [$7E:0012] $A6:B4DC A9 00 C0 LDA #$C000 $A6:B4DF 85 14 STA $14 [$7E:0014] $A6:B4E1 80 0A BRA $0A [$B4ED] $A6:B4E3 A9 40 01 LDA #$0140 ; else, facing right $A6:B4E6 85 12 STA $12 [$7E:0012] $A6:B4E8 A9 00 40 LDA #$4000 $A6:B4EB 85 14 STA $14 [$7E:0014] $A6:B4ED A9 00 05 LDA #$0500 $A6:B4F0 85 16 STA $16 [$7E:0016] $A6:B4F2 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:B4F5 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:B4F9 F0 06 BEQ $06 [$B501] ; if timer != 0: $A6:B4FB 3A DEC A $A6:B4FC 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B500 60 RTS $A6:B501 A9 16 B5 LDA #$B516 $A6:B504 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B507 A9 10 00 LDA #$0010 $A6:B50A 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B50E A9 01 00 LDA #$0001 $A6:B511 8F 04 20 7E STA $7E2004[$7E:2004] $A6:B515 60 RTS } ;;; $B516: Ridley function ;;; { ; U swoop, climb after half point $A6:B516 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B51A D0 0C BNE $0C [$B528] ; if facing left: $A6:B51C A9 00 FE LDA #$FE00 $A6:B51F 85 12 STA $12 [$7E:0012] $A6:B521 A9 00 88 LDA #$8800 $A6:B524 85 14 STA $14 [$7E:0014] $A6:B526 80 0A BRA $0A [$B532] $A6:B528 A9 00 02 LDA #$0200 ; else, facing right $A6:B52B 85 12 STA $12 [$7E:0012] $A6:B52D A9 00 78 LDA #$7800 $A6:B530 85 14 STA $14 [$7E:0014] $A6:B532 A9 00 03 LDA #$0300 $A6:B535 85 16 STA $16 [$7E:0016] $A6:B537 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:B53A AF 00 78 7E LDA $7E7800[$7E:7800] $A6:B53E F0 06 BEQ $06 [$B546] ; if timer != 0: $A6:B540 3A DEC A $A6:B541 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B545 60 RTS $A6:B546 A9 54 B5 LDA #$B554 $A6:B549 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B54C A9 20 00 LDA #$0020 $A6:B54F 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B553 60 RTS } ;;; $B554: Ridley function ;;; { ; U Swoop, still climbing $A6:B554 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B558 D0 0C BNE $0C [$B566] ; if facing left: $A6:B55A A9 00 FC LDA #$FC00 $A6:B55D 85 12 STA $12 [$7E:0012] $A6:B55F A9 00 88 LDA #$8800 $A6:B562 85 14 STA $14 [$7E:0014] $A6:B564 80 0A BRA $0A [$B570] $A6:B566 A9 00 04 LDA #$0400 ; else, facing right $A6:B569 85 12 STA $12 [$7E:0012] $A6:B56B A9 00 78 LDA #$7800 $A6:B56E 85 14 STA $14 [$7E:0014] $A6:B570 A9 00 03 LDA #$0300 $A6:B573 85 16 STA $16 [$7E:0016] $A6:B575 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:B578 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:B57C F0 06 BEQ $06 [$B584] ; if timer != 0: $A6:B57E 3A DEC A $A6:B57F 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B583 60 RTS $A6:B584 A9 94 B5 LDA #$B594 $A6:B587 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B58A A9 20 00 LDA #$0020 $A6:B58D 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B591 4C 55 D9 JMP $D955 [$A6:D955] ; "Turn around if facing away from the center of the room (facing a wall)" } ;;; $B594: Ridley function ;;; { ; U Swoop End (Chooses BAB7 for next script if Samus is not spinjumping, else B321) $A6:B594 64 12 STZ $12 [$7E:0012] $A6:B596 A9 00 80 LDA #$8000 $A6:B599 85 14 STA $14 [$7E:0014] $A6:B59B A9 C0 01 LDA #$01C0 $A6:B59E 85 16 STA $16 [$7E:0016] $A6:B5A0 20 00 D8 JSR $D800 [$A6:D800] ; "Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed" $A6:B5A3 AF 00 78 7E LDA $7E7800[$7E:7800] $A6:B5A7 F0 06 BEQ $06 [$B5AF] ; if timer != 0: $A6:B5A9 3A DEC A $A6:B5AA 8F 00 78 7E STA $7E7800[$7E:7800] $A6:B5AE 60 RTS $A6:B5AF 20 F1 BC JSR $BCF1 [$A6:BCF1] ; "CLC if spin jump, grappling, or spin back from hurt" $A6:B5B2 A0 21 B3 LDY #$B321 ; "Get new AI script (main battle engine)" $A6:B5B5 90 03 BCC $03 [$B5BA] $A6:B5B7 A0 B7 BA LDY #$BAB7 ; "Check to do Deathswoop/Powerbomb dodge/Move-to-Center, or attempt to ram/grab Samus" $A6:B5BA 8C A8 0F STY $0FA8 [$7E:0FA8] ; next function pointer $A6:B5BD 60 RTS } ;;; $B5BE: ;;; { ; Seems unused $A6:B5BE dw FFE0, 0000, 0020 } ;;; $B5C4: Ridley function ;;; { ; Consider tailbouncing $A6:B5C4 A9 0B 00 LDA #$000B $A6:B5C7 8F 1E 20 7E STA $7E201E[$7E:201E] $A6:B5CB A9 80 01 LDA #$0180 $A6:B5CE 8F 12 20 7E STA $7E2012[$7E:2012] $A6:B5D2 A9 E5 B5 LDA #$B5E5 $A6:B5D5 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B5D8 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B5DB 29 1F 00 AND #$001F $A6:B5DE 18 CLC $A6:B5DF 69 20 00 ADC #$0020 $A6:B5E2 8D B2 0F STA $0FB2 [$7E:0FB2] } ;;; $B5E5: Ridley function ;;; { ; Considering tailbouncing $A6:B5E5 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B5E9 0A ASL A $A6:B5EA A8 TAY $A6:B5EB B9 0D B6 LDA $B60D,y $A6:B5EE 85 12 STA $12 [$7E:0012] $A6:B5F0 20 41 B6 JSR $B641 [$A6:B641] ; "Fly towards $12 (X position) / Samus's Y position" $A6:B5F3 90 03 BCC $03 [$B5F8] $A6:B5F5 4C 8B B6 JMP $B68B [$A6:B68B] $A6:B5F8 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:B5FB 10 0F BPL $0F [$B60C] $A6:B5FD A9 13 B6 LDA #$B613 $A6:B600 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B603 A9 80 00 LDA #$0080 $A6:B606 8D B2 0F STA $0FB2 [$7E:0FB2] $A6:B609 4C 55 D9 JMP $D955 [$A6:D955] ; "Turn around if facing away from the center of the room (facing a wall)" $A6:B60C 60 RTS ; target X positions, indexed by facing direction: left, turning, right $A6:B60D dw 00C0, 0080, 0040 } ;;; $B613: Ridley function ;;; { ; Hover since Samus is spinjumping $A6:B613 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B617 0A ASL A $A6:B618 A8 TAY $A6:B619 B9 3B B6 LDA $B63B,y $A6:B61C 85 12 STA $12 [$7E:0012] $A6:B61E 20 41 B6 JSR $B641 [$A6:B641] ; "Fly towards $12 (X position) / Samus's Y position" $A6:B621 90 03 BCC $03 [$B626] $A6:B623 4C 8B B6 JMP $B68B [$A6:B68B] $A6:B626 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:B629 10 0F BPL $0F [$B63A] $A6:B62B A9 E5 B5 LDA #$B5E5 $A6:B62E 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B631 A9 80 00 LDA #$0080 $A6:B634 8D B2 0F STA $0FB2 [$7E:0FB2] $A6:B637 4C 55 D9 JMP $D955 [$A6:D955] ; "Turn around if facing away from the center of the room (facing a wall)" $A6:B63A 60 RTS ; target X positions, indexed by facing direction: left, turning, right $A6:B63B dw 0040, 0080, 00C0 } ;;; $B641: ;;; { ; Fly towards $12 (X position) / Samus's Y position ; If Samus is not spin jumping, SEC before RTS. Else CLC and randomly fireball if allowed. $A6:B641 AD FA 0A LDA $0AFA [$7E:0AFA] $A6:B644 C9 60 01 CMP #$0160 $A6:B647 30 03 BMI $03 [$B64C] ; if Samus Y position >= $160: $A6:B649 A9 60 01 LDA #$0160 ; minimum $160 $A6:B64C 85 14 STA $14 [$7E:0014] $A6:B64E A2 00 00 LDX #$0000 $A6:B651 20 2E B4 JSR $B42E [$A6:B42E] ; "Y = 4, 8, A, or C, depending on general speed byte" $A6:B654 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:B657 A9 01 00 LDA #$0001 $A6:B65A 8F 04 20 7E STA $7E2004[$7E:2004] ; fling tail $A6:B65E AD 1F 0A LDA $0A1F [$7E:0A1F] $A6:B661 29 FF 00 AND #$00FF $A6:B664 C9 03 00 CMP #$0003 $A6:B667 D0 20 BNE $20 [$B689] ; if Samus pose = spin jump: $A6:B669 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B66C 29 FF 00 AND #$00FF $A6:B66F C9 80 00 CMP #$0080 $A6:B672 90 13 BCC $13 [$B687] ; if 50% random chance: $A6:B674 AF 1E 78 7E LDA $7E781E[$7E:781E] $A6:B678 D0 0D BNE $0D [$B687] ; if Ridley not playing roar SFX: $A6:B67A AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B67E 3A DEC A $A6:B67F F0 06 BEQ $06 [$B687] ; if Ridley direction = not turning: $A6:B681 A9 3A E7 LDA #$E73A ; "Fireballing" $A6:B684 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list ; return, no fireballs $A6:B687 18 CLC $A6:B688 60 RTS ; Samus not spin jumping $A6:B689 38 SEC $A6:B68A 60 RTS } ;;; $B68B: ;;; { ; Norfair Ridley ; Setup tail for tailbouncing ; changing the first two variables causes the tail to whip and rest at different angles $A6:B68B A9 F0 00 LDA #$00F0 $A6:B68E 8F 12 20 7E STA $7E2012[$7E:2012] ; tail whip angle? $A6:B692 A9 10 00 LDA #$0010 $A6:B695 8F 1E 20 7E STA $7E201E[$7E:201E] ; resting angle? $A6:B699 A9 01 00 LDA #$0001 $A6:B69C 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "flinging at Samus" $A6:B6A0 A9 A7 B6 LDA #$B6A7 $A6:B6A3 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B6A6 60 RTS } ;;; $B6A7: Ridley function ;;; { ; Fly to start Tailbouncing $A6:B6A7 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:B6AA C9 20 01 CMP #$0120 $A6:B6AD 30 1F BMI $1F [$B6CE] $A6:B6AF AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B6B3 0A ASL A $A6:B6B4 A8 TAY $A6:B6B5 B9 C8 B6 LDA $B6C8,y[$A6:B6CC] $A6:B6B8 85 12 STA $12 [$7E:0012] ; target X position $A6:B6BA A9 20 01 LDA #$0120 $A6:B6BD 85 14 STA $14 [$7E:0014] ; target Y position $A6:B6BF A2 00 00 LDX #$0000 $A6:B6C2 A0 00 00 LDY #$0000 $A6:B6C5 4C 23 D5 JMP $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" ; target X positions $A6:B6C8 dw 00B0, 0080, 0060 $A6:B6CE 20 55 D9 JSR $D955 [$A6:D955] ; "Turn around if facing away from the center of the room (facing a wall)" $A6:B6D1 A9 DD B6 LDA #$B6DD $A6:B6D4 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B6D7 A9 20 00 LDA #$0020 $A6:B6DA 8D B2 0F STA $0FB2 [$7E:0FB2] } ;;; $B6DD: Ridley function ;;; { ; Start tailbouncing $A6:B6DD AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:B6E0 85 12 STA $12 [$7E:0012] $A6:B6E2 A9 20 01 LDA #$0120 $A6:B6E5 85 14 STA $14 [$7E:0014] $A6:B6E7 A2 00 00 LDX #$0000 $A6:B6EA A0 00 00 LDY #$0000 $A6:B6ED 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:B6F0 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:B6F3 10 18 BPL $18 [$B70D] $A6:B6F5 20 33 CB JSR $CB33 [$A6:CB33] $A6:B6F8 20 0F B9 JSR $B90F [$A6:B90F] ; "Set speeds for tailbouncing (depends on random and speed)" $A6:B6FB A9 0E B7 LDA #$B70E $A6:B6FE 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B701 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B704 29 3F 00 AND #$003F $A6:B707 69 80 00 ADC #$0080 $A6:B70A 8D B2 0F STA $0FB2 [$7E:0FB2] $A6:B70D 60 RTS } ;;; $B70E: Ridley function ;;; { ; Main tailbouncing $A6:B70E 20 59 B8 JSR $B859 [$A6:B859] ; "Attempt to grab Samus" $A6:B711 90 07 BCC $07 [$B71A] $A6:B713 20 4D B8 JSR $B84D [$A6:B84D] ; "Successful grab" $A6:B716 4C 89 B8 JMP $B889 [$A6:B889] ; "Grabbing Samus, minimum Y speed, reset tail AI" ; return, no collision $A6:B719 60 RTS $A6:B71A AD AC 0F LDA $0FAC [$7E:0FAC] $A6:B71D 18 CLC $A6:B71E 6F 0C 20 7E ADC $7E200C[$7E:200C] $A6:B722 C9 00 06 CMP #$0600 $A6:B725 30 03 BMI $03 [$B72A] $A6:B727 A9 00 06 LDA #$0600 ; minimum $600 $A6:B72A 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed $A6:B72D 20 E7 B7 JSR $B7E7 [$A6:B7E7] ; "Check for tail vs solid block collision" $A6:B730 90 E7 BCC $E7 [$B719] ; if collision: $A6:B732 AF A4 20 7E LDA $7E20A4[$7E:20A4] $A6:B736 85 12 STA $12 [$7E:0012] $A6:B738 AF A6 20 7E LDA $7E20A6[$7E:20A6] $A6:B73C 18 CLC $A6:B73D 69 0C 00 ADC #$000C $A6:B740 85 14 STA $14 [$7E:0014] $A6:B742 A9 09 00 LDA #$0009 ; A = 9 (small dust cloud) $A6:B745 A0 09 E5 LDY #$E509 ;\ $A6:B748 22 97 80 86 JSL $868097[$86:8097] ;} Spawn dust cloud / explosion enemy projectile $A6:B74C A9 76 00 LDA #$0076 ;\ $A6:B74F 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 76h, sound library 2, max queued sounds allowed = 6 (quake) $A6:B753 A9 0D 00 LDA #$000D ;\ $A6:B756 8D 3E 18 STA $183E [$7E:183E] ;} Earthquake type = BG1 and BG2, 2 pixel displacement, vertical $A6:B759 A9 04 00 LDA #$0004 ;\ $A6:B75C 8D 40 18 STA $1840 [$7E:1840] ;} Earthquake timer = 4 $A6:B75F 20 A9 B8 JSR $B8A9 [$A6:B8A9] $A6:B762 20 0F B9 JSR $B90F [$A6:B90F] ; "Set speeds for tailbouncing (depends on random and speed)" $A6:B765 A2 7C D3 LDX #$D37C $A6:B768 A0 26 20 LDY #$2026 ; $7E2026: Distance from Ridley to tail parts $A6:B76B 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:X to $7E:Y $A6:B76E A9 00 0C LDA #$0C00 $A6:B771 8F 28 20 7E STA $7E2028[$7E:2028] $A6:B775 8F 3C 20 7E STA $7E203C[$7E:203C] $A6:B779 8F 50 20 7E STA $7E2050[$7E:2050] $A6:B77D 8F 64 20 7E STA $7E2064[$7E:2064] $A6:B781 8F 78 20 7E STA $7E2078[$7E:2078] $A6:B785 8F 8C 20 7E STA $7E208C[$7E:208C] $A6:B789 8F A0 20 7E STA $7E20A0[$7E:20A0] $A6:B78D A9 04 00 LDA #$0004 $A6:B790 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = during tailbounce $A6:B794 AF 0C 80 7E LDA $7E800C[$7E:800C] $A6:B798 1A INC A $A6:B799 C9 02 00 CMP #$0002 $A6:B79C 30 10 BMI $10 [$B7AE] ; every other bounce: $A6:B79E AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B7A2 3A DEC A $A6:B7A3 F0 06 BEQ $06 [$B7AB] ; if Ridley not turning: $A6:B7A5 A9 3A E7 LDA #$E73A ; "fireballing, facing left" $A6:B7A8 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list ; Ridley turning $A6:B7AB A9 00 00 LDA #$0000 $A6:B7AE 8F 0C 80 7E STA $7E800C[$7E:800C] ; increment or reset to zero $A6:B7B2 A9 B9 B7 LDA #$B7B9 ; "tailbouncing, hit ground" $A6:B7B5 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B7B8 60 RTS } ;;; $B7B9: Ridley function ;;; { ; Tailbouncing, hit ground $A6:B7B9 20 20 BD JSR $BD20 [$A6:BD20] ; "Check if Samus Y is below #$0160 (tail bounce Y position threshold?)" $A6:B7BC 90 1F BCC $1F [$B7DD] ; if Samus Y >= $160: $A6:B7BE CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:B7C1 30 1A BMI $1A [$B7DD] ; if timer not expired: $A6:B7C3 AD AC 0F LDA $0FAC [$7E:0FAC] $A6:B7C6 18 CLC $A6:B7C7 6F 0E 20 7E ADC $7E200E[$7E:200E] $A6:B7CB 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed = Y speed + tail Y acceleration $A6:B7CE 30 0C BMI $0C [$B7DC] ; if Ridley Y speed >= 0: $A6:B7D0 A9 00 00 LDA #$0000 $A6:B7D3 8D AC 0F STA $0FAC [$7E:0FAC] ; reset Y speed $A6:B7D6 A9 0E B7 LDA #$B70E ; "main tailbouncing" $A6:B7D9 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B7DC 60 RTS ; Samus Y below $160 $A6:B7DD 20 4D B8 JSR $B84D [$A6:B84D] ; "Successful grab" $A6:B7E0 A9 21 B3 LDA #$B321 ; "Get new AI script" $A6:B7E3 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B7E6 60 RTS } ;;; $B7E7: ;;; { ; Norfair Ridley ; Check for tail vs solid block collision ; Carry set if collision $A6:B7E7 AF A4 20 7E LDA $7E20A4[$7E:20A4] ; tail part tip X position $A6:B7EB AA TAX ; collision check X position $A6:B7EC AF A6 20 7E LDA $7E20A6[$7E:20A6] ; tail part tip Y position $A6:B7F0 18 CLC $A6:B7F1 69 10 00 ADC #$0010 $A6:B7F4 A8 TAY ; collision check Y position $A6:B7F5 22 F9 D4 A6 JSL $A6D4F9[$A6:D4F9] ; Check for collision with non-air block $A6:B7F9 B0 51 BCS $51 [$B84C] ; if no collision: $A6:B7FB AF 90 20 7E LDA $7E2090[$7E:2090] ; tail part 6 X position $A6:B7FF AA TAX ; collision check X position $A6:B800 AF 92 20 7E LDA $7E2092[$7E:2092] ; tail part 6 Y position $A6:B804 18 CLC $A6:B805 69 12 00 ADC #$0012 $A6:B808 A8 TAY ; collision check Y position $A6:B809 22 F9 D4 A6 JSL $A6D4F9[$A6:D4F9] ; Check for collision with non-air block $A6:B80D B0 3D BCS $3D [$B84C] ; if no collision: $A6:B80F AF 7C 20 7E LDA $7E207C[$7E:207C] ; tail part 5 X position $A6:B813 AA TAX ; collision check X position $A6:B814 AF 7E 20 7E LDA $7E207E[$7E:207E] ; tail part 5 Y position $A6:B818 18 CLC $A6:B819 69 12 00 ADC #$0012 $A6:B81C A8 TAY ; collision check Y position $A6:B81D 22 F9 D4 A6 JSL $A6D4F9[$A6:D4F9] ; Check for collision with non-air block $A6:B821 B0 29 BCS $29 [$B84C] ; if no collision: $A6:B823 AF 68 20 7E LDA $7E2068[$7E:2068] ; tail part 4 X position $A6:B827 AA TAX ; collision check X position $A6:B828 AF 6A 20 7E LDA $7E206A[$7E:206A] ; tail part 4 Y position $A6:B82C 18 CLC $A6:B82D 69 12 00 ADC #$0012 $A6:B830 A8 TAY ; collision check Y position $A6:B831 22 F9 D4 A6 JSL $A6D4F9[$A6:D4F9] ; Check for collision with non-air block $A6:B835 B0 15 BCS $15 [$B84C] ; if no collision: $A6:B837 AF 54 20 7E LDA $7E2054[$7E:2054] ; tail part 3 X position $A6:B83B AA TAX ; collision check X position $A6:B83C AF 56 20 7E LDA $7E2056[$7E:2056] ; tail part 3 Y position $A6:B840 18 CLC $A6:B841 69 12 00 ADC #$0012 $A6:B844 A8 TAY ; collision check Y position $A6:B845 22 F9 D4 A6 JSL $A6D4F9[$A6:D4F9] ; Check for collision with non-air block $A6:B849 B0 01 BCS $01 [$B84C] ; useless branch $A6:B84B EA NOP ; Wild NOP appears! $A6:B84C 60 RTS } ;;; $B84D: ;;; { ; Norfair Ridley ; Successful grab, reset tail AI $A6:B84D A9 01 00 LDA #$0001 $A6:B850 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "flinging at Samus" $A6:B854 8F 14 20 7E STA $7E2014[$7E:2014] ; maybe tail rotation speed? $A6:B858 60 RTS } ;;; $B859: ;;; { ; Attempt to grab Samus $A6:B859 20 F1 BC JSR $BCF1 [$A6:BCF1] ; "CLC if spin jump, grappling, or spin back from hurt" $A6:B85C B0 01 BCS $01 [$B85F] ; if spin, grapple or damage boost: $A6:B85E 60 RTS $A6:B85F A2 04 00 LDX #$0004 $A6:B862 A0 04 00 LDY #$0004 } ;;; $B865: ;;; { ; called by $B27F, with 4 in X/Y... $A6:B865 86 16 STX $16 [$7E:0016] $A6:B867 84 18 STY $18 [$7E:0018] $A6:B869 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:B86D 0A ASL A $A6:B86E A8 TAY $A6:B86F B9 D5 B9 LDA $B9D5,y[$A6:B9D9] $A6:B872 18 CLC $A6:B873 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:B876 85 12 STA $12 [$7E:0012] ; target X position $A6:B878 AF 3A 78 7E LDA $7E783A[$7E:783A] $A6:B87C A8 TAY $A6:B87D B9 DB B9 LDA $B9DB,y[$A6:B9DB] $A6:B880 18 CLC $A6:B881 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:B884 85 14 STA $14 [$7E:0014] ; target Y position $A6:B886 4C 29 DF JMP $DF29 [$A6:DF29] ; "Efficient collision detection for Samus and $12/$14" } ;;; $B889: ;;; { ; Norfair Ridley ; Grabbing Samus, minimum Y speed, reset tail AI $A6:B889 AD AC 0F LDA $0FAC [$7E:0FAC] $A6:B88C 30 04 BMI $04 [$B892] $A6:B88E 49 FF FF EOR #$FFFF $A6:B891 1A INC A $A6:B892 C9 00 FE CMP #$FE00 $A6:B895 30 03 BMI $03 [$B89A] $A6:B897 A9 00 FE LDA #$FE00 ; minimum $FE00 (-$200) $A6:B89A 8D AC 0F STA $0FAC [$7E:0FAC] $A6:B89D 20 4D B8 JSR $B84D [$A6:B84D] ; "Successful grab, reset tail AI" $A6:B8A0 A9 8F BB LDA #$BB8F ; "Ridley in position to grab Samus, no powerbombs" $A6:B8A3 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:B8A6 4C 8F BB JMP $BB8F [$A6:BB8F] } ;;; $B8A9: ;;; { ; check for turnaround during tailbounce, ~1/48 chance to change direction ; something about tailbounce X direction/speed, random chance (~1/48) to change direction $A6:B8A9 AD AA 0F LDA $0FAA [$7E:0FAA] $A6:B8AC D0 0F BNE $0F [$B8BD] ; if X speed = 0: $A6:B8AE A9 C0 00 LDA #$00C0 $A6:B8B1 2C 79 0F BIT $0F79 [$7E:0F79] ; low byte of Ridley X position $A6:B8B4 10 04 BPL $04 [$B8BA] $A6:B8B6 49 FF FF EOR #$FFFF $A6:B8B9 1A INC A $A6:B8BA 8D AA 0F STA $0FAA [$7E:0FAA] $A6:B8BD AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:B8C0 38 SEC $A6:B8C1 ED F6 0A SBC $0AF6 [$7E:0AF6] ; Samus X position $A6:B8C4 4D AA 0F EOR $0FAA [$7E:0FAA] $A6:B8C7 30 22 BMI $22 [$B8EB] $A6:B8C9 AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:B8CC CF 04 80 7E CMP $7E8004[$7E:8004] $A6:B8D0 30 31 BMI $31 [$B903] ; if Ridley not past left boundary: $A6:B8D2 CF 06 80 7E CMP $7E8006[$7E:8006] $A6:B8D6 10 31 BPL $31 [$B909] ; if Ridley not past right boundary: $A6:B8D8 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B8DB C9 55 05 CMP #$0555 $A6:B8DE 90 0A BCC $0A [$B8EA] ; if ~1/48 chance: return ; BRANCH_CHANGE_DIRECTION $A6:B8E0 AD AA 0F LDA $0FAA [$7E:0FAA] $A6:B8E3 49 FF FF EOR #$FFFF $A6:B8E6 1A INC A $A6:B8E7 8D AA 0F STA $0FAA [$7E:0FAA] $A6:B8EA 60 RTS $A6:B8EB AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:B8EE CF 04 80 7E CMP $7E8004[$7E:8004] $A6:B8F2 30 0F BMI $0F [$B903] ; if Ridley not past left boundary: $A6:B8F4 CF 06 80 7E CMP $7E8006[$7E:8006] $A6:B8F8 10 0F BPL $0F [$B909] ; if Ridley not past right boundary: $A6:B8FA AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B8FD C9 55 05 CMP #$0555 $A6:B900 90 DE BCC $DE [$B8E0] ; if ~1/48 chance: goto BRANCH_CHANGE_DIRECTION $A6:B902 60 RTS ; crossed left boundary $A6:B903 AD AA 0F LDA $0FAA [$7E:0FAA] $A6:B906 30 D8 BMI $D8 [$B8E0] $A6:B908 60 RTS ; crossed right boundary $A6:B909 AD AA 0F LDA $0FAA [$7E:0FAA] $A6:B90C 10 D2 BPL $D2 [$B8E0] $A6:B90E 60 RTS } ;;; $B90F: ;;; { ; Set speeds for tailbouncing (depends on random and speed) $A6:B90F AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:B912 29 03 00 AND #$0003 $A6:B915 0A ASL A $A6:B916 A8 TAY $A6:B917 B9 65 B9 LDA $B965,y[$A6:B96B] $A6:B91A 85 12 STA $12 [$7E:0012] ; $12 = X speed table pointer $A6:B91C B9 6D B9 LDA $B96D,y[$A6:B973] $A6:B91F 85 14 STA $14 [$7E:0014] ; $14 = Y speed table pointer $A6:B921 AF 24 78 7E LDA $7E7824[$7E:7824] ; Ridley speedup $A6:B925 18 CLC $A6:B926 69 02 00 ADC #$0002 $A6:B929 0A ASL A $A6:B92A A8 TAY $A6:B92B B9 4D B9 LDA $B94D,y[$A6:B951] $A6:B92E 8F 0E 20 7E STA $7E200E[$7E:200E] ; tail Y speed? + $7E200E = new Y speed $A6:B932 B9 59 B9 LDA $B959,y[$A6:B95D] $A6:B935 8F 0C 20 7E STA $7E200C[$7E:200C] $A6:B939 B1 14 LDA ($14),y[$A6:B9CD] $A6:B93B 8D AC 0F STA $0FAC [$7E:0FAC] ; Y speed $A6:B93E B1 12 LDA ($12),y[$A6:B99D] $A6:B940 AE AA 0F LDX $0FAA [$7E:0FAA] $A6:B943 10 04 BPL $04 [$B949] $A6:B945 49 FF FF EOR #$FFFF $A6:B948 1A INC A $A6:B949 8D AA 0F STA $0FAA [$7E:0FAA] ; X speed $A6:B94C 60 RTS ; tailbouncing accel/delays?/thresholds?, indexed by Ridley speedup ($7E7824) $A6:B94D dw 000A, 0010, 0020, 0030, 0040, 0050 ; $7E200E, Y acceleration $A6:B959 dw 0010, 0020, 0040, 0080, 0400, 0500 ; $7E200C ; speed table pointers, indexed randomly $A6:B965 dw B975, B981, B98D, B999 ; X speed $A6:B96D dw B9A5, B9B1, B9BD, B9C9 ; Y speed ; X speeds $A6:B975 dw 0058,0070,00A0,00A8,00B0,00B8 ; slow... $A6:B981 dw 0078,0090,00C0,00C8,00D0,00D8 $A6:B98D dw 0098,00B0,00E0,00E8,00F0,00F8 $A6:B999 dw 00B8,00D0,0100,0108,0110,0118 ; fast ; Y speeds $A6:B9A5 dw FE60,FDE0,FCE0,FC20,FA80,F980 ; slow... $A6:B9B1 dw FE00,FD80,FC80,FBC0,FA60,F960 $A6:B9BD dw FDE0,FD60,FC60,FB80,FA40,F940 $A6:B9C9 dw FDC0,FD40,FC40,FB60,FA20,F920 ; fast } ;;; $B9D5: ;;; { ; displacement for holding Samus? ; indexed by Ridley facing direction: left, turning, right $A6:B9D5 dw 000C, 0000, FFF4 ; X ; indexed by $7E783A, which is always 0 in Norfair and never read in Ceres $A6:B9DB dw 0023, 002E, 0038 ; Y } ;;; $B9E1: ;;; { ; If holding Samus, move Samus to within Ridley's claws $A6:B9E1 AF 28 78 7E LDA $7E7828[$7E:7828] $A6:B9E5 F0 1F BEQ $1F [$BA06] $A6:B9E7 85 12 STA $12 [$7E:0012] $A6:B9E9 10 04 BPL $04 [$B9EF] $A6:B9EB 49 FF FF EOR #$FFFF $A6:B9EE 1A INC A $A6:B9EF 38 SEC $A6:B9F0 E9 04 00 SBC #$0004 $A6:B9F3 10 05 BPL $05 [$B9FA] $A6:B9F5 A9 00 00 LDA #$0000 $A6:B9F8 80 08 BRA $08 [$BA02] $A6:B9FA 24 12 BIT $12 [$7E:0012] $A6:B9FC 10 04 BPL $04 [$BA02] $A6:B9FE 49 FF FF EOR #$FFFF $A6:BA01 1A INC A $A6:BA02 8F 28 78 7E STA $7E7828[$7E:7828] ; no Samus X displacement $A6:BA06 AF 2A 78 7E LDA $7E782A[$7E:782A] $A6:BA0A F0 1F BEQ $1F [$BA2B] $A6:BA0C 85 12 STA $12 [$7E:0012] $A6:BA0E 10 04 BPL $04 [$BA14] $A6:BA10 49 FF FF EOR #$FFFF $A6:BA13 1A INC A $A6:BA14 38 SEC $A6:BA15 E9 04 00 SBC #$0004 $A6:BA18 10 05 BPL $05 [$BA1F] $A6:BA1A A9 00 00 LDA #$0000 $A6:BA1D 80 08 BRA $08 [$BA27] $A6:BA1F 24 12 BIT $12 [$7E:0012] $A6:BA21 10 04 BPL $04 [$BA27] $A6:BA23 49 FF FF EOR #$FFFF $A6:BA26 1A INC A $A6:BA27 8F 2A 78 7E STA $7E782A[$7E:782A] ; no Samus Y displacement $A6:BA2B AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BA2F 0A ASL A $A6:BA30 A8 TAY $A6:BA31 B9 D5 B9 LDA $B9D5,y[$A6:B9D5] $A6:BA34 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BA37 18 CLC $A6:BA38 6F 28 78 7E ADC $7E7828[$7E:7828] $A6:BA3C 8D F6 0A STA $0AF6 [$7E:0AF6] ; Samus X position $A6:BA3F AF 3A 78 7E LDA $7E783A[$7E:783A] $A6:BA43 A8 TAY $A6:BA44 B9 DB B9 LDA $B9DB,y[$A6:B9DB] $A6:BA47 18 CLC $A6:BA48 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BA4B 18 CLC $A6:BA4C 6F 2A 78 7E ADC $7E782A[$7E:782A] $A6:BA50 8D FA 0A STA $0AFA [$7E:0AFA] ; Samus Y position $A6:BA53 60 RTS } ;;; $BA54: ;;; { ; Set displacement for Ridley grabbing Samus $A6:BA54 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BA58 0A ASL A $A6:BA59 A8 TAY $A6:BA5A B9 D5 B9 LDA $B9D5,y[$A6:B9D5] $A6:BA5D 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BA60 38 SEC $A6:BA61 ED F6 0A SBC $0AF6 [$7E:0AF6] ; Samus X position $A6:BA64 49 FF FF EOR #$FFFF $A6:BA67 1A INC A $A6:BA68 8F 28 78 7E STA $7E7828[$7E:7828] $A6:BA6C AF 3A 78 7E LDA $7E783A[$7E:783A] $A6:BA70 A8 TAY $A6:BA71 B9 DB B9 LDA $B9DB,y[$A6:B9DB] $A6:BA74 18 CLC $A6:BA75 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BA78 38 SEC $A6:BA79 ED FA 0A SBC $0AFA [$7E:0AFA] ; Samus Y position $A6:BA7C 49 FF FF EOR #$FFFF $A6:BA7F 1A INC A $A6:BA80 8F 2A 78 7E STA $7E782A[$7E:782A] $A6:BA84 60 RTS } ;;; $BA85: ;;; { ; Check if Ridley is ready to explode $A6:BA85 AF 0A 80 7E LDA $7E800A[$7E:800A] $A6:BA89 C9 0A 00 CMP #$000A $A6:BA8C 30 0D BMI $0D [$BA9B] ; if final grab attempts >= $A $A6:BA8E 22 B7 DF A6 JSL $A6DFB7[$A6:DFB7] ; "Set 7802 to dead, disable Samus/Ridley interaction, next AI script is C538" $A6:BA92 A9 3E C5 LDA #$C53E ; Final roar $A6:BA95 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BA98 4C 3E C5 JMP $C53E [$A6:C53E] ; not dead $A6:BA9B AD EE 0C LDA $0CEE [$7E:0CEE] $A6:BA9E F0 09 BEQ $09 [$BAA9] ; if power bomb active: $A6:BAA0 A9 4E BD LDA #$BD4E ; "dodging power bomb, may be holding Samus" $A6:BAA3 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BAA6 4C 4E BD JMP $BD4E [$A6:BD4E] ; no power bomb $A6:BAA9 A9 EC B3 LDA #$B3EC $A6:BAAC 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BAAF A9 01 00 LDA #$0001 $A6:BAB2 8F 04 20 7E STA $7E2004[$7E:2004] $A6:BAB6 60 RTS } ;;; $BAB7: Ridley function ;;; { ; Check to do Deathswoop/Powerbomb dodge/Move-to-Center, or attempt to ram/grab Samus ; Deathswoop/Powerbomb dodge/Move if: ; Samus is spinjumping, Ridley has collided with a wall, Samus is behind or above Ridley $A6:BAB7 20 F1 BC JSR $BCF1 [$A6:BCF1] ; "CLC if spin jump, grappling, or spin back from hurt" $A6:BABA 90 C9 BCC $C9 [$BA85] $A6:BABC AF 3E 78 7E LDA $7E783E[$7E:783E] $A6:BAC0 D0 C3 BNE $C3 [$BA85] ; if no boundary collision last frame: $A6:BAC2 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BAC6 0A ASL A $A6:BAC7 A8 TAY $A6:BAC8 B9 48 BB LDA $BB48,y[$A6:BB4C] $A6:BACB 85 12 STA $12 [$7E:0012] $A6:BACD AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:BAD0 38 SEC $A6:BAD1 ED F6 0A SBC $0AF6 [$7E:0AF6] ; Samus X position $A6:BAD4 85 14 STA $14 [$7E:0014] $A6:BAD6 45 12 EOR $12 [$7E:0012] $A6:BAD8 10 0D BPL $0D [$BAE7] $A6:BADA A5 14 LDA $14 [$7E:0014] $A6:BADC 10 04 BPL $04 [$BAE2] $A6:BADE 49 FF FF EOR #$FFFF $A6:BAE1 1A INC A $A6:BAE2 C9 20 00 CMP #$0020 $A6:BAE5 10 9E BPL $9E [$BA85] $A6:BAE7 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:BAEA 18 CLC $A6:BAEB 69 23 00 ADC #$0023 $A6:BAEE 38 SEC $A6:BAEF ED FA 0A SBC $0AFA [$7E:0AFA] ; Samus Y position $A6:BAF2 10 91 BPL $91 [$BA85] $A6:BAF4 A2 F0 FF LDX #$FFF0 $A6:BAF7 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BAFB F0 03 BEQ $03 [$BB00] ; if Ridley direction != left: $A6:BAFD A2 10 00 LDX #$0010 $A6:BB00 8A TXA $A6:BB01 18 CLC $A6:BB02 6D F6 0A ADC $0AF6 [$7E:0AF6] ; Samus X position $A6:BB05 85 12 STA $12 [$7E:0012] $A6:BB07 AD FA 0A LDA $0AFA [$7E:0AFA] ; Samus Y position $A6:BB0A 18 CLC $A6:BB0B 69 FC FF ADC #$FFFC $A6:BB0E 85 14 STA $14 [$7E:0014] $A6:BB10 A2 00 00 LDX #$0000 ; target X position $A6:BB13 AF 24 78 7E LDA $7E7824[$7E:7824] ; Ridley speedup $A6:BB17 0A ASL A $A6:BB18 A8 TAY $A6:BB19 B9 4E BB LDA $BB4E,y[$A6:BB4E] $A6:BB1C A8 TAY ; target Y position $A6:BB1D 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:BB20 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BB24 0A ASL A $A6:BB25 A8 TAY $A6:BB26 B9 D5 B9 LDA $B9D5,y[$A6:B9D9] $A6:BB29 18 CLC $A6:BB2A 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BB2D 85 12 STA $12 [$7E:0012] ; target X position $A6:BB2F A9 23 00 LDA #$0023 $A6:BB32 18 CLC $A6:BB33 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BB36 85 14 STA $14 [$7E:0014] ; target Y position $A6:BB38 A9 08 00 LDA #$0008 $A6:BB3B 85 16 STA $16 [$7E:0016] ; target X radius = 8 $A6:BB3D A9 0C 00 LDA #$000C $A6:BB40 85 18 STA $18 [$7E:0018] ; target Y radius = $C $A6:BB42 20 29 DF JSR $DF29 [$A6:DF29] ; "Efficient collision detection for Samus and $12/$14" $A6:BB45 B0 0F BCS $0F [$BB56] ; if no collision: $A6:BB47 60 RTS ; indexed by Ridley facing direction ; left, turning, right $A6:BB48 dw 0000, 0000, 8000 ; acceleration divisor index $A6:BB4E dw 0001, 0003, 0007, 000A ; collision $A6:BB56 AD AC 0F LDA $0FAC [$7E:0FAC] $A6:BB59 49 FF FF EOR #$FFFF $A6:BB5C 1A INC A $A6:BB5D 8D AC 0F STA $0FAC [$7E:0FAC] ; invert Y speed $A6:BB60 AD 8C 0F LDA $0F8C [$7E:0F8C] $A6:BB63 F0 14 BEQ $14 [$BB79] ; if Ridley health != 0: $A6:BB65 AD EE 0C LDA $0CEE [$7E:0CEE] ; >_<; $A6:BB68 AD EE 0C LDA $0CEE [$7E:0CEE] $A6:BB6B F0 22 BEQ $22 [$BB8F] ; if power bomb active: $A6:BB6D 20 68 BC JSR $BC68 [$A6:BC68] ; "Grab Samus" $A6:BB70 A9 4E BD LDA #$BD4E $A6:BB73 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BB76 4C 4E BD JMP $BD4E [$A6:BD4E] ; dead $A6:BB79 AF 36 78 7E LDA $7E7836[$7E:7836] $A6:BB7D D0 03 BNE $03 [$BB82] ; if not holding Samus: $A6:BB7F 20 68 BC JSR $BC68 [$A6:BC68] ; "Grab Samus" $A6:BB82 22 B7 DF A6 JSL $A6DFB7[$A6:DFB7] ; "Set 7802 to dead, disable Samus/Ridley interaction, next AI script is C538" $A6:BB86 A9 38 C5 LDA #$C538 ; "Move Ridley toward death spot" $A6:BB89 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BB8C 4C 38 C5 JMP $C538 [$A6:C538] } ;;; $BB8F: Ridley function ;;; { ; Ridley in position to grab Samus, no powerbombs $A6:BB8F AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BB93 0A ASL A $A6:BB94 A8 TAY $A6:BB95 B9 EB BB LDA $BBEB,y[$A6:BBEB] $A6:BB98 8F 2E 78 7E STA $7E782E[$7E:782E] ; target X position while holding Samus $A6:BB9C AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:BB9F 18 CLC $A6:BBA0 69 C0 FF ADC #$FFC0 $A6:BBA3 C9 00 01 CMP #$0100 $A6:BBA6 10 03 BPL $03 [$BBAB] $A6:BBA8 A9 00 01 LDA #$0100 ; minimum $100 $A6:BBAB 8F 30 78 7E STA $7E7830[$7E:7830] $A6:BBAF AF 36 78 7E LDA $7E7836[$7E:7836] $A6:BBB3 D0 03 BNE $03 [$BBB8] ; if not holding Samus: $A6:BBB5 20 68 BC JSR $BC68 [$A6:BC68] ; "Grab Samus" $A6:BBB8 A9 C4 BB LDA #$BBC4 $A6:BBBB 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BBBE A9 20 00 LDA #$0020 $A6:BBC1 8D B2 0F STA $0FB2 [$7E:0FB2] } ;;; $BBC4: Ridley function ;;; { ; Ridley is holding Samus, move towards target position then go to next script $A6:BBC4 AF 2E 78 7E LDA $7E782E[$7E:782E] $A6:BBC8 85 12 STA $12 [$7E:0012] ; target X position while holding Samus $A6:BBCA AF 30 78 7E LDA $7E7830[$7E:7830] $A6:BBCE 85 14 STA $14 [$7E:0014] $A6:BBD0 A2 00 00 LDX #$0000 $A6:BBD3 A0 00 00 LDY #$0000 $A6:BBD6 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:BBD9 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:BBDC 10 0C BPL $0C [$BBEA] $A6:BBDE A9 F1 BB LDA #$BBF1 $A6:BBE1 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BBE4 A9 20 00 LDA #$0020 $A6:BBE7 8D B2 0F STA $0FB2 [$7E:0FB2] $A6:BBEA 60 RTS ; target X when holding Samus $A6:BBEB dw 0040, 0000, 00D0 } ;;; $BBF1: Ridley function ;;; { ; Drop Samus $A6:BBF1 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:BBF4 30 14 BMI $14 [$BC0A] ; if timer >= 0: $A6:BBF6 AF 2E 78 7E LDA $7E782E[$7E:782E] $A6:BBFA 85 12 STA $12 [$7E:0012] ; target X position while holding Samus $A6:BBFC A9 00 01 LDA #$0100 $A6:BBFF 85 14 STA $14 [$7E:0014] ; target Y position while holding Samus = $100 $A6:BC01 A2 00 00 LDX #$0000 ; enemy index = 0, Ridley $A6:BC04 A0 00 00 LDY #$0000 ; acceleration divisor index $A6:BC07 4C 23 D5 JMP $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" ; timer expired, release Samus $A6:BC0A A9 08 00 LDA #$0008 $A6:BC0D 8F 1E 20 7E STA $7E201E[$7E:201E] $A6:BC11 A9 F0 00 LDA #$00F0 $A6:BC14 8F 12 20 7E STA $7E2012[$7E:2012] $A6:BC18 20 84 BC JSR $BC84 [$A6:BC84] ; "Release Samus" $A6:BC1B A9 2E BC LDA #$BC2E ; "fall back into position after dropping Samus" $A6:BC1E 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BC21 A9 40 00 LDA #$0040 $A6:BC24 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $40 $A6:BC27 60 RTS ; Unused $A6:BC28 dw 00B0, 0000, 0050 } ;;; $BC2E: Ridley function ;;; { ; Short time after dropping Samus, before returning to B321 ; "fall back into position after dropping Samus" $A6:BC2E CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:BC31 30 1A BMI $1A [$BC4D] ; if timer >= 0: $A6:BC33 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:BC37 0A ASL A $A6:BC38 A8 TAY $A6:BC39 B9 62 BC LDA $BC62,y[$A6:BC62] $A6:BC3C 85 12 STA $12 [$7E:0012] $A6:BC3E A9 E0 00 LDA #$00E0 $A6:BC41 85 14 STA $14 [$7E:0014] $A6:BC43 A2 00 00 LDX #$0000 $A6:BC46 A0 00 00 LDY #$0000 $A6:BC49 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:BC4C 60 RTS ; timer expired $A6:BC4D A9 10 00 LDA #$0010 $A6:BC50 8F 1E 20 7E STA $7E201E[$7E:201E] $A6:BC54 A9 F0 00 LDA #$00F0 $A6:BC57 8F 12 20 7E STA $7E2012[$7E:2012] $A6:BC5B A9 21 B3 LDA #$B321 ; "Get new AI script" $A6:BC5E 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BC61 60 RTS ; target X positions ; indexed by facing direction: left, turning, right $A6:BC62 dw 00B0, 0000, 0050 } ;;; $BC68: ;;; { ; Grab Samus $A6:BC68 20 54 BA JSR $BA54 [$A6:BA54] ; "Set displacement for Ridley grabbing Samus" $A6:BC6B AD 86 0F LDA $0F86 [$7E:0F86] $A6:BC6E 09 00 04 ORA #$0400 $A6:BC71 8D 86 0F STA $0F86 [$7E:0F86] ; set as intangible $A6:BC74 A9 01 00 LDA #$0001 $A6:BC77 8F 36 78 7E STA $7E7836[$7E:7836] ; holding Samus flag $A6:BC7B 3A DEC A ;\ $A6:BC7C 22 84 F0 90 JSL $90F084[$90:F084] ;} Run Samus command - lock Samus $A6:BC80 38 SEC $A6:BC81 4C 8B DA JMP $DA8B [$A6:DA8B] ; "graphics transfer: Ridley claws" } ;;; $BC84: ;;; { ; Release Samus $A6:BC84 A9 01 00 LDA #$0001 $A6:BC87 8F 04 20 7E STA $7E2004[$7E:2004] ; trigger tail fling $A6:BC8B 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "flinging at Samus" $A6:BC8F AF 02 78 7E LDA $7E7802[$7E:7802] $A6:BC93 30 0F BMI $0F [$BCA4] ; if Ridley is alive: $A6:BC95 20 F1 BC JSR $BCF1 [$A6:BCF1] ; "CLC if spin jump, grappling, or spin back from hurt" $A6:BC98 A9 06 00 LDA #$0006 $A6:BC9B 70 03 BVS $03 [$BCA0] $A6:BC9D A9 0A 00 LDA #$000A $A6:BCA0 8F 3C 78 7E STA $7E783C[$7E:783C] ; grab cooldown timer ; Ridley is dead $A6:BCA4 A9 00 00 LDA #$0000 $A6:BCA7 8F 36 78 7E STA $7E7836[$7E:7836] ; not holding Samus $A6:BCAB 1A INC A ;\ $A6:BCAC 22 84 F0 90 JSL $90F084[$90:F084] ;} Run Samus command - unlock Samus $A6:BCB0 18 CLC $A6:BCB1 4C 8B DA JMP $DA8B [$A6:DA8B] ; "graphics transfer: Ridley claws" } ;;; $BCB4: ;;; { ; Handles Enemy/Samus interaction bit ; Norfair Ridley $A6:BCB4 AF 02 78 7E LDA $7E7802[$7E:7802] $A6:BCB8 30 36 BMI $36 [$BCF0] ; if Ridley is dead: return $A6:BCBA F0 18 BEQ $18 [$BCD4] ; if Ridley is active: $A6:BCBC 20 7A DE JSR $DE7A [$A6:DE7A] ; "Checks if Ridley is on screen" $A6:BCBF 90 0A BCC $0A [$BCCB] ; if Ridley is off-screen: $A6:BCC1 AD 86 0F LDA $0F86 [$7E:0F86] $A6:BCC4 09 00 04 ORA #$0400 $A6:BCC7 8D 86 0F STA $0F86 [$7E:0F86] ; set Ridley as intangible $A6:BCCA 60 RTS ; on screen $A6:BCCB AD 86 0F LDA $0F86 [$7E:0F86] $A6:BCCE 29 FF FB AND #$FBFF $A6:BCD1 8D 86 0F STA $0F86 [$7E:0F86] ; set Ridley as tangible ; Ridley inactive $A6:BCD4 AF 3C 78 7E LDA $7E783C[$7E:783C] $A6:BCD8 F0 16 BEQ $16 [$BCF0] ; if grab cooldown timer != 0: $A6:BCDA 3A DEC A $A6:BCDB 8F 3C 78 7E STA $7E783C[$7E:783C] ; grab cooldown timer =- 1 $A6:BCDF D0 0F BNE $0F [$BCF0] ; if still != 0: return $A6:BCE1 AF 02 78 7E LDA $7E7802[$7E:7802] $A6:BCE5 30 09 BMI $09 [$BCF0] ; if Ridley not dead: $A6:BCE7 AD 86 0F LDA $0F86 [$7E:0F86] $A6:BCEA 29 FF FB AND #$FBFF $A6:BCED 8D 86 0F STA $0F86 [$7E:0F86] ; set Ridley as tangible $A6:BCF0 60 RTS } ;;; $BCF1: ;;; { ; CLC if spin jump, grappling, or spin back from hurt $A6:BCF1 AD 1F 0A LDA $0A1F [$7E:0A1F] $A6:BCF4 29 FF 00 AND #$00FF $A6:BCF7 DA PHX $A6:BCF8 AA TAX $A6:BCF9 3C 03 BD BIT $BD03,x[$A6:BD05] $A6:BCFC 30 03 BMI $03 [$BD01] $A6:BCFE FA PLX $A6:BCFF 18 CLC $A6:BD00 60 RTS $A6:BD01 FA PLX $A6:BD02 38 SEC $A6:BD03 60 RTS ; indexed by movement type ; minus 1 trick to get target into high byte $A6:BD04 db 80, ; 0: Standing 80, ; 1: Running 80, ; 2: Normal jumping 00, ; 3: Spin jumping FF, ; 4: Morph ball - on ground 80, ; 5: Crouching 80, ; 6: Falling FF, ; 7: Unused FF, ; 8: Morph ball - falling FF, ; 9: Unused 80, ; Ah: Knockback / crystal flash ending 00, ; Bh: Unused 00, ; Ch: Unused 80, ; Dh: Unused 80, ; Eh: Turning around - on ground 80, ; Fh: Crouching/standing/morphing/unmorphing transition 80, ; 10h: Moonwalking FF, ; 11h: Spring ball - on ground FF, ; 12h: Spring ball - in air FF, ; 13h: Spring ball - falling 80, ; 14h: Wall jumping 80, ; 15h: Ran into a wall 00, ; 16h: Grappling 80, ; 17h: Turning around - jumping 80, ; 18h: Turning around - falling 00, ; 19h: Damage boost 00, ; 1Ah: Grabbed by Draygon 80 ; 1Bh: Shinespark / crystal flash / drained by metroid / damaged by MB's attacks } ;;; $BD20: ;;; { ; Check if Samus Y is below #$0160 (tail bounce Y position threshold?) $A6:BD20 AD FA 0A LDA $0AFA [$7E:0AFA] $A6:BD23 C9 60 01 CMP #$0160 $A6:BD26 10 02 BPL $02 [$BD2A] ; if Samus Y position < $160: $A6:BD28 18 CLC $A6:BD29 60 RTS $A6:BD2A 38 SEC $A6:BD2B 60 RTS } ;;; $BD2C: ;;; { ; Power Bomb Check/Reaction ; Norfair Ridley $A6:BD2C AF 02 78 7E LDA $7E7802[$7E:7802] $A6:BD30 30 1B BMI $1B [$BD4D] ; if Ridley is dead: return $A6:BD32 F0 19 BEQ $19 [$BD4D] ; if Ridley is active: $A6:BD34 C9 02 00 CMP #$0002 $A6:BD37 F0 14 BEQ $14 [$BD4D] ; if not evading power bomb: $A6:BD39 AD EE 0C LDA $0CEE [$7E:0CEE] $A6:BD3C F0 0F BEQ $0F [$BD4D] ; if power bomb active: $A6:BD3E AF 36 78 7E LDA $7E7836[$7E:7836] $A6:BD42 D0 09 BNE $09 [$BD4D] ; if Ridley is not holding Samus: $A6:BD44 20 4D B8 JSR $B84D [$A6:B84D] $A6:BD47 A0 B7 BA LDY #$BAB7 ; "Check to do Deathswoop/Powerbomb dodge/Move-to-Center, or attempt to ram/grab Samus" $A6:BD4A 8C A8 0F STY $0FA8 [$7E:0FA8] ; next function pointer $A6:BD4D 60 RTS } ;;; $BD4E: Ridley function ;;; { ; Ridley is dodging a power bomb (may be holding Samus) $A6:BD4E AD EE 0C LDA $0CEE [$7E:0CEE] $A6:BD51 F0 30 BEQ $30 [$BD83] ; if power bomb active: $A6:BD53 A9 02 00 LDA #$0002 $A6:BD56 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley evading power bomb $A6:BD5A A0 50 00 LDY #$0050 $A6:BD5D AD E2 0C LDA $0CE2 [$7E:0CE2] $A6:BD60 C9 80 00 CMP #$0080 $A6:BD63 10 03 BPL $03 [$BD68] ; if power bomb X < $80: $A6:BD65 A0 C0 00 LDY #$00C0 $A6:BD68 84 12 STY $12 [$7E:0012] ; target X $A6:BD6A A0 C0 00 LDY #$00C0 $A6:BD6D AD E4 0C LDA $0CE4 [$7E:0CE4] $A6:BD70 C9 00 01 CMP #$0100 $A6:BD73 10 03 BPL $03 [$BD78] ; if power bomb Y < $100: $A6:BD75 A0 80 01 LDY #$0180 $A6:BD78 84 14 STY $14 [$7E:0014] ; target Y $A6:BD7A A2 00 00 LDX #$0000 ; X = enemy index 0, Ridley $A6:BD7D 20 2E B4 JSR $B42E [$A6:B42E] ; "Y = 4, 8, A, or C, depending on general speed byte" $A6:BD80 4C 23 D5 JMP $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" ; power bomb active $A6:BD83 A9 01 00 LDA #$0001 $A6:BD86 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley active (no longer evading power bomb) $A6:BD8A A0 21 B3 LDY #$B321 ; "Get new AI script" $A6:BD8D AF 36 78 7E LDA $7E7836[$7E:7836] $A6:BD91 F0 03 BEQ $03 [$BD96] ; if Ridley holding Samus: $A6:BD93 A0 8F BB LDY #$BB8F ; "Ridley in position to grab Samus, no powerbombs" $A6:BD96 8C A8 0F STY $0FA8 [$7E:0FA8] ; next function pointer $A6:BD99 60 RTS } ;;; $BD9A: Ridley function ;;; { ; Ceres Ridley initialise baby metroid drop $A6:BD9A A9 C0 00 LDA #$00C0 $A6:BD9D 85 12 STA $12 [$7E:0012] ; target X position = $C0 $A6:BD9F A9 80 00 LDA #$0080 $A6:BDA2 85 14 STA $14 [$7E:0014] ; target X position = $80 $A6:BDA4 A2 00 00 LDX #$0000 ; enemy index $A6:BDA7 A0 01 00 LDY #$0001 ; divisor index $A6:BDAA 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:BDAD AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:BDB0 C9 C0 00 CMP #$00C0 $A6:BDB3 30 06 BMI $06 [$BDBB] ; if Ridley X position >= $C0: $A6:BDB5 A9 BC BD LDA #$BDBC ; "drop Baby Metroid capsule" $A6:BDB8 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BDBB 60 RTS } ;;; $BDBC: Ridley function ;;; { ; Ceres Ridley baby metroid drop $A6:BDBC A9 40 FF LDA #$FF40 $A6:BDBF 8F 00 80 7E STA $7E8000[$7E:8000] ; top boundary = $FF40 $A6:BDC3 A9 C0 00 LDA #$00C0 $A6:BDC6 85 12 STA $12 [$7E:0012] ; target X position = $C0 $A6:BDC8 A9 80 FF LDA #$FF80 $A6:BDCB 85 14 STA $14 [$7E:0014] ; target X position = $80 $A6:BDCD A2 00 00 LDX #$0000 ; enemy index $A6:BDD0 A0 01 00 LDY #$0001 ; divisor index $A6:BDD3 20 2F D6 JSR $D62F [$A6:D62F] ; "adjust X/Y speeds" $A6:BDD6 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:BDD9 C9 20 00 CMP #$0020 $A6:BDDC 10 63 BPL $63 [$BE41] ; if Ridley Y position < $20: $A6:BDDE A9 CA BE LDA #$BECA ; "Initialise baby metroid falling to ground" $A6:BDE1 8F 00 88 7E STA $7E8800[$7E:8800] ; Baby Metroid function pointer $A6:BDE5 A9 F2 BD LDA #$BDF2 ; "delay picking up dropped Baby Metroid capsule" $A6:BDE8 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BDEB A9 15 00 LDA #$0015 $A6:BDEE 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $15 $A6:BDF1 60 RTS } ;;; $BDF2: Ridley function ;;; { ; Ceres Ridley pickup baby metroid delay $A6:BDF2 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:BDF5 10 4A BPL $4A [$BE41] ; if timer < 0: $A6:BDF7 A9 58 E6 LDA #$E658 ; "facing left" $A6:BDFA 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:BDFD A9 03 BE LDA #$BE03 ; "pickup dropped Baby Metroid capsule" $A6:BE00 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer } ;;; $BE03: Ridley function ;;; { ; Ceres Ridley baby metroid pickup $A6:BE03 AF 04 88 7E LDA $7E8804[$7E:8804] $A6:BE07 18 CLC $A6:BE08 69 F6 FF ADC #$FFF6 $A6:BE0B 85 12 STA $12 [$7E:0012] ; target X position $A6:BE0D AF 08 88 7E LDA $7E8808[$7E:8808] $A6:BE11 18 CLC $A6:BE12 69 C8 FF ADC #$FFC8 $A6:BE15 85 14 STA $14 [$7E:0014] ; target Y position $A6:BE17 A2 00 00 LDX #$0000 ; X = enemy index 0, Ridley $A6:BE1A A0 0C 00 LDY #$000C ; Y = acceleration divisor index = $C $A6:BE1D 20 23 D5 JSR $D523 [$A6:D523] ; "Accelerates Ridley towards the desired X/Y" $A6:BE20 A9 0E 00 LDA #$000E $A6:BE23 18 CLC $A6:BE24 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BE27 85 12 STA $12 [$7E:0012] $A6:BE29 A9 42 00 LDA #$0042 $A6:BE2C 18 CLC $A6:BE2D 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BE30 85 14 STA $14 [$7E:0014] $A6:BE32 A9 04 00 LDA #$0004 $A6:BE35 85 16 STA $16 [$7E:0016] $A6:BE37 A9 04 00 LDA #$0004 $A6:BE3A 85 18 STA $18 [$7E:0018] $A6:BE3C 20 61 BE JSR $BE61 [$A6:BE61] ; "SEC when Ridley is within range to pickup Baby Metroid" $A6:BE3F B0 01 BCS $01 [$BE42] ; if not within range: $A6:BE41 60 RTS ; in range to pickup Baby Metroid capsule $A6:BE42 A9 01 00 LDA #$0001 $A6:BE45 8F 36 78 7E STA $7E7836[$7E:7836] ; holding Samus $A6:BE49 38 SEC ; holding $A6:BE4A 20 8B DA JSR $DA8B [$A6:DA8B] ; "graphics transfer: Ridley claws" $A6:BE4D A9 00 FE LDA #$FE00 $A6:BE50 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed = $FE00 $A6:BE53 A9 B3 BE LDA #$BEB3 ; Update Baby Metroid capsule position while carried in feet $A6:BE56 8F 00 88 7E STA $7E8800[$7E:8800] ; Baby Metroid function pointer $A6:BE5A A9 71 A9 LDA #$A971 ; "Fly away after Samus has low energy or after he picks up Baby Metroid" $A6:BE5D 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:BE60 60 RTS } ;;; $BE61: ;;; { ; SEC when Ridley is within range to pickup Baby Metroid $A6:BE61 AF 04 88 7E LDA $7E8804[$7E:8804] ; Baby Metroid X position $A6:BE65 38 SEC $A6:BE66 E5 12 SBC $12 [$7E:0012] ; Ridley X position + $E $A6:BE68 10 04 BPL $04 [$BE6E] ; if Baby Metroid X position - Ridley X position + $E >= 0: $A6:BE6A 49 FF FF EOR #$FFFF $A6:BE6D 1A INC A $A6:BE6E 38 SEC $A6:BE6F E9 04 00 SBC #$0004 $A6:BE72 90 04 BCC $04 [$BE78] ; if Baby Metroid X position - Ridley X position + $E >= 4: $A6:BE74 C5 16 CMP $16 [$7E:0016] ; $16 = 4 $A6:BE76 B0 17 BCS $17 [$BE8F] ; if Baby Metroid X position - Ridley X position + $E - 4 < 4: $A6:BE78 AF 08 88 7E LDA $7E8808[$7E:8808] ; Baby Metroid Y position $A6:BE7C 38 SEC $A6:BE7D E5 14 SBC $14 [$7E:0014] $A6:BE7F 10 04 BPL $04 [$BE85] $A6:BE81 49 FF FF EOR #$FFFF $A6:BE84 1A INC A $A6:BE85 38 SEC $A6:BE86 E9 04 00 SBC #$0004 $A6:BE89 90 06 BCC $06 [$BE91] $A6:BE8B C5 18 CMP $18 [$7E:0018] $A6:BE8D 90 02 BCC $02 [$BE91] ; not grabbed $A6:BE8F 18 CLC $A6:BE90 60 RTS ; grabbed Baby Metroid $A6:BE91 38 SEC $A6:BE92 60 RTS } ;;; $BE93: Handle carrying Baby Metroid capsule ;;; { $A6:BE93 AF 00 88 7E LDA $7E8800[$7E:8800] ; Baby Metroid function pointer $A6:BE97 85 12 STA $12 [$7E:0012] $A6:BE99 6C 12 00 JMP ($0012)[$A6:BE9C] ; execute Baby Metroid function } ;;; $BE9C: Update Baby Metroid capsule position while carried in arms ;;; { $A6:BE9C A9 F0 FF LDA #$FFF0 $A6:BE9F 18 CLC $A6:BEA0 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BEA3 8F 04 88 7E STA $7E8804[$7E:8804] ; Baby Metroid capsule X position = Ridley X position - $10 $A6:BEA7 A9 16 00 LDA #$0016 $A6:BEAA 18 CLC $A6:BEAB 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BEAE 8F 08 88 7E STA $7E8808[$7E:8808] ; Baby Metroid capsule Y position = Ridley Y position + $16 $A6:BEB2 60 RTS } ;;; $BEB3: Update Baby Metroid capsule position while carried in feet ;;; { $A6:BEB3 A9 0E 00 LDA #$000E $A6:BEB6 18 CLC $A6:BEB7 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:BEBA 8F 04 88 7E STA $7E8804[$7E:8804] ; Baby Metroid capsule X position = Ridley X position + $E $A6:BEBE A9 42 00 LDA #$0042 $A6:BEC1 18 CLC $A6:BEC2 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:BEC5 8F 08 88 7E STA $7E8808[$7E:8808] ; Baby Metroid capsule Y position = Ridley Y position + $42 $A6:BEC9 60 RTS } ;;; $BECA: ;;; { ; Initialise baby metroid falling to ground $A6:BECA A9 00 00 LDA #$0000 $A6:BECD 8F 0A 88 7E STA $7E880A[$7E:880A] ; never read $A6:BED1 8F 0C 88 7E STA $7E880C[$7E:880C] $A6:BED5 A9 DC BE LDA #$BEDC ; Baby Metroid falls to ground $A6:BED8 8F 00 88 7E STA $7E8800[$7E:8800] ; Baby Metroid function pointer } ;;; $BEDC: ;;; { ; Baby metroid falls to ground $A6:BEDC AF 0C 88 7E LDA $7E880C[$7E:880C] $A6:BEE0 18 CLC $A6:BEE1 69 08 00 ADC #$0008 $A6:BEE4 8F 0C 88 7E STA $7E880C[$7E:880C] ; also disables Baby Metroid cry SFX $A6:BEE8 E2 20 SEP #$20 $A6:BEEA 18 CLC $A6:BEEB 6F 07 88 7E ADC $7E8807[$7E:8807] $A6:BEEF 8F 07 88 7E STA $7E8807[$7E:8807] $A6:BEF3 C2 20 REP #$20 $A6:BEF5 29 00 FF AND #$FF00 $A6:BEF8 EB XBA $A6:BEF9 10 03 BPL $03 [$BEFE] $A6:BEFB 09 00 FF ORA #$FF00 $A6:BEFE 6F 08 88 7E ADC $7E8808[$7E:8808] $A6:BF02 8F 08 88 7E STA $7E8808[$7E:8808] $A6:BF06 C9 C0 00 CMP #$00C0 $A6:BF09 30 0E BMI $0E [$BF19] $A6:BF0B A9 C0 00 LDA #$00C0 $A6:BF0E 8F 08 88 7E STA $7E8808[$7E:8808] $A6:BF12 A9 19 BF LDA #$BF19 ; RTS $A6:BF15 8F 00 88 7E STA $7E8800[$7E:8800] ; Baby Metroid function pointer $A6:BF19 60 RTS } ;;; $BF1A: Draw baby metroid ;;; { $A6:BF1A A9 06 78 LDA #$7806 ; Baby Metroid instruction list RAM ($7E7806) $A6:BF1D 20 CB DB JSR $DBCB [$A6:DBCB] ; "Calculate graphic to use" $A6:BF20 AF 04 88 7E LDA $7E8804[$7E:8804] $A6:BF24 85 12 STA $12 [$7E:0012] ; $12 = Baby Metroid X position $A6:BF26 AF 08 88 7E LDA $7E8808[$7E:8808] $A6:BF2A 85 14 STA $14 [$7E:0014] ; $14 = Baby Metroid Y position $A6:BF2C 64 16 STZ $16 [$7E:0016] ; palette index = 0 $A6:BF2E 4C 13 DC JMP $DC13 [$A6:DC13] ; goto "General use draw" } ;;; $BF31: Baby metroid instruction list ;;; { $A6:BF31 dw BFF2,BF59, ; "goto $BF59 if $7E880C != 0" 000A,BFFD, ; horizontal squish 000A,C018, ; round 000A,C033, ; vertical squish 000A,C018, ; round BFF2,BF59, ; "goto $BF59 if $7E880C != 0" 000A,BFFD, ; horizontal squish 000A,C018, ; round 000A,C033, ; vertical squish 000A,C018 ; round $A6:BF59 dw BFC9,BF31, ; "play cry sfx or goto $BF31" BFE1,E20F, ; set palette 0006,BFFD, ; horizontal squish BFE1,E22D, ; set palette 0005,C018, ; round BFE1,E24B, ; set palette 0004,C033, ; vertical squish BFE1,E22D, ; set palette 0003,C018, ; round BFE1,E20F, ; set palette 0002,BFFD, ; horizontal squish BFE1,E22D, ; set palette 0003,C018, ; round BFE1,E24B, ; set palette 0004,C033, ; vertical squish BFE1,E22D, ; set palette 0005,C018, ; round BFE1,E20F, ; set palette 0006,BFFD, ; horizontal squish BFE1,E22D, ; set palette 0007,C018, ; round BFE1,E24B, ; set palette 0008,C033, ; vertical squish BFE1,E22D, ; set palette 0009,C018, ; round BFE1,E1F1, ; set palette BFF2,BF59, ; goto $BF59 if $7E880C != 0 BFF8,BF31 ; Go to $BF31 } ;;; $BFC9: Baby metroid instruction ;;; { ; play Baby Metroid cry sfx or goto [[X]] $A6:BFC9 AF 0C 88 7E LDA $7E880C[$7E:880C] $A6:BFCD D0 08 BNE $08 [$BFD7] ; if Baby Metroid is not falling: $A6:BFCF AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:BFD2 29 01 00 AND #$0001 $A6:BFD5 D0 21 BNE $21 [$BFF8] ; if random number is even: $A6:BFD7 A9 24 00 LDA #$0024 ;\ $A6:BFDA 22 4D 91 80 JSL $80914D[$80:914D] ;} Queue sound 24h, sound library 3, max queued sounds allowed = 6 (baby metroid cry - Ceres) } ;;; $BFDE: X += 2 ;;; { ; Ceres Ridley $A6:BFDE E8 INX $A6:BFDF E8 INX $A6:BFE0 60 RTS } ;;; $BFE1: Baby metroid instruction ;;; { ; Ceres Ridley ; update colors $A6:BFE1 BC 00 00 LDY $0000,x[$A6:BF5F] $A6:BFE4 DA PHX $A6:BFE5 A2 62 01 LDX #$0162 $A6:BFE8 A9 0F 00 LDA #$000F $A6:BFEB 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write $F colors from $A6:[Y] to color index $162 $A6:BFEF FA PLX $A6:BFF0 80 EC BRA $EC [$BFDE] } ;;; $BFF2: Baby metroid instruction ;;; { ; Ceres Ridley ; goto [[X]] instruction if Baby Metroid not falling: $7E880C != 0 $A6:BFF2 AF 0C 88 7E LDA $7E880C[$7E:880C] $A6:BFF6 F0 E6 BEQ $E6 [$BFDE] ; if Baby Metroid falling: } ;;; $BFF8: Baby metroid instruction - go to [[X]] ;;; { ; Ceres Ridley $A6:BFF8 BD 00 00 LDA $0000,x[$A6:BFC7] $A6:BFFB AA TAX $A6:BFFC 60 RTS } ;;; $BFFD: Baby metroid spritemaps ;;; { $A6:BFFD dx 0005, 0000,08,F50D, 01F8,08,B50D, 0000,F0,750D, 01F8,F0,350D, 81F8,F8,3742 ; horizontal squish $A6:C018 dx 0005, 0000,08,F50D, 01F8,08,B50D, 0000,F0,750D, 01F8,F0,350D, 81F8,F8,374C ; round $A6:C033 dx 0005, 0000,08,F50D, 01F8,08,B50D, 0000,F0,750D, 01F8,F0,350D, 81F8,F8,374E ; vertical squish } ;;; $C04E: Ridley function ;;; { ; Ceres Ridley ; Function handler after mode7 getaway $A6:C04E AE B2 0F LDX $0FB2 [$7E:0FB2] $A6:C051 7C 54 C0 JMP ($C054,x)[$A6:C062] $A6:C054 dw C062, C08E, C09F, C0BB, C0F5, C104, C117 } ;;; $C062: ;;; { ; Ceres Ridley ; Post-getaway $A6:C062 AF 02 C0 7E LDA $7EC002[$7E:C002] $A6:C066 8F C2 C0 7E STA $7EC0C2[$7E:C0C2] ; BG1/1 palette 6, color 1 $A6:C06A AF 06 C0 7E LDA $7EC006[$7E:C006] $A6:C06E 8F C6 C0 7E STA $7EC0C6[$7E:C0C6] ; BG1/1 palette 6, color 3 $A6:C072 AF 22 C0 7E LDA $7EC022[$7E:C022] $A6:C076 8F A2 C0 7E STA $7EC0A2[$7E:C0A2] ; BG1/1 palette 5, color 1 $A6:C07A AF 26 C0 7E LDA $7EC026[$7E:C026] $A6:C07E 8F A6 C0 7E STA $7EC0A6[$7E:C0A6] ; BG1/1 palette 5, color 3 $A6:C082 A2 CB C4 LDX #$C4CB ; "Zebes escape timer sprite tile transfer entries" $A6:C085 8E B0 0F STX $0FB0 [$7E:0FB0] $A6:C088 EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C08B EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function } ;;; $C08E: ;;; { ; Begin timer graphics transfers ; Ceres Ridley ; Post-getaway $A6:C08E 20 6E C2 JSR $C26E [$A6:C26E] ; Process escape timer tile transfers $A6:C091 90 27 BCC $27 [$C0BA] ; if no more transfers: $A6:C093 A2 FE C4 LDX #$C4FE ; "Ceres escape timer BG1/2 tile transfer entries" $A6:C096 8E B0 0F STX $0FB0 [$7E:0FB0] $A6:C099 EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C09C EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function } ;;; $C09F: ;;; { ; Continue transferring timer graphics, then display EMERGENCY text and change music ; Ceres Ridley ; Post-getaway $A6:C09F 20 6E C2 JSR $C26E [$A6:C26E] ; Process escape timer tile transfers $A6:C0A2 90 16 BCC $16 [$C0BA] ; if no more transfers: $A6:C0A4 EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C0A7 EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function $A6:C0AA 20 36 C1 JSR $C136 [$A6:C136] ; "Display 'EMERGENCY' text" $A6:C0AD A9 80 00 LDA #$0080 $A6:C0B0 8D B0 0F STA $0FB0 [$7E:0FB0] ; timer = $80 $A6:C0B3 A9 07 00 LDA #$0007 ;\ $A6:C0B6 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue song 2 music track $A6:C0BA 60 RTS } ;;; $C0BB: Set up Ceres escape timer ;;; { ; Animate EMERGENCY text palette, setup for typing escape message ; Ceres Ridley ; Post-getaway $A6:C0BB 20 9C C1 JSR $C19C [$A6:C19C] ; Cycle EMERGENCY text colors $A6:C0BE CE B0 0F DEC $0FB0 [$7E:0FB0] $A6:C0C1 D0 31 BNE $31 [$C0F4] ; if timer = 0: $A6:C0C3 A9 50 C4 LDA #$C450 ; Typewriter text, Ceres Escape $A6:C0C6 8F 36 80 7E STA $7E8036[$7E:8036] $A6:C0CA A9 00 00 LDA #$0000 $A6:C0CD 8F 38 80 7E STA $7E8038[$7E:8038] ; Typewriter VRAM tilemap address = 0 $A6:C0D1 8F 3A 80 7E STA $7E803A[$7E:803A] ; Typewriter instruction timer = 0 $A6:C0D5 8F 3C 80 7E STA $7E803C[$7E:803C] ; Typewriter instruction timer reset value = 0 $A6:C0D9 8F 3E 80 7E STA $7E803E[$7E:803E] ; Typewriter stroke timer = 0 $A6:C0DD A9 20 00 LDA #$0020 $A6:C0E0 8D B0 0F STA $0FB0 [$7E:0FB0] ; timer = $20 $A6:C0E3 AD E2 09 LDA $09E2 [$7E:09E2] $A6:C0E6 D0 06 BNE $06 [$C0EE] ; if Japanese text disabled: $A6:C0E8 EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C0EB EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function, skip $C0F5 (Japanese text) ; Japanese text $A6:C0EE EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C0F1 EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function $A6:C0F4 60 RTS } ;;; $C0F5: ;;; { ; Ceres Ridley ; Post-getaway ; japanese text $A6:C0F5 CE B0 0F DEC $0FB0 [$7E:0FB0] $A6:C0F8 D0 0A BNE $0A [$C104] ; if timer expired: $A6:C0FA EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C0FD EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function $A6:C100 22 83 C3 A6 JSL $A6C383[$A6:C383] ; "Queue Japanese text tilemap transfers" } ;;; $C104: ;;; { ; Ceres Ridley ; Post-getaway $A6:C104 20 9C C1 JSR $C19C [$A6:C19C] ; Cycle EMERGENCY text colors $A6:C107 A9 82 35 LDA #$3582 $A6:C10A 22 A7 C2 A6 JSL $A6C2A7[$A6:C2A7] ; Handle typewriter text (external) $A6:C10E 90 06 BCC $06 [$C116] ; if finished typing (carry set): $A6:C110 EE B2 0F INC $0FB2 [$7E:0FB2] $A6:C113 EE B2 0F INC $0FB2 [$7E:0FB2] ; next getaway function $A6:C116 60 RTS } ;;; $C117: ;;; { ; Ceres Ridley ; Post-getaway $A6:C117 20 9C C1 JSR $C19C [$A6:C19C] ; Cycle EMERGENCY text colors $A6:C11A 20 54 A3 JSR $A354 [$A6:A354] ; "clear speeds" $A6:C11D 9C B2 0F STZ $0FB2 [$7E:0FB2] ; no more getaway functions $A6:C120 A9 50 AA LDA #$AA50 ; JSR to $C19C $A6:C123 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C126 A9 01 00 LDA #$0001 $A6:C129 8D 43 09 STA $0943 [$7E:0943] ; timer status = Ceres start $A6:C12C 1A INC A $A6:C12D 8D 3F 09 STA $093F [$7E:093F] ; Ceres status = During escape sequence $A6:C130 3A DEC A $A6:C131 22 A6 81 80 JSL $8081A6[$80:81A6] ; Set boss bits in A for current area $A6:C135 60 RTS } ;;; $C136: ;;; { ; Display 'EMERGENCY' text $A6:C136 A2 5D C1 LDX #$C15D ; EMERGENCY tilemap $A6:C139 AC 30 03 LDY $0330 [$7E:0330] $A6:C13C BD 00 00 LDA $0000,x[$A6:C15D] $A6:C13F 99 D0 00 STA $00D0,y[$7E:00D7] ; size $A6:C142 BD 03 00 LDA $0003,x[$A6:C160] $A6:C145 99 D3 00 STA $00D3,y[$7E:00DA] ; src bank $A6:C148 BD 02 00 LDA $0002,x[$A6:C15F] $A6:C14B 99 D2 00 STA $00D2,y[$7E:00D9] ; src addr $A6:C14E BD 05 00 LDA $0005,x[$A6:C162] $A6:C151 99 D5 00 STA $00D5,y[$7E:00DC] ; dest $A6:C154 98 TYA $A6:C155 18 CLC $A6:C156 69 07 00 ADC #$0007 $A6:C159 8D 30 03 STA $0330 [$7E:0330] ; set index to next free entry $A6:C15C 60 RTS $A6:C15D dx 0012,A6C164,50CB ; E M E R G E N C Y $A6:C164 dw 3986, 398E, 3986, 3993, 3988, 3986, 398F, 3984, 399A } ;;; $C176: ;;; { ; unused? $A6:C176 A2 16 00 LDX #$0016 $A6:C179 AF 32 80 7E LDA $7E8032[$7E:8032] $A6:C17D 1A INC A $A6:C17E C9 20 00 CMP #$0020 $A6:C181 30 03 BMI $03 [$C186] $A6:C183 A9 E1 FF LDA #$FFE1 $A6:C186 8F 32 80 7E STA $7E8032[$7E:8032] $A6:C18A AF 32 80 7E LDA $7E8032[$7E:8032] ; >.< $A6:C18E 10 04 BPL $04 [$C194] $A6:C190 49 FF FF EOR #$FFFF $A6:C193 1A INC A $A6:C194 29 1F 00 AND #$001F $A6:C197 9F 00 C0 7E STA $7EC000,x $A6:C19B 60 RTS } ;;; $C19C: ;;; { ; Ceres Ridley ; Cycle EMERGENCY text colors $A6:C19C AF 00 C4 7E LDA $7EC400[$7E:C400] ; palette change numerator $A6:C1A0 0D 97 07 ORA $0797 [$7E:0797] ; Door transition flag $A6:C1A3 F0 01 BEQ $01 [$C1A6] ; if door transition flag or palette change numerator != 0: return $A6:C1A5 60 RTS ; door transition or non-zero numerator $A6:C1A6 AD B6 05 LDA $05B6 [$7E:05B6] $A6:C1A9 29 03 00 AND #$0003 $A6:C1AC D0 F7 BNE $F7 [$C1A5] ; every 3 frames: $A6:C1AE AF 30 80 7E LDA $7E8030[$7E:8030] $A6:C1B2 1A INC A ; palette index =+ 1 $A6:C1B3 C9 10 00 CMP #$0010 $A6:C1B6 90 03 BCC $03 [$C1BB] ; if palette index + 1 > 10: $A6:C1B8 A9 00 00 LDA #$0000 ; reset index ; cycle colors $A6:C1BB 8F 30 80 7E STA $7E8030[$7E:8030] $A6:C1BF 0A ASL A $A6:C1C0 6F 30 80 7E ADC $7E8030[$7E:8030] $A6:C1C4 0A ASL A $A6:C1C5 A8 TAY ; Y = palette index * 6 $A6:C1C6 A2 C2 00 LDX #$00C2 ; >.< $A6:C1C9 B9 DF C1 LDA $C1DF,y[$A6:C1E5] $A6:C1CC 9F 00 C0 7E STA $7EC000,x[$7E:C0C2]; $7EC0C2, BG1/2 palette 6, color 1 $A6:C1D0 B9 E1 C1 LDA $C1E1,y[$A6:C1E7] $A6:C1D3 9F 02 C0 7E STA $7EC002,x[$7E:C0C4]; $7EC0C4, BG1/2 palette 6, color 2 $A6:C1D7 B9 E3 C1 LDA $C1E3,y[$A6:C1E9] $A6:C1DA 9F 04 C0 7E STA $7EC004,x[$7E:C0C6]; $7EC0C6, BG1/2 palette 6, color 3 $A6:C1DE 60 RTS ; BG1/2 palette 6 colors 1..3 ; EMERGENCY text palettes $A6:C1DF dw 02DF,01D7,00AC, 06BE,05B7,04AC, 0A9E,09B7,08AD, 0E7D,0D97,0CAE, 125D,1197,10AF, 1A3C,1977,18B0, 1E1C,1D77,1CB0, 21FB,2157,20B1, 25DB,2557,24D2, 21FB,2157,20B1, 1E1C,1D77,1CB0, 1A3C,1977,18B0, 125D,1197,10AF, 0E7D,0D97,0CAE, 0A9E,09B7,08AD, 06BE,05B7,04AC } ;;; $C23F: Set up Zebes escape typewriter ;;; { $A6:C23F AF FA C0 7E LDA $7EC0FA[$7E:C0FA] ;\ $A6:C243 8F 3A C1 7E STA $7EC13A[$7E:C13A] ;| $A6:C247 AF FC C0 7E LDA $7EC0FC[$7E:C0FC] ;} Sprite palette 1 color Dh..Eh = [BG1/2 palette 7 color Dh..Eh] $A6:C24B 8F 3C C1 7E STA $7EC13C[$7E:C13C] ;/ $A6:C24F A9 9C C4 LDA #$C49C ;\ $A6:C252 8F 36 80 7E STA $7E8036[$7E:8036] ;} Typewriter instruction list pointer = $C49C (typewriter text - Zebes escape timer) $A6:C256 A9 00 00 LDA #$0000 ;\ $A6:C259 8F 38 80 7E STA $7E8038[$7E:8038] ;} Typewriter VRAM tilemap address = 0 $A6:C25D 8F 3A 80 7E STA $7E803A[$7E:803A] ; Typewriter instruction timer = 0 $A6:C261 8F 3C 80 7E STA $7E803C[$7E:803C] ; Typewriter instruction timer reset value = 0 $A6:C265 8F 3E 80 7E STA $7E803E[$7E:803E] ; Typewriter stroke timer = 0 $A6:C269 64 B5 STZ $B5 [$7E:00B5] ; BG2 X scroll = 0 $A6:C26B 64 B7 STZ $B7 [$7E:00B7] ; BG2 Y scroll = 0 $A6:C26D 6B RTL } ;;; $C26E: Process escape timer tile transfers ;;; { ; Ceres Ridley ; carry set if no more transfers $A6:C26E AE B0 0F LDX $0FB0 [$7E:0FB0] ; X = [$0FB0] $A6:C271 AC 30 03 LDY $0330 [$7E:0330] ; Y = [VRAM write table stack pointer] $A6:C274 BD 00 00 LDA $0000,x[$A6:C4CB] ;\ $A6:C277 F0 2C BEQ $2C [$C2A5] ;} If [[X]] != 0: (terminator) $A6:C279 99 D0 00 STA $00D0,y[$7E:00D0] ;\ $A6:C27C BD 03 00 LDA $0003,x[$A6:C4CE] ;| $A6:C27F 99 D3 00 STA $00D3,y[$7E:00D3] ;| $A6:C282 BD 02 00 LDA $0002,x[$A6:C4CD] ;| $A6:C285 99 D2 00 STA $00D2,y[$7E:00D2] ;| $A6:C288 BD 05 00 LDA $0005,x[$A6:C4D0] ;} Queue transfer of [[X]] bytes from [[X] + 2] to VRAM [[X] + 5] $A6:C28B 99 D5 00 STA $00D5,y[$7E:00D5] ;| $A6:C28E 98 TYA ;\ $A6:C28F 18 CLC ;| $A6:C290 69 07 00 ADC #$0007 ;} VRAM write table stack pointer += 7 $A6:C293 8D 30 03 STA $0330 [$7E:0330] ;/ $A6:C296 8A TXA ;\ $A6:C297 69 07 00 ADC #$0007 ;} $0FB0 += 7 $A6:C29A 8D B0 0F STA $0FB0 [$7E:0FB0] ;/ $A6:C29D AA TAX ;\ $A6:C29E BD 00 00 LDA $0000,x[$A6:C4D2] ;} If [[X]] != 0: $A6:C2A1 F0 02 BEQ $02 [$C2A5] ;/ $A6:C2A3 18 CLC ;\ $A6:C2A4 60 RTS ;} Return carry clear ; no more transfers $A6:C2A5 38 SEC ;\ $A6:C2A6 60 RTS ;} Return carry set } ;;; $C2A7: Handle typewriter text (external) ;;; { $A6:C2A7 85 12 STA $12 [$7E:0012] ; $12 = [A] $A6:C2A9 8B PHB $A6:C2AA 4B PHK ;\ $A6:C2AB AB PLB ;} DB = $A6 $A6:C2AC 20 B1 C2 JSR $C2B1 [$A6:C2B1] ; Handle typewriter text $A6:C2AF AB PLB $A6:C2B0 6B RTL } ;;; $C2B1: Handle typewriter text ;;; { ; Ceres Ridley ;; Returns: ;; Carry: Set if finished, clear otherwise ; Incrementally writes text like "TIME BOMB SET EVACUATE IMMEDIATELY", $A6:C2B1 AF 3A 80 7E LDA $7E803A[$7E:803A] $A6:C2B5 F0 06 BEQ $06 [$C2BD] ; if timer reset value != 0: $A6:C2B7 3A DEC A $A6:C2B8 8F 3A 80 7E STA $7E803A[$7E:803A] ; timer reset value =+ 1 $A6:C2BC 60 RTS $A6:C2BD AF 3C 80 7E LDA $7E803C[$7E:803C] $A6:C2C1 8F 3A 80 7E STA $7E803A[$7E:803A] ; timer reset value = stroke timer $A6:C2C5 AF 36 80 7E LDA $7E8036[$7E:8036] $A6:C2C9 AA TAX ; X = VRAM tilemap address ; LOOP $A6:C2CA BD 00 00 LDA $0000,x[$A6:C450] $A6:C2CD D0 02 BNE $02 [$C2D1] ; if terminator: $A6:C2CF 38 SEC ; finished typing $A6:C2D0 60 RTS $A6:C2D1 C9 01 00 CMP #$0001 $A6:C2D4 D0 0E BNE $0E [$C2E4] ; if timer reset command: $A6:C2D6 E8 INX $A6:C2D7 E8 INX $A6:C2D8 BD 00 00 LDA $0000,x[$A6:C452] $A6:C2DB 8F 3C 80 7E STA $7E803C[$7E:803C] ; timer reset value $A6:C2DF E8 INX $A6:C2E0 E8 INX $A6:C2E1 4C CA C2 JMP $C2CA [$A6:C2CA] ; goto LOOP $A6:C2E4 C9 0D 00 CMP #$000D $A6:C2E7 D0 0E BNE $0E [$C2F7] ; if VRAM tilemap address command: $A6:C2E9 E8 INX $A6:C2EA E8 INX $A6:C2EB BD 00 00 LDA $0000,x[$A6:C456] $A6:C2EE 8F 38 80 7E STA $7E8038[$7E:8038] ; VRAM tilemap address $A6:C2F2 E8 INX $A6:C2F3 E8 INX $A6:C2F4 4C CA C2 JMP $C2CA [$A6:C2CA] ; goto LOOP $A6:C2F7 29 FF 00 AND #$00FF $A6:C2FA C9 20 00 CMP #$0020 $A6:C2FD D0 11 BNE $11 [$C310] ; if $20: (space) $A6:C2FF AF 38 80 7E LDA $7E8038[$7E:8038] $A6:C303 1A INC A $A6:C304 8F 38 80 7E STA $7E8038[$7E:8038] ; VRAM tilemap address =+ 1 $A6:C308 E8 INX $A6:C309 8A TXA $A6:C30A 8F 36 80 7E STA $7E8036[$7E:8036] ; VRAM tilemap address =+ 1 $A6:C30E 18 CLC ; not finished typing $A6:C30F 60 RTS $A6:C310 C9 21 00 CMP #$0021 $A6:C313 D0 03 BNE $03 [$C318] ; if $21: (it's never $21?) $A6:C315 A9 5B 00 LDA #$005B ; this would be the first tile of the Japanese text ; character to type $A6:C318 48 PHA $A6:C319 8A TXA $A6:C31A 1A INC A $A6:C31B 8F 36 80 7E STA $7E8036[$7E:8036] ; VRAM tilemap address =+ 1 $A6:C31F AC 30 03 LDY $0330 [$7E:0330] $A6:C322 A9 02 00 LDA #$0002 $A6:C325 99 D0 00 STA $00D0,y[$7E:00D0] ; size $A6:C328 A9 00 7E LDA #$7E00 $A6:C32B 99 D3 00 STA $00D3,y[$7E:00D3] ; src bank $A6:C32E 68 PLA $A6:C32F 38 SEC $A6:C330 E9 41 00 SBC #$0041 $A6:C333 18 CLC $A6:C334 65 12 ADC $12 [$7E:0012] ; $3582 in Ceres, $2610 in Zebes $A6:C336 8F 34 80 7E STA $7E8034[$7E:8034] ; character tile to be written to tilemap $A6:C33A A9 34 80 LDA #$8034 ; pointer to RAM address of the character $A6:C33D 99 D2 00 STA $00D2,y[$7E:00D2] ; src addr $A6:C340 AF 38 80 7E LDA $7E8038[$7E:8038] ; VRAM tilemap address $A6:C344 99 D5 00 STA $00D5,y[$7E:00D5] ; dest $A6:C347 1A INC A $A6:C348 8F 38 80 7E STA $7E8038[$7E:8038] ; VRAM tilemap address =+ 1 $A6:C34C 98 TYA $A6:C34D 18 CLC $A6:C34E 69 07 00 ADC #$0007 $A6:C351 8D 30 03 STA $0330 [$7E:0330] ; next entry VRAM write entry $A6:C354 AF 3E 80 7E LDA $7E803E[$7E:803E] $A6:C358 1A INC A $A6:C359 8F 3E 80 7E STA $7E803E[$7E:803E] ; stroke timer =+ 1 $A6:C35D C9 02 00 CMP #$0002 $A6:C360 30 1F BMI $1F [$C381] ; if stroke timer >= 2: $A6:C362 A9 00 00 LDA #$0000 $A6:C365 8F 3E 80 7E STA $7E803E[$7E:803E] ; reset stroke timer $A6:C369 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:C36C C9 06 00 CMP #$0006 $A6:C36F D0 09 BNE $09 [$C37A] ; if area = Ceres: $A6:C371 A9 45 00 LDA #$0045 ;\ $A6:C374 22 B7 90 80 JSL $8090B7[$80:90B7] ;} Queue sound 45h, sound library 2, max queued sounds allowed = 3 (typewriter stroke - Ceres self destruct sequence) $A6:C378 80 07 BRA $07 [$C381] $A6:C37A A9 0D 00 LDA #$000D ;\ $A6:C37D 22 39 91 80 JSL $809139[$80:9139] ;} Queue sound Dh, sound library 3, max queued sounds allowed = 3 (typewriter stroke - intro) $A6:C381 18 CLC $A6:C382 60 RTS } ;;; $C383: ;;; { ; Queue Japanese text tilemap transfers $A6:C383 A2 B8 C3 LDX #$C3B8 ; X = $C3B8 $A6:C386 8B PHB $A6:C387 4B PHK ;\ $A6:C388 AB PLB ;} DB = $A6 $A6:C389 AC 30 03 LDY $0330 [$7E:0330] ; Y = [VRAM write table stack pointer] ; LOOP $A6:C38C BD 00 00 LDA $0000,x ;\ $A6:C38F F0 22 BEQ $22 [$C3B3] ;} If [[X]] != 0: $A6:C391 99 D0 00 STA $00D0,y ;\ size $A6:C394 BD 03 00 LDA $0003,x ;| $A6:C397 99 D3 00 STA $00D3,y ;| src bank $A6:C39A BD 02 00 LDA $0002,x ;| $A6:C39D 99 D2 00 STA $00D2,y ;| src addr $A6:C3A0 BD 05 00 LDA $0005,x ;} Queue transfer of [[X]] bytes from [[X] + 2] to VRAM [[X] + 5] $A6:C3A3 99 D5 00 STA $00D5,y ;| dest $A6:C3A6 98 TYA ;\ $A6:C3A7 18 CLC ;| $A6:C3A8 69 07 00 ADC #$0007 ;} Y += 7 $A6:C3AB A8 TAY ;/ $A6:C3AC 8A TXA ;\ $A6:C3AD 69 07 00 ADC #$0007 ;} X += 7 $A6:C3B0 AA TAX ;/ $A6:C3B1 80 D9 BRA $D9 [$C38C] ; Go to LOOP $A6:C3B3 8C 30 03 STY $0330 [$7E:0330] ; VRAM write table stack pointer = [Y] $A6:C3B6 AB PLB $A6:C3B7 6B RTL } ;;; $C3B8: Tilemap transfer entries ;;; { ; _______________ Size. Zero terminator ; | __________ Source address ; | | ___ VRAM address ; | | | $A6:C3B8 dx 0018,A6C3F4,528A, 0018,A6C40C,52AA, 0016,A6C424,52CA, 0016,A6C43A,52EA, 0000 ; unused ; just different VRAM addresses $A6:C3D6 dx 0018,A6C3F4,4A8A, 0018,A6C40C,4AAA, 0016,A6C424,4ACA, 0016,A6C43A,4AEA, 0000 } ;;; $C3F4: Tilemaps ;;; { ; Ceres Escape Japanese text ; uses two tile high text ; first line $A6:C3F4 dw 3DA0, 3DA1, 3DA2, 3DA3, 3DA4, 3DA5, 3DA6, 3DA7, 3DAF, 3DA8, 3DAF, 3DA9 ; top tiles $A6:C40C dw 3DB0, 3DB1, 3DB2, 3DB3, 3DB4, 3DB5, 3DB6, 3DB7, 3DBF, 3DB8, 3DBF, 3DB9 ; bottom tiles ; second line $A6:C424 dw 3DA9, 3DAA, 3DAB, 3DAC, 3DAD, 3DAE, 3DAF, 3D9C, 3D9D, 3D9E, 3D9F ; top tiles $A6:C43A dw 3DB9, 3DBA, 3DBB, 3DBC, 3DBD, 3DBE, 3DBF, 3DC0, 3DC1, 3DC2, 3DC3 ; bottom tiles } ;;; $C450: Typewriter text - Ceres escape timer ;;; { $A6:C450 dx 0001,0002, ; Timer reset value = 2 000D,5105, ; VRAM tilemap address = $5105 (BG1 tile (5, 8)) 53, 45, 4C, 46, 20, 44, 45, 53, 54, 52, 55, 43, 54, 20, 53, 45, 51, 55, 45, 4E, 43, 45, ; 'SELF DESTRUCT SEQUENCE' 000D,5145, ; VRAM tilemap address = $5145 (BG1 tile (5, Ah)) 41, 43, 54, 49, 56, 41, 54, 45, 44, 20, 45, 56, 41, 43, 55, 41, 54, 45, ; 'ACTIVATED EVACUATE' 000D,5185, ; VRAM tilemap address = $5185 (BG1 tile (5, Ch)) 43, 4F, 4C, 4F, 4E, 59, 20, 49, 4D, 4D, 45, 44, 49, 41, 54, 45, 4C, 59, ; 'COLONY IMMEDIATELY' 0000 } ;;; $C49C: Typewriter text - Zebes escape timer ;;; { $A6:C49C dx 0001,0002, ; Timer reset value = 2 000D,4905, ; VRAM tilemap address = $4905 (BG2 tile (5, 8)) 54, 49, 4D, 45, 20, 42, 4F, 4D, 42, 20, 53, 45, 54, 21, ; 'TIME BOMB SET!' 000D,4945, ; VRAM tilemap address = $4945 (BG2 tile (5, Ah)) 45, 53, 43, 41, 50, 45, 20, 49, 4D, 4D, 45, 44, 49, 41, 54, 45, 4C, 59, 21, ; 'ESCAPE IMMEDIATELY!' 0000 } ;;; $C4CB: Zebes escape timer sprite tile transfer entries ;;; { ; Loaded by Mother Brain in $A9:B258 ; _______________ Size. Zero terminator ; | __________ Source address ; | | ___ VRAM address ; | | | $A6:C4CB dx 0200,B0C000,7E00, ; Escape timer numbers 0120,B0C200,7F00, 0200,B7DA00,7820, ; Escape timer text 0200,B7DC00,7920, 0200,B7DE00,7A20, 0200,B7E000,7B20, 0100,B7E200,7C20, 0000 } ;;; $C4FE: Ceres escape timer BG1/2 tile transfer entries ;;; { ; _______________ Size. Zero terminator ; | __________ Source address ; | | ___ VRAM address ; | | | $A6:C4FE dx 0200,B7DA00,1820, ; Escape timer text 0200,B7DC00,1920, 0200,B7DE00,1A20, 0200,B7E000,1B20, 0100,B7E200,1C20, 0200,B0BA00,0D00, ; Ceres door tiles 0200,B0BC00,0E00, 0200,B0BE00,0F00, 0000 } ;;; $C538: Ridley function ;;; { ; Move Ridley towards 80,148 $A6:C538 20 01 C6 JSR $C601 [$A6:C601] ; "Move to death spot, CLC when near it" $A6:C53B 90 01 BCC $01 [$C53E] ; if not near death spot: $A6:C53D 60 RTS } ;;; $C53E: Ridley function ;;; { ; Final roar $A6:C53E A9 C8 E6 LDA #$E6C8 ; "death roar, facing left" $A6:C541 20 67 D4 JSR $D467 [$A6:D467] ; Set Ridley instruction list $A6:C544 A9 51 C5 LDA #$C551 ; "Move to death spot, wait, then lower acid" $A6:C547 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C54A A9 20 00 LDA #$0020 $A6:C54D 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $20 $A6:C550 60 RTS } ;;; $C551: Ridley function ;;; { ; Move to death spot, wait, then lower acid $A6:C551 20 01 C6 JSR $C601 [$A6:C601] ; "Move to death spot, CLC when near it" $A6:C554 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:C557 10 F7 BPL $F7 [$C550] ; if timer expired: $A6:C559 9C AA 0F STZ $0FAA [$7E:0FAA] $A6:C55C 9C AC 0F STZ $0FAC [$7E:0FAC] ; reset X/Y speeds $A6:C55F A9 10 02 LDA #$0210 $A6:C562 8D 7A 19 STA $197A [$7E:197A] ; FX target Y position = $210 $A6:C565 A9 40 00 LDA #$0040 $A6:C568 8D 7C 19 STA $197C [$7E:197C] ; FX Y velocity = 0.4 $A6:C56B A9 01 00 LDA #$0001 $A6:C56E 8D 80 19 STA $1980 [$7E:1980] ; FX timer = 1 $A6:C571 A9 00 00 LDA #$0000 $A6:C574 8F 0E 80 7E STA $7E800E[$7E:800E] ; reset timer $A6:C578 8F 10 80 7E STA $7E8010[$7E:8010] ; reset counter $A6:C57C A9 88 C5 LDA #$C588 $A6:C57F 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C582 A9 A0 00 LDA #$00A0 $A6:C585 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $A0 } ;;; $C588: Ridley function ;;; { ; Explosions for death. After a while, drop Samus if needed $A6:C588 20 23 C6 JSR $C623 [$A6:C623] ; "Keep playing explosions" $A6:C58B CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:C58E 10 C0 BPL $C0 [$C550] ; if timer < 0: $A6:C590 AF 36 78 7E LDA $7E7836[$7E:7836] $A6:C594 F0 03 BEQ $03 [$C599] ; if Ridley is holding Samus: $A6:C596 20 84 BC JSR $BC84 [$A6:BC84] ; "Release Samus" ; not holding Samus $A6:C599 A9 A8 C5 LDA #$C5A8 ; "Disable Ridley" $A6:C59C 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C59F 9C AA 0F STZ $0FAA [$7E:0FAA] $A6:C5A2 9C AC 0F STZ $0FAC [$7E:0FAC] ; reset Ridley X/Y speeds $A6:C5A5 4C 32 C9 JMP $C932 [$A6:C932] ; spawn Ridley Explosions } ;;; $C5A8: Ridley function ;;; { ; Disable Ridley $A6:C5A8 20 23 C6 JSR $C623 [$A6:C623] ; "Explosions for death. After a while, drop Samus if needed" $A6:C5AB A9 00 00 LDA #$0000 $A6:C5AE 8F 04 78 7E STA $7E7804[$7E:7804] ; Ceres Ridley active flag = 0 $A6:C5B2 AD 86 0F LDA $0F86 [$7E:0F86] $A6:C5B5 09 00 01 ORA #$0100 $A6:C5B8 8D 86 0F STA $0F86 [$7E:0F86] ; set invisibility $A6:C5BB A9 C8 C5 LDA #$C5C8 ; "Wait $20 frames" $A6:C5BE 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C5C1 A9 20 00 LDA #$0020 $A6:C5C4 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $20 $A6:C5C7 60 RTS } ;;; $C5C8: Ridley function ;;; { ; Wait $20 frames $A6:C5C8 CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:C5CB 10 83 BPL $83 [$C550] ; if timer expired: $A6:C5CD A9 DA C5 LDA #$C5DA ; "Wait 100 frames, then drop items, change music, and set boss bit" $A6:C5D0 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C5D3 A9 00 01 LDA #$0100 $A6:C5D6 8D B2 0F STA $0FB2 [$7E:0FB2] ; timer = $100 $A6:C5D9 60 RTS } ;;; $C5DA: Ridley function ;;; { ; Wait 100 frames, then drop items, change music, and set boss bit $A6:C5DA CE B2 0F DEC $0FB2 [$7E:0FB2] $A6:C5DD 10 21 BPL $21 [$C600] ; if timer < 0: $A6:C5DF A9 01 00 LDA #$0001 $A6:C5E2 22 A6 81 80 JSL $8081A6[$80:81A6] ; Set boss bits in A for current area $A6:C5E6 22 A5 B9 A0 JSL $A0B9A5[$A0:B9A5] ; Ridley death item drop routine $A6:C5EA A9 03 00 LDA #$0003 ;\ $A6:C5ED 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue elevator music track $A6:C5F1 AD 86 0F LDA $0F86 [$7E:0F86] $A6:C5F4 09 00 02 ORA #$0200 $A6:C5F7 8D 86 0F STA $0F86 [$7E:0F86] ; delete enemy $A6:C5FA A9 00 C6 LDA #$C600 ; RTS $A6:C5FD 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:C600 60 RTS } ;;; $C601: ;;; { ; Move to death spot, CLC when near it $A6:C601 A2 80 00 LDX #$0080 $A6:C604 86 12 STX $12 [$7E:0012] ; target X position = $80 $A6:C606 A0 48 01 LDY #$0148 $A6:C609 84 14 STY $14 [$7E:0014] ; target Y position = $148 $A6:C60B A2 00 00 LDX #$0000 ; X = enemy index 0, Ridley $A6:C60E A0 00 00 LDY #$0000 ; Y = acceleration divisor index $A6:C611 A9 10 00 LDA #$0010 ; deceleration boost = $10 $A6:C614 20 26 D5 JSR $D526 [$A6:D526] ; "Accelerates Ridley towards the desired X/Y" $A6:C617 A9 04 00 LDA #$0004 $A6:C61A 85 16 STA $16 [$7E:0016] ; target X radius = 4 $A6:C61C 85 18 STA $18 [$7E:0018] ; target Y radius = 4 $A6:C61E 22 06 EF A9 JSL $A9EF06[$A9:EF06] ; Check for enemy collision with rectangle, clear = collision $A6:C622 60 RTS } ;;; $C623: ;;; { ; Keep playing explosions $A6:C623 AF 0E 80 7E LDA $7E800E[$7E:800E] $A6:C627 3A DEC A $A6:C628 30 05 BMI $05 [$C62F] ; if timer not expired: $A6:C62A 8F 0E 80 7E STA $7E800E[$7E:800E] $A6:C62E 60 RTS ; timer expired $A6:C62F A9 04 00 LDA #$0004 $A6:C632 8F 0E 80 7E STA $7E800E[$7E:800E] ; death explosion timer = 4 $A6:C636 AF 10 80 7E LDA $7E8010[$7E:8010] $A6:C63A 1A INC A $A6:C63B C9 0A 00 CMP #$000A ; number of table entries +1 $A6:C63E 30 03 BMI $03 [$C643] ; if counter >= $A: $A6:C640 A9 00 00 LDA #$0000 ; reset counter $A6:C643 8F 10 80 7E STA $7E8010[$7E:8010] $A6:C647 0A ASL A $A6:C648 0A ASL A $A6:C649 A8 TAY $A6:C64A B9 6E C6 LDA $C66E,y[$A6:C672] ; explosion X offsets $A6:C64D 18 CLC $A6:C64E 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:C651 85 12 STA $12 [$7E:0012] ; $12 = explosion X position $A6:C653 B9 70 C6 LDA $C670,y[$A6:C674] ; explosion Y offsets $A6:C656 18 CLC $A6:C657 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:C65A 85 14 STA $14 [$7E:0014] ; $14 = explosion Y position $A6:C65C A9 03 00 LDA #$0003 ; A = 3 (small explosion) $A6:C65F A0 09 E5 LDY #$E509 ;\ $A6:C662 22 97 80 86 JSL $868097[$86:8097] ;} Spawn dust cloud / explosion enemy projectile $A6:C666 A9 24 00 LDA #$0024 ;\ $A6:C669 22 B7 90 80 JSL $8090B7[$80:90B7] ;} Queue sound 24h, sound library 2, max queued sounds allowed = 3 (small explosion) $A6:C66D 60 RTS ; explosion X,Y offsets $A6:C66E dw FFE8,FFE8, FFEC,0014, 0010,FFE2, 001E,FFFD, 000E,FFF3, FFFE,0012, FFFE,FFE0, FFE1,0008, FFFC,FFF6, 0013,0013 } ;;; $C696..CAF4: Ridley explosion ;;; { ;;; $C696: Initialisation AI - enemy $E1BF (Ridley explosion) ;;; { $A6:C696 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C699 A9 01 00 LDA #$0001 ;\ $A6:C69C 9D 94 0F STA $0F94,x[$7E:0FD4] ;} Enemy instruction list timer = 1 $A6:C69F 9E 90 0F STZ $0F90,x[$7E:0FD0] ; Enemy timer = 0 $A6:C6A2 9E 98 0F STZ $0F98,x[$7E:0FD8] ; Enemy VRAM tiles index = 0 $A6:C6A5 A9 00 0E LDA #$0E00 ;\ $A6:C6A8 9D 96 0F STA $0F96,x[$7E:0FD6] ;} Enemy palette index = E00h (palette 7) $A6:C6AB BC B4 0F LDY $0FB4,x[$7E:0FF4] ;\ $A6:C6AE B9 CE C6 LDA $C6CE,y[$A6:C6DA] ;} Enemy life timer = [$C6CE + [enemy parameter 1]] $A6:C6B1 9D B2 0F STA $0FB2,x[$7E:0FF2] ;/ $A6:C6B4 22 11 81 80 JSL $808111[$80:8111] ; Generate random number $A6:C6B8 29 30 01 AND #$0130 ;\ $A6:C6BB 2C E5 05 BIT $05E5 [$7E:05E5] ;| $A6:C6BE 10 04 BPL $04 [$C6C4] ;| $A6:C6C0 49 FF FF EOR #$FFFF ;} Enemy X velocity = ([random number] & 130h) * sgn([random number]) $A6:C6C3 1A INC A ;| ;| $A6:C6C4 9D AA 0F STA $0FAA,x[$7E:0FEA] ;/ $A6:C6C7 9E AC 0F STZ $0FAC,x[$7E:0FEC] ; Enemy Y velocity = 0 $A6:C6CA BB TYX ;\ $A6:C6CB 7C E6 C6 JMP ($C6E6,x)[$A6:C78E];} Go to [$C6E6 + [enemy parameter 1]] ; Life times. Indexed by enemy parameter 1 $A6:C6CE dw 0048, 0050, 0058, 0060, 0068, 0070, 0078, 0028, 0030, 0038, 0080, 0040 ; Initialisation pointers. Indexed by enemy parameter 1 $A6:C6E6 dw C6FE, C716, C72E, C746, C75E, C776, C78E, C7DA, C80C, C83E, C870, C8A2 } ;;; $C6FE: Ridley explosion initialisation - index = 0 ;;; { $A6:C6FE AE 54 0E LDX $0E54 [$7E:0E54] $A6:C701 AF 2C 20 7E LDA $7E202C[$7E:202C] ;\ $A6:C705 9D 7A 0F STA $0F7A,x[$7E:113A] ;} Ridley X position = tail part 1 X position $A6:C708 AF 2E 20 7E LDA $7E202E[$7E:202E] ;\ $A6:C70C 9D 7E 0F STA $0F7E,x[$7E:113E] ;} Ridley Y position = tail part 1 Y position $A6:C70F A9 47 CA LDA #$CA47 ;\ $A6:C712 9D 92 0F STA $0F92,x[$7E:1152] ;} Ridley instruction list pointer = $CA47 (large tail part) $A6:C715 6B RTL } ;;; $C716: Ridley explosion initialisation - index = 2 ;;; { $A6:C716 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C719 AF 40 20 7E LDA $7E2040[$7E:2040] ;\ $A6:C71D 9D 7A 0F STA $0F7A,x[$7E:10FA] ;} Ridley X position = tail part 2 X position $A6:C720 AF 42 20 7E LDA $7E2042[$7E:2042] ;\ $A6:C724 9D 7E 0F STA $0F7E,x[$7E:10FE] ;} Ridley Y position = tail part 2 Y position $A6:C727 A9 47 CA LDA #$CA47 ;\ $A6:C72A 9D 92 0F STA $0F92,x[$7E:1112] ;} Ridley instruction list pointer = $CA47 (large tail part) $A6:C72D 6B RTL } ;;; $C72E: Ridley explosion initialisation - index = 4 ;;; { $A6:C72E AE 54 0E LDX $0E54 [$7E:0E54] $A6:C731 AF 54 20 7E LDA $7E2054[$7E:2054] ;\ $A6:C735 9D 7A 0F STA $0F7A,x[$7E:10BA] ;} Ridley X position = tail part 3 X position $A6:C738 AF 56 20 7E LDA $7E2056[$7E:2056] ;\ $A6:C73C 9D 7E 0F STA $0F7E,x[$7E:10BE] ;} Ridley Y position = tail part 3 Y position $A6:C73F A9 4D CA LDA #$CA4D ;\ $A6:C742 9D 92 0F STA $0F92,x[$7E:10D2} ;} Ridley instruction list pointer = $CA4D (medium tail part) $A6:C745 6B RTL } ;;; $C746: Ridley explosion initialisation - index = 6 ;;; { $A6:C746 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C749 AF 68 20 7E LDA $7E2068[$7E:2068] ;\ $A6:C74D 9D 7A 0F STA $0F7A,x[$7E:107A] ;} Ridley X position = tail part 4 X position $A6:C750 AF 6A 20 7E LDA $7E206A[$7E:206A] ;\ $A6:C754 9D 7E 0F STA $0F7E,x[$7E:107E] ;} Ridley Y position = tail part 4 Y position $A6:C757 A9 4D CA LDA #$CA4D ;\ $A6:C75A 9D 92 0F STA $0F92,x[$7E:1092] ;} Ridley instruction list pointer = $CA4D (medium tail part) $A6:C75D 6B RTL } ;;; $C75E: Ridley explosion initialisation - index = 8 ;;; { $A6:C75E AE 54 0E LDX $0E54 [$7E:0E54] $A6:C761 AF 7C 20 7E LDA $7E207C[$7E:207C] ;\ $A6:C765 9D 7A 0F STA $0F7A,x[$7E:103A] ;} Ridley X position = tail part 5 X position $A6:C768 AF 7E 20 7E LDA $7E207E[$7E:207E] ;\ $A6:C76C 9D 7E 0F STA $0F7E,x[$7E:103E] ;} Ridley Y position = tail part 5 Y position $A6:C76F A9 53 CA LDA #$CA53 ;\ $A6:C772 9D 92 0F STA $0F92,x[$7E:1052] ;} Ridley instruction list pointer = $CA53 (small tail part) $A6:C775 6B RTL } ;;; $C776: Ridley explosion initialisation - index = Ah ;;; { $A6:C776 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C779 AF 90 20 7E LDA $7E2090[$7E:2090] ;\ $A6:C77D 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;} Ridley X position = tail part 6 X position $A6:C780 AF 92 20 7E LDA $7E2092[$7E:2092] ;\ $A6:C784 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;} Ridley Y position = tail part 6 Y position $A6:C787 A9 53 CA LDA #$CA53 ;\ $A6:C78A 9D 92 0F STA $0F92,x[$7E:1012] ;} Ridley instruction list pointer = $CA53 (small tail part) $A6:C78D 6B RTL } ;;; $C78E: Ridley explosion initialisation - index = Ch ;;; { $A6:C78E AE 54 0E LDX $0E54 [$7E:0E54] $A6:C791 AF A4 20 7E LDA $7E20A4[$7E:20A4] ;\ $A6:C795 9D 7A 0F STA $0F7A,x[$7E:0FBA] ;} Ridley X position = tail tip X position $A6:C798 AF A6 20 7E LDA $7E20A6[$7E:20A6] ;\ $A6:C79C 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;} Ridley Y position = tail tip Y position $A6:C79F AF A2 20 7E LDA $7E20A2[$7E:20A2] ;\ $A6:C7A3 18 CLC ;| $A6:C7A4 6F 8E 20 7E ADC $7E208E[$7E:208E] ;| $A6:C7A8 18 CLC ;| $A6:C7A9 69 08 00 ADC #$0008 ;| $A6:C7AC 29 F0 00 AND #$00F0 ;| $A6:C7AF 4A LSR A ;} Ridley instruction list pointer = [$C7BA + ([$7E:20A2] + [$7E:208E] + 8) / 10h % 10h * 2] $A6:C7B0 4A LSR A ;| (finds the pointing direction of the tail tip) $A6:C7B1 4A LSR A ;| $A6:C7B2 A8 TAY ;| $A6:C7B3 B9 BA C7 LDA $C7BA,y[$A6:C7BC] ;| $A6:C7B6 9D 92 0F STA $0F92,x[$7E:0FD2] ;/ $A6:C7B9 6B RTL ; Instruction list pointers $A6:C7BA dw CA95, CA9B, CAA1, CAA7, CAAD, CAB3, CAB9, CABF, CAC5, CACB, CAD1, CAD7, CADD, CAE3, CAE9, CAEF } ;;; $C7DA: Ridley explosion initialisation - index = Eh ;;; { $A6:C7DA A0 00 00 LDY #$0000 ; Y = 0 $A6:C7DD AF 20 78 7E LDA $7E7820[$7E:7820] ;\ $A6:C7E1 F0 03 BEQ $03 [$C7E6] ;} If [$7E:7820] != 0: $A6:C7E3 A0 02 00 LDY #$0002 ; Y = 2 $A6:C7E6 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C7E9 B9 04 C8 LDA $C804,y[$A6:C806] ;\ (>_<;) $A6:C7EC 18 CLC ;| $A6:C7ED 6D 7A 0F ADC $0F7A [$7E:0F7A] ;} Enemy X position = [Ridley X position] $A6:C7F0 9D 7A 0F STA $0F7A,x[$7E:117A] ;/ $A6:C7F3 A9 00 00 LDA #$0000 ;\ (>_<;) $A6:C7F6 18 CLC ;| $A6:C7F7 6D 7E 0F ADC $0F7E [$7E:0F7E] ;} Enemy Y position = [Ridley Y position] $A6:C7FA 9D 7E 0F STA $0F7E,x[$7E:117E] ;/ $A6:C7FD B9 08 C8 LDA $C808,y[$A6:C80A] ;\ $A6:C800 9D 92 0F STA $0F92,x[$7E:1192] ;} Enemy instruction list pointer = [$C808 + [Y]] $A6:C803 6B RTL $A6:C804 dw 0000, 0000 ; X offset from Ridley X position $A6:C808 dw CA59, CA5F ; Instruction list pointers } ;;; $C80C: Ridley explosion initialisation - index = 10h ;;; { $A6:C80C A0 00 00 LDY #$0000 ; Y = 0 $A6:C80F AF 20 78 7E LDA $7E7820[$7E:7820] ;\ $A6:C813 F0 03 BEQ $03 [$C818] ;} If [$7E:7820] != 0: $A6:C815 A0 02 00 LDY #$0002 ; Y = 2 $A6:C818 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C81B B9 36 C8 LDA $C836,y[$A6:C838] ;\ $A6:C81E 18 CLC ;| $A6:C81F 6D 7A 0F ADC $0F7A [$7E:0F7A] ;} Enemy X position = [Ridley X position] + [$C836 + [Y]] $A6:C822 9D 7A 0F STA $0F7A,x[$7E:11BA] ;/ $A6:C825 A9 16 00 LDA #$0016 ;\ $A6:C828 18 CLC ;| $A6:C829 6D 7E 0F ADC $0F7E [$7E:0F7E] ;} Enemy Y position = [Ridley Y position] + 16h $A6:C82C 9D 7E 0F STA $0F7E,x[$7E:11BE] ;/ $A6:C82F B9 3A C8 LDA $C83A,y[$A6:C83C] ;\ $A6:C832 9D 92 0F STA $0F92,x[$7E:11D2] ;} Enemy instruction list pointer = [$C83A + [Y]] $A6:C835 6B RTL $A6:C836 dw 000F, FFF1 ; X offset from Ridley X position $A6:C83A dw CA65, CA6B ; Instruction list pointers } ;;; $C83E: Ridley explosion initialisation - index = 12h ;;; { $A6:C83E A0 00 00 LDY #$0000 ; Y = 0 $A6:C841 AF 20 78 7E LDA $7E7820[$7E:7820] ;\ $A6:C845 F0 03 BEQ $03 [$C84A] ;} If [$7E:7820] != 0: $A6:C847 A0 02 00 LDY #$0002 ; Y = 2 $A6:C84A AE 54 0E LDX $0E54 [$7E:0E54] $A6:C84D B9 68 C8 LDA $C868,y[$A6:C86A] ;\ $A6:C850 18 CLC ;| $A6:C851 6D 7A 0F ADC $0F7A [$7E:0F7A] ;} Enemy X position = [Ridley X position] + [$C868 + [Y]] $A6:C854 9D 7A 0F STA $0F7A,x[$7E:123A] ;/ $A6:C857 A9 E8 FF LDA #$FFE8 ;\ $A6:C85A 18 CLC ;| $A6:C85B 6D 7E 0F ADC $0F7E [$7E:0F7E] ;} Enemy Y position = [Ridley Y position] - 18h $A6:C85E 9D 7E 0F STA $0F7E,x[$7E:123E] ;/ $A6:C861 B9 6C C8 LDA $C86C,y[$A6:C86E] ;\ $A6:C864 9D 92 0F STA $0F92,x[$7E:1252] ;} Enemy instruction list pointer = [$C86C + [Y]] $A6:C867 6B RTL $A6:C868 dw FFFD, 0003 ; X offset from Ridley X position $A6:C86C dw CA71, CA77 ; Instruction list pointers } ;;; $C870: Ridley explosion initialisation - index = 14h ;;; { $A6:C870 A0 00 00 LDY #$0000 ; Y = 0 $A6:C873 AF 20 78 7E LDA $7E7820[$7E:7820] ;\ $A6:C877 F0 03 BEQ $03 [$C87C] ;} If [$7E:7820] != 0: $A6:C879 A0 02 00 LDY #$0002 ; Y = 2 $A6:C87C AE 54 0E LDX $0E54 [$7E:0E54] $A6:C87F B9 9A C8 LDA $C89A,y[$A6:C89C] ;\ $A6:C882 18 CLC ;| $A6:C883 6D 7A 0F ADC $0F7A [$7E:0F7A] ;} Enemy X position = [Ridley X position] + [$C89A + [Y]] $A6:C886 9D 7A 0F STA $0F7A,x[$7E:11FA] ;/ $A6:C889 A9 00 00 LDA #$0000 ;\ (>_<;) $A6:C88C 18 CLC ;| $A6:C88D 6D 7E 0F ADC $0F7E [$7E:0F7E] ;} Enemy Y position = [Ridley Y position] $A6:C890 9D 7E 0F STA $0F7E,x[$7E:11FE] ;/ $A6:C893 B9 9E C8 LDA $C89E,y[$A6:C8A0] ;\ $A6:C896 9D 92 0F STA $0F92,x[$7E:1212] ;} Enemy instruction list pointer = [$C89E + [Y]] $A6:C899 6B RTL $A6:C89A dw 0010, FFF0 ; X offset from Ridley X position $A6:C89E dw CA7D, CA83 ; Instruction list pointers } ;;; $C8A2: Ridley explosion initialisation - index = 16h ;;; { $A6:C8A2 A0 00 00 LDY #$0000 ; Y = 0 $A6:C8A5 AF 20 78 7E LDA $7E7820[$7E:7820] ;\ $A6:C8A9 F0 03 BEQ $03 [$C8AE] ;} If [$7E:7820] != 0: $A6:C8AB A0 02 00 LDY #$0002 ; Y = 2 $A6:C8AE AE 54 0E LDX $0E54 [$7E:0E54] $A6:C8B1 B9 CC C8 LDA $C8CC,y[$A6:C8CE] ;\ $A6:C8B4 18 CLC ;| $A6:C8B5 6D 7A 0F ADC $0F7A [$7E:0F7A] ;} Enemy X position = [Ridley X position] + [$C8CC + [Y]] $A6:C8B8 9D 7A 0F STA $0F7A,x[$7E:127A] ;/ $A6:C8BB A9 07 00 LDA #$0007 ;\ $A6:C8BE 18 CLC ;| $A6:C8BF 6D 7E 0F ADC $0F7E [$7E:0F7E] ;} Enemy Y position = [Ridley Y position] + 7 $A6:C8C2 9D 7E 0F STA $0F7E,x[$7E:127E] ;/ $A6:C8C5 B9 D0 C8 LDA $C8D0,y[$A6:C8D2] ;\ $A6:C8C8 9D 92 0F STA $0F92,x[$7E:1292] ;} Enemy instruction list pointer = [$C8D0 + [Y]] $A6:C8CB 6B RTL $A6:C8CC dw 0008, FFF8 ; X offset from Ridley X position $A6:C8D0 dw CA89, CA8F ; Instruction list pointers } ;;; $C8D4: Main AI - enemy $E1BF (Ridley explosion) ;;; { $A6:C8D4 AE 54 0E LDX $0E54 [$7E:0E54] $A6:C8D7 20 13 C9 JSR $C913 [$A6:C913] ; Handle flickering $A6:C8DA BD AA 0F LDA $0FAA,x[$7E:0FEA] ;\ $A6:C8DD 10 04 BPL $04 [$C8E3] ;| $A6:C8DF 49 FF FF EOR #$FFFF ;| $A6:C8E2 1A INC A ;| ;| $A6:C8E3 18 CLC ;| $A6:C8E4 69 FC FF ADC #$FFFC ;| $A6:C8E7 10 03 BPL $03 [$C8EC] ;| $A6:C8E9 A9 00 00 LDA #$0000 ;} Enemy X velocity = max(0, |[enemy X velocity]| - 4) * sgn([enemy X velocity]) ;| $A6:C8EC 3C AA 0F BIT $0FAA,x[$7E:0FEA] ;| $A6:C8EF 10 04 BPL $04 [$C8F5] ;| $A6:C8F1 49 FF FF EOR #$FFFF ;| $A6:C8F4 1A INC A ;| ;| $A6:C8F5 9D AA 0F STA $0FAA,x[$7E:0FEA] ;/ $A6:C8F8 BD AC 0F LDA $0FAC,x[$7E:0FEC] ;\ $A6:C8FB 18 CLC ;| $A6:C8FC 69 04 00 ADC #$0004 ;} Enemy Y velocity += 4 $A6:C8FF 9D AC 0F STA $0FAC,x[$7E:0FEC] ;/ $A6:C902 22 EF C3 A9 JSL $A9C3EF[$A9:C3EF] ; Move enemy according to enemy velocity $A6:C906 DE B2 0F DEC $0FB2,x[$7E:0FF2] ; Decrement enemy life timer $A6:C909 10 07 BPL $07 [$C912] ; If [enemy life timer] < 0: $A6:C90B A9 00 00 LDA #$0000 ; A = 0 (small explosion) $A6:C90E 5C AF A3 A0 JML $A0A3AF[$A0:A3AF] ; Go to enemy death $A6:C912 6B RTL } ;;; $C913: Handle flickering ;;; { $A6:C913 BD A4 0F LDA $0FA4,x[$7E:0FE4] ;\ $A6:C916 29 01 00 AND #$0001 ;} Enemy frame counter %= 2 $A6:C919 9D A4 0F STA $0FA4,x[$7E:0FE4] ;/ $A6:C91C F0 0A BEQ $0A [$C928] ; If [enemy frame counter] != 0: $A6:C91E BD 86 0F LDA $0F86,x[$7E:0FC6] ;\ $A6:C921 09 00 01 ORA #$0100 ;} Set enemy as invisible $A6:C924 9D 86 0F STA $0F86,x[$7E:0FC6] ;/ $A6:C927 60 RTS ; Return $A6:C928 BD 86 0F LDA $0F86,x[$7E:0FC6] ;\ $A6:C92B 29 FF FE AND #$FEFF ;} Set enemy as visible $A6:C92E 9D 86 0F STA $0F86,x[$7E:0FC6] ;/ $A6:C931 60 RTS } ;;; $C932: Spawn Ridley explosion enemies ;;; { $A6:C932 A2 E7 C9 LDX #$C9E7 ;\ $A6:C935 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 0 $A6:C939 A2 D7 C9 LDX #$C9D7 ;\ $A6:C93C 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 1 $A6:C940 A2 C7 C9 LDX #$C9C7 ;\ $A6:C943 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 2 $A6:C947 A2 B7 C9 LDX #$C9B7 ;\ $A6:C94A 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 3 $A6:C94E A2 A7 C9 LDX #$C9A7 ;\ $A6:C951 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 4 $A6:C955 A2 97 C9 LDX #$C997 ;\ $A6:C958 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 5 $A6:C95C A2 87 C9 LDX #$C987 ;\ $A6:C95F 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 6 $A6:C963 A2 F7 C9 LDX #$C9F7 ;\ $A6:C966 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 7 $A6:C96A A2 07 CA LDX #$CA07 ;\ $A6:C96D 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 8 $A6:C971 A2 27 CA LDX #$CA27 ;\ $A6:C974 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion 9 $A6:C978 A2 17 CA LDX #$CA17 ;\ $A6:C97B 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion Ah $A6:C97F A2 37 CA LDX #$CA37 ;\ $A6:C982 22 75 92 A0 JSL $A09275[$A0:9275] ;} Spawn Ridley explosion Bh $A6:C986 60 RTS ; ______________________________________ Enemy ID ; | _________________________________ X position ; | | ____________________________ Y position ; | | | _______________________ Initialisation parameter ; | | | | __________________ Properties ; | | | | | _____________ Extra properties ; | | | | | | ________ Parameter 1 ; | | | | | | | ___ Parameter 2 ; | | | | | | | | $A6:C987 dw E1BF,0000,0000,0000,2C00,0000,0000,0000 ; Ridley explosion 6 $A6:C997 dw E1BF,0000,0000,0000,2C00,0000,0002,0000 ; Ridley explosion 5 $A6:C9A7 dw E1BF,0000,0000,0000,2C00,0000,0004,0000 ; Ridley explosion 4 $A6:C9B7 dw E1BF,0000,0000,0000,2C00,0000,0006,0000 ; Ridley explosion 3 $A6:C9C7 dw E1BF,0000,0000,0000,2C00,0000,0008,0000 ; Ridley explosion 2 $A6:C9D7 dw E1BF,0000,0000,0000,2C00,0000,000A,0000 ; Ridley explosion 1 $A6:C9E7 dw E1BF,0000,0000,0000,2C00,0000,000C,0000 ; Ridley explosion 0 $A6:C9F7 dw E1BF,0000,0000,0000,2C00,0000,000E,0000 ; Ridley explosion 7 $A6:CA07 dw E1BF,0000,0000,0000,2C00,0000,0010,0000 ; Ridley explosion 8 $A6:CA17 dw E1BF,0000,0000,0000,2C00,0000,0012,0000 ; Ridley explosion A $A6:CA27 dw E1BF,0000,0000,0000,2C00,0000,0014,0000 ; Ridley explosion 9 $A6:CA37 dw E1BF,0000,0000,0000,2C00,0000,0016,0000 ; Ridley explosion B } ;;; $CA47..CAF4: Instruction lists ;;; { ;;; $CA47: Instruction list - ;;; { $A6:CA47 dx 0001,DC90, ; Large tail part 812F ; Sleep } ;;; $CA4D: Instruction list - ;;; { $A6:CA4D dx 0001,DC97, ; Medium tail part 812F ; Sleep } ;;; $CA53: Instruction list - ;;; { $A6:CA53 dx 0001,DC9E, ; Small tail part 812F ; Sleep } ;;; $CA59: Instruction list - ;;; { $A6:CA59 dx 0001,DD4A, ; Wings, facing left, fully raised 812F ; Sleep } ;;; $CA5F: Instruction list - ;;; { $A6:CA5F dx 0001,DDE2, ; Wings, facing right, fully raised 812F ; Sleep } ;;; $CA65: Instruction list - ;;; { $A6:CA65 dx 0001,ED29, ; Legs, facing left, pulled up 812F ; Sleep } ;;; $CA6B: Instruction list - ;;; { $A6:CA6B dx 0001,EF25, ; Legs, facing right, pulled up 812F ; Sleep } ;;; $CA71: Instruction list - ;;; { $A6:CA71 dx 0001,ECDC, ; Head/Neck, facing left, mouth open 812F ; Sleep } ;;; $CA77: Instruction list - ;;; { $A6:CA77 dx 0001,EED8, ; Head/Neck, facing right, mouth open 812F ; Sleep } ;;; $CA7D: Instruction list - ;;; { $A6:CA7D dx 0001,ED95, ; Torso, facing left 812F ; Sleep } ;;; $CA83: Instruction list - ;;; { $A6:CA83 dx 0001,EF91, ; Torso, facing right 812F ; Sleep } ;;; $CA89: Instruction list - ;;; { $A6:CA89 dx 0001,ED8E, ; Claw, facing left 812F ; Sleep } ;;; $CA8F: Instruction list - ;;; { $A6:CA8F dx 0001,EF8A, ; Claw, facing right 812F ; Sleep } ;;; $CA95: Instruction list - ;;; { $A6:CA95 dx 0001,DD2E, ; Tail tip, pointing down 812F ; Sleep } ;;; $CA9B: Instruction list - ;;; { $A6:CA9B dx 0001,DD27, ; Tail tip, pointing down down right 812F ; Sleep } ;;; $CAA1: Instruction list - ;;; { $A6:CAA1 dx 0001,DD20, ; Tail tip, pointing down right 812F ; Sleep } ;;; $CAA7: Instruction list - ;;; { $A6:CAA7 dx 0001,DD19, ; Tail tip, pointing right down right 812F ; Sleep } ;;; $CAAD: Instruction list - ;;; { $A6:CAAD dx 0001,DD12, ; Tail tip, pointing right 812F ; Sleep } ;;; $CAB3: Instruction list - ;;; { $A6:CAB3 dx 0001,DD0B, ; Tail tip, pointing right up right 812F ; Sleep } ;;; $CAB9: Instruction list - ;;; { $A6:CAB9 dx 0001,DD04, ; Tail tip, pointing up right 812F ; Sleep } ;;; $CABF: Instruction list - ;;; { $A6:CABF dx 0001,DCFD, ; Tail tip, pointing up up right 812F ; Sleep } ;;; $CAC5: Instruction list - ;;; { $A6:CAC5 dx 0001,DCF6, ; Tail tip, pointing up 812F ; Sleep } ;;; $CACB: Instruction list - ;;; { $A6:CACB dx 0001,DCEF, ; Tail tip, pointing up up left 812F ; Sleep } ;;; $CAD1: Instruction list - ;;; { $A6:CAD1 dx 0001,DCE8, ; Tail tip, pointing up left 812F ; Sleep } ;;; $CAD7: Instruction list - ;;; { $A6:CAD7 dx 0001,DCE1, ; Tail tip, pointing left up left 812F ; Sleep } ;;; $CADD: Instruction list - ;;; { $A6:CADD dx 0001,DCDA, ; Tail tip, pointing left 812F ; Sleep } ;;; $CAE3: Instruction list - ;;; { $A6:CAE3 dx 0001,DD43, ; Tail tip, pointing left down left 812F ; Sleep } ;;; $CAE9: Instruction list - ;;; { $A6:CAE9 dx 0001,DD3C, ; Tail tip, pointing down left 812F ; Sleep } ;;; $CAEF: Instruction list - ;;; { $A6:CAEF dx 0001,DD35, ; Tail tip, pointing down down left 812F ; Sleep } } } ;;; $CAF5: ;;; { ; Run Tail AI: Sound, control AI, X/Y positions, tail extension, hurt Samus $A6:CAF5 20 AA D2 JSR $D2AA [$A6:D2AA] ; "Play swishing sound if tail is moving quickly" $A6:CAF8 AF 00 20 7E LDA $7E2000[$7E:2000] $A6:CAFC 0A ASL A $A6:CAFD AA TAX $A6:CAFE FC 21 CB JSR ($CB21,x)[$A6:CB20]; execute tail AI $A6:CB01 8B PHB $A6:CB02 F4 7E 7E PEA $7E7E $A6:CB05 AB PLB $A6:CB06 AB PLB $A6:CB07 20 BA CE JSR $CEBA [$A6:CEBA] ; "Update tail positions" $A6:CB0A 20 5A CF JSR $CF5A [$A6:CF5A] ; "Tail extending" $A6:CB0D AB PLB $A6:CB0E AD 86 0F LDA $0F86 [$7E:0F86] $A6:CB11 29 00 04 AND #$0400 ; intangible $A6:CB14 0D A8 18 ORA $18A8 [$7E:18A8] ; Samus invincibility timer $A6:CB17 0F 36 78 7E ORA $7E7836[$7E:7836] ; holding Samus flag $A6:CB1B D0 03 BNE $03 [$CB20] ; if Ridley intangible, holding Samus, or Samus invincible: return $A6:CB1D 4C D9 DF JMP $DFD9 [$A6:DFD9] ; $7E2000 = 0 $A6:CB20 60 RTS ; indexed by $7E2000, tail AI index ; 0 = inactive, 1 = flinging at Samus, 2 = start tailbouncing, 3 = continue start tailbouncing?, 4 = during tailbouncing, 5 = start extending during tailbouncing, 6 = continue extending during tailbouncing, 7 = strict tail bouncing, with extending, 8 = spin tail around madly $A6:CB21 dw CB20 ; RTS CBC0 ; flinging at Samus CB33 ; start tailbouncing CB45 ; still starting tailbouncing CBC7 ; during tailbouncing CBCE ; start extending during tailbouncing CB4E ; continue extending during tailbouncing CB60 ; strict tailbouncing/extending CBD5 ; tail spin } ;;; $CB33: ;;; { ; $7E2000 = 2 ; start tailbouncing $A6:CB33 A9 08 00 LDA #$0008 $A6:CB36 8F 14 20 7E STA $7E2014[$7E:2014] ; tail rotation speed = 8 $A6:CB3A 20 72 CB JSR $CB72 [$A6:CB72] ; "Common tail AI function" $A6:CB3D A9 03 00 LDA #$0003 ; "still starting tailbouncing" $A6:CB40 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "still starting tailbouncing" $A6:CB44 60 RTS } ;;; $CB45: ;;; { ; $7E2000 = 3 ; still starting tailbouncing $A6:CB45 A9 08 00 LDA #$0008 $A6:CB48 8F 14 20 7E STA $7E2014[$7E:2014] ; tail rotation speed = 8 $A6:CB4C 80 24 BRA $24 [$CB72] ; goto "Common tail AI function" } ;;; $CB4E: ;;; { ; $7E2000 = 6 ; continue extending during tailbouncing $A6:CB4E A9 03 00 LDA #$0003 $A6:CB51 8F 14 20 7E STA $7E2014[$7E:2014] ; tail rotation speed = 3 $A6:CB55 20 72 CB JSR $CB72 [$A6:CB72] ; "Common tail AI function" $A6:CB58 A9 06 00 LDA #$0006 $A6:CB5B 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "continue extending during tailbounce" $A6:CB5F 60 RTS } ;;; $CB60: ;;; { ; $7E2000 = 7 ; strict tailbouncing/extending $A6:CB60 A9 02 00 LDA #$0002 $A6:CB63 8F 14 20 7E STA $7E2014[$7E:2014] ; tail rotation speed = 2 $A6:CB67 20 72 CB JSR $CB72 [$A6:CB72] ; "Common tail AI function" $A6:CB6A A9 07 00 LDA #$0007 $A6:CB6D 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "strict tailbouncing/extending" $A6:CB71 60 RTS } ;;; $CB72: ;;; { ; Common tail AI function $A6:CB72 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:CB76 D0 10 BNE $10 [$CB88] ; if facing left: $A6:CB78 A9 00 40 LDA #$4000 $A6:CB7B 8F 1C 20 7E STA $7E201C[$7E:201C] ; counterclockwise target $A6:CB7F A9 FF FF LDA #$FFFF $A6:CB82 8F 1A 20 7E STA $7E201A[$7E:201A] ; no clockwise target angle $A6:CB86 80 0E BRA $0E [$CB96] ; not facing left $A6:CB88 A9 00 40 LDA #$4000 $A6:CB8B 8F 1A 20 7E STA $7E201A[$7E:201A] ; clockwise target angle $A6:CB8F A9 FF FF LDA #$FFFF $A6:CB92 8F 1C 20 7E STA $7E201C[$7E:201C] ; no counterclockwise target $A6:CB96 20 C7 CB JSR $CBC7 [$A6:CBC7] ; "Tail AI: during tailbouncing" $A6:CB99 AF 20 20 7E LDA $7E2020[$7E:2020] $A6:CB9D 0F 34 20 7E ORA $7E2034[$7E:2034] $A6:CBA1 0F 48 20 7E ORA $7E2048[$7E:2048] $A6:CBA5 0F 5C 20 7E ORA $7E205C[$7E:205C] $A6:CBA9 0F 70 20 7E ORA $7E2070[$7E:2070] $A6:CBAD 0F 84 20 7E ORA $7E2084[$7E:2084] $A6:CBB1 0F 98 20 7E ORA $7E2098[$7E:2098] $A6:CBB5 F0 01 BEQ $01 [$CBB8] ; if any tail parts moving: $A6:CBB7 60 RTS ; tail parts moving $A6:CBB8 A9 04 00 LDA #$0004 $A6:CBBB 8F 00 20 7E STA $7E2000[$7E:2000] ; tail AI = "during tailbouncing" $A6:CBBF 60 RTS } ;;; $CBC0: ;;; { ; $7E2000 = 1 ; flinging at Samus $A6:CBC0 A9 39 CC LDA #$CC39 ; "Fling tail at Samus" $A6:CBC3 85 12 STA $12 [$7E:0012] $A6:CBC5 80 15 BRA $15 [$CBDC] ; goto "Execute tail function" } ;;; $CBC7: ;;; { ; $7E2000 = 4 ; during tailbouncing $A6:CBC7 A9 24 CD LDA #$CD24 ; "Tailbouncing" $A6:CBCA 85 12 STA $12 [$7E:0012] $A6:CBCC 80 0E BRA $0E [$CBDC] ; goto "Execute tail function" } ;;; $CBCE: ;;; { ; $7E2000 = 5 ; start extending during tailbouncing $A6:CBCE A9 AA CD LDA #$CDAA ; "Extend tail. Happens only while tail bouncing" $A6:CBD1 85 12 STA $12 [$7E:0012] $A6:CBD3 80 07 BRA $07 [$CBDC] ; goto "Execute tail function" } ;;; $CBD5: ;;; { ; $7E2000 = 8 ; tail spin $A6:CBD5 A9 BD CC LDA #$CCBD ; "Swing tail in circles" $A6:CBD8 85 12 STA $12 [$7E:0012] $A6:CBDA 80 00 BRA $00 [$CBDC] ; >.< } ;;; $CBDC: ;;; { ; Execute tail function $A6:CBDC 8B PHB $A6:CBDD F4 7E 7E PEA $7E7E $A6:CBE0 AB PLB $A6:CBE1 AB PLB $A6:CBE2 F4 E7 CB PEA $CBE7 $A6:CBE5 6C 12 00 JMP ($0012)[$A6:CC39] ; PEA return $A6:CBE8 A9 07 00 LDA #$0007 $A6:CBEB A2 00 00 LDX #$0000 $A6:CBEE 48 PHA ; loop counter $A6:CBEF 20 9F D0 JSR $D09F [$A6:D09F] $A6:CBF2 8A TXA $A6:CBF3 18 CLC $A6:CBF4 69 14 00 ADC #$0014 $A6:CBF7 AA TAX ; X =+ $14 $A6:CBF8 68 PLA $A6:CBF9 3A DEC A $A6:CBFA D0 F2 BNE $F2 [$CBEE] ; if loop counter = 0: $A6:CBFC AB PLB $A6:CBFD 60 RTS } ;;; $CBFE: ;;; { ; Set min and max tail angles based on direction $A6:CBFE AD 20 78 LDA $7820 [$7E:7820] ; Ridley direction $A6:CC01 0A ASL A $A6:CC02 AA TAX $A6:CC03 BF 12 CC A6 LDA $A6CC12,x[$A6:CC12] $A6:CC07 8D 16 20 STA $2016 [$7E:2016] ; minimum clockwise angle $A6:CC0A BF 18 CC A6 LDA $A6CC18,x[$A6:CC18] $A6:CC0E 8D 18 20 STA $2018 [$7E:2018] ; maximum clockwise angle $A6:CC11 60 RTS ; indexed by facing direction $A6:CC12 dw 3FF0, 3FF0, 3FC0 ; min $A6:CC18 dw 4040, 4040, 4010 ; max } ;;; $CC1E: ;;; { ; SEC if all tail parts are rotating, else CLC $A6:CC1E AD 20 20 LDA $2020 [$7E:2020] $A6:CC21 2D 34 20 AND $2034 [$7E:2034] $A6:CC24 2D 48 20 AND $2048 [$7E:2048] $A6:CC27 2D 5C 20 AND $205C [$7E:205C] $A6:CC2A 2D 70 20 AND $2070 [$7E:2070] $A6:CC2D 2D 84 20 AND $2084 [$7E:2084] $A6:CC30 2D 98 20 AND $2098 [$7E:2098] $A6:CC33 F0 02 BEQ $02 [$CC37] ; if all tail parts rotating: $A6:CC35 38 SEC $A6:CC36 60 RTS ; not all rotating $A6:CC37 18 CLC $A6:CC38 60 RTS } ;;; $CC39: ;;; { ; Fling tail at Samus ; Setup max angles (CBFE), then if tail is 'prepped' (all tail parts rotating, target angle not set yet, $2004 (trigger?) is set), target an angle ; Target angle is first projectile near tail tip, in a 8x8 tile square centered on tail tip, or Samus. Max rotational speed, 8 ; If no tail parts are currently moving, start the first one moving $A6:CC39 20 FE CB JSR $CBFE [$A6:CBFE] ; "Set min and max tail angles based on direction" $A6:CC3C 20 1E CC JSR $CC1E [$A6:CC1E] ; "SEC if all tail parts are rotating, else CLC" $A6:CC3F 90 03 BCC $03 [$CC44] $A6:CC41 20 7D CC JSR $CC7D [$A6:CC7D] ; "Handle tail fling trigger, can pull return address" ; not all parts rotating $A6:CC44 AD 20 20 LDA $2020 [$7E:2020] $A6:CC47 0D 34 20 ORA $2034 [$7E:2034] $A6:CC4A 0D 48 20 ORA $2048 [$7E:2048] $A6:CC4D 0D 5C 20 ORA $205C [$7E:205C] $A6:CC50 0D 70 20 ORA $2070 [$7E:2070] $A6:CC53 0D 84 20 ORA $2084 [$7E:2084] $A6:CC56 0D 98 20 ORA $2098 [$7E:2098] $A6:CC59 F0 01 BEQ $01 [$CC5C] ; if any tail parts moving: $A6:CC5B 60 RTS ; no tail parts moving $A6:CC5C A9 00 80 LDA #$8000 $A6:CC5F 8D 20 20 STA $2020 [$7E:2020] ; first tail part = moving $A6:CC62 A9 FF FF LDA #$FFFF $A6:CC65 8D 1A 20 STA $201A [$7E:201A] $A6:CC68 8D 1C 20 STA $201C [$7E:201C] ; disable targets angles $A6:CC6B A9 02 00 LDA #$0002 $A6:CC6E AC F6 0A LDY $0AF6 [$7E:0AF6] $A6:CC71 C0 70 00 CPY #$0070 $A6:CC74 B0 03 BCS $03 [$CC79] ; if Samus X position < $70: $A6:CC76 A9 01 00 LDA #$0001 ; Samus not left side of room $A6:CC79 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed $A6:CC7C 60 RTS } ;;; $CC7D: ;;; { ; handle tail fling trigger ; can pull return address off stack $A6:CC7D AD 04 20 LDA $2004 [$7E:2004] $A6:CC80 F0 08 BEQ $08 [$CC8A] ; if tail fling trigger != 0: $A6:CC82 AD 1C 20 LDA $201C [$7E:201C] $A6:CC85 2D 1A 20 AND $201A [$7E:201A] $A6:CC88 30 27 BMI $27 [$CCB1] ; if optional target angle: ; not flinging tail $A6:CC8A AD 02 20 LDA $2002 [$7E:2002] ; only zero during Ceres swoops, back to 1 after swoop fling $A6:CC8D F0 2A BEQ $2A [$CCB9] ; if not swooping: (to sync next fling with swoop?) $A6:CC8F AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:CC92 29 FF 00 AND #$00FF $A6:CC95 C9 F0 00 CMP #$00F0 $A6:CC98 B0 17 BCS $17 [$CCB1] ; if not 6.25% chance: $A6:CC9A AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:CC9D 38 SEC $A6:CC9E ED 7A 0F SBC $0F7A [$7E:0F7A] $A6:CCA1 10 04 BPL $04 [$CCA7] ; if Samus is left of Ridley: $A6:CCA3 49 FF FF EOR #$FFFF $A6:CCA6 1A INC A ; right of Ridley $A6:CCA7 C9 80 00 CMP #$0080 $A6:CCAA B0 0D BCS $0D [$CCB9] $A6:CCAC A9 00 00 LDA #$0000 $A6:CCAF 80 04 BRA $04 [$CCB5] ; skip range check $A6:CCB1 AD 04 20 LDA $2004 [$7E:2004] $A6:CCB4 3A DEC A $A6:CCB5 20 9D D1 JSR $D19D [$A6:D19D] ; "Target an angle (towards a missile or Samus) for tail" $A6:CCB8 68 PLA ; pull return address to skip out of $CC39 "Fling tail at Samus" $A6:CCB9 9C 04 20 STZ $2004 [$7E:2004] ; reset tail fling trigger $A6:CCBC 60 RTS } ;;; $CCBD: ;;; { ; Swing tail in circles $A6:CCBD 20 FE CB JSR $CBFE [$A6:CBFE] ; "Set min and max tail angles based on direction" $A6:CCC0 20 1E CC JSR $CC1E [$A6:CC1E] ; "SEC if all tail parts are rotating, else CLC" $A6:CCC3 90 03 BCC $03 [$CCC8] ; if all tail parts rotating: $A6:CCC5 20 0C CD JSR $CD0C [$A6:CD0C] ; "tail fling while swinging tail, can pull return address" ; not all parts rotating $A6:CCC8 AF 20 20 7E LDA $7E2020[$7E:2020] $A6:CCCC 0F 34 20 7E ORA $7E2034[$7E:2034] $A6:CCD0 0F 48 20 7E ORA $7E2048[$7E:2048] $A6:CCD4 0F 5C 20 7E ORA $7E205C[$7E:205C] $A6:CCD8 0F 70 20 7E ORA $7E2070[$7E:2070] $A6:CCDC 0F 84 20 7E ORA $7E2084[$7E:2084] $A6:CCE0 0F 98 20 7E ORA $7E2098[$7E:2098] $A6:CCE4 F0 01 BEQ $01 [$CCE7] ; if any tail parts moving: $A6:CCE6 60 RTS ; no tail parts moving $A6:CCE7 A9 00 80 LDA #$8000 $A6:CCEA 8F 20 20 7E STA $7E2020[$7E:2020] $A6:CCEE A9 FF FF LDA #$FFFF $A6:CCF1 8F 1A 20 7E STA $7E201A[$7E:201A] $A6:CCF5 8F 1C 20 7E STA $7E201C[$7E:201C] $A6:CCF9 A9 02 00 LDA #$0002 $A6:CCFC AC F6 0A LDY $0AF6 [$7E:0AF6] ; Samus X position $A6:CCFF C0 70 00 CPY #$0070 $A6:CD02 B0 03 BCS $03 [$CD07] ; if Samus X position < $70: $A6:CD04 A9 01 00 LDA #$0001 $A6:CD07 8F 14 20 7E STA $7E2014[$7E:2014] ; tail rotation speed $A6:CD0B 60 RTS } ;;; $CD0C: ;;; { ; tail fling while swinging tail ; can pull return address off stack $A6:CD0C AD 04 20 LDA $2004 [$7E:2004] $A6:CD0F F0 12 BEQ $12 [$CD23] ; if tail fling triggered: $A6:CD11 AD 1C 20 LDA $201C [$7E:201C] $A6:CD14 2D 1A 20 AND $201A [$7E:201A] $A6:CD17 10 0A BPL $0A [$CD23] ; something about angle $A6:CD19 A9 01 00 LDA #$0001 ; 1 circle before fling $A6:CD1C 20 9D D1 JSR $D19D [$A6:D19D] ; "Target an angle (towards a missile or Samus) for tail" $A6:CD1F 68 PLA ; pull return address to skip out of $CCBD (Swing tail in circles) $A6:CD20 9C 04 20 STZ $2004 [$7E:2004] $A6:CD23 60 RTS } ;;; $CD24: ;;; { ; Tail bouncing $A6:CD24 20 FE CB JSR $CBFE [$A6:CBFE] ; "Set min and max tail angles based on direction" $A6:CD27 20 1E CC JSR $CC1E [$A6:CC1E] ; "SEC if all tail parts are rotating, else CLC" $A6:CD2A 90 33 BCC $33 [$CD5F] ; if all tail parts rotating: $A6:CD2C AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:CD2F 29 FF 00 AND #$00FF $A6:CD32 C9 F0 00 CMP #$00F0 $A6:CD35 B0 13 BCS $13 [$CD4A] ; if random number < $F0: $A6:CD37 AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X Position $A6:CD3A 38 SEC $A6:CD3B EF 7A 0F 00 SBC $000F7A[$7E:0F7A] ; Ridley X position >.< $A6:CD3F 10 04 BPL $04 [$CD45] ; if Samus X < Ridley X $A6:CD41 49 FF FF EOR #$FFFF $A6:CD44 1A INC A ; Samus on right $A6:CD45 C9 80 00 CMP #$0080 $A6:CD48 B0 15 BCS $15 [$CD5F] ; randomly skip distance check $A6:CD4A AD 1C 20 LDA $201C [$7E:201C] $A6:CD4D 2D 1A 20 AND $201A [$7E:201A] $A6:CD50 10 0D BPL $0D [$CD5F] $A6:CD52 A9 00 3F LDA #$3F00 $A6:CD55 8D 1A 20 STA $201A [$7E:201A] $A6:CD58 A9 08 00 LDA #$0008 $A6:CD5B 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed = 8 $A6:CD5E 60 RTS $A6:CD5F AD 20 20 LDA $2020 [$7E:2020] $A6:CD62 0D 34 20 ORA $2034 [$7E:2034] $A6:CD65 0D 48 20 ORA $2048 [$7E:2048] $A6:CD68 0D 5C 20 ORA $205C [$7E:205C] $A6:CD6B 0D 70 20 ORA $2070 [$7E:2070] $A6:CD6E 0D 84 20 ORA $2084 [$7E:2084] $A6:CD71 0D 98 20 ORA $2098 [$7E:2098] $A6:CD74 F0 01 BEQ $01 [$CD77] ; if any tail parts moving: $A6:CD76 60 RTS ; tail parts moving $A6:CD77 2C AC 0F BIT $0FAC [$7E:0FAC] ; Ridley Y speed $A6:CD7A 30 06 BMI $06 [$CD82] ; if moving downward: $A6:CD7C A9 05 00 LDA #$0005 $A6:CD7F 8D 00 20 STA $2000 [$7E:2000] ; tail AI = "start extending during tailbouncing" ; moving up $A6:CD82 A9 FF FF LDA #$FFFF $A6:CD85 8D 1A 20 STA $201A [$7E:201A] $A6:CD88 8D 1C 20 STA $201C [$7E:201C] $A6:CD8B AD 10 20 LDA $2010 [$7E:2010] $A6:CD8E D0 04 BNE $04 [$CD94] ; if movement timer = 0: $A6:CD90 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed $A6:CD93 60 RTS $A6:CD94 3A DEC A $A6:CD95 8D 10 20 STA $2010 [$7E:2010] $A6:CD98 D0 F6 BNE $F6 [$CD90] $A6:CD9A A9 00 80 LDA #$8000 $A6:CD9D 8D 20 20 STA $2020 [$7E:2020] ; first tail part is moving $A6:CDA0 20 65 CE JSR $CE65 [$A6:CE65] ; "Set angles to 40XX, XX is previous angle (fifth part is actually first part's 40XX)" $A6:CDA3 A9 08 00 LDA #$0008 $A6:CDA6 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed = 8 $A6:CDA9 60 RTS } ;;; $CDAA: ;;; { ; Extend tail. Happens only while tail bouncing, moving downwards, and no tail parts currently rotating $A6:CDAA 20 FE CB JSR $CBFE [$A6:CBFE] ; "Set min and max tail angles based on direction" $A6:CDAD 20 1E CC JSR $CC1E [$A6:CC1E] ; "SEC if all tail parts are rotating, else CLC" $A6:CDB0 90 33 BCC $33 [$CDE5] $A6:CDB2 AD E5 05 LDA $05E5 [$7E:05E5] ; random number $A6:CDB5 29 FF 00 AND #$00FF $A6:CDB8 C9 F0 00 CMP #$00F0 $A6:CDBB B0 13 BCS $13 [$CDD0] ; if random number < $F0: $A6:CDBD AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:CDC0 38 SEC $A6:CDC1 EF 7A 0F 00 SBC $000F7A[$7E:0F7A] ; Ridley X position >.< $A6:CDC5 10 04 BPL $04 [$CDCB] ; if Samus X < Ridley X $A6:CDC7 49 FF FF EOR #$FFFF $A6:CDCA 1A INC A ; Samus on right $A6:CDCB C9 80 00 CMP #$0080 $A6:CDCE B0 15 BCS $15 [$CDE5] ; randomly skip distance check $A6:CDD0 AD 1C 20 LDA $201C [$7E:201C] $A6:CDD3 2D 1A 20 AND $201A [$7E:201A] $A6:CDD6 10 0D BPL $0D [$CDE5] $A6:CDD8 A9 00 3F LDA #$3F00 $A6:CDDB 8D 1A 20 STA $201A [$7E:201A] $A6:CDDE A9 08 00 LDA #$0008 $A6:CDE1 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed = 8 $A6:CDE4 60 RTS ; check if tail parts moving $A6:CDE5 AD 20 20 LDA $2020 [$7E:2020] $A6:CDE8 0D 34 20 ORA $2034 [$7E:2034] $A6:CDEB 0D 48 20 ORA $2048 [$7E:2048] $A6:CDEE 0D 5C 20 ORA $205C [$7E:205C] $A6:CDF1 0D 70 20 ORA $2070 [$7E:2070] $A6:CDF4 0D 84 20 ORA $2084 [$7E:2084] $A6:CDF7 0D 98 20 ORA $2098 [$7E:2098] $A6:CDFA F0 01 BEQ $01 [$CDFD] ; if all tail parts not moving: $A6:CDFC 60 RTS ; tail part moving $A6:CDFD 2C AC 0F BIT $0FAC [$7E:0FAC] $A6:CE00 30 3C BMI $3C [$CE3E] ; if Ridley moving down: $A6:CE02 A9 06 00 LDA #$0006 $A6:CE05 8D 00 20 STA $2000 [$7E:2000] ; tail AI = "continue extending during tailbouncing" $A6:CE08 A9 00 0A LDA #$0A00 $A6:CE0B 8D 28 20 STA $2028 [$7E:2028] $A6:CE0E 8D 3C 20 STA $203C [$7E:203C] $A6:CE11 8D 50 20 STA $2050 [$7E:2050] $A6:CE14 8D 64 20 STA $2064 [$7E:2064] $A6:CE17 8D 78 20 STA $2078 [$7E:2078] $A6:CE1A 8D 8C 20 STA $208C [$7E:208C] $A6:CE1D 8D A0 20 STA $20A0 [$7E:20A0] $A6:CE20 A9 00 40 LDA #$4000 $A6:CE23 8D 2A 20 STA $202A [$7E:202A] $A6:CE26 8D 3E 20 STA $203E [$7E:203E] $A6:CE29 8D 52 20 STA $2052 [$7E:2052] $A6:CE2C 8D 66 20 STA $2066 [$7E:2066] $A6:CE2F 8D 7A 20 STA $207A [$7E:207A] $A6:CE32 8D 8E 20 STA $208E [$7E:208E] $A6:CE35 8D A2 20 STA $20A2 [$7E:20A2] $A6:CE38 A9 00 80 LDA #$8000 $A6:CE3B 8D 20 20 STA $2020 [$7E:2020] ; Ridley moving up $A6:CE3E A9 FF FF LDA #$FFFF $A6:CE41 8D 1A 20 STA $201A [$7E:201A] $A6:CE44 8D 1C 20 STA $201C [$7E:201C] $A6:CE47 AD 10 20 LDA $2010 [$7E:2010] $A6:CE4A D0 03 BNE $03 [$CE4F] ; if timer til tail part moves = 0: $A6:CE4C 4C 61 CE JMP $CE61 [$A6:CE61] ; >.< why not branch? $A6:CE4F 3A DEC A $A6:CE50 8D 10 20 STA $2010 [$7E:2010] ; decrement timer $A6:CE53 D0 0C BNE $0C [$CE61] ; if timer til tail part moves = 0: $A6:CE55 A9 00 80 LDA #$8000 $A6:CE58 8D 20 20 STA $2020 [$7E:2020] ; set first tail piece to moving $A6:CE5B 20 65 CE JSR $CE65 [$A6:CE65] ; "Set angles to 40XX, XX is previous angle (fifth part is actually first part's 40XX)" $A6:CE5E A9 08 00 LDA #$0008 $A6:CE61 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed $A6:CE64 60 RTS } ;;; $CE65: ;;; { ; Set angles to 40XX, XX is previous angle (fifth part is actually first part's 40XX) $A6:CE65 AD 2A 20 LDA $202A [$7E:202A] $A6:CE68 29 FF 00 AND #$00FF $A6:CE6B 09 00 40 ORA #$4000 $A6:CE6E 8D 2A 20 STA $202A [$7E:202A] $A6:CE71 AD 3E 20 LDA $203E [$7E:203E] $A6:CE74 29 FF 00 AND #$00FF $A6:CE77 09 00 40 ORA #$4000 $A6:CE7A 8D 3E 20 STA $203E [$7E:203E] $A6:CE7D AD 52 20 LDA $2052 [$7E:2052] $A6:CE80 29 FF 00 AND #$00FF $A6:CE83 09 00 40 ORA #$4000 $A6:CE86 8D 52 20 STA $2052 [$7E:2052] $A6:CE89 AD 66 20 LDA $2066 [$7E:2066] $A6:CE8C 29 FF 00 AND #$00FF $A6:CE8F 09 00 40 ORA #$4000 $A6:CE92 8D 66 20 STA $2066 [$7E:2066] $A6:CE95 AD 2A 20 LDA $202A [$7E:202A] $A6:CE98 29 FF 04 AND #$04FF $A6:CE9B 09 00 40 ORA #$4000 $A6:CE9E 8D 7A 20 STA $207A [$7E:207A] $A6:CEA1 AD 8E 20 LDA $208E [$7E:208E] $A6:CEA4 29 FF 00 AND #$00FF $A6:CEA7 09 00 40 ORA #$4000 $A6:CEAA 8D 8E 20 STA $208E [$7E:208E] $A6:CEAD AD A2 20 LDA $20A2 [$7E:20A2] $A6:CEB0 29 FF 00 AND #$00FF $A6:CEB3 09 00 40 ORA #$4000 $A6:CEB6 8D A2 20 STA $20A2 [$7E:20A2] $A6:CEB9 60 RTS } ;;; $CEBA: ;;; { ; Update tail positions $A6:CEBA AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:CEBD 18 CLC $A6:CEBE 6D 32 20 ADC $2032 [$7E:2032] $A6:CEC1 18 CLC $A6:CEC2 69 10 00 ADC #$0010 $A6:CEC5 8D 2E 20 STA $202E [$7E:202E] $A6:CEC8 18 CLC $A6:CEC9 6D 46 20 ADC $2046 [$7E:2046] $A6:CECC 8D 42 20 STA $2042 [$7E:2042] $A6:CECF 18 CLC $A6:CED0 6D 5A 20 ADC $205A [$7E:205A] $A6:CED3 8D 56 20 STA $2056 [$7E:2056] $A6:CED6 18 CLC $A6:CED7 6D 6E 20 ADC $206E [$7E:206E] $A6:CEDA 8D 6A 20 STA $206A [$7E:206A] $A6:CEDD 18 CLC $A6:CEDE 6D 82 20 ADC $2082 [$7E:2082] $A6:CEE1 8D 7E 20 STA $207E [$7E:207E] $A6:CEE4 18 CLC $A6:CEE5 6D 96 20 ADC $2096 [$7E:2096] $A6:CEE8 8D 92 20 STA $2092 [$7E:2092] $A6:CEEB 18 CLC $A6:CEEC 6D AA 20 ADC $20AA [$7E:20AA] $A6:CEEF 8D A6 20 STA $20A6 [$7E:20A6] $A6:CEF2 AD 20 78 LDA $7820 [$7E:7820] $A6:CEF5 3A DEC A $A6:CEF6 F0 0A BEQ $0A [$CF02] ; if facing not forward: $A6:CEF8 1A INC A $A6:CEF9 0A ASL A $A6:CEFA AA TAX $A6:CEFB BF 54 CF A6 LDA $A6CF54,x[$A6:CF54] $A6:CEFF 6D 30 20 ADC $2030 [$7E:2030] $A6:CF02 18 CLC $A6:CF03 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:CF06 8D 2C 20 STA $202C [$7E:202C] $A6:CF09 AD 20 78 LDA $7820 [$7E:7820] $A6:CF0C 3A DEC A $A6:CF0D D0 17 BNE $17 [$CF26] ; if facing forward: $A6:CF0F AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:CF12 8D 40 20 STA $2040 [$7E:2040] $A6:CF15 8D 54 20 STA $2054 [$7E:2054] $A6:CF18 8D 68 20 STA $2068 [$7E:2068] $A6:CF1B 8D 7C 20 STA $207C [$7E:207C] $A6:CF1E 8D 90 20 STA $2090 [$7E:2090] $A6:CF21 8D A4 20 STA $20A4 [$7E:20A4] $A6:CF24 80 2D BRA $2D [$CF53] $A6:CF26 AD 2C 20 LDA $202C [$7E:202C] $A6:CF29 18 CLC $A6:CF2A 6D 44 20 ADC $2044 [$7E:2044] $A6:CF2D 8D 40 20 STA $2040 [$7E:2040] $A6:CF30 18 CLC $A6:CF31 6D 58 20 ADC $2058 [$7E:2058] $A6:CF34 8D 54 20 STA $2054 [$7E:2054] $A6:CF37 18 CLC $A6:CF38 6D 6C 20 ADC $206C [$7E:206C] $A6:CF3B 8D 68 20 STA $2068 [$7E:2068] $A6:CF3E 18 CLC $A6:CF3F 6D 80 20 ADC $2080 [$7E:2080] $A6:CF42 8D 7C 20 STA $207C [$7E:207C] $A6:CF45 18 CLC $A6:CF46 6D 94 20 ADC $2094 [$7E:2094] $A6:CF49 8D 90 20 STA $2090 [$7E:2090] $A6:CF4C 18 CLC $A6:CF4D 6D A8 20 ADC $20A8 [$7E:20A8] $A6:CF50 8D A4 20 STA $20A4 [$7E:20A4] $A6:CF53 60 RTS ; X position offsets $A6:CF54 dw 0020, 0000, FFE0 } ;;; $CF5A: ;;; { ; Tail extending $A6:CF5A AD 3C 20 LDA $203C [$7E:203C] $A6:CF5D F0 1F BEQ $1F [$CF7E] ; if not reached target distance from previous tail part: $A6:CF5F CD 3A 20 CMP $203A [$7E:203A] $A6:CF62 10 06 BPL $06 [$CF6A] $A6:CF64 A9 00 00 LDA #$0000 $A6:CF67 8D 3C 20 STA $203C [$7E:203C] $A6:CF6A AD 3A 20 LDA $203A [$7E:203A] $A6:CF6D 18 CLC $A6:CF6E 6D 12 20 ADC $2012 [$7E:2012] $A6:CF71 C9 00 18 CMP #$1800 $A6:CF74 30 03 BMI $03 [$CF79] $A6:CF76 A9 00 18 LDA #$1800 $A6:CF79 8D 3A 20 STA $203A [$7E:203A] $A6:CF7C 80 12 BRA $12 [$CF90] ; reached target distance from previous tail part $A6:CF7E A9 00 08 LDA #$0800 $A6:CF81 CD 3A 20 CMP $203A [$7E:203A] $A6:CF84 10 0A BPL $0A [$CF90] $A6:CF86 AD 3A 20 LDA $203A [$7E:203A] $A6:CF89 38 SEC $A6:CF8A E9 80 00 SBC #$0080 $A6:CF8D 8D 3A 20 STA $203A [$7E:203A] $A6:CF90 AD 50 20 LDA $2050 [$7E:2050] $A6:CF93 F0 1F BEQ $1F [$CFB4] ; if not reached target distance from previous tail part: $A6:CF95 CD 4E 20 CMP $204E [$7E:204E] $A6:CF98 10 06 BPL $06 [$CFA0] $A6:CF9A A9 00 00 LDA #$0000 $A6:CF9D 8D 50 20 STA $2050 [$7E:2050] $A6:CFA0 AD 4E 20 LDA $204E [$7E:204E] $A6:CFA3 18 CLC $A6:CFA4 6D 12 20 ADC $2012 [$7E:2012] $A6:CFA7 C9 00 18 CMP #$1800 $A6:CFAA 30 03 BMI $03 [$CFAF] $A6:CFAC A9 00 18 LDA #$1800 $A6:CFAF 8D 4E 20 STA $204E [$7E:204E] $A6:CFB2 80 12 BRA $12 [$CFC6] ; reached target distance from previous tail part $A6:CFB4 A9 00 08 LDA #$0800 $A6:CFB7 CD 4E 20 CMP $204E [$7E:204E] $A6:CFBA 10 0A BPL $0A [$CFC6] $A6:CFBC AD 4E 20 LDA $204E [$7E:204E] $A6:CFBF 38 SEC $A6:CFC0 E9 80 00 SBC #$0080 $A6:CFC3 8D 4E 20 STA $204E [$7E:204E] $A6:CFC6 AD 64 20 LDA $2064 [$7E:2064] $A6:CFC9 F0 1F BEQ $1F [$CFEA] ; if not reached target distance from previous tail part: $A6:CFCB CD 62 20 CMP $2062 [$7E:2062] $A6:CFCE 10 06 BPL $06 [$CFD6] $A6:CFD0 A9 00 00 LDA #$0000 $A6:CFD3 8D 64 20 STA $2064 [$7E:2064] $A6:CFD6 AD 62 20 LDA $2062 [$7E:2062] $A6:CFD9 18 CLC $A6:CFDA 6D 12 20 ADC $2012 [$7E:2012] $A6:CFDD C9 00 16 CMP #$1600 $A6:CFE0 30 03 BMI $03 [$CFE5] $A6:CFE2 A9 00 16 LDA #$1600 $A6:CFE5 8D 62 20 STA $2062 [$7E:2062] $A6:CFE8 80 12 BRA $12 [$CFFC] ; reached target distance from previous tail part $A6:CFEA A9 00 08 LDA #$0800 $A6:CFED CD 62 20 CMP $2062 [$7E:2062] $A6:CFF0 10 0A BPL $0A [$CFFC] $A6:CFF2 AD 62 20 LDA $2062 [$7E:2062] $A6:CFF5 38 SEC $A6:CFF6 E9 80 00 SBC #$0080 $A6:CFF9 8D 62 20 STA $2062 [$7E:2062] $A6:CFFC AD 78 20 LDA $2078 [$7E:2078] $A6:CFFF F0 1F BEQ $1F [$D020] ; if not reached target distance from previous tail part: $A6:D001 CD 76 20 CMP $2076 [$7E:2076] $A6:D004 10 06 BPL $06 [$D00C] $A6:D006 A9 00 00 LDA #$0000 $A6:D009 8D 78 20 STA $2078 [$7E:2078] $A6:D00C AD 76 20 LDA $2076 [$7E:2076] $A6:D00F 18 CLC $A6:D010 6D 12 20 ADC $2012 [$7E:2012] $A6:D013 C9 00 16 CMP #$1600 $A6:D016 30 03 BMI $03 [$D01B] $A6:D018 A9 00 16 LDA #$1600 $A6:D01B 8D 76 20 STA $2076 [$7E:2076] $A6:D01E 80 12 BRA $12 [$D032] ; reached target distance from previous tail part $A6:D020 A9 00 08 LDA #$0800 $A6:D023 CD 76 20 CMP $2076 [$7E:2076] $A6:D026 10 0A BPL $0A [$D032] $A6:D028 AD 76 20 LDA $2076 [$7E:2076] $A6:D02B 38 SEC $A6:D02C E9 80 00 SBC #$0080 $A6:D02F 8D 76 20 STA $2076 [$7E:2076] $A6:D032 AD 8C 20 LDA $208C [$7E:208C] $A6:D035 F0 1F BEQ $1F [$D056] ; if not reached target distance from previous tail part: $A6:D037 CD 8A 20 CMP $208A [$7E:208A] $A6:D03A 10 06 BPL $06 [$D042] $A6:D03C A9 00 00 LDA #$0000 $A6:D03F 8D 8C 20 STA $208C [$7E:208C] $A6:D042 AD 8A 20 LDA $208A [$7E:208A] $A6:D045 18 CLC $A6:D046 6D 12 20 ADC $2012 [$7E:2012] $A6:D049 C9 00 12 CMP #$1200 $A6:D04C 30 03 BMI $03 [$D051] $A6:D04E A9 00 12 LDA #$1200 $A6:D051 8D 8A 20 STA $208A [$7E:208A] $A6:D054 80 12 BRA $12 [$D068] ; reached target distance from previous tail part $A6:D056 A9 00 08 LDA #$0800 $A6:D059 CD 8A 20 CMP $208A [$7E:208A] $A6:D05C 10 0A BPL $0A [$D068] $A6:D05E AD 8A 20 LDA $208A [$7E:208A] $A6:D061 38 SEC $A6:D062 E9 80 00 SBC #$0080 $A6:D065 8D 8A 20 STA $208A [$7E:208A] $A6:D068 AD A0 20 LDA $20A0 [$7E:20A0] $A6:D06B F0 1F BEQ $1F [$D08C] ; if not reached target distance from previous tail part: $A6:D06D CD 9E 20 CMP $209E [$7E:209E] $A6:D070 10 06 BPL $06 [$D078] $A6:D072 A9 00 00 LDA #$0000 $A6:D075 8D A0 20 STA $20A0 [$7E:20A0] $A6:D078 AD 9E 20 LDA $209E [$7E:209E] $A6:D07B 18 CLC $A6:D07C 6D 12 20 ADC $2012 [$7E:2012] $A6:D07F C9 00 05 CMP #$0500 $A6:D082 30 03 BMI $03 [$D087] $A6:D084 A9 00 05 LDA #$0500 $A6:D087 8D 9E 20 STA $209E [$7E:209E] $A6:D08A 80 12 BRA $12 [$D09E] ; reached target distance from previous tail part $A6:D08C A9 00 05 LDA #$0500 $A6:D08F CD 9E 20 CMP $209E [$7E:209E] $A6:D092 10 0A BPL $0A [$D09E] $A6:D094 AD 9E 20 LDA $209E [$7E:209E] $A6:D097 38 SEC $A6:D098 E9 80 00 SBC #$0080 $A6:D09B 8D 9E 20 STA $209E [$7E:209E] $A6:D09E 60 RTS } ;;; $D09F: ;;; { $A6:D09F BD 20 20 LDA $2020,x[$7E:2020] $A6:D0A2 30 21 BMI $21 [$D0C5] ; if tail part is not moving: $A6:D0A4 BD 2A 20 LDA $202A,x[$7E:202A] $A6:D0A7 4C 6D D1 JMP $D16D [$A6:D16D] ; stop tail part movement $A6:D0AA 9E 20 20 STZ $2020,x[$7E:2020] ; tail part = not moving $A6:D0AD 9E 22 20 STZ $2022,x[$7E:2022] $A6:D0B0 BD 24 20 LDA $2024,x[$7E:2024] $A6:D0B3 49 00 80 EOR #$8000 $A6:D0B6 9D 24 20 STA $2024,x[$7E:2024] ; tail part rotation = clockwise $A6:D0B9 60 RTS $A6:D0BA BD 22 20 LDA $2022,x[$7E:2022] $A6:D0BD 18 CLC $A6:D0BE 6D 14 20 ADC $2014 [$7E:2014] $A6:D0C1 9D 22 20 STA $2022,x[$7E:2022] $A6:D0C4 60 RTS ; tail part moving $A6:D0C5 BD 22 20 LDA $2022,x[$7E:2022] $A6:D0C8 CD 1E 20 CMP $201E [$7E:201E] $A6:D0CB 90 ED BCC $ED [$D0BA] $A6:D0CD C9 FF FF CMP #$FFFF $A6:D0D0 F0 12 BEQ $12 [$D0E4] $A6:D0D2 A9 FF FF LDA #$FFFF $A6:D0D5 9D 22 20 STA $2022,x[$7E:2022] $A6:D0D8 A9 00 80 LDA #$8000 $A6:D0DB 9D 34 20 STA $2034,x[$7E:2034] $A6:D0DE BD 24 20 LDA $2024,x[$7E:2024] $A6:D0E1 9D 38 20 STA $2038,x[$7E:2038] ; next tail part rotation = current tail part rotation $A6:D0E4 BD 24 20 LDA $2024,x[$7E:2024] $A6:D0E7 30 3F BMI $3F [$D128] ; if tail part rotation = counterclockwise: $A6:D0E9 AD 1C 20 LDA $201C [$7E:201C] $A6:D0EC 30 23 BMI $23 [$D111] $A6:D0EE A9 00 0C LDA #$0C00 $A6:D0F1 9D 28 20 STA $2028,x[$7E:208C] $A6:D0F4 BD 2A 20 LDA $202A,x[$7E:208E] $A6:D0F7 18 CLC $A6:D0F8 6D 14 20 ADC $2014 [$7E:2014] $A6:D0FB CD 1C 20 CMP $201C [$7E:201C] $A6:D0FE 30 6A BMI $6A [$D16A] $A6:D100 8A TXA $A6:D101 F0 05 BEQ $05 [$D108] $A6:D103 BD 0C 20 LDA $200C,x[$7E:2070] $A6:D106 D0 15 BNE $15 [$D11D] ; if tail part is not moving: $A6:D108 AD 1C 20 LDA $201C [$7E:201C] $A6:D10B 9D 2A 20 STA $202A,x[$7E:202A] $A6:D10E 4C AA D0 JMP $D0AA [$A6:D0AA] ; no counterclockwise target $A6:D111 BD 2A 20 LDA $202A,x[$7E:202A] $A6:D114 18 CLC $A6:D115 6D 14 20 ADC $2014 [$7E:2014] $A6:D118 CD 18 20 CMP $2018 [$7E:2018] $A6:D11B 30 4D BMI $4D [$D16A] ; tail part moving $A6:D11D A9 00 80 LDA #$8000 $A6:D120 9D 24 20 STA $2024,x[$7E:2024] ; tail part rotation = clockwise $A6:D123 AD 18 20 LDA $2018 [$7E:2018] $A6:D126 80 42 BRA $42 [$D16A] ; clockwise rotation $A6:D128 AD 1A 20 LDA $201A [$7E:201A] $A6:D12B 30 24 BMI $24 [$D151] $A6:D12D A9 00 0C LDA #$0C00 $A6:D130 9D 28 20 STA $2028,x[$7E:2064] $A6:D133 BD 2A 20 LDA $202A,x[$7E:2066] $A6:D136 38 SEC $A6:D137 ED 14 20 SBC $2014 [$7E:2014] $A6:D13A 3A DEC A $A6:D13B CD 1A 20 CMP $201A [$7E:201A] $A6:D13E 10 29 BPL $29 [$D169] $A6:D140 8A TXA $A6:D141 F0 05 BEQ $05 [$D148] $A6:D143 BD 0C 20 LDA $200C,x[$7E:2048] $A6:D146 D0 16 BNE $16 [$D15E] ; if tail part is not moving: $A6:D148 AD 1A 20 LDA $201A [$7E:201A] $A6:D14B 9D 2A 20 STA $202A,x[$7E:202A] $A6:D14E 4C AA D0 JMP $D0AA [$A6:D0AA] ; no clockwise target $A6:D151 BD 2A 20 LDA $202A,x[$7E:202A] $A6:D154 38 SEC $A6:D155 ED 14 20 SBC $2014 [$7E:2014] $A6:D158 3A DEC A $A6:D159 CD 16 20 CMP $2016 [$7E:2016] $A6:D15C 10 0B BPL $0B [$D169] ; tail part moving $A6:D15E A9 00 00 LDA #$0000 $A6:D161 9D 24 20 STA $2024,x[$7E:2024] ; tail part rotation = counterclockwise $A6:D164 AD 16 20 LDA $2016 [$7E:2016] $A6:D167 80 01 BRA $01 [$D16A] ; inc angle $A6:D169 1A INC A ; set angle $A6:D16A 9D 2A 20 STA $202A,x[$7E:202A] ; not moving $A6:D16D 29 FF 00 AND #$00FF $A6:D170 85 12 STA $12 [$7E:0012] $A6:D172 8A TXA $A6:D173 F0 0B BEQ $0B [$D180] $A6:D175 A5 12 LDA $12 [$7E:0012] $A6:D177 18 CLC $A6:D178 7D 16 20 ADC $2016,x[$7E:202A] $A6:D17B 29 FF 00 AND #$00FF $A6:D17E 85 12 STA $12 [$7E:0012] ; first tail part $A6:D180 BD 26 20 LDA $2026,x[$7E:2026] $A6:D183 EB XBA $A6:D184 29 FF 00 AND #$00FF $A6:D187 22 60 C4 A9 JSL $A9C460[$A9:C460] ; A = sin([$12] * pi / 80h) * ±[A] $A6:D18B 9D 30 20 STA $2030,x[$7E:2030] $A6:D18E BD 26 20 LDA $2026,x[$7E:2026] $A6:D191 EB XBA $A6:D192 29 FF 00 AND #$00FF $A6:D195 22 65 C4 A9 JSL $A9C465[$A9:C465] ; A = cos([$12] * pi / 80h) * ±[A] $A6:D199 9D 32 20 STA $2032,x[$7E:2032] $A6:D19C 60 RTS } ;;; $D19D: ;;; { ; Target an angle (towards a missile or Samus) for tail. ; Note: Actual angle is actually twice the angle chosen, since each tail segment doubles it ; Also, tail circles 2*A amount of times first $A6:D19D 29 FF 00 AND #$00FF $A6:D1A0 EB XBA $A6:D1A1 8D 0A 20 STA $200A [$7E:200A] $A6:D1A4 AD 20 78 LDA $7820 [$7E:7820] $A6:D1A7 3A DEC A $A6:D1A8 F0 1B BEQ $1B [$D1C5] ; if facing forward: return $A6:D1AA AD 02 78 LDA $7802 [$7E:7802] $A6:D1AD F0 16 BEQ $16 [$D1C5] ; if Ridley active: $A6:D1AF 20 42 D2 JSR $D242 [$A6:D242] ; "Target a missile/super missile if available" $A6:D1B2 90 12 BCC $12 [$D1C6] ; if projectile targeted: $A6:D1B4 A5 12 LDA $12 [$7E:0012] $A6:D1B6 ED 2C 20 SBC $202C [$7E:202C] $A6:D1B9 85 12 STA $12 [$7E:0012] $A6:D1BB A5 14 LDA $14 [$7E:0014] $A6:D1BD 38 SEC $A6:D1BE ED 2E 20 SBC $202E [$7E:202E] $A6:D1C1 85 14 STA $14 [$7E:0014] $A6:D1C3 80 17 BRA $17 [$D1DC] $A6:D1C5 60 RTS ; no projectiles $A6:D1C6 AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:D1C9 38 SEC $A6:D1CA ED 2C 20 SBC $202C [$7E:202C] $A6:D1CD 85 12 STA $12 [$7E:0012] $A6:D1CF AD FA 0A LDA $0AFA [$7E:0AFA] ; Samus Y position $A6:D1D2 18 CLC $A6:D1D3 69 18 00 ADC #$0018 $A6:D1D6 38 SEC $A6:D1D7 ED 2E 20 SBC $202E [$7E:202E] $A6:D1DA 85 14 STA $14 [$7E:0014] $A6:D1DC 8B PHB $A6:D1DD 4B PHK $A6:D1DE AB PLB $A6:D1DF 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ; A = angle of ([$12], [$14]) offset $A6:D1E3 AB PLB $A6:D1E4 38 SEC $A6:D1E5 E9 80 00 SBC #$0080 $A6:D1E8 49 FF FF EOR #$FFFF $A6:D1EB 1A INC A $A6:D1EC 29 FF 00 AND #$00FF $A6:D1EF 85 12 STA $12 [$7E:0012] $A6:D1F1 AD 20 78 LDA $7820 [$7E:7820] $A6:D1F4 D0 26 BNE $26 [$D21C] ; if facing left: $A6:D1F6 A5 12 LDA $12 [$7E:0012] $A6:D1F8 C9 18 00 CMP #$0018 $A6:D1FB 90 08 BCC $08 [$D205] $A6:D1FD C9 E8 00 CMP #$00E8 $A6:D200 B0 03 BCS $03 [$D205] $A6:D202 A9 E8 00 LDA #$00E8 $A6:D205 18 CLC $A6:D206 69 00 3F ADC #$3F00 $A6:D209 38 SEC $A6:D20A ED 0A 20 SBC $200A [$7E:200A] $A6:D20D CD 2A 20 CMP $202A [$7E:202A] $A6:D210 B0 09 BCS $09 [$D21B] $A6:D212 8D 1A 20 STA $201A [$7E:201A] $A6:D215 A9 08 00 LDA #$0008 $A6:D218 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed = 8 $A6:D21B 60 RTS ; facing right $A6:D21C A5 12 LDA $12 [$7E:0012] $A6:D21E C9 18 00 CMP #$0018 $A6:D221 90 08 BCC $08 [$D22B] $A6:D223 C9 E8 00 CMP #$00E8 $A6:D226 B0 03 BCS $03 [$D22B] $A6:D228 A9 18 00 LDA #$0018 $A6:D22B 18 CLC $A6:D22C 69 00 40 ADC #$4000 $A6:D22F 18 CLC $A6:D230 6D 0A 20 ADC $200A [$7E:200A] $A6:D233 CD 2A 20 CMP $202A [$7E:202A] $A6:D236 90 09 BCC $09 [$D241] $A6:D238 8D 1C 20 STA $201C [$7E:201C] $A6:D23B A9 08 00 LDA #$0008 $A6:D23E 8D 14 20 STA $2014 [$7E:2014] ; tail rotation speed = 8 $A6:D241 60 RTS } ;;; $D242: ;;; { ; Target a missile/super missile if available ; CLC if no projectiles, SEC if targeted a projectile $A6:D242 AD A4 20 LDA $20A4 [$7E:20A4] $A6:D245 85 12 STA $12 [$7E:0012] $A6:D247 AD A6 20 LDA $20A6 [$7E:20A6] $A6:D24A 85 14 STA $14 [$7E:0014] $A6:D24C A9 40 00 LDA #$0040 $A6:D24F 85 16 STA $16 [$7E:0016] $A6:D251 85 18 STA $18 [$7E:0018] $A6:D253 AD CE 0C LDA $0CCE [$7E:0CCE] $A6:D256 D0 02 BNE $02 [$D25A] ; if projectile counter = 0: $A6:D258 18 CLC $A6:D259 60 RTS ; check projectiles $A6:D25A A0 00 00 LDY #$0000 ; loop $A6:D25D B9 19 0C LDA $0C19,y[$7E:0C19] $A6:D260 29 0F 00 AND #$000F $A6:D263 3A DEC A $A6:D264 F0 03 BEQ $03 [$D269] ; if not missile: $A6:D266 3A DEC A $A6:D267 D0 2C BNE $2C [$D295] ; if super missile: ; missile or super missile $A6:D269 B9 64 0B LDA $0B64,y[$7E:0B66] ; projectile X position $A6:D26C 38 SEC $A6:D26D E5 12 SBC $12 [$7E:0012] $A6:D26F 10 04 BPL $04 [$D275] ; if projectile X - tail tip X < 0: $A6:D271 49 FF FF EOR #$FFFF $A6:D274 1A INC A $A6:D275 38 SEC $A6:D276 F9 B4 0B SBC $0BB4,y[$7E:0BB6] ; projectile X radii $A6:D279 90 04 BCC $04 [$D27F] $A6:D27B C5 16 CMP $16 [$7E:0016] $A6:D27D B0 16 BCS $16 [$D295] $A6:D27F B9 78 0B LDA $0B78,y ; projectile Y position $A6:D282 38 SEC $A6:D283 E5 14 SBC $14 [$7E:0014] $A6:D285 10 04 BPL $04 [$D28B] ; if projectile Y - tail tip Y < 0: $A6:D287 49 FF FF EOR #$FFFF $A6:D28A 1A INC A $A6:D28B 38 SEC $A6:D28C F9 C8 0B SBC $0BC8,y ; projectile Y radii $A6:D28F 90 0D BCC $0D [$D29E] $A6:D291 C5 18 CMP $18 [$7E:0018] $A6:D293 90 09 BCC $09 [$D29E] ; next projectile $A6:D295 C8 INY $A6:D296 C8 INY $A6:D297 C0 0A 00 CPY #$000A $A6:D29A 30 C1 BMI $C1 [$D25D] $A6:D29C 18 CLC $A6:D29D 60 RTS ; target projectile $A6:D29E B9 64 0B LDA $0B64,y ; projectile X position $A6:D2A1 85 12 STA $12 [$7E:0012] $A6:D2A3 B9 78 0B LDA $0B78,y ; projectile Y position $A6:D2A6 85 14 STA $14 [$7E:0014] $A6:D2A8 38 SEC $A6:D2A9 60 RTS } ;;; $D2AA: ;;; { ; Play swishing sound if tail is moving quickly $A6:D2AA AF 14 20 7E LDA $7E2014[$7E:2014] $A6:D2AE C9 08 00 CMP #$0008 $A6:D2B1 30 1B BMI $1B [$D2CE] ; if tail rotation speed >= 8: $A6:D2B3 AF 1C 78 7E LDA $7E781C[$7E:781C] $A6:D2B7 1A INC A $A6:D2B8 8F 1C 78 7E STA $7E781C[$7E:781C] $A6:D2BC C9 10 00 CMP #$0010 $A6:D2BF 30 14 BMI $14 [$D2D5] ; if max tail speed counter >= $10: $A6:D2C1 AF 1E 78 7E LDA $7E781E[$7E:781E] $A6:D2C5 D0 07 BNE $07 [$D2CE] ; if Ridley not playing roar SFX: $A6:D2C7 A9 21 00 LDA #$0021 ;\ $A6:D2CA 22 4D 91 80 JSL $80914D[$80:914D] ;} Queue sound 21h, sound library 3, max queued sounds allowed = 6 (Ridley whips its tail) $A6:D2CE A9 00 00 LDA #$0000 $A6:D2D1 8F 1C 78 7E STA $7E781C[$7E:781C] ; reset max tail speed counter $A6:D2D5 60 RTS } ;;; $D2D6: ;;; { ; Initializes a ton of variables from 7E:2012 to 7E:20A7. I'm *guessing* they're for his tail $A6:D2D6 A9 01 00 LDA #$0001 $A6:D2D9 8F 14 20 7E STA $7E2014[$7E:2014] ; Angular speed of tail? = 1 $A6:D2DD A9 F0 3F LDA #$3FF0 $A6:D2E0 8F 16 20 7E STA $7E2016[$7E:2016] ; minimum clockwise angle = $3FF0 $A6:D2E4 A9 40 40 LDA #$4040 $A6:D2E7 8F 18 20 7E STA $7E2018[$7E:2018] ; maximum counterclockwise angle = $4040 $A6:D2EB A9 FF FF LDA #$FFFF $A6:D2EE 8F 1A 20 7E STA $7E201A[$7E:201A] $A6:D2F2 8F 1C 20 7E STA $7E201C[$7E:201C] ; tail angle targets = $FFFF $A6:D2F6 A9 F0 00 LDA #$00F0 $A6:D2F9 8F 12 20 7E STA $7E2012[$7E:2012] ; tail extension speed = $F0 $A6:D2FD A9 10 00 LDA #$0010 $A6:D300 8F 1E 20 7E STA $7E201E[$7E:201E] ; movement threshold? = $10 $A6:D304 1A INC A $A6:D305 8F 22 20 7E STA $7E2022[$7E:2022] $A6:D309 8F 36 20 7E STA $7E2036[$7E:2036] $A6:D30D 8F 4A 20 7E STA $7E204A[$7E:204A] $A6:D311 8F 5E 20 7E STA $7E205E[$7E:205E] $A6:D315 8F 72 20 7E STA $7E2072[$7E:2072] $A6:D319 8F 86 20 7E STA $7E2086[$7E:2086] $A6:D31D 8F 9A 20 7E STA $7E209A[$7E:209A] ; timer til tail part moves = $11 $A6:D321 A2 6E D3 LDX #$D36E $A6:D324 A0 24 20 LDY #$2024 ; $7E2024: Rotation direction = clockwise $A6:D327 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:D36E to $7E:2024 $A6:D32A A2 7C D3 LDX #$D37C $A6:D32D A0 26 20 LDY #$2026 ; $7E2026: Distance from Ridley to tail parts $A6:D330 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:D37C to $7E:2026 $A6:D333 A2 8A D3 LDX #$D38A $A6:D336 A0 2A 20 LDY #$202A ; $7E202A: Angle of this tail part $A6:D339 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:D38A to $7E:202A $A6:D33C A2 98 D3 LDX #$D398 $A6:D33F A0 2C 20 LDY #$202C ; $7E202C: X position of this tail part $A6:D342 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:D398 to $7E:202C $A6:D345 A2 A6 D3 LDX #$D3A6 $A6:D348 A0 2E 20 LDY #$202E ; $7E202E: Y position of this tail part $A6:D34B 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:D3A6 to $7E:202E $A6:D34E A9 00 00 LDA #$0000 $A6:D351 8F 20 20 7E STA $7E2020[$7E:2020] $A6:D355 8F 34 20 7E STA $7E2034[$7E:2034] $A6:D359 8F 48 20 7E STA $7E2048[$7E:2048] $A6:D35D 8F 5C 20 7E STA $7E205C[$7E:205C] $A6:D361 8F 70 20 7E STA $7E2070[$7E:2070] $A6:D365 8F 84 20 7E STA $7E2084[$7E:2084] $A6:D369 8F 98 20 7E STA $7E2098[$7E:2098] ; tail parts = 0 (not moving) $A6:D36D 60 RTS $A6:D36E dw 8000,8000,8000,8000,8000,8000,8000 ; $7E2024: Rotation direction = clockwise $A6:D37C dw 0200,0800,0800,0800,0800,0800,0500 ; $7E2026: Distance from Ridley to tail parts $A6:D38A dw 4000,4010,4020,4030,4040,4050,4060 ; $7E202A: Angle of this tail part $A6:D398 dw 0000,0003,0007,0007,0003,FFFD,FFFC ; $7E202C: X position of this tail part $A6:D3A6 dw 0002,0007,0003,FFFD,FFF9,FFF9,FFFF ; $7E202E: Y position of this tail part } ;;; $D3B4: ;;; { ; Update tail parts from $A6:X to $7E:Y $A6:D3B4 A9 7E 00 LDA #$007E $A6:D3B7 85 14 STA $14 [$7E:0014] ; src bank $A6:D3B9 84 12 STY $12 [$7E:0012] ; src addr $A6:D3BB A0 00 00 LDY #$0000 $A6:D3BE A9 07 00 LDA #$0007 ; number of table entries = 7 ; loop $A6:D3C1 48 PHA ; loop counter $A6:D3C2 BD 00 00 LDA $0000,x[$A6:D36E] $A6:D3C5 97 12 STA [$12],y[$7E:2024] $A6:D3C7 E8 INX $A6:D3C8 E8 INX ; next table entry $A6:D3C9 98 TYA $A6:D3CA 18 CLC $A6:D3CB 69 14 00 ADC #$0014 $A6:D3CE A8 TAY ; next tail part $A6:D3CF 68 PLA $A6:D3D0 3A DEC A $A6:D3D1 D0 EE BNE $EE [$D3C1] ; if loop counter = 0: $A6:D3D3 60 RTS } ;;; $D3D4: ;;; { ; unused? ; Set all tail parts to not moving $A6:D3D4 A9 00 00 LDA #$0000 $A6:D3D7 80 03 BRA $03 [$D3DC] } ;;; $D3D9: ;;; { ; Set all tail parts to moving $A6:D3D9 A9 00 80 LDA #$8000 } ;;; $D3DC: ;;; { ; Set all tail parts to moving or not moving $A6:D3DC 8F 20 20 7E STA $7E2020[$7E:2020] $A6:D3E0 8F 34 20 7E STA $7E2034[$7E:2034] $A6:D3E4 8F 48 20 7E STA $7E2048[$7E:2048] $A6:D3E8 8F 5C 20 7E STA $7E205C[$7E:205C] $A6:D3EC 8F 70 20 7E STA $7E2070[$7E:2070] $A6:D3F0 8F 84 20 7E STA $7E2084[$7E:2084] $A6:D3F4 8F 98 20 7E STA $7E2098[$7E:2098] $A6:D3F8 60 RTS } ;;; $D3F9: ;;; { ; Update tail rotation direction, angle, and distance from Ridley $A6:D3F9 DA PHX $A6:D3FA 5A PHY $A6:D3FB A2 7C D3 LDX #$D37C $A6:D3FE A0 26 20 LDY #$2026 ; $7E2026: Distance from Ridley to tail parts $A6:D401 20 B4 D3 JSR $D3B4 [$A6:D3B4] ; Update tail parts from $A6:X to $7E:Y $A6:D404 A0 07 00 LDY #$0007 ; loop counter = 7 $A6:D407 A2 00 00 LDX #$0000 $A6:D40A BF 2A 20 7E LDA $7E202A,x[$7E:202A] $A6:D40E 49 FF FF EOR #$FFFF $A6:D411 1A INC A $A6:D412 18 CLC $A6:D413 69 00 80 ADC #$8000 $A6:D416 9F 2A 20 7E STA $7E202A,x[$7E:202A] ; tail part angle $A6:D41A BF 24 20 7E LDA $7E2024,x[$7E:2024] $A6:D41E 09 00 80 ORA #$8000 $A6:D421 9F 24 20 7E STA $7E2024,x[$7E:2024] ; tail part rotation = clockwise $A6:D425 8A TXA $A6:D426 18 CLC $A6:D427 69 14 00 ADC #$0014 $A6:D42A AA TAX ; next tail part $A6:D42B 88 DEY $A6:D42C D0 DC BNE $DC [$D40A] ; if loop counter = 0: $A6:D42E 7A PLY $A6:D42F FA PLX $A6:D430 60 RTS } ;;; $D431: ;;; { ; unused? ; Check if all tail parts are moving ; SEC if all parts moving $A6:D431 AF 20 20 7E LDA $7E2020[$7E:2020] $A6:D435 2F 34 20 7E AND $7E2034[$7E:2034] $A6:D439 2F 48 20 7E AND $7E2048[$7E:2048] $A6:D43D 2F 5C 20 7E AND $7E205C[$7E:205C] $A6:D441 2F 70 20 7E AND $7E2070[$7E:2070] $A6:D445 2F 84 20 7E AND $7E2084[$7E:2084] $A6:D449 2F 98 20 7E AND $7E2098[$7E:2098] $A6:D44D D0 02 BNE $02 [$D451] ; if all tail parts != moving: $A6:D44F 18 CLC $A6:D450 60 RTS ; all parts moving $A6:D451 38 SEC $A6:D452 60 RTS } ;;; $D453: Deal suit-adjusted enemy damage to Samus ;;; { $A6:D453 AE 54 0E LDX $0E54 [$7E:0E54] ;\ $A6:D456 BD 78 0F LDA $0F78,x ;| $A6:D459 AA TAX ;} A = [$A0:0008 + [enemy ID]] (enemy damage) $A6:D45A BF 06 00 A0 LDA $A00006,x ;/ $A6:D45E 22 5E A4 A0 JSL $A0A45E[$A0:A45E] ;\ $A6:D462 22 51 DF 91 JSL $91DF51[$91:DF51] ;} Deal [A] suit-adjusted damage to Samus $A6:D466 6B RTL } ;;; $D467: Set Ridley instruction list ;;; { $A6:D467 8D 92 0F STA $0F92 [$7E:0F92] ; Ridley instruction list $A6:D46A A9 01 00 LDA #$0001 $A6:D46D 8D 94 0F STA $0F94 [$7E:0F94] ; instruction timer = 1 $A6:D470 9C 90 0F STZ $0F90 [$7E:0F90] ; timer = 1 $A6:D473 60 RTS } ;;; $D474: ;;; { ; Determine and set Norfair Ridley's speed and color pallete ; Norfair Ridley $A6:D474 A9 00 00 LDA #$0000 $A6:D477 AC 8C 0F LDY $0F8C [$7E:0F8C] $A6:D47A C0 28 23 CPY #$2328 $A6:D47D B0 0D BCS $0D [$D48C] ; if Ridley health < $2328 (9000, half health): $A6:D47F 1A INC A $A6:D480 C0 18 15 CPY #$1518 $A6:D483 B0 07 BCS $07 [$D48C] ; if Ridley health < $1518 (5400): $A6:D485 1A INC A $A6:D486 C0 08 07 CPY #$0708 $A6:D489 B0 01 BCS $01 [$D48C] ; if Ridley health < $708 (1800): $A6:D48B 1A INC A $A6:D48C 8F 24 78 7E STA $7E7824[$7E:7824] ; Ridley speedup $A6:D490 3A DEC A $A6:D491 85 12 STA $12 [$7E:0012] $A6:D493 30 1F BMI $1F [$D4B4] ; if Ridley health >= $2328: return } ;;; $D495: ;;; { ; Set Ridley's hit/health based palette $A6:D495 AF 00 C4 7E LDA $7EC400[$7E:C400] $A6:D499 D0 19 BNE $19 [$D4B4] ; if palette change numerator = 0: $A6:D49B A5 12 LDA $12 [$7E:0012] $A6:D49D 0A ASL A $A6:D49E 0A ASL A $A6:D49F 0A ASL A $A6:D4A0 38 SEC $A6:D4A1 E5 12 SBC $12 [$7E:0012] $A6:D4A3 0A ASL A $A6:D4A4 0A ASL A $A6:D4A5 18 CLC $A6:D4A6 69 6A E4 ADC #$E46A $A6:D4A9 A8 TAY ; Y = (Ridley speedup - 1) * $1C + $E46A (health based palettes) $A6:D4AA A2 E2 01 LDX #$01E2 $A6:D4AD A9 0E 00 LDA #$000E $A6:D4B0 22 E4 D2 A9 JSL $A9D2E4[$A9:D2E4] ; Write $E colors from $A6:[Y] to color index $1E2 (Sprite palette 7) $A6:D4B4 60 RTS } ;;; $D4B5: ;;; { ; Determine and set Ceres Ridley's hit based pallete ; Ceres Ridley $A6:D4B5 AF 02 78 7E LDA $7E7802[$7E:7802] $A6:D4B9 F0 F9 BEQ $F9 [$D4B4] ; if Ridley is active: $A6:D4BB AF 1A 78 7E LDA $7E781A[$7E:781A] $A6:D4BF C9 32 00 CMP #$0032 $A6:D4C2 90 F0 BCC $F0 [$D4B4] ; if Ceres Ridley hit counter < $32: return $A6:D4C4 A0 00 00 LDY #$0000 $A6:D4C7 C9 46 00 CMP #$0046 $A6:D4CA 90 09 BCC $09 [$D4D5] ; if Ceres Ridley hit counter >= $46: $A6:D4CC A0 01 00 LDY #$0001 $A6:D4CF C9 5A 00 CMP #$005A ; >.< where's the BCC? $A6:D4D2 A0 02 00 LDY #$0002 $A6:D4D5 84 12 STY $12 [$7E:0012] ; index into $E46A palette table $A6:D4D7 4C 95 D4 JMP $D495 [$A6:D495] ; Determine and set Ridley's health based palette } ;;; $D4DA: ;;; { ; Make wings/tail flash when hit ; Ceres / Norfair Ridley $A6:D4DA DA PHX $A6:D4DB A2 00 0E LDX #$0E00 ; not flashing $A6:D4DE AD 9C 0F LDA $0F9C [$7E:0F9C] $A6:D4E1 F0 0F BEQ $0F [$D4F2] ; if flash timer != 0: $A6:D4E3 3A DEC A $A6:D4E4 F0 0C BEQ $0C [$D4F2] ; if flash timer != 1: $A6:D4E6 AD 44 0E LDA $0E44 [$7E:0E44] $A6:D4E9 1A INC A $A6:D4EA 29 02 00 AND #$0002 $A6:D4ED F0 03 BEQ $03 [$D4F2] ; branch for 2 frames, no branch for 2 frames, repeat $A6:D4EF A2 00 00 LDX #$0000 ; flashing $A6:D4F2 8A TXA $A6:D4F3 8F 18 78 7E STA $7E7818[$7E:7818] ; palette index $A6:D4F7 FA PLX $A6:D4F8 60 RTS } ;;; $D4F9: Check for collision with non-air block ;;; { ;; Parameters: ;; X: X position ;; Y: Y position ;; Returns: ;; Carry: Set if collision, clear otherwise $A6:D4F9 98 TYA $A6:D4FA 4A LSR A $A6:D4FB 4A LSR A $A6:D4FC 4A LSR A $A6:D4FD 4A LSR A $A6:D4FE E2 20 SEP #$20 $A6:D500 8D 02 42 STA $4202 [$7E:4202] $A6:D503 AD A5 07 LDA $07A5 [$7E:07A5] $A6:D506 8D 03 42 STA $4203 [$7E:4203] $A6:D509 C2 20 REP #$20 $A6:D50B 8A TXA $A6:D50C 4A LSR A $A6:D50D 4A LSR A $A6:D50E 4A LSR A $A6:D50F 4A LSR A $A6:D510 18 CLC $A6:D511 6D 16 42 ADC $4216 [$7E:4216] $A6:D514 0A ASL A $A6:D515 AA TAX ; X = ((X position / $10 * Room width) + (Y position / $10)) * 2 $A6:D516 BF 02 00 7F LDA $7F0002,x[$7F:0102] $A6:D51A 29 00 F0 AND #$F000 $A6:D51D D0 02 BNE $02 [$D521] ; if block is not solid: $A6:D51F 18 CLC $A6:D520 6B RTL ; collision $A6:D521 38 SEC $A6:D522 6B RTL } ;;; $D523: ;;; { ; Accelerates Ridley towards the desired X/Y ($12/$14). ; No deceleration boost ($1A), Y is index value to find acceleration divisor ($18), X is enemy's index $A6:D523 A9 00 00 LDA #$0000 } ;;; $D526: ;;; { ; Accelerates Ridley towards the desired X/Y ($12/$14). ; A is deceleration boost, Y is index value to find acceleration divisor ($18), X is enemy's index $A6:D526 85 1A STA $1A [$7E:001A] $A6:D528 B9 1F D6 LDA $D61F,y[$A6:D62D] $A6:D52B 29 FF 00 AND #$00FF $A6:D52E 85 18 STA $18 [$7E:0018] $A6:D530 20 A9 D5 JSR $D5A9 [$A6:D5A9] ; "Accelerates Ridley towards the desired X position" $A6:D533 BD 7E 0F LDA $0F7E,x[$7E:0F7E] $A6:D536 38 SEC $A6:D537 E5 14 SBC $14 [$7E:0014] $A6:D539 F0 39 BEQ $39 [$D574] $A6:D53B 10 38 BPL $38 [$D575] $A6:D53D 49 FF FF EOR #$FFFF $A6:D540 1A INC A $A6:D541 8D 04 42 STA $4204 [$7E:4204] $A6:D544 E2 20 SEP #$20 $A6:D546 A5 18 LDA $18 [$7E:0018] $A6:D548 8D 06 42 STA $4206 [$7E:4206] $A6:D54B C2 20 REP #$20 $A6:D54D EB XBA $A6:D54E EB XBA $A6:D54F EA NOP $A6:D550 EA NOP $A6:D551 AD 14 42 LDA $4214 [$7E:4214] $A6:D554 D0 01 BNE $01 [$D557] $A6:D556 1A INC A $A6:D557 85 16 STA $16 [$7E:0016] $A6:D559 BD AC 0F LDA $0FAC,x[$7E:0FAC] $A6:D55C 10 09 BPL $09 [$D567] $A6:D55E 18 CLC $A6:D55F 65 1A ADC $1A [$7E:001A] $A6:D561 18 CLC $A6:D562 69 08 00 ADC #$0008 $A6:D565 65 16 ADC $16 [$7E:0016] $A6:D567 65 16 ADC $16 [$7E:0016] $A6:D569 C9 00 05 CMP #$0500 $A6:D56C 30 03 BMI $03 [$D571] $A6:D56E A9 00 05 LDA #$0500 $A6:D571 9D AC 0F STA $0FAC,x[$7E:0FAC] $A6:D574 60 RTS ; below target Y position $A6:D575 8D 04 42 STA $4204 [$7E:4204] $A6:D578 E2 20 SEP #$20 $A6:D57A A5 18 LDA $18 [$7E:0018] $A6:D57C 8D 06 42 STA $4206 [$7E:4206] $A6:D57F C2 20 REP #$20 $A6:D581 EB XBA $A6:D582 EB XBA $A6:D583 EA NOP $A6:D584 EA NOP $A6:D585 AD 14 42 LDA $4214 [$7E:4214] $A6:D588 D0 01 BNE $01 [$D58B] $A6:D58A 1A INC A $A6:D58B 85 16 STA $16 [$7E:0016] $A6:D58D BD AC 0F LDA $0FAC,x[$7E:0FAC] $A6:D590 30 09 BMI $09 [$D59B] $A6:D592 38 SEC $A6:D593 E5 1A SBC $1A [$7E:001A] $A6:D595 38 SEC $A6:D596 E9 08 00 SBC #$0008 $A6:D599 E5 16 SBC $16 [$7E:0016] $A6:D59B E5 16 SBC $16 [$7E:0016] $A6:D59D C9 00 FB CMP #$FB00 $A6:D5A0 10 03 BPL $03 [$D5A5] $A6:D5A2 A9 00 FB LDA #$FB00 $A6:D5A5 9D AC 0F STA $0FAC,x[$7E:0FAC] $A6:D5A8 60 RTS } ;;; $D5A9: ;;; { ; Accelerates Ridley towards the desired X position ($12). ; Deceleration boost in $1A, acceleration divisor in $18, X is enemy's index $A6:D5A9 BD 7A 0F LDA $0F7A,x[$7E:0F7A] $A6:D5AC 38 SEC $A6:D5AD E5 12 SBC $12 [$7E:0012] $A6:D5AF F0 39 BEQ $39 [$D5EA] $A6:D5B1 10 38 BPL $38 [$D5EB] $A6:D5B3 49 FF FF EOR #$FFFF $A6:D5B6 1A INC A $A6:D5B7 8D 04 42 STA $4204 [$7E:4204] $A6:D5BA E2 20 SEP #$20 $A6:D5BC A5 18 LDA $18 [$7E:0018] $A6:D5BE 8D 06 42 STA $4206 [$7E:4206] $A6:D5C1 C2 20 REP #$20 $A6:D5C3 EB XBA $A6:D5C4 EB XBA $A6:D5C5 EA NOP $A6:D5C6 EA NOP $A6:D5C7 AD 14 42 LDA $4214 [$7E:4214] $A6:D5CA D0 01 BNE $01 [$D5CD] $A6:D5CC 1A INC A $A6:D5CD 85 16 STA $16 [$7E:0016] $A6:D5CF BD AA 0F LDA $0FAA,x[$7E:0FAA] $A6:D5D2 10 09 BPL $09 [$D5DD] $A6:D5D4 18 CLC $A6:D5D5 65 1A ADC $1A [$7E:001A] $A6:D5D7 18 CLC $A6:D5D8 69 08 00 ADC #$0008 $A6:D5DB 65 16 ADC $16 [$7E:0016] $A6:D5DD 65 16 ADC $16 [$7E:0016] $A6:D5DF C9 00 05 CMP #$0500 $A6:D5E2 30 03 BMI $03 [$D5E7] $A6:D5E4 A9 00 05 LDA #$0500 $A6:D5E7 9D AA 0F STA $0FAA,x[$7E:0FAA] $A6:D5EA 60 RTS $A6:D5EB 8D 04 42 STA $4204 [$7E:4204] $A6:D5EE E2 20 SEP #$20 $A6:D5F0 A5 18 LDA $18 [$7E:0018] $A6:D5F2 8D 06 42 STA $4206 [$7E:4206] $A6:D5F5 C2 20 REP #$20 $A6:D5F7 EB XBA $A6:D5F8 EB XBA $A6:D5F9 EA NOP $A6:D5FA EA NOP $A6:D5FB AD 14 42 LDA $4214 [$7E:4214] $A6:D5FE D0 01 BNE $01 [$D601] $A6:D600 1A INC A $A6:D601 85 16 STA $16 [$7E:0016] $A6:D603 BD AA 0F LDA $0FAA,x[$7E:0FAA] $A6:D606 30 09 BMI $09 [$D611] $A6:D608 38 SEC $A6:D609 E5 1A SBC $1A [$7E:001A] $A6:D60B 38 SEC $A6:D60C E9 08 00 SBC #$0008 $A6:D60F E5 16 SBC $16 [$7E:0016] $A6:D611 E5 16 SBC $16 [$7E:0016] $A6:D613 C9 00 FB CMP #$FB00 $A6:D616 10 03 BPL $03 [$D61B] $A6:D618 A9 00 FB LDA #$FB00 $A6:D61B 9D AA 0F STA $0FAA,x[$7E:0FAA] $A6:D61E 60 RTS } ;;; $D61F: ;;; { ; acceleration divisor index $A6:D61F db 10, 0F, 0E, 0D, 0C, 0B, 0A, 09, 08, 07, 06, 05, 04, 03, 02, 01 } ;;; $D62F: ;;; { ; similar to $D526 ; Ceres Ridley ; $12: target X position ; $14: target Y position ; X: enemy index ; Y: index into divisor table $A6:D62F B9 12 D7 LDA $D712,y[$A6:D712] $A6:D632 29 FF 00 AND #$00FF $A6:D635 85 18 STA $18 [$7E:0018] ; divisor $A6:D637 20 A6 D6 JSR $D6A6 [$A6:D6A6] ; "calculate X speed" $A6:D63A BD 7E 0F LDA $0F7E,x[$7E:0F7E] $A6:D63D 38 SEC $A6:D63E E5 14 SBC $14 [$7E:0014] $A6:D640 F0 34 BEQ $34 [$D676] $A6:D642 10 33 BPL $33 [$D677] $A6:D644 49 FF FF EOR #$FFFF $A6:D647 1A INC A $A6:D648 8D 04 42 STA $4204 [$7E:4204] ; dividend $A6:D64B E2 20 SEP #$20 $A6:D64D A5 18 LDA $18 [$7E:0018] ; divisor from $D712 table $A6:D64F 8D 06 42 STA $4206 [$7E:4206] $A6:D652 C2 20 REP #$20 $A6:D654 EB XBA $A6:D655 EB XBA $A6:D656 EA NOP $A6:D657 EA NOP $A6:D658 AD 14 42 LDA $4214 [$7E:4214] ; division result = distance to target / $D712 + Y $A6:D65B D0 01 BNE $01 [$D65E] $A6:D65D 1A INC A $A6:D65E 85 16 STA $16 [$7E:0016] ; non-zero division result $A6:D660 BD AC 0F LDA $0FAC,x[$7E:0FAC] ; Y speed $A6:D663 10 04 BPL $04 [$D669] $A6:D665 65 16 ADC $16 [$7E:0016] $A6:D667 65 16 ADC $16 [$7E:0016] ; move down $A6:D669 65 16 ADC $16 [$7E:0016] $A6:D66B C9 00 05 CMP #$0500 $A6:D66E 30 03 BMI $03 [$D673] $A6:D670 A9 00 05 LDA #$0500 ; capped at $500 $A6:D673 9D AC 0F STA $0FAC,x[$7E:0FAC] ; Y speed $A6:D676 60 RTS $A6:D677 8D 04 42 STA $4204 [$7E:4204] ; dividend = target X - enemy X $A6:D67A E2 20 SEP #$20 $A6:D67C A5 18 LDA $18 [$7E:0018] ; divisor from $D712 table $A6:D67E 8D 06 42 STA $4206 [$7E:4206] $A6:D681 C2 20 REP #$20 $A6:D683 EB XBA $A6:D684 EB XBA $A6:D685 EA NOP $A6:D686 EA NOP $A6:D687 AD 14 42 LDA $4214 [$7E:4214] ; division result $A6:D68A D0 01 BNE $01 [$D68D] $A6:D68C 1A INC A $A6:D68D 85 16 STA $16 [$7E:0016] $A6:D68F BD AC 0F LDA $0FAC,x[$7E:0FAC] $A6:D692 30 04 BMI $04 [$D698] ; if moving down: $A6:D694 E5 16 SBC $16 [$7E:0016] $A6:D696 E5 16 SBC $16 [$7E:0016] ; moving up $A6:D698 E5 16 SBC $16 [$7E:0016] $A6:D69A C9 00 FB CMP #$FB00 $A6:D69D 10 03 BPL $03 [$D6A2] $A6:D69F A9 00 FB LDA #$FB00 $A6:D6A2 9D AC 0F STA $0FAC,x[$7E:0FAC] $A6:D6A5 60 RTS } ;;; $D6A6: ;;; { ; "calculate X speed" $A6:D6A6 BD 7A 0F LDA $0F7A,x[$7E:0F7A] ; X position $A6:D6A9 38 SEC $A6:D6AA E5 12 SBC $12 [$7E:0012] $A6:D6AC F0 34 BEQ $34 [$D6E2] ; if X position = target X position: return $A6:D6AE 10 33 BPL $33 [$D6E3] ; if X position < target X position: (move right) $A6:D6B0 49 FF FF EOR #$FFFF $A6:D6B3 1A INC A $A6:D6B4 8D 04 42 STA $4204 [$7E:4204] ; dividend $A6:D6B7 E2 20 SEP #$20 $A6:D6B9 A5 18 LDA $18 [$7E:0018] ; divisor $A6:D6BB 8D 06 42 STA $4206 [$7E:4206] $A6:D6BE C2 20 REP #$20 $A6:D6C0 EB XBA $A6:D6C1 EB XBA $A6:D6C2 EA NOP $A6:D6C3 EA NOP $A6:D6C4 AD 14 42 LDA $4214 [$7E:4214] ; division result $A6:D6C7 D0 01 BNE $01 [$D6CA] $A6:D6C9 1A INC A $A6:D6CA 85 16 STA $16 [$7E:0016] ; non-zero division result $A6:D6CC BD AA 0F LDA $0FAA,x[$7E:0FAA] ; X speed $A6:D6CF 10 04 BPL $04 [$D6D5] ; if moving left (wrong direction): $A6:D6D1 65 16 ADC $16 [$7E:0016] $A6:D6D3 65 16 ADC $16 [$7E:0016] ; extra slow down? ; moving right $A6:D6D5 65 16 ADC $16 [$7E:0016] $A6:D6D7 C9 00 05 CMP #$0500 $A6:D6DA 30 03 BMI $03 [$D6DF] $A6:D6DC A9 00 05 LDA #$0500 ; capped at $500 $A6:D6DF 9D AA 0F STA $0FAA,x[$7E:0FAA] ; adjusted X speed $A6:D6E2 60 RTS ; move left $A6:D6E3 8D 04 42 STA $4204 [$7E:4204] $A6:D6E6 E2 20 SEP #$20 $A6:D6E8 A5 18 LDA $18 [$7E:0018] ; divisor $A6:D6EA 8D 06 42 STA $4206 [$7E:4206] $A6:D6ED C2 20 REP #$20 $A6:D6EF EB XBA $A6:D6F0 EB XBA $A6:D6F1 EA NOP $A6:D6F2 EA NOP $A6:D6F3 AD 14 42 LDA $4214 [$7E:4214] ; division result $A6:D6F6 D0 01 BNE $01 [$D6F9] $A6:D6F8 1A INC A $A6:D6F9 85 16 STA $16 [$7E:0016] $A6:D6FB BD AA 0F LDA $0FAA,x[$7E:0FAA] $A6:D6FE 30 04 BMI $04 [$D704] ; if moving right (wrong direction): $A6:D700 E5 16 SBC $16 [$7E:0016] $A6:D702 E5 16 SBC $16 [$7E:0016] ; extra slow down? $A6:D704 E5 16 SBC $16 [$7E:0016] $A6:D706 C9 00 FB CMP #$FB00 $A6:D709 10 03 BPL $03 [$D70E] $A6:D70B A9 00 FB LDA #$FB00 ; capped at -$500 $A6:D70E 9D AA 0F STA $0FAA,x[$7E:0FAA] ; adjusted X speed $A6:D711 60 RTS } ;;; $D712: ;;; { $A6:D712 db 10, 0F, 0E, 0D, 0C, 0B, 0A, 09, 08, 07, 06, 05, 04, 03, 02, 01 } ;;; $D722: ;;; { ; unused? $A6:D722 A9 00 02 LDA #$0200 $A6:D725 85 16 STA $16 [$7E:0016] $A6:D727 64 1C STZ $1C [$7E:001C] $A6:D729 20 98 D7 JSR $D798 [$A6:D798] $A6:D72C 20 34 D7 JSR $D734 [$A6:D734] $A6:D72F 46 1C LSR $1C [$7E:001C] $A6:D731 46 1C LSR $1C [$7E:001C] $A6:D733 60 RTS } ;;; $D734: ;;; { ; unused $A6:D734 BD 7E 0F LDA $0F7E,x $A6:D737 38 SEC $A6:D738 E5 14 SBC $14 [$7E:0014] $A6:D73A 10 2D BPL $2D [$D769] $A6:D73C BD AC 0F LDA $0FAC,x $A6:D73F 18 CLC $A6:D740 65 16 ADC $16 [$7E:0016] $A6:D742 C9 00 05 CMP #$0500 $A6:D745 30 03 BMI $03 [$D74A] $A6:D747 A9 00 05 LDA #$0500 $A6:D74A 9D AC 0F STA $0FAC,x $A6:D74D 29 00 FF AND #$FF00 $A6:D750 EB XBA $A6:D751 10 03 BPL $03 [$D756] $A6:D753 09 00 FF ORA #$FF00 $A6:D756 18 CLC $A6:D757 7D 7E 0F ADC $0F7E,x $A6:D75A C5 14 CMP $14 [$7E:0014] $A6:D75C 30 0A BMI $0A [$D768] $A6:D75E 9E AC 0F STZ $0FAC,x $A6:D761 A5 14 LDA $14 [$7E:0014] $A6:D763 9D 7E 0F STA $0F7E,x $A6:D766 E6 1C INC $1C [$7E:001C] $A6:D768 60 RTS $A6:D769 BD AC 0F LDA $0FAC,x $A6:D76C 38 SEC $A6:D76D E5 16 SBC $16 [$7E:0016] $A6:D76F C9 00 FB CMP #$FB00 $A6:D772 10 03 BPL $03 [$D777] $A6:D774 A9 00 FB LDA #$FB00 $A6:D777 9D AC 0F STA $0FAC,x $A6:D77A 29 00 FF AND #$FF00 $A6:D77D EB XBA $A6:D77E 10 03 BPL $03 [$D783] $A6:D780 09 00 FF ORA #$FF00 $A6:D783 18 CLC $A6:D784 7D 7E 0F ADC $0F7E,x $A6:D787 C5 14 CMP $14 [$7E:0014] $A6:D789 F0 02 BEQ $02 [$D78D] $A6:D78B 10 0A BPL $0A [$D797] $A6:D78D 9E AC 0F STZ $0FAC,x $A6:D790 A5 14 LDA $14 [$7E:0014] $A6:D792 9D 7E 0F STA $0F7E,x $A6:D795 E6 1C INC $1C [$7E:001C] $A6:D797 60 RTS } ;;; $D798: ;;; { ; unused $A6:D798 BD 7A 0F LDA $0F7A,x $A6:D79B 38 SEC $A6:D79C E5 12 SBC $12 [$7E:0012] $A6:D79E 10 31 BPL $31 [$D7D1] $A6:D7A0 49 FF FF EOR #$FFFF $A6:D7A3 1A INC A $A6:D7A4 BD AA 0F LDA $0FAA,x $A6:D7A7 18 CLC $A6:D7A8 65 16 ADC $16 [$7E:0016] $A6:D7AA C9 00 05 CMP #$0500 $A6:D7AD 30 03 BMI $03 [$D7B2] $A6:D7AF A9 00 05 LDA #$0500 $A6:D7B2 9D AA 0F STA $0FAA,x $A6:D7B5 29 00 FF AND #$FF00 $A6:D7B8 EB XBA $A6:D7B9 10 03 BPL $03 [$D7BE] $A6:D7BB 09 00 FF ORA #$FF00 $A6:D7BE 18 CLC $A6:D7BF 7D 7A 0F ADC $0F7A,x $A6:D7C2 C5 12 CMP $12 [$7E:0012] $A6:D7C4 30 0A BMI $0A [$D7D0] $A6:D7C6 9E AA 0F STZ $0FAA,x $A6:D7C9 A5 12 LDA $12 [$7E:0012] $A6:D7CB 9D 7A 0F STA $0F7A,x $A6:D7CE E6 1C INC $1C [$7E:001C] $A6:D7D0 60 RTS $A6:D7D1 BD AA 0F LDA $0FAA,x $A6:D7D4 38 SEC $A6:D7D5 E5 16 SBC $16 [$7E:0016] $A6:D7D7 C9 00 FB CMP #$FB00 $A6:D7DA 10 03 BPL $03 [$D7DF] $A6:D7DC A9 00 FB LDA #$FB00 $A6:D7DF 9D AA 0F STA $0FAA,x $A6:D7E2 29 00 FF AND #$FF00 $A6:D7E5 EB XBA $A6:D7E6 10 03 BPL $03 [$D7EB] $A6:D7E8 09 00 FF ORA #$FF00 $A6:D7EB 18 CLC $A6:D7EC 7D 7A 0F ADC $0F7A,x $A6:D7EF C5 12 CMP $12 [$7E:0012] $A6:D7F1 F0 02 BEQ $02 [$D7F5] $A6:D7F3 10 0A BPL $0A [$D7FF] $A6:D7F5 9E AA 0F STZ $0FAA,x $A6:D7F8 A5 12 LDA $12 [$7E:0012] $A6:D7FA 9D 7A 0F STA $0F7A,x $A6:D7FD E6 1C INC $1C [$7E:001C] $A6:D7FF 60 RTS } ;;; $D800: ;;; { ; Update Ridley's U Swoop speed and U Swoop angle, and calculate current X and Y speed $A6:D800 A5 16 LDA $16 [$7E:0016] $A6:D802 CF 16 78 7E CMP $7E7816[$7E:7816] $A6:D806 F0 28 BEQ $28 [$D830] $A6:D808 10 14 BPL $14 [$D81E] $A6:D80A AF 16 78 7E LDA $7E7816[$7E:7816] $A6:D80E 38 SEC $A6:D80F E9 20 00 SBC #$0020 $A6:D812 C5 16 CMP $16 [$7E:0016] $A6:D814 10 02 BPL $02 [$D818] $A6:D816 A5 16 LDA $16 [$7E:0016] $A6:D818 8F 16 78 7E STA $7E7816[$7E:7816] $A6:D81C 80 12 BRA $12 [$D830] ; not reached target $A6:D81E AF 16 78 7E LDA $7E7816[$7E:7816] $A6:D822 18 CLC $A6:D823 69 20 00 ADC #$0020 $A6:D826 C5 16 CMP $16 [$7E:0016] $A6:D828 30 02 BMI $02 [$D82C] $A6:D82A A5 16 LDA $16 [$7E:0016] $A6:D82C 8F 16 78 7E STA $7E7816[$7E:7816] ; check angle $A6:D830 A5 12 LDA $12 [$7E:0012] $A6:D832 30 0B BMI $0B [$D83F] $A6:D834 18 CLC $A6:D835 6F 14 78 7E ADC $7E7814[$7E:7814] $A6:D839 C5 14 CMP $14 [$7E:0014] $A6:D83B 30 0D BMI $0D [$D84A] $A6:D83D 80 09 BRA $09 [$D848] ; negative target? angle $A6:D83F 18 CLC $A6:D840 6F 14 78 7E ADC $7E7814[$7E:7814] $A6:D844 C5 14 CMP $14 [$7E:0014] $A6:D846 10 02 BPL $02 [$D84A] $A6:D848 A5 14 LDA $14 [$7E:0014] $A6:D84A 8F 14 78 7E STA $7E7814[$7E:7814] $A6:D84E EB XBA $A6:D84F 29 FF 00 AND #$00FF $A6:D852 85 12 STA $12 [$7E:0012] $A6:D854 AF 16 78 7E LDA $7E7816[$7E:7816] $A6:D858 22 6C C2 86 JSL $86C26C[$86:C26C] ; A *= sin([$12] * pi / 80h) $A6:D85C 8D AA 0F STA $0FAA [$7E:0FAA] $A6:D85F AF 16 78 7E LDA $7E7816[$7E:7816] $A6:D863 22 72 C2 86 JSL $86C272[$86:C272] ; A *= cos([$12] * pi / 80h) $A6:D867 8D AC 0F STA $0FAC [$7E:0FAC] $A6:D86A 60 RTS } ;;; $D86B: ;;; { ; Handles movement and main body wall collisions ; Ceres / Norfair Ridley $A6:D86B A9 00 00 LDA #$0000 $A6:D86E 8F 3E 78 7E STA $7E783E[$7E:783E] $A6:D872 AE 54 0E LDX $0E54 [$7E:0E54] $A6:D875 BD AA 0F LDA $0FAA,x[$7E:0FAA] $A6:D878 E2 20 SEP #$20 $A6:D87A 18 CLC $A6:D87B 7D 7D 0F ADC $0F7D,x[$7E:0F7D] $A6:D87E 9D 7D 0F STA $0F7D,x[$7E:0F7D] ; high byte of X subposition $A6:D881 C2 20 REP #$20 $A6:D883 29 00 FF AND #$FF00 $A6:D886 EB XBA $A6:D887 10 03 BPL $03 [$D88C] $A6:D889 09 00 FF ORA #$FF00 $A6:D88C 7D 7A 0F ADC $0F7A,x[$7E:0F7A] $A6:D88F CF 04 80 7E CMP $7E8004[$7E:8004] ; left boundary $A6:D893 10 16 BPL $16 [$D8AB] ; if Ridley past left boundary: $A6:D895 20 14 D9 JSR $D914 [$A6:D914] ; "Cause room shaking in Ceres" $A6:D898 AF 04 80 7E LDA $7E8004[$7E:8004] $A6:D89C 9D 7A 0F STA $0F7A,x[$7E:0F7A] ; Ridley X position = left boundary $A6:D89F 9E AA 0F STZ $0FAA,x[$7E:0FAA] ; Ridley X speed = 0 $A6:D8A2 A9 01 00 LDA #$0001 $A6:D8A5 8F 3E 78 7E STA $7E783E[$7E:783E] ; wall hit = left $A6:D8A9 80 17 BRA $17 [$D8C2] $A6:D8AB CF 06 80 7E CMP $7E8006[$7E:8006] $A6:D8AF 30 0E BMI $0E [$D8BF] $A6:D8B1 9E AA 0F STZ $0FAA,x[$7E:0FAA] $A6:D8B4 A9 02 00 LDA #$0002 $A6:D8B7 8F 3E 78 7E STA $7E783E[$7E:783E] ; wall hit = right $A6:D8BB AF 06 80 7E LDA $7E8006[$7E:8006] $A6:D8BF 9D 7A 0F STA $0F7A,x[$7E:0F7A] $A6:D8C2 BD AC 0F LDA $0FAC,x[$7E:0FAC] $A6:D8C5 E2 20 SEP #$20 $A6:D8C7 18 CLC $A6:D8C8 7D 81 0F ADC $0F81,x[$7E:0F81] $A6:D8CB 9D 81 0F STA $0F81,x[$7E:0F81] $A6:D8CE C2 20 REP #$20 $A6:D8D0 29 00 FF AND #$FF00 $A6:D8D3 EB XBA $A6:D8D4 10 03 BPL $03 [$D8D9] $A6:D8D6 09 00 FF ORA #$FF00 $A6:D8D9 7D 7E 0F ADC $0F7E,x[$7E:0F7E] $A6:D8DC CF 00 80 7E CMP $7E8000[$7E:8000] $A6:D8E0 10 16 BPL $16 [$D8F8] $A6:D8E2 AF 00 80 7E LDA $7E8000[$7E:8000] $A6:D8E6 9D 7E 0F STA $0F7E,x[$7E:0F7E] $A6:D8E9 9E AC 0F STZ $0FAC,x[$7E:0FAC] $A6:D8EC AF 3E 78 7E LDA $7E783E[$7E:783E] ; >_<; $A6:D8F0 A9 04 00 LDA #$0004 $A6:D8F3 8F 3E 78 7E STA $7E783E[$7E:783E] ; wall hit = top $A6:D8F7 60 RTS $A6:D8F8 CF 02 80 7E CMP $7E8002[$7E:8002] $A6:D8FC 30 12 BMI $12 [$D910] $A6:D8FE 9E AC 0F STZ $0FAC,x $A6:D901 AF 3E 78 7E LDA $7E783E[$7E:783E] ; >.< $A6:D905 A9 08 00 LDA #$0008 $A6:D908 8F 3E 78 7E STA $7E783E[$7E:783E] ; wall hit = bottom $A6:D90C AF 02 80 7E LDA $7E8002[$7E:8002] $A6:D910 9D 7E 0F STA $0F7E,x[$7E:0F7E] $A6:D913 60 RTS } ;;; $D914: ;;; { ; Cause room shaking, only happens in Ceres. Has unreachable code for Norfair room shaking ; Ceres / Norfair Ridley $A6:D914 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:D917 C9 02 00 CMP #$0002 $A6:D91A F0 38 BEQ $38 [$D954] ; if area = norfair: return $A6:D91C BD AA 0F LDA $0FAA,x $A6:D91F 10 04 BPL $04 [$D925] ; if moving left: $A6:D921 49 FF FF EOR #$FFFF $A6:D924 1A INC A $A6:D925 85 12 STA $12 [$7E:0012] $A6:D927 BD AC 0F LDA $0FAC,x $A6:D92A 10 04 BPL $04 [$D930] ; if moving up: $A6:D92C 49 FF FF EOR #$FFFF $A6:D92F 1A INC A $A6:D930 C5 12 CMP $12 [$7E:0012] $A6:D932 B0 02 BCS $02 [$D936] ; if Y speed < X speed: $A6:D934 A5 12 LDA $12 [$7E:0012] $A6:D936 C9 80 02 CMP #$0280 $A6:D939 90 19 BCC $19 [$D954] ; if X or Y speed >= $280: $A6:D93B AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:D93E C9 02 00 CMP #$0002 $A6:D941 F0 05 BEQ $05 [$D948] ; if area != norfair: $A6:D943 A9 21 00 LDA #$0021 ; Earthquake type = BG2 only and enemies, 3 pixel displacement, horizontal $A6:D946 80 03 BRA $03 [$D94B] ; norfair, dead code $A6:D948 A9 18 00 LDA #$0018 ; Earthquake type = BG1, BG2 and enemies, 3 pixel displacement, horizontal $A6:D94B 8D 3E 18 STA $183E [$7E:183E] $A6:D94E A9 0C 00 LDA #$000C ;\ $A6:D951 8D 40 18 STA $1840 [$7E:1840] ;} Earthquake timer = Ch $A6:D954 60 RTS } ;;; $D955: ;;; { ; Turn around if facing away from the center of the room (facing a wall) $A6:D955 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:D959 F0 0D BEQ $0D [$D968] ; if not facing left: $A6:D95B 3A DEC A $A6:D95C F0 1E BEQ $1E [$D97C] ; if facing forward: return $A6:D95E AD 79 0F LDA $0F79 [$7E:0F79] $A6:D961 10 19 BPL $19 [$D97C] ; if right side of room (X >= $80): $A6:D963 A9 06 E7 LDA #$E706 ; turning right to left $A6:D966 80 08 BRA $08 [$D970] ; facing left $A6:D968 AD 79 0F LDA $0F79 [$7E:0F79] $A6:D96B 30 0F BMI $0F [$D97C] ; if left side of room (X < $80): $A6:D96D A9 F0 E6 LDA #$E6F0 ; turning left to right ; merge $A6:D970 8D 92 0F STA $0F92 [$7E:0F92] ; set instruction list pointer $A6:D973 A9 02 00 LDA #$0002 $A6:D976 8D 94 0F STA $0F94 [$7E:0F94] ; instruction list timer $A6:D979 9C 90 0F STZ $0F90 [$7E:0F90] ; reset general timer $A6:D97C 60 RTS } ;;; $D97D: ;;; { ; Handle wing flapping $A6:D97D 20 A8 D9 JSR $D9A8 [$A6:D9A8] ; "Calculate wing flap speed" $A6:D980 AF 12 78 7E LDA $7E7812[$7E:7812] $A6:D984 38 SEC $A6:D985 EF 10 78 7E SBC $7E7810[$7E:7810] $A6:D989 8F 12 78 7E STA $7E7812[$7E:7812] $A6:D98D 10 18 BPL $18 [$D9A7] ; if wing flap counter - wing flap speed < 0: $A6:D98F A9 20 00 LDA #$0020 $A6:D992 8F 12 78 7E STA $7E7812[$7E:7812] ; wing flap counter = $20 $A6:D996 AF 0E 78 7E LDA $7E780E[$7E:780E] $A6:D99A 1A INC A $A6:D99B C9 0A 00 CMP #$000A $A6:D99E 90 03 BCC $03 [$D9A3] ; if wing animation frame >= $A: $A6:D9A0 A9 00 00 LDA #$0000 $A6:D9A3 8F 0E 78 7E STA $7E780E[$7E:780E] $A6:D9A7 60 RTS } ;;; $D9A8: ;;; { ; Calculate wing flap speed $A6:D9A8 AD AA 0F LDA $0FAA [$7E:0FAA] $A6:D9AB 10 04 BPL $04 [$D9B1] $A6:D9AD 49 FF FF EOR #$FFFF $A6:D9B0 1A INC A $A6:D9B1 85 12 STA $12 [$7E:0012] ; $12 = X speed $A6:D9B3 AD AC 0F LDA $0FAC [$7E:0FAC] $A6:D9B6 10 04 BPL $04 [$D9BC] $A6:D9B8 49 FF FF EOR #$FFFF $A6:D9BB 1A INC A $A6:D9BC 18 CLC $A6:D9BD 65 12 ADC $12 [$7E:0012] $A6:D9BF D0 05 BNE $05 [$D9C6] ; if X + Y speed = 0: $A6:D9C1 8F 10 78 7E STA $7E7810[$7E:7810] ; wing flap speed = 0 $A6:D9C5 60 RTS $A6:D9C6 38 SEC $A6:D9C7 E5 12 SBC $12 [$7E:0012] $A6:D9C9 C5 12 CMP $12 [$7E:0012] $A6:D9CB 10 02 BPL $02 [$D9CF] ; if X speed >= Y speed: $A6:D9CD A5 12 LDA $12 [$7E:0012] $A6:D9CF 0A ASL A $A6:D9D0 0A ASL A $A6:D9D1 29 00 0F AND #$0F00 $A6:D9D4 EB XBA $A6:D9D5 0A ASL A $A6:D9D6 C9 0E 00 CMP #$000E $A6:D9D9 90 03 BCC $03 [$D9DE] ; if > $E: $A6:D9DB A9 0E 00 LDA #$000E $A6:D9DE AA TAX $A6:D9DF BD ED D9 LDA $D9ED,x[$A6:D9F7] $A6:D9E2 2C AC 0F BIT $0FAC [$7E:0FAC] $A6:D9E5 30 01 BMI $01 [$D9E8] ; if moving down: $A6:D9E7 4A LSR A $A6:D9E8 8F 10 78 7E STA $7E7810[$7E:7810] $A6:D9EC 60 RTS ; wing flap speeds $A6:D9ED dw 000C, 000E, 0010, 0012, 001C, 0020, 0028, 0030 } ;;; $D9FD: ;;; { ; Initialize rib animation ; Ceres / Norfair Ridley $A6:D9FD A9 71 DA LDA #$DA71 ; rib animation data table $A6:DA00 8F 0A 78 7E STA $7E780A[$7E:780A] $A6:DA04 A9 01 00 LDA #$0001 $A6:DA07 8F 0C 78 7E STA $7E780C[$7E:780C] ; rib animation timer = 1 $A6:DA0B 60 RTS } ;;; $DA0C: ;;; { ; Animate Ridley's ribs ; Ceres / Norfair Ridley $A6:DA0C AF 0C 78 7E LDA $7E780C[$7E:780C] $A6:DA10 3A DEC A $A6:DA11 8F 0C 78 7E STA $7E780C[$7E:780C] $A6:DA15 D0 F4 BNE $F4 [$DA0B] ; if rib animation timer != 0: return $A6:DA17 AF 0A 78 7E LDA $7E780A[$7E:780A] ; use $7E780A pointer to get animation data pointer ; then read animation data pointer ; not sure if this loop is for safety or some partially removed functionality $A6:DA1B AA TAX $A6:DA1C BD 00 00 LDA $0000,x[$A6:DA71] $A6:DA1F 10 06 BPL $06 [$DA27] ; if < 0: $A6:DA21 8F 0A 78 7E STA $7E780A[$7E:780A] ; rib animation index $A6:DA25 80 F4 BRA $F4 [$DA1B] ; timer $A6:DA27 8F 0C 78 7E STA $7E780C[$7E:780C] ; timer $A6:DA2B AC 30 03 LDY $0330 [$7E:0330] $A6:DA2E A9 00 B0 LDA #$B000 $A6:DA31 99 D3 00 STA $00D3,y[$7E:00D3] $A6:DA34 99 DA 00 STA $00DA,y[$7E:00DA] ; src banks = $B0 $A6:DA37 BD 02 00 LDA $0002,x[$A6:DA73] $A6:DA3A 99 D2 00 STA $00D2,y[$7E:00D2] ; src0 $A6:DA3D BD 04 00 LDA $0004,x[$A6:DA75] $A6:DA40 99 D9 00 STA $00D9,y[$7E:00D9] ; src1 $A6:DA43 A9 20 72 LDA #$7220 $A6:DA46 99 D5 00 STA $00D5,y[$7E:00D5] ; dest0 = $7220 $A6:DA49 A9 20 73 LDA #$7320 $A6:DA4C 99 DC 00 STA $00DC,y[$7E:00DC] ; dest1 = $7320 $A6:DA4F A9 40 00 LDA #$0040 $A6:DA52 99 D0 00 STA $00D0,y[$7E:00D0] $A6:DA55 99 D7 00 STA $00D7,y[$7E:00D7] ; size = $40 $A6:DA58 98 TYA $A6:DA59 18 CLC $A6:DA5A 69 0E 00 ADC #$000E $A6:DA5D A8 TAY $A6:DA5E 8C 30 03 STY $0330 [$7E:0330] ; VRAM transfer index =+ 2 entries $A6:DA61 A9 00 00 LDA #$0000 $A6:DA64 99 D0 00 STA $00D0,y[$7E:00DE] ; clear next entry? $A6:DA67 8A TXA $A6:DA68 18 CLC $A6:DA69 69 06 00 ADC #$0006 $A6:DA6C 8F 0A 78 7E STA $7E780A[$7E:780A] ; wing animation index =+ 6 $A6:DA70 60 RTS ; animation data ; timer, src0, src1 (bank $B0) $A6:DA71 dw 0014,9840,9A40, 0014,B800,B900, 0014,B840,B940, 0014,B800,B900 ; indexed by $7E780A $A6:DA89 dw DA71 } ;;; $DA8B: ;;; { ; VRAM transfer for Ridley's claws, holding (Samus / Baby Metroid) in claws ; carry set = holding, carry clear = released $A6:DA8B A2 D0 DA LDX #$DAD0 $A6:DA8E 90 03 BCC $03 [$DA93] ; if holding: $A6:DA90 A2 D4 DA LDX #$DAD4 $A6:DA93 AC 30 03 LDY $0330 [$7E:0330] $A6:DA96 A9 00 B0 LDA #$B000 $A6:DA99 99 D3 00 STA $00D3,y[$7E:00D3] $A6:DA9C 99 DA 00 STA $00DA,y[$7E:00DA] ; src banks = $B0 $A6:DA9F BD 00 00 LDA $0000,x[$A6:DAD4] $A6:DAA2 99 D2 00 STA $00D2,y[$7E:00D2] ; src0 $A6:DAA5 BD 02 00 LDA $0002,x[$A6:DAD6] $A6:DAA8 99 D9 00 STA $00D9,y[$7E:00D9] ; src1 $A6:DAAB A9 C0 7A LDA #$7AC0 $A6:DAAE 99 D5 00 STA $00D5,y[$7E:00D5] ; dest0 = $7AC0 $A6:DAB1 A9 C0 7B LDA #$7BC0 $A6:DAB4 99 DC 00 STA $00DC,y[$7E:00DC] ; dest1 = $7BC0 $A6:DAB7 A9 80 00 LDA #$0080 $A6:DABA 99 D0 00 STA $00D0,y[$7E:00D0] $A6:DABD 99 D7 00 STA $00D7,y[$7E:00D7] ; size = $80 $A6:DAC0 98 TYA $A6:DAC1 18 CLC $A6:DAC2 69 0E 00 ADC #$000E $A6:DAC5 A8 TAY $A6:DAC6 8C 30 03 STY $0330 [$7E:0330] ; VRAM transfer index =+ 2 entries $A6:DAC9 A9 00 00 LDA #$0000 $A6:DACC 99 D0 00 STA $00D0,y[$7E:00DE] ; reset next entry $A6:DACF 60 RTS ; src0, src1 (bank $B0) $A6:DAD0 dw A980,AB80 ; released $A6:DAD4 dw B880,B980 ; holding } ;;; $DAD8: ;;; { ; Drawing routine for Ridley's wings $A6:DAD8 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:DADC F0 06 BEQ $06 [$DAE4] ; if facing not left: $A6:DADE 3A DEC A $A6:DADF F0 20 BEQ $20 [$DB01] ; if facing forward: return $A6:DAE1 A9 0A 00 LDA #$000A ; facing right $A6:DAE4 18 CLC $A6:DAE5 6F 0E 78 7E ADC $7E780E[$7E:780E] ; wing flap animation frame $A6:DAE9 0A ASL A $A6:DAEA AA TAX $A6:DAEB BC 02 DB LDY $DB02,x[$A6:DB0C] $A6:DAEE AF 18 78 7E LDA $7E7818[$7E:7818] $A6:DAF2 85 16 STA $16 [$7E:0016] ; $16 = palette index $A6:DAF4 AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:DAF7 85 12 STA $12 [$7E:0012] ; $12 = Ridley X position $A6:DAF9 AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:DAFC 85 14 STA $14 [$7E:0014] ; $14 = Ridley Y position $A6:DAFE 4C 13 DC JMP $DC13 [$A6:DC13] ; goto "General use draw" $A6:DB01 60 RTS ; spritemap pointers $A6:DB02 dw DD4A, DD6A, DD85, DD96, DDA7, DDC2, DDA7, DD96, DD85, DD6A, ; facing left DDE2, DE02, DE1D, DE2E, DE3F, DE5A, DE3F, DE2E, DE1D, DE02 ; facing right } ;;; $DB2A: ;;; { ; Draw tail $A6:DB2A AD 86 0F LDA $0F86 [$7E:0F86] $A6:DB2D 29 00 01 AND #$0100 $A6:DB30 F0 01 BEQ $01 [$DB33] ; if Ridley is invisible: $A6:DB32 60 RTS ; not invisible $A6:DB33 AF A4 20 7E LDA $7E20A4[$7E:20A4] $A6:DB37 85 12 STA $12 [$7E:0012] ; $12 = tail tip X position $A6:DB39 AF A6 20 7E LDA $7E20A6[$7E:20A6] $A6:DB3D 85 14 STA $14 [$7E:0014] ; $14 = tail tip Y position $A6:DB3F AF A2 20 7E LDA $7E20A2[$7E:20A2] ; tail tip angle $A6:DB43 18 CLC $A6:DB44 6F 8E 20 7E ADC $7E208E[$7E:208E] ; tail part 6 angle $A6:DB48 18 CLC $A6:DB49 69 08 00 ADC #$0008 $A6:DB4C 29 F0 00 AND #$00F0 $A6:DB4F 4A LSR A $A6:DB50 4A LSR A $A6:DB51 4A LSR A $A6:DB52 AA TAX ; X = tail tip pointing direction index $A6:DB53 BC BA DC LDY $DCBA,x[$A6:DCD0] ; Ridley tail tip spritemap pointers $A6:DB56 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DB59 AF 92 20 7E LDA $7E2092[$7E:2092] $A6:DB5D 85 14 STA $14 [$7E:0014] ; $14 = tail part 6 Y position $A6:DB5F AF 90 20 7E LDA $7E2090[$7E:2090] $A6:DB63 85 12 STA $12 [$7E:0012] ; $12 = tail part 6 X position $A6:DB65 A0 9E DC LDY #$DC9E ; small tail part $A6:DB68 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DB6B AF 7C 20 7E LDA $7E207C[$7E:207C] $A6:DB6F 85 12 STA $12 [$7E:0012] ; $12 = tail part 5 X position $A6:DB71 AF 7E 20 7E LDA $7E207E[$7E:207E] $A6:DB75 85 14 STA $14 [$7E:0014] ; $14 = tail part 5 Y position $A6:DB77 A0 9E DC LDY #$DC9E ; small tail part $A6:DB7A 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DB7D AF 68 20 7E LDA $7E2068[$7E:2068] $A6:DB81 85 12 STA $12 [$7E:0012] ; $12 = tail part 4 X position $A6:DB83 AF 6A 20 7E LDA $7E206A[$7E:206A] $A6:DB87 85 14 STA $14 [$7E:0014] ; $14 = tail part 4 Y position $A6:DB89 A0 97 DC LDY #$DC97 ; medium tail part $A6:DB8C 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DB8F AF 54 20 7E LDA $7E2054[$7E:2054] $A6:DB93 85 12 STA $12 [$7E:0012] ; $12 = tail part 3 X position $A6:DB95 AF 56 20 7E LDA $7E2056[$7E:2056] $A6:DB99 85 14 STA $14 [$7E:0014] ; $14 = tail part 3 Y position $A6:DB9B A0 97 DC LDY #$DC97 ; medium tail part $A6:DB9E 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DBA1 AF 40 20 7E LDA $7E2040[$7E:2040] $A6:DBA5 85 12 STA $12 [$7E:0012] ; $12 = tail part 2 X position $A6:DBA7 AF 42 20 7E LDA $7E2042[$7E:2042] $A6:DBAB 85 14 STA $14 [$7E:0014] ; $14 = tail part 2 Y position $A6:DBAD A0 90 DC LDY #$DC90 ; large tail part $A6:DBB0 20 C2 DB JSR $DBC2 [$A6:DBC2] ; "General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data" $A6:DBB3 AF 2C 20 7E LDA $7E202C[$7E:202C] $A6:DBB7 85 12 STA $12 [$7E:0012] ; $12 = tail part 1 X position $A6:DBB9 AF 2E 20 7E LDA $7E202E[$7E:202E] $A6:DBBD 85 14 STA $14 [$7E:0014] ; $14 = tail part 1 Y position $A6:DBBF A0 90 DC LDY #$DC90 ; large tail part } ;;; $DBC2: ;;; { ; General use draw, 7E7818 has pallete (wing/tail), Y is pointer to sprite data $A6:DBC2 AF 18 78 7E LDA $7E7818[$7E:7818] $A6:DBC6 85 16 STA $16 [$7E:0016] ; $16 = palette index $A6:DBC8 4C 13 DC JMP $DC13 [$A6:DC13] ; goto "General use draw" } ;;; $DBCB: ;;; { ; Calculate Baby Metroid graphic to use from instruction list ; JSR to with an address (in ram) of a pointer followed by a counter, ; data at pointer (to rom) should be a counter (frame duration) followed by a graphic pointer, ; OR a pointer to code. $A6:DBCB 85 00 STA $00 [$7E:0000] ; $00 = $7806 $A6:DBCD 1A INC A $A6:DBCE 1A INC A $A6:DBCF 85 03 STA $03 [$7E:0003] ; $03 = $7808 $A6:DBD1 E2 20 SEP #$20 $A6:DBD3 A9 7E LDA #$7E $A6:DBD5 85 02 STA $02 [$7E:0002] $A6:DBD7 85 05 STA $05 [$7E:0005] ; indirect bank = $7E $A6:DBD9 C2 20 REP #$20 $A6:DBDB A7 00 LDA [$00] [$7E:7806] ; Baby Metroid instruction list $A6:DBDD 30 02 BMI $02 [$DBE1] ; if not a pointer: $A6:DBDF 68 PLA ; pull return address to skip out of $BF1A Draw Baby Metroid $A6:DBE0 60 RTS ; pointer $A6:DBE1 AA TAX $A6:DBE2 BD 00 00 LDA $0000,x[$A6:BF31] $A6:DBE5 30 0D BMI $0D [$DBF4] ; if not a pointer: $A6:DBE7 C7 03 CMP [$03] [$7E:7808] ; $7E7808, maybe instruction timer? $A6:DBE9 D0 1F BNE $1F [$DC0A] ; if instruction list timer = counter: $A6:DBEB E8 INX $A6:DBEC E8 INX $A6:DBED E8 INX $A6:DBEE E8 INX ; skip to next instruction ; PEA return $A6:DBEF BD 00 00 LDA $0000,x[$A6:BF35] $A6:DBF2 10 0A BPL $0A [$DBFE] ; if pointer: ; instruction $A6:DBF4 85 06 STA $06 [$7E:0006] $A6:DBF6 E8 INX $A6:DBF7 E8 INX $A6:DBF8 F4 EE DB PEA $DBEE $A6:DBFB 6C 06 00 JMP ($0006)[$A6:BFF2] ; not instruction $A6:DBFE A9 01 00 LDA #$0001 $A6:DC01 87 03 STA [$03] [$7E:7808] ; $7808 counter = 1 $A6:DC03 8A TXA $A6:DC04 87 00 STA [$00] [$7E:7806] ; store instruction list pointer $A6:DC06 BC 02 00 LDY $0002,x[$A6:BF37] $A6:DC09 60 RTS ; instruction list timer != counter $A6:DC0A A7 03 LDA [$03] [$7E:7808] $A6:DC0C 1A INC A $A6:DC0D 87 03 STA [$03] [$7E:7808] ; increment $7808 counter $A6:DC0F BC 02 00 LDY $0002,x[$A6:BF37] ; Y = spritemap pointer $A6:DC12 60 RTS } ;;; $DC13: ;;; { ; General use draw, $12 has X position, $14 has Y position, $16 has palette, Y is pointer to sprite data. $A6:DC13 B9 00 00 LDA $0000,y[$A6:BFFD] $A6:DC16 C8 INY $A6:DC17 C8 INY $A6:DC18 85 18 STA $18 [$7E:0018] $A6:DC1A AE 90 05 LDX $0590 [$7E:0590] $A6:DC1D 18 CLC ; loop $A6:DC1E B9 01 00 LDA $0001,y[$A6:C000] $A6:DC21 29 00 FF AND #$FF00 $A6:DC24 10 03 BPL $03 [$DC29] $A6:DC26 09 FF 00 ORA #$00FF $A6:DC29 EB XBA $A6:DC2A 18 CLC $A6:DC2B 65 14 ADC $14 [$7E:0014] $A6:DC2D 38 SEC $A6:DC2E ED 15 09 SBC $0915 [$7E:0915] $A6:DC31 30 4F BMI $4F [$DC82] $A6:DC33 C9 E0 00 CMP #$00E0 $A6:DC36 10 4A BPL $4A [$DC82] $A6:DC38 85 1A STA $1A [$7E:001A] $A6:DC3A B9 00 00 LDA $0000,y[$A6:BFFF] $A6:DC3D 65 12 ADC $12 [$7E:0012] $A6:DC3F 38 SEC $A6:DC40 ED 11 09 SBC $0911 [$7E:0911] $A6:DC43 9D 70 03 STA $0370,x[$7E:0370] $A6:DC46 29 00 01 AND #$0100 $A6:DC49 F0 0E BEQ $0E [$DC59] $A6:DC4B BF 9F 85 81 LDA $81859F,x[$81:859F]; Map of OAM index to high OAM address and corresponding bitmask $A6:DC4F 85 1C STA $1C [$7E:001C] $A6:DC51 B2 1C LDA ($1C) [$7E:0570] $A6:DC53 1F 9F 83 81 ORA $81839F,x[$81:839F]; Map of OAM index to high X position bit and size bit $A6:DC57 92 1C STA ($1C) [$7E:0570] $A6:DC59 B9 00 00 LDA $0000,y[$A6:BFFF] $A6:DC5C 10 0E BPL $0E [$DC6C] $A6:DC5E BF 9F 85 81 LDA $81859F,x[$81:85AF]; Map of OAM index to high OAM address and corresponding bitmask $A6:DC62 85 1C STA $1C [$7E:001C] $A6:DC64 B2 1C LDA ($1C) [$7E:0570] $A6:DC66 1F A1 83 81 ORA $8183A1,x[$81:83B1]; Map of OAM index to high X position bit and size bit $A6:DC6A 92 1C STA ($1C) [$7E:0570] $A6:DC6C A5 1A LDA $1A [$7E:001A] $A6:DC6E 9D 71 03 STA $0371,x[$7E:0371] $A6:DC71 B9 03 00 LDA $0003,y[$A6:C002] $A6:DC74 05 16 ORA $16 [$7E:0016] $A6:DC76 9D 72 03 STA $0372,x[$7E:0372] $A6:DC79 8A TXA $A6:DC7A 18 CLC $A6:DC7B 69 04 00 ADC #$0004 $A6:DC7E 29 FF 01 AND #$01FF $A6:DC81 AA TAX ; next $A6:DC82 98 TYA $A6:DC83 18 CLC $A6:DC84 69 05 00 ADC #$0005 $A6:DC87 A8 TAY $A6:DC88 C6 18 DEC $18 [$7E:0018] $A6:DC8A D0 92 BNE $92 [$DC1E] $A6:DC8C 8E 90 05 STX $0590 [$7E:0590] $A6:DC8F 60 RTS } ;;; $DC90: Spritemaps ;;; { ; Tail parts $A6:DC90 dx 0001, C3F8,F8,31E0 ; large $A6:DC97 dx 0001, C3F8,F8,31E2 ; medium $A6:DC9E dx 0001, C3F8,F8,31E4 ; small ; Unused (just horizontally flipped) $A6:DCA5 dx 0001, C3F8,F8,71E0 ; large $A6:DCAC dx 0001, C3F8,F8,71E2 ; medium $A6:DCB3 dx 0001, C3F8,F8,71E4 ; small } ;;; $DCBA: Spritemap pointers ;;; { ; Ridley tail tips $A6:DCBA dw DD2E, DD27, DD20, DD19, DD12, DD0B, DD04, DCFD, DCF6, DCEF, DCE8, DCE1, DCDA, DD43, DD3C, DD35 } ;;; $DCDA: Spritemaps ;;; { ; tail tips $A6:DCDA dx 0001, C3F0,F8,31E6 ; pointing left $A6:DCE1 dx 0001, C3F0,F4,31E8 ; pointing left up left $A6:DCE8 dx 0001, C3F2,F3,31EA ; pointing up left $A6:DCEF dx 0001, C3F4,F0,31EC ; pointing up up left $A6:DCF6 dx 0001, C3F8,F0,31EE ; pointing up $A6:DCFD dx 0001, C3FC,F0,71EC ; pointing up up right $A6:DD04 dx 0001, C3FE,F3,71EA ; pointing up right $A6:DD0B dx 0001, C200,F4,71E8 ; pointing right up right $A6:DD12 dx 0001, C200,F8,71E6 ; pointing right $A6:DD19 dx 0001, C200,FC,F1E8 ; pointing right down right $A6:DD20 dx 0001, C3FE,FE,F1EA ; pointing down right $A6:DD27 dx 0001, C3FC,00,F1EC ; pointing down down right $A6:DD2E dx 0001, C3F9,00,F1EE ; pointing down $A6:DD35 dx 0001, C3F4,FF,B1EC ; pointing down down left $A6:DD3C dx 0001, C3F2,FE,B1EA ; pointing down left $A6:DD43 dx 0001, C3F0,FC,B1E8 ; pointing left down left ; wings facing left $A6:DD4A dx 0006, 002C,D7,3108, 000C,EF,3128, C21C,DF,3116, C20C,DF,3114, C21C,D7,3106, C20C,D7,3104 ; fully raised $A6:DD6A dx 0005, 002C,E4,311D, C21C,E4,311B, C20C,E4,3119, C21C,DC,310B, C20C,DC,3109 ; mostly raised $A6:DD85 dx 0003, 002C,F0,3148, C21C,E8,3136, C20C,E8,3134 ; flat, slightly raised $A6:DD96 dx 0003, 002C,E8,B148, C21C,E8,B136, C20C,E8,B134 ; flat, slightly lowered $A6:DDA7 dx 0005, 002C,F2,B11D, C21C,EA,B11B, C20C,EA,B119, C21C,F2,B10B, C20C,F2,B109 ; mostly lowered $A6:DDC2 dx 0006, 002C,FF,B108, 000C,E7,B128, C21C,EF,B116, C20C,EF,B114, C21C,F7,B106, C20C,F7,B104 ; fully lowered ; wings facing right $A6:DDE2 dx 0006, 01CC,D7,7108, 01EC,EF,7128, C3D4,DF,7116, C3E4,DF,7114, C3D4,D7,7106, C3E4,D7,7104 ; fully raised $A6:DE02 dx 0005, 01CC,E4,711D, C3D4,E4,711B, C3E4,E4,7119, C3D4,DC,710B, C3E4,DC,7109 ; mostly raised $A6:DE1D dx 0003, 01CC,F0,7148, C3D4,E8,7136, C3E4,E8,7134 ; flat, slightly raised $A6:DE2E dx 0003, 01CC,E8,F148, C3D4,E8,F136, C3E4,E8,F134 ; flat, slightly lowered $A6:DE3F dx 0005, 01CC,F2,F11D, C3D4,EA,F11B, C3E4,EA,F119, C3D4,F2,F10B, C3E4,F2,F109 ; mostly lowered $A6:DE5A dx 0006, 01CC,FF,F108, 01EC,E7,F128, C3D4,EF,F116, C3E4,EF,F114, C3D4,F7,F106, C3E4,F7,F104 ; fully lowered } ;;; $DE7A: ;;; { ; Checks if Ridley is on screen ; SEC for off-screen, CLC for on-screen $A6:DE7A AD 7E 0F LDA $0F7E [$7E:0F7E] $A6:DE7D 30 25 BMI $25 [$DEA4] $A6:DE7F 18 CLC $A6:DE80 69 20 00 ADC #$0020 $A6:DE83 38 SEC $A6:DE84 ED 15 09 SBC $0915 [$7E:0915] $A6:DE87 30 1B BMI $1B [$DEA4] $A6:DE89 C9 20 01 CMP #$0120 $A6:DE8C 10 16 BPL $16 [$DEA4] $A6:DE8E AD 7A 0F LDA $0F7A [$7E:0F7A] $A6:DE91 30 11 BMI $11 [$DEA4] $A6:DE93 18 CLC $A6:DE94 69 20 00 ADC #$0020 $A6:DE97 38 SEC $A6:DE98 ED 11 09 SBC $0911 [$7E:0911] $A6:DE9B 30 07 BMI $07 [$DEA4] $A6:DE9D C9 40 01 CMP #$0140 $A6:DEA0 10 02 BPL $02 [$DEA4] $A6:DEA2 18 CLC $A6:DEA3 60 RTS ; off-screen $A6:DEA4 38 SEC $A6:DEA5 60 RTS } ;;; $DEA6: ;;; { ; Check Tail/Projectile collisions $A6:DEA6 AD CE 0C LDA $0CCE [$7E:0CCE] $A6:DEA9 D0 02 BNE $02 [$DEAD] ; if projectile counter = 0: $A6:DEAB 18 CLC $A6:DEAC 60 RTS $A6:DEAD A0 00 00 LDY #$0000 ; loop $A6:DEB0 B9 18 0C LDA $0C18,y[$7E:0C18] $A6:DEB3 10 35 BPL $35 [$DEEA] ; if projectile doesn't interact with Samus: $A6:DEB5 EB XBA $A6:DEB6 29 0F 00 AND #$000F $A6:DEB9 C9 03 00 CMP #$0003 $A6:DEBC 10 2C BPL $2C [$DEEA] ; if not bomb, power bomb, or beam/super missile explosion?: $A6:DEBE B9 64 0B LDA $0B64,y[$7E:0B64] ; projectile X position $A6:DEC1 38 SEC $A6:DEC2 E5 12 SBC $12 [$7E:0012] $A6:DEC4 10 04 BPL $04 [$DECA] $A6:DEC6 49 FF FF EOR #$FFFF $A6:DEC9 1A INC A $A6:DECA 38 SEC $A6:DECB F9 B4 0B SBC $0BB4,y[$7E:0BB4] ; projectile X radii $A6:DECE 90 04 BCC $04 [$DED4] $A6:DED0 C5 16 CMP $16 [$7E:0016] $A6:DED2 B0 16 BCS $16 [$DEEA] $A6:DED4 B9 78 0B LDA $0B78,y[$7E:0B78] ; projectile Y position $A6:DED7 38 SEC $A6:DED8 E5 14 SBC $14 [$7E:0014] $A6:DEDA 10 04 BPL $04 [$DEE0] $A6:DEDC 49 FF FF EOR #$FFFF $A6:DEDF 1A INC A $A6:DEE0 38 SEC $A6:DEE1 F9 C8 0B SBC $0BC8,y[$7E:0BC8] ; projectile Y radii $A6:DEE4 90 0D BCC $0D [$DEF3] $A6:DEE6 C5 18 CMP $18 [$7E:0018] $A6:DEE8 90 09 BCC $09 [$DEF3] ; next projectile $A6:DEEA C8 INY $A6:DEEB C8 INY $A6:DEEC C0 0A 00 CPY #$000A $A6:DEEF 30 BF BMI $BF [$DEB0] $A6:DEF1 18 CLC $A6:DEF2 60 RTS ; collision $A6:DEF3 A5 12 LDA $12 [$7E:0012] $A6:DEF5 99 64 0B STA $0B64,y[$7E:0B64] ; projectile X position $A6:DEF8 A5 14 LDA $14 [$7E:0014] $A6:DEFA 99 78 0B STA $0B78,y[$7E:0B78] ; projectile Y position $A6:DEFD B9 04 0C LDA $0C04,y[$7E:0C04] $A6:DF00 09 10 00 ORA #$0010 $A6:DF03 99 04 0C STA $0C04,y[$7E:0C04] ; delete projectile $A6:DF06 38 SEC $A6:DF07 60 RTS } ;;; $DF08: ;;; { ; unused? $A6:DF08 B9 04 0C LDA $0C04,y $A6:DF0B 29 0F 00 AND #$000F $A6:DF0E C9 07 00 CMP #$0007 $A6:DF11 D0 05 BNE $05 [$DF18] ; if projectile facing left: $A6:DF13 A9 01 00 LDA #$0001 ; up-right $A6:DF16 80 0D BRA $0D [$DF25] $A6:DF18 C9 02 00 CMP #$0002 $A6:DF1B D0 05 BNE $05 [$DF22] ; if projectile facing right: $A6:DF1D A9 08 00 LDA #$0008 ; up-left $A6:DF20 80 03 BRA $03 [$DF25] ; not left or right $A6:DF22 A9 05 00 LDA #$0005 ; down, facing left $A6:DF25 99 04 0C STA $0C04,y $A6:DF28 60 RTS } ;;; $DF29: ;;; { ; Efficient collision detection for Samus and $12/$14 (size of $12/$14 is $16/$18). SEC if collision $A6:DF29 AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:DF2C 38 SEC $A6:DF2D E5 12 SBC $12 [$7E:0012] $A6:DF2F 10 04 BPL $04 [$DF35] $A6:DF31 49 FF FF EOR #$FFFF $A6:DF34 1A INC A $A6:DF35 38 SEC $A6:DF36 ED FE 0A SBC $0AFE [$7E:0AFE] ; Samus X radius $A6:DF39 90 04 BCC $04 [$DF3F] $A6:DF3B C5 16 CMP $16 [$7E:0016] $A6:DF3D B0 16 BCS $16 [$DF55] $A6:DF3F AD FA 0A LDA $0AFA [$7E:0AFA] ; Samus Y position $A6:DF42 38 SEC $A6:DF43 E5 14 SBC $14 [$7E:0014] $A6:DF45 10 04 BPL $04 [$DF4B] $A6:DF47 49 FF FF EOR #$FFFF $A6:DF4A 1A INC A $A6:DF4B 38 SEC $A6:DF4C ED 00 0B SBC $0B00 [$7E:0B00] ; Samus Y radius $A6:DF4F 90 06 BCC $06 [$DF57] $A6:DF51 C5 18 CMP $18 [$7E:0018] $A6:DF53 90 02 BCC $02 [$DF57] ; no collision $A6:DF55 18 CLC $A6:DF56 60 RTS ; collision $A6:DF57 38 SEC $A6:DF58 60 RTS } ;;; $DF59: ;;; { ; Ridley hitboxes point here for the contact routine $A6:DF59 22 97 A4 A0 JSL $A0A497[$A0:A497] ; Normal enemy touch AI - no death check $A6:DF5D 4C B6 DF JMP $DFB6 [$A6:DFB6] ; RTL } ;;; $DF60: ;;; { ; unused? $A6:DF60 20 66 DF JSR $DF66 [$A6:DF66] ; >.< $A6:DF63 4C B6 DF JMP $DFB6 [$A6:DFB6] ; RTL $A6:DF66 22 53 D4 A6 JSL $A6D453[$A6:D453] ; Deal suit-adjusted enemy damage to Samus $A6:DF6A A9 60 00 LDA #$0060 $A6:DF6D 8D A8 18 STA $18A8 [$7E:18A8] ; Samus invincibility = $60 $A6:DF70 A9 05 00 LDA #$0005 $A6:DF73 8D AA 18 STA $18AA [$7E:18AA] ; Samus knockback = 5 $A6:DF76 A0 00 00 LDY #$0000 $A6:DF79 AE 54 0E LDX $0E54 [$7E:0E54] $A6:DF7C AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:DF7F 38 SEC $A6:DF80 FD 7A 0F SBC $0F7A,x ; Ridley X position $A6:DF83 30 01 BMI $01 [$DF86] ; if Samus is right of Ridley: $A6:DF85 C8 INY $A6:DF86 8C 54 0A STY $0A54 [$7E:0A54] ; Samus knockback X direction $A6:DF89 60 RTS } ;;; $DF8A: Enemy shot - enemy $E13F/$E17F (Ridley) ;;; { $A6:DF8A AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:DF8D C9 02 00 CMP #$0002 $A6:DF90 F0 1A BEQ $1A [$DFAC] ; if area != norfair: $A6:DF92 A0 0D 00 LDY #$000D $A6:DF95 AD 9C 0F LDA $0F9C [$7E:0F9C] $A6:DF98 F0 04 BEQ $04 [$DF9E] ; if Ridley flash timer != 0: $A6:DF9A 4A LSR A $A6:DF9B 90 01 BCC $01 [$DF9E] ; if Ridley flash timer is even: $A6:DF9D C8 INY $A6:DF9E 8C 9C 0F STY $0F9C [$7E:0F9C] $A6:DFA1 AF 1A 78 7E LDA $7E781A[$7E:781A] $A6:DFA5 1A INC A $A6:DFA6 8F 1A 78 7E STA $7E781A[$7E:781A] $A6:DFAA 80 0A BRA $0A [$DFB6] ; Norfair Ridley $A6:DFAC 22 A7 A6 A0 JSL $A0A6A7[$A0:A6A7] ; Normal enemy shot AI - no death check, no enemy shot graphic $A6:DFB0 80 04 BRA $04 [$DFB6] } ;;; $DFB2: Power bomb reaction - enemy $E13F/$E17F (Ridley) ;;; { $A6:DFB2 22 B7 A5 A0 JSL $A0A5B7[$A0:A5B7] ; Normal enemy power bomb AI - no death check } ;;; $DFB6: RTL. Ridley reaction ;;; { $A6:DFB6 6B RTL } ;;; $DFB7: ;;; { ; Set 7802 to dead, disable Samus/Ridley interaction, next AI script is C538 $A6:DFB7 AD 8C 0F LDA $0F8C [$7E:0F8C] $A6:DFBA D0 1C BNE $1C [$DFD8] ; if Ridley health = 0: $A6:DFBC AF 02 78 7E LDA $7E7802[$7E:7802] $A6:DFC0 30 16 BMI $16 [$DFD8] ; if Ridley not marked dead: $A6:DFC2 A9 FF FF LDA #$FFFF $A6:DFC5 8F 02 78 7E STA $7E7802[$7E:7802] ; Ridley dead $A6:DFC9 AD 86 0F LDA $0F86 [$7E:0F86] $A6:DFCC 09 00 04 ORA #$0400 $A6:DFCF 8D 86 0F STA $0F86 [$7E:0F86] ; set as intangible $A6:DFD2 A9 38 C5 LDA #$C538 $A6:DFD5 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:DFD8 6B RTL } ;;; $DFD9: ;;; { ; Tail/Samus interaction $A6:DFD9 A9 0E 00 LDA #$000E $A6:DFDC 85 16 STA $16 [$7E:0016] $A6:DFDE 85 18 STA $18 [$7E:0018] ; target X/Y radii = $E $A6:DFE0 AF A4 20 7E LDA $7E20A4[$7E:20A4] $A6:DFE4 85 12 STA $12 [$7E:0012] ; $12 = tail tip X position $A6:DFE6 AF A6 20 7E LDA $7E20A6[$7E:20A6] $A6:DFEA 85 14 STA $14 [$7E:0014] ; $14 = tail tip Y position $A6:DFEC 20 29 DF JSR $DF29 [$A6:DF29] ; "Efficient collision detection for Samus and $12/$14" $A6:DFEF 90 29 BCC $29 [$E01A] $A6:DFF1 AF 38 78 7E LDA $7E7838[$7E:7838] ;\ $A6:DFF5 22 5E A4 A0 JSL $A0A45E[$A0:A45E] ;} Deal [$7E:7838] suit-adjusted damage to Samus $A6:DFF9 22 51 DF 91 JSL $91DF51[$91:DF51] ;/ $A6:DFFD A9 60 00 LDA #$0060 $A6:E000 8D A8 18 STA $18A8 [$7E:18A8] ; Samus invincibility timer = $60 $A6:E003 A9 05 00 LDA #$0005 $A6:E006 8D AA 18 STA $18AA [$7E:18AA] ; Samus knockback timer = 5 $A6:E009 A0 00 00 LDY #$0000 ; left $A6:E00C AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:E00F 38 SEC $A6:E010 EF A4 20 7E SBC $7E20A4[$7E:20A4] $A6:E014 30 01 BMI $01 [$E017] $A6:E016 C8 INY ; right $A6:E017 8C 54 0A STY $0A54 [$7E:0A54] ; Samus knockback X direction $A6:E01A 60 RTS } ;;; $E01B: ;;; { ; unused? $A6:E01B AE 54 0E LDX $0E54 [$7E:0E54] $A6:E01E AD 64 0B LDA $0B64 [$7E:0B64] ;\ $A6:E021 38 SEC ;| $A6:E022 FD 7A 0F SBC $0F7A,x ;| $A6:E025 85 12 STA $12 [$7E:0012] ;| $A6:E027 AD 78 0B LDA $0B78 [$7E:0B78] ;} A = angle from enemy to projectile 0 $A6:E02A 38 SEC ;| $A6:E02B FD 7E 0F SBC $0F7E,x ;| $A6:E02E 85 14 STA $14 [$7E:0014] ;| $A6:E030 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;/ $A6:E034 38 SEC $A6:E035 E9 80 00 SBC #$0080 $A6:E038 49 FF FF EOR #$FFFF $A6:E03B 1A INC A $A6:E03C 18 CLC $A6:E03D 69 80 00 ADC #$0080 $A6:E040 29 FF 00 AND #$00FF $A6:E043 85 12 STA $12 [$7E:0012] $A6:E045 AD A6 18 LDA $18A6 [$7E:18A6] ;\ $A6:E048 0A ASL A ;} X = [collided projectile index] * 2 $A6:E049 AA TAX ;/ $A6:E04A BD 2C 0C LDA $0C2C,x $A6:E04D 0A ASL A $A6:E04E 0A ASL A $A6:E04F C9 00 03 CMP #$0300 $A6:E052 90 03 BCC $03 [$E057] ; if projectile damage * 4 >= $300: $A6:E054 A9 00 03 LDA #$0300 ; minimum $300 $A6:E057 48 PHA $A6:E058 22 6C C2 86 JSL $86C26C[$86:C26C] ; A *= sin([$12] * pi / 80h) $A6:E05C 85 12 STA $12 [$7E:0012] $A6:E05E AE 54 0E LDX $0E54 [$7E:0E54] $A6:E061 5D AA 0F EOR $0FAA,x $A6:E064 10 09 BPL $09 [$E06F] $A6:E066 A5 12 LDA $12 [$7E:0012] $A6:E068 18 CLC $A6:E069 7D AA 0F ADC $0FAA,x $A6:E06C 9D AA 0F STA $0FAA,x $A6:E06F 68 PLA $A6:E070 22 72 C2 86 JSL $86C272[$86:C272] ; A *= cos([$12] * pi / 80h) $A6:E074 85 12 STA $12 [$7E:0012] $A6:E076 AE 54 0E LDX $0E54 [$7E:0E54] $A6:E079 5D AC 0F EOR $0FAC,x $A6:E07C 10 09 BPL $09 [$E087] $A6:E07E A5 12 LDA $12 [$7E:0012] $A6:E080 18 CLC $A6:E081 7D AC 0F ADC $0FAC,x $A6:E084 9D AC 0F STA $0FAC,x $A6:E087 60 RTS } ;;; $E088: ;;; { ; Tail tip kills projectiles ; Norfair Ridley $A6:E088 AD 86 0F LDA $0F86 [$7E:0F86] $A6:E08B 29 00 04 AND #$0400 $A6:E08E F0 01 BEQ $01 [$E091] ; if Ridley is intangible: $A6:E090 60 RTS ; not intangible $A6:E091 A9 0E 00 LDA #$000E $A6:E094 85 16 STA $16 [$7E:0016] $A6:E096 85 18 STA $18 [$7E:0018] ; target X/Y radii = $E $A6:E098 AF A4 20 7E LDA $7E20A4[$7E:20A4] $A6:E09C 85 12 STA $12 [$7E:0012] ; $12 = tail tip X position $A6:E09E AF A6 20 7E LDA $7E20A6[$7E:20A6] $A6:E0A2 85 14 STA $14 [$7E:0014] ; $14 = tail tip Y position $A6:E0A4 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E0A7 B0 7D BCS $7D [$E126] $A6:E0A9 A9 0A 00 LDA #$000A $A6:E0AC 85 16 STA $16 [$7E:0016] $A6:E0AE 85 18 STA $18 [$7E:0018] ; target X/Y radii = $E $A6:E0B0 AF 90 20 7E LDA $7E2090[$7E:2090] $A6:E0B4 85 12 STA $12 [$7E:0012] ; $12 = tail part 6 X position $A6:E0B6 AF 92 20 7E LDA $7E2092[$7E:2092] $A6:E0BA 85 14 STA $14 [$7E:0014] ; $14 = tail part 6 Y position $A6:E0BC 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E0BF B0 65 BCS $65 [$E126] $A6:E0C1 60 RTS } ;;; $E0C2: ;;; { ; unused portion of above routine, RTS'd out? ; so only the last part + tip can block projectiles $A6:E0C2 AF 7C 20 7E LDA $7E207C[$7E:207C] $A6:E0C6 85 12 STA $12 [$7E:0012] $A6:E0C8 AF 7E 20 7E LDA $7E207E[$7E:207E] $A6:E0CC 85 14 STA $14 [$7E:0014] $A6:E0CE 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E0D1 B0 53 BCS $53 [$E126] $A6:E0D3 A9 0B 00 LDA #$000B $A6:E0D6 85 16 STA $16 [$7E:0016] $A6:E0D8 85 18 STA $18 [$7E:0018] $A6:E0DA AF 68 20 7E LDA $7E2068[$7E:2068] $A6:E0DE 85 12 STA $12 [$7E:0012] $A6:E0E0 AF 6A 20 7E LDA $7E206A[$7E:206A] $A6:E0E4 85 14 STA $14 [$7E:0014] $A6:E0E6 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E0E9 B0 3B BCS $3B [$E126] $A6:E0EB AF 54 20 7E LDA $7E2054[$7E:2054] $A6:E0EF 85 12 STA $12 [$7E:0012] $A6:E0F1 AF 56 20 7E LDA $7E2056[$7E:2056] $A6:E0F5 85 14 STA $14 [$7E:0014] $A6:E0F7 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E0FA B0 2A BCS $2A [$E126] $A6:E0FC A9 0D 00 LDA #$000D $A6:E0FF 85 16 STA $16 [$7E:0016] $A6:E101 85 18 STA $18 [$7E:0018] $A6:E103 AF 40 20 7E LDA $7E2040[$7E:2040] $A6:E107 85 12 STA $12 [$7E:0012] $A6:E109 AF 42 20 7E LDA $7E2042[$7E:2042] $A6:E10D 85 14 STA $14 [$7E:0014] $A6:E10F 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E112 B0 12 BCS $12 [$E126] $A6:E114 AF 2C 20 7E LDA $7E202C[$7E:202C] $A6:E118 85 12 STA $12 [$7E:0012] $A6:E11A AF 2E 20 7E LDA $7E202E[$7E:202E] $A6:E11E 85 14 STA $14 [$7E:0014] $A6:E120 20 A6 DE JSR $DEA6 [$A6:DEA6] ; "Check Tail/Projectile collisions" $A6:E123 B0 01 BCS $01 [$E126] $A6:E125 60 RTS } ;;; $E126: ;;; { ; tail vs projectile collision detected $A6:E126 B9 64 0B LDA $0B64,y[$7E:0B64] ;\ $A6:E129 85 12 STA $12 [$7E:0012] ;} $12 = [projectile X position] $A6:E12B B9 78 0B LDA $0B78,y[$7E:0B78] ;\ $A6:E12E 85 14 STA $14 [$7E:0014] ;} $14 = [projectile Y position] $A6:E130 B9 19 0C LDA $0C19,y[$7E:0C19] $A6:E133 29 0F 00 AND #$000F $A6:E136 A0 0C 00 LDY #$000C ; A = Ch (smoke) $A6:E139 3A DEC A ;\ $A6:E13A D0 0A BNE $0A [$E146] ;} If projectile is missile: $A6:E13C A9 3D 00 LDA #$003D ;\ $A6:E13F 22 49 90 80 JSL $809049[$80:9049] ;} Queue sound 3Dh, sound library 1, max queued sounds allowed = 6 (dud shot) $A6:E143 A0 06 00 LDY #$0006 ; A = 6 (dud shot) $A6:E146 98 TYA $A6:E147 A0 09 E5 LDY #$E509 ;\ $A6:E14A 22 97 80 86 JSL $868097[$86:8097] ;} Spawn dust cloud / explosion enemy projectile $A6:E14E 60 RTS } ;;; $E14F: Palette - enemy $E13F/$E17F (Ridley) ;;; { $A6:E14F dw 0000, 56BA, 41B2, 1447, 0403, 4E15, 3570, 24CB, 1868, 5E5F, 183F, 1014, 031F, 01DA, 00F5, 0C63 } ;;; $E16F: Palettes ;;; { $A6:E16F dw 0000, 7E20, 6560, 2060, 1000, 7940, 5D00, 4CA0, 3CA0, 43FF, 0113, 000F, 175C, 0299, 01D6, 57E0 ; Ceres Ridley init, sprite palette 2 $A6:E18F dw 0000, 6BF5, 06E1, 0641, 05A1, 5E5F, 183F, 1014, 080A, 0404, 4F9F, 3ED8, 2E12, 6F70, 7FFF, 5EE0 } ;;; $E1AF: Palette - enemy $E1BF (Ridley explosion) ;;; { $A6:E1AF dw 3800, 56BA, 41B2, 1447, 0403, 4E15, 3570, 24CB, 1868, 5E5F, 183F, 1014, 031F, 01DA, 00F5, 0C63 } ;;; $E1CF: Palettes ;;; { ; Enemy $E1FF (Ceres steam) palette points to $E23F, right in the middle of this section... $A6:E1CF dw 3800, 6B5A, 5652, 28E7, 1863, 62B5, 4A10, 396B, 3129, 43FF, 0113, 000F, 175C, 0299, 01D6, 3BE0 ; Norfair Ridley init, sprite palette 2 $A6:E1EF dw 3800, 6BF5, 06E1, 0641, 05A1, 5E5F, 183F, 1014, 080A, 0404, 4F9F, 3ED8, 2E12, 6F70, 7FFF, 5EE0 ; Baby Metroid $A6:E20F dw 6BF5, 06E1, 0641, 05A1, 5E5F, 183F, 1014, 080A, 0404, 4F9F, 3ED8, 2E12, 6F70, 7FFF, 5EE0 ; horizontal squish $A6:E22D dw 77F8, 1344, 12A4, 1204, 6ABF, 249F, 1C77, 146D, 1067, 5BFF, 4B38, 3A72, 7BD3, 7FFF, 6B43 ; round $A6:E24B dw 7FFB, 1FA7, 1F07, 1E67, 771F, 30FF, 28DA, 20D0, 1CCA, 67FF, 579B, 46D5, 7BD6, 7FFF, 77A6 ; vertical squish } ;;; $E269: ;;; { ; Ceres Ridley: indices into color data below ($E2AA) ; indexed by $0FB0 ; reads F first and increments $0FB0 every frame $A6:E269 db 0F, 0E, 0D, 0C, 0B, 0A, 09, 08, 07, 06, 05, 04, 03, 02, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF } ;;; $E2AA: ;;; { ; Ceres Ridley: eye glow fade in? colors ; indexed by $0FB0 * 6 + $E269 (table above) $A6:E2AA dw 031F,01DA,00F5, 02DD,01B8,00D3, 029A,0196,00D2, 0278,0174,00B0, 0236,0153,00AF, 0214,0131,008E, 01D2,010F,008C, 0190,00ED,006B, 016E,00CC,0069, 012C,00AA,0048, 010A,0088,0047, 00C8,0067,0025, 0086,0045,0024, 0064,0023,0022, 0022,0021,0001, 0000,0000,0000 } ;;; $E30A: ;;; { ; Ceres / Norfair Ridley ; Fade in palettes ; Sprite palette 1 and 7 $A6:E30A dw 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0421,0401,0000,0000,0421,0001,0000,0000,0422,0002,0001, 0843,0822,0001,0000,0842,0422,0401,0001,0C44,0004,0002, 1085,0C43,0401,0000,0C64,0843,0422,0401,1066,0406,0004, 14A7,1064,0401,0000,1485,0C64,0823,0402,1888,0408,0405, 1CE8,1486,0402,0001,18A7,1065,0C43,0822,1CCA,080A,0406, 210A,18A7,0802,0001,1CC8,1486,0C44,0823,24EC,080C,0408, 252C,1CC8,0823,0001,20E9,18A7,1045,0823,290E,080E,0409, 2D6D,20E9,0823,0001,290B,1CA8,1065,0C24,3130,0C10,080A, 318F,24EA,0C24,0001,2D2C,1CC9,1466,0C24,3552,0C12,080C, 39D1,290C,0C24,0002,314E,20EA,1887,1045,3D94,1014,080D, 3DF3,2D2D,0C25,0002,396F,250B,1888,1045,41B6,1016,0C0E, 4214,314E,1025,0002,3D90,290C,1C88,1046,49D8,1018,0C10, 4A56,356F,1026,0002,41B2,2D2D,1CA9,1447,51FA,141A,0C11, 4E78,3D90,1026,0402,45F3,314F,20AA,1447,561D,143D,0C12, 56BA,41B2,1447,0403,4E15,3570,24CB,1868,5E5F,183F,1014 } ;;; $E46A: ;;; { ; health based palettes $A6:E46A dw 4E7A,3D73,1449,0405,45D6,3151,20AD,184A,561F,183F,1015,02BF,019A,00D6, ; < 9000 4A5A,3973,142A,0407,45B6,3132,20AE,184B,51FF,183F,1015,029F,019A,00D6, ; < 5400 4A3B,3954,142B,0808,41B7,2D33,20AF,184C,4DDF,183F,1016,067F,057B,04B7 ; < 1800 } ;;; $E4BE: Instruction ;;; { ; Queue Ridley roar SFX $A6:E4BE A9 59 00 LDA #$0059 $A6:E4C1 8F 1E 78 7E STA $7E781E[$7E:781E] ; Ridley is roaring $A6:E4C5 22 CB 90 80 JSL $8090CB[$80:90CB] ; Queue sound 59h, sound library 2, max queued sounds allowed = 6 (Ridley's roar) $A6:E4C9 6B RTL } ;;; $E4CA: Instruction ;;; { ; Done playing roar SFX $A6:E4CA A9 00 00 LDA #$0000 $A6:E4CD 8F 1E 78 7E STA $7E781E[$7E:781E] ; Ridley is no longer roaring $A6:E4D1 6B RTL } ;;; $E4D2: Instruction ;;; { ; If in Norfair or Samus is above 29 health, go to next instruction. Else go to argument, and set main AI script timer to 8 ; Goto [[Y]] and set timer to 8 if not Norfair or Samus < 30 energy $A6:E4D2 AD 9F 07 LDA $079F [$7E:079F] ; Area index $A6:E4D5 C9 02 00 CMP #$0002 $A6:E4D8 F0 3A BEQ $3A [$E514] ; if area != norfair: $A6:E4DA AD C2 09 LDA $09C2 [$7E:09C2] $A6:E4DD C9 1E 00 CMP #$001E $A6:E4E0 10 32 BPL $32 [$E514] ; if Samus energy < 30: $A6:E4E2 A9 08 00 LDA #$0008 $A6:E4E5 8F 00 78 7E STA $7E7800[$7E:7800] } ;;; $E4E9: Instruction - goto [[Y]] ;;; { $A6:E4E9 B9 00 00 LDA $0000,y[$A6:E53A] $A6:E4EC A8 TAY $A6:E4ED 6B RTL } ;;; $E4EE: Instruction ;;; { ; unused? ; Ceres Ridley ; Goto [[Y]]+2 if not holding Baby Metroid $A6:E4EE AF 36 78 7E LDA $7E7836[$7E:7836] $A6:E4F2 D0 F5 BNE $F5 [$E4E9] ; if Ridley is not holding Baby Metroid?: $A6:E4F4 C8 INY $A6:E4F5 C8 INY $A6:E4F6 80 F1 BRA $F1 [$E4E9] } ;;; $E4F8: Instruction ;;; { ; unused? ; Ceres Ridley ; Goto [[Y]] if holding Baby Metroid $A6:E4F8 AF 36 78 7E LDA $7E7836[$7E:7836] $A6:E4FC F0 EB BEQ $EB [$E4E9] ; if holding Samus: $A6:E4FE C8 INY $A6:E4FF C8 INY $A6:E500 6B RTL } ;;; $E501: Instruction ;;; { ; Ceres Ridley ; This instruction is useless ; Update Samus previous position (useless) and set Samus Y displacement while held by Ridley (never read) $A6:E501 AD F6 0A LDA $0AF6 [$7E:0AF6] ; Samus X position $A6:E504 8D 10 0B STA $0B10 [$7E:0B10] ; Samus previous X position $A6:E507 AD FA 0A LDA $0AFA [$7E:0AFA] ; Samus Y position $A6:E50A 8D 14 0B STA $0B14 [$7E:0B14] ; Samus previous Y position $A6:E50D B9 00 00 LDA $0000,y $A6:E510 8F 3A 78 7E STA $7E783A[$7E:783A] ; Samus Y displacement while held by Ridley } ;;; $E514: Y += 2 ;;; { ; skip argument, next instruction $A6:E514 C8 INY $A6:E515 C8 INY $A6:E516 6B RTL } ;;; $E517: Instruction ;;; { ; Move on to next command if Ridley is facing left, else go to argument. ; Choose instruction list based on Ridley facing direction $A6:E517 AF 20 78 7E LDA $7E7820[$7E:7820] $A6:E51B F0 F7 BEQ $F7 [$E514] ; if not facing left: $A6:E51D 80 CA BRA $CA [$E4E9] } ;;; $E51F: Instruction ;;; { ; Add the following bytes to Ridley's X / Y position $A6:E51F B9 00 00 LDA $0000,y[$A6:E927] $A6:E522 18 CLC $A6:E523 6D 7A 0F ADC $0F7A [$7E:0F7A] $A6:E526 8D 7A 0F STA $0F7A [$7E:0F7A] $A6:E529 B9 02 00 LDA $0002,y[$A6:E929] $A6:E52C 18 CLC $A6:E52D 6D 7E 0F ADC $0F7E [$7E:0F7E] $A6:E530 8D 7E 0F STA $0F7E [$7E:0F7E] $A6:E533 C8 INY $A6:E534 C8 INY $A6:E535 C8 INY $A6:E536 C8 INY $A6:E537 6B RTL } ;;; $E538..E71B: Instruction lists ;;; { ;;; $E538: Instruction list - ;;; { ; Initialization (draws and avoids crashing) ; Ceres / Norfair Ridley ; Facing left $A6:E538 dx E517,E542, ; if facing direction = not left: goto $E542 000C,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E542: Instruction list - ;;; { ; Norfair Ridley ; Initialization, facing right $A6:E542 dx 000C,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E548: Instruction list - ;;; { ; Ceres Ridley ; Lunging, facing left $A6:E548 dx E517,E576, ; if facing direction = not left: goto $E576 E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E983, ; Facing left, legs pulled up E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA4F, ; Facing left, legs half extended E501,0004, ; (useless) Update Samus previous position and set $7E783A 0050,EA71, ; Facing left, legs extended E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA4F, ; Facing left, legs half extended E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E576: Instruction list - ;;; { ; Unused ; Ceres Ridley ; Lunging, facing right $A6:E576 dx E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E9A5, ; Facing right, legs pulled up E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA93, ; Facing right, legs half extended E501,0004, ; (useless) Update Samus previous position and set $7E783A 0050,EAB5, ; Facing right, legs extended E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA93, ; Facing right, legs half extended E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E5A0: Instruction list - ;;; { ; unused? ; Ceres Ridley ; Facing left $A6:E5A0 dx E517,E5FE, ; if facing direction = not left: goto $E5FE E501,0000, ; (useless) Update Samus previous position and set $7E783A 0002,E983, ; Facing left, legs pulled up E4F8,E5B2, ; if holding Baby Metroid: goto $E5B2 812F ; Sleep } ;;; $E5B2: Instruction list - ;;; { ; unused? ; Ceres Ridley $A6:E5B2 dx E501,0002, ; (useless) Update Samus previous position and set $7E783A 0003,EA4F, ; Facing left, legs half extended E4F8,E5C8, ; if holding Baby Metroid: goto $E5C8 $A6:E5BE 0001,EA4F, ; Facing left, legs half extended E4EE,E5BE,E5F4, ; Goto $E5F4 if not holding Baby Metroid $A6:E5C8 E501,0004, ; (useless) Update Samus previous position and set $7E783A 0004,EA71, ; Facing left, legs extended E4F8,E5DE, ; if holding Baby Metroid: goto $E5DE $A6:E5D4 0001,EA71, ; Facing left, legs extended E4EE,E5D4,E5DE, ; Goto $E5DE if not holding Baby Metroid $A6:E5DE E501,0002, ; (useless) Update Samus previous position and set $7E783A 0003,EA4F, ; Facing left, legs half extended E4F8,E5F4, ; if holding Baby Metroid: goto $E5F4 $A6:E5EA 0001,EA4F, ; Facing left, legs half extended E4EE,E5EA,E5F4, ; Goto $E5F4 if not holding Baby Metroid $A6:E5F4 E501,0000, ; (useless) Update Samus previous position and set $7E783A 0002,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E5FE: Instruction list - ;;; { ; unused? ; Ceres Ridley ; Facing right $A6:E5FE dx E501,0000, ; (useless) Update Samus previous position and set $7E783A 0002,E9A5, ; Facing right, legs pulled up E4F8,E60C, ; if holding Baby Metroid: goto $E60C 812F ; Sleep } ;;; $E60C: Instruction list - ;;; { ; unused? ; Ceres Ridley $A6:E60C dx E501,0002, ; (useless) Update Samus previous position and set $7E783A 0003,EA93, ; Facing right, legs half extended E4F8,E622, ; if holding Baby Metroid: goto $E622 $A6:E618 0001,EA93, ; Facing right, legs half extended E4EE,E618,E64E, ; Goto $E64E if not holding Baby Metroid $A6:E622 E501,0004, ; (useless) Update Samus previous position and set $7E783A 0004,EAB5, ; Facing right, legs extended E4F8,E638, ; if holding Baby Metroid: goto $E638 $A6:E62E 0001,EA71, ; Facing left, legs extended E4EE,E62E,E638, ; Goto $E638 if not holding Baby Metroid $A6:E638 E501,0002, ; (useless) Update Samus previous position and set $7E783A 0003,EA93, ; Facing right, legs half extended E4F8,E64E, ; if holding Baby Metroid: goto $E64E $A6:E644 0001,EA4F, ; Facing left, legs half extended E4EE,E644,E64E, ; Goto $E64E if not holding Baby Metroid $A6:E64E E501,0000, ; (useless) Update Samus previous position and set $7E783A 0002,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E658: Instruction list - ;;; { ; Ceres Ridley ; Facing left $A6:E658 dx E517,E676, ; if facing direction = not left: goto $E676 E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E983, ; Facing left, legs pulled up E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA4F, ; Facing left, legs half extended E501,0004, ; (useless) Update Samus previous position and set $7E783A 0001,EA71, ; Facing left, legs extended 812F ; Sleep } ;;; $E676: Instruction list - ;;; { ; Ceres Ridley ; Facing right $A6:E676 dx E501,0000, ; (useless) Update Samus previous position and set $7E783A 0004,E9A5, ; Facing right, legs pulled up E501,0002, ; (useless) Update Samus previous position and set $7E783A 0006,EA93, ; Facing right, legs half extended E501,0004, ; (useless) Update Samus previous position and set $7E783A 0001,EAB5, ; Facing right, legs extended 812F ; Sleep } ;;; $E690: Instruction list - ;;; { ; Ceres / Norfair Ridley ; Opening roar and open/close mouth ; Facing left $A6:E690 dx E517,E6AE, ; if facing direction = not left: goto $E6AE 0006,E983, ; Facing left, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9C7, ; Facing left, mouth half open 0060,E9E9, ; Facing left, mouth open 0008,E9C7, ; Facing left, mouth half open E4CA, ; Done playing roar SFX 0001,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E6AE: Instruction list - ;;; { ; Ceres / Norfair Ridley ; Facing right ; Opening roar and open/close mouth $A6:E6AE dx 0006,E9A5, ; Facing right, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,EA0B, ; Facing right, mouth half open 0060,EA2D, ; Facing right, mouth open 0008,E9E9, ; Facing left, mouth open E4CA, ; Done playing roar SFX 0001,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E6C8: Instruction list - ;;; { ; Death roar ; Facing left ; Norfair Ridley $A6:E6C8 dx E517,E6DE, ; if facing direction = not left: goto $E6DE 0006,E983, ; Facing left, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9C7, ; Facing left, mouth half open 0010,E9E9, ; Facing left, mouth open E4CA, ; Done playing roar SFX 812F ; Sleep } ;;; $E6DE: Instruction list - ;;; { ; Facing right ; Norfair Ridley $A6:E6DE dx 0006,E9A5, ; Facing right, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9E9, ; Facing left, mouth open 0010,EA2D, ; Facing right, mouth open E4CA, ; Done playing roar SFX 812F ; Sleep } ;;; $E6F0: Instruction list - ;;; { ; Norfair Ridley ; Turn from left to right $A6:E6F0 dx E727, ; Set facing direction to forward / turning 0001,E983, ; Facing left, legs pulled up 0008,EAD7, ; Facing forward E72F, ; Set facing direction to right and update tail rotation direction, angle, and distance from Ridley 0001,EAD7, ; Facing forward 0001,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E706: Instruction list - ;;; { ; Norfair Ridley ; Turn from right to left $A6:E706 dx E727, ; Set facing direction to forward / turning 0001,E9A5, ; Facing right, legs pulled up 0008,EAD7, ; Facing forward E71C, ; Set facing direction to left and update tail rotation direction, angle, and distance from Ridley 0001,EAD7, ; Facing forward 0001,E983, ; Facing left, legs pulled up 812F ; Sleep } } ;;; $E71C: Instruction ;;; { ; Set facing direction to left and update tail rotation direction, angle, and distance from Ridley $A6:E71C A9 00 00 LDA #$0000 $A6:E71F 8F 20 78 7E STA $7E7820[$7E:7820] ; facing left $A6:E723 20 F9 D3 JSR $D3F9 [$A6:D3F9] ; Update tail rotation direction, angle, and distance from Ridley $A6:E726 6B RTL } ;;; $E727: Instruction ;;; { ; Set facing direction to forward / turning $A6:E727 A9 01 00 LDA #$0001 $A6:E72A 8F 20 78 7E STA $7E7820[$7E:7820] ; facing forward / turning $A6:E72E 6B RTL } ;;; $E72F: Instruction ;;; { ; Set facing direction to right and update tail rotation direction, angle, and distance from Ridley $A6:E72F A9 02 00 LDA #$0002 $A6:E732 8F 20 78 7E STA $7E7820[$7E:7820] ; facing right $A6:E736 20 F9 D3 JSR $D3F9 [$A6:D3F9] ; Update tail rotation direction, angle, and distance from Ridley $A6:E739 6B RTL } ;;; $E73A: Instruction list - ;;; { ; Fireballing ; Facing left $A6:E73A dx E517,E7B4, ; if facing direction = not left: goto $E7B4 E4D2,E7AC, ; Goto $E7AC and set timer to 8 if not Norfair or Samus < 30 energy 0008,E983, ; Facing left, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9C7, ; Facing left, mouth half open 0002,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E904, ; Fires lead fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0030,E9E9, ; Facing left, mouth open 0008,E9C7, ; Facing left, mouth half open E4D2,E7AC, ; Goto $E7AC and set timer to 8 if not Norfair or Samus < 30 energy 0020,E983, ; Facing left, legs pulled up E84D, ; Calculate fireball angle and X/Y speeds E4BE, ; Queue Ridley roar SFX 0008,E9C7, ; Facing left, mouth half open 0002,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E904, ; Fires lead fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,E9E9, ; Facing left, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0030,E9E9, ; Facing left, mouth open 0008,E9C7, ; Facing left, mouth half open $A6:E7AC E4CA, ; Done playing roar SFX 0001,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E7B4: Instruction list - ;;; { ; Fireballing ; Facing right $A6:E7B4 dx E4D2,E820, ; Goto $E820 and set timer to 8 if not Norfair or Samus < 30 energy 0008,E9A5, ; Facing right, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9E9, ; Facing left, mouth open 0002,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E904, ; Fires lead fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0030,EA2D, ; Facing right, mouth open 0008,E9E9, ; Facing left, mouth open E4D2,E820, ; Goto $E820 and set timer to 8 if not Norfair or Samus < 30 energy 0020,E9A5, ; Facing right, legs pulled up E4BE, ; Queue Ridley roar SFX 0008,E9E9, ; Facing left, mouth open 0002,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E904, ; Fires lead fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0005,EA2D, ; Facing right, mouth open E84D, ; Calculate fireball angle and X/Y speeds E909, ; Fires following fireball 0030,EA2D, ; Facing right, mouth open 0008,E9E9, ; Facing left, mouth open $A6:E820 E4CA, ; Done playing roar SFX 0001,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E828: Unused ;;; { $A6:E828 A9 00 00 LDA #$0000 $A6:E82B 22 40 E8 A6 JSL $A6E840[$A6:E840] $A6:E82F A9 01 00 LDA #$0001 $A6:E832 22 40 E8 A6 JSL $A6E840[$A6:E840] $A6:E836 A9 02 00 LDA #$0002 $A6:E839 22 40 E8 A6 JSL $A6E840[$A6:E840] $A6:E83D A9 03 00 LDA #$0003 } ;;; $E840: ;;; { ; unused ; spawn unused enemy projectile $9634 $A6:E840 8D B4 0F STA $0FB4 [$7E:0FB4] $A6:E843 5A PHY $A6:E844 A0 34 96 LDY #$9634 ;\ $A6:E847 22 27 80 86 JSL $868027[$86:8027] ;} Spawn unused enemy projectile $9634 $A6:E84B 7A PLY $A6:E84C 6B RTL } ;;; $E84D: Instruction ;;; { ; Calculate fireball angle and X/Y speeds $A6:E84D DA PHX $A6:E84E 5A PHY $A6:E84F AF 20 78 7E LDA $7E7820[$7E:7820] $A6:E853 D0 4C BNE $4C [$E8A1] ; if Ridley direction = left: $A6:E855 A9 E7 FF LDA #$FFE7 ;\ $A6:E858 18 CLC ;| $A6:E859 6D 7A 0F ADC $0F7A [$7E:0F7A] ;| $A6:E85C 85 12 STA $12 [$7E:0012] ;| $A6:E85E AD F6 0A LDA $0AF6 [$7E:0AF6] ;| $A6:E861 38 SEC ;| $A6:E862 E5 12 SBC $12 [$7E:0012] ;| $A6:E864 85 12 STA $12 [$7E:0012] ;| $A6:E866 A9 D5 FF LDA #$FFD5 ;} A = angle from enemy position - (19h, 2Bh) to Samus $A6:E869 18 CLC ;| $A6:E86A 6D 7E 0F ADC $0F7E [$7E:0F7E] ;| $A6:E86D 85 14 STA $14 [$7E:0014] ;| $A6:E86F AD FA 0A LDA $0AFA [$7E:0AFA] ;| $A6:E872 38 SEC ;| $A6:E873 E5 14 SBC $14 [$7E:0014] ;| $A6:E875 85 14 STA $14 [$7E:0014] ;| $A6:E877 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;/ $A6:E87B 38 SEC $A6:E87C E9 80 00 SBC #$0080 $A6:E87F 49 FF FF EOR #$FFFF $A6:E882 1A INC A $A6:E883 29 FF 00 AND #$00FF $A6:E886 C9 B0 00 CMP #$00B0 $A6:E889 B0 0A BCS $0A [$E895] $A6:E88B C9 40 00 CMP #$0040 $A6:E88E 90 0A BCC $0A [$E89A] $A6:E890 A9 B0 00 LDA #$00B0 $A6:E893 80 08 BRA $08 [$E89D] $A6:E895 C9 EB 00 CMP #$00EB $A6:E898 90 03 BCC $03 [$E89D] $A6:E89A A9 EB 00 LDA #$00EB $A6:E89D 85 12 STA $12 [$7E:0012] $A6:E89F 80 4A BRA $4A [$E8EB] ; facing right $A6:E8A1 A9 19 00 LDA #$0019 ;\ $A6:E8A4 18 CLC ;| $A6:E8A5 6D 7A 0F ADC $0F7A [$7E:0F7A] ;| $A6:E8A8 85 12 STA $12 [$7E:0012] ;| $A6:E8AA AD F6 0A LDA $0AF6 [$7E:0AF6] ;| $A6:E8AD 38 SEC ;| $A6:E8AE E5 12 SBC $12 [$7E:0012] ;| $A6:E8B0 85 12 STA $12 [$7E:0012] ;| $A6:E8B2 A9 D5 FF LDA #$FFD5 ;} A = angle from enemy position + (19h, -2Bh) to Samus $A6:E8B5 18 CLC ;| $A6:E8B6 6D 7E 0F ADC $0F7E [$7E:0F7E] ;| $A6:E8B9 85 14 STA $14 [$7E:0014] ;| $A6:E8BB AD FA 0A LDA $0AFA [$7E:0AFA] ;| $A6:E8BE 38 SEC ;| $A6:E8BF E5 14 SBC $14 [$7E:0014] ;| $A6:E8C1 85 14 STA $14 [$7E:0014] ;| $A6:E8C3 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;/ $A6:E8C7 38 SEC $A6:E8C8 E9 80 00 SBC #$0080 $A6:E8CB 49 FF FF EOR #$FFFF $A6:E8CE 1A INC A $A6:E8CF 29 FF 00 AND #$00FF $A6:E8D2 C9 50 00 CMP #$0050 $A6:E8D5 90 0A BCC $0A [$E8E1] $A6:E8D7 C9 C0 00 CMP #$00C0 $A6:E8DA B0 0A BCS $0A [$E8E6] $A6:E8DC A9 50 00 LDA #$0050 $A6:E8DF 80 08 BRA $08 [$E8E9] $A6:E8E1 C9 15 00 CMP #$0015 $A6:E8E4 B0 03 BCS $03 [$E8E9] $A6:E8E6 A9 15 00 LDA #$0015 $A6:E8E9 85 12 STA $12 [$7E:0012] $A6:E8EB A9 00 05 LDA #$0500 $A6:E8EE 22 6C C2 86 JSL $86C26C[$86:C26C] ; A *= sin([$12] * pi / 80h) $A6:E8F2 8F 32 78 7E STA $7E7832[$7E:7832] $A6:E8F6 A9 00 05 LDA #$0500 $A6:E8F9 22 72 C2 86 JSL $86C272[$86:C272] ; A *= cos([$12] * pi / 80h) $A6:E8FD 8F 34 78 7E STA $7E7834[$7E:7834] $A6:E901 7A PLY $A6:E902 FA PLX $A6:E903 6B RTL } ;;; $E904: Instruction ;;; { ; Fires lead fireball $A6:E904 A9 00 00 LDA #$0000 $A6:E907 80 03 BRA $03 [$E90C] } ;;; $E909: Instruction ;;; { ; Fires following fireball $A6:E909 A9 0E 00 LDA #$000E } ;;; $E90C: ;;; { ; Spawn fireball $A6:E90C 8D 95 19 STA $1995 [$7E:1995] $A6:E90F AF 20 78 7E LDA $7E7820[$7E:7820] ; Ridley direction $A6:E913 5A PHY $A6:E914 A0 42 96 LDY #$9642 ;\ $A6:E917 22 97 80 86 JSL $868097[$86:8097] ;} Spawn Ridley's fireball enemy projectile $A6:E91B 7A PLY $A6:E91C 6B RTL } ;;; $E91D: Instruction list - ;;; { ; Fly up and start main AI, I guess ; Facing left ; Ceres Ridley $A6:E91D dx E517,E945, ; if facing direction = not left: goto $E945 0003,E983, ; Facing left, legs pulled up E51F,0001,FFF4, ; Move Ridley by X/Y 0004,EA4F, ; Facing left, legs half extended E51F,FFFC,FFF8, ; Move Ridley by X/Y 0005,EA71, ; Facing left, legs extended E969, ; Set Ceres Main AI and vertical speed 0011,EA4F, ; Facing left, legs half extended 0011,E983, ; Facing left, legs pulled up 812F ; Sleep } ;;; $E945: Instruction list - ;;; { ; Fly up and start main AI, I guess ; Facing right ; Norfair Ridley $A6:E945 dx 0003,E9A5, ; Facing right, legs pulled up E51F,FFFF,FFF4, ; Move Ridley by X/Y 0004,EA93, ; Facing right, legs half extended E51F,0004,FFF8, ; Move Ridley by X/Y 0005,EAB5, ; Facing right, legs extended E976, ; Set Norfair Main AI and vertical speed 0011,EA93, ; Facing right, legs half extended 0011,E9A5, ; Facing right, legs pulled up 812F ; Sleep } ;;; $E969: Instruction ;;; { ; Set Ridley's main AI to $A6AF (Startup liftoff, facing left), and vertical speed to FEA0. (Ceres) $A6:E969 A9 AF A6 LDA #$A6AF ; "Startup liftoff, facing left" $A6:E96C 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:E96F A9 A0 FE LDA #$FEA0 $A6:E972 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed = $FEA0 $A6:E975 6B RTL } ;;; $E976: Instruction ;;; { ; Set Ridley's main AI to $B2F3 (Startup liftoff, facing right), and vertical speed to FEA0. (Norfair) $A6:E976 A9 F3 B2 LDA #$B2F3 ; "Startup liftoff, facing right" $A6:E979 8D A8 0F STA $0FA8 [$7E:0FA8] ; next function pointer $A6:E97C A9 A0 FE LDA #$FEA0 $A6:E97F 8D AC 0F STA $0FAC [$7E:0FAC] ; Ridley Y speed = $FEA0 $A6:E982 6B RTL } ;;; $E983: Ridley extended spritemaps ;;; { ; Ridley facing left $A6:E983 dx 0004, 000F,0016,ED29,EB2F, FFF8,0007,ED8E,EB59, 0010,0000,ED95,EB67, FFFD,FFE8,EC5B,EAE1 ; Ridley facing right $A6:E9A5 dx 0004, FFF1,0016,EF25,EBF9, 0008,0007,EF8A,EC23, FFF0,0000,EF91,EC31, 0003,FFE8,EE57,EBAB ; Ridley facing left, mouth half open $A6:E9C7 dx 0004, 000F,0016,ED29,EB2F, FFF8,0007,ED8E,EB59, 0010,0000,ED95,EB67, FFFD,FFE8,EC99,EAFB ; Ridley facing left, mouth open $A6:E9E9 dx 0004, 000F,0016,ED29,EB2F, FFF8,0007,ED8E,EB59, 0010,0000,ED95,EB67, FFFD,FFE8,ECDC,EB15 ; Ridley facing right, mouth half open $A6:EA0B dx 0004, FFF1,0016,EF25,EBF9, 0008,0007,EF8A,EC23, FFF0,0000,EF91,EC31, 0003,FFE8,EE95,EBC5 ; Ridley facing right, mouth open $A6:EA2D dx 0004, FFF1,0016,EF25,EBF9, 0008,0007,EF8A,EC23, FFF0,0000,EF91,EC31, 0003,FFE8,EED8,EBDF ; Ridley facing left, legs half extended $A6:EA4F dx 0004, 000F,0016,ED4E,EB3D, FFF8,0007,ED8E,EB59, 0010,0000,ED95,EB67, FFFD,FFE8,EC5B,EAE1 ; Ridley facing left, legs extended $A6:EA71 dx 0004, 000F,0016,ED6E,EB4B, FFF8,0007,ED8E,EB59, 0010,0000,ED95,EB67, FFFD,FFE8,EC5B,EAE1 ; Ridley facing right, legs half extended $A6:EA93 dx 0004, FFF1,0016,EF4A,EC07, 0008,0007,EF8A,EC23, FFF0,0000,EF91,EC31, 0003,FFE8,EE57,EBAB ; Ridley facing right, legs extended $A6:EAB5 dx 0004, FFF1,0016,EF6A,EC15, 0008,0007,EF8A,EC23, FFF0,0000,EF91,EC31, 0003,FFE8,EE57,EBAB ; Ridley facing forward $A6:EAD7 dx 0001, 0000,FFFA,EDB5,EB91 } ;;; $EAE1: Ridley hitboxes ;;; { ; facing left $A6:EAE1 dx 0002, FFF4,FFE6,000B,000D,DF59,DF8A, FFE8,0003,FFF3,0015,DF59,DF8A ; mouth closed $A6:EAFB dx 0002, FFD7,FFED,FFEB,FFF7,DF59,DF8A, FFEC,FFE3,000B,0005,DF59,DF8A ; mouth half opened $A6:EB15 dx 0002, FFDB,FFD8,FFF2,FFE1,DF59,DF8A, FFE7,FFE1,0009,0006,DF59,DF8A ; mouth open $A6:EB2F dx 0001, FFF1,FFF6,0007,0002,DF59,DF8A ; legs pulled up $A6:EB3D dx 0001, FFEF,FFF7,0006,000F,DF59,DF8A ; legs half extended $A6:EB4B dx 0001, FFF2,FFFF,000A,0017,DF59,DF8A ; legs extended $A6:EB59 dx 0001, FFF1,FFFE,FFFF,0008,DF59,DF8A ; claws $A6:EB67 dx 0001, FFF0,FFEC,000C,0015,DF59,DF8A ; torso $A6:EB75 dx 0001, FFF0,FFEC,000C,0015,DF59,DF8A ; unused $A6:EB83 dx 0001, FFF0,FFEC,000C,0015,DF59,DF8A ; unused ; facing forward $A6:EB91 dx 0002, FFF0,FFE0,0010,0022,DF59,DF8A, FFF8,FFD3,0008,FFDF,DF59,DF8A ; facing right $A6:EBAB dx 0002, FFF4,FFE7,000B,000D,DF59,DF8A, 000C,0005,0018,0014,DF59,DF8A ; mouth closed $A6:EBC5 dx 0002, FFF3,FFE3,0014,0005,DF59,DF8A, 0015,FFEE,0027,FFF8,DF59,DF8A ; mouth half opened $A6:EBDF dx 0002, FFF6,FFE1,0019,0008,DF59,DF8A, 000D,FFD6,0023,FFE0,DF59,DF8A ; mouth open $A6:EBF9 dx 0001, FFF6,FFF6,0011,0002,DF59,DF8A ; legs pulled up $A6:EC07 dx 0001, FFF7,FFF8,0011,000F,DF59,DF8A ; legs half extended $A6:EC15 dx 0001, FFF5,FFF8,000E,0017,DF59,DF8A ; legs extended $A6:EC23 dx 0001, 0001,FFFE,000E,0009,DF59,DF8A ; claws $A6:EC31 dx 0001, FFF3,FFEA,000E,0015,DF59,DF8A ; torso $A6:EC3F dx 0001, FFF3,FFEA,000E,0015,DF59,DF8A ; unused $A6:EC4D dx 0001, FFF3,FFEA,000E,0015,DF59,DF8A ; unused } ;;; $EC5B: Ridley spritemaps ;;; { ; facing left ; head/neck $A6:EC5B dx 000C, 01E4,12,3154, 0004,0A,3159, 0004,02,3149, 01FC,0A,317B, 01F4,0A,317A, 01FC,02,316B, 01F4,02,316A, 81E4,02,3168, 81FC,F2,3166, 81EC,F2,3164, 8004,E2,3162, 81F4,E2,3160 ; mouth closed $A6:EC99 dx 000D, 0006,F0,314A, 01F6,08,31BB, 01F6,00,313D, 0006,F8,315A, 81FE,00,3188, 81F6,F0,3186, 01EE,00,3156, 01E6,00,3155, 81E6,F0,3184, 8006,E0,3182, 81F6,E0,3180, 81E6,E0,316E, 81D6,E8,316C ; mouth opening/closing $A6:ECDC dx 000F, 01E0,05,3158, 0000,DD,314B, 01E8,05,3138, 01F8,05,313A, 01F0,05,3139, 0008,05,313C, 0000,05,313B, 01D8,D5,3157, 8000,F5,31A5, 81F8,F5,31A4, 81E8,F5,31A2, 8000,E5,31A0, 81F0,E5,318E, 81F0,D5,318C, 81E0,D5,318A ; mouth opened ; legs $A6:ED29 dx 0007, 81FA,FF,31AE, 81EA,FF,31AC, 0008,F8,31BA, 0000,F8,31B9, 0008,F0,31AA, 0000,F0,31A9, 81F0,F0,31A7 ; pulled up $A6:ED4E dx 0006, 01F9,04,31AB, 01F1,04,315B, 81F9,0B,31AE, 81E9,0B,31AC, 81FE,F4,31C2, 81EE,F4,31C0 ; half extended $A6:ED6E dx 0006, 01EF,08,31BB, 81F7,08,31CE, 81FD,13,31AE, 81ED,13,31AC, 81FE,F8,31C6, 81EE,F8,31C4 ; extended ; claw $A6:ED8E dx 0001, 81F0,FC,3140 ; torso $A6:ED95 dx 0006, 81E8,03,31CC, 81F0,F8,3120, 8000,F8,3122, 81FE,06,3122, 8000,E8,3102, 81F0,E8,3100 ; facing forward / turning $A6:EDB5 dx 0020, 0000,20,70FB, 0010,20,70EA, 0010,18,70FA, 0008,20,70EB, 0008,D8,70F0, 0010,00,70E0, 0010,F8,70FD, 0010,F0,70ED, 0000,D8,70F1, 0000,D0,70E1, 0010,E8,70FC, 0010,E0,70EC, 8000,10,70E8, 8000,00,70E6, 8000,F0,70E4, 8000,E0,70E2, 01F8,20,30FB, 01E8,20,30EA, 01E8,18,30FA, 01F0,20,30EB, 01F0,D8,30F0, 01E8,00,30E0, 01E8,F8,30FD, 01E8,F0,30ED, 01F8,D8,30F1, 01F8,D0,30E1, 01E8,E8,30FC, 01E8,E0,30EC, 81F0,10,30E8, 81F0,00,30E6, 81F0,F0,30E4, 81F0,E0,30E2 ; facing right ; head/neck $A6:EE57 dx 000C, 0014,12,7154, 01F4,0A,7159, 01F4,02,7149, 01FC,0A,717B, 0004,0A,717A, 01FC,02,716B, 0004,02,716A, 800C,02,7168, 81F4,F2,7166, 8004,F2,7164, 81EC,E2,7162, 81FC,E2,7160 ; mouth closed $A6:EE95 dx 000D, 01F2,F0,714A, 0002,08,71BB, 0002,00,713D, 01F2,F8,715A, 81F2,00,7188, 81FA,F0,7186, 000A,00,7156, 0012,00,7155, 800A,F0,7184, 81EA,E0,7182, 81FA,E0,7180, 800A,E0,716E, 801A,E8,716C ; mouth opening/closing $A6:EED8 dx 000F, 0018,05,7158, 01F8,DD,714B, 0010,05,7138, 0000,05,713A, 0008,05,7139, 01F0,05,713C, 01F8,05,713B, 0020,D5,7157, 81F0,F5,71A5, 81F8,F5,71A4, 8008,F5,71A2, 81F0,E5,71A0, 8000,E5,718E, 8000,D5,718C, 8010,D5,718A ; mouth opened ; legs $A6:EF25 dx 0007, 81F6,FF,71AE, 8006,FF,71AC, 01F0,F8,71BA, 01F8,F8,71B9, 01F0,F0,71AA, 01F8,F0,71A9, 8000,F0,71A7 ; pulled up $A6:EF4A dx 0006, 01FF,04,71AB, 0007,04,715B, 81F7,0B,71AE, 8007,0B,71AC, 81F2,F4,71C2, 8002,F4,71C0 ; half extended $A6:EF6A dx 0006, 0009,08,71BB, 81F9,08,71CE, 81F3,13,71AE, 8003,13,71AC, 81F2,F8,71C6, 8002,F8,71C4 ; extended ; claw $A6:EF8A dx 0001, 8000,FC,7140 ; torso $A6:EF91 dx 0006, 8008,03,71CC, 8000,F8,7120, 81F0,F8,7122, 81F2,06,7122, 81F0,E8,7102, 8000,E8,7100 } }