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