;----------------------------------------------------------------------------
;---------------------- 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 do not distribute an altered version!!
+;alter it, and certainly never distribute an altered version!!
-;&&& marks uncertainties or things to optimize
+;TO DO: levels 11,12,13 | bosses 10-13 | look over &&& markings
;---------------------- nemesis.z80 start -----------------------------------
dispbuffer = $81FA ;= $C9FA ;virtual screen
;VIDEO_MEM = $FC00 ;tha big scareen
-TEXT_MEM = _textShadow ;text buffer; C0F9-C1A0 (167/$A7 bytes)
_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 ;120 OF 165
-storepos2 = _asm_exec_ram+7200 ;141 OF 167 9000 BYTES
+storepos = _asm_exec_ram+7000 ;1024 bytes to store things
;---------------------- in-game vars ----------------------------------------
-just_fired = storepos ; +0 ;counts how long a blast lasts
-menuitem = storepos ; +0 ;used to store menu location
-hiscorepos = storepos ; +0 ;entering hiscore name
- ; ;--------YOU
-x = storepos+1 ; +1 ;your ship's position
-y = x+1 ; +2 ;your y-pos
-firex = y+1 ; +3 ;(1 byte)
-firey = firex+1 ; +4 ;(1 byte)
- ; ;--------LEVEL
-eventleft = storepos+5 ; +5 ;nr. of enemies still to come
-nextevent = eventleft+1 ; +6 ;time to next event
-level_enemy = nextevent+1 ; +7 ;enemy type
-level_info = level_enemy+1 ; +8 ;info (see below)
-level_move = level_info+1 ; +9 ;=
- ; ;--------OBJECTS
-spacespace = storepos+19 ;+19
-groundinfo = spacespace+1 ;+20
-groundpos = groundinfo+1 ;+21 $10
-ceilingpos = groundpos+16 ;+37 $10
- ; ;--------STARS
-stars1 = ceilingpos+16 ;+53
-stars2 = stars1+1 ;+54
-nrstars1 = 7
-starx1 = storepos+55 ;+55
-nrstars2 = 7
-starx2 = starx1+(nrstars1*2) ;+69
- ; ;--------MULTIPLES
-your_prevpos = starx2+(nrstars2*2) ;+87 ;save previous positions (32d)
-mm = 4
-
-;^-----------------------------------<1 ;-120=$78
-
-enemies = storepos2 ; +0 ;info about each enemy
-enemysize = 9 ;infobytes per enemy
+just_fired = storepos ; +0 ;counts how long a blast lasts
+hiscorepos = storepos ; +0 ;entering hiscore name
+
+x = storepos+1 ; +1 ;your ship's position
+y = x+1 ; +2 ;your y-pos
+firex = y+1 ; +3 ;(1 byte)
+firey = firex+1 ; +4 ;(1 byte)
+
+eventleft = firey+1 ; +5 ;nr. of enemies still to come
+level_enemy = eventleft+1 ; +6 ;enemy type
+level_info = level_enemy+1 ; +7 ;ceiling/ground (%00) present
+spacespace = level_info+1 ; +8
+groundinfo = spacespace+1 ; +9
+stars1 = groundinfo+1 ; +10 ;slow stars byte (<< %1)
+stars2 = stars1+1 ; +11 ;fast stars byte (<<< %1)
+groundpos = stars2+1 ; +12 $10
+ceilingpos = groundpos+16 ; +28 $10
+nrstars1 = 10
+starx1 = ceilingpos+16 ; +44 ;20
+nrstars2 = 10
+starx2 = starx1+(nrstars1*2) ; +64 ;20
+
+mm = 4 ;max. number of multiples
+your_prevpos = starx2+(nrstars2*2) ; +84 ;14*mm+2 ;previous positions
+
+
+enemies = storepos+200 ;+200 ;info about each 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\
-ebullets = ybullets+(nrybuls*4) ;+110 ;30 bytes = 10(state,x,y)
-nrebuls = 16
-lvlenemies = ebullets+(nrebuls*3)
-
-;^-----------------------------------<2 ;-141=$8D
-;level_info:
-; [0000:damage 0:diagfire 0:ground 0:ceiling 0:-]
+nrybuls = 128 ;+360\
+ebullets = ybullets+(nrybuls*4) ;+872 ;30 bytes = 10(state,x,y)
+nrebuls = 48
+lvlenemies = ebullets+(nrebuls*3) ;-1016
+
;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]
+; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 1X=normal)]
+; [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.98 by SHIAR",0
+Title: .db "Nemesis v0.99.820 by SHIAR",0
Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes
.db %11100000 ; ███
.db %00111110 ; █████
.db %01111000 ; ████
.db %11100000 ; ███ ;recommend 80x50 screen mode
- .DB 0 ;clear stupid YAS-line
+ .db 0 ;YAS 0.92 compatibility
;---------------------- init ------------------------------------------------
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
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
ld hl,txt_menu2
cal _puts
- xor a
- ld (menuitem),a
-
menuloop:
- ld a,(menuitem)
+ ld a,0 ;current menu item (0 or 1); 0 by default
+menuitem =$-1
ld h,$01
add a,4
ld l,a
ld (_curRow),hl
cal _putc
- halt \ halt
-
- cal GET_KEY ;wait for keypress
+ cal getsomekeys ;read keys (z if enter/2nd pressed)
+ jr z,start_tha_freakin_game
+ cp K_EXIT
+ jr z,menuexit
cp K_UP
jr z,menuchange
cp K_DOWN
- jr z,menuchange
- cp K_EXIT
- jr z,menuexit
- cp K_F1
- cal z,do_invert
- cp K_SECOND
- jr z,start_tha_freakin_game
- cp K_ENTER
jr nz,menuloop
-start_tha_freakin_game:
+menuchange:
+ ld hl,menuitem
+ ld a,(hl)
+ xor 1 ;0=1; 1=0
+ ld (hl),a ;set new menu item
+ jr menuloop
+start_tha_freakin_game:
ld a,(menuitem)
dec a
cal nz,New_game ;NEW GAME
jp samelevel ;CONTINUE: game_main_loop
menuexit:
- ld hl,0
- ld (your_score),hl
- jp game_over
-
-menuchange:
- ld a,(menuitem)
- xor 1
- ld (menuitem),a
- jr menuloop
+ ld hl,0 ;reset score
+ 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
Clear_screen:
ld hl,dispbuffer ;move from (hl) = top left
- ld (hl),$00 ;first pixel will be copied all over the screen
+ ld (hl),0 ;first pixel will be copied all over the screen
ld de,dispbuffer+1 ;(de) = next pixel, thus clearing whole screen
- ld bc,896 ;loop 896 times = (128/8) * (64-8 for scorebar)
+ ld bc,16*56-1 ;loop 896 times = (128/8) * (64-8 for scorebar)
ldir ;all clear!
ld a,0 ;current frame/turn 0-255
cal DisplayStars ;use the same procedure to display back layer
ld a,(level_info) ;level info
- and %00000110 ;isolate ground&ceiling
- jr z,game_stuff ;both non-present
- and %00000010 ;bit representing the presence of any ceiling
+ rra ;ground present? (%1)
+ jr nc,game_stuff ;no, so both non-present
+ rra ;bit representing the presence of any ceiling
cal nz,Handle_ceiling ;scroll the ceiling (if any) +check4collision
cal Handle_ground ;scroll the ground and check if we're dead
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
psh hl ;push hl on stack (instead of cal Fire_bullet)
jp z,Fire_bullet ;fire smtn (bulletstaillasermultiples+stuff..)
pop hl ;no cal to Fire_bullet made, so pop stack
- xor a ;no:
- ld (just_fired),a ;reset just_fired
+ 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)
- out (1),a ;gimme
- nop \ nop ;what's taking you so long
- in a,(1) ;at last... our precious keyzzz...
+ out (1),a
+ in a,(1) ;our precious keys
bit 6,a ;'bout the GRAPH key...
cal z,Teacher ;you didn't _press_ it, did you?!?
cal Level_event ;insert enemies
cal Display_Screen ;display all
- ld b,1
-___:
- halt ;delay
- dnz ___
+delay:
+ halt ;delay and preserve batteries :)
jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+;------- weapon -------
+
inc_weapdamage:
ld a,0
weapincs =$-1
weapdamage =$-1
add a,b ;a=total damage
ld (curweapdamage),a ;safe the current damage
- cal disp_charge
+
+
+disp_charge: ;display charge bar
+ ld hl,(59*16)+VIDEO_MEM+3
+ ld b,3
+chargebarclr:
+ dec hl
+ ld (hl),0
+ dnz chargebarclr
+
+ ld a,(weapincs) ;load bar size (0-80)
+ srl a ;half the size (0-40)
+ srl a ;again half that size (0-20 pixels)
+ 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,nochargebar ;if a=0 then it would loop 256x so skip it
+ ld b,a ;loop b=a times
+chargebar: ;starting at ($39*16)+VIDEO_MEM
+ ld (hl),%11111111 ;draw a piece of the bar
+ inc hl ;next position
+ dnz chargebar ;loop it b times
+nochargebar:
+ ld a,c ;pop a
+ and %111 ;display last bits of chargebar
+ ret z ;if armor=0 then bit = %00000000 (don't disp)
+ ld b,a ;into B
+ xor a ;bit = %00000000
+chargebarbit:
+ scf ;set carry flag
+ rra ;rotates A right and sets bit 7 (c-flag)
+ dnz chargebarbit ;repeat B times (so if B=6 then a=%11111100)
+chargebarready: ; (an if B=3 then a=%11100000)
+ ld (hl),a ;draw this last byte
ret
;--------------------------- ground -----------------------------------------
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 -------------------------------------
movestars2:
ld ix,starx2
ld a,(stars2)
- rlca
+ rlca ;move bits (star) left
ld (stars2),a
- ret nc
- ld b,nrstars2
+ ret nc ;if star didn't went from left to right bit
+ ld b,nrstars2 ;otherwise move all stars one byte left
jr movestars_loop
movestars1:
ld a,l
and %00001111
- cp 9 ;(GRAPH_MEM&%00001111)-- = $C9FAand15-1 = $A-1
+ cp (dispbuffer&15)-1 ;$C9FAand15-- = 9
jr nz,newstarok
cal RandomY
;--------------------------- 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 ----------------------------------------
no_up: ld e,(hl) ;e=y
ld ix,spr_ship01 ;normal ship sprite
your_shipspr =$-2
- ld hl,your_inv ;invulnerable?
+ ld hl,your_shield ;shielded?
ld a,(hl) ;load time in a
or a ;is it 0?
jr z,disp_ship ;yes so ship = normal (display \ continue)
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----
;----hit----
damage_you: ;damages you B points
- ld a,(your_inv) ;shield left?
+ ld a,(your_shield) ;shield left?
or a
jr z,dothadamage ;no shield
srl b ;shield: half the damage
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 ----------------------------------
Place_multiples:
ld hl,your_prevpos ;place all previous positions
- ld b,mm*7+2 ;all saved positions of them (14 per multiple)
+ ld b,mm*7+1 ;all saved positions of them (14 per multiple)
place_multiples:
ld (hl),e ;set prev-x to d
inc hl ;next
jr nz,select2 ;no, carry on
select1:
ld (hl),a ;reset pickups
- cal inc_armor
- jp disp_icons ;display and return
+ 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 pickups
- inc a ;a=1
- ld (your_tail),a ;ready tail beam
- jp disp_icons ;display 'n return
+ 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
ld a,(hl)
inc a
cp maxweapon
- jp nc,disp_icons ;weapon maxed out
+ jr c,selected3 ;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
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
ld (hl),a ;reset pickups
+ ld (your_extra),a ;no extra beams (tailbeam/up-double)
ld hl,your_weapon
ld a,(hl)
- cp maxweapon ;upgrade from bullet
+ cp maxweapon ;upgrade from bullet?
jr nc,upgradelaser ;nope, just upgrade
ld a,maxweapon-1 ;yes, set laser #1
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
-;------------------------- fire bullet --------------------------------------
+;--------------------------- show icon --------------------------------------
-fire_multiples:
- ld hl,(your_prevpos+16);then, fire from multiple position
- psh af
- dec h ;one up (-2 height: keeps weapons centered)
- cal fireany ;fire from multiple position
- pop af ;number of multiples
- dec a ;one just displayed
- ret z ;return if none left
- ld hl,(your_prevpos+30)
- psh af
- dec h
- cal fireany
- pop af
- dec a
- ret z
- ld hl,(your_prevpos+44)
- psh af
- dec h
- cal fireany
- pop af
- dec a
- ret z
- ld hl,(your_prevpos+58)
- psh af
- dec h
- cal fireany
- pop af
- dec a
- ret
+disp_icons:
+ psh bc \ psh de \ psh hl \ psh ix ;&&&
-Fire_bullet:
- ld hl,just_fired
- ld a,(hl) ;just_fired
- cp 5 ;already pressed?
- ret z ;return when already pressed (=5)
+ 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
- inc (hl) ;otherwise increase counter (0 to 4 >> 1 to 5)
- ld a,(your_weapon) ;if you have bullets.....
- cp maxweapon
- jr nc,fireOK ;>weapons = laser
- ld (hl),5 ;.....then can't fire next turn (go to 5 imm.)
+ ld b,16*7 ;draw 16x (screen width) 7x (height)
+ xor a ;blank line mask
+ cal drawline ;clear scorebar
-fireOK:
- ld a,(your_multiples) ;any multiples?
- and %111 ;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)
- ld (firex),hl ;set position to fire from
- ld a,(your_weapon)
- ld ix,weapondata+2-(256*3)
- add a,a ;weap*2
- add a,a ; *4
- add a,a ; *8
- ld c,a
- ld b,3 ;go to current weapon (bc=a), b=3 :P
- add ix,bc
+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
-fire_weapon: ;b=3
- 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
- inc ix
- pop bc ;weapon counter (do 3 weapons)
- dnz fire_weapon
+ ld ix,spr_icon01 ;torpedoIcon
+ ld de,$1901 ;icon #1
+ cal putwidesprite ;display icon
-fire_tail:
- ld hl,your_tail
- ld a,(hl)
+ ld ix,spr_icon00
+ ld a,(your_extra)
+ or a
+ jr z,no_tail
+ ld ix,spr_icon02a ;tailbeamIcon
dec a
- ret nz
- ld a,(ix-2) ;last weapon fired
- cp %11100000 ;issit laser
- ret z ;then return
- xor %11111 ;smart way of going left instead of right :P
- jr fire_ybullet ;fire tail bullet and return
+ jr z,no_tail ;(your_extra)=1 = tailbeam
+ ld ix,spr_icon02b ;updoubleIcon
+no_tail:
+ ld de,$2901 ;icon #2
+ cal putwidesprite ;display
-;-----fire LASER-----
+ ld ix,spr_icon00
+ ld a,(your_weapon) ;ur weapon
+ cp maxweapon ;laser?
+ 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
+no_bullets:
+ ld de,$3901 ;icon #3
+ cal putwidesprite ;display icon
-fire_laser:
- ld b,0 ;overflow counter
- ld hl,firex
- ld d,(hl) ;d = your x-pos
- inc hl
+ 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 a,(hl) ;base y-coord (firey)
- add a,(ix+1) ;at specified offset (most likely the middle)
- ld e,a ;save laser-y in e
- psh de ;save unmodified (x,y)
- add a,a ;y*2
- add a,a ;y*4
- add a,a ;y*8
- rl b ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
- add a,a ;y*16 (width of screen)
- rl b ;b=b*2+overflow (if y>64 then bc=bc+512)
- inc a ;8 pixels to right (a=even so no overflow)
+ 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
- srl d ;X/2
- srl d ;X/4
- srl d ;X/8
- add a,d ;a = (Y*16+X/8) mod 256 (c set on overflow)
+ ld ix,spr_dividerline
+ ld de,$6901
+ cal putwidesprite
- jr nc,_nolc ;jump if no carry = no overflow = a<=255
- inc b ;a>255 so increase bc by 256
-_nolc: ld c,a ;c = (Y*16+X/8) mod 256
- ld hl,dispbuffer ;save-location
- add hl,bc ;bc = Y*16+X/8: hl=screen address
- ld a,15 ;128/8=16=screen width ** minus one (inc a ^^)
- sub d ;minus x-start (d=X/8)
- ld b,a
-drawlaser:
- ld (hl),%11111111
- inc hl ;Go to next byte
- dnz drawlaser
-handle_laser:
- pop de ;de=(firex): x-pos unmodified
+ 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)
-check_laserhits: ;de = (x,y)
- psh ix
- ld b,nrenemies ;check all enemies
+ 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
+ psh ix ;save ix for next fire
+ cal fireany ;fire from multiple position
+ pop ix ;saving ix is much faster than recalculating
+ pop af ;number of multiples
+ dec a ;one just displayed
+ pop hl ;ret
+ ret z ;ret2 if none left
+ jp (hl) ;real ret
+
+fire_multiples:
+ ld hl,(your_prevpos+16);then, fire from multiple position
+ cal fire_multiple
+ ld hl,(your_prevpos+30)
+ cal fire_multiple
+ ld hl,(your_prevpos+44)
+ cal fire_multiple
+ ld hl,(your_prevpos+58)
+ cal fire_multiple ;no JP: that messes up the stack
+ ret
+
+Fire_bullet:
+ ld hl,just_fired ;=for how long you may hold fire (2nd)
+ ld a,(hl) ;a = time left
+ dec a ;decrease timer
+ ret z ;may not fire when (just_fired) became 0
+ ld (hl),a ;save new decreased value
+
+ ld a,(your_weapon) ;if you have bullets.....
+ cp maxweapon
+ jr nc,fireOK ;>weapons = laser
+ ld (hl),1 ;bullet may last one turn (just fire 1 bullet)
+fireOK:
+ ld a,(your_weapon) ;weapon nr.
+ ld ix,weapondata+2
+ add a,a ;weap*2
+ add a,a ; *4
+ add a,a ; *8
+ ld c,a
+ ld b,0 ;go to current weapon (bc=a)
+ add ix,bc ;ix=weapon ptr
+
+ ld a,(your_multiples) ;any 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)
+ ld (firex),hl ;set position to fire from
+ ld b,3 ;or use the proc at fireOK with ld ix,weapondata+2-(256*3)
+fire_weapon:
+ psh bc ;save counter
+ ld a,(ix) ;load this weapon
+ 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_tail:
+ ld ix,extrabulletpos-1 ;extra bullet's position
+ ld hl,your_extra ;data
+ ld a,(hl)
+ or a
+ ret z
+ ld c,tailbeam ;tailbeam weapon data
+ dec a ;(your_extra)=1
+ jr z,fire_ybullet ;=tail
+ ld c,doublebeam ;up double data
+ ;(your_extra)=2 =double
+;-----fire BULLETs-----
+
+fire_ybullet: ;fire bullet type=C dam=(curweapdamage) at (firex/y)
+ ld hl,ybullets ;check for unused bullet
+ ld de,4
+ ld b,nrybuls
+find_ybullet:
+ ld a,(hl)
+ or a
+ jr z,found_ybullet ;0 = no bullet here
+ add hl,de
+ dnz find_ybullet ;look next bullet
+ ret ;none found, return don't fire
+
+found_ybullet:
+ ld (hl),c ;use the bullet and set correct bullet-type
+ inc hl ;@damage
+ ld (hl),1 ;set bullet damage
+curweapdamage =$-1
+ ld a,(firex) ;your x-pos
+ add a,5 ;place bullet in front of you
+ inc hl ;go to bullet-x
+ ld (hl),a ;set x
+
+ ld a,(firey) ;your y-pos
+ add a,(ix+1) ;place bullet at the middle of your ship
+ inc hl ;go to bullet-y
+ ld (hl),a ;set y
+
+ xor a
+ ld (weapincs),a ;reset damage
+ ret
+
+;-----fire LASER-----
+
+fire_laser:
+ ld b,0 ;overflow counter
+ ld hl,firex
+ ld d,(hl) ;d = your x-pos
+ inc hl
+
+ ld a,(hl) ;base y-coord (firey)
+ add a,(ix+1) ;at specified offset (most likely the middle)
+ ld e,a ;save laser-y in e
+ psh de ;save unmodified (x,y)
+ add a,a ;y*2
+ add a,a ;y*4
+ add a,a ;y*8
+ rl b ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
+ add a,a ;y*16 (width of screen)
+ rl b ;b=b*2+overflow (if y>64 then bc=bc+512)
+ inc a ;8 pixels to right (a=even so no overflow)
+
+ srl d ;X/2
+ srl d ;X/4
+ srl d ;X/8
+ add a,d ;a = (Y*16+X/8) mod 256 (c set on overflow)
+
+ jr nc,_nolc ;jump if no carry = no overflow = a<=255
+ inc b ;a>255 so increase bc by 256
+_nolc: ld c,a ;c = (Y*16+X/8) mod 256
+ ld hl,dispbuffer ;save-location
+ add hl,bc ;bc = Y*16+X/8: hl=screen address
+ ld a,15 ;128/8=16=screen width ** minus one (inc a ^^)
+ sub d ;minus x-start (d=X/8)
+ ld b,a
+drawlaser:
+ ld (hl),%11111111
+ inc hl ;Go to next byte
+ dnz drawlaser
+handle_laser:
+ pop de ;de=(firex): x-pos unmodified
+
+check_laserhits: ;de = (x,y)
+ psh ix
+ ld b,nrenemies ;check all enemies
ld hl,enemies+1 ;enemy#1+occ/hp00
laserhits: ;hits with normal enemies
psh hl
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
-;-----fire BULLETs-----
+;------------------------ handle 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
+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
-find_ybullet:
- ld a,(hl)
- or a
- jr z,found_ybullet ;0 = no bullet here
- add hl,de
- dnz find_ybullet ;look next bullet
- ret ;none found, return don't fire
+scan_bullets:
+ ld a,(hl) ;@bulletType
+ or a ;bulletType=0 >> no bullet
+ jp z,next_ybullet+2 ;skip pops (+2); jP for speed
-found_ybullet:
- ld (hl),c ;use the bullet and set correct bullet-type
+ psh bc ;bullet counter
+ psh hl ;save enemy+type
+ ld (temp1),hl ;needed for check_bullethits
inc hl ;@damage
- ld (hl),1 ;set bullet damage
-curweapdamage =$-1
- ld a,(firex) ;your x-pos
- add a,5 ;place bullet in front of you
- inc hl ;go to bullet-x
- ld (hl),a ;set x
-
- ld a,(firey) ;your y-pos
- add a,(ix+1) ;place bullet at the middle of your ship
- inc hl ;go to bullet-y
- ld (hl),a ;set y
-
- xor a
- ld (weapincs),a ;reset damage
- ret
-
-;------------------------ handle bullets ------------------------------------
+ inc hl ;@x
-bullet_left:
+move_bullet:
ld c,a ;c=type
and %11111 ;pixels to move
add a,(hl) ;a = X + (hl) to the right
inc hl ;@y-pos
ld a,c
- cal _shracc ;%11110000->1111
+ cal _shracc ;%11100000->1110
+;Note: a _shracc procedure inside Nemesis itself would be 27 cycles faster
srl a ;%1110->111
dec a
jr z,bullet_noymove ;1=straight forward
jr z,bullet_halfup ;3=1/2up
dec a
jr z,bullet_down ;4=down
-
bullet_halfdown: ;5=1/2down
ld a,(timer)
- and 1
- jr z,bullet_noymove
+ rra ;carry once every other turn
+ jr c,bullet_noymove
bullet_down:
ld a,(hl)
inc a
ld (hl),a
bullet_halfup:
ld a,(timer)
- and 1
- jr z,bullet_noymove
+ rra ;CF every other turn
+ jr c,bullet_noymove
bullet_up:
ld a,(hl)
dec a
ld (hl),a
bullet_noymove:
ld e,(hl) ;e = Y
- ret
-
-remove_bullet:
- pop hl ;cal bullet_left
- 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
-scan_bullets:
- psh bc ;bullet counter
- psh hl ;save enemy+type
- ld (temp1),hl ;needed for check_bullethits
- ld a,(hl) ;@bulletType
- inc hl ;@damage
- inc hl ;@x
-
- or a
- jp z,next_ybullet ;bulletType=0 >> no bullet
- cal bullet_left ;move bullet left
display_bullet:
- psh de ;save de =position
dec hl ;@x
dec hl ;@damage
ld a,(hl) ;bullet damage=size
ld hl,bullettable ;pointer to first bullet
srl a
srl a ;per 4
- ld d,0
- ld e,a ;->16bit (de=a)
- add hl,de ;point to correct bullet offset
+ ld b,0
+ ld c,a ;->16bit (de=a)
+ add hl,bc ;point to correct bullet offset
ld a,(hl) ;load bullet offset
- ld e,a ;convert to 16bit (d=0)
+ ld c,a ;convert to 16bit (d=0)
ld ix,spr_bullet01 ;first sprite
- add ix,de ;add offset (go to correct sprite)
- pop de ;saved position
+ add ix,bc ;add offset (go to correct sprite)
ld a,(ix) ;bullet x-size
ld (bulletxsize),a ;used at check_bullethits
next_ybullet:
pop hl ;restore enemy+type
- inc hl
- inc hl
- inc hl
- inc hl ;skip type,dam,x,y: next enemy+type
pop bc ;b=counter
+ ld de,4
+ add hl,de
dnz scan_bullets ;next bullet (loop)
ret
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)
+ ld a,pickupfreq ;reset enemies counter
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
;--------------------------- level events -----------------------------------
Level_event:
- ld hl,nextevent ;time to next event <ld a,(nextevent)
- dec (hl) ;decrease counter <dec a
- ld a,(hl) ;look at counter <ld (nextevent),a
- or a ;has it reached zero?
- ret nz ;nope: get outta here!
+ ld a,0 ;time to next event
+nextevent =$-1
+ dec a ;decrease counter
+ ld (nextevent),a ;store new value
+ ret nz ;hasn't reached zero yet: get outta here!
ld bc,0 ;enemy frequency (lvl)
eventtime =$-2
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
+ ld (hl),193 ;set delay
ret ;don't place any more enemies
standby_event:
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)
;otherwise?
halflure_enemy: ;yes (of course it is): pick one (50% lure)
ld a,(timer) ;look at frame-number
- and %00000001 ;make random if odd frame nr.
- jr nz,random_enemy ;1st possibility: random enemy
+ rra ;make random if odd frame nr.
+ jr nc,random_enemy ;1st possibility: random enemy
lure_enemy: ;2nd possibility: luring enemy
ld a,(y) ;place at same y-pos as YOUR ship
jr ypos_OK
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:
- ld a,(hl)
- or a
+ cp (hl)
jr z,found_ebullet ;0 = not used
inc hl \ inc hl \ inc hl
dnz find_ebullet ;look next bullet
ret
found_ebullet:
- ld b,%1100
- 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 bulletok ;fire bullet
+ inc hl ;next bullet position
+ inc e
+ inc e ;two px down
+ jr enemy_fires_again ;find and fire another bullet
+
+bullettriple:
+ ld c,1 ;type #1 = normal
+ cal bulletok ;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 enemy_fires_again
+
+bulletaiming:
ld a,(y)
sub e
add a,10
jp p,bulletnotup
- ld b,%1011 ;yourY-bulY = negative (=bullet below you)
+ ld c,5 ;yourY-bulY = negative (=bullet below you)
add a,10
jp p,bulletnotup
- ld b,%1001 ;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,%1010 ;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,%1000
+ jr c,bulletok ;even more going down
+ ld c,2
bulletok:
- ld a,(level_info)
- and %11110000
- or b
- ld (hl),a ;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
- and %1111 ;select direction-bits
- 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
+ or a ;bullet present?
+ 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
- ld a,b ;restore type
- cp %1100 ;is it a normal bullet? (cp = faster than bit)
- jr z,ebullet_common ;type %1100: normal bullet
- and %111 ;isolate important bits
- jr z,ebullet_down ;type %1000: moving down
dec a
- jr z,ebullet_up ;type %1001: moving up
- ld b,a
+ jr z,ebullet_common ;type 1: normal bullet
+ dec a
+ jr z,ebullet_down ;type 2: moving down
+ dec a
+ jr z,ebullet_up ;type 3: moving up
- ld a,(timer)
- rra
- jr c,ebullet_common
+ 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
- ld a,b
- dec a
- jr z,ebullet_down ;type %1010: moving down 50%
- ;type %1011: moving up 50%
+ 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
- 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 55
- 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 could be 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 ;@y
- inc hl ;@movetype
- inc hl ;@movecount
- inc hl ;@firecount
- dec (hl) ;decrease counter till next blast
- ld a,(hl) ;&&&doesn't seem efficient to me
- or a ;has it reached zero?
- jr nz,firing_done ;finished if not
+ ld bc,4 ;4x inc hl
+ add hl,bc ;@firecount
+ ld a,(hl) ;counter till next blast
+ dec a ;decrease it
+ ld (hl),a ;save new value
+ jr nz,firing_done ;finished if not reached 0 yet
inc hl ;@firefreq
- ld a,(hl)
+ ld a,(hl) ;=time 'til next blast
+ 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
dnz handle_enemy
ret
-remove_enemy:
- pop hl
- ld (hl),$0000 ;bye bye enemy
- jr next_enemy+1 ;continue AFTER pop hl (already done)
-
exploding_enemy:
inc hl
ld a,(hl)
cp 16
- jr z,remove_enemy ;remove when at last frame
+ jr nz,keep_enemy ;remove when at last frame
+remove_enemy:
+ pop hl
+ ld (hl),$0000 ;bye bye enemy
+ jr next_enemy+1 ;continue AFTER pop hl (already done)
+keep_enemy:
inc a
ld (hl),a ;next frame
dec a ;1-16 -> 0-15
;--------------------------- moving enemies ---------------------------------
moving_enemy:
+ dec d ;move left once
ld a,(hl) ;how does this enemy move?
- bit 7,a ;direction indicator
- jr nz,moveright
-moveleft:
- dec d
- jr moveXdone
-moveright:
- inc d
-moveXdone:
- res 7,a ;01111111=movetype:
and a
- ret z ;0 = don't move
- dec a
- jr z,movetype_updown ;1 = 0 >< up / down
- dec a
- jr z,movetype_vslow ;2 = .75 >>
- dec a
- jr z,movetype_slow ;3 = .5 >>
- dec a
- jr z,movetype_fast ;4 = .5 <<
- dec a
- jr z,movetype_vfast ;5 = 1 <<
- dec a
- jr z,movetype_smart ;6
- dec a
- jr z,movetype_lure ;7 = 1 >> move y towards you
- dec a
- jr z,movetype_slowlure ;8 = 1 >> lure 1/2 speed
- dec a
-; jr z,movetype_stoplure ;9 = 1 >> slowlure; stop at x=99
-; dec a
-; jr z,movetype_fulllure ;10 = x+y towards you 1/2 speed
+ ret z ;0 = (1<)
+ ld b,a
+ ld a,(timer)
+ dec b
+ jr z,movetype_updown ;1 = (1<) up / down
+ dec b
+ jr z,movetype_vslow ;2 = (.25<)
+ dec b
+ jr z,movetype_slow ;3 = (.5 <)
+ dec b
+ jr z,movetype_lslow ;4 = (.75<)
+ dec b
+ jr z,movetype_fast ;5 = (1.5<)
+ dec b
+ jr z,movetype_vfast ;6 = (2 <)
+ dec b
+ jr z,movetype_slowlure ;7 = (1<) move y towards you 50%
+
+ inc d ;speed 0
+ dec b
+ jr z,movetype_lure ;8 = (0) move y towards you
+ dec b
+ jr z,movetype_slowlure ;9 = (0) lure 1/2 speed
+ dec b
+ jr z,movetype_fulllure ;10 = x+y towards you 1/2 speed
+ dec b
+ jr z,movetype_right ;11 = (.5>)
+ dec b
+ jr z,movetype_fright ;12 = (1>)
+
+movetype_right:
+ rra
+ ret c ;speed 0 50%
+movetype_fright:
+ inc d ;move right one px
+ ret
movetype_fulllure:
- ld a,(timer)
- and 1
- ret z
+ rra
+ ret c ;50% speed
cal movetype_lure
ld a,(x)
cp d
- ret c ;move left (already did)
+ jr c,movetype_vfast ;moves left (again)
lure_right:
- inc d ;already moved left, so move right
-moverightonce:
- inc d ;twice (=+1)
+ inc d ;move right
ret
movetype_slowlure:
- ld a,(timer)
- and 1 ;half the time
- jr z,moverightonce ;dont move at all (compensate move left +ret)
+ rra ;half the time
+ ret c
movetype_lure:
- ld a,104
+ ld a,110
cp d
- jr c,dothelurethingy
- inc d ;x<106: full stop
+ jr nc,dothelurethingy
+ dec d ;x>109: move left
dothelurethingy:
ld a,(y)
cp e
- ret z ;don't move if equal
+ ret z ;don't move vertically if equal
jr c,lure_up ;below you then move up
lure_down: ;above then move down
inc e
ret
-lure_up:
- dec e
+lure_up:dec e
ret
movetype_smart:
- inc hl ;hl =@ <move>
- ld a,(timer)
- and %1111 ; |
- ld a,(hl) ;&&& \|/
- jr nz,smartupdate
+ inc hl ;@movecount
+ ld a,(hl)
inc a
-smartupdate:
+ and %1111
ld (hl),a
or a ;reset carry flag
and %11111100
jr z,movetype_fast
+movetype_lslow:
+ and %11
+ ret nz
+ inc d ;don't move 25% of the time
+ ret
movetype_slow:
- ld a,(timer)
- and %1
- ret z
+ rra
+ ret c
+ inc d ;don't move 50%
+ ret
movetype_vslow:
- ld a,(timer)
and %11
ret z
- inc d
+ inc d ;don't move 75%
ret
movetype_fast:
- ld a,(timer)
- and %1
- ret z
+ rra
+ ret c ;once every other turn
movetype_vfast:
- dec d ;move left
- ret nz ;finished
- pop hl ;restore stack (no ret used)
- jp remove_enemy ;remove this enemy (off screen)
+ dec d ;move left twice
+ ret
movetype_updown:
- inc hl ;@ <move>
+ inc hl ;@movecount
ld a,(hl)
dec a
- jr nz,move_updated
- add a,128
-move_updated:
- ld (hl),a
-
- or a ;reset carry flag
- dec hl ;@ <y>
- and %00100000
- ld a,(hl);&&&ld a,e ;load current y-position
+ and 127 ;range 0..127
+ ld (hl),a ;store new movecounter
+ dec hl ;reset hl to @movetype
+ and %00100000 ;ZF changes once every 64 turns
+ ld a,e ;load current y-position
jr z,movedown
-
moveup: dec a ;decrease y-pos (=move up)
ret m ;don't move off the screen (y<0)
dec e ;save new y-pos
ld hl,(x) ;e = X, d = Y
ld de,$0707 ;add 7 to both d and e
add hl,de
- ld d,h
- ld e,l ;e = X+7, d = Y+7
+ ex de,hl ;e = X+7, d = Y+7
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
;--------------------------- story ------------------------------------------
storyPage:
- psh hl
- cal _clrLCD
+ psh hl ;hl will be destroyed by _clrLCD
+ cal _clrLCD ;clear screen
pop hl
+ ld a,(hl)
+ ld (curline),a ;begin line for special effect
storyLine:
+ ld d,(hl) ;vertical position of text
inc hl
- ld e,(hl)
- inc hl
- ld d,(hl)
- ld (_penCol),de
+ ld e,(hl) ;horizontal text-position
+ ld (_penCol),de ;set position
inc hl
- cal _vputs
+ cal _vputs ;display text
- ld a,(hl)
- dec a
- jr z,storyLine
+ ld a,(hl) ;load next byte
+ inc hl
+ or a ;0 means more text
+ jr z,storyLine ;loop if there is
+ psh af
psh hl
ld hl,VIDEO_MEM ;copy text
ld de,dispbuffer ;to GRAPH_MEM
ld bc,1024 ;entire screen
ldir
- cal _clrLCD
+ cal _clrLCD ;clear VIDEO_MEM
pop hl
-
- inc hl
- ld a,(hl)
- inc hl
- ld b,(hl)
+ pop bc ;last byte (<>0) is lines to SFX
psh hl
- cal DoSFX
- cal _getkey
+ cal DoSFX ;do special effects
+ cal getsomekeys ;wait for a key
pop hl
ret
dostory:
cal storyPage ;do some story
- inc hl ;look at next hl
- ld a,(hl) ;load in a
- dec hl ;restory hl
+ ld a,(hl) ;load next byte in a
inc a ;set z-flag if a = $ff
jr nz,dostory ;otherwise loop
-
- ld bc,2+1 ;story ends
- add hl,bc ;set hl to beginning of the level
+ inc hl
+ inc hl ;set hl to beginning of the level
ld (levelp),hl ;set the level-pointer
ret ;and return
;--------------------------- SFX --------------------------------------------
-DoSFX: ;in:a=beginLine;b=nrOfLines
- ld (curline),a
-SFXframe:
+DoSFX: ;in:(curline)=beginLine;b=nrOfLines
+SFXloop:
psh bc
ld a,0 ;get line number
curline =$-1
inc a ;go to the next line
ld (curline),a ;update
-
ld l,a
ld h,0 ;hl=a
add hl,hl
add hl,hl
add hl,hl
add hl,hl ;*16 (a pixels down=a*16)
+ sub 64 ;a=a-64
+ neg ;a=64-a (lines from bottom)
ld b,h ;save hl for later
ld c,l
-
ld de,VIDEO_MEM ;where to put sfx
add hl,de ;go to ymin
ex de,hl ;put into de again
-
- ld hl,dispbuffer
- add hl,bc ;hl->logo
-
- sub 64 ;a=a-64
- neg ;a=64-a (lines from bottom)
-
-; ld c,a ;c=a=(curline)
-; ld a,64
-; sub c ;lines from bottom
+ ld hl,dispbuffer ;source of original
+ add hl,bc ;hl->source
SFXdisp: ;display this frame on screen
ld bc,16 ;one line (=16 bytes, you'd know by now)
dnz SFXdelay ;8x
pop bc ;counter
- dnz SFXframe
- 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
-
-disp_charge:
- ld hl,(59*16)+VIDEO_MEM+3
- ld b,3
-chargebarclr:
- dec hl
- ld (hl),0
- dnz chargebarclr
-
- ld a,(weapincs) ;load bar size (0-80)
- srl a ;half the size (0-40)
- srl a ;again half that size (0-20 pixels)
- 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,nochargebar ;if a=0 then it would loop 256x so skip it
- ld b,a ;loop b=a times
-chargebar: ;starting at ($39*16)+VIDEO_MEM
- ld (hl),%11111111 ;draw a piece of the bar
- inc hl ;next position
- dnz chargebar ;loop it b times
-nochargebar:
- ld a,c ;pop a
- and %111 ;display last bits of chargebar
- ret z ;if armor=0 then bit = %00000000 (don't disp)
- ld b,a ;into B
- xor a ;bit = %00000000
-chargebarbit:
- scf ;set carry flag
- rra ;rotates A right and sets bit 7 (c-flag)
- dnz chargebarbit ;repeat B times (so if B=6 then a=%11111100)
-chargebarready: ; (an if B=3 then a=%11100000)
- ld (hl),a ;draw this last byte
+ dnz SFXloop
ret
;--------------------------- proc -------------------------------------------
set 3,(iy+5) ;set white on black
ret
+getsomekeys:
+ halt ;wait a li'l while and save batteries :P
+ halt
+ cal GET_KEY ;input keys
+ or a
+ jr z,getsomekeys ;wait if none
+ cp K_SECOND ;2nd pressed?
+ ret z ;then return with zf set
+ cp K_ENTER ;enter pressed
+ ret ;then return with zf set, otherwise zf reset
+
releasekeys:
halt
ld a,%10000000 ;all key-masks
in a,(1)
inc a ;cp %11111111 (no keys pressed)
jr nz,releasekeys ;keep waitin
- cal GET_KEY ;clear buffer
- ret
+ 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 ;b=0; bc=c=a=type
+ add hl,bc ;hl = enm#0 + type*1
add a,a ;a=type*2
- add a,a ;a=type*4
- add a,a ;a=type*8
- ld c,a ;b=0; c=bc=type*8
- add hl,bc ;hl = enemy specs
- ret
+ 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
+ ret ;hl = enemy specs
;--------------------------- game over / new game / death -------------------
chartable:
ld hl,_curCol
dec (hl)
nokeypressed:
- halt \ halt
- cal GET_KEY
+ cal getsomekeys
+ jr z,nomore
or a
jr z,nokeypressed
cp K_DEL
jr z,backup
- cp K_ENTER
- jr z,nomore
cp K_EXIT
jr z,nomore
add hl,de
dnz restore_line
- cal _getkey ;wait for keypress
+ cal getsomekeys ;wait for keypress
jp quit ;restore some things and return to TI-OS/shell
invship: ;procedure used in New_game
psh bc
cal invship
selectshiploop:
- halt
- cal GET_KEY
- or a
- jr z,selectshiploop
+ cal getsomekeys
pop bc
+ jr z,startthenewgame ;enter/2nd
psh bc
cal invship
pop bc
- cp K_SECOND
- jr z,startthenewgame
- cp K_ENTER
- jr z,startthenewgame
cp K_DOWN
jr nz,selnotdown
inc b
ld hl,spr_ship01-(spr_ship02-spr_ship01)
ld de,spr_ship02-spr_ship01
inc b ;your ship #0-3++
+ ld a,b ;ship #1-4
searchyourship:
add hl,de ;next ship
dnz searchyourship
ld (your_ship),hl
+ and 1 ;gives: 1,0,1,0 for the ships
+ inc a ;1 or 2
+ ld (your_extramode),a ;sets tail beam or up double (1 or 2)
xor a ;ld a,0
ld (your_score),a ;reset score
ld (your_score+1),a ;reset score (0)
- ld (your_tail),a ;no tail beam
+ ld (your_extra),a ;no extra beam
ld (your_weapon),a ;no laser
ld (your_pickup),a ;reset pickups
ld (your_multiples),a ;no multiples
inc a ;ld a,1
ld (level),a ;reset level nr (#1)
- ld hl,level00 ;set level pointer to level#1
+ ld hl,levelstart ;set level pointer to level#1
ld (levelp),hl ;reset level pointer
ld a,4
ld (your_lives),a ;3 lives (4 will be decreased @ You_die)
jp z,game_over ;and game's over
jr samelevel
+gamedone:
+ cal dostory ;display end (hl=(levelp))
+ ld hl,250
+ cal scoreInc ;game complete bonus: 250
+ jp game_over ;game over (+hiscore)
+
;--------------------------- next level -------------------------------------
Next_level: ;stack must be +1
pop hl
cal inc_armor ;increase armor
- ld hl,level ;level number
- ld a,(hl)
- inc a
- ld (hl),a
+
+ ld hl,(levelp) ;level pointer
+ ld b,0 ;advance one level
+ ld c,(hl)
+ add hl,bc ;passed the enemies
+ ld c,10
+ add hl,bc ;update to point to next level
+ ld (levelp),hl ;save
+
+ ld a,(level) ;level number
+ inc a ;next level #
+ cp endlevel+1 ;last level done?
+ jr nc,gamedone ;yes: display end story and quit
+ ld (level),a
add a,a
add a,a
add hl,bc ;plus 20
cal scoreInc ;update score
- ld hl,(levelp) ;level pointer
- ld b,0 ;advance one level
- ld c,(hl)
- add hl,bc ;passed the enemies
- ld c,1+7+32+3
- add hl,bc ;update to point to next level
- ld (levelp),hl ;save
-
samelevel:
ld hl,(your_ship)
ld (your_shipspr),hl
ld (nextevent),a ;time to first enemy appearance
ld hl,(levelp) ;level pointer
- xor a
+ dec hl ;byte before level (boss byte)
+ xor a ;if it's zero it means here's a story
cp (hl)
- cal z,dostory
+ inc hl ;begin of level
+ cal z,dostory ;do the story and set (levelp) to real level
ld a,(hl) ;number of (different) enemies in this level
inc hl
ld a,(hl) ;load nr of enemies in this level
ld (eventleft),a ;set nr of events left
inc hl
- ld a,(hl)
- ld (level_info),a ;
- inc hl
- ld a,(hl) ;movement of enemies in this level
- ld (level_move),a ;do it
-
- inc hl
- ld de,spacespace
- ld c,17+17+2 ;b=0
- ldir
+ ld de,level_info
+ ld c,5 ;5xLDI: loads (level_info) (spacespace)
+ ldir ; (groundinfo) (stars1) (stars2)
+ ld a,1
+ ld b,32 ;fill (groundpos) and (ceilingpos)
+fillground:
+ ld (de),a
+ inc de
+ dnz fillground
ld ix,starx1
ld b,nrstars1
ld (timer),a ;reset time
ld hl,your_occ ;hl = your_occ
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
+ inc hl ;hl = your_shield
+ ld (hl),25 ;set 25*4=100 frames shielded
+ ld de,$1820
ld (x),de ;begin position (x,y)
cal Place_multiples ;place all multiple-positions at that (0,24)
cal _vputs
res 3,(iy+5) ;set white on black
- cal _getkey ;wait for keypress
- cp kF1
+ cal getsomekeys ;wait for keypress
+ cp K_F1
cal z,save_lvl
cal _clrLCD ;clear screen
inc hl
ld a,(hl)
ld (weapdaminc),a ;damage increase
+ inc hl
+ ld a,(hl)
+ and %00011111 ;laser duration
+ ld (laserdur),a
ret
;----------------------------------------------------------------------------
.db %11000010 ;██ █
spr_ship02:
- .db 7,7 ;ship beta class
- .db %11100000 ;███
- .db %11111000 ;█████
- .db %01111100 ; █████
- .db %01110010 ; ███ █
- .db %01111100 ; █████
- .db %11111000 ;█████
- .db %11100000 ;███
+ .db 7,7 ;XC1701II ship
+ .db %11110000 ;████
+ .db %10001100 ;█ ██
+ .db %11110010 ;████ █
+ .db %01011110 ; █ ████
+ .db %11110010 ;████ █
+ .db %10001100 ;█ ██
+ .db %11110000 ;████
spr_ship02i:
- .db 8,7
- .db %11100010 ;███ █
- .db %11111001 ;█████ █
- .db %01111101 ; █████ █
- .db %01110011 ; ███ ██
- .db %01111101 ; █████ █
- .db %11111001 ;█████ █
- .db %11100010 ;███ █
+ .db 7,7
+ .db %11110000 ;████
+ .db %10011100 ;█ ███
+ .db %11111110 ;███████
+ .db %01011110 ; █ ████
+ .db %11111110 ;███████
+ .db %10011100 ;█ ███
+ .db %11110000 ;████
spr_ship03:
.db 7,7 ;ship gamma class
.db %11110001 ; ████ █
.db %11000010 ; ██ █
+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 ;███ █
+
+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 --------------------------------
;--------------------------------- bullets ----------------------------------
+bullettable:
+ .db (spr_bullet01-spr_bullet01) ;0
+ .db (spr_bullet02-spr_bullet01) ;4
+ .db (spr_bullet03-spr_bullet01) ;8
+ .db (spr_bullet04-spr_bullet01) ;12
+ .db (spr_bullet05-spr_bullet01) ;16
+ .db (spr_bullet06-spr_bullet01) ;20
+ .db (spr_bullet07-spr_bullet01) ;24
+ .db (spr_bullet08-spr_bullet01) ;28
+ .db (spr_bullet09-spr_bullet01) ;32
+ .db (spr_bullet10-spr_bullet01) ;36
+ .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
.db %11000000 ;▒██
.db %11000000 ;▒██
.db %11000000 ;▒██
spr_bullet04:
- .db 3,2
- .db %11100000 ;▒███
- .db %11100000 ;▒███
+ .db 4,2
+ .db %10110000 ;▒█▒██
+ .db %10110000 ;▒█▒██
spr_bullet05:
.db 4,3
.db %01100000 ; ▒██
.db %01111111 ; ▒███████
.db %11111110 ;▒███████
.db %00111100 ; ▒████
+
spr_bullett1:
.db 4,3 ;▒▒▒
.db %11100000 ;▒███
.db %11110000 ;████▒
.db %01100000 ; ██▒
-bullettable:
- .db (spr_bullet01-spr_bullet01) ;0
- .db (spr_bullet02-spr_bullet01) ;4
- .db (spr_bullet03-spr_bullet01) ;8
- .db (spr_bullet04-spr_bullet01) ;12
- .db (spr_bullet05-spr_bullet01) ;16
- .db (spr_bullet06-spr_bullet01) ;20
- .db (spr_bullet07-spr_bullet01) ;24
- .db (spr_bullet08-spr_bullet01) ;28
- .db (spr_bullet09-spr_bullet01) ;32
- .db (spr_bullet10-spr_bullet01) ;36
- .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
-
;format:[min.damage] [dam.inc] [000:direction 00000:speed] [offset]
;damage = min.damage + dam.inc*incs (0<=incs<=6)
;speed in pixels/frame (>=%10010=forward; <=%01110=backwards)
-;direction: 0=straight forward; 1=up; 2=1/2up; 3=down; 4=1/2down
+;direction: 001=straight forward; 010=up; 011=1/2up; 100=down; 101=1/2down
+; 111=laser (speed=duration 00010-00000)
-maxnrweapons = 8+1
weapondata:
- .db 1,1,%00000000,0,%00000000,0,%00010010,3 ;1 single fire
- .db 4,1,%00000000,0,%00000000,0,%00010011,3 ;2 fast single
- .db 1,1,%00000000,0,%00010010,0,%00010010,6 ;3 double
- .db 1,1,%01110010,2,%10010010,2,%00110010,2 ;4 triple
- .db 3,2,%01110011,2,%10010011,2,%00110011,2 ;5
- .db 5,3,%01110011,2,%10010100,2,%00110011,2 ;6
- .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
-maxlaser = 11
-
-collidedamage = 4
+ .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
+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
+maxlaser = 18
+tailbeam = %00101101 ;180 degrees
+doublebeam = %01010010 ;45 degrees
+extrabulletpos:
+ .db 3 ;tail/double yposition
;------------------------------------ bar -----------------------------------
.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 ;shield .......:.......:
+ .db %10001111 ;█ ███████ █ ▒
+ .db %10011001 ;█ ██ █████ █ ▒
+ .db %10111100 ;█ ████ ████ █ ▒
+ .db %10111000 ;█ ███ █ ██ █ ▒
+ .db %10111100 ;█ ████ ████ █ ▒
+ .db %10011001 ;█ ██ █████ █ ▒
+ .db %10001111 ;█ ███████ █ ▒
.db 7
- .db %11110000
- .db %00001100
- .db %11000110
- .db %11100110
- .db %11000110
- .db %00001100
- .db %11110000
-spr_icon02:
+ .db %11100100
+ .db %11110010
+ .db %01111010
+ .db %10011010
+ .db %01111010
+ .db %11110010
+ .db %11100100
+spr_icon02a:
.db 16,7 ;tailbeam.......:.......:
.db %10000000 ;█ ▒
.db %10000011 ;█ ██ ▒
.db %10000001 ;█ ███ ▒
- .db %10111011 ;█ ███ ██████ ██▒
+ .db %10111011 ;█ ███ ███ ██ ██▒
.db %10000001 ;█ ███ ▒
.db %10000011 ;█ ██ ▒
.db %10000000 ;█ ▒
- .db 7
+ .db 5
.db %00000000
.db %00000000
.db %11000000
- .db %11110011
+ .db %10110011
.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
+ .db 16,7 ;updouble.......:.......:
+ .db %10000000 ;█ ██ ▒
+ .db %10000000 ;█ ██ ▒
+ .db %10110000 ;█ ██ ██ ▒
+ .db %10011100 ;█ ███ ▒
+ .db %10111011 ;█ ███ ██ ████ ▒
+ .db %10011100 ;█ ███ ▒
+ .db %10110000 ;█ ██ ▒
+ .db 5
+ .db %00011000
+ .db %00110000
+ .db %01100000
+ .db %00000000
+ .db %00011110
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.98.79 ",127," by Shiar",0 ;right behind txt_email
-_txt_about = $3321
+_txt_email = $3A01 ;$3A1E=just email
+txt_about: .db "v0.99.820 ",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
storehi_start:
hiscore .dw 0 ;default hiscore
-hiname .db "shiar.98",0 ; " " name
+hiname .db "shiar.99",0 ; " " name
storehi_end:
storesave_start: ;--SAVED GAME-- defs:
-level .db 1 ;level number 1
-levelp .dw level01 ;pointer to level data l01
+level .db 10 ;level number 1
+levelp .dw level09 ;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_occ .db 0 ;0=normal 1..16=exploding 0
-your_inv .db 0 ;invincibility left 0
+your_shield .db 0 ;invincibility left 0
your_armor .db 12 ;HP left 12
your_lives .db 3 ;lives left 3
-your_weapon .db 0 ;current weapon upgrade 0
+your_weapon .db 3 ;current weapon upgrade 0
your_multiples .db 0 ;multiples present 0
-your_tail .db 0 ;tail beam present 0
+your_extra .db 0 ;extra beam present 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]
-; [level_info: 0000:damage 0:diagfire 0:ground 0:ceiling 0:?]
-; [level_move] [tunnel size] [groundtype]
-; [16_ground] [16_ceiling] [stars1] [stars2]
+; [min. enemy frequency] [enemy frequency max.inc]
+; [next lvl (=nrenemies+4)] [level_info: 1:ceiling 1:ground]
+; [tunnel size] [groundtype] [stars1] [stars2]
;efrequency must be odd if halfluring!
-level00:
- .db 0 ;story identifier
- .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06
- .db $1b,$1d,"STORYLINE COMING SOON" ,0,0,$1d,$06
- .db $09,$19,"STORYLINE COMING SOON" ,0,1
- .db $2e,$21,"**** NEMESIS 86" ,0,1
- .db $52,$36,"by Shiar" ,0,0,$19,$23
- .db $ff ;story end
-
- .db 20 ;boss for level01
-level01: ;intro-like, just a few enemies to begin with
- .db 2,6,8
- .db 26,70,20,%00010000,0,0,0
- .db 1,2,3,4,5,6,6,5,4,3,4,5,4,5,6,5
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 21
-level02: ;first wave of enemies; easeey
- .db 3,6,7,8
- .db 20,60,60,%00100000,0,0,0
- .db 1,2,3,4,5,6,6,5,4,3,4,5,4,5,6,5
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 22
-level03: ;some more enemies
- .db 4,7,8,9,10
- .db 17,40,75,%00110000,0,0,0
- .db 1,2,3,4,5,6,6,5,4,3,4,5,4,5,6,5
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 0,0 ;storyline ID
- .db 1,1,"Long-Range scanners are ",
- .db "showing",0,1
- .db 1,8,"lots of enemy vessels on ",
- .db "an intercept",0,1
- .db 1,15,"course.",0,1
- .db 1,24,"I'm changing course to a",
- .db " nearby ",0,1
- .db 1,31,"asteroid belt and try to",0,1
- .db 1,38,"lose them inthere.",0,0
- .db 1,38+5,$FF
-
- .db 23
-level04: ;light asteroid belt
- .db 3,1,2,4
- .db 12,24,80,%00111000
- .db 2,0,0
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 24
-level05: ;inside asteroid belt
- .db 5,1,2,3,4,5
- .db 6,10,180,%01011000
- .db 2,0,0
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 25
-level02a:
- .db 3,4,5,6
- .db 30,1,40,%01000000
- .db 0,0,0
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
+ .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 0
+ .db 9
+level00:.db 5,2,4,2,1,1
+ .db 28,73,13
+ .db %00,0,0,1,1
- .db 0
- .db $01,01,"And the storyline conti",
- .db "nues.....",0,1
- .db $01,09,"You decide to fly close",
- .db " to the",0,1
- .db $01,15,"surface of a nearby pl",
- .db "anet =)",0,0,1,20
- .db $FF
-
- .db 26
-level03b:
- .db 1,$02
- .db $13,40,$4b,%00100100,0,-5,1
- .db 1,2,3,4,5,6,6,5,4,3,4,5,4,5,6,5
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db 0
+ .db 30 ;boss for level01
+level01:.db 2,2,4 ;enemies
+ .db 26,70,20
+ .db %00,0,0,1,1
+
+ .db 31
+level02:.db 3,2,3,4
+ .db 20,60,60
+ .db %00,0,0,1,1
+
+ .db 32
+level03:.db 4,3,4,5,6
+ .db 17,40,75
+ .db %00,0,0,1,1
.db 0
- .db $01,01,"Blablabla...",0,1
- .db $01,34,"this storyline sux",0,0,1,39
- .db $FF
-
- .db 27
-level03a:
- .db 1,$03
- .db $2d,$3f,%00010110,0,-9,1
- .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20
- .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18
- .db -1,-1 ;=%11111111=line
-
- .db $07,$08
-level04b:
- .db 1,$04
- .db $11,$41,%00100001,0,0,0
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
- .db $07,$09
-level05a:
- .db 1,$05
- .db $11,$45,%00100101,%10,-7,1
- .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2
- .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
- .db $07,$08
-level06c:
- .db 1,$06
- .db $19,$3a,%00100111,0,-4,1
- .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
- .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
-
- .db $07,$09
-level07:
- .db 1,$07
- .db $09,$ff,%00100001,0,0,0
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- .db 1,1
+ .db 1,1,"Long-Range scanners are ",
+ .db "showing",0,0
+ .db 8,1,"lots of enemy vessels ",
+ .db "advancing fast.",0,8-1+6
+ .db 24,1,"I'm changing course to a",
+ .db " nearby ",0,0
+ .db 31,1,"asteroid belt and try to",0,0
+ .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 17,27,70
+ .db %00,0,0,1,1
+
+;---- light asteroid belt
+ .db 34
+level05:.db 7,9,10,8,10,11,11,13
+ .db 12,24,80
+ .db %00,0,0,1,1
+
+;---- inside asteroid belt
+ .db 35
+level06:.db 10,9,10,11,11,13,12,12,13,14,14
+ .db 7,18,180
+ .db %00,0,0,1,1
+
+ .db 36
+level07:.db 4,15,16,17,5
+ .db 22,29,62
+ .db %00,0,0,1,1 ;-1=%11111111=line
+
+ .db 37
+level08:.db 5,15,16,17,18,18
+ .db 20,38,57
+ .db %00,0,0,1,1
+
+ .db 38
+level09:.db 3,18,19,20
+ .db 19,63,57
+ .db %00,0,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
+
+pickupfreq = 18
;------------------------------ 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=8 stop at x=99; 10=x+y-lure 1/2x
-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=jumping bug (up/down)
- .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 ;12
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;13
- .db 0,%00000011,(spr_enemy00-spr_enemy00)/2,1,0,0,0,0 ;14
- .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-22=first bosses
- .db 1,%00101011,(spr_boss0_1-spr_enemy00)/2,127,1,8,20,12 ;20
- .db 1,%00110011,(spr_boss0_1-spr_enemy00)/2,127,1,8,15,10 ;21
- .db 1,%01001011,(spr_boss0_2-spr_enemy00)/2,127,3,9,10,9 ;22
-;23-24=asteroid bosses
- .db 2,%00001011,(spr_boss0_3-spr_enemy00)/2,127,1,10,36,14
- .db 2,%00110011,(spr_boss0_3-spr_enemy00)/2,127,2,10,28,12
-;25-26=big bosses
- .db 2,%00000111,(spr_boss0_4-spr_enemy00)/2,127,3,7,18,7 ;25=bigboss1
- .db 2,%01001011,(spr_boss0_5-spr_enemy00)/2,127,3,7,18,7 ;26=bigboss2
+;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=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
spr_enemy00:
- .db 16,8 ;pickup
- .db %11111111 ; ████████████
- .db %10000110 ; █ ██ █
- .db %10000110 ; █ ██ █
- .db %10111111 ; █ ████████ █
- .db %10111111 ; █ ████████ █
- .db %10000110 ; █ ██ █
- .db %10000110 ; █ ██ █
- .db %11111111 ; ████████████
- .db 8
- .db %11110000
- .db %00010000
- .db %00010000
- .db %11010000
- .db %11010000
- .db %00010000
- .db %00010000
- .db %11110000
- .db 0
+ .db 10,8 ;pickup
+ .db %00111111 ; ██████
+ .db %01100001 ; ██ ██
+ .db %10001100 ;█ ██ █
+ .db %10111111 ;█ ██████ █
+ .db %10111111 ;█ ██████ █
+ .db %10001100 ;█ ██ █
+ .db %01100001 ; ██ ██
+ .db %00111111 ; ██████
+ .db 7
+ .db %00000000
+ .db %10000000
+ .db %01000000
+ .db %01000000
+ .db %01000000
+ .db %01000000
+ .db %10000000
-spr_enemyA1:
- .db 7,6 ;asteroid one
- .db %00011000 ; ██
- .db %01101100 ; ██ ██
- .db %10011110 ;█ ████
- .db %11111010 ;█████ █
- .db %10111100 ;█ ████
- .db %01110000 ; ███
-spr_enemyA2:
- .db 8,7 ;asteroid two
- .db %00111100 ; ████
- .db %01011010 ; █ ██ █
- .db %01101101 ; ██ ██ █
- .db %11111101 ;██████ █
- .db %11111111 ;████████
- .db %10110110 ;█ ██ ██
- .db %01100000 ; ██
+spr_enemyE0:
+ .db 6,7 ;weak
+ .db %00011100 ; ███
+ .db %00100100 ; █ █
+ .db %01101000 ; ██ █
+ .db %10110100 ;█ ██ █
+ .db %01101000 ; ██ █
+ .db %00100100 ; █ █
+ .db %00011100 ; ███
.db 0
-spr_enemyA3:
- .db 8,8 ;asteroid three
- .db %00011110 ; ████
- .db %01110011 ; ███ ██
- .db %01111101 ; █████ █
- .db %10110111 ;█ ██ ███
- .db %11111110 ;███████
- .db %11111101 ;██████ █
- .db %01010111 ; █ █ ███
- .db %00001110 ; ███
-spr_enemyA4:
- .db 7,6 ;asteroid four
- .db %01111000 ; ████
- .db %10110110 ;█ ██ ██
- .db %11111101 ;██████ █
- .db %01111011 ; ████ ██
- .db %01001110 ; █ ███
- .db %00110000 ; ██
-
spr_enemyE1:
.db 6,7 ;weak
.db %00111100 ; ████
spr_enemyE3:
.db 6,6 ;normal solid (Galaxian enemy)
.db %00111100 ; ████
- .db %01110000 ; ███
- .db %11110000 ;████
- .db %11110000 ;████
- .db %01110000 ; ███
+ .db %01010000 ; █ █
+ .db %11010000 ;██ █
+ .db %11010000 ;██ █
+ .db %01010000 ; █ █
.db %00111100 ; ████
spr_enemyE4:
.db 6,7
.db 0
spr_enemyE5:
.db 6,6 ;speedy
- .db %00011100 ; ███
+ .db %00010100 ; █ █
+ .db %01111000 ; ████
+ .db %10100000 ;█ █
+ .db %10100000 ;█ █
.db %01111000 ; ████
+ .db %00010100 ; █ █
+
+spr_enemyB1:
+ .db 6,6 ;solid backwards
+ .db %11110000 ;████
+ .db %00101000 ; █ █
+ .db %01010100 ; █ █ █
+ .db %01010100 ; █ █ █
+ .db %00101000 ; █ █
+ .db %11110000 ;████
+spr_enemyB2:
+ .db 6,7
+ .db %11110000 ;████
+ .db %01001000 ; █ █
+ .db %01110100 ; ███ █
+ .db %00100100 ; █ █
+ .db %01110100 ; ███ █
+ .db %01001000 ; █ █
+ .db %11110000 ;████
+ .db 0
+spr_enemyB3:
+ .db 5,7
.db %11100000 ;███
+ .db %01010000 ; █ █
+ .db %01111000 ; ████
+ .db %01000000 ; █
+ .db %01111000 ; ████
+ .db %01010000 ; █ █
.db %11100000 ;███
+ .db 0
+
+spr_enemyA1:
+ .db 7,6 ;asteroid one
+ .db %00011000 ; ██
+ .db %01101100 ; ██ ██
+ .db %10011110 ;█ ████
+ .db %11111010 ;█████ █
+ .db %10111100 ;█ ████
+ .db %01110000 ; ███
+spr_enemyA2:
+ .db 8,7 ;asteroid two
+ .db %00111100 ; ████
+ .db %01011010 ; █ ██ █
+ .db %01101101 ; ██ ██ █
+ .db %11111101 ;██████ █
+ .db %11111111 ;████████
+ .db %10110110 ;█ ██ ██
+ .db %01100000 ; ██
+ .db 0
+spr_enemyA3:
+ .db 8,8 ;asteroid three
+ .db %00011110 ; ████
+ .db %01110011 ; ███ ██
+ .db %01111101 ; █████ █
+ .db %10110111 ;█ ██ ███
+ .db %11111110 ;███████
+ .db %11111101 ;██████ █
+ .db %01010111 ; █ █ ███
+ .db %00001110 ; ███
+spr_enemyA4:
+ .db 7,6 ;asteroid four
.db %01111000 ; ████
- .db %00011100 ; ███
+ .db %10110110 ;█ ██ ██
+ .db %11111101 ;██████ █
+ .db %01111011 ; ████ ██
+ .db %01001110 ; █ ███
+ .db %00110000 ; ██
spr_enemyG1:
.db 8,6 ;G-Type
- .db %00111111 ; █████
+ .db %00011111 ; █████
.db %01001000 ; █ █
.db %10110100 ;█ ██ █
.db %10110100 ;█ ██ █
.db %01001000 ; █ █
- .db %00111111 ; █████
+ .db %00011111 ; █████
spr_enemyG2:
.db 8,6 ;smaller nacelles
- .db %00000111 ; ███
+ .db %00010111 ; █ ███
.db %01101100 ; ██ ██
.db %10110100 ;█ ██ █
.db %10110100 ;█ ██ █
.db %01101100 ; ██ ██
- .db %00000111 ; ███
+ .db %00010111 ; █ ███
spr_enemyG3:
.db 8,6 ;shuttle
.db %00001111 ; ████
- .db %01111100 ; █████
+ .db %01110100 ; ███ █
.db %10011100 ;█ ███
.db %10011100 ;█ ███
- .db %01111100 ; █████
+ .db %01110100 ; ███ █
.db %00001111 ; ████
spr_enemyG4:
.db 8,6 ;G-Type solid
- .db %00111111 ; █████
+ .db %00111101 ; ███ █
.db %01111000 ; ████
- .db %11111100 ;██████
- .db %11111100 ;██████
+ .db %11110100 ;████ █
+ .db %11110100 ;████ █
.db %01111000 ; ████
- .db %00111111 ; █████
+ .db %00111101 ; ███ █
spr_enemyG5:
- .db 6,6 ;G lost his head; large window ;)
+ .db 6,6
.db %01111100 ; █████
.db %10110000 ;█ ██
- .db %10111000 ;█ ███
- .db %10111000 ;█ ███
+ .db %10101000 ;█ █ █
+ .db %10101000 ;█ █ █
.db %10110000 ;█ ██
.db %01111100 ; █████
spr_enemyG6:
- .db 7,6 ;small G-type
- .db %00011110 ; ████
- .db %01111000 ; ████
- .db %11110000 ;████
- .db %11110000 ;████
- .db %01111000 ; ████
- .db %00011110 ; ████
+ .db 8,5 ;shuttle
+ .db %00001111 ; ████
+ .db %01110100 ; ███ █
+ .db %10011010 ;█ ██ █
+ .db %01110100 ; ███ █
+ .db %00001111 ; ████
+ .db 0
spr_enemyS1:
.db 6,6 ;solid
.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_boss0_1:
- .db 16,10 ;boss type one..:.......:
+spr_boss1:
+ .db 16,10 ;.......:.......:
.db %00000001 ; ██████ ██
.db %00001110 ; ███ █ ███
.db %00110010 ; ██ █ ████
.db %00101110
.db %11111011
.db 0
-spr_boss0_2:
- .db 16,10 ;boss type two..:.......:
+spr_boss2:
+ .db 12,12 ;.......:....5..:
+ .db %00011110 ; ████
+ .db %01100001 ; ██ ██
+ .db %10110010 ;█ ██ █ ██
+ .db %00000101 ; █ ██ █
+ .db %00001010 ; █ █ ██
+ .db %00011010 ; ██ █ █ █
+ .db %00011010 ; ██ █ █ █
+ .db %00001010 ; █ █ ██
+ .db %00000101 ; █ ██ █
+ .db %10110010 ;█ ██ █ ██
+ .db %01100001 ; ██ ██
+ .db %00011110 ; ████
+ .db 11
+ .db %00000000
+ .db %10000000
+ .db %01100000
+ .db %10100000
+ .db %01100000
+ .db %10010000
+ .db %10010000
+ .db %01100000
+ .db %10100000
+ .db %01100000
+ .db %10000000
+spr_boss3:
+ .db 16,10 ;.......:.......:
.db %11111110 ;███████
.db %00000011 ; ███ ████
.db %00110101 ; ██ █ ████ █
.db %01111010 ; ████ █ █ █ ██
- .db %10001101 ;█ ██ █ ██ ██
- .db %10001101 ;█ ██ █ ██ ██
+ .db %10001101 ;█ ██ █ ██ ██ █
+ .db %10001101 ;█ ██ █ ██ ██ █
.db %01111010 ; ████ █ █ █ ██
.db %00110101 ; ██ █ ████ █
.db %00000011 ; ███ ████
.db %10001111
.db %11100001
.db %10010110
- .db %01101100
- .db %01101100
+ .db %01101101
+ .db %01101101
.db %10010110
.db %11100001
.db %10001111
-spr_boss0_3:
- .db 16,11 ;bigasteroid one
+spr_bossA1:
+ .db 16,11 ;AsteroidBoss one
.db %00011110 ; ████
.db %01110011 ; ███ ███
.db %01111111 ; ███████ █
.db %11110000
.db %11000000
.db 0
-spr_boss0_4:
- .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_boss0_5:
- .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.820 -- 20.VIII.00 -- size 6500
;
; + 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)
+; * beamweapon can be selected when you got laser (like vice versa)
+; * selecting laser removes tailbeam or up-double
+; # tail beam/up-double correctly centered
+; # disappearing bullets (when enemies fired multiple bullets) fixed
+; + bullets and lasers both upgradable upto level 9
+; # fixed end story (_vputs didn't recognize 0-end when "'" in string)
+; # stars couldn't be altered anymore since recent levelformat changes
+; * 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
;
; + added - removed * changed # bug fixed