;----------------------------------------------------------------------------
;---------------------- NEMESIS ---------------------------------------------
-;----------------------------------------------------------------------------
+;----------------------------------------------- cool arcade-shoot-em-up-game
;by SHIAR | shiar0@hotmail.com | icq#43840958 | www.shiar.org
-;Description : cool arcade-shoot-em-up-game
-;Other games by author : Worm
;This source should only be used for learning practises, do not
;alter it, and certainly never distribute an altered version!!
;&&& marks uncertainties or things to optimize
+;TO DO:
+; up-double | torpedoes | levels 7-12 | jp m | better weapons
+
;---------------------- nemesis.z80 start -----------------------------------
#include "asm86.h"
;^-----------------------------------<1 ;-120=$78
enemies = storepos2 ; +0 ;info about each enemy
-enemysize = 9 ;infobytes per enemy
+enemysize = 10 ;infobytes per enemy
nrenemies = 16 ;max. nr of enemies
ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y)
-nrybuls = 64 ; +80\
+nrybuls = 128 ; +80\
ebullets = ybullets+(nrybuls*4) ;+110 ;30 bytes = 10(state,x,y)
-nrebuls = 16
+nrebuls = 48
lvlenemies = ebullets+(nrebuls*3)
;^-----------------------------------<2 ;-141=$8D
; [0000:damage 0:diagfire 0:ground 0:ceiling 0:-]
;enemies:
; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)]
-; [ship type or explosion frame] [x] [y] [movetype] [movecounter] [firecounter] [firefreq]
+; [ship type 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.810 by SHIAR",0
+Title: .db "Nemesis v0.99.812 by SHIAR",0
Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes
.db %11100000 ; ███
.db %01111000 ; ████
.db %11100000 ; ███ ;recommend 80x50 screen mode
.db 0 ;YAS 0.92 compatibility
-;43
+
;---------------------- init ------------------------------------------------
int_handler: ;new interrupt proc
ld a,$D4
ld bc,$0100
ld h,a
- ld l,c ;ld hl,$D400
+ ld l,c ;ld hl,$D400 (user silent link routine space)
ld d,a
ld e,b ;ld de,$D401
dec a ;ld a,$D3
ld (hl),a
- ldir
+ ldir ;fill $D400-D500 with $D3s (slink/user on)
ld hl,int_handler ;new interrupt handler
ld d,a
ld e,a ;ld de,$D3D3
ld bc,int_end-int_handler
- ldir
+ ldir ;load new handler at ($D3D3)
inc a ;ld a,$D4
ld i,a
im 2
jr z,start_tha_freakin_game
cp K_EXIT
jr z,menuexit
- cp K_F1
- cal z,do_invert
cp K_UP
jr z,menuchange
cp K_DOWN
ld (your_score),hl ;(prevents hiscore while never played)
jp game_over ;and go to game over screen
-do_invert: ;invert screen (b<>w); destr:b
+do_invert: ;invert screen (b<>w)
psh hl
- ld b,a ;psh a
+ psh af ;can't destroy b
ld hl,_invert
ld a,$98
xor (hl) ;$2F (cpl) <-> $B7 (or a)
ld (hl),a
- ld a,b ;pop a
+ pop af
pop hl
ret
jp z,game_over ;<exit> pressed, so be it
check_morekey: ;another unused label... poor compiler
bit 7,a ;test bit 7 = more-key = PAUSE
+ psh af
cal z,Pause ;yes, go to pause
+ pop af
check_firekey:
bit 5,a ;test bit 5 = 2nd-key = FIRE
pop hl ;no cal to Fire_bullet made, so pop stack
ld hl,just_fired ;no:
ld (hl),5 ;able to fire (five turns = laser duration)
+laserdur =$-1 ;SMC laser duration
check_selkey:
ld a,%01011111 ;look at first column of keys (ALPHA to STO)
neg
cp (hl)
ret nc
- ld b,5
+ ld b,auch_ground
jp damage_you
;--------------------------- ceiling ----------------------------------------
inc a
cp (hl) ;compare with ceiling
ret nc ;carry if ceiling is above you
- ld b,5
+ ld b,auch_ground
jp damage_you ;otherwise you don't wanna be in that ship
;--------------------------- move stars -------------------------------------
;--------------------------- pause ------------------------------------------
Pause:
- psh af
- ld hl,$0200 ;top left
+ ld hl,_txt_pause
+ ld (_penCol),hl
+ ld hl,txt_pause
+ cal _vputs ;display small font
+ ld hl,_txt_pressenter ;top centered
ld (_curRow),hl
ld hl,txt_pressenter ;"Enter to continue"
cal _puts ;display message
pause:
- cal _getkey ;enter low-power mode and wait for key
- cp kEnter ;keypressed = enter?
- jr nz,pause ;no, wait some more
- pop af
- ret ;continue
+ 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)
+ ld hl,CONTRAST ;contrast setting (0-31)
+ ld b,(hl) ;load contrast into b
+ cp K_UP ;+ key changes contrast up
+ jr nz,contr_not_up
+ inc b ;increase contrast
+ jr setcontrast ;set
+contr_not_up:
+ cp K_DOWN ;- key
+ jr nz,pause ;nope: loop
+ dec b ;decrease contrast
+setcontrast:
+ ld a,b
+ ld (hl),a
+ out (2),a ;and set it
+ cal releasekeys
+ jr pause ;and loop
;--------------------------- teacher ----------------------------------------
handle_multiples:
ld a,(your_multiples) ;do you have multiples
ld b,a ;save a for 2nd check
- and %111 ;no? (last two bits = nr of multiples)
+ and %1111 ;no? (last four bits = nr of multiples)
ret z ;then don't handle them either
bit 7,b ;move the multiples??? (=move bit set?)
jr z,mult_adv ;nope, just let them (saves (y)in y, (x)in x)
ld (hl),e ;y-pos
mult_adv:
- ld hl,your_prevpos+16 ;first pos.
+ ld ix,spr_multiple ;normal sprite
+ ld hl,timer
+ bit 3,(hl) ;change sprites every 8 turns
+ jr z,disp_multiples
+ ld ix,spr_multiple2 ;second sprite
disp_multiples:
+ ld hl,your_prevpos+16 ;first pos.
+dispmultiplesloop:
psh af
psh hl
ld d,(hl) ;load coords
inc hl
ld e,(hl)
- ld ix,spr_multiple ;sprite
+ psh ix
cal putsprite ;display
+ pop ix ;same sprite next time ;)
pop hl
ld de,14
add hl,de ;next multiple
pop af ;counter
dec a
ret z ;return if all done
- jr disp_multiples ;loop
+ jr dispmultiplesloop ;loop
;----explode----
dothadamage:
ld hl,time2invert
xor a ;a=0
- cp (hl) ;no already inverted?
+ cp (hl) ;not already inverted?
cal z,do_invert ;then invert screen
- ld a,2
- ld (hl),a ;change back 2 frames from now
+ ld (hl),2 ;change back 2 frames from now
ld hl,your_armor ;armor left
ld a,(hl) ;load hp in A
sub b ;decrease hp by B
- jp m,no_armor ;<0hp left so explode
- ld (hl),a ;no, so save decreased hp
- jp disp_armor ;and display new value
-no_armor:
+ jr nc,newarmor ;>=0hp left so don't explode
ld a,%01 ;occ %xxxxxx01 = explode
ld (your_occ),a ;too bad, you're dead meat
- ret
+newarmor:
+ ld (hl),a ;save decreased hp
+ jp disp_armor ;and display new value
;------------------------- place multiples ----------------------------------
select1:
ld (hl),a ;reset pickups
cal inc_armor
- jp disp_icons ;display and return
+ jr disp_icons ;display and return
select2:
dec a ;is it 2?
jr nz,select3 ;no, carry on
ld (hl),a ;reset pickups
inc a ;a=1
ld (your_tail),a ;ready tail beam
- jp disp_icons ;display 'n return
+ jr disp_icons ;display 'n return
select3:
dec a ;is it 3?
jr nz,select4 ;no, carry on
ld a,(hl)
inc a
cp maxweapon
- jp nc,disp_icons ;weapon maxed out
+ jr nc,disp_icons ;weapon maxed out
ld (hl),a ;set new weapon
cal loadweapon ;load it (damage and stuff)
- jp disp_icons ;display n return
+ jr disp_icons ;display n return
select4:
dec a ;is it 4?
jr nz,select5 ;no, carry on again
upgradelaser:
inc a ;next laser
cp maxlaser
- jp nc,disp_icons ;laser maxed out
+ jr nc,disp_icons ;laser maxed out
ld (hl),a
cal loadweapon
- jp disp_icons ;display + return
+ jr disp_icons ;display + return
select5:
dec a ;is it 5?
jr nz,select6 ;no, carry on once more
ld (hl),a ;reset pickups
ld hl,your_multiples
ld a,(hl) ;multiples you already got
+ and %1111 ;reset movebit so (your_multiples)=real value
inc a ;one more
cp mm+1
jr nc,enoughmultiples ;maxed out
ld de,(x)
dec a ;if this is your first multiple then...
cal z,Place_multiples ;reset multiples positions
- jp disp_icons ;display, return
+ jr disp_icons ;display, return
select6:
ld (hl),0 ;reset pickups
- jp disp_icons ;display/return
+; jr disp_icons
+
+;--------------------------- show icon --------------------------------------
+
+disp_icons:
+ psh bc \ psh de \ psh hl \ psh ix ;&&&
+
+ 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
+
+ ld b,16*7 ;draw 16x (screen width) 7x (height)
+ xor a ;blank line mask
+ cal drawline ;clear scorebar
+
+disp_lives:
+ ld de,5 ;(0,5)
+ ld a,(your_lives) ;nr of lives
+ or a
+ jr z,displivesdone ;no lives
+ ld b,a
+displivesloop:
+ psh bc
+ ld ix,spr_lship
+ cal safeputsprite ;put li'l ship
+ ld a,lshipsize+1
+ add a,d
+ ld d,a ;x=x+5
+ pop bc
+ dnz displivesloop ;one ship per life
+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_weapon) ;ur weapon
+ cp maxweapon ;laser?
+ psh af ;(your_weapon)
+ jr nc,no_tail ;if laser (nc) then tail ain't fired
+ ld a,(your_tail)
+ or a
+ jr z,no_tail
+ ld ix,spr_icon02 ;tailbeamIcon
+no_tail:
+ ld de,$2901 ;icon #2
+ cal putwidesprite ;display
+
+ ld ix,spr_icon00
+ pop af ;a=(your_weapon); cf=bullets
+ psh af
+ 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
+no_bullets:
+ ld de,$3901 ;icon #3
+ cal putwidesprite ;display icon
+
+ ld ix,spr_icon00 ;emptyIcon
+ pop af ;ld a,(your_weapon)
+ ld b,a
+ jr c,no_laser ;popped carry
+ ld hl,$3955 ;position to display bullet-type digit
+ ld (_penCol),hl ;set location
+ ld a,b ;(your_weapon) ;load = faster than push
+ sub maxweapon-1 ;1 = laser #1 (=maxweapon)
+ add a,'0' ;make digit
+ cal _vputmap ;display char
+ ld ix,spr_icon04 ;laserIcon
+no_laser:
+ ld de,$4901 ;icon #4
+ cal putwidesprite
+
+ 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
+ cal putwidesprite
+
+ ld ix,spr_dividerline
+ ld de,$6901
+ cal putwidesprite
+
+ ld a,(your_pickup) ;pickups taken
+ add a,a ;picks*2 (sets z-flag)
+ jr z,iconsdone ;return if no pickups
+ 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)
+
+ ld ix,spr_icon
+ cal putwidesprite
+iconsdone:
+ ld hl,dispbuffer ;normal game-screen
+ ld (PutWhere),hl ;set sprite-position to normal screen
+
+ 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
+ and %111 ;display last bits of armor
+ ret z ;if armor=0 then bit = %00000000 (don't disp)
+ 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
+ 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)
+ ret
;------------------------- fire bullet --------------------------------------
fire_multiple:
psh af
- dec h ;one up (-2 height: keeps weapons centered)
psh ix ;save ix for next fire
cal fireany ;fire from multiple position
pop ix ;saving ix is much faster than recalculating
add ix,bc ;ix=weapon ptr
ld a,(your_multiples) ;any multiples?
- and %111 ;nr. of multiples
+ and %1111 ;nr. of multiples
cal nz,fire_multiples ;if >0 then fire them too
ld hl,(x) ;fire from ship position (x)
fireany: ;HL=(x,y)
fire_weapon:
psh bc ;save counter
ld a,(ix) ;load this weapon
- cp %11100000 ;%11110000=laser
- cal z,fire_laser ;fire laser (will set a=0 when done)
- or a ;<>0=bullet
- cal nz,fire_ybullet
- inc ix
+ ld c,a ;save bulletType in c
+ and %11100000 ;%111?????=laser
+ cp %11100000 ;is it?
+ cal z,fire_laser ;fire laser (will set c=0 when done)
+ xor a ;<>0=bullet
+ cp c ;c<>0?
+ cal nz,fire_ybullet ;then fire bullet
+ inc ix ;otherwise fire next weapon
inc ix
pop bc ;weapon counter (do 3 weapons)
dnz fire_weapon
;-----fire BULLETs-----
fire_ybullet: ;fire bullet type=C dam=(curweapdamage) at (firex/y)
- ld c,a ;save bulletType in c
ld hl,ybullets ;check for unused bullet
ld de,4
ld b,nrybuls
inc hl
ld a,(hl) ;check x
sub d
- jp m,nolashit ;no hit when enemy is left of you
+ jr c,nolashit ;no hit when enemy is left of you
inc hl
ld a,(hl) ;check y
sub e
add hl,bc ;go to next enemy
ld b,a ;pop bc
dnz laserhits ;check all enemies
- xor a ;a=0 otherwise weird things might happen :P
+ xor a
ld (weapincs),a ;reset damage
pop ix
+ ld c,a ;c=0
ret
;------------------------ handle bullets ------------------------------------
inc hl ;goto occ again
ld (hl),%01 ;set to explode
+
ld a,(pickuptimer) ;counts enemies destroyed
dec a ;enough destroyed for a pickup?
+ psh af ;save flags and a=0
jr nz,pickupdone ;otherwise just explode
- ld (hl),%110 ;change it into a pickup (with 2 HP)
ld a,18 ;reset enemies counter (18 hits = next)
pickupdone:
ld (pickuptimer),a ;save new enemiescounter value
- inc hl
- ld (hl),$00 ;explosionFrame 0
+ inc hl ;@type
+ ld (hl),0 ;explosionFrame 0 or enemy #0=pickup
+ pop af
+ cal z,place_enemy ;place pickup (enemy#=0=a cuz ZF)
ld hl,1 ;increase score by one
jp scoreInc ;+ret
dec a ;has it reached 2?
jr z,place_boss ;yep: place the BigBossTM!
dec a ;has it reached 3?
- jr nz,do_event ;nope: >3 = place an enemy
+ jr nz,place_ranenemy ;nope: >3 = place an enemy
inc hl ;nextevent located behind eventleft
ld (hl),123 ;set delay
ret ;don't place any more enemies
ld b,nrenemies
ld hl,enemies+1-enemysize
ld de,enemysize
+ xor a
chk_enemyleft:
add hl,de
- ld a,(hl)
- or a ;0 = no enemy present
+ cp (hl) ;0 = no enemy present
jr nz,enemyleft
dnz chk_enemyleft
ret
ret
+place_ranenemy:
+ ld bc,0 ;0..nrlvlenemies
+nrlvlenemies =$-1 ;=nr of enemies minus 1
+ cal Random ;random enemy b..b+c = 0..nrenemies-1
+ ld b,0
+ ld c,a ;bc=a
+ ld hl,lvlenemies
+ add hl,bc ;go to a random enemy
+ ld a,(hl) ;load enemy nr of this mysterious random enemy
+ jr place_enemy
+
place_boss:
- ld a,1
- ld (nrlvlenemies),a ;just one enemy: the BOSS
ld hl,(levelp) ;the leveldata (including the boss)
dec hl ;points to leveldata\boss\enemynr
- ld a,(hl) ;load it
- ld (lvlenemies),a ;set new enemy (boss)
+ ld a,(hl) ;load enemy# of boss
-do_event:
+place_enemy: ;places enemy #=a
+ psh af
ld hl,enemies+1-enemysize
ld bc,enemysize
xor a ;a=0
-chk_noenemy:
- add hl,bc
+chk_noenemy: ;find an unused (no) enemy
+ add hl,bc ;check next enemy
cp (hl) ;(hl) = 0 ??
jr nz,chk_noenemy ;jump if enemy present (non-0)
- ex de,hl ;de=hl=usable enemy
-
-place_enemy: ;de = enemy+1
- ld bc,0 ;0..nrlvlenemies
-nrlvlenemies =$-1 ;=nr of enemies minus 1
- cal Random ;random enemy b..b+c = 0..nrenemies-1
- ld b,0
- ld c,a ;bc=a
- ld hl,lvlenemies
- add hl,bc ;go to a random enemy
- ld a,(hl) ;load enemy nr of this mysterious random enemy
+ ex de,hl ;de=hl=usable enemy +1
+ pop af ;enemy# to place
cal findenemyspecs ;hl = enemy #a specs
dec de ;goto hp64 (before occ)
inc de ;@firecounter
ldi ;set time-to-1st-fire
ldi ;set firefreq
+ ldi ; " firetype
ret ;return
;--------------------------- enemy fires ------------------------------------
-Enemy_fires: ;de = x,y
+Enemy_fires: ;de = x,y; c = type
+ ld hl,ebullets ;first bullet to check
+ ld b,nrebuls
dec d
dec d ;d = x-2
inc e ;e = y+1
-
- ld b,nrebuls
- ld hl,ebullets
+enemy_fires_again: ;same but hl = first bullet possibly free
xor a
find_ebullet:
cp (hl)
ret
found_ebullet:
- ld b,1 ;default normal bullet
- ld a,(level_info)
- and %00001000
- jr z,bulletok
+ ld a,c
+ sub 6
+ jr 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
+bulletdouble:
+ dec e ;one up
+ ld c,1 ;type #1
+ cal enemy_fires_again ;fire bullet
+ inc hl ;next bullet position
+ inc e
+ inc e ;one down
+ jr bulletok ;fire another bullet
+
+bullettriple:
+ ld c,1 ;type #1 = normal
+ cal enemy_fires_again ;fire
+ inc hl ;next bullet
+ ld c,4 ;type #4 = down 50%
+ cal enemy_fires_again
+ inc hl
+ ld c,5 ;type #5 = up 50%
+ jr bulletok
+
+bulletaiming:
ld a,(y)
sub e
add a,10
jp p,bulletnotup
- ld b,5 ;yourY-bulY = negative (=bullet below you)
+ ld c,5 ;yourY-bulY = negative (=bullet below you)
add a,10
jp p,bulletnotup
- ld b,3 ;yourY-bulY = even more negative (going up)
-
+ ld c,3 ;yourY-bulY = even more negative (going up)
bulletnotup:
sub 20
- jp m,bulletok
- ld b,4 ;bullet going down
+ jr c,bulletok
+ ld c,4 ;bullet going down (=jp m)
sub 10
- jp m,bulletok ;even more going down
- ld b,2
+ jr c,bulletok ;even more going down
+ ld c,2
bulletok:
- ld (hl),b ;set bullet direction
+ ld (hl),c ;set bullet direction
inc hl
ld (hl),d ;set x-pos
inc hl
;----------------------------- enemy bullets --------------------------------
Enemy_bullets:
- ld hl,ebullets
- ld b,nrebuls
+ ld hl,ebullets ;hl=bullet pointer
+ ld b,nrebuls ;number of bullets (or _possible_ bullets)
handle_bullet:
psh bc
psh hl
ld a,(hl) ;load bulletType in a
or a ;bullet present?
- jr nz,enemy_bullet ;non-0: handle bullet
-next_bullet:
- pop hl ;do not move the <pop hl>
- pop bc
- inc hl \ inc hl \ inc hl
- dnz handle_bullet
+ cal nz,enemy_bullet ;non-0: handle bullet
+ pop hl ;enemy_bullet could've added one or two to hl
+ pop bc ;bullet counter
+ inc hl \ inc hl \ inc hl ;next bullet (3 bytes per bullet)
+ dnz handle_bullet ;loop for each and every bullet
ret
enemy_bullet:
- ld b,a ;save type&%1111
- inc hl ;bullet x
- ld a,(hl) ;check if it has reached the left side of scrn
- bit 7,a ;x<0?
+ inc hl ;@x
+ ld d,(hl) ;check if it has reached the left side of scrn
+ bit 7,d ;x<0?
jr nz,remove_ebullet ;yes, remove bullet
- dec (hl) ;move one left
- dec (hl) ;and another one
- ld d,(hl) ;d=x
- inc hl ;@y
+ dec d ;move one pixel left
+ dec d ;and another one (that makes 2)
+ ld (hl),d ;save new x-coordinate in (HL) and D
+ inc hl ;@y (BTW: x >= -2)
+ ld e,(hl) ;e=y
- dec b
+ dec a
jr z,ebullet_common ;type 1: normal bullet
- dec b
+ dec a
jr z,ebullet_down ;type 2: moving down
- dec b
+ dec a
jr z,ebullet_up ;type 3: moving up
- ld a,(timer)
- rra ;half speed
+ ld b,a ;save bulletType
+ ld a,(timer) ;load timer
+ rra ;half speed (CF set every other turn)
jr c,ebullet_common ;if bit then normal bullet
dec b
jr z,ebullet_down ;type 4: moving down 50%
;type 5: moving up 50%
ebullet_up:
- ld a,(hl)
- dec a
- jp m,ebullet_common ;y<0
- ld (hl),a
+ dec e ;move up
+ jp m,ebullet_common ;y<top; don't save new value (so y=0)
+ ld (hl),e
jr ebullet_common
-
ebullet_down:
- ld a,(hl)
- inc a
- cp 58-3
- jr z,ebullet_common
- ld (hl),a
+ inc e ;move down
+ ld a,e ;a=y too
+ cp 58-3 ;y>bottom?
+ jr z,ebullet_common ;then keep it there
+ ld (hl),e ;otherwise save new y
ebullet_common:
- ld e,(hl) ;e=y
ld ix,spr_bullete1 ;display enemy bullet
+ psh hl
cal putsprite
+ pop hl ;we'll need it again
ebullet_hits:
ld a,(your_occ)
or a
- jr nz,next_bullet ;0 = you're normal
+ ret nz ;0 = you're normal
- pop hl
- psh hl
- inc hl ;check x
- ld a,(x)
+ ld a,(y) ;check y collision
sub (hl)
add a,6
- jp m,next_bullet
+ ret m
cp 9
- jr nc,next_bullet
+ ret nc
- inc hl ;check y
- ld a,(y)
+ dec hl ;check x
+ ld a,(x)
sub (hl)
add a,6
- jp m,next_bullet
+ ret m
cp 9
- jr nc,next_bullet
+ ret nc
- pop hl ;points to bullettype again
- psh hl ;and save it again (ivm call to damage_you)
- ld a,(hl) ;load bullettype
- cal _shracc ;isolate damage-bits (%1111???? -> %00001111)
- ld b,a ;set damage-amount
+ ld b,auch_bullet ;set damage-amount
+ psh hl
cal damage_you ;HIT!!
+ pop hl ;save hl to remove the bullet
remove_ebullet:
- pop hl ;hl destroyed by damage_you
+ dec hl ;points to bullettype again
ld (hl),0 ;bullet > unused
- jr next_bullet+1 ;next bullet (SKIP THE <POP HL> = one byte)
+ ret
;--------------------------- handle enemies ---------------------------------
dec hl ;@x
ld a,d ;new x value
- cp 128 ;x<128
+ cp 129 ;x<=128
jr c,enemyonscreenX ;=on screen
cp -7 ;x<=-8
jr c,remove_enemy ;=off screen
ld a,c ;a = enemy type
or a ;type 0? (pickup)
jr nz,check_enemyfire ;no, a normal enemy; let em fire
- ld a,(timer) ;load time
- and %1 ;move left once every 2 turns
- jr z,firing_done ;don't move now
- inc d ;increase x-position (don't move this turn)
- inc (hl) ;and save it
jr firing_done ;continue
check_enemyfire:
inc hl ;@firefreq
ld a,(hl)
+ inc hl ;@firetype
+ ld c,(hl) ;in c
dec hl
+ dec hl ;@firecount again
ld (hl),a ;reset counter for next blast
psh de ;save registers for firing-use
cal Enemy_fires ;fires bullet
ret c
inc d ;don't move
ret
+
movetype_vslow:
and %11
ret z
ld hl,enemies+1
ld b,nrenemies ;check all 20 enemies
check_collision:
- psh hl
+ psh bc ;counter
+ psh hl ;pointer
ld a,(hl)
- and %00000010
- jr z,check_next ;2 or 3 = ok
- inc hl
+ and %00000010 ;enemy status
+ jr z,check_next ;2 or 3 = ok, otherwise: next enemy
+ inc hl ;enemy#
collide_enemy: ;&&& include in Handle_enemy proc
cal find_sprite
- inc hl
+ inc hl ;@x
ld a,(hl) ;check x match
sub e ;enemy position minus yours minus 7
jp p,check_next
inc hl
ld a,(hl) ;check y match
sub d ;same as with x-check
- jp p,check_next
+ jr nc,check_next ;(=jp p)
add a,6
add a,(ix+1) ;enemy height
jp m,check_next
ld (hl),a ;remove
jr check_next ;all done, next..
-destroy_enemy:
- ld (hl),%01 ;set to explode
- inc hl
- ld (hl),0 ;explosionFrame 0
- jr collide_done
-
collide:
dec hl
ld a,(hl)
- and %11111100
- jr z,destroy_enemy
- ld a,(hl)
- sub collidedamage
+ sub auch_ecollide
ld (hl),a
-collide_done:
- ld b,collidedamage ;damage
+ jr nc,enemydamaged ;enemy still ok (HP>=0)
+ ld (hl),%01 ;set to explode
+ inc hl
+ ld (hl),0 ;explosionFrame 0
+enemydamaged: ;damage to enemy delivered
+ ld b,auch_collide ;your damage
cal damage_you
check_next:
pop hl
- ld a,b ;psh bc
ld bc,enemysize
add hl,bc
- ld b,a ;pop bc
+ pop bc
dnz check_collision
ret
dnz SFXloop
ret
-;--------------------------- show icon --------------------------------------
-
-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_icons:
- psh bc \ psh de \ psh hl \ psh ix ;&&&
-
- 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
-
- ld b,16*7 ;draw 16x (screen width) 7x (height)
- xor a ;blank line mask
- cal drawline ;clear scorebar
-
-disp_lives:
- ld de,5 ;(0,5)
- ld a,(your_lives) ;nr of lives
- or a
- jr z,displivesdone ;no lives
- ld b,a
-displivesloop:
- psh bc
- ld ix,spr_lship
- cal safeputsprite ;put li'l ship
- ld a,lshipsize+1
- add a,d
- ld d,a ;x=x+5
- pop bc
- dnz displivesloop ;one ship per life
-displivesdone:
-
- ld ix,spr_icon01 ;armorIcon
- ld de,$1901 ;icon #1
- cal putwidesprite ;display icon
- cal disp_armor ;display bar
-
- ld ix,spr_icon00
- ld a,(your_weapon) ;ur weapon
- cp maxweapon ;laser?
- psh af ;(your_weapon)
- jr nc,no_tail ;if laser (nc) then tail ain't fired
- ld a,(your_tail)
- or a
- jr z,no_tail
- ld ix,spr_icon02 ;tailbeamIcon
-no_tail:
- ld de,$2901 ;icon #2
- cal putwidesprite ;display
-
- ld ix,spr_icon00
- pop af ;a=(your_weapon); cf=bullets
- psh af
- 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
-no_bullets:
- ld de,$3901 ;icon #3
- cal putwidesprite ;display icon
-
- ld ix,spr_icon00 ;emptyIcon
- pop af ;ld a,(your_weapon)
- ld b,a
- jr c,no_laser ;popped carry
- ld hl,$3955 ;position to display bullet-type digit
- ld (_penCol),hl ;set location
- ld a,b ;(your_weapon) ;load = faster than push
- sub maxweapon-1 ;1 = laser #1 (=maxweapon)
- add a,'0' ;make digit
- cal _vputmap ;display char
- ld ix,spr_icon04 ;laserIcon
-no_laser:
- ld de,$4901 ;icon #4
- cal putwidesprite
-
- 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
- cal putwidesprite
-
- ld ix,spr_dividerline
- ld de,$6901
- cal putwidesprite
-
- ld a,(your_pickup) ;pickups taken
- add a,a ;picks*2 (sets z-flag)
- jr z,iconsdone ;return if no pickups
- 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)
-
- ld ix,spr_icon
- cal putwidesprite
-iconsdone:
- ld hl,dispbuffer ;normal game-screen
- ld (PutWhere),hl ;set sprite-position to normal screen
-
- 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
- and %111 ;display last bits of armor
- ret z ;if armor=0 then bit = %00000000 (don't disp)
- 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
- ret
-
;--------------------------- proc -------------------------------------------
Random: ;a=c<random<b+c; destr:none
jp GET_KEY ;clear buffer
findenemyspecs: ;enemy #a specs in (hl); in:b=0; out:ac=?
- ld hl,enemyspecs-8 ;enemy "0" specs (1 before enemy #1)
+ ld hl,enemyspecs ;enemy "0" specs
+ ld c,a
add a,a ;a=type*2
add a,a ;a=type*4
add a,a ;a=type*8
+ add a,c ;a=type*9
ld c,a ;b=0; c=bc=type*8
add hl,bc ;hl = enemy specs
ret
ld (eventleft),a ;set nr of events left
inc hl
ld de,level_info
- ldi ;load (level_info)
- ldi ;load (level_move)
- ldi ;load (spacespace)
- ldi ;load (groundinfo)
-
+ ld c,4 ;bc=4
+ ldir ;4xLDI
+ ;loads (level_info); (level_move); (spacespace); (groundinfo)
ld a,1
ld b,32 ;fill (groundpos) and (ceilingpos)
fillground:
ld (hl),a ;reset your ship (not exploding)
inc hl ;hl = your_inv
ld (hl),25 ;set 25*4=100 frames invulnerable
- ld de,$1800
+ ld de,$1820
ld (x),de ;begin position (x,y)
cal Place_multiples ;place all multiple-positions at that (0,24)
inc hl
ld a,(hl)
ld (weapdaminc),a ;damage increase
+ inc hl
+ ld a,(hl)
+ and %00011111 ;laser duration
+ ld (laserdur),a
ret
;----------------------------------------------------------------------------
.db %11110001 ; ████ █
.db %11000010 ; ██ █
+spr_ship05:
+ .db 8,8 ;XC1701II ship
+ .db %11110000 ;████
+ .db %10001100 ;█ ██
+ .db %11110010 ;████ █
+ .db %01011101 ; █ ███ █
+ .db %01011101 ; █ ███ █
+ .db %11110010 ;████ █
+ .db %10001100 ;█ ██
+ .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)
+
spr_multiple:
- .db 6,5 ;multiples
- .db %01111000 ; ████
- .db %11001100 ; ██ ██
- .db %10000100 ; █ █
- .db %11001100 ; ██ ██
- .db %01111000 ; ████
+ .db 6,6 ;multiples
+ .db %00000000 ;
+ .db %00111000 ; ███
+ .db %01111100 ; █████
+ .db %01111100 ; █████
+ .db %01111100 ; █████
+ .db %00111000 ; ███
+spr_multiple2:
+ .db 7,7 ;multiples
+ .db %00111000 ; ███
+ .db %01111100 ; █████
+ .db %11111110 ;███████
+ .db %11111110 ;███████
+ .db %11111110 ;███████
+ .db %01111100 ; █████
+ .db %00111000 ; ███
;-------------------------------- explosions --------------------------------
.db 7,4,%01110100,2,%10010100,2,%00110100,2 ;7
.db 12,5,%01110110,2,%10010110,2,%00110110,2 ;8
maxweapon = 8
- .db 1,1,%00000000,0,%00000000,0,%11100000,3 ;1 single laser
- .db 1,1,%00000000,0,%11100000,0,%11100000,6 ;2 double laser
- .db 1,1,%11100000,0,%11100000,6,%11100000,3 ;3 triple laser
+ .db 1,1,%11100100,3,%00000000,0,%00000000,0 ;1 single laser
+ .db 1,1,%11111111,0,%11100000,6,%00000000,0 ;2 double laser
+ .db 10,1,%11100001,0,%11100000,6,%11100000,3 ;3 triple laser
maxlaser = 11
-collidedamage = 4
-
;------------------------------------ bar -----------------------------------
spr_lship:
.db %01010101
.db %10101010
spr_icon01:
- .db 16,7 ;armor ;.......:.......:
- .db %10000111 ;█ ███████ ▒
- .db %10011000 ;█ ██ ██ ▒
- .db %10110011 ;█ ██ ████ ██ ▒
- .db %10110000 ;█ ██ ████ ██ ▒
- .db %10110011 ;█ ██ ████ ██ ▒
- .db %10011000 ;█ ██ ██ ▒
- .db %10000111 ;█ ███████ ▒
+ .db 16,7 ;torpedo .......:.......:
+ .db %10000001 ;█ ███ ██ █▒
+ .db %10000000 ;█ ███ ██ ▒
+ .db %11000000 ;██ ███ ██▒
+ .db %10110001 ;█ ██ ███ █ █▒
+ .db %11001100 ;██ ██ ██ ▒
+ .db %10110011 ;█ ██ ██ ████ ▒
+ .db %11001100 ;██ ██ ██ ██ ▒
.db 7
- .db %11110000
- .db %00001100
- .db %11000110
+ .db %11001101
.db %11100110
- .db %11000110
+ .db %11100011
+ .db %11000101
.db %00001100
- .db %11110000
+ .db %00011110
+ .db %11000110
spr_icon02:
.db 16,7 ;tailbeam.......:.......:
.db %10000000 ;█ ▒
.db %10000001 ;█ ███ ▒
.db %10000011 ;█ ██ ▒
.db %10000000 ;█ ▒
- .db 7
+ .db 5
.db %00000000
.db %00000000
.db %11000000
.db %11110011
.db %11000000
- .db %00000000
- .db %00000000
-spr_icon02b:
- .db 16,7 ;torpedo .......:.......:
- .db %10111000 ;█ ███ █ █ █▒
- .db %10011100 ;█ ███ █ █ █▒
- .db %10111000 ;█ ███ █ █ █ ▒
- .db %10000000 ;█ ███ █ █ ▒
- .db %11100001 ;███ ████ █ █▒
- .db %10011000 ;█ ██ ████ █ █▒
- .db %11100110 ;███ ██ ██ █ ▒
- .db 7
- .db %00010101
- .db %00010101
- .db %01001010
- .db %11101010
- .db %11100101
- .db %11110101
- .db %00110010
spr_icon03:
- .db 16,7 ;bullets .......:.......:
+ .db 11,7 ;bullets .......:.......:
.db %10000000 ;█ ██ ▒
.db %10000011 ;█ █████ ▒▒▒ ▒
.db %10011000 ;█ ██ ██ ▒▒▒ ▒
.db %11101100 ;███ ██ ▒▒▒ ▒
.db %10001010 ;█ █ █ ▒▒▒ ▒
.db %10000000 ;█ ▒
- .db 7
+ .db 4
.db %00000000
.db %00000000
.db %00000000
.db %11111111
- .db %00000000
- .db %00000000
- .db %00000000
spr_icon05:
.db 16,7 ;multiple.......:.......:
.db %10000011 ;█ ███ ▒
.db %10011000 ;█ ██ ▒
.db %10111100 ;█ ████ ██ ██▒
.db %10011000 ;█ ██ ▒
- .db 7
+ .db 6
.db %10000000
.db %11100110
.db %11100000
.db %10000000
.db %00000000
.db %11000011
- .db %00000000
spr_dividerline:
.db 8,7
.db 128,128,128,128,128,128,128 ;128 = %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.810 ",127," by Shiar",0 ;right behind txt_email
-_txt_about = $3321
+_txt_email = $3A01 ;$3A1E=just email
+txt_about: .db "v0.99.812 ",127," by Shiar",0 ;right behind txt_email
+_txt_about = $3321
txt_menu1: .db "NEW GAME",0
txt_menu2: .db "CONTINUE",0
txt_score: .db "Score",0
txt_hiscore: .db "Hiscore",0
+txt_pause: .db " ",6,"/",7," ",$1C,"contrast; "
+ .db "F1",$1C,"B",$CF,5,"W Mode",0
+_txt_pause = $020B
txt_pressenter: .db "Enter to continue",0 ;pause
+_txt_pressenter = $0201
txt_teacher: .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
txt_teacherans: .db Lneg,"14.6549373495",0
pickuptimer .db 4 ;counts when to place a pickup 4
your_ship .dw spr_ship01 ;your sprite sprs1
your_score .dw 0 ;current score 0
-your_pickup .db 5 ;pickups already picked up 0
+your_pickup .db 4 ;pickups already picked up 0
your_occ .db 0 ;0=normal 1..16=exploding 0
your_inv .db 0 ;invincibility left 0
-your_armor .db 12 ;HP left 12
+your_armor .db 22 ;HP left 12
your_lives .db 3 ;lives left 3
-your_weapon .db 0 ;current weapon upgrade 0
+your_weapon .db 8 ;current weapon upgrade 0
your_multiples .db 0 ;multiples present 0
your_tail .db 0 ;tail beam present 0
storesave_end:
;------------------------------ enemies -------------------------------------
-;format: [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)]
-; [movetype] [time2fire] [firefreq]
-;appearances: 1=random; 2=lure; 3=halflure
-;case movetype:
-; 1=updown; 2=1/4x; 3=1/2x; 4=1.5x; 5=2x; 6=smart; 7=y-lure;
-; 8=y-lure 1/2x; 9=x; 10=x+y-lure 1/2x
+;format: [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)]
+; [movetype] [time2fire] [firefreq] [firetype]
+;appearances: 1=random; 2=lure; 3=halflure
+;movetypes: 1=updown; 2=1/4x; 3=1/2x; 4=1.5x; 5=2x; 6=smart; 7=y-lure;
+; 8=y-lure 1/2x; 9=x; 10=x+y-lure 1/2x
+;firetypes: 1=normal; 6=aiming; 7=triple; 8=double
+
enemyspecs:
-;1-5=asteroids
- .db 0,%00100110,(spr_enemyA1-spr_enemy00)/2,128,1,0,0,0
- .db 0,%00111110,(spr_enemyA2-spr_enemy00)/2,128,1,0,0,0
- .db 0,%01011010,(spr_enemyA3-spr_enemy00)/2,128,1,4,0,0
- .db 1,%00001010,(spr_enemyA4-spr_enemy00)/2,128,1,3,0,0
- .db 0,%00111110,(spr_enemyA4-spr_enemy00)/2,128,1,5,0,0
-;6-10=basic enemies
- .db 0,%00010010,(spr_enemyE1-spr_enemy00)/2,128,1,0,10,0 ;weak
- .db 0,%00110010,(spr_enemyE4-spr_enemy00)/2,128,1,3,6,50 ;slow
- .db 0,%00100110,(spr_enemyE2-spr_enemy00)/2,128,1,0,1,0
- .db 0,%00101110,(spr_enemyE3-spr_enemy00)/2,128,3,0,19,39
- .db 0,%00101010,(spr_enemyE5-spr_enemy00)/2,128,3,4,1,0 ;fast
-;11-12=backwards
- .db 0,%00011110,(spr_enemyB1-spr_enemy00)/2,0,3,11,19,92
- .db 0,%00101110,(spr_enemyB2-spr_enemy00)/2,0,1,12,11,45
- .db 0,%00110110,(spr_enemyB3-spr_enemy00)/2,0,1,11,10,41 ;small
-
- .db 0,%00001111,(spr_enemyN3-spr_enemy00)/2,128,2,1,87,5
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;15
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;16
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;17
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;18
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;19
-;20-23=first bosses
- .db 1,%00101011,(spr_boss2-spr_enemy00)/2,127,1,8,20,12 ;small
- .db 1,%00110011,(spr_boss1-spr_enemy00)/2,127,1,8,15,10
- .db 1,%01001011,(spr_boss1-spr_enemy00)/2,127,3,10,10,9
- .db 0,%11111111,(spr_boss3-spr_enemy00)/2,127,3,10,1,4 ;weak+rapidfire
-;24-25=asteroid bosses
- .db 2,%00001011,(spr_bossA1-spr_enemy00)/2,127,1,10,36,14
- .db 2,%00110011,(spr_bossA1-spr_enemy00)/2,127,2,10,28,12
-;26-27=big bosses
- .db 2,%00000111,(spr_boss4-spr_enemy00)/2,127,3,7,18,7
- .db 2,%01001011,(spr_boss5-spr_enemy00)/2,127,3,7,18,7
+ .db 0,%00000110,(spr_enemy00-spr_enemy00)/2,128,2,03, 0, 0,1 ;pickup
+;1-5=asteroids , , , , , ,
+ .db 0,%00100110,(spr_enemyA1-spr_enemy00)/2,128,1,00, 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,04, 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,05, 0, 0,1
+;6-10=basic enemies , , , , , ,
+ .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,04, 1, 0,1 ;fast
+;11-13=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
+;14=improved enemies , , , , , ,
+ .db 0,%01001010,(spr_enemyG1-spr_enemy00)/2,128,3,00, 1,35,1
+
+ .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,0,00, 0, 0,1 ;15
+ .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,0,00, 0, 0,1 ;16
+ .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,0,00, 0, 0,1 ;17
+ .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,0,00, 0, 0,1 ;18
+ .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,128,0,00, 0, 0,1 ;19
+;20-23=first bosses , , , , , ,
+ .db 1,%00101011,(spr_boss2 -spr_enemy00)/2,127,1,08,20,12,1 ;small
+ .db 1,%00110011,(spr_boss1 -spr_enemy00)/2,127,1,08,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
+;24-25=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
+;26-27=big bosses , , , , , ,
+ .db 2,%00000111,(spr_bossB1 -spr_enemy00)/2,127,3,07,18, 7,7
+ .db 2,%01001011,(spr_bossB2 -spr_enemy00)/2,127,3,07,18, 7,7
spr_enemy00:
.db 16,8 ;pickup
.db %01011101 ; █ ███ █
.db %10111110 ;█ █████
.db 0
+spr_enemyN4:
+ .db 8,8 ;Stolen from XC1701II
+ .db %01111110 ; ██████
+ .db %11110101 ;████ █ █
+ .db %00011111 ; █████
+ .db %00111101 ; ████ █
+ .db %00111001 ; ███ █
+ .db %00011111 ; █████
+ .db %11110101 ;████ █ █
+ .db %01111110 ; ██████
+spr_enemyN5:
+ .db 7,8 ;Stolen from XC1701II
+ .db %00111100 ; ████
+ .db %01010010 ; █ █ █
+ .db %11111110 ;███████
+ .db %01001010 ; █ █ █
+ .db %01011010 ; █ ██ █
+ .db %11111110 ;███████
+ .db %01010010 ; █ █ █
+ .db %01111100 ; ████
spr_boss1:
.db 16,10 ;.......:.......:
.db %11100001
.db %10001111
spr_bossA1:
- .db 16,11 ;bigasteroid one
+ .db 16,11 ;AsteroidBoss one
.db %00011110 ; ████
.db %01110011 ; ███ ███
.db %01111111 ; ███████ █
.db %11110000
.db %11000000
.db 0
-spr_boss4:
- .db 16,18 ;bigboss one :
+spr_bossB1:
+ .db 16,18 ;BigBoss one :
.db %00000000 ; █ █
.db %00000111 ; ███ ███
.db %00000011 ; ████ █
.db %11010000
.db %01110000
.db %01010000
-spr_boss5:
- .db 16,15 ;bigboss two :
+spr_bossB2:
+ .db 16,15 ;BigBoss two :
.db %00001111 ; █████
.db %00111110 ; █████ █████
.db %01111101 ; █████ █ ███████
; # after pause weapon will not be fired
; # teacher key fixed (waits for GRAPH to be release before&after)
;
-; 0.99.79 -- 9.VII.00 -- size 6747
+; 0.99.815 -- 15.VIII.00 -- size 6399
;
; + you can have upto FOUR multiples! (~20 pixels apart)
; * some optimizations: keycall, menu handling, port nops removed,
; more SMC, fire handling, fast bullet handling, enemy movement
; * better "backwards" enemies handling (and implemented in game)
+; # when enemy changed into a pickup, movement is set to vslow
+; * instead of turning into a pickup, enemies explode and a pickup
+; appears at the right side of the screen (moves left slowly)
+; # bullets do damage again (screenflash made damage become 0)
+; + when destroyed by bullets, the armor bar will show 0HP left
+; * all enemy bullets do the same damage in all levels
+; * you now appear at (*32*,30) because enemies can come from left
+; * improved bullet handling (faster, smaller, etc.)
+; + multiples are animated like real Nemesis (grow-shrink-grow-shrink>)
+; # fixed a bug that didn't select multiples when you were moving
+; # enemy collision screwed up invert and some other weird stuff
+; + in pause screen change contrast with up/down and B/W mode with F1
+; + lasers can have different durations (beams last longer)
+; * some sign-flag checkings replaced by carry-flag (thus reducing size)
+; # slow enemies (including pickups) didn't always appear (just 25-50%)
+; + enemies can fire different kinds of bullets: aiming, double, triple
+; * maximum number of bullets increased (48 for enemies, 128 for you)
;
; + added - removed * changed # bug fixed