From 352f2677965e02bff4309511200e457716544951 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Sat, 24 Jun 2000 20:06:12 +0200 Subject: [PATCH] version 0.97 rc2: various fixes # enemies hit with hitpoints left disappeared (one pop too much...) - removed contrast changes # 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) --- nemesis.z80 | 1162 ++++++++++++++++++++++++++------------------------- 1 file changed, 585 insertions(+), 577 deletions(-) diff --git a/nemesis.z80 b/nemesis.z80 index a45c13c..2a6d8ad 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,6 +1,6 @@ -;------------------------------------------------------------------------------ -;---------------------- NEMESIS ----------------------------------------------- -;------------------------------------------------------------------------------ +;---------------------------------------------------------------------------- +;---------------------- NEMESIS --------------------------------------------- +;---------------------------------------------------------------------------- ; Title : Nemesis ; Version : 0.96 @@ -30,6 +30,7 @@ #define psh push ; ^:D #define dnz djnz ;Dec&Jump while NonZero becomes Do w.Non-Zero +;GRAPH_MEM = $C9FA ;display buffer TEXT_MEM = _textShadow ;167 bytes ($A7): C0F9-C1A0 _clrWindow = $4a86 ;a new procedure from AsmStudio86 inc. files _ex_ahl_bde = $45f3 @@ -43,10 +44,8 @@ storepos2 = _asm_exec_ram+6200 ;141 OF 167 ;---------------------- in-game vars ---------------------------------------- just_fired = storepos+2 ; +2 ;counts how long a blast lasts -curline = storepos+2 ; +2 ;used to display SFX menuitem = storepos+2 ; +2 ;used to store menu location hiscorepos = storepos+2 ; +2 -RanPos = storepos+3 ; +3 ;used for making random values timer = storepos+4 ; +4 ;frame counter ;--------YOU x = storepos+5 ; +5 ;your ship's position @@ -126,8 +125,6 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes ;---------------------- init ------------------------------------------------ -level_name: .db 8,"nemesis0" - int_handler: ex af,af' in a,($03) @@ -141,9 +138,8 @@ int_end: init: cal BUSY_OFF ;turns the run-indicator off, obviously cal _clrScrn ;clean the screen xor a ;ld a,0 - ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen + res 2,(iy+13) ;don't scroll the screen cal _flushallmenus ;remove TI menus - ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems. FixKeys: ;fixes some key problems like left+down bug im 1 @@ -176,30 +172,28 @@ AboveLogo: ld (de),a ;clear/n byte inc de ;next dnz AboveLogo ;repeat for the first line - ld bc,16*19 ;logo size ldir ;display one line of logo - ld hl,VIDEO_MEM+(16*$39)+4 ;$39 rows down, 4 cols right (4*8=$20) - ld b,8 ;draw 8x one byte = 8*8 = 64 pixels wide + ld hl,16*$33+VIDEO_MEM ;$33 rows down + ld b,16*7 ;draw black 7 lines ld a,%11111111 ;horizontal line mask underline: ld (hl),a ;draw one piece of the divider-line inc hl ;move right (8 pixels = 1 byte) dnz underline ;repeat - set 3,(iy+5) ;set white on black - ld hl,$3320 ;near the bottom of the screen - ld (_penCol),hl - ld hl,txt_about ;display version and author (yes, that's me!) - cal _vputs ;useful procedure if you want to display somtn - res 3,(iy+5) ;return to default black on white - - ld hl,$3a1e ;below previous stuff + ld hl,_txt_email ;at the very bottom of tha screen ld (_penCol),hl ld hl,txt_email ;hey, my e-mail address so SEND ME SOMETHING!! cal _vputs ;VERY important, so display in small font ?:} + set 3,(iy+5) ;set white on black + ld de,_txt_about ;near the bottom of the screen + ld (_penCol),de ;hl=txt_email++=txt_about + cal _vputs ;display version + me + res 3,(iy+5) ;return to default black on white + dispmenu: ld de,$0304 ld (_curRow),de @@ -241,7 +235,7 @@ menuloop: cp K_DOWN jr z,menuchange cp K_EXIT - jp z,game_over_nopop + jr z,menuexit ld hl,_invert cp K_F1 cal z,undo_invert @@ -252,9 +246,13 @@ menuloop: ld a,(menuitem) dec a - jr nz,startnewgame - cal samelevel - jr game_main_loop + cal nz,New_game + jp samelevel ;game_main_loop + +menuexit: + ld hl,0 + ld (your_score),hl + jp game_over menuchange: ld a,(menuitem) @@ -269,9 +267,6 @@ undo_invert ld (hl),$B7 ;or a ret -startnewgame: - cal New_game - ;---------------------------------------------------------------------------- ;---------------------- game loop ------------------------------------------- ;---------------------------------------------------------------------------- @@ -279,38 +274,27 @@ startnewgame: game_main_loop: ;REPEATS FROM HERE EVERY FRAME ld hl,timer ;update time inc (hl) ;increase by 1 - ld b,(hl) ;new time, save for rand# upd. (no flag change) - jr nz,updaterandom ;continue when new time <> 0 + jr nz,Clear_screen ;continue when new time <> 0 ld hl,1 ;once every 256 frames, increase score by 1 cal scoreInc ;do it -updaterandom: - ld hl,RanPos ;random counter - ld a,r ;add r register to randomize - add a,(hl) ;add previous random value - add a,b ;even more random by adding timer - ld (hl),a ;save even more random value back - Clear_screen: ld hl,GRAPH_MEM ;move from (hl) = top left ld (hl),$00 ;first pixel will be copied all over the screen ld de,GRAPH_MEM+1 ;(de) = next pixel, thus clearing whole screen ld bc,896 ;loop 896 times = (128/8) * (64-8 for scorebar) - ldir ;clear! + ldir ;all clear! ld a,(timer) and %11 jr z,movestarsdone ;don't move stars once every 4 frames - cal movestars1 ;move the stars on the FRONT layer cal movestars2 ;move the distant stars - movestarsdone: ld a,(stars1) ;star positions (the missing byte...) ld b,nrstars1 ;how many stars? now we know. ld hl,starx1 ;points to the position of the stars cal DisplayStars ;display front layer stars - ld a,(stars2) ;weren't you paying attention five lines ago? ld b,nrstars2 ;that many?! whow! ld hl,starx2 ;and there they are @@ -320,21 +304,15 @@ movestarsdone: and %00000110 ;isolate ground&ceiling jr z,game_stuff ;both non-present and %00000010 ;bit representing the presence of any ceiling - cal nz,Handle_ceiling ;scroll the ceiling (if any) - cal Handle_ground ;scroll the ground + cal nz,Handle_ceiling ;scroll the ceiling (if any) +check4collision + cal Handle_ground ;scroll the ground and check if we're dead game_stuff: + cal Handle_Ship ;move you ld a,(your_occ) ;are you 100% OK? or a ;a=0?? jr nz,_gamestuff1 ;then don't check for movements/fires/... - ld a,(level_info) ;the same level info - and %00000110 ;isolate ground&ceiling again - jr z,check_keys ;no ceiling nor ground - and %00000010 ;this bit will tell us if there is a ceiling - cal nz,CheckCeiling ;if there is, check it - cal CheckGround ;check for collision with the ground - check_keys: ld a,%10111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) out (1),a ;ask for them @@ -343,7 +321,7 @@ check_keys: check_exitkey: bit 6,a ;test bit 6 = exit-key = EXIT - jp z,game_over_nopop ; pressed, so be it + jp z,game_over ; pressed, so be it check_morekey: ;another unused label... poor compiler bit 7,a ;test bit 7 = more-key = PAUSE cal z,Pause ;yes, go to pause @@ -373,32 +351,42 @@ check_selkey: cal inc_weapdamage _gamestuff1: - cal Handle_Ship ;move you - cal Handle_bullets ;move your bullets - cal Handle_torp ;move your torpedo - cal Handle_enemies ;move enemies + + cal Handle_bullets ;move your bullets + check for hits cal Enemy_bullets ;move enemy bullets + cal Handle_torp ;the same for your torpedo (assuming u have 1) cal Level_event ;insert enemies cal Display_Screen ;display all - halt ;delay + halt ;delay jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ inc_weapdamage: ld a,0 weapincs =$-1 inc a - cp 31 - ret nc ;return if increased 16 times or more already - ld (weapincs),a + cp 97 ;max. 96 times (=96/16=6 increases) + ret nc ;return if already maxed + ld (weapincs),a ;save new incs - ld b,1 + and %11110000 ;clear last 4 bits so no cf when rotating + ;btw: AND resets cf + rra ;rotate acting as shift (srl a) but just 1B + rra + rra + rra ;increase once just every 16 turns + ld b,a ;times to increase +incthedamage: + add a,1 ;increase damage for one increase +weapdaminc =$-1 + dnz incthedamage ;a=total increase damage + ld b,1 ;minimal damage weapdamage =$-1 - add a,b - - ld (curweapdamage),a + add a,b ;a=total damage + ld (curweapdamage),a ;safe the current damage + cal disp_charge ret ;--------------------------- ground ----------------------------------------- @@ -422,13 +410,13 @@ ground_tunnel: ld (groundpos+15),a ld hl,spacespace - ld a,(RanPos) - ld b,a - bit 1,a - jr z,ground_previous - bit 2,a - jr z,gtunneldown -gtunnelup: + ld bc,$201 ;range=1..3 + cal Random ;a=1-3 + dec a + jr z,ground_previous ;same if a=1 + dec a + jr z,gtunneldown ;down if a=2 +gtunnelup: ;up if a=3 ld a,(hl) or a jr z,ground_previous ;a>=0 (a=0 actually) @@ -453,7 +441,7 @@ newground: ld a,(hl) cp -25 jr nc,Display_ground - ld a,b + ld a,b ;&&&random and %1 ld b,0 jr nz,gtunnelup @@ -484,7 +472,6 @@ groundloopup: ld b,c ;pop b used by groundloopup dnz groundloopright ;loop right for entire screen (16x) pop hl \ pop hl ;restore stack - ret CheckGround: ;check for collision with the ground ld a,(x) @@ -526,13 +513,13 @@ ceiling_tunnel: ld (ceilingpos+15),a ld hl,spacespace - ld a,(RanPos) - ld b,a - bit 4,a - jr z,ceiling_previous - bit 5,a - jr z,ctunnelup -ctunneldown: + ld bc,$201 ;range=1..3 + cal Random ;a=1-3 + dec a + jr z,ceiling_previous ;1:same + dec a + jr z,ctunnelup ;2:up +ctunneldown: ;3:down ld a,(hl) or a jr z,ceiling_previous @@ -588,7 +575,6 @@ ceilingloopdown: ld b,c ;pop b used by groundloopup dnz ceilingloopright ;loop right for entire screen (16x) pop hl \ pop hl ;restore stack - ret CheckCeiling: ;check for collision with the ground ld a,(x) ;your x @@ -648,7 +634,7 @@ movestars_loop: and %00001111 cp 9 ;(GRAPH_MEM&%00001111)-- = $C9FAand15-1 = $A-1 jr nz,newstarok - cal Random5016 + cal RandomY newstarok: ld (ix),l @@ -702,24 +688,23 @@ teacherans: ;--------------------------- exit ------------------------------------------- -quit: - im 1 ;release keyfix procedure - ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling - +quit: im 1 ;release keyfix procedure + set 2,(iy+13) ;set back screen scrolling + xor a + ld (_asapvar+1),a ;next Asm( run will reload the program ld hl,GRAPH_MEM ;graph-screen location ld de,GRAPH_MEM+1 - ld (hl),0 + ld (hl),a ld bc,1024-1 ;do it 1024 times = entire screen ldir - jp _clrWindow ;as _clrLCD but also clears TEXT_MEM (like the ;_clrScrn) AND also executes _homeup and ret ;--------------------------- display ---------------------------------------- Display_Screen: - ld hl,GRAPH_MEM ;from storage (top left) - ld de,VIDEO_MEM ;to screen (top left) + ld hl,GRAPH_MEM ;from buffer (top left) + ld de,VIDEO_MEM ;to real screen (top left) ld c,56 ;display height = 64 bytes (minus 8 for bar) displayloop: ld b,16 ;display width = 16 bytes (16*8bits=256pixels) @@ -735,7 +720,7 @@ _invert: ld hl,$396b ;Display Score ld (_penCol),hl ;bottom right of screen - ld hl,(score) + ld hl,(your_score) _D_HL_DECI: ;------- display 5-digit value ------- ld de,savestr+4 ;savenr saves number string @@ -768,6 +753,7 @@ Handle_Ship: jp z,You_die ;yes = game over ret ;don't display anything +;----move---- ok: ;we are ld a,%01111110 ;get arrow keys out (1),a ;it's cold outside @@ -816,7 +802,7 @@ no_left: jr nc,no_right ld (hl),a no_right: - ld d,(hl) + ld d,(hl) ;d=x inc hl rr b jr c,no_up @@ -825,12 +811,12 @@ no_right: jr c,no_up ;-1 = top of screen ld (hl),a ;save new y -no_up: ld e,(hl) - ld ix,spr_ship01 ;ship sprite +no_up: ld e,(hl) ;e=y + ld ix,spr_ship01 ;normal ship sprite ld hl,your_inv ;invulnerable? ld a,(hl) ;load time in a or a ;is it 0? - jr z,handle_multiples ;yes so ship = normal (display \ continue) + jr z,disp_ship ;yes so ship = normal (display \ continue) ld a,(timer) ;load frame nr. and %00000111 ;a=0 once every four frames @@ -838,26 +824,29 @@ no_up: ld e,(hl) dec (hl) ;decrease inv-time left not_time: and %00000100 ;a switches 0<->1 every 2 frames - jr z,handle_multiples ;show normal ship + jr z,disp_ship ;show normal ship inv_flicker: - ld ix,spr_ship01i ;don't display ship - -handle_multiples: + ld ix,spr_ship01i ;display invulnerable ship +disp_ship: + psh de ;save your position for multiples cal putsprite ;display your ship + pop de +;----multiples---- + +handle_multiples: ld a,(your_multiples) ;do you have multiples ld b,a ;save a for 2nd check and %11 ;no? (last two bits = nr of multiples) ret z ;then don't handle them either - ld hl,y ld a,b ;restore a (your_multiples) - and %100 ;move the multiples??? - jr z,mult_adv ;nope, just let them (saves (y) in y, (x) in x) + and %100 ;move the multiples??? (=move bit set?) + jr z,mult_adv ;nope, just let them (saves (y)in y, (x)in x) ld hl,your_locpos ;location to save this position ld a,(hl) ;load a - inc a ;a=a+1 + inc a ;a=a+1 (next position) and %00001111 ;if a>15 then a=a-16 ld (hl),a ;save new a add a,a ;a=a*2 @@ -866,41 +855,41 @@ handle_multiples: ld hl,your_prevpos ;previous positions add hl,bc ;16 turns ago - ld d,(hl) ;old x-pos + ld b,(hl) ;old x-pos inc hl ;and - ld e,(hl) ;old y-pos - ld (mx),de ;save multiple position in (mx) - - ld a,(y) ;load new y-pos - ld (hl),a ;save it for 16 turns in the future - dec hl ;and - ld a,(x) ;load new x-pos - ld (hl),a ;save that too + ld c,(hl) ;old y-pos + ld (mx),bc ;save multiple position in (mx) + ld (hl),e ;save current pos. for 16 turns into the future + dec hl ;yes... + ld (hl),d ;...both mult_adv: - ld de,(mx) + ld de,(mx) ld ix,spr_multiple ;sprite of the multiple jp putsprite ;display it + +;----explode---- + exploding_you: srl a ;half the framerate dec a ;first frame is 1>inc>srl>dec = 0 ld hl,x-1 -explosion_stuff: - rra - add a,a - add a,a +explosion_stuff: ;in:a=frame*2+(0 to 1); (hl)=xpos-- + and %11111110 add a,a + add a,a ;frame*8 ld c,a - ld b,0 - ld ix,spr_explosion - add ix,bc + ld b,0 ;bc=a + ld ix,spr_explosion ;base sprite + add ix,bc ;go to correct sprite (each spr. is 8 bytes) inc hl - ld d,(hl) + ld d,(hl) ;load xpos inc hl - ld e,(hl) - jp putsprite + ld e,(hl) ;and y + jp putsprite ;and display it too + +;----hit---- damage_you: ;damages you B points ld a,(your_inv) ;invulnerability left? @@ -927,10 +916,9 @@ damage_you: ;damages you B points ld (PutWhere),hl pop ix \ pop de ret ;and return - no_armor: ld a,%01 ;occ %xxxxxx01 = explode - ld (your_occ),a ;set to explode + ld (your_occ),a ;too bad, you're dead meat ret ;------------------------- place multiples ---------------------------------- @@ -1051,15 +1039,11 @@ fireany: inc ix inc ix ld c,(ix) - xor a - cp c - cal nz,fire_ybullet + cal fire_ybullet inc ix inc ix ld c,(ix) - xor a - cp c - cal nz,fire_ybullet + cal fire_ybullet ret fire_torp: @@ -1072,6 +1056,7 @@ fire_torp: ld (torp_pos),de ;save torpedo position (in de) ret +;-----fire LASER----- fire_laser: ;yes, fire that laser instead ld a,(firex) ;a = your x-pos @@ -1097,7 +1082,6 @@ fire_laser: ;yes, fire that laser instead inc b ;a>255 so increase bc by 256 _nolc: ld c,a ;c = (Y*16+X/8) mod 256 add hl,bc ;bc = Y*16+X/8 - ld a,15 ;128/8=16=screen width ** minus one (inc a ^^) sub d ;minus x-start (d=X/8) ld b,a @@ -1105,11 +1089,6 @@ drawlaser: ld (hl),%11111111 inc hl ;Go to next byte dnz drawlaser - -; ld a,(just_fired) ;fired for how long -; cp 4 ;if 4th turn -; ret nz ;then do damage, otherwise quit - handle_laser: ld a,(firex) ld d,a ;d was divided, so reload the laser-x @@ -1117,32 +1096,30 @@ handle_laser: check_laserhits: ;de = (x,y) ld b,nrenemies ld hl,enemies+1 - laserhits: ;Hits with normal enemies psh hl - ld a,(hl) and %00000010 jr z,nolashit ;no hit when enemy_occ <> 2/3 - inc hl ;enemy type ld a,(hl) or a ;enemy #0 = pickup jr z,nolashit ;yes: don't destroy - inc hl ld a,(hl) ;check x sub d jp m,nolashit ;no hit when enemy is left of you - inc hl ld a,(hl) ;check y sub e jr z,enemy_lashit ;a-e=0 = laser on top line of enemy = hit jr nc,nolashit ;a-e>0 = enemy above laser = no hit - add a,5 ;add enemy height - jp p,enemy_lashit ;a-e>0 = hit - + add a,5 ;add enemy height&&& + jp m,nolashit ;a-e>0 = hit +enemy_lashit: + ld a,1 ;damage + cal enemy_hit + jr nolashit nolashit: pop hl ld a,b ;psh bc @@ -1152,10 +1129,7 @@ nolashit: dnz laserhits ;check all enemies ret -enemy_lashit: ;&&&before nolashit - ld a,1 ;damage - cal enemy_hit - jr nolashit +;-----fire BULLET----- fire_ybullet: ld hl,ybullets @@ -1171,6 +1145,9 @@ find_ybullet: ret ;so ret twice found_ybullet: + xor a + cp c + ret z ld (hl),c ;use the bullet and set correct bullet-type inc hl ;@damage ld (hl),1 ;set bullet damage @@ -1270,20 +1247,23 @@ display_bullet: ld hl,XLbullettable ;pointer to first bullet srl a srl a ;per 4 - inc a ;must be at least 1 -nextbulletlook: - inc hl ;next bullet sprite pointer - dec a ;for each 4 points of damage - jr nz,nextbulletlook - ld d,a ;ld d,0 - ld a,(hl) ;load pointer offset - ld e,a ;convert to 16bit + ld d,0 + ld e,a ;->16bit (de=a) + add hl,de ;point to correct bullet offset + ld a,(hl) ;load bullet offset + ld e,a ;convert to 16bit (d=0) ld ix,spr_bullet01 ;first sprite add ix,de ;add offset (go to correct sprite) pop de ;saved position + + ld a,(ix) ;bullet x-size + ld (bulletxsize),a ;used at check_bullethits + ld a,(ix+1) ;bullet y-size... + ld (bulletysize),a ;...too + psh de ;but will be altered so save again cal putsprite ;display bullet - pop de + pop de ;position (used for check_bullethits) cal check_bullethits @@ -1316,28 +1296,31 @@ hit_enemies: ;Hits with normal enemies or a ;enemy #0 = pickup jr z,nohit ;yes: don't destroy - psh de - cal find_sprite - pop de + cal find_sprite ;set ix to the sprite of this enemy - inc hl + inc hl ;@x ld a,(hl) ;check x - sub d - sub 5 - jp p,nohit - add a,5 - add a,(ix) - jp m,nohit + sub d ;minus bullet x-position + ld b,a ;psh a + sub 5 ;minus bullet x-size +bulletxsize =$-1 + jp p,nohit ;miss + ld a,b ;pop a + add a,(ix) ;add enemy width + jp m,nohit ;miss - inc hl + inc hl ;@y ld a,(hl) ;check y - sub e - sub 3 - jp p,nohit - add a,3 - add a,(ix+1) - jp m,nohit - + sub e ;minus bullet y-position + ld b,a ;psh a + sub 3 ;substract bullet height +bulletysize =$-1 + jp p,nohit ;nope, missed it + ld a,b ;pop a + add a,(ix+1) ;add enemy height + jp m,nohit ;missed after all + + ;---bullet hits enemy (auch-time!)--- psh hl ld hl,0 ;@bulletType temp1 =$-2 @@ -1351,10 +1334,10 @@ nohit: ld bc,enemysize add hl,bc pop bc - dnz hit_enemies ;check next enemy + dnz hit_enemies ;check next enemy ret -enemy_hit: ;in:a=damage;hl=enemy+y +enemy_hit: ;*in:a=damage;hl=enemy+y add a,a ;a=damage to inflict add a,a ;first 2 bits used for occ. ld b,a @@ -1510,9 +1493,7 @@ place_enemy: ld (de),a ;save enemy type inc de ;set x-pos - psh de cal find_sprite - pop de ld a,128 ;appear at right edge of screen sub (ix) ;minus the width of this enemy (not offscreen) ld (de),a ;= x-position (save) @@ -1532,11 +1513,11 @@ halflure_enemy: ;yes (of course it is): pick one (50% lure) lure_enemy: ;2nd possibility: luring enemy ld a,(y) ;place at same y-pos as YOUR ship jr ypos_OK - random_enemy: - ld b,e ;b will be added to random-value - cal Random50 ;make a (in a) random value 0-51 - + ld bc,256*51 ;range=0..51 + cal Random +; ld b,e ;b will be added to random-value +; cal Random50 ;make a (in a) random value 0-51 ypos_OK: ;random value successfully created ld (de),a ;save y-position @@ -1783,16 +1764,12 @@ remove_enemy: exploding_enemy: inc hl - psh hl - ld a,(hl) - cal explosion_stuff ;display explosion - pop hl - ld a,(hl) - cp 15 + cp 16 jr z,remove_enemy ;remove when at last frame inc a ld (hl),a ;next frame + cal explosion_stuff ;display explosion jr next_enemy ;--------------------------- moving enemies --------------------------------- @@ -1931,16 +1908,14 @@ check_collision: inc hl collide_enemy: ;&&& include in Handle_enemy proc - psh de cal find_sprite - pop de inc hl ld a,(hl) ;check x match sub e ;enemy position minus yours minus 7 jp p,check_next add a,6 - add a,(ix) + add a,(ix) ;enemy width jp m,check_next inc hl @@ -1948,7 +1923,7 @@ collide_enemy: ;&&& include in Handle_enemy proc sub d ;same as with x-check jp p,check_next add a,6 - add a,(ix+1) + add a,(ix+1) ;enemy height jp m,check_next dec hl dec hl @@ -1992,10 +1967,10 @@ collide: and %11111100 jr z,destroy_enemy ld a,(hl) - sub %00000100 + sub collidedamage ld (hl),a collide_done: - ld b,4 ;damage + ld b,collidedamage ;damage cal damage_you check_next: @@ -2027,9 +2002,9 @@ storyLine: jr z,storyLine psh hl - ld hl,VIDEO_MEM - ld de,GRAPH_MEM - ld bc,1024 + ld hl,VIDEO_MEM ;copy text + ld de,GRAPH_MEM ;to GRAPH_MEM + ld bc,1024 ;entire screen ldir cal _clrLCD pop hl @@ -2059,62 +2034,54 @@ dostory: ;--------------------------- SFX -------------------------------------------- -CDoSFX: - ld hl,VIDEO_MEM - ld de,GRAPH_MEM - ld bc,1024 - ldir - ld b,64 - ld a,-1 - -DoSFX: ;ins: a=beginLine b=nrOfLines +DoSFX: ;in:a=beginLine;b=nrOfLines ld (curline),a SFXframe: psh bc - ld a,(curline) ;get line number + ld a,0 ;get line number +curline =$-1 inc a ;go to the next line ld (curline),a ;update ld l,a - ld h,0 - add hl,hl + ld h,0 ;hl=a add hl,hl add hl,hl add hl,hl + add hl,hl ;*16 (a pixels down=a*16) ld b,h ;save hl for later ld c,l - ld de,VIDEO_MEM + ld de,VIDEO_MEM ;where to put sfx add hl,de ;go to ymin - ld d,h - ld e,l + ex de,hl ;put into de again ld hl,GRAPH_MEM add hl,bc ;hl->logo - ld a,(curline) ;Calculate how many lines to draw - ld c,a - ld a,64 - sub c - ld b,a + sub 64 ;a=a-64 + neg ;a=64-a (lines from bottom) + +; ld c,a ;c=a=(curline) +; ld a,64 +; sub c ;lines from bottom SFXdisp: ;display this frame on screen - ld a,b ;psh b (a will not be used) 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 - ld b,a ;pop b - dnz SFXdisp ;repeat until whole screen is displayed + dec a ;counter + jr nz,SFXdisp ;repeat until whole screen is displayed ld b,8 SFXdelay: - halt - dnz SFXdelay + halt ;delay + dnz SFXdelay ;8x - pop bc + pop bc ;counter dnz SFXframe ret @@ -2218,7 +2185,7 @@ armorbarclr: ld c,a ;psh a srl a ;/2 srl a ;/4 - srl a ;/8: don't display last 2 bits of a (later) + srl a ;/8: don't display last 3 bits of a (later) jr z,noarmorbar ;if a=0 then it would loop 256x so skip it ld b,a ;loop b=a times armorbar: ;starting at ($39*16)+VIDEO_MEM @@ -2240,6 +2207,40 @@ armorbarready: ; (an if B=3 then a=%11100000) ld (hl),a ;draw this last byte ret +disp_charge: + ld hl,(58*16)+VIDEO_MEM+3 + ld b,3 +chargebarclr: + dec hl + ld (hl),0 + dnz chargebarclr + ld a,(weapincs) ;load bar size (0-80) + srl a ;half the size (0-40) + srl a ;again half that size (0-20 pixels) + ld c,a ;psh a + srl a ;/2 + srl a ;/4 + srl a ;/8: don't display last 3 bits of a (later) + jr z,nochargebar ;if a=0 then it would loop 256x so skip it + ld b,a ;loop b=a times +chargebar: ;starting at ($39*16)+VIDEO_MEM + ld (hl),%11111111 ;draw a piece of the bar + inc hl ;next position + dnz armorbar ;loop it b times +nochargebar: + ld a,c ;pop a + and %111 ;display last bits of chargebar + ret z ;if armor=0 then bit = %00000000 (don't disp) + ld b,a ;into B + xor a ;bit = %00000000 +chargebarbit: + scf ;set carry flag + rra ;rotates A right and sets bit 7 (c-flag) + dnz chargebarbit ;repeat B times (so if B=6 then a=%11111100) +chargebarready: ; (an if B=3 then a=%11100000) + ld (hl),a ;draw this last byte + ret + disp_lives: ld hl,$3A00 ;display Lives ld (_penCol),hl ;bottom left @@ -2257,60 +2258,55 @@ disp_lives: ;--------------------------- proc ------------------------------------------- -Random5016: - cal Random50 ; a = 0..50 - inc a ; a = 1..51 +Random: ;a=b=b + jr nc,Random ;then add again + add a,c ;a=0 - add a,13+(50-12) ;a = -13..-1 >=> 0..12 >=> 39..50 - ret - -Random: - ld a,(RanPos) ;a handy random-var. - ld hl,x ;add your x-coord for randomness - adc a,(hl) - inc hl ;add your y-coord for randomness - adc a,(hl) - ld (RanPos),a ;save altered random-var - ret ;RanPos also in #a - scoreInc: psh bc - ld bc,(score) + ld bc,(your_score) add hl,bc - ld (score),hl + ld (your_score),hl pop bc ret -find_sprite: ;destroyed: de ix +find_sprite: ;in:hl=enemy+type | out:ix=sprite to enemy + psh de psh hl ld e,(hl) ;e = enemy type ld d,0 ;de = e ld hl,XLenemytable ;hl = @sprites offset-table add hl,de ;points to offset of current enemy offset ld e,(hl) ;de = @enemy offset - ld d,0 - ld ix,XLsprenemies ;first enemy sprite + ld ix,spr_enemy00 ;first enemy sprite add ix,de ;add offset for current enemy add ix,de ;twice (offset stored as offset/2) pop hl + pop de ret BLACKLCD: @@ -2322,63 +2318,28 @@ BLACKLCD: set 3,(iy+5) ;set white on black ret -waitnokeypressed: - halt \ halt - cal GET_KEY - or a - jr nz,waitnokeypressed +releasekeys: + halt + ld a,%10000000 ;all key-masks + out (1),a + in a,(1) + inc a ;cp %11111111 (no keys pressed) + jr nz,releasekeys ;keep waitin + cal GET_KEY ;clear buffer ret -Decompress: ;hl=source(compressed) de=dest(decompressed) - ld a,(hl) - bit 7,a - jr z,compressed - inc hl - and %01111111 - ld b,0 - ld c,a - ldir - jr Decompress -compressed: - psh af - or %11111100 - ld b,a - inc hl - ld c,(hl) - inc hl - pop af - and %01111100 - rrca - rrca - or a - ret z - psh hl - ld h,d - ld l,e - add hl,bc - inc a - inc a - ld b,0 - ld c,a - ldir - pop hl - jr Decompress - ;--------------------------- game over / new game / death ------------------- chartable: - .db 0,"!<>^",0,0,0,0 - .db 0,"xtoje0",0 ;enter..clear - .db " wsnid9",0 ;(-)..custom - .db "zvrmhc8",0 ;dot..del - .db "yuqlgb7x" ;0..xvar - .db 0,"-pkfa6'" ;on..alpha - .db "54321.",0,0 ;F5..more - -own_name: - .db 7,"nemesis" + .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 save_hi: - ld hl,own_name-1 ;find own variable + ld hl,_asapvar ;find own variable rst 20h ;cal _ABS_MOV10TOOP1 rst 10h ;cal _FINDSYM ret c ;not found? who cares... @@ -2397,7 +2358,7 @@ save_hi: jp _RAM_PAGE_1 save_lvl: - ld hl,own_name-1 ;find own variable + ld hl,_asapvar ;find own variable rst 20h ;cal _ABS_MOV10TOOP1 rst 10h ;cal _FINDSYM ret c ;not found? who cares... @@ -2415,20 +2376,18 @@ save_lvl: cal _mm_ldir ;save done (cal \ ret) jp _RAM_PAGE_1 -game_over: - pop hl ;=ret (game_over was called from a procedure) -game_over_nopop: +game_over: ;stack=+0 cal BLACKLCD ;clear screen - cal waitnokeypressed ld hl,$0603 ld (_curRow),hl ;center ld hl,txt_gameover cal _puts ;display "GAME OVER" + cal releasekeys ;wait for all keys to be released ld hl,$0007 ld (_curRow),hl - ld de,(score) + ld de,(your_score) ld hl,(hiscore) cal CP_HL_DE jr nc,no_hiscore @@ -2473,7 +2432,7 @@ nokeypressed: ld (ix),a cal _putc inc ix - cal waitnokeypressed + cal releasekeys jr enter_name_loop backup: @@ -2507,7 +2466,7 @@ hiscoredone: xor a ;clear a (Ahl will be displayed) ld hl,$1006 ;bottom-1 right ld (_curRow),hl ;set - ld hl,(score) ;your score + ld hl,(your_score) ;your score cal _dispahl ;display it (a=0) ld hl,$314b ;bottom-1 right before score ^^ @@ -2536,17 +2495,17 @@ restore_line: cal _getkey ;wait for keypress jp quit ;restore some things and return to TI-OS/shell -New_game: +New_game: ;stack must be +1 (so change the jp in cal :) xor a ;ld a,0 - ld (score),a ;reset score - ld (score+1),a ;reset score (0) + ld (your_score),a ;reset score + ld (your_score+1),a ;reset score (0) ld (torp_occ),a ;no torpedoes ld (your_weapon),a ;no laser ld (your_pickup),a ;reset pickups ld (your_multiples),a ;no multiples inc a ;ld a,1 ld (level),a ;reset level nr (#1) - ld hl,XLlevelsdata ;set level pointer to level#1 + ld hl,level00 ;set level pointer to level#1 ld (levelp),hl ;reset level pointer inc a ;ld a,2 ld (your_weapon),a ;default weapon @@ -2554,18 +2513,21 @@ New_game: ld (your_lives),a ;3 lives (4 will be decreased @ You_die) ld (pickuptimer),a ;next pickup after 4 enemies destroyed -You_die: +You_die: ;stack must be +1 + pop hl ;restore stack ld a,12 ld (your_armor),a ;12 HPs/shields ld a,(your_lives) ;load lives left dec a ;decrease lives ld (your_lives),a ;if lives=0ffh GO - jp c,game_over + inc a ;if -1 then zf set now + jp z,game_over ;and game's over jr samelevel ;--------------------------- next level ------------------------------------- -Next_level: +Next_level: ;stack must be +1 + pop hl ld a,(your_armor) ;load current armor cp 25-8 ;may not become >=25 jr c,addok ;ok then just add 8 @@ -2627,8 +2589,6 @@ samelevel: ld ix,starx1 ld b,nrstars1 cal placestars - ld hl,RanPos - inc (hl) ld ix,starx2 ld b,nrstars2 cal placestars @@ -2639,11 +2599,9 @@ samelevel: ld (hl),a ;reset your ship (not exploding) inc hl ;hl = your_inv ld (hl),25 ;set 25*4=100 frames invulnerable - ld hl,x ;begin position x=... - ld (hl),a ;...=a=0=left - inc hl ;y=... - ld a,24 ;...=24=middle - ld (hl),a ;your y + ld de,$1800 + ld (x),de ;begin position (x,y) + cal Place_multiples ;place all multiple-positions at that (0,24) ld a,(torp_occ) or a ;no torpedoes? @@ -2651,9 +2609,6 @@ samelevel: ld a,1 ;if so, set to "ready to fire" (=1) torpsclear: - ld de,$0018 ;x=0, y=24 (like you..) -; cal Place_multiples ;place all multiple-positions at (0,24) - ld hl,enemies ;remove all enemies and bullets ld (hl),0 ;clear first byte ld de,enemies+1 ;copy this to the next byte @@ -2663,48 +2618,55 @@ torpsclear: ;--------------------------- setup game ------------------------------------- game_setup: - cal BLACKLCD - ld hl,$0703 - ld (_curRow),hl ;center + cal BLACKLCD ;white on black ld hl,txt_level + ld de,$0703 + ld (_curRow),de ;center cal _puts ;display "LEVEL " - ld a,(level) + ld a,(level) ;current level ld l,a - ld h,$00 - - cal UNPACK_HL - add a,'0' - ld b,a - cal UNPACK_HL - add a,'0' + ld h,0 ;in hl + cal UNPACK_HL ;create first digit + add a,'0' ;0-9 + ld b,a ;into b + cal UNPACK_HL ;second digit + add a,'0' ;0-9 cal _putc ;display second digit ld a,b cal _putmap ;display first digit - ld hl,$0904 - ld (_curRow),hl ;display lives left below level nr ld hl,txt_lives ;bar text: "Lx0"... + ld de,$0904 + ld (_curRow),de ;display lives left below level nr + cal _puts ld a,(your_lives) ;lives left - add a,'0' ;make value - ld (txt_lives+3),a ;add to text - cal _puts ;display the string - res 3,(iy+5) ;set white on black + add a,'0' ;make value 0='0' + cal _putc + cal releasekeys ;wait for user to release all keys + ld hl,txt_savekey ;"Press [F1] to save" + ld de,$3A46 ;bottom-right + ld (_penCol),de + cal _vputs + + res 3,(iy+5) ;set white on black cal _getkey ;wait for keypress cp kF1 cal z,save_lvl cal _clrLCD ;clear screen - jp disp_icons ;display bottom icons +ret + cal disp_icons ;display bottom icons +ret + jp game_main_loop placestars: - cal Random5016 ;a = (0..50)*16 = random y-pos + cal RandomY ;a = random y-pos 1..bottom ld a,b ;a = b = star nr. = 1..7 add a,a ;a = 2b = 2..14 ld d,0 ld e,a ;de = a = 2-14 - add hl,de ;add to random y => random pos anywhere + or a + sbc hl,de ;substract from random y => random pos anywhere ld (ix),l ;save x-pos (l) ld (ix+1),h ;save y-pos (h) @@ -2725,7 +2687,7 @@ loadweapon: ld (weapdamage),a ;damage of bullets inc hl ld a,(hl) -; ld (weapdaminc),a ;damage increase + ld (weapdaminc),a ;damage increase ret ;--------------------------- putsprite -------------------------------------- @@ -2864,92 +2826,87 @@ wover_1: spr_ship01: .db 7,7 ;ship alpha class - .db %01111000 ; ████ - .db %11100000 ; ███ - .db %01111100 ; █████ - .db %11110010 ; ████ █ - .db %01111100 ; █████ - .db %11100000 ; ███ - .db %01111000 ; ████ + .db %01111000 ; ████ + .db %11100000 ;███ + .db %01111100 ; █████ + .db %11110010 ;████ █ + .db %01111100 ; █████ + .db %11100000 ;███ + .db %01111000 ; ████ spr_ship01i: - .db 7,7 ;ship alpha class - .db %01010000 ; █ █ - .db %10100000 ; █ █ - .db %01010100 ; █ █ █ - .db %10100010 ; █ █ █ - .db %01010100 ; █ █ █ - .db %10100000 ; █ █ - .db %01010000 ; █ █ + .db 8,7 + .db %01111010 ; ████ █ + .db %11100001 ;███ █ + .db %01111101 ; █████ █ + .db %11110011 ;████ ██ + .db %01111101 ; █████ █ + .db %11100001 ;███ █ + .db %01111010 ; ████ █ spr_ship02: -; .db 7,7 ;ship beta class -; .db %11100000 ; ███ -; .db %11110000 ; ████ -; .db %01111100 ; █████ -; .db %01110010 ; ███ █ -; .db %01111100 ; █████ -; .db %11110000 ; ████ -; .db %11100000 ; ███ + .db 7,7 ;ship beta class + .db %11100000 ;███ + .db %11110000 ;████ + .db %01111100 ; █████ + .db %01110010 ; ███ █ + .db %01111100 ; █████ + .db %11110000 ;████ + .db %11100000 ;███ spr_ship02i: -; .db 7,7 ;ship beta class -; .db %01000000 ; █ -; .db %10100000 ; █ █ -; .db %01010100 ; █ █ █ -; .db %00100010 ; █ █ -; .db %01010100 ; █ █ █ -; .db %10100000 ; █ █ -; .db %01000000 ; █ - -spr_multiple: - .db 6,4 ;multiples - .db %01111000 ; ████ + .db 8,7 + .db %11100010 ;███ █ + .db %11110001 ;████ █ + .db %01111101 ; █████ █ + .db %01110011 ; ███ ██ + .db %01111101 ; █████ █ + .db %11110001 ;████ █ + .db %11100010 ;███ █ + +spr_ship03: + .db 7,7 ;ship gamma class + .db %11111000 ;█████ + .db %01100000 ; ██ + .db %11111100 ;██████ + .db %11100110 ;███ ██ + .db %11111100 ;██████ + .db %01100000 ; ██ + .db %11111000 ;█████ +spr_ship03i: + .db 8,7 + .db %11111010 ;█████ █ + .db %01100001 ; ██ █ + .db %11111101 ;██████ █ + .db %11100111 ;███ ███ + .db %11111101 ;██████ █ + .db %01100001 ; ██ █ + .db %11111010 ;█████ █ + +spr_ship04: + .db 7,7 ;ship delta class + .db %11000000 ; ██ + .db %11110000 ; ████ .db %11111100 ; ██████ + .db %01100010 ; ██ █ .db %11111100 ; ██████ - .db %01111000 ; ████ - -;--------------------------------- bullets ---------------------------------- - -spr_bullet01: - .db 5,3 ;dam=0-3 - .db %00110000 ; ▒██ - .db %01001000 ; ▒█ ▒█ - .db %00110000 ; ▒██ -spr_bullet02: - .db 5,3 ;dam=4-7 - .db %00110000 ; ▒██ - .db %01101000 ; ▒██▒█ - .db %00110000 ; ▒██ -spr_bullet03: - .db 5,3 ;dam=8-11 - .db %00110000 ; ▒██ - .db %11101000 ;▒███▒█ - .db %00110000 ; ▒██ -spr_bullet04: - .db 5,3 ;dam=8-11 - .db %00110000 ; ▒██ - .db %11111000 ;▒█████ - .db %00110000 ; ▒██ -spr_bullet05: - .db 5,3 ;dam=8-11 - .db %01110000 ; ▒███ - .db %11111000 ;▒█████ - .db %01110000 ; ▒███ -spr_bullet06: - .db 5,3 - .db %11110000 ;▒████ - .db %11111000 ;▒█████ - .db %11110000 ;▒████ -spr_bullett1: - .db 4,3 ;▒▒▒ - .db %11100000 ;▒███ .db %11110000 ; ████ - .db %01110000 ; ███ + .db %11000000 ; ██ +spr_ship04i: + .db 8,7 + .db %11000010 ; ██ █ + .db %11110001 ; ████ █ + .db %11111101 ; ██████ █ + .db %01100011 ; ██ ██ + .db %11111101 ; ██████ █ + .db %11110001 ; ████ █ + .db %11000010 ; ██ █ -spr_bullete1: - .db 4,3 ;enemy bullets - .db %01100000 ; ▒█▓▒░ - .db %11110000 ; ▒███▓▒░ - .db %01100000 ; ▒█▓▒░ +spr_multiple: + .db 6,5 ;multiples + .db %01111000 ; ████ + .db %11001100 ; ██ ██ + .db %10000100 ; █ █ + .db %11001100 ; ██ ██ + .db %01111000 ; ████ ;-------------------------------- explosion --------------------------------- @@ -3027,17 +2984,125 @@ spr_yexplosion: .db %00000000 ; .db %00000000 ; +;--------------------------------- bullets ---------------------------------- + +spr_bullet01: + .db 2,1 + .db %11000000 ;▒██ +spr_bullet02: + .db 4,2 + .db %11110000 ;▒████ +spr_bullet03: + .db 2,2 + .db %11000000 ;▒██ + .db %11000000 ;▒██ +spr_bullet04: + .db 3,2 + .db %11100000 ;▒███ + .db %11100000 ;▒███ +spr_bullet05: + .db 4,3 + .db %01100000 ; ▒██ + .db %11110000 ;▒████ + .db %01100000 ; ▒██ +spr_bullet06: + .db 5,3 + .db %00110000 ; ▒██ + .db %11111000 ;▒█████ + .db %00110000 ; ▒██ +spr_bullet07: + .db 5,3 + .db %01110000 ; ▒███ + .db %11111000 ;▒█████ + .db %01110000 ; ▒███ +spr_bullet08: + .db 5,3 + .db %11110000 ;▒████ + .db %11111000 ;▒█████ + .db %11110000 ;▒████ +spr_bullet09: + .db 5,4 + .db %00010000 ; ▒█ + .db %10111000 ;▒█▒███ + .db %01111000 ; ▒████ + .db %00010000 ; ▒█ +spr_bullet10: + .db 6,4 + .db %00111000 ; ▒███ + .db %01111100 ; ▒█████ + .db %11111100 ;▒██████ + .db %00110000 ; ▒██ +spr_bullet11: + .db 7,5 + .db %00011000 ; ▒██ + .db %11111100 ;▒██████ + .db %00111110 ; ▒█████ + .db %01111100 ; ▒█████ + .db %00011000 ; ▒██ +spr_bullet12: + .db 7,6 + .db %00110000 ; ▒██ + .db %11111100 ;▒██████ + .db %00111110 ; ▒█████ + .db %01111110 ; ▒██████ + .db %11111100 ;▒██████ + .db %00111000 ; ▒███ +spr_bullet13: + .db 8,8 + .db %00111100 ; ▒████ + .db %11111110 ;▒███████ + .db %01111111 ; ▒███████ + .db %00011111 ; ▒█████ + .db %01111111 ; ▒███████ + .db %11111110 ;▒███████ + .db %00111100 ; ▒████ +spr_bullett1: + .db 4,3 ;▒▒▒ + .db %11100000 ;▒███ + .db %11110000 ; ████ + .db %01110000 ; ███ + +spr_bullete1: + .db 4,3 ;enemy bullets + .db %01100000 ; ██▒ + .db %11110000 ;████▒ + .db %01100000 ; ██▒ + +XLbullettable: + .db (spr_bullet01-spr_bullet01) ;0 + .db (spr_bullet02-spr_bullet01) ;4 + .db (spr_bullet03-spr_bullet01) ;8 + .db (spr_bullet04-spr_bullet01) ;12 + .db (spr_bullet05-spr_bullet01) ;16 + .db (spr_bullet06-spr_bullet01) ;20 + .db (spr_bullet07-spr_bullet01) ;24 + .db (spr_bullet08-spr_bullet01) ;28 + .db (spr_bullet09-spr_bullet01) ;32 + .db (spr_bullet10-spr_bullet01) ;36 + .db (spr_bullet11-spr_bullet01) ;40 + .db (spr_bullet12-spr_bullet01) ;44 + .db (spr_bullet13-spr_bullet01) ;48 + .db (spr_bullet13-spr_bullet01) ;52 + .db (spr_bullet13-spr_bullet01) ;56 + .db (spr_bullet13-spr_bullet01) ;60 + +;format:[min.damage] [dam.inc] [0000:direction 0000:speed] [offset] +;damage = min.damage + dam.inc*incs (0<=incs<=6) +maxnrweapons = 8+1 +weapondata: + .db 1,1,%00000010,2,%00000000,0,%00000000,0 ;single fire + .db 3,1,%00000011,2,%00000000,0,%00000000,0 ;fast single + .db 1,1,%00000010,0,%00000010,5,%00000000,0 ;double + .db 1,1,%00010010,2,%00110010,2,%01000010,2 ;triple + .db 3,2,%00010011,2,%00110011,2,%01000011,2 + .db 5,3,%00010011,2,%00110011,2,%01000100,2 + .db 7,4,%00010100,2,%00110100,2,%01000100,2 + .db 12,5,%00010110,2,%00110110,2,%01000110,2 + +collidedamage = 4 + ;------------------------------------ bar ----------------------------------- -spr_iconhalf: - .db 16,7 ;selected .......: - .db %11111111 ; ████████ - .db %00000001 ; █ - .db %00000001 ; █ - .db %00000001 ; █ - .db %00000001 ; █ - .db %00000001 ; █ - .db %11111111 ; ████████ spr_icon: .db 16,7 ;selected .......:.......: .db %11111111,%11111111 ; ████████████████ @@ -3105,35 +3170,26 @@ spr_dividerline: .db 8,7 .db 128,128,128,128,128,128,128 ;128 = %10000000 -;-------------------------- weapondata -------------------------------------- - -;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset] -maxnrweapons = 8+1 -weapondata: - .db 2,1,%00000010,2,%00000000,0,%00000000,0 ;single fire - .db 2,1,%00000011,2,%00000000,0,%00000000,0 ;fast single - .db 16,2,%00000010,0,%00000010,5,%00000000,0 ;double - .db 16,1,%00010010,2,%00110010,2,%01000010,2 ;triple - .db 16,1,%00010011,2,%00110011,2,%01000011,2 - .db 16,1,%00010011,2,%00110011,2,%01000100,2 - .db 16,1,%00010100,2,%00110100,2,%01000101,2 - .db 16,1,%00010100,2,%00110100,2,%01000101,2 - ;---------------------------- texts ----------------------------------------- -txt_about: .db " v0.96.A30",127,"by Shiar",0 -txt_email: .db "shiar0@hotmail.com",0 +txt_email: .db "www.shiar.org ",127 ;title screen + .db " shiar0@hotmail.com",0 +_txt_email = $3A01 ;$3A1E=just email +txt_about: .db " v0.97.624 ",127," by Shiar",0 ;right behind txt_email +_txt_about = $331F txt_menu1: .db "NEW GAME",0 txt_menu2: .db "CONTINUE",0 -txt_level: .db "LEVEL ",0 -txt_gameover: .db "GAME OVER!",0 +txt_level: .db "LEVEL ",0 ;new level screen +txt_lives: .db "Lx0",0 +txt_savekey: .db "Press [F1] to save",0 + +txt_gameover: .db "GAME OVER!",0 ;game over screen txt_score: .db "Score",0 txt_hiscore: .db "Hiscore",0 -txt_lives: .db "Lx0?",0 -txt_pressenter: .db "Enter to continue",0 -txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0 +txt_pressenter: .db "Enter to continue",0 ;pause +txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0 ;boss txt_teacherans: .db Lneg,"14.2063168184",0 ;---------------------------- save data ------------------------------------- @@ -3148,9 +3204,9 @@ storehi_end: storesave_start: level .db $01 ;level number -levelp .dw XLlevelsdata ;pointer to level data +levelp .dw level01 ;pointer to level data pickuptimer .db $04 ;counts when to place a pickup -score .dw $0000 +your_score .dw $0000 your_pickup .db $00 your_occ .db $00 ;0=normal 1..16=exploding @@ -3166,8 +3222,8 @@ storesave_end: ;XLlevelsdata:--------------------------------------------------------------- -XLlevelsdata: +level00: .db 0 .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 @@ -3244,71 +3300,7 @@ level07: .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 .db 1,1 -;XLenemytable:--------------------------------------------------------------- -XLbullettable: - .db (spr_bullet01-spr_bullet01) ;0 - .db (spr_bullet01-spr_bullet01) ;4 - .db (spr_bullet02-spr_bullet01) ;8 - .db (spr_bullet02-spr_bullet01) ;12 - .db (spr_bullet03-spr_bullet01) ;16 - .db (spr_bullet03-spr_bullet01) ;20 - .db (spr_bullet03-spr_bullet01) ;24 - .db (spr_bullet04-spr_bullet01) ;28 - .db (spr_bullet04-spr_bullet01) ;32 - .db (spr_bullet04-spr_bullet01) ;36 - .db (spr_bullet05-spr_bullet01) ;40 - .db (spr_bullet05-spr_bullet01) ;44 - .db (spr_bullet05-spr_bullet01) ;48 - .db (spr_bullet06-spr_bullet01) ;52 - .db (spr_bullet06-spr_bullet01) ;56 - .db (spr_bullet06-spr_bullet01) ;60 - -XLenemytable: - .db $00 ;00 - .db (spr_enemy01-spr_enemy00)/2 ;01 - .db (spr_enemy02-spr_enemy00)/2 ;02 - .db (spr_enemy03-spr_enemy00)/2 ;03 - .db (spr_enemy04-spr_enemy00)/2 ;04 - .db (spr_enemy05-spr_enemy00)/2 ;05 - .db (spr_enemy06-spr_enemy00)/2 ;06 - .db (spr_enemy07-spr_enemy00)/2 ;07 - .db (spr_boss01 -spr_enemy00)/2 ;08 - .db (spr_boss02 -spr_enemy00)/2 ;09 - .db (spr_enemy08-spr_enemy00)/2 ;0A - .db (spr_enemy00-spr_enemy00)/2 ;0B - .db (spr_enemy00-spr_enemy00)/2 ;0C - .db (spr_enemy00-spr_enemy00)/2 ;0D - .db (spr_enemy00-spr_enemy00)/2 ;0E - .db (spr_enemy00-spr_enemy00)/2 ;0F - -;XLenemyinfos:--------------------------------------------------------------- -XLenemyinfos: - -;format: [000000:HP 00:occ] [HP64] [appearance(ypos)] [unused] - - .db %00100110,0,1,1 ;#1 HP:1 app:random - .db %00101010,0,2,3 ;#2 HP:1 app:halflure - .db %00001111,0,3,2 ;#3 HP:1 app:lure - - .db %00000110,0,4,2 ;#4 HP:2 app:lure - .db %00000111,0,5,3 ;#5 HP:2 app:random moving - .db %00001011,0,6,2 ;#6 HP:3 app:lure moving - - .db %00011011,0,7,3 ;#7 HP:7 app:halflure moving - - .db %00110011,1,8,1 ;boss1 - .db %00111011,0,9,3 ;boss2 - - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - -;XLsprenemies:--------------------------------------------------------------- -XLsprenemies: +;------------------------------ enemies ------------------------------------- spr_enemy00: .db 8,8 ;pickup @@ -3377,8 +3369,16 @@ spr_enemy07: .db %10011100 ; █ ███ .db %01111111 ; ███████ .db %00011110 ; ████ +spr_enemy08: + .db 8,6 ;enemy type seven + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ -spr_boss01: +spr_boss0_1: .db 16,10 ;boss type one .db %00000001,%11111111 ; █████████ .db %00001111,%11111110 ; ███████████ @@ -3390,7 +3390,7 @@ spr_boss01: .db %00111111,%11110000 ; ██████████ .db %00001111,%11111110 ; ███████████ .db %00000001,%11111111 ; █████████ -spr_boss02: +spr_boss0_2: .db 16,10 ;boss type:one : .db %11111110,%00000000 ; ███████ .db %00001111,%10001111 ; █████ ████ @@ -3403,15 +3403,46 @@ spr_boss02: .db %00001111,%10001111 ; █████ ████ .db %11111110,%00000000 ; ███████ +XLenemytable: + .db $00 ;00 + .db (spr_enemy01-spr_enemy00)/2 ;01 + .db (spr_enemy02-spr_enemy00)/2 ;02 + .db (spr_enemy03-spr_enemy00)/2 ;03 + .db (spr_enemy04-spr_enemy00)/2 ;04 + .db (spr_enemy05-spr_enemy00)/2 ;05 + .db (spr_enemy06-spr_enemy00)/2 ;06 + .db (spr_enemy07-spr_enemy00)/2 ;07 + .db (spr_boss0_1-spr_enemy00)/2 ;08 + .db (spr_boss0_2-spr_enemy00)/2 ;09 + .db (spr_enemy08-spr_enemy00)/2 ;0A + .db (spr_enemy00-spr_enemy00)/2 ;0B + .db (spr_enemy00-spr_enemy00)/2 ;0C + .db (spr_enemy00-spr_enemy00)/2 ;0D + .db (spr_enemy00-spr_enemy00)/2 ;0E + .db (spr_enemy00-spr_enemy00)/2 ;0F -spr_enemy08: - .db 8,6 ;enemy type eight - .db %00011110 ; ████ - .db %01111111 ; ███████ - .db %10011100 ; █ ███ - .db %10011100 ; █ ███ - .db %01111111 ; ███████ - .db %00011110 ; ████ +;format: [000000:HP 00:occ] [HP64] [appearance(ypos)] [unused] +XLenemyinfos: + .db %00100110,0,1,1 ;#1 HP:1 app:random + .db %00101010,0,2,3 ;#2 HP:1 app:halflure + .db %00001111,0,3,2 ;#3 HP:1 app:lure + + .db %00000110,0,4,2 ;#4 HP:2 app:lure + .db %00000111,0,5,3 ;#5 HP:2 app:random moving + .db %00001011,0,6,2 ;#6 HP:3 app:lure moving + + .db %00011011,0,7,3 ;#7 HP:7 app:halflure moving + + .db %00110011,1,8,1 ;boss1 + .db %00111011,0,9,3 ;boss2 + + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 ;---------------------------------------------------------------------------- ;----------------------------- logo ------------------------------------------ @@ -3448,53 +3479,30 @@ logo_nemesis: ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- -; 0.95.A22 -- 22.X.99 -- size 5321 -; -; * total size of enemy-sprites can now be 510 bytes (space = doubled!) -; # bullets hit enemies correctly that aren't 6x6; even the 16x10 bosses! -; * at g/o or nextlevel checks for keys released instead of waiting abit -; + name stored with hiscore (max. 8 chars, Shiar.95 by default) -; + when entering hi-name DEL goes back one char (with check 4 no chars) -; # program is reloaded at start so some score-bugs solved! (_asapvar=0) -; * at death, upgrades and pickups AREN'T removed! (just armor=0) -; # bullet is not displayed after being removed anymore -; # armor-icon stays hilighted when armor is decreased -; * when stars move off screen, they are placed at a NEW y-pos! -; * the starting x-positions of stars are not random, so the stars are -; spread all over screen. y is still random and changes during game -; * make_random functions smaller and used by different procs -; # MAJOR BUG! a "random" value was placed somewhere in mem thus -; creating bugs like unexplained loss of armor and stuff! (I think) -; -; 0.96.A31 -- 31.X.99 -- size 4836 + 888 -; -; # if you were hit when armor-icon selected, prog did weird stuff -; + armor-bar (shows armor as a black line left at bottom) -; # bugs involving armor-bar changing armor to a wrong value -; # YES!!! the saving-bugs were caused by mmldir: it reset all data -; at mem $8000, so data is now stored at asmexecram+6000 instead! -; * external levels. All leveldata is loaded from "nemesis0"-var -; * some optimization (like cal\ret>jp + unused code removed/shortened) -; * storyline is loaded from level-file (will be compressed later..) -; + story can be _between_ levels, not only at the start of a new game -; * "new game" and "continue" in main menu are swapped (new comes 1st) -; * enemy bullets can do more than one damage: differs per level -; * collision does 4 damage, ground does 5, you start with 12 armor -; # running the level-file no longer crashes your calc but just returns -; * you now move 1.5 pixels per frame! this way you can outrun enemies -; * hellofajob but enemy-data is now stored at one location in 6 bytes, -; instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster) -; * ground/ceiling/stars are continued when at boss (c00l level 3 boss) -; -; 0.97.622 -- 06.VI.99 -- size 5kb +; 0.97.624 -- 24.VI.00 -- size 5803 ; ; # 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 ; + 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) ; ; ; + added - removed * changed # bug fixed \ No newline at end of file -- 2.30.0