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