.dw Title ;pointer to description (all shells)
.dw Icon ;pointer to YAS icon
-Title: .db "Nemesis v0.99.99 by SHIAR",0
+Title: .db "Nemesis v1.0.A23 by SHIAR",0
Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 7bytes
.db %11100000 ; ███
start_tha_freakin_game:
ld a,(hl) ;(menuitem)
dec a ;new game=0; so that gives -1 = NZ
- cal nz,New_game ;NEW GAME
+ jp nz,New_game ;NEW GAME
jp samelevel ;CONTINUE: game_main_loop
menuexit:
cp 64+1 ;last explosion frame? (1-16=1st;49-64=4th)
jp c,exploding_you ;not yet: display explosion
cp 64+16 ;delay finished?
+ ret nz ;no, don't display anything (&return)
+ pop hl ;restore stack (cuzzof call)
jp z,You_die ;yes = game over
- ret ;don't display anything
;----move----
ok: ;we are
exploding_you:
srl a ;half the framerate
- srl a ;half that framerate
- srl a ;and half again that framerate
+ srl a ;and half that framerate
ld hl,x-1
ld ix,spr_yexplosion ;base sprite
dec a ;is it 1?
ret m ;return if it's 0 (no pickups)
- jr nz,selectlaser ;no, carry on
- ld (hl),a ;reset pickups
+ ld (hl),0 ;reset pickups
+ jr nz,selectlaser ;no, carry on again
+selectbeam:
ld a,(de) ;(your_weapon)
inc a ;next
cp maxweapon
jr disp_icons ;display n return
selectlaser:
dec a ;is it 2?
- ld (hl),0 ;reset pickups
- jr nz,selectextra ;no, carry on again
+ jr nz,selectextra ;no, carry on
ld (your_extra),a ;no extra beams (tailbeam/up-double)
ld a,(de) ;(your_weapon)
cp maxweapon ;upgrade from bullet?
displivesdone:
cal disp_armor ;display bar
- ld ix,spr_icon00
+ ld ix,spr_icon00 ;emptyIcon
ld a,(your_weapon) ;ur weapon
- cp maxweapon ;laser?
+ cp maxweapon ;bullets?
psh af ;a=(your_weapon); cf=bullets
jr nc,no_bullets ;=laser
ld hl,$3945 ;position to display bullet-type digit
- pop af ;digit=(your_weapon)
- psh af
inc a ;1 = weapon #1 (=0)
ld (_penCol),hl ;set location
add a,'0' ;make digit
cal _vputmap ;display char
- ld ix,spr_icon03 ;bulletIcon
+ ld ix,spr_icon04 ;bulletIcon
no_bullets:
- ld de,$3939 ;icon #1
- cal putwidesprite ;display icon (beamweap)
+ ld de,$3939 ;icon #2
+ cal putwidesprite ;(beamweap)
- ld ix,spr_icon00 ;emptyIcon
- pop af ;ld a,(your_weapon)
- ld b,a
+ ld ix,spr_icon00
+ pop af ;ld a,(your_weapon) \ cp maxweapon
jr c,no_laser ;popped carry
- ld hl,$3955 ;position to display bullet-type digit
+ ld hl,$3955 ;position to display laser-type digit
ld (_penCol),hl ;set location
- ld a,b ;(your_weapon) ;load = faster than push
- sub maxweapon-1 ;1 = laser #1 (=maxweapon)
+ sub maxweapon-1 ;1 = laser #1 (=maxweapon)
add a,'0' ;make digit
cal _vputmap ;display char
- ld ix,spr_icon04 ;laserIcon
+ ld ix,spr_icon03 ;laserIcon
no_laser:
- ld de,$4939 ;icon #2
- cal putwidesprite ;(laser)
+ ld de,$4939 ;icon #1
+ cal putwidesprite ;display icon (laser)
ld ix,spr_icon00 ;emptyIcon
ld a,(your_multiples) ;number of multiples
ld (PutWhere),a ;set sprite-position to normal screen
jp disp_charge ;display weapon charge bar
+drawline:
+ ld (hl),a ;draw one piece of the divider-line
+ inc hl ;move right (8 pixels = 1 byte)
+ dnz drawline ;repeat (16bytes * 8pixels =128= screen width)
+ ret
+
disp_armor:
ld de,16 ;line size
- 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)
dnz armorbarbyte ;loop it b times
lastarmorbit:
ld (hl),c ;draw the last byte
+ dec hl
+ ld (hl),0 ;empty byte before to remove any remainders
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)
- dnz drawline ;repeat (16bytes * 8pixels =128= screen width)
+ ld hl,(56*16)+VIDEO_MEM+7
+ ld a,%01010101
+armorbarY:
+ cal drawbarrow ;display "grey" mask
+ cal drawbarrow ;display "grey" mask
+ add hl,de
+ add hl,de
+ add hl,de
+ cal drawbarrow
+drawbarrow: ;ORs an entire row with A
+ add hl,de ;one down
+ ld b,4 ;four bytes right
+ psh hl
+armorbarX:
+ dec hl ;next byte
+ psh af
+ or (hl)
+ ld (hl),a ;clear
+ pop af
+ dnz armorbarX ;4x
+ pop hl ;old position
ret
;------------------------- fire bullet --------------------------------------
add a,(ix+1) ;add enemy height (according to sprite @ix)
jp m,nolashit ;a-e>0 = hit
enemy_lashit:
+ psh hl ;pointer to enemy destroyed by putsprite
+ psh bc ;safe enemy counter
+ psh de ; and Ur position (used for further compares)
+ dec e ;adjust y-position
+ dec e
+ dec e ;hit sprite centered at e (height=6)
+ dec hl ;@x
+ ld d,(hl) ;x-position of hit (enemy's x-pos)
+ ld ix,spr_lashit ;laserHit sprite
+ cal putsprite ;display this frame only unlike bullethit ani
+ pop de ;restore regs
+ pop bc
+ pop hl
ld a,(curweapdamage) ;damage
- cal enemy_hit ;hl=enemy+y
+ cal enemy_hit ;inflict (hl=enemy+y)
nolashit:
pop hl ;enemy+1
ld a,b ;psh bc
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
+ ld a,(your_weapon)
+ cp maxweapon ;you have bullets?
+ jr nc,placebigupgrade ;if not just place the big upgrade
+ ld a,(level)
+ rra ;if level&1=0 (even levels)
+ ret nc ;then dont place a pickup (=50%)
+placebigupgrade
+ ld a,1 ;no enemies left: place upgrade pickup
jr place_enemy ;place enemy #1(=a) = big pickup
enemyleft:
ld hl,eventleft
dec hl ;points to leveldata\boss\enemynr
ld a,(hl) ;load enemy# of boss
-place_enemy: ;places enemy #=a
+place_enemy: ;places enemy #=a (out:achl=?;b=0;de=@enemy+11)
psh af
ld hl,enemies+1-enemysize
ld bc,enemysize
dec de ;goto hp64 (before occ)
ldi ;set hp64
ldi ;set hitpoints+occ of enemy class
- ld a,(hl)
- .db $DD,$6F ;ld hx,a
+ ld c,(hl)
ldi ;set sprite
- ld a,(hl)
- .db $DD,$67 ;ld lx,a
+ ld b,(hl) ;bc=@enemy_sprite
+ inc bc ;@sprite-height
+ ld a,(bc)
+ ld b,a ;b = sprite-height
ldi ;set sprite + 1
ldi ;set x-position
ld a,(hl) ;load placeInfo
inc hl
- dec a ;is it 1?
+ inc a ;is it -1?
jr z,random_enemy ;yes: create random value <51 in a
- dec a ;is it 2?
+ inc a ;is it -2?
jr z,lure_enemy ;yes: create a 100% luring enemy
+ inc a ;is it -3?
+ jr z,lure_enemy ;yes: pick one (50% lure)
;otherwise?
-halflure_enemy: ;yes (of course it is): pick one (50% lure)
+yset_enemy: ;set 0+3..$FC+3 as y-position
+ ld (de),a
+ jr ypos_OK
+halflure_enemy:
ld a,(timer) ;look at frame-number
rra ;make random if odd frame nr.
jr nc,random_enemy ;1st possibility: random enemy
jr ypos_OK
random_enemy:
ld a,64-8 ;=57=screen height (8 is scorebar)
- sub (ix+1) ;minus sprite height=bottom
- ld c,b ;range=0 to...
+ sub b ;minus sprite height=bottom
+ ld c,0 ;range=0 to...
ld b,a ;...57-y
cal Random ;random value on screen
ypos_OK: ;random value successfully created
sub 6
jp c,bulletok ;type #0-5 = done (normal/diag)
or a
- jr z,bulletaiming ;type #6 = aiming = type#2..5
+ jp z,bulletaiming ;type #6 = aiming = type#2..5
dec a
jr z,bullettriple ;type #7 = triple
dec a
jr z,bulletdquad ;type #10 = double-quad
dec a
jr z,bulletran ;type #11 = random
+ dec a
+ jr z,firesenemies ;type #12 = mine + Dquad
+
+basefiresenemies: ;type #13 = base
+ ld bc,$3A00
+ cal Random
+ ld e,a
+ cal random14
+ ld c,a
+ cal bulletok ;find and fire bullet
+
+ ld a,boss2enemy ;otherwise place enemy #[boss2enemy]
+ jp place_enemy
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]
+ ld a,boss1enemy ;otherwise place enemy #[boss1enemy]
jp place_enemy
bulletran:
- ld c,1
- ld b,4
- cal Random
+ cal random14
ld (hl),a
jr _bulletok
ld a,e
add a,10
ld e,a ;offset 10 down (5 total)
+_enemy_fires_again:
jr enemy_fires_again
bulletquad: ;type #9 = quad
inc hl ;next bullet position
inc e
inc e ;two px down
- jr enemy_fires_again ;find and fire another bullet
+ jr _enemy_fires_again ;find and fire another bullet
bullettriple: ;type #7 = triple
ld (hl),1 ;type #1 = normal
cal enemy_fires_again
inc hl
ld c,5 ;type #5 = up 50%
- jr enemy_fires_again
+ jr _enemy_fires_again
bulletaiming: ;type #6 = aiming = type#2..5
ld a,(y)
jr z,movetype_right ;11 = (.5>)
dec b
jr z,movetype_fright ;12 = (1>)
+ dec b
+ ret z ;13 = (0)
movetype_right:
rra
ld (levelp),hl ;set the level-pointer
ret ;and return
-;--------------------------- SFX --------------------------------------------
DoSFX: ;in:(curline)=beginLine;b=nrOfLines
-SFXloop:
+ jr sfxlaser
+ ld hl,dispbuffer
+ ld b,64
+sfxscrollloop:
+ psh bc
+ psh hl
+ ld de,VIDEO_MEM
+ ld hl,VIDEO_MEM+16
+ ld bc,63*16
+ ldir
+ pop hl
+ ld bc,16
+ ldir
+ ld b,16
+sfxscrolldelay:
+ halt ;delay
+ dnz sfxscrolldelay ;8x
+ pop bc
+ dnz sfxscrollloop
+ ret
+
+
+sfxlaser:
psh bc
ld a,0 ;get line number
ld hl,dispbuffer ;source of original
add hl,bc ;hl->source
-SFXdisp: ;display this frame on screen
+sfxlaserdisp: ;display this frame on screen
ld bc,16 ;one line (=16 bytes, you'd know by now)
ldir ;display (copy actually)
ld bc,-16 ;go up one line (not on screen)
add hl,bc ;so the same line will be displayed
dec a ;counter
- jr nz,SFXdisp ;repeat until whole screen is displayed
+ jr nz,sfxlaserdisp ;repeat until whole screen is displayed
ld b,8
-SFXdelay:
+sfxlaserdelay:
halt ;delay
- dnz SFXdelay ;8x
+ dnz sfxlaserdelay ;8x
pop bc ;counter
- dnz SFXloop
+ dnz sfxlaser
ret
;--------------------------- proc -------------------------------------------
+random14: ;random 1..1+4
+ ld c,1
+ ld b,4
+; cal Random
Random: ;a=c<random<b+c; destr:none
psh hl
ld hl,rancount ;amount to increase with (0-255)
pop af
ret
-New_game: ;stack must be +1 (so change the jp in cal :)
+New_game: ;start a new game (SP=+0)
cal _clrLCD
ld a,VIDEO_MEM/$400
ld (PutWhere),a ;will be reset after displaying iconbar
selectship:
psh bc
cal invship
-selectshiploop:
cal getsomekeys
pop bc
jr z,startthenewgame ;enter/2nd
+ cp K_EXIT
+ jp z,menuexit ;go game over when exit was pressed
psh bc
- cal invship
+ cal invship ;display selection bar on current ship
pop bc
- cp K_DOWN
+ cp K_DOWN ;down pressed?
jr nz,selnotdown
inc b ;move selection down
selnotdown:
- cp K_UP
+ cp K_UP ;up pressed?
jr nz,selnotup
dec b ;move selection up
selnotup:
ld (pickuptimer),a ;next pickup after 4 enemies destroyed
You_die: ;stack must be +1
- pop hl ;restore stack
ld a,24
ld (your_armor),a ;24 HPs/shields
ld a,(your_lives) ;load lives left
.db %01111100 ; █████
.db %00111000 ; ███
spr_multiple2:
+spr_lashit:
.db 7,7 ;multiples
.db %00111000 ; ███
.db %01111100 ; █████
;-------------------------------- explosions --------------------------------
+;spr_lashit: ;the same as spr_multiple2
+; .db 7,7
+; .db %00111000 ; ███
+; .db %01111100 ; █████
+; .db %11111110 ; ███████
+; .db %11111110 ;▒▒▒███████
+; .db %11111110 ; ███████
+; .db %01111100 ; █████
+; .db %00111000 ; ███
+
spr_hit:
hitsprites = 5 ;btw: sprites stored backwards
.db 5,4 ;5
.db %00000000
.db 8,5 ;2
+ .db %00000000
+ .db %00010100 ; █ █
+ .db %00111010 ; ███ █
+ .db %01110110 ; ███ ██
+ .db %00011000 ; ██
+ .db %00000000
+
+ .db 8,5 ;3
+ .db %00000000
+ .db %00101100 ; █ ██
+ .db %01100110 ; ██ ██
+ .db %01001011 ; █ █ ██
+ .db %00111100 ; ████
+ .db %00000000
+
+ .db 8,5 ;4
.db %00111000 ; ███
.db %01011100 ; █ ███
.db %10010111 ;█ █ ███
.db %00111000 ; ███
.db %00000000
- .db 8,6 ;3
+ .db 8,6 ;5
.db %00111100 ; ████
.db %01001111 ; █ ████
.db %10100011 ;█ █ ██
.db %01110101 ; ███ █ █
.db %00111000 ; ███
- .db 8,6 ;4
+ .db 8,6 ;6
+ .db %00101110 ; █ ███
+ .db %10000011 ;█ ██
+ .db %01000101 ; █ █ █
+ .db %10100011 ;█ █ ██
+ .db %01000110 ; █ ██
+ .db %00110000 ; ██
+
+ .db 8,6 ;7
.db %00110110 ; ██ ██
.db %00000101 ; █ █
- .db %11000001 ;██ █
+ .db %10001001 ;█ █ █
.db %01100001 ; ██ █
.db %11000010 ;██ █
.db %01010001 ; █ █ █
+ .db 8,6 ;8
+ .db %00000110 ; ██
+ .db %00100001 ; █ █
+ .db %10000000 ;█
+ .db %01000010 ; █ █
+ .db %01000000 ; █
+ .db %00010100 ; █ █
+
;--------------------------------- bullets ----------------------------------
bullettable:
; 111=laser (speed=duration 00010-00000)
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
+ .db 2,1,%00110010,3,%00000000,0,%00000000,0 ;1 single (1x2+1) 2
+ .db 3,1,%00110011,3,%00000000,0,%00000000,0 ;2 fast (1x3+1) 3
+ .db 2,1,%00110010,0,%00110010,6,%00000000,0 ;3 double (2x2+1) 4
+ .db 2,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple (3x2+1) 6
+ .db 3,2,%00110011,2,%10010010,2,%01110010,2 ;5 (3x3+2) 9
+ .db 4,2,%01110011,2,%10010011,2,%00110011,2 ;6 (3x4+2) 12
+ .db 5,3,%01110100,2,%10010100,2,%00110100,2 ;7 (3x5+3) 15
+ .db 7,4,%01110101,2,%10010101,2,%00110101,2 ;8 (3x7+4) 21
+ .db 9,6,%01110110,2,%10010110,2,%00110110,2 ;9 (3x9+6) 27
maxweapon = 9
- .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)
+ .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single (1x1x3) 3
+ .db 2,3,%11100011,3,%00000000,0,%00000000,0 ;2 short (2x1x2) 4
+ .db 1,2,%11100100,3,%11100000,4,%00000000,0 ;3 fat (1x2x3) 6
+ .db 1,2,%11100101,0,%11100000,6,%00000000,0 ;4 double (1x2x4) 8
+ .db 4,4,%11100011,3,%00000000,0,%00000000,0 ;5 short (4x1x2) 8
+ .db 1,2,%11100100,3,%11100000,6,%11100000,0 ;6 triple (1x3x3) 9
+ .db 1,3,%11101000,3,%11100000,6,%11100000,0 ;7 triple long(1x3x7) 21
+ .db 2,5,%11100101,2,%11100000,4,%00000000,0 ;8 double (2x2x4) 32
+ .db 1,9,%11101100,3,%11100000,2,%11100000,4 ;9 big fat lng(1x3xB) 33
maxlaser = 18
tailbeam = %00101101 ;180 degrees
doublebeam = %01010010 ;45 degrees
.db %00000001
.db %11111111
spr_icon00:
+ .db 15,7 ;unused .......:.......:
+ .db %10000000 ;█
+ .db %10111111 ;█ █████████████
+ .db %10101010 ;█ █ █ █ █ █ █ █
+ .db %10110101 ;█ ██ █ █ █ █ ██
+ .db %10101010 ;█ █ █ █ █ █ █ █
+ .db %10111111 ;█ █████████████
+ .db %10000000 ;█
+ .db 6
+ .db %00000000
+ .db %11111110
+ .db %10101010
+ .db %01010110
+ .db %10101010
+ .db %11111110
+; .db %00000000
+spr_icon00_:
.db 16,7 ;unused .......:.......:
.db %10101010 ;█ █ █ █ █ █ █ █
.db %11010101 ;██ █ █ █ █ █ █ █
.db %11100100
maxarmor = 63 ;maximum HPs you can get
spr_icon02a:
- .db 16,7 ;tailbeam.......:.......:
+ .db 16,6 ;tailbeam.......:.......:
.db %10000000 ;█ ▒
.db %10000011 ;█ ██ ▒
.db %10000001 ;█ ███ ▒
.db %10111011 ;█ ███ ███ ██ ██▒
.db %10000001 ;█ ███ ▒
.db %10000011 ;█ ██ ▒
- .db %10000000 ;█ ▒
+; .db %10000000 ;█ ▒
.db 5
.db %00000000
.db %00000000
.db %00000000
.db %00011110
spr_icon03:
+ .db 16,7 ;laser .......:.......:
+ .db %10000000 ;█ ▒
+ .db %10001010 ;█ █ █ ▒▒▒ ▒
+ .db %11101100 ;███ ██ ▒▒▒ ▒
+ .db %11110111 ;████ ███████▒▒▒█▒
+ .db %11101100 ;███ ██ ▒▒▒ ▒
+ .db %10001010 ;█ █ █ ▒▒▒ ▒
+ .db %10000000 ;█ ▒
+ .db 4
+ .db %00000000
+ .db %00000000
+ .db %00000000
+ .db %11111111
+spr_icon04:
.db 11,7 ;bullets .......:.......:
.db %10000000 ;█ ██ ▒
.db %10000011 ;█ █████ ▒▒▒ ▒
.db %11000000
.db %11100000
.db %11000000
-spr_icon04:
- .db 16,7 ;laser .......:.......:
- .db %10000000 ;█ ▒
- .db %10001010 ;█ █ █ ▒▒▒ ▒
- .db %11101100 ;███ ██ ▒▒▒ ▒
- .db %11110111 ;████ ███████▒▒▒█▒
- .db %11101100 ;███ ██ ▒▒▒ ▒
- .db %10001010 ;█ █ █ ▒▒▒ ▒
- .db %10000000 ;█ ▒
- .db 4
- .db %00000000
- .db %00000000
- .db %00000000
- .db %11111111
spr_icon05:
.db 16,7 ;multiple.......:.......:
.db %10000011 ;█ ███ ▒
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.99 ",127," by Shiar",0 ;right behind txt_email
+txt_about: .db "v1.0.A23 ",127," by Shiar",0 ;right behind txt_email
_txt_about = $3321
txt_menu1: .db "NEW GAME",0
txt_menu2: .db "CONTINUE",0
storehi_start:
hiscore .dw 0 ;default hiscore
-hiname .db "shiar.99",0 ; " " name
+hiname .db "by shiar",0 ; " " name
storehi_end:
invertmode: cpl ;/or a ;saves B<>W mode setting cpl
your_shield .db 0 ;invincibility left 0
your_armor .db 24 ;HP left 24
your_lives .db 3 ;lives left 3
-your_weapon .db 17 ;current weapon upgrade 0
+your_weapon .db 9 ;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
.db 0 ;storyline ID
levelstart: ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
- .db 25,33,"Imperial ships have",0,0
- .db 31,9,"been sent to intercept you",0,31-25+6,-1
+ .db 1,33,"Imperial ships have",0,0
+ .db 7,9,"been sent to intercept you",0,0 ;,7-1+6,-1
+ .db 41,33,"Note STORYLINE and LEVELS",0,0
+ .db 48,38,"---- AINT DONE YET! ----",0,48-1+6,-1
.db 30
level00:.db 5,3,5,3,2,2
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
+ .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
+ .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
;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
+ .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving
+ .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,09, 0, 0,1 ;mid+lure
+boss1enemy = 28
+boss2enemy = 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
+ .db 9,%11011011,spr_boss0E &255,spr_boss0E /256,119,00,13,12,13,13
spr_enemy00:
spr_enemyP1:
.db %10100000
.db %11111000
.db %10000000
+spr_boss0E:
+ .db 8,51 ;.......:.......:
+ .db %00111011 ; ████ ██
+ .db %01100110 ;█ ██
+ .db %01110011 ; ██
+ .db %00111011 ; ███ ██
+ .db %01000111 ; ███
+ .db %10101100 ; ██
+ .db %01110111 ; ██ ███
+ .db %00111011 ; ████ ██
+ .db %01100100 ;███ █
+ .db %01000001 ; ████
+ .db %01100100 ;███ █
+ .db %01111011 ; ████ ██
+ .db %01110111 ; ██ ███
+ .db %01001100 ; ██
+ .db %00100111 ; ███
+ .db %00111011 ; ███ ██
+ .db %01000011 ; ██
+ .db %10010110 ;█ ██
+ .db %01111011 ; ████ ██
+ .db %00110101 ; █
+ .db %00001011 ; ██
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000000 ;
+ .db %00000011 ; ██
+ .db %00001101 ; █
+ .db %01111011 ; ████ ██
+ .db %11000110 ;█ ██
+ .db %01000011 ; ██
+ .db %01111011 ; ███ ██
+ .db %00100111 ; ███
+ .db %01011100 ; ██
+ .db %00110111 ; ██ ███
+ .db %01111011 ; ████ ██
+ .db %11100100 ;███ █
+ .db %00000001 ; ████
+ .db %11100100 ;███ █
+ .db %01111011 ; ████ ██
+ .db %00110111 ; ██ ███
+ .db %00101100 ; ██
+ .db %01000111 ; ███
+ .db %00111011 ; ███ ██
+ .db %01001011 ; ██
+ .db %10000110 ;█ ██
+ .db %01111011 ; ████ ██
+ .db %00001101 ; ████
;----------------------------------------------------------------------------
;----------------------------- logo ------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
-; 0.98.77 -- 7.VII.00 -- size 6707
-;
-; # bullets do damage in all levels
-; * more armor at armor-upgrade and extra armor at end of a level
-; - internal levels again (no need 4 external, safer/smaller)
-; # some registers not correctly pushed/popped
-; * several optimizations (init.procs some bytes smaller)
-; # enemies hit with hitpoints left disappeared (one pop too much...)
-; + bullets "charge up" (more damage) when not firing
-; - removed contrast changes
-; + more powerful bullets have different sprites (larger=more damage)
-; # multiples appear at your position (begin level/just selected)
-; # when invulnerable multiples acted weird
-; # no more error at activation after APD off after running Nemesis
-; # saves correctly if own name ain't "nemesis" + some bytes smaller
-; # screen wasn't always entirely cleared after quit
-; * waits until all keys have been released after death
-; + different bullets sizes will miss if they're too small
-; + at level start "press F1 to save"-text will be displayed
-; * w3.shiar.org displayed at title screen, black bar behind version nr
-; # score to 0 when exit pressed at main menu
-; # no residual story-text in first frame of game
-; # game doesn't continue again after death (stack messed up)
-; # game over when lives<0 (didn't work in v0.96+)
-; * using some self-modifiing code (so it's smaller)
-; # new random procedure: stars don't appear on one line anymore
-; * weapons appear centered at multiples
-; * laser properties can be changed (damage, charge)
-; + weapon can be combination of bullets/lasers (max. of 3 per weapon)
-; * bullet-icon is removed when laser is selected
-; * enemy sprite table integrated in enemy specs (-1 byte/enemy)
-; + random enemy is chosen from any number of enemies per level
-; * time to first enemy fire defined per enemy, not per level
-; + CLIPPED sprites!! no more in/out popping enemies! wow...
-; * bullets/enemies removed when _entirely_ off screen
-; # enemies would sometimes be hit by bullets going right below them
-; # size of the second bullet was too big (invisible hit)
-; * the frequency an enemy fires bullets is defined per enemy
-; + wide clipped sprites implemented (width 1-16 pixels)
-; # bosses first move left until x=100, otherwise they'd be off-screen
-; * at status bar left below ships are displayed for lives left
-; * armor bar is two pixels high (better visible)
-; # bullet overflow fixed again (>63 bullets fired)
-; # correct weapon loaded when continuing a saved game
-; # game freezed when generating a random value <=1
-; * you explode in a different way than the enemies
-; + screen inverts for a brief time when you are hit!
-; # stats-bar was messed up when ya got 0 lives left
-; * two new (big) bosses modeled after a common MSX Nemesis2-boss
-; * score increased once every 32 frames (instead of every 256)
-; # ground fixed for new random routine (smaller routine; incs -2 to 2)
-; + laser will upgrade as well when you reselect it
-; * 2nd can be used in main menu (wow!)
-; # altered variable storage space because of Nemesis grew beyond 6kb
-; # fixed armor bar display when at maximum
-; + a few new enemies (asteroids) and remade 1st 4 levels; new pickup
-; - torpedo since it was kinda useless
-; + second icon now selects TAIL BEAM: bullet going backwards
-; # armor increase at the end of a level doesn't overflow armorbar
-; + you can choose your own ship out of four vessel after NEW GAME!
-; + enemies can appear at any x-position and move both left and right
-; + move patterns given per enemy, not per level
-; * new (faster) enemy-move system; 10 basic moves (x2 left+right)
-; # enemies can _never_ move above or below visible screen
-; * "randomY"-enemies are placed entirely on screen (height calced)
-; # the major TI-OS crash bug WAS afterall caused by sprites drawn
-; (partially) outside screen memory. temporarily fixed by setting
-; virtual screen buffer to $8200 (enough mem there)
-; + upto 29 cool enemy sprites and redone first five levels
-; * improved enemy-move routine; smooth luring, five speeds+backwards
-; # after pause weapon will not be fired
-; # teacher key fixed (waits for GRAPH to be release before&after)
-;
; 0.99.99 -- 9.IX.00 -- size 6936
;
; + you can have upto FOUR multiples! (~20 pixels apart)
; * 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
+; 1.00.A23 -- 23.X.00 -- size 7212
;
-; + ...
+; * armor-bar background, empty upgrades sprites changed
+; + shows sprite when laser hits an enemy (his "shield"?)
+; + exit-key also quits out of ship selection screen
+; # fixed direct-quit on death bug (bug since recent optimization)
+; * armor-bar background changed (more elegant and smaller code)
+; # "flash" when end-boss spawns mine fixed
+; + enemy's y start position can be specified per enemy
+; * first icon is now laser, second one's bullets
+; + when bullets selected, upgrade icons won't appear half the time
+; # remainder pixels in armor bar (appeared after heavy damage) removed
+; + your ship's explosion is now also 8 frames (half enemy expl. speed)
;
;
; + added - removed * changed # bug fixed