;----------------------------------------------------------------------------
-;---------------------- NEMESIS ---------------------------------------------
+;-------------------------------- NEMESIS -----------------------------------
;----------------------------------------------- cool arcade-shoot-em-up-game
-;by SHIAR | shiar0@hotmail.com | icq#43840958 | www.shiar.org
+;------- by SHIAR | shiar0@hotmail.com | icq#43840958 | www.shiar.org -------
-;This source should only be used for learning practises, do not
-;alter it, and certainly never distribute an altered version!!
+;!!! This source should only be used for learning practises, do not !!!
+;!!! alter it, and certainly never distribute an altered version!! !!!
-;TO DO: levels 11,12,13 | bosses 10-13 | look over &&& markings
+;TO DO: levels 12 and 13 | draw bosses 12 and 13 (41/42)
;---------------------- nemesis.z80 start -----------------------------------
#include "asm86.h"
#include "ti86asm.inc" ;standard ti86 romcalls
-#include "ti86abs.inc" ;used to save hiscores and so
+#include "ti86abs.inc" ;used to save hiscores and stuff
.org _asm_exec_ram
#define psh push ; ^:D
#define dnz djnz ;Dec&Jump while NonZero becomes Do w.Non-Zero
-dispbuffer = $81FA ;= $C9FA ;virtual screen
-;VIDEO_MEM = $FC00 ;tha big scareen
+#define teacherkey ;compiled with teacher key: 88 bytes extra
+
+dispbuffer = $8400 ;$C9FA ;virtual screen (MUST be mod$400=0!!)
_clrWindow = $4a86 ;_clrLCD and _clrScrn
_ex_ahl_bde = $45f3 ;exchange values between AHL and BDE
_dispahl = $4a33 ;display value in ahl <100000 (cheap TI)
_asapvar = $d6fc ;our own variable name (likely "nemesis")
-storepos = _asm_exec_ram+7000 ;1024 bytes to store things
+storepos = _asm_exec_ram+7000 ;1024 bytes needed to store things
;---------------------- in-game vars ----------------------------------------
enemies = storepos+200 ;+200 ;info about each enemy
-enemysize = 10 ;infobytes per enemy
+enemysize = 11 ;infobytes per enemy
nrenemies = 16 ;max. nr of enemies
ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y)
-nrybuls = 128 ;+360\
-ebullets = ybullets+(nrybuls*4) ;+872 ;30 bytes = 10(state,x,y)
+nrybuls = 128 ;+376\
+ebullets = ybullets+(nrybuls*4) ;+888 ;30 bytes = 10(state,x,y)
nrebuls = 48
-lvlenemies = ebullets+(nrebuls*3) ;-1016
+lvlenemies = ebullets+(nrebuls*3) ;-1032
;enemies:
; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 1X=normal)]
-; [ship type or explosion frame] [x] [y] [movetype] [movecounter]
+; [ship sprite (DW!) or explosion frame] [x] [y] [movetype] [movecounter]
; [firecounter] [firefreq] [firetype]
;---------------------- introduction ----------------------------------------
.dw Title ;pointer to description (all shells)
.dw Icon ;pointer to YAS icon
-Title: .db "Nemesis v0.99.820 by SHIAR",0
+Title: .db "Nemesis v0.99.99 by SHIAR",0
-Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes
+Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 7bytes
.db %11100000 ; ███
.db %01111000 ; ████
.db %00111110 ; █████
xor a ;ld a,0
res 2,(iy+13) ;don't scroll the screen
cal _flushallmenus ;remove TI menus
- ld hl,dispbuffer-20
- ld de,dispbuffer-20+1
- ld bc,150*16
- ld (hl),$FF
- ldir
FixKeys: ;fixes some key problems like left+down bug
im 1
dispmenu:
ld de,$0304
ld (_curRow),de
- ld hl,txt_menu1
+ ld hl,txt_menu1 ;NEW GAME
cal _puts
ld de,$0305
ld (_curRow),de
- ld hl,txt_menu2
+ ld hl,txt_menu2 ;CONTINUE GAME
cal _puts
menuloop:
ld a,0 ;current menu item (0 or 1); 0 by default
menuitem =$-1
- ld h,$01
+ ld h,$01 ;selector (*) x-coord. = 1
add a,4
- ld l,a
-
- ld a,5
- ld (_curRow),hl
- cal _putc
-
- ld a,(menuitem)
- ld h,$01
- sub 5
- neg
- ld l,a
-
- ld a,32
- ld (_curRow),hl
+ ld l,a ;y-coord. = sel menu item + 4 = 4/5
+ ld (_curRow),hl ;set position
+ ld a,5 ;'*'
+ cal _putmap ;mark selected menu item
+
+ ld a,l ;y-pos 4/5
+ xor 1 ;invert (4=5; 5=4)
+ ld (_curRow),a ;set new row position
+ ld a,32 ;' ' (empty, just remove any * present)
cal _putc
cal getsomekeys ;read keys (z if enter/2nd pressed)
+ ld hl,menuitem
jr z,start_tha_freakin_game
cp K_EXIT
- jr z,menuexit
+ jr z,menuexit ;exit goes to the g/o screen (first score=0)
cp K_UP
- jr z,menuchange
- cp K_DOWN
- jr nz,menuloop
+ jr z,menuchange ;up changes selected menu item
+ cp K_DOWN ;down as well
+ jr nz,menuloop ;anything else just loops
menuchange:
- ld hl,menuitem
- ld a,(hl)
+ ld a,(hl) ;(menuitem)
xor 1 ;0=1; 1=0
ld (hl),a ;set new menu item
- jr menuloop
+ jr menuloop ;continue looping
start_tha_freakin_game:
- ld a,(menuitem)
- dec a
+ ld a,(hl) ;(menuitem)
+ dec a ;new game=0; so that gives -1 = NZ
cal nz,New_game ;NEW GAME
jp samelevel ;CONTINUE: game_main_loop
pop hl
ret
+mode_invert:
+ ld hl,invertmode ;change invert mode (will be stored)
+ ld a,$98
+ xor (hl) ;$2F (cpl) <-> $B7 (or a)
+ ld (hl),a
+ ld de,1
+ psh de ;size
+ psh hl ;dest (invertmode)
+ ld hl,4+invertmode-_asm_exec_ram
+ psh hl ;src
+ jp storesmtn
+
;----------------------------------------------------------------------------
;---------------------- game loop -------------------------------------------
;----------------------------------------------------------------------------
game_main_loop: ;REPEATS FROM HERE EVERY FRAME
ld hl,timer ;update time
inc (hl) ;increase by 1
- ld a,(hl)
- and %11111
- ld hl,1 ;once every 32 frames, increase score by 1
- cal z,scoreInc ;do it
Clear_screen:
ld hl,dispbuffer ;move from (hl) = top left
out (1),a
in a,(1) ;our precious keys
+#ifdef teacherkey ;should we check for the teacherkey?
bit 6,a ;'bout the GRAPH key...
cal z,Teacher ;you didn't _press_ it, did you?!?
+#endif
rla ;test bit7 so we know f ALPHA has been pressed
cal nc,select ;yeppy, select the currently selected upgrade
disp_charge: ;display charge bar
- ld hl,(59*16)+VIDEO_MEM+3
+ ld hl,(58*16)+VIDEO_MEM+3
ld b,3
chargebarclr:
dec hl
ld de,groundpos ;to (one byte to the left)
ldir ;LoaDIncreaseRepeat = scroll!
- ld a,(groundinfo) ;what kind of ground
- dec a ;type 1:
- jr z,ground_tunnel ;tunnel effect
-ground_boring:
- ld a,(groundpos) ;type 0
- jr newground+1
-
-ground_tunnel:
- ld a,(groundpos+14)
- ld d,a
+ ld a,(groundpos+14) ;last ground on right
+ ld d,a ;as default ground
ld hl,spacespace
ld bc,$500 ;range=0..4
cal Random ;a=0..4
dec a ;a=-1..3
dec a ;a=-2..2
ld b,a
- add a,(hl) ;add to spacesize (so +2..-2)
- cp 10
- jr c,newground ;>=0 then don't change
+ add a,(hl) ;substract to spacesize
+ cp 57
+ jr nc,newground ;if nothing left then don't change
ld c,a
- ld a,d
- add a,b ;new position
- or a
+ add a,b ;add offset (2 higher/lower) => new position
+ or a ;=0?
jr z,newground ;may not be 0 (=256)
- cp -10
- jr nc,newground ;and not be <0 (>246)
-diffground:
+ cp -10 ;>246?
+ jr nc,newground ;and not be <0
ld d,a
ld (hl),c
newground:
ld a,(de) ;height of current byte
ld b,a ;save in b
- ld de,16 ;to substract to go one line up
+ ld de,-16 ;to substract to go one line up
ld a,%11111111 ;bitmask black
- or a
groundloopup:
ld (hl),a ;display black byte
- sbc hl,de ;go up (sbc must be used for 16-bit sub)
+ add hl,de ;go up (sbc must be used for 16-bit sub)
dnz groundloopup ;and loop >groundpos< times
ld b,c ;pop b used by groundloopup
ld de,ceilingpos ;to (one byte to the left)
ldir ;LoaDIncreaseRepeat = scroll!
- ld a,(groundinfo) ;what kind of ceiling
- dec a ;type 1:
- jr z,ceiling_tunnel ;tunnel effect
-ceiling_boring:
-
-ceiling_tunnel:
ld a,(ceilingpos+14)
ld d,a ;d=new ceiling
ld hl,spacespace
psh hl
ceilingloopright:
- ld c,b ;push b for groundloopup
+ ld c,b ;push b for ceilingloopdown
pop hl \ inc hl ;get screen position and go one right
pop de \ inc de ;get height info and set to the next byte
psh de \ psh hl ;save these for the next time
ceilingloopdown:
ld (hl),a ;display black byte
add hl,de ;go down
- dnz ceilingloopdown ;and loop >groundpos< times
+ dnz ceilingloopdown ;and loop >ceilingpos< times
- ld b,c ;pop b used by groundloopup
+ ld b,c ;pop b used by ceilingloopdown
dnz ceilingloopright ;loop right for entire screen (16x)
pop hl \ pop hl ;restore stack
-CheckCeiling: ;check for collision with the ground
+CheckCeiling: ;check for collision with the ceiling
ld a,(x) ;your x
srl a ;x/2
srl a ;x/4
cal getsomekeys ;GET_KEY w/ halts and checks for enter
ret z ;enter/second pressed: continue game
cp K_F1 ;F1 pressed?
- cal z,do_invert ;if so then change invert screen (AF saved)
+ jr nz,notinvert
+ cal do_invert ;if so then change invert screen (AF saved)
+ cal mode_invert ;and screen mode (will be saved)
+notinvert:
ld hl,CONTRAST ;contrast setting (0-31)
ld b,(hl) ;load contrast into b
cp K_UP ;+ key changes contrast up
;--------------------------- teacher ----------------------------------------
+#ifdef teacherkey ;can be disabled to save space if not needed
+ ;DO NOT RELEASE NEMESIS COMPILED W/O TEACHERKEY!!!!!
Teacher:
ld (iy+12),5 ;enable flashing cursor
cal _clrWindow ;top left
cal releasekeys
jp disp_icons ;+ret
-teacherans:
- ld a,' '
- cal _putc
+teacherans: ;enter displays the answer
+ ld a,' ' ;the cursor could still be displayed (█)
+ cal _putc ;so remove it by displaying a ' ' over it
ld hl,$0701
- ld (_curRow),hl
- ld hl,txt_teacherans
- cal _puts
- jr teacherloop
-
+ ld (_curRow),hl ;below the equation, aligned right
+ ld hl,txt_teacherans ;the answer text
+ cal _puts ;display
+ jr teacherloop ;and continue loop
+#endif
;--------------------------- exit -------------------------------------------
ld c,a
ld b,0 ;bc=a
add ix,bc ;go to correct sprite (each spr. is 8 bytes)
- inc hl
+ inc hl ;@x
ld d,(hl) ;load xpos
- inc hl
+ inc hl ;@y
ld e,(hl) ;and y
jp putsprite ;and display it too
;----hit----
damage_you: ;damages you B points
+ ld a,(your_occ) ;return if already dead (prevents exploding
+ or a ; twice, or stucking in exploding state)
+ ret nz ;0 = you're normal
+
+ ld a,(hardcore) ;hardcore mode?
+ or a
+ jr z,damageok ;0 = no = don't modify
+; sla b ;1 = yes = double tha damage (b shifted left)
+ .db $CB,$30 ;sll b ;damage=2b|1 (CB3r = unsupported SLL r)
+damageok:
ld a,(your_shield) ;shield left?
or a
jr z,dothadamage ;no shield
Place_multiples:
ld hl,your_prevpos ;place all previous positions
- ld b,mm*7+1 ;all saved positions of them (14 per multiple)
+ ld b,mm*7+2 ;all saved positions of them (14 per multiple)
place_multiples:
ld (hl),e ;set prev-x to d
inc hl ;next
inc_armor:
ld a,(your_armor) ;load current armor
- cp 25-6 ;may not become >=25
+ cp maxarmor-5 ;may not become >=maxarmor
jr c,doincarmor ;ok then just add 6
- ld a,24-6 ;set to maximum (6 will be added below)
+ ld a,maxarmor-6 ;set to maximum (6 will be added below)
doincarmor:
add a,6 ;add 6 to armor
ld (your_armor),a ;change armor
ret
select:
+ ld de,your_weapon ;current weapon, required for most selections
ld hl,your_pickup ;select pickups
ld a,(hl) ;load pickups taken so far
dec a ;is it 1?
ret m ;return if it's 0 (no pickups)
- jr nz,select2 ;no, carry on
-select1:
- ld (hl),a ;reset pickups
- cal inc_armor ;increase armor (like at end of level)
- ld a,30 ;activate shield for 30*4=120 frames
- ld (your_shield),a
- jr disp_icons ;display and return
-select2:
- dec a ;is it 2?
- jr nz,select3 ;no, carry on
- ld (hl),a ;reset (otherwise could be used to cheat)
- ld a,(your_weapon)
- cp maxweapon
- jr nc,disp_icons ;no beam with laser
- ld a,(your_extramode) ;indicates whether this is tailbeam/double
- ld (your_extra),a ;ready extra beam
- jr disp_icons ;display 'n return
-select3:
- dec a ;is it 3?
- jr nz,select4 ;no, carry on
+
+ jr nz,selectlaser ;no, carry on
ld (hl),a ;reset pickups
- ld hl,your_weapon
- ld a,(hl)
- inc a
+ ld a,(de) ;(your_weapon)
+ inc a ;next
cp maxweapon
- jr c,selected3 ;weapon OK
+ jr c,selectedbeam ;weapon OK
jr z,disp_icons ;weapon maxed out
xor a ;laser was selected: set to first weapon
-selected3:
- ld (hl),a ;set new weapon
+selectedbeam:
+ ld (de),a ;set new weapon
cal loadweapon ;load it (damage and stuff)
+ xor a
+ ld (your_multiples),a ;no multiples with beam
jr disp_icons ;display n return
-select4:
- dec a ;is it 4?
- jr nz,select5 ;no, carry on again
- ld (hl),a ;reset pickups
+selectlaser:
+ dec a ;is it 2?
+ ld (hl),0 ;reset pickups
+ jr nz,selectextra ;no, carry on again
ld (your_extra),a ;no extra beams (tailbeam/up-double)
- ld hl,your_weapon
- ld a,(hl)
+ ld a,(de) ;(your_weapon)
cp maxweapon ;upgrade from bullet?
jr nc,upgradelaser ;nope, just upgrade
ld a,maxweapon-1 ;yes, set laser #1
inc a ;next laser
cp maxlaser
jr nc,disp_icons ;laser maxed out
- ld (hl),a
+ ld (de),a
cal loadweapon
jr disp_icons ;display + return
-select5:
- dec a ;is it 5?
- jr nz,select6 ;no, carry on once more
- ld (hl),a ;reset pickups
+selectextra:
+ ld a,(de) ;(your_weapon)
+ cp maxweapon+1 ;laser or beams?
+ jr c,selectXbeam ;if beamweap then no multiples but extra beam
ld hl,your_multiples
ld a,(hl) ;multiples you already got
and %1111 ;reset movebit so (your_multiples)=real value
dec a ;if this is your first multiple then...
cal z,Place_multiples ;reset multiples positions
jr disp_icons ;display, return
-select6:
- ld (hl),0 ;reset pickups
-; jr disp_icons
+selectXbeam:
+ ld a,(your_extramode) ;indicates whether this is tailbeam/double
+ ld (your_extra),a ;ready extra beam
+; jr disp_icons ;display 'n return
;--------------------------- show icon --------------------------------------
-disp_icons:
- psh bc \ psh de \ psh hl \ psh ix ;&&&
-
+disp_icons: ;destroyes: abcdehlix
+ ld a,VIDEO_MEM/$400 ;directly on screen
+ ld (PutWhere),a ;place icons at normal screen
ld hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
- ld (PutWhere),hl ;place icons at bottom of normal screen
ld b,16 ;draw 16x (screen width)
ld a,%11111111 ;horizontal line mask
cal drawline ;draw divider-line
cal drawline ;clear scorebar
disp_lives:
- ld de,5 ;(0,5)
+ ld de,$003C ;(0,4)
ld a,(your_lives) ;nr of lives
or a
jr z,displivesdone ;no lives
displivesdone:
cal disp_armor ;display bar
- ld ix,spr_icon01 ;torpedoIcon
- ld de,$1901 ;icon #1
- cal putwidesprite ;display icon
-
- ld ix,spr_icon00
- ld a,(your_extra)
- or a
- jr z,no_tail
- ld ix,spr_icon02a ;tailbeamIcon
- dec a
- jr z,no_tail ;(your_extra)=1 = tailbeam
- ld ix,spr_icon02b ;updoubleIcon
-no_tail:
- ld de,$2901 ;icon #2
- cal putwidesprite ;display
-
ld ix,spr_icon00
ld a,(your_weapon) ;ur weapon
cp maxweapon ;laser?
cal _vputmap ;display char
ld ix,spr_icon03 ;bulletIcon
no_bullets:
- ld de,$3901 ;icon #3
- cal putwidesprite ;display icon
+ ld de,$3939 ;icon #1
+ cal putwidesprite ;display icon (beamweap)
ld ix,spr_icon00 ;emptyIcon
pop af ;ld a,(your_weapon)
cal _vputmap ;display char
ld ix,spr_icon04 ;laserIcon
no_laser:
- ld de,$4901 ;icon #4
- cal putwidesprite
+ ld de,$4939 ;icon #2
+ cal putwidesprite ;(laser)
ld ix,spr_icon00 ;emptyIcon
- ld a,(your_multiples)
- and %111
- jr z,no_multiples
- ld ix,spr_icon05
-no_multiples:
- ld de,$5901 ;icon #5
+ ld a,(your_multiples) ;number of multiples
+ and %111 ;<8
+ jr z,no_multiples ;none, check for beam extras
+ ld ix,spr_icon05 ;multiples-icon
+ jr no_tail ;display
+no_multiples: ;no multiples
+ ld a,(your_extra) ;extra weapon
+ or a ;0?
+ jr z,no_tail ;nothing
+ ld ix,spr_icon02a ;tailbeamIcon
+ dec a
+ jr z,no_tail ;(your_extra)=1 = tailbeam
+ ld ix,spr_icon02b ;updoubleIcon
+no_tail: ;display
+ ld de,$5939 ;icon #3
cal putwidesprite
ld ix,spr_dividerline
- ld de,$6901
+ ld de,$6939
cal putwidesprite
ld a,(your_pickup) ;pickups taken
add a,a ;picks*4
add a,a ;picks*8
add a,a ;picks*$10
- add a,$09 ;add 0ah
- ld d,a ;y-pos = picks * $10 + $0a (19,29,39,49,59)
- ld e,$01 ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
+ add a,$29 ;add 29h
+ ld d,a ;y-pos = picks * $10 + $29 (3a,4a,5a)
+ ld e,$39 ;x-pos = bottom (3a39,4a39,5a39)
ld ix,spr_icon
cal putwidesprite
iconsdone:
- ld hl,dispbuffer ;normal game-screen
- ld (PutWhere),hl ;set sprite-position to normal screen
+ ld a,dispbuffer/$400 ;normal game-screen
+ ld (PutWhere),a ;set sprite-position to normal screen
+ jp disp_charge ;display weapon charge bar
- pop ix \ pop hl \ pop de \ pop bc
- ret
disp_armor:
ld de,16 ;line size
- ld hl,(57*16)+VIDEO_MEM+3
- ld b,3
-armorbarclr:
- dec hl
- ld (hl),0
- add hl,de
- ld (hl),0
- sbc hl,de
- dnz armorbarclr
-
- ld a,(your_armor) ;load your armor (<25)
- ld c,a ;psh a
- srl a ;/2
- srl a ;/4
- srl a ;/8: don't display last 3 bits of a (later)
- jr z,noarmorbar ;if a=0 then it would loop 256x so skip it
- ld b,a ;loop b=a times
-armorbar: ;starting at ($39*16)+VIDEO_MEM
- ld (hl),%11111111 ;draw a piece of the bar
- add hl,de ;one down (resets carry)
- ld (hl),%11111111 ;same piece
- sbc hl,de ;up again
- inc hl ;next position
- dnz armorbar ;loop it b times
-
-noarmorbar:
- ld a,c ;pop a
+ ld hl,(58*16)+VIDEO_MEM+6
+ ld c,5 ;5 lines down
+armorbarclrY:
+ ld b,4 ;four bytes right
+ psh hl
+armorbarclrX:
+ ld (hl),0 ;clear
+ dec hl ;next byte
+ dnz armorbarclrX ;4x
+ pop hl ;old position
+ add hl,de ;one pixel down
+ dec c ;5x
+ jr nz,armorbarclrY ;loop
+
+ ld hl,VIDEO_MEM+(58*16)+6
+ ld a,(your_armor) ;load your armor (<maxarmor)
+ srl a ;divide by 2 (barsize halved)
+ psh af
and %111 ;display last bits of armor
- ret z ;if armor=0 then bit = %00000000 (don't disp)
+ jr z,armorbarbitok ;if b=0 then prevent looping 256x
ld b,a ;into B
xor a ;bit = %00000000
armorbarbit:
scf ;set carry flag
- rra ;rotates A right and sets bit 7 (c-flag)
- dnz armorbarbit ;repeat B times (so if B=6 then a=%11111100)
-armorbarready: ; (an if B=3 then a=%11100000)
- ld (hl),a ;draw this last byte
- add hl,de
- ld (hl),a ;and just below
+ rla ;rotates A left and sets bit 0 (c-flag)
+ dnz armorbarbit ;repeat B times (so if B=6 then a=%00111111)
+armorbarbitok: ; (an if B=3 then a=%00000111)
+ ld c,a ;save last bit in c
+ pop af ;now we'll make the byte
+ and %11111000 ;clear last three bits
+ rra ;so we can use rotate instead of shift right
+ rra ;which saves 3(-2) bytes and speed
+ rra ;/8: don't display last 3 bits of a (later)
+
+ ld b,5 ;bar height
+armorbarloop1:
+ psh bc ;yloop counter
+ psh hl ;begin x-position
+ ld b,a ;loop b=a times per line
+ or a ;<1 bytes
+ jr z,lastarmorbit ;then don't display bytes (would be 256x)
+armorbarbyte:
+ ld (hl),%11111111 ;draw a piece of the bar
+ dec hl ;next position
+ dnz armorbarbyte ;loop it b times
+lastarmorbit:
+ ld (hl),c ;draw the last byte
+ pop hl ;recall first byte
+ add hl,de ;one down
+ pop bc ;recall yloop-counter
+ dnz armorbarloop1 ;display again
ret
+
drawline:
ld (hl),a ;draw one piece of the divider-line
inc hl ;move right (8 pixels = 1 byte)
laserhits: ;hits with normal enemies
psh hl
ld a,(hl) ;occ+hp00
- and %00000010 ;normal/moving occ.=%1x
- jr z,nolashit ;no hit when enemy_occ <> 2/3
- inc hl ;enemy type
- ld a,(hl)
- or a ;enemy #0 = pickup
- jr z,nolashit ;yes: don't destroy
+ and %11 ;normal enemy occ = %11
+ cp %11
+ jr nz,nolashit ;no hit when enemy_occ <> 11
+ inc hl ;@type
cal find_sprite ;ix=sprite to enemy (hl)
- inc hl
+ inc hl ;@x
ld a,(hl) ;check x
sub d
jr c,nolashit ;no hit when enemy is left of you
- inc hl
+ inc hl ;@y
ld a,(hl) ;check y
sub e
jr z,enemy_lashit ;a-e=0 = laser on top line of enemy = hit
;------------------------ handle bullets ------------------------------------
-remove_bullet:
- pop hl ;enemy+type
- ld (hl),0 ;dump this bullet!
- jr next_ybullet+1 ;+1:skip pop hl at next_ybullet
-
Handle_bullets:
ld hl,ybullets
ld b,nrybuls
psh hl ;save enemy+type
ld (temp1),hl ;needed for check_bullethits
inc hl ;@damage
+ ld c,(hl) ;damage
+ dec c ;c=damage-1
+ jp m,bullethitbullet ;damage<=0 (=no bullet)
inc hl ;@x
-move_bullet:
+;move_bullet
ld c,a ;c=type
and %11111 ;pixels to move
add a,(hl) ;a = X + (hl) to the right
dnz scan_bullets ;next bullet (loop)
ret
+remove_bullet:
+ pop hl ;enemy+type
+ ld (hl),0 ;dump this bullet!
+ jr next_ybullet+1 ;+1:skip pop hl at next_ybullet
+
+bullethitbullet: ;"bullet" just displaying a bullet hit
+ inc c ;restore damage (to -5..0)
+ jp z,remove_bullet ;if it's 0 remove it
+ inc c ;increase to next frame
+ ld (hl),c ;save new
+ ld a,c
+ neg ;make positive value (frame nr. 0..4)
+ add a,a ;*2
+ ld e,a
+ add a,a ;*4
+ add a,e ;*6
+ ld e,a
+ ld d,0 ;de=a
+ ld ix,spr_hit ;first hit sprite
+ add ix,de ;add frame nr*8 (goto correct sprite)
+ inc hl ;@x
+ ld d,(hl)
+ inc hl ;@y
+ ld e,(hl) ;load position into de
+ cal putsprite ;display hit-sprite
+ jr next_ybullet ;handle the other bullets
+
;--------------------------- check bullethits -------------------------------
check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet
psh hl
ld a,(hl)
- and %00000010
- jr z,nohit ;no hit when enemy_occ <> 2/3
+ and %11
+ cp %11
+ jr nz,nohit ;no hit when enemy_occ <> %11
inc hl ;enemy type
- ld a,(hl)
- or a ;enemy #0 = pickup
- jr z,nohit ;yes: don't destroy
-
cal find_sprite ;set ix to the sprite of this enemy
inc hl ;@x
psh hl
ld hl,0 ;@bulletType
temp1 =$-2
- ld (hl),0 ;remove bullet
inc hl ;@damage
- ld a,(hl) ;set damage
+ ld a,(hl) ;damage to inflict on enemy
+ ld (hl),-(hitsprites+1);make this bullet exploding (damage = -5)
pop hl ;enemy+y
cal enemy_hit
nohit:
ld b,a
dec hl ;@x
- dec hl ;@type
+ dec hl ;@sprite+1
+ dec hl ;@sprite
dec hl ;@hp00 (occ)
ld a,(hl) ;load hp00
sub b ;decrease HP (if <0xx then c is set)
ld a,pickupfreq ;reset enemies counter
pickupdone:
ld (pickuptimer),a ;save new enemiescounter value
- inc hl ;@type
+ inc hl ;@sprite (=explosionFrame)
ld (hl),0 ;explosionFrame 0 or enemy #0=pickup
pop af
cal z,place_enemy ;place pickup (enemy#=0=a cuz ZF)
dec a ;has it reached 3?
jr nz,place_ranenemy ;nope: >3 = place an enemy
inc hl ;nextevent located behind eventleft
- ld (hl),193 ;set delay
+ ld (hl),193 ;3: set delay for next boss to appear
ret ;don't place any more enemies
standby_event:
ld de,enemysize
xor a
chk_enemyleft:
- add hl,de
+ add hl,de ;go to next enemy
cp (hl) ;0 = no enemy present
- jr nz,enemyleft
- dnz chk_enemyleft
- ret
+ jr nz,enemyleft ;if enemy present (<>0) then quit checking
+ dnz chk_enemyleft ;loop for all enemies
+ ld hl,nextevent ;time 'til next event
+ ld (hl),157 ;next time to check is in 157 turns/frames
+ inc a ;no enemies left: place upgrade pickup
+ jr place_enemy ;place enemy #1(=a) = big pickup
enemyleft:
ld hl,eventleft
inc (hl)
place_ranenemy:
+ ld hl,1 ;increase score by 1
+ cal scoreInc
ld bc,0 ;0..nrlvlenemies
nrlvlenemies =$-1 ;=nr of enemies minus 1
cal Random ;random enemy b..b+c = 0..nrenemies-1
dec de ;goto hp64 (before occ)
ldi ;set hp64
ldi ;set hitpoints+occ of enemy class
- ld a,(hl) ;save sprite-offset/2 (ldi decs bc so in a)
+ ld a,(hl)
+ .db $DD,$6F ;ld hx,a
ldi ;set sprite
+ ld a,(hl)
+ .db $DD,$67 ;ld lx,a
+ ldi ;set sprite + 1
ldi ;set x-position
- ld c,a ;c=sprite
ld a,(hl) ;load placeInfo
inc hl
dec a ;is it 1?
ld a,(y) ;place at same y-pos as YOUR ship
jr ypos_OK
random_enemy:
- ld b,0 ;bc = enemy sprite offset / 2
- ld ix,spr_enemy00 ;first enemy sprite
- add ix,bc ;add offset for current enemy
- add ix,bc ;twice (offset stored as offset/2)
ld a,64-8 ;=57=screen height (8 is scorebar)
sub (ix+1) ;minus sprite height=bottom
ld c,b ;range=0 to...
;--------------------------- enemy fires ------------------------------------
-Enemy_fires: ;de = x,y; c = type
+Enemy_fires: ;de = x,y; c = type; ix = enemy_sprite
ld hl,ebullets ;first bullet to check
ld b,nrebuls
dec d
- dec d ;d = x-2
- inc e ;e = y+1
+ dec d ;d = x of firing enemy minus 2
+
+ ld a,(ix+1) ;the height of the enemy firing this bullet
+ srl a ;halved
+ add a,e ;added to his y-position
+ ld e,a ;into e
+ dec e ;minus one (bullet height)
+
enemy_fires_again: ;same but hl = first bullet possibly free
xor a
find_ebullet:
found_ebullet:
ld a,c
sub 6
- jr c,bulletok ;type #0-5 = done (normal/diag)
+ jp c,bulletok ;type #0-5 = done (normal/diag)
or a
jr z,bulletaiming ;type #6 = aiming = type#2..5
dec a
jr z,bullettriple ;type #7 = triple
+ dec a
+ jr z,bulletdouble ;type #8 = double
+ dec a
+ jr z,bulletquad ;type #9 = quad
+ dec a
+ jr z,bulletdquad ;type #10 = double-quad
+ dec a
+ jr z,bulletran ;type #11 = random
+
+firesenemies: ;type #12 = mine / Dquad
+ ld a,(timer)
+ rra ;if odd turn (50% chance)
+ jr c,bulletdquad ;then fire 6x
+ ld a,bossenemy ;otherwise place enemy #[bossenemy]
+ jp place_enemy
+
+bulletran:
+ ld c,1
+ ld b,4
+ cal Random
+ ld (hl),a
+ jr _bulletok
-bulletdouble:
+bulletdquad: ;type #10 = double-quad
+ cal bulletquad ;fire type #1 to 5
+ inc hl
+ ld a,e
+ sub 5
+ ld e,a ;offset 5 up
+ ld c,1 ;type #1 = normal
+ cal enemy_fires_again
+ inc hl
+ ld a,e
+ add a,10
+ ld e,a ;offset 10 down (5 total)
+ jr enemy_fires_again
+
+bulletquad: ;type #9 = quad
+ cal bullettriple ;fire type #1, 4 and 5
+ inc hl ;next bullet
+ ld c,2 ;type #2 = down
+ cal enemy_fires_again
+ inc hl
+ ld c,3 ;type #3 = up
+ jr enemy_fires_again
+
+bulletdouble: ;type #8 = double
dec e ;one up
ld c,1 ;type #1
cal bulletok ;fire bullet
inc e ;two px down
jr enemy_fires_again ;find and fire another bullet
-bullettriple:
- ld c,1 ;type #1 = normal
- cal bulletok ;fire
+bullettriple: ;type #7 = triple
+ ld (hl),1 ;type #1 = normal
+ cal _bulletok ;fire
inc hl ;next bullet
ld c,4 ;type #4 = down 50%
cal enemy_fires_again
ld c,5 ;type #5 = up 50%
jr enemy_fires_again
-bulletaiming:
+bulletaiming: ;type #6 = aiming = type#2..5
ld a,(y)
- sub e
+ sub e ;a = yourY-bulY = pixels bullet is above you
add a,10
- jp p,bulletnotup
- ld c,5 ;yourY-bulY = negative (=bullet below you)
- add a,10
- jp p,bulletnotup
- ld c,3 ;yourY-bulY = even more negative (going up)
+ jp p,bulletnotup ;jump when 10 pixels below you or higher
+ ld (hl),5 ;go slightly down
+ add a,10 ;10 to 20 pixels below you
+ jp p,_bulletok ;yes: all done.
+ ld (hl),3 ;otherwise move down even more
+ jr _bulletok
bulletnotup:
- sub 20
- jr c,bulletok
- ld c,4 ;bullet going down (=jp m)
- sub 10
- jr c,bulletok ;even more going down
- ld c,2
+ ld (hl),1 ;normal bullet...
+ sub 20 ;...when...
+ jp m,_bulletok ;...10 pixels below you to 20 pixels above
+ ld (hl),4 ;bullet going slightly up...
+ sub 10 ;...when...
+ jr c,_bulletok ;...20 to 30 pixels above you
+ ld c,2 ;else (more than 30 pixels) move up more
bulletok:
ld (hl),c ;set bullet direction
+_bulletok:
inc hl
ld (hl),d ;set x-pos
inc hl
psh hl
ld a,(hl)
- and %00000011
- jr z,next_enemy ;occ "no enemy" 0
+ and %11
+ jr z,next_enemy ;occ "no enemy" 00
dec a
- jr z,exploding_enemy ;occ "exploding" 1
+ jr z,exploding_enemy ;occ "exploding" 01
normal_enemy:
- inc hl
- ld c,(hl) ;c = enemy type = de
+ ld c,a ;c = occ-1 = %10 (normal) or %01 (pickup)
+ inc hl ;@sprite
cal find_sprite
- inc hl
+ inc hl ;@x
ld d,(hl) ;x
- inc hl
+ inc hl ;@y
ld e,(hl) ;y
inc hl ;@movetype
jr c,remove_enemy ;=off screen
enemyonscreenX:
ld (hl),d ;store new x
- ld a,c ;a = enemy type
- or a ;type 0? (pickup)
+ dec c ;is this a pickup? (c=%01 so ZF=1)
jr nz,check_enemyfire ;no, a normal enemy; let em fire
jr firing_done ;continue
ld (hl),a ;next frame
dec a ;1-16 -> 0-15
ld ix,spr_explosion ;base sprite
+ inc hl ;@x
cal explosion_stuff ;display explosion
jr next_enemy
psh bc ;counter
psh hl ;pointer
ld a,(hl)
- and %00000010 ;enemy status
+ and %10 ;enemy status (%11=normal; %10=pickup)
jr z,check_next ;2 or 3 = ok, otherwise: next enemy
- inc hl ;enemy#
+ inc hl ;@sprite
collide_enemy: ;&&& include in Handle_enemy proc
cal find_sprite
add a,(ix) ;enemy width
jp m,check_next
- inc hl
+ inc hl ;@y
ld a,(hl) ;check y match
sub d ;same as with x-check
jr nc,check_next ;(=jp p)
add a,6
add a,(ix+1) ;enemy height
jp m,check_next
- dec hl
- dec hl
+ dec hl ;@x
+ dec hl ;@sprite+1
+ dec hl ;@sprite
+ dec hl ;@occ
take_pickup:
- psh hl ;we need hl
- ld hl,2 ;increase score by 2
- cal scoreInc
- pop hl ;we're done
-
- ld a,(hl) ;load enemy type
- or a
- jr nz,collide ;enemy when <>0
-
- psh hl
+ ld a,(hl) ;load enemy occ
+ rra ;if occ = %10 (can't be %00) then pickup
+ jr c,collide ;otherwise normal enemy so you collide
+ ld (hl),0 ;remove
+ rra ;skip this bit (=%1)
+ rra ;this bit specifies the pickup ID (big/small)
+ jr nc,armorpickup ;%0 = pickup increases armor and shield
+ ;%1 = pickup selects (next) upgrade
ld hl,your_pickup ;your pickups
ld a,(hl) ;current
inc a ;go to next
- cp 6 ;pickups >=6
+ cp 4 ;pickups >=4?
jr c,not_maxpickup
- ld a,1 ;yes: reset to pickup 1
+ psh hl ;too much pickups
+ ld hl,250
+ cal scoreInc ;increase score by 250
+ pop hl
+ ld a,1 ;and reset to pickup #1
not_maxpickup:
ld (hl),a ;save new
+ psh de
cal disp_icons ;display altered pickupicons
- pop hl
-
- dec hl ;to enemy occ
- xor a ;set to 0 = gone
- ld (hl),a ;remove
+ pop de ;ld de,$0707
jr check_next ;all done, next..
+armorpickup:
+ cal inc_armor ;increase armor (like at end of level)
+ ld a,30 ;activate shield for 30*4=120 frames
+ ld (your_shield),a
+ cal disp_icons ;display status bar (new armor value)
+ jr check_next
+
collide:
- dec hl
ld a,(hl)
sub auch_ecollide
ld (hl),a
cal damage_you
check_next:
- pop hl
- ld bc,enemysize
- add hl,bc
- pop bc
- dnz check_collision
+ pop hl ;current enemy base (unaltered)
+ ld bc,enemysize ;bytes per enemy
+ add hl,bc ;pointer to next enemy
+ pop bc ;restore counter
+ dnz check_collision ;loop for all enemies
ret
;--------------------------- story ------------------------------------------
ret
dostory:
- cal storyPage ;do some story
- ld a,(hl) ;load next byte in a
- inc a ;set z-flag if a = $ff
- jr nz,dostory ;otherwise loop
+ cal storyPage ;do some story
+ ld a,(hl) ;load next byte in a
+ inc a ;set z-flag if a = $ff
+ jr nz,dostory ;otherwise loop
inc hl
- inc hl ;set hl to beginning of the level
- ld (levelp),hl ;set the level-pointer
- ret ;and return
+ inc hl ;set hl to beginning of the level
+ ld (levelp),hl ;set the level-pointer
+ ret ;and return
;--------------------------- SFX --------------------------------------------
pop bc
ret
-scoreInc:
- psh bc
- ld bc,(your_score)
- add hl,bc
- ld (your_score),hl
- pop bc
+scoreInc: ;increase score by HL
+ psh bc ;don't destroy bc (or any registers Xcept hl)
+ ld bc,(your_score) ;your current score in bc
+ psh af ;don't destroy a either
+ ld a,(hardcore) ;load hardcore mode settings in a
+ or a ;is it zero?
+ jr z,scoreincok ;then skip the next instruction (score = ok)
+ add hl,hl ;otherwise (hardcore) double the inc.score
+scoreincok:
+ pop af ;restore a register
+ add hl,bc ;add bc to hl (or vice versa)
+ ld (your_score),hl ;save new increased score
+ pop bc ;all registers to what they were
ret
find_sprite: ;in:hl=enemy+type | out:ix=sprite to enemy
- psh de
- psh hl
- ld e,(hl) ;e = enemy offset/2
- ld d,0 ;de = e
- ld ix,spr_enemy00 ;first enemy sprite
- add ix,de ;add offset for current enemy
- add ix,de ;twice (offset stored as offset/2)
- pop hl
- pop de
+ ld a,(hl) ;sprite byte #1
+ .db $DD,$6F ;ld hx,a
+ inc hl ;@sprite+1
+ ld a,(hl) ;sprite byte #2
+ .db $DD,$67 ;ld lx,a ;ld ix,(hl)
ret
BLACKLCD:
findenemyspecs: ;enemy #a specs in (hl); in:b=0; out:ac=?
ld hl,enemyspecs ;enemy "0" specs
- ld c,a ;b=0; bc=c=a=type
- add hl,bc ;hl = enm#0 + type*1
add a,a ;a=type*2
+ ld c,a ;b=0; bc=c=a=type*2
+ add hl,bc ;hl = enm#0 + type*2
add a,a ;a=type*4 (max.type<64)
- ld c,a ;bc=type*8
- add hl,bc ;hl = enm#0 + type*5
- add hl,bc ;hl = enm#0 + type*9
+ ld c,a ;bc=type*4
+ add hl,bc ;hl = enm#0 + type*6
+ add hl,bc ;hl = enm#0 + type*10
ret ;hl = enemy specs
;--------------------------- game over / new game / death -------------------
-chartable:
- .db 0,".<>!",0,0,0,0 ;down,L,R,up
- .db 0,"xtoje0",0 ;enter..clear
- .db " wsnid9",0 ;(-)..custom
- .db "zvrmhc8",0 ;dot..del
- .db "yuqlgb7#" ;0..xvar
- .db $D9,"-pkfa6'" ;on..alpha
- .db "54321*",0,$D0 ;F5..more
-save_hi:
- ld hl,_asapvar ;find own variable
- rst 20h ;cal _ABS_MOV10TOOP1
- rst 10h ;cal _FINDSYM
+chartable: ;use chartable-1 and add GET_KEY scancode
+ .db ".<>!",0,0,0,0 ;down,L,R,up
+ .db 0,"xtoje0",0 ;enter..clear
+ .db " wsnid9",0 ;(-)..custom
+ .db "zvrmhc8",0 ;dot..del
+ .db "yuqlgb7#" ;0..xvar
+ .db $D9,"-pkfa6'" ;on..alpha
+ .db "54321",$D0,0,'*' ;F5..F1,2nd,exit,more
- xor a
- ld hl,4+storehi_start-_asm_exec_ram
- add hl,de ;hl=pointer to data in original prog
- adc a,b
- cal _SET_ABS_DEST_ADDR
- xor a
- ld hl,storehi_start
- cal _SET_ABS_SRC_ADDR
+save_lvl:
+ ld hl,storesave_end-storesave_start
+ psh hl ;size
+ ld hl,storesave_start
+ psh hl ;dest
+ ld hl,4+storesave_start-_asm_exec_ram
+ psh hl ;src
+ jr storesmtn
+
+save_hi:
ld hl,storehi_end-storehi_start
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir ;save done (cal \ ret)
- jp _RAM_PAGE_1
+ psh hl ;size
+ ld hl,storehi_start
+ psh hl ;destination
+ ld hl,4+storehi_start-_asm_exec_ram
+ psh hl ;source
-save_lvl:
+storesmtn: ;stores data [stack=src; stack+1=dest; stack+2=size]
ld hl,_asapvar ;find own variable
rst 20h ;cal _ABS_MOV10TOOP1
rst 10h ;cal _FINDSYM
- xor a
- ld hl,4+storesave_start-_asm_exec_ram
- add hl,de ;hl=pointer to data in original prog
- adc a,b
- cal _SET_ABS_DEST_ADDR
- xor a
- ld hl,storesave_start
- cal _SET_ABS_SRC_ADDR
- ld hl,storesave_end-storesave_start
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir ;save done (cal \ ret)
- jp _RAM_PAGE_1
+ xor a ;bde=pointer to begin of real program
+ pop hl ;data offset
+ add hl,de ;hl=pointer to data in real prog
+ adc a,b ;if hl overflow also increase a
+ cal _SET_ABS_DEST_ADDR ;destination = real program = ahl
+ xor a ;RAM page #0
+ pop hl ;data position in normal program ($D748+)
+ cal _SET_ABS_SRC_ADDR ;set as source (ahl)
+ pop hl ;size
+ cal _SET_MM_NUM_BYTES ;set
+ cal _mm_ldir ;copy data to real program
+ jp _RAM_PAGE_1 ;and finally: reset ram page
game_over: ;stack=+0
cal BLACKLCD ;clear screen
ld hl,$0007
ld (_curRow),hl
- ld de,(your_score)
- ld hl,(hiscore)
- cal CP_HL_DE
- jr nc,no_hiscore
- ld (hiscore),de
+ ld de,(your_score) ;current score
+ ld hl,(hiscore) ;hiscore
+ cal CP_HL_DE ;de<=hl means no hiscore (or same)
+ jr nc,no_hiscore ;skip the new hiscore part
+ ld (hiscore),de ;otherwise save current score as new hiscore
-ask_hiname:
- ld ix,hiname
- ld a,9
- ld (hiscorepos),a
+ask_hiname: ;and ask for new hiscore name
+ ld ix,hiname ;where to store the hiscore name
+ ld a,9 ;max. length <9
+ ld (hiscorepos),a ;current char (counts backwards 9-1)
enter_name_loop:
- ld a,'_'
- cal _putc
- ld hl,_curCol
- dec (hl)
+ ld a,'_' ;cursor appearance
+ cal _putmap ;display (do not advance cursorpos)
nokeypressed:
- cal getsomekeys
- jr z,nomore
- or a
- jr z,nokeypressed
+ cal getsomekeys ;wait for any key
+ jr z,nomore ;if [enter] or [2nd] pressed we're all done
- cp K_DEL
- jr z,backup
- cp K_EXIT
+ ld hl,hiscorepos ;string position
+ cp K_DEL ;[DEL] functions as "backspace"
+ jr z,backup ;delete previous char if pressed
+ cp K_EXIT ;exit also ends name
jr z,nomore
- ld hl,hiscorepos
- ld b,(hl)
- dec b
- jr z,nokeypressed
- ld (hl),b
+ ld b,(hl) ;(hiscorepos)
+ dec b ;next position (counts backwards)
+ jr z,nokeypressed ;if it's 1 (became 0) then don't add no more
+ ld (hl),b ;otherwise save new string position
- ld hl,chartable
+ ld hl,chartable-1 ;chars to add for each key
ld e,a
- ld d,0
- add hl,de
- ld a,(hl)
- or a
- jr z,nokeypressed
-
- ld (ix),a
- cal _putc
- inc ix
- cal releasekeys
- jr enter_name_loop
-
-backup:
- ld hl,hiscorepos
- ld a,(hl)
- cp 9
- jr nc,nokeypressed
- inc (hl)
-
- dec ix
- ld (ix),' '
- ld a,32
- cal _putc
+ ld d,0 ;de = key pressed
+ add hl,de ;add so we know which char to add for this key
+ ld a,(hl) ;load in a
+ or a ;if it's 0 then
+ jr z,nokeypressed ;don't add anything afterall
+
+ ld (ix),a ;save new char
+ cal _putc ;and also display on screen
+ inc ix ;goto next char
+ cal releasekeys ;wait for the key to be released
+ jr enter_name_loop ;and continue the loop
+
+backup: ;backspace
+ ld a,(hl) ;(hiscorepos)
+ cp 9 ;9 means begin (0 total chars)
+ jr nc,nokeypressed ;nothing to remove so continue loop
+ inc (hl) ;otherwise pos one back
+
+ dec ix ;and string to previous char as well
+ ld a,32 ;remove cursor
+ cal _putmap ;by replacing it by ' '
ld hl,_curCol
- dec (hl)
- dec (hl)
- jr enter_name_loop
-
-nomore:
- ld a,' '
- cal _putc
- ld (ix),0
- cal save_hi
- jr hiscoredone
-
-no_hiscore:
- ld hl,hiname
+ dec (hl) ;cursor one back
+ jr enter_name_loop ;continue name loop
+
+nomore: ;name's done
+ ld a,' ' ;remove cursor
+ cal _putc ;(or actually replace with ' ')
+ ld (ix),0 ;end of string marker (zero-terminated)
+ cal save_hi ;store hiscore with name in real program
+ jr hiscoredone ;continue with game over screen
+
+no_hiscore: ;no new hiscore
+ ld hl,hiname ;just display old name
cal _puts
-
hiscoredone:
xor a ;clear a (Ahl will be displayed)
ld hl,$1006 ;bottom-1 right
New_game: ;stack must be +1 (so change the jp in cal :)
cal _clrLCD
- ld hl,VIDEO_MEM
- ld (PutWhere),hl ;will be reset after displaying iconbar
+ ld a,VIDEO_MEM/$400
+ ld (PutWhere),a ;will be reset after displaying iconbar
ld ix,spr_ship01 ;first ship: sprite
ld de,$0105 ;position
ld b,4 ;number of ships to display
dispshipsloop:
psh bc ;counter
psh de ;position
- cal putwidesprite ;display
+ ld h,e
+ ld l,40 ;x=40
+ ld (_penCol),hl ;small cursor position
+ psh ix ;ix destroyed by _vputmap
+ ld hl,txt_difhardcore ;hardcore ships text
+ ld a,b ;ship displaying (4 to 1)
+ dec a ;minus 1 (3..0)
+ psh af
+ and %10 ;gives 1,1,0,0 (for ships 0,0,1,1)
+ jr z,dispdifficulty ;0 indicates hardcore difficulty ship
+ ld hl,txt_difnormal ;normal difficulty ships text
+dispdifficulty:
+ cal _vputs ;display difficulty
+ ld a,95
+ ld (_penCol),a ;set x=95
+ pop af ;ship nr (backwards 3..0)
+ ld hl,txt_updouble ;updouble for ships 1
+ and %1 ;gives 0,1,0,1 (for ships 0,1,0,1)
+ jr nz,dispsbeam
+ ld hl,txt_tailbeam ;tailbeam for ships 0
+dispsbeam:
+ cal _vputs ;display special beam type
+ pop ix
+ pop de
+ psh de ;peek de
+ cal putwidesprite ;display ship
pop de
+
ld bc,spr_ship01i-spr_ship01+2
add ix,bc ;go to next ship
ld a,12 ;below the previous one
pop bc
cp K_DOWN
jr nz,selnotdown
- inc b
+ inc b ;move selection down
selnotdown:
cp K_UP
jr nz,selnotup
- dec b
+ dec b ;move selection up
selnotup:
- ld a,b
- and %11
- ld b,a
- jr selectship
+ ld a,b ;new selection
+ and %11 ;must be 0..3
+ ld b,a ;in b again
+ jr selectship ;loop
startthenewgame:
ld hl,spr_ship01-(spr_ship02-spr_ship01)
ld de,spr_ship02-spr_ship01
+ psh bc ;save b (ship#)
inc b ;your ship #0-3++
ld a,b ;ship #1-4
searchyourship:
dnz searchyourship
ld (your_ship),hl
and 1 ;gives: 1,0,1,0 for the ships
- inc a ;1 or 2
+ inc a ;ships now give 1,2,1,2
ld (your_extramode),a ;sets tail beam or up double (1 or 2)
+ pop af ;ship# 0..3
+ and %10 ;ships give 0,0,1,1
+ ld (hardcore),a ;hardcore mode set for ships 3 and 4
xor a ;ld a,0
ld (your_score),a ;reset score
ld (your_score+1),a ;reset score (0)
You_die: ;stack must be +1
pop hl ;restore stack
- ld a,12
- ld (your_armor),a ;12 HPs/shields
+ ld a,24
+ ld (your_armor),a ;24 HPs/shields
ld a,(your_lives) ;load lives left
dec a ;decrease lives
ld (your_lives),a ;if lives=0ffh GO
ld b,0 ;advance one level
ld c,(hl)
add hl,bc ;passed the enemies
- ld c,10
+ ld c,9
add hl,bc ;update to point to next level
ld (levelp),hl ;save
cal scoreInc ;update score
samelevel:
- ld hl,(your_ship)
- ld (your_shipspr),hl
+ ld hl,invertmode
+ ld de,_invert ;sets B<>W mode
+ ldi ;ld (_invert),(invertmode)
+ ld de,your_shipspr ;sets your ship's sprite
+ ldi ;ld (your_shipspr),(your_ship)
ld a,80
ld (nextevent),a ;time to first enemy appearance
ld (eventleft),a ;set nr of events left
inc hl
ld de,level_info
- ld c,5 ;5xLDI: loads (level_info) (spacespace)
- ldir ; (groundinfo) (stars1) (stars2)
+ ld c,4 ;5xLDI: loads (level_info) (spacespace)
+ ldir ; (stars1) (stars2)
ld a,1
ld b,32 ;fill (groundpos) and (ceilingpos)
fillground:
ld a,e ;a=e=Y
add a,a
add a,a ;add a,a is 7 cycles faster than add hl,hl
- ld h,0 ;switch to hl now (Y<64)
+ ld h,dispbuffer/$400 ;switch to hl (Y<64) & set base to dispbuffer
+PutWhere =$-1 ;screen base position/$400 (where x+y=0)
ld l,a ;hl=4*Y
ld a,d ;a=d=X
rra ;RRA: carry flag must be reset!
xor a
FPbit =$+1
set 0,a
- ld de,dispbuffer ;screen base position (where x+y=0)
-PutWhere =$-2
- add hl,de
ret
;----------------------------------------------------------------------------
;------------------------------- sprites ------------------------------------
;----------------------------------------------------------------------------
-spr_ship01:
- .db 7,7 ;ship alpha class
+spr_ship01: ;(normal; up double)
+ .db 7,7 ;ship alpha class (vic viper)
.db %11000000 ;██
.db %11110000 ;████
.db %01111110 ; ██████
.db %11000000 ;██
spr_ship01i:
.db 8,7
- .db %11000010 ;██ █
- .db %11110001 ;████ █
- .db %01111111 ; ███████
+ .db %11001010 ;██ █ █
+ .db %11110101 ;████ █ █
+ .db %01111110 ; ██████
.db %11101001 ;███ █ █
- .db %01111111 ; ███████
- .db %11110001 ;████ █
- .db %11000010 ;██ █
-
-spr_ship02:
- .db 7,7 ;XC1701II ship
- .db %11110000 ;████
- .db %10001100 ;█ ██
- .db %11110010 ;████ █
- .db %01011110 ; █ ████
- .db %11110010 ;████ █
- .db %10001100 ;█ ██
- .db %11110000 ;████
-spr_ship02i:
- .db 7,7
- .db %11110000 ;████
- .db %10011100 ;█ ███
- .db %11111110 ;███████
- .db %01011110 ; █ ████
- .db %11111110 ;███████
- .db %10011100 ;█ ███
- .db %11110000 ;████
+ .db %01111110 ; ██████
+ .db %11110101 ;████ █ █
+ .db %11001010 ;██ █ █
-spr_ship03:
+spr_ship02: ;(normal; tail beam)
.db 7,7 ;ship gamma class
.db %11111000 ;█████
.db %01100000 ; ██
.db %11111100 ;██████
.db %01100000 ; ██
.db %11111000 ;█████
-spr_ship03i:
+spr_ship02i:
.db 8,7
.db %11111010 ;█████ █
.db %01100001 ; ██ █
.db %01100001 ; ██ █
.db %11111010 ;█████ █
-spr_ship04:
- .db 7,7 ;ship delta class
+spr_ship03: ;(hardcore; up double)
+ .db 7,7 ;ship delta class (lord british)
.db %11000000 ; ██
.db %11110000 ; ████
.db %11111100 ; ██████
.db %11111100 ; ██████
.db %11110000 ; ████
.db %11000000 ; ██
-spr_ship04i:
+spr_ship03i:
.db 8,7
- .db %11000010 ; ██ █
- .db %11110001 ; ████ █
+ .db %11111100 ; ██████
+ .db %11110010 ; ████ █
.db %11111101 ; ██████ █
.db %01100011 ; ██ ██
.db %11111101 ; ██████ █
- .db %11110001 ; ████ █
- .db %11000010 ; ██ █
+ .db %11110010 ; ████ █
+ .db %11111100 ; ██████
-spr_ship05:
- .db 7,7 ;ship beta class
- .db %11100000 ;███
- .db %11111000 ;█████
- .db %01111100 ; █████
- .db %01110010 ; ███ █
- .db %01111100 ; █████
- .db %11111000 ;█████
- .db %11100000 ;███
-spr_ship05i:
- .db 8,7
- .db %11100010 ;███ █
- .db %11111001 ;█████ █
- .db %01111101 ; █████ █
- .db %01110011 ; ███ ██
- .db %01111101 ; █████ █
- .db %11111001 ;█████ █
- .db %11100010 ;███ █
+spr_ship04: ;(hardcore; tail beam)
+ .db 7,7 ;XC1701II ship
+ .db %11110000 ;████
+ .db %10001100 ;█ ██
+ .db %11110010 ;████ █
+ .db %01011110 ; █ ████
+ .db %11110010 ;████ █
+ .db %10001100 ;█ ██
+ .db %11110000 ;████
+spr_ship04i:
+ .db 7,7
+ .db %11110000 ;████
+ .db %10011100 ;█ ███
+ .db %11111110 ;███████
+ .db %01011110 ; █ ████
+ .db %11111110 ;███████
+ .db %10011100 ;█ ███
+ .db %11110000 ;████
auch_bullet = 1 ;damage to you when hit by an enemy bullet
auch_ground = 5 ;the same when you hit the ground/ceiling
-auch_collide = 3 ;when you hit an enemy
-auch_ecollide = 2*4 ;damage to both the enemy that hit you (skip bit 0/1)
+auch_collide = 4 ;when you hit an enemy
+auch_ecollide = 2*4 ;damage to the enemy that hit you (skip bit 0/1)
spr_multiple:
.db 6,6 ;multiples
;-------------------------------- explosions --------------------------------
+spr_hit:
+hitsprites = 5 ;btw: sprites stored backwards
+ .db 5,4 ;5
+ .db %10101000 ;█▒█ █
+ .db %00001000 ;▒ ▒█
+ .db %10000000 ;█ ▒ ▒
+ .db %10101000 ;█▒█▒█
+
+ .db 5,4 ;4
+ .db %01001000 ; █▒▒█
+ .db %11010000 ;██ █▒
+ .db %00101000 ;▒ █ █
+ .db %11010000 ;██▒█
+
+ .db 5,4 ;3
+ .db %00110000 ; ██
+ .db %10011000 ;█ ██
+ .db %10001000 ;█ ▒▒█
+ .db %00110000 ; ▒██
+
+ .db 5,4 ;2
+ .db %00100000 ;▒ █▒
+ .db %00001000 ; ▒▒ █
+ .db %10110000 ;█▒██
+ .db %01000000 ;▒█ ▒
+
+ .db 4,4 ;1
+ .db %10010000 ;█ █
+ .db %01100000 ; ██
+ .db %01100000 ; ██
+ .db %10010000 ;█ █
+
spr_explosion:
- .db 8,6 ;1
+ .db 8,5 ;1
.db %00000000
- .db %00011100 ; ███
- .db %00111110 ; █████
- .db %01010110 ; █ █ ██
- .db %00111000 ; ███
+ .db %00011100 ; ███
+ .db %00111110 ; █████
+ .db %01010110 ; █ █ ██
+ .db %00111000 ; ███
.db %00000000
.db 8,6 ;2
- .db %00110000 ; ██
- .db %01001110 ; █ ▒███
- .db %10111110 ; █ █████
- .db %01001111 ; █ ▒████
- .db %00111000 ; ███
- .db %00011010 ; ██ █
+ .db %00110000 ; ██
+ .db %01001110 ; █ ▒███
+ .db %10111110 ;█ █████
+ .db %01001111 ; █ ▒████
+ .db %00111000 ; ███
+ .db %00011010 ; ██ █
.db 8,6 ;3
- .db %10110000 ; █ ██
- .db %01001110 ; █ ███
- .db %10110101 ; █ ██▒█▒█
- .db %01000101 ; █ ▒█▒█
- .db %00111110 ; █████
- .db %01011010 ; █ ██ █
+ .db %10110000 ;█ ██
+ .db %01001110 ; █ ███
+ .db %10110101 ;█ ██▒█▒█
+ .db %01000101 ; █ ▒█▒█
+ .db %00111110 ; █████
+ .db %01011010 ; █ ██ █
.db 8,6 ;4
- .db %00101010 ; ▒ █▒█ █
- .db %01000110 ; █ ▒██
- .db %10110101 ; █ ██ █ █
- .db %01100110 ; ██ ██▒
- .db %00111100 ; ████▒
- .db %01011001 ; █ ██ ▒█
+ .db %00101010 ;▒ █▒█ █
+ .db %01000110 ; █ ▒██
+ .db %10110101 ;█ ██ █ █
+ .db %01100110 ; ██ ██▒
+ .db %00111100 ; ████▒
+ .db %01011001 ; █ ██ ▒█
.db 8,6 ;5
- .db %01000000 ; █▒ ▒ ▒
- .db %00100101 ; ▒█ █▒█
- .db %00010100 ; ▒ ▒█ █ ▒
- .db %01000100 ; █▒ █
- .db %00010010 ; ▒█▒▒█
- .db %10011010 ; █▒ ██ █▒
+ .db %01000000 ; █▒ ▒ ▒
+ .db %00100101 ; ▒█ █▒█
+ .db %00010100 ;▒ ▒█ █ ▒
+ .db %01000100 ; █▒ █
+ .db %00010010 ; ▒█▒▒█
+ .db %10011010 ;█▒ ██ █▒
.db 8,6 ;6
- .db %01000100 ; █ █
- .db %00100000 ; ▒█ ▒ ▒
- .db %00000001 ; ▒ ▒ █
- .db %01000100 ; █ █
- .db %00100010 ; █▒ █
- .db %01001000 ; ▒█ ▒█ ▒
+ .db %01000100 ; █ █
+ .db %00100000 ; ▒█ ▒ ▒
+ .db %00000001 ; ▒ ▒ █
+ .db %01000100 ; █ █
+ .db %00100010 ; █▒ █
+ .db %01001000 ;▒█ ▒█ ▒
.db 8,6 ;7
- .db %00001000 ; ▒ █▒
- .db %11000010 ; ██ ▒ █
- .db %00000000 ; ▒
- .db %00100000 ; ▒█ ▒
- .db %00000001 ; ▒ ▒█
- .db %00110000 ; ▒██▒
+ .db %00001000 ; ▒ █▒
+ .db %11000010 ;██ ▒ █
+ .db %00000000 ; ▒
+ .db %00100000 ; ▒█ ▒
+ .db %00000001 ; ▒ ▒█
+ .db %00110000 ; ▒██▒
.db 8,6 ;8
- .db %00000100 ; ▒█
- .db %00000000 ; ▒▒ ▒
- .db %01000000 ; █
- .db %00000000 ; ▒
- .db %00000010 ; █▒
- .db %00100100 ; █▒ █
+ .db %00000100 ; ▒█
+ .db %00000000 ;▒▒ ▒
+ .db %01000000 ; █
+ .db %00000000 ; ▒
+ .db %00000010 ; █▒
+ .db %00100100 ; █▒ █
spr_yexplosion:
.db 8,5 ;1
.db (spr_bullet11-spr_bullet01) ;40
.db (spr_bullet12-spr_bullet01) ;44
.db (spr_bullet13-spr_bullet01) ;48
- .db (spr_bullet13-spr_bullet01) ;52
- .db (spr_bullet13-spr_bullet01) ;56
- .db (spr_bullet13-spr_bullet01) ;60
spr_bullet01:
.db 2,1
;direction: 001=straight forward; 010=up; 011=1/2up; 100=down; 101=1/2down
; 111=laser (speed=duration 00010-00000)
-weapondata:
- .db 1,1,%00110010,3,%00000000,0,%00000000,0 ;1 single beam
- .db 3,1,%00110011,3,%00000000,0,%00000000,0 ;2 fast single
- .db 1,1,%00110010,0,%00110010,6,%00000000,0 ;3 double
- .db 1,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple
- .db 3,2,%01110011,2,%10010011,2,%00110011,2 ;5
- .db 6,2,%01110011,2,%10010100,2,%00110011,2 ;6
- .db 8,3,%01110100,2,%10010100,2,%00110100,2 ;7
- .db 12,3,%01110110,2,%10010110,2,%00110110,2 ;8
- .db 16,4,%01110110,2,%10010110,2,%00110110,2 ;9
+weapondata: ;max = 9x6; 15x5; 21x4; 27x3
+ .db 2,1,%00110010,3,%00000000,0,%00000000,0 ;1 single
+ .db 3,1,%00110011,3,%00000000,0,%00000000,0 ;2 fast
+ .db 2,1,%00110010,0,%00110010,6,%00000000,0 ;3 double
+ .db 2,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple
+ .db 3,2,%00110011,2,%10010010,2,%01110010,2 ;5
+ .db 4,2,%01110011,2,%10010011,2,%00110011,2 ;6
+ .db 5,3,%01110100,2,%10010100,2,%00110100,2 ;7
+ .db 7,4,%01110101,2,%10010101,2,%00110101,2 ;8
+ .db 9,6,%01110110,2,%10010110,2,%00110110,2 ;9
maxweapon = 9
- .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single laser
- .db 2,3,%11100011,3,%00000000,0,%00000000,0 ;2 short
- .db 1,2,%11100100,3,%11100000,4,%00000000,0 ;3 fat
- .db 1,2,%11100101,0,%11100000,6,%00000000,0 ;4 double
- .db 3,4,%11100011,3,%00000000,0,%00000000,0 ;5 short
- .db 1,2,%11100100,3,%11100000,6,%11100000,0 ;6 triple
- .db 1,3,%11101010,3,%11100000,6,%11100000,0 ;7 triple long
- .db 2,4,%11100101,2,%11100000,4,%00000000,0 ;8 double
- .db 2,1,%11101011,3,%11100000,2,%11100000,4 ;9 big fat long
+ .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single (1x1x3)
+ .db 2,3,%11100011,3,%00000000,0,%00000000,0 ;2 short (2x1x2)
+ .db 1,2,%11100100,3,%11100000,4,%00000000,0 ;3 fat (1x2x3)
+ .db 1,2,%11100101,0,%11100000,6,%00000000,0 ;4 double (1x2x4)
+ .db 4,4,%11100011,3,%00000000,0,%00000000,0 ;5 short (4x1x2)
+ .db 1,2,%11100100,3,%11100000,6,%11100000,0 ;6 triple (1x3x3)
+ .db 1,3,%11101000,3,%11100000,6,%11100000,0 ;7 triple long (1x3x7)
+ .db 2,5,%11100101,2,%11100000,4,%00000000,0 ;8 double (2x2x4)
+ .db 1,8,%11101011,3,%11100000,2,%11100000,4 ;9 big fat long (1x3x10)
maxlaser = 18
tailbeam = %00101101 ;180 degrees
doublebeam = %01010010 ;45 degrees
.db %01111010
.db %11110010
.db %11100100
+maxarmor = 63 ;maximum HPs you can get
spr_icon02a:
.db 16,7 ;tailbeam.......:.......:
.db %10000000 ;█ ▒
txt_email: .db "www.shiar.org ",127 ;title screen
.db " shiar0@hotmail.com",0
_txt_email = $3A01 ;$3A1E=just email
-txt_about: .db "v0.99.820 ",127," by Shiar",0 ;right behind txt_email
+txt_about: .db "v0.99.99 ",127," by Shiar",0 ;right behind txt_email
_txt_about = $3321
txt_menu1: .db "NEW GAME",0
txt_menu2: .db "CONTINUE",0
+txt_difhardcore:.db "Hardcore!",0
+txt_difnormal: .db "Normal",0
+txt_updouble: .db "Up Double",0
+txt_tailbeam: .db "Tail Beam",0
+
txt_level: .db "LEVEL ",0 ;new level screen
txt_lives: .db "Lx0",0
txt_savekey: .db "Press [F1] to save",0
_txt_pause = $020B
txt_pressenter: .db "Enter to continue",0 ;pause
_txt_pressenter = $0201
+#ifdef teacherkey
txt_teacher: .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
txt_teacherans: .db Lneg,"14.6549373495",0
+#endif
;---------------------------- save data -------------------------------------
hiname .db "shiar.99",0 ; " " name
storehi_end:
+invertmode: cpl ;/or a ;saves B<>W mode setting cpl
+
storesave_start: ;--SAVED GAME-- defs:
-level .db 10 ;level number 1
-levelp .dw level09 ;pointer to level data lev00
+your_ship .dw spr_ship01 ;your sprite (^invertmode^) sprs1
+level .db 1 ;level number 1
+levelp .dw level00 ;pointer to level data lev00
pickuptimer .db 4 ;counts when to place a pickup 4
-your_ship .dw spr_ship01 ;your sprite sprs1
your_extramode .db 1 ;you have tail or double 1
your_score .dw 0 ;current score 0
-your_pickup .db 3 ;pickups already picked up 0
+your_pickup .db 0 ;pickups already picked up 0
your_occ .db 0 ;0=normal 1..16=exploding 0
your_shield .db 0 ;invincibility left 0
-your_armor .db 12 ;HP left 12
+your_armor .db 24 ;HP left 24
your_lives .db 3 ;lives left 3
-your_weapon .db 3 ;current weapon upgrade 0
+your_weapon .db 17 ;current weapon upgrade 0
your_multiples .db 0 ;multiples present 0
your_extra .db 0 ;extra beam present 0
+hardcore .db 0 ;hardcore mode if non-0 0
storesave_end:
time2invert: .db 0 ;time until b<>w switch (0 at startup)
;format:boss: [moveType] [enemyType]
; @level: [nr.dif.enemies]x [enemy nr]
; [min. enemy frequency] [enemy frequency max.inc]
-; [next lvl (=nrenemies+4)] [level_info: 1:ceiling 1:ground]
+; [next lvl (=nrenemies+4)] [level_info: 000000 1:ceiling 1:ground]
; [tunnel size] [groundtype] [stars1] [stars2]
;efrequency must be odd if halfluring!
.db 25,33,"Imperial ships have",0,0
.db 31,9,"been sent to intercept you",0,31-25+6,-1
- .db 9
-level00:.db 5,2,4,2,1,1
+ .db 30
+level00:.db 5,3,5,3,2,2
.db 28,73,13
- .db %00,0,0,1,1
+ .db %00,0,1,1
- .db 30 ;boss for level01
-level01:.db 2,2,4 ;enemies
+ .db 31 ;boss for level01
+level01:.db 2,3,5 ;enemies
.db 26,70,20
- .db %00,0,0,1,1
+ .db %00,0,1,1
- .db 31
-level02:.db 3,2,3,4
+ .db 32
+level02:.db 3,3,4,5
.db 20,60,60
- .db %00,0,0,1,1
+ .db %00,0,1,1
- .db 32
-level03:.db 4,3,4,5,6
+ .db 33
+level03:.db 4,4,5,6,7
.db 17,40,75
- .db %00,0,0,1,1
+ .db %00,0,1,1
.db 0
.db 1,1,"Long-Range scanners are ",
.db 38,1,"lose them inthere.",0,38-24+6,-1
;---- approaching asteroid belt
- .db 33
-level04:.db 5,7,7,8,10,11
+ .db 34
+level04:.db 5,8,8,9,11,12
.db 17,27,70
- .db %00,0,0,1,1
+ .db %00,0,1,1
-;---- light asteroid belt
- .db 34
-level05:.db 7,9,10,8,10,11,11,13
+;---- inside
+ .db 35
+level05:.db 7,10,11,9,11,12,12,14
.db 12,24,80
- .db %00,0,0,1,1
+ .db %00,0,1,1
-;---- inside asteroid belt
- .db 35
-level06:.db 10,9,10,11,11,13,12,12,13,14,14
+ .db 36
+level06:.db 10,10,11,12,12,14,13,13,14,15,15
.db 7,18,180
- .db %00,0,0,1,1
+ .db %00,0,1,1
- .db 36
-level07:.db 4,15,16,17,5
+;out
+ .db 37
+level07:.db 4,16,17,18,6
.db 22,29,62
- .db %00,0,0,1,1 ;-1=%11111111=line
+ .db %00,0,1,1 ;-1=%11111111=line
- .db 37
-level08:.db 5,15,16,17,18,18
+ .db 38
+level08:.db 5,16,17,18,19,19
.db 20,38,57
- .db %00,0,0,1,1
+ .db %00,0,1,1
- .db 38
-level09:.db 3,18,19,20
+ .db 39
+level09:.db 3,19,20,21
.db 19,63,57
- .db %00,0,0,1,1
+ .db %00,0,1,1
+
+ .db 40
+level10:.db 7,22,23,24,24,24,25,26
+ .db 20,22,63
+ .db %00,0,1,1
+
+;endlevel
+ .db 41
+level11:.db 1,26
+ .db 20,20,80
+ .db %00,0,1,1
.db 0,1,1,"That`s all folks...",0,0
.db 20,50,"for now...",0,20-0+6,-1
-endlevel = 10
+endlevel = 12
-pickupfreq = 18
+pickupfreq = 19
;------------------------------ enemies -------------------------------------
;format: [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)]
; [movetype] [time2fire] [firefreq] [firetype]
+;occ: 00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy
;appearances: 1=random; 2=lure; 3=halflure
;movetypes: 1=updown; 2=1/4x; 3=1/2x; 4=3/4x; 5=3/2x; 6=2x; 7=ylure50%;
-; 7=ylure; 8=ylure50%; 9=x; 10=x+y-lure 50%; 11=-1/2x; 12=-1x
-;firetypes: 1=normal; 6=aiming; 7=triple; 8=double
-
-enemyspecs: ;sprites use 418/512 bytes
- .db 0,%00000111,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;pickup
-;1-6=basic enemies , , , , , , ,
- .db 0,%00000110,(spr_enemyE0-spr_enemy00)/2,128,1,00,12, 0,1 ;intro
- .db 0,%00010010,(spr_enemyE1-spr_enemy00)/2,128,1,00,10, 0,1 ;weak
- .db 0,%00110010,(spr_enemyE4-spr_enemy00)/2,128,1,03, 6,50,1 ;slow
- .db 0,%00100110,(spr_enemyE2-spr_enemy00)/2,128,1,00, 1, 0,1
- .db 0,%00101110,(spr_enemyE3-spr_enemy00)/2,128,3,00,19,39,8 ;heavy
- .db 0,%00101010,(spr_enemyE5-spr_enemy00)/2,128,3,05, 1, 0,1 ;fast
-;7-9=backwards enemies , , , , , , ,
- .db 0,%00011110,(spr_enemyB1-spr_enemy00)/2,000,3,11,19,92,1
- .db 0,%00101110,(spr_enemyB2-spr_enemy00)/2,000,1,12,11,45,1
- .db 0,%00110110,(spr_enemyB3-spr_enemy00)/2,000,1,11,10,41,8 ;small
-;10-14=asteroid , , , , , , ,
- .db 0,%00100110,(spr_enemyA1-spr_enemy00)/2,128,1,04, 0, 0,1
- .db 0,%00111110,(spr_enemyA2-spr_enemy00)/2,128,1,00, 0, 0,1
- .db 0,%01011010,(spr_enemyA3-spr_enemy00)/2,128,1,05, 0, 0,1
- .db 1,%00001010,(spr_enemyA4-spr_enemy00)/2,128,1,03, 0, 0,1 ;slow+hard
- .db 0,%00111110,(spr_enemyA4-spr_enemy00)/2,128,1,06, 0, 0,1
-;15-20=improved enemies, , , , , , ,
- .db 0,%01001010,(spr_enemyG1-spr_enemy00)/2,128,3,00, 3,40,1
- .db 0,%01011110,(spr_enemyG2-spr_enemy00)/2,128,3,00, 1,36,1
- .db 0,%00110010,(spr_enemyG5-spr_enemy00)/2,128,1,01, 9,52,1 ;updown
- .db 0,%01111010,(spr_enemyG3-spr_enemy00)/2,128,3,04, 7,99,7 ;3x
- .db 0,%10110110,(spr_enemyG4-spr_enemy00)/2,128,2,01,17, 0,7 ;updown3x
- .db 0,%10001011,(spr_enemyG6-spr_enemy00)/2,128,2,07,62,60,8 ;lure
-;21-29=unused, , , , , , , ,
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;21
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;22
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;23
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;24
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;25
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;26
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;27
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;28
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;29
-;30-33=first bosses , , , , , , ,
- .db 1,%00101011,(spr_boss2 -spr_enemy00)/2,127,1,09,20,12,1 ;small
- .db 1,%00110011,(spr_boss1 -spr_enemy00)/2,127,1,09,15,11,8 ;normal
- .db 1,%01001011,(spr_boss1 -spr_enemy00)/2,127,3,10,10,11,1 ;moving
- .db 0,%11111111,(spr_boss3 -spr_enemy00)/2,127,2,10, 1, 4,1 ;weak+rapidfire
-;34-35=asteroid bosses , , , , , , ,
- .db 2,%00001011,(spr_bossA1 -spr_enemy00)/2,127,1,10,36,14,6
- .db 2,%00110011,(spr_bossA1 -spr_enemy00)/2,127,2,10,28,12,6
-;36-38=big bosses , , , , , , ,
- .db 2,%00000011,(spr_bossB1 -spr_enemy00)/2,127,3,08,31, 8,7
- .db 2,%00100111,(spr_bossB2 -spr_enemy00)/2,127,3,08,13, 7,7
- .db 2,%00100111,(spr_bossB2 -spr_enemy00)/2,127,3,08,13, 7,7
+; 8=ylure; 9=ylure50%; 10=x+y-lure 50%; 11=-1/2x; 12=-1x
+;firetypes: 1=normal; 6=aiming; 7=triple; 8=double; 9=quad; 10=dquad; 11=ran
+
+enemyspecs: ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes
+;0-1=pickups
+ .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,2,03, 0, 0,1 ;pickup
+ .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,2,03, 0, 0,1 ;bigpickup
+;2-7=basic enemies , , , , , , , ,
+ .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,1,00,12, 0,1 ;intro
+ .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,1,00,10, 0,1 ;weak
+ .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,1,03, 6,50,1 ;slow
+ .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,1,00, 1, 0,1
+ .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,3,00,19,39,8 ;heavy
+ .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,3,05, 1, 0,1 ;fast
+;8-10=backwards enemies, , , , , , , ,
+ .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,3,11,19,92,1
+ .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,1,12,11,45,1
+ .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,1,11,10,41,8 ;small
+;11-15=asteroid , , , , , , , ,
+ .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,1,04, 0, 0,1
+ .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,1,00, 0, 0,1
+ .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,1,05, 0, 0,1
+ .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,1,03, 0, 0,1 ;slow+hard
+ .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,1,06, 0, 0,1
+;16-21=improved enemies, , , , , , , ,
+ .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,3,00, 3,40,1
+ .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,3,00, 1,36,1
+ .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,1,01, 9,52,1 ;updown
+ .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,3,04, 7,99,7 ;3x
+ .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,2,01,17, 0,7 ;updown3x
+ .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,2,07,62,60,8 ;lure
+;22-26=hi-speed , , , , , , , ,
+ .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,2,05, 3,32,8 ;fast
+ .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,3,07, 2,28,1 ;lure
+ .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,3,06, 0, 0,1 ;vfast+nofire
+ .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,1,07, 1,20,8 ;lure
+ .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,2,01, 3,7,11 ;updown+ran
+;27-28=unused, , , , , , , , ,
+ .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;27
+ .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;28
+;29=final boss' enemy
+ .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,3,01, 0, 0,1 ;lure
+bossenemy = 29
+;30-34=first bosses , , , , , , , ,
+ .db 2,%01000111,spr_boss01 &255,spr_boss01 /256,127,1,09,35,50,7 ;triple
+ .db 2,%01010011,spr_boss02 &255,spr_boss02 /256,127,1,09,20,12,1 ;small
+ .db 2,%01111011,spr_boss03 &255,spr_boss03 /256,127,1,09,15,11,8 ;normal
+ .db 2,%10011111,spr_boss04 &255,spr_boss04 /256,127,3,10,10,11,1 ;moving
+ .db 1,%11111011,spr_boss05 &255,spr_boss05 /256,127,2,10, 1, 4,1 ;weak+rapidfire
+;35-36=asteroid bosses , , , , , , , ,
+ .db 4,%00010111,spr_bossA1 &255,spr_bossA1 /256,127,1,10,36,14,6
+ .db 4,%01101111,spr_bossA1 &255,spr_bossA1 /256,127,2,10,28,12,6
+;37-41=big bosses , , , , , , , ,
+ .db 4,%00010111,spr_boss07 &255,spr_boss07 /256,127,3,08,31, 8,7
+ .db 5,%00101011,spr_boss06 &255,spr_boss06 /256,127,3,08,13, 7,7
+ .db 6,%10001111,spr_boss08 &255,spr_boss08 /256,127,1,08,18, 8,9 ;quad
+ .db 7,%00101011,spr_boss09 &255,spr_boss09 /256,127,1,08,21, 9,10 ;6x
+ .db 9,%11011011,spr_boss09 &255,spr_boss09 /256,127,1,08,12,11,12 ;enemies
spr_enemy00:
+spr_enemyP1:
.db 10,8 ;pickup
.db %00111111 ; ██████
.db %01100001 ; ██ ██
.db %01000000
.db %01000000
.db %10000000
+spr_enemyP2:
+ .db 11,9 ;big pickup
+ .db %00111111 ; ███████
+ .db %01100000 ; ██ ██
+ .db %10001110 ;█ ███ █
+ .db %10111011 ;█ ███ ███ █
+ .db %10100000 ;█ █ █ █
+ .db %10111011 ;█ ███ ███ █
+ .db %10001110 ;█ ███ █
+ .db %01100000 ; ██ ██
+ .db %00111111 ; ███████
+ .db 9
+ .db %10000000
+ .db %11000000
+ .db %00100000
+ .db %10100000
+ .db %10100000
+ .db %10100000
+ .db %00100000
+ .db %11000000
+ .db %10000000
spr_enemyE0:
.db 6,7 ;weak
.db %01101000 ; ██ █
.db %00100100 ; █ █
.db %00011100 ; ███
- .db 0
spr_enemyE1:
.db 6,7 ;weak
.db %00111100 ; ████
.db %10111000 ;█ ███
.db %01000100 ; █ █
.db %00111100 ; ████
- .db 0
spr_enemyE2:
.db 6,6 ;weak
.db %00111100 ; ████
.db %10011000 ;█ ██
.db %01101000 ; ██ █
.db %00011100 ; ███
- .db 0
spr_enemyE5:
.db 6,6 ;speedy
.db %00010100 ; █ █
.db %01110100 ; ███ █
.db %01001000 ; █ █
.db %11110000 ;████
- .db 0
spr_enemyB3:
.db 5,7
.db %11100000 ;███
.db %01111000 ; ████
.db %01010000 ; █ █
.db %11100000 ;███
- .db 0
spr_enemyA1:
.db 7,6 ;asteroid one
.db %11111111 ;████████
.db %10110110 ;█ ██ ██
.db %01100000 ; ██
- .db 0
spr_enemyA3:
.db 8,8 ;asteroid three
.db %00011110 ; ████
.db %10011010 ;█ ██ █
.db %01110100 ; ███ █
.db %00001111 ; ████
- .db 0
spr_enemyS1:
.db 6,6 ;solid
.db %00001110 ; ███
.db %11110001 ;████ █
.db %00111110 ; █████
- .db 0
spr_enemyN2:
.db 8,7 ;
.db %00111110 ; █████
.db %11111111 ;████ ███
.db %00011101 ; ███ █
.db %00111110 ; █████
- .db 0
spr_enemyN3:
.db 8,7 ;Nem3MSX jumper lvl#3
.db %10111110 ;█ █████
.db %01111110 ; ██████
.db %01011101 ; █ ███ █
.db %10111110 ;█ █████
- .db 0
spr_enemyN4:
.db 8,8 ;Stolen from XC1701II
.db %01111110 ; ██████
.db %01010010 ; █ █ █
.db %01111100 ; ████
-spr_boss1:
- .db 16,10 ;.......:.......:
- .db %00000001 ; ██████ ██
- .db %00001110 ; ███ █ ███
- .db %00110010 ; ██ █ ████
- .db %01001101 ; █ ██ ██
- .db %11101011 ;███ █ ██ █
- .db %11101011 ;███ █ ██ █
- .db %01001101 ; █ ██ ██
- .db %00110010 ; ██ █ ████
- .db %00001110 ; ███ █ ███
- .db %00000001 ; ██████ ██
- .db 10
- .db %11111011
- .db %00101110
- .db %11110000
+spr_enemyM1:
+ .db 8,7 ;mine
+ .db %00111100 ; ████
+ .db %01011010 ; █ ██ █
+ .db %11111111 ;████████
+ .db %01001010 ; █ █ █
+ .db %11111111 ;████████
+ .db %01011010 ; █ ██ █
+ .db %00111100 ; ████
+
+spr_boss01:
+ .db 9,12 ;.......:.2.....:
+ .db %00000111 ; ████
+ .db %00011100 ; ███
+ .db %00101010 ; █ █ █
+ .db %01011011 ; █ ██ ██
+ .db %10100110 ;█ █ ██ █
+ .db %11010101 ;██ █ █ █
+ .db %11010101 ;██ █ █ █
+ .db %10100110 ;█ █ ██ █
+ .db %01011011 ; █ ██ ██
+ .db %00101010 ; █ █ █
+ .db %00011100 ; ███
+ .db %00000111 ; ████
+ .db 12
.db %10000000
- .db %01000000
- .db %01000000
+ .db %00000000
+ .db %00000000
+ .db %00000000
.db %10000000
- .db %11110000
- .db %00101110
- .db %11111011
- .db 0
-spr_boss2:
+ .db %00000000 ;...what a waste of space...
+ .db %00000000
+ .db %10000000
+ .db %00000000
+ .db %00000000
+ .db %00000000
+ .db %10000000
+spr_boss02:
.db 12,12 ;.......:....5..:
.db %00011110 ; ████
.db %01100001 ; ██ ██
.db %10100000
.db %01100000
.db %10000000
-spr_boss3:
+spr_boss03:
+ .db 16,10 ;.......:.......:
+ .db %00000001 ; ██████ ██
+ .db %00001110 ; ███ █ ███
+ .db %00110010 ; ██ █ ████
+ .db %01001101 ; █ ██ ██
+ .db %11101011 ;███ █ ██ █
+ .db %11101011 ;███ █ ██ █
+ .db %01001101 ; █ ██ ██
+ .db %00110010 ; ██ █ ████
+ .db %00001110 ; ███ █ ███
+ .db %00000001 ; ██████ ██
+ .db 10
+ .db %11111011
+ .db %00101110
+ .db %11110000
+ .db %10000000
+ .db %01000000
+ .db %01000000
+ .db %10000000
+ .db %11110000
+ .db %00101110
+ .db %11111011
+spr_boss04:
+ .db 16,10 ;.......:.......:
+ .db %00000000 ; █████
+ .db %00000000 ; ███ █
+ .db %00000111 ; ████ █████
+ .db %00111101 ; ████ █ █ ████
+ .db %01001010 ; █ █ █ ██ ███ █
+ .db %10110110 ;█ ██ ██ ███ █ █
+ .db %10110110 ;█ ██ ██ ███ █ █
+ .db %01001010 ; █ █ █ ██ ███ █
+ .db %00111101 ; ████ █ █ ████
+ .db %00000111 ; ████ █████
+ .db 12 ; ███ █
+ .db %00011111 ; █████
+ .db %11100001
+ .db %10111110
+ .db %01011110
+ .db %11011101
+ .db %11100101
+ .db %11100101
+ .db %11011101
+ .db %01011110
+ .db %10111110
+ .db %11100001
+ .db %00011111
+spr_boss05:
.db 16,10 ;.......:.......:
.db %11111110 ;███████
.db %00000011 ; ███ ████
.db %11100001
.db %10001111
spr_bossA1:
- .db 16,11 ;AsteroidBoss one
+ .db 12,11 ;AsteroidBoss one
.db %00011110 ; ████
.db %01110011 ; ███ ███
.db %01111111 ; ███████ █
.db %11110000
.db %11110000
.db %11000000
- .db 0
-spr_bossB1:
- .db 16,18 ;BigBoss one :
+spr_boss06: ;modelled after a Nemesis][MSX boss
+ .db 16,15 ;.......:.......:
+ .db %00001111 ; █████
+ .db %00111110 ; █████ █████
+ .db %01111101 ; █████ █ ███████
+ .db %00000011 ; ██
+ .db %00000100 ; █ █
+ .db %00000011 ; █████
+ .db %00011110 ; ████ ██ ████
+ .db %11110011 ;████ ██ █ █
+ .db %00011110 ; ████ ██ ████
+ .db %00000011 ; █████
+ .db %00000100 ; █ █
+ .db %00000011 ; ██
+ .db %01111101 ; █████ █ ███████
+ .db %00111110 ; █████ █████
+ .db %00001111 ; █████
+ .db 15
+ .db %10000000
+ .db %11111000
+ .db %01111111
+ .db %00000000
+ .db %10000000
+ .db %11100000
+ .db %11011110
+ .db %01010000
+ .db %11011110
+ .db %11100000
+ .db %10000000
+ .db %00000000
+ .db %01111111
+ .db %11111000
+ .db %10000000
+spr_boss07: ;modelled after a Nemesis][MSX boss
+ .db 16,18 ;.......:.......:
.db %00000000 ; █ █
.db %00000111 ; ███ ███
.db %00000011 ; ████ █
.db %00000011 ; ████ █
.db %00000111 ; ███ ███
.db 19 ; █ █
- .db %01010000 ;modelled after a Nemesis][MSX boss
+ .db %01010000
.db %01110000
.db %11010000
.db %10110000
.db %11010000
.db %01110000
.db %01010000
-spr_bossB2:
- .db 16,15 ;BigBoss two :
- .db %00001111 ; █████
- .db %00111110 ; █████ █████
- .db %01111101 ; █████ █ ███████
- .db %00000011 ; ██
- .db %00000100 ; █ █
- .db %00000011 ; █████
- .db %00011110 ; ████ ██ ████
- .db %11110011 ;████ ██ █ █
- .db %00011110 ; ████ ██ ████
- .db %00000011 ; █████
- .db %00000100 ; █ █
- .db %00000011 ; ██
- .db %01111101 ; █████ █ ███████
- .db %00111110 ; █████ █████
- .db %00001111 ; █████
- .db 15 ;modelled after a Nemesis][MSX boss
+spr_boss08:
+ .db 14,14 ;.......:......7:
+ .db %01100111 ; ██ ████ ██
+ .db %11001011 ;██ █ ██ █ ██
+ .db %10110000 ;█ ██ ██ █
+ .db %10101111 ;█ █ ██████ █ █
+ .db %01010000 ; █ ██ ██ █
+ .db %01010011 ; █ █ ██ █ █
+ .db %10100111 ;█ █ ████ ██ █
+ .db %10100111 ;█ █ ████ ██ █
+ .db %01010011 ; █ █ ██ █ █
+ .db %01010000 ; █ ██ ██ █
+ .db %10101111 ;█ █ ██████ █ █
+ .db %10110000 ;█ ██ ██ █
+ .db %11001001 ;██ █ ██ █ ██
+ .db %01100111 ; ██ ████ ██
+ .db 14
+ .db %10011000
+ .db %01001100
+ .db %00110100
+ .db %11010100
+ .db %00101000
+ .db %00010100
+ .db %10110100
+ .db %10110100
+ .db %00010100
+ .db %00101000
+ .db %11010100
+ .db %00110100
+ .db %01001100
+ .db %10011000
+spr_boss09:
+ .db 16,19 ;.......:.......:
+ .db %01111011 ; ████ ███
+ .db %10000110 ;█ ██ █████
+ .db %00000011 ; ███ █
+ .db %00111011 ; ███ ██ ███
+ .db %00000111 ; ███ ███
+ .db %00001100 ; ██ ███ █
+ .db %00110111 ; ██ █████ █ ██
+ .db %01111011 ; ████ ██ █ ██ █
+ .db %11100100 ;███ █ ██ ██ █
+ .db %00000001 ; ██████ ██ █
+ .db %11100100 ;███ █ ██ ██ █
+ .db %01111011 ; ████ ██ █ ██ █
+ .db %00110111 ; ██ █████ █ ██
+ .db %00001100 ; ██ ███ █
+ .db %00000111 ; ███ ██
+ .db %00111011 ; ███ ██ ███
+ .db %00000011 ; ███ █
+ .db %10000110 ;█ ██ █████
+ .db %01111011 ; ████ ███
+ .db 19
.db %10000000
.db %11111000
- .db %01111111
- .db %00000000
- .db %10000000
- .db %11100000
- .db %11011110
- .db %01010000
- .db %11011110
- .db %11100000
- .db %10000000
- .db %00000000
- .db %01111111
+ .db %10100000
+ .db %00011100
+ .db %01110000
+ .db %11101000
+ .db %11010110
+ .db %00101101
+ .db %11011001
+ .db %11011001
+ .db %11011001
+ .db %00101101
+ .db %11010110
+ .db %11101000
+ .db %01100000
+ .db %00011100
+ .db %10100000
.db %11111000
.db %10000000
- .db 0
;----------------------------------------------------------------------------
;----------------------------- logo ------------------------------------------
; # after pause weapon will not be fired
; # teacher key fixed (waits for GRAPH to be release before&after)
;
-; 0.99.820 -- 20.VIII.00 -- size 6500
+; 0.99.99 -- 9.IX.00 -- size 6936
;
; + you can have upto FOUR multiples! (~20 pixels apart)
; * some optimizations: keycall, menu handling, port nops removed,
; * maximum different enemies increased from 28 to 63
; * pickup sprite altered, small changes to some enemies
; + new moves implemented: 75% speed and lure-while-moving
+; # fixed the enemy aiming bullets procedure
+; * enemies fire their bullets centered too! (even the large bosses)
+; * you may NOT have any multiples together with beams, just lasers
+; + added new enemy guns: quad- and 6x-fire!!
+; * sprite table length increased to 768 bytes (stored DIV3)
+; + ships 3/4 select hardcore mode: score and damage are doubled
+; + first icon not only increases armor, but also activates shield for
+; some time (shield halves damage and absorbs bullets in normal mode)
+; + ship selection screen also shows ship specs (hardcore/tailbeam/etc)
+; * shield looks different for each ship
+; * hiscore/savegame procedure optimized (several bytes smaller)
+; + B<>W mode setting will be stored
+; * enemy sprite pointers stored as words (thus increasing sprite table
+; length from 768B to 65kB, and increasing sprite calculation speed)
+; * hardcore mode does _more_ than doubled damage (bulletsdamage +1)
+; * 10 bytes off by optimizing main menu a little
+; * and optimizations to hiscore name handling saved another 17 bytes!
+; * score increased by 1 per placed enemy, instead of time (otherwise
+; you could just evade bosses for a long time for very high score)
+; * findpixel optimized (or rather un-unoptimized: restored to original)
+; # ground fixed again (and optimized for tunnel only)
+; # prevents exploding more than once (not dieing while inside ground)
+; * some unneccessary pushes removed
+; + final boss also fires moving mines (just up/down-enemies)
+; * on collision less damage to enemy, more to you (bosses too simple)
+; * normal pickups will increase armor and shield directly (no [alpha])
+; + a large pickup'll appear at the end of a level which will select
+; your next upgrade: beamweapon, laser, multiple/tailbeam/up-double
+; + a small explosion is displayed when enemy's hit but not destroyed
+; # _all_ multiples appear at your position at start of level
+; # bug in selecting multiples fixed (recent bug)
+; + getting passed 3rd upgrade (4 pickups) increases score by 250!
+; - second icon integrated in 5th, first two icons removed (unused now)
+; * the armor bar is now 5 pixels in height; very visible
+; # if selecting upgrade or starting level, charge bar wasn't displayed
+;
+; 1.00.99 -- 9.IX.00 -- size 6936
+;
+; + ...
+;
;
; + added - removed * changed # bug fixed
-;bullet handling: (255/enemy)+419+putsprite cycles per bullet
+;bullet handling: (255/enemy)+419+putsprite cycles per bullet
\ No newline at end of file