X-Git-Url: http://git.shiar.net/nemesis.git/blobdiff_plain/b8db53984e76eb9e413a2c8c40863b326dcb4d37..80fc412cfe5e0d5b551945794a5dbb7f561aa6ee:/nemesis.z80 diff --git a/nemesis.z80 b/nemesis.z80 index 48f79a6..a45c13c 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,44 +1,46 @@ ;------------------------------------------------------------------------------ ;---------------------- NEMESIS ----------------------------------------------- ;------------------------------------------------------------------------------ -; >>> NEMESIS <<< Version 0.95 BETA by SHIAR -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ; Title : Nemesis -; Version : 0.95 -; Release Date : 22.X.99 -; Filename : nemesis.86p (5321) +; Version : 0.96 +; Release Date : 30.X.99 +; Filename : nemesis.86p (5kb) ; Author(s) : Shiar ; Email Address : shiar0@hotmail.com ; ICQ ; #43840958 -; Web Page : come.to/shiar -; Description : cool arcade-shoot-em-up-game (release 12/99) -; Where to get this game : www.ticalc.org -; Other games by author : N/A +; Web Page : www.shiar.org +; Description : cool arcade-shoot-em-up-game +; Where to get this game : www.shiar.org | www.ticalc.org +; Other games by author : Worm -; ABOUT: This source should only be used for learning practises, do not -; alter it, and certainly do not distribute an altered version!! +; ABOUT: This source should only be used for learning practises, do not +; alter it, and certainly do not distribute an altered version!! ; NOTE: &&& marks uncertainties or things to optimize -;---------------------- nemesis.z80 start ------------------------------------- +;---------------------- nemesis.z80 start ----------------------------------- #include "asm86.h" #include "ti86asm.inc" ;standard ti86 romcalls #include "ti86abs.inc" ;used to save hiscores and so -#include "ti86un .inc" ;_dispahl and _shracc .org _asm_exec_ram #define cal call ;just to make it harder for you to understand #define psh push ; ^:D +#define dnz djnz ;Dec&Jump while NonZero becomes Do w.Non-Zero TEXT_MEM = _textShadow ;167 bytes ($A7): C0F9-C1A0 +_clrWindow = $4a86 ;a new procedure from AsmStudio86 inc. files +_ex_ahl_bde = $45f3 +_shracc = $4383 +_dispahl = $4a33 +_asapvar = $d6fc -storepos = $8000 ;120 OF 165 -storepos2 = $8100 ;141 OF 167 - -;---------------------- in-game vars ------------------------------------------ +storepos = _asm_exec_ram+6000 ;120 OF 165 +storepos2 = _asm_exec_ram+6200 ;141 OF 167 -temp1 = storepos ;$C0FA-C0FB ;temp (2 bytes) bullet +;---------------------- in-game vars ---------------------------------------- just_fired = storepos+2 ; +2 ;counts how long a blast lasts curline = storepos+2 ; +2 ;used to display SFX @@ -56,9 +58,9 @@ firey = firex+1 ; +8 ;(1 byte) eventtime = storepos+10 ;+10 ;enemy frequency eventleft = eventtime+1 ;+11 ;nr. of enemies still to come nextevent = eventleft+1 ;+12 ;time to next event -pickuptimer = nextevent+1 ;+13 ;counts when to place a pickup -level_enemy = pickuptimer+1 ;+14 ;enemy type -level_move = level_enemy+1 ;= +level_enemy = nextevent+1 ;+13 ;enemy type +level_info = level_enemy+1 ;+14 ;info (see below) +level_move = level_info+1 ;+15 ;= level_fire = level_move+1 ;+16 ; ** ;--------OBJECTS @@ -83,28 +85,26 @@ your_prevpos = your_locpos+1 ;+88 ;save previous positions (32d) ;^-----------------------------------<1 ;-120=$78 -nrenemies = 10 ;max. nr of enemies -enemies = storepos2 ; +0 ;info about each enemy (4byt) -add2enemy = nrenemies*4 ;size of "enemies" -enemiesxtra = enemies+add2enemy ;+40 ;more info 'bout enemies (4) +enemies = storepos2 ; +0 ;info about each enemy +enemysize = 7 ;infobytes per enemy +nrenemies = 16 ;max. nr of enemies -nrybuls = 10 -ybullets = enemiesxtra+add2enemy ;+80 ;60 bytes = 20(state,x,y) -nrebuls = 10 -ebullets = ybullets+(nrybuls*3) ;+110 ;30 bytes = 10(state,x,y) +ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y) +nrybuls = 32 ; +80\ +ebullets = ybullets+(nrybuls*4) ;+110 ;30 bytes = 10(state,x,y) +nrebuls = 16 ybuls = ebullets+(nrebuls*3) ;+140 +maxbullets = 32 ;^-----------------------------------<2 ;-141=$8D -;level_move: -; %1 (directfire) 1 (ground) 1 (ceiling) 1 (diagfire) 1111 (move) +;level_info: +; [0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] ;enemies: -; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving) -; %11111111 (ship type or explosion frame) %11111111 (x) %11111111 (y) -;enemiesxtra: -; $11 (move) $11 (fire) $11 (bullettype) +; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] +; [ship type or explosion frame] [x] [y] [move] [fire] -;---------------------- introduction ------------------------------------------ +;---------------------- introduction ---------------------------------------- nop ;hello yas/ase/rascall/whathever jp init ;here's the program, but first: a description @@ -112,7 +112,7 @@ ybuls = ebullets+(nrebuls*3) ;+140 .dw Title ;pointer to description (all shells) .dw Icon ;pointer to YAS icon -Title: .db "Nemesis v0.95 by Shiar",0 +Title: .db "Nemesis v0.96 by Shiar",0 Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes .db %11100000 ; ███ @@ -124,23 +124,9 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes .db %11100000 ; ███ ;recommend 80x50 screen mode .DB 0 ;clear stupid YAS-line -;---------------------- init -------------------------------------------------- +;---------------------- init ------------------------------------------------ -StartFix: - im 1 - ld hl,$D400 - ld de,$D401 - ld bc,$0100 - ld (hl),$D3 - ldir - ld hl,int_handler - ld de,$D3D3 - ld bc,int_end-int_handler - ldir - ld a,$D4 - ld i,a - im 2 - ret +level_name: .db 8,"nemesis0" int_handler: ex af,af' @@ -154,48 +140,53 @@ int_end: init: cal BUSY_OFF ;turns the run-indicator off, obviously cal _clrScrn ;clean the screen - xor a ;: reset: + xor a ;ld a,0 ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen + cal _flushallmenus ;remove TI menus ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems. - cal StartFix - ld a,(CONTRAST) ;load current contrast level - cp $1f ;if already at maximum... - jr z,skipdarken ;...then skip level increase - inc a ;otherwise increase contrast level -skipdarken: - out (2),a ;set it +FixKeys: ;fixes some key problems like left+down bug + im 1 + ld a,$D4 + ld bc,$0100 + ld h,a + ld l,c ;ld hl,$D400 + ld d,a + ld e,b ;ld de,$D401 + dec a ;ld a,$D3 + ld (hl),a + ldir + ld hl,int_handler + ld d,a + ld e,a ;ld de,$D3D3 + ld bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 -;---------------------- main menu --------------------------------------------- +;---------------------- main menu ------------------------------------------- LogoPut: xor a ;white bitmask (a=0) - ld b,16 ;one line ld hl,logo_nemesis ;from... ld de,VIDEO_MEM+16 ;...to one line from top + ld b,e ;ld b,16: one line AboveLogo: ld (de),a ;clear/n byte inc de ;next - djnz AboveLogo ;repeat for the first line + dnz AboveLogo ;repeat for the first line ld bc,16*19 ;logo size ldir ;display one line of logo -; ld hl,GRAPH_MEM ;cleared line -; ld bc,16 ;size=one line -; ldir ;also clear one line below the logo - -; ld a,-1 ;first line is -1+1=0 -; ld b,21 ;with first 21 lines: -; cal DoSFX ;do special effect &&&skip - 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 a,%11111111 ;horizontal line mask underline: ld (hl),a ;draw one piece of the divider-line inc hl ;move right (8 pixels = 1 byte) - djnz underline ;repeat + dnz underline ;repeat set 3,(iy+5) ;set white on black ld hl,$3320 ;near the bottom of the screen @@ -242,7 +233,7 @@ menuloop: ld (_curRow),hl cal _putc - halt \ halt \ halt \ halt + halt \ halt cal GET_KEY ;wait for keypress cp K_UP @@ -261,8 +252,8 @@ menuloop: ld a,(menuitem) dec a - cal z,Story - cal New_game ;prepare level + jr nz,startnewgame + cal samelevel jr game_main_loop menuchange: @@ -272,15 +263,18 @@ menuchange: jr menuloop do_invert: - ld (hl),$EE + ld (hl),$2F ;cpl ret undo_invert - ld (hl),$E6 + ld (hl),$B7 ;or a ret -;------------------------------------------------------------------------------ -;---------------------- game loop --------------------------------------------- -;------------------------------------------------------------------------------ +startnewgame: + cal New_game + +;---------------------------------------------------------------------------- +;---------------------- game loop ------------------------------------------- +;---------------------------------------------------------------------------- game_main_loop: ;REPEATS FROM HERE EVERY FRAME ld hl,timer ;update time @@ -322,10 +316,10 @@ movestarsdone: ld hl,starx2 ;and there they are cal DisplayStars ;use the same procedure to display back layer - ld a,(level_move) ;level info - and %01100000 ;isolate ground&ceiling + ld a,(level_info) ;level info + and %00000110 ;isolate ground&ceiling jr z,game_stuff ;both non-present - and %00100000 ;bit representing the presence of any ceiling + and %00000010 ;bit representing the presence of any ceiling cal nz,Handle_ceiling ;scroll the ceiling (if any) cal Handle_ground ;scroll the ground @@ -334,19 +328,15 @@ game_stuff: or a ;a=0?? jr nz,_gamestuff1 ;then don't check for movements/fires/... - ld a,(level_move) ;the same level info - and %01100000 ;isolate ground&ceiling again + ld a,(level_info) ;the same level info + and %00000110 ;isolate ground&ceiling again jr z,check_keys ;no ceiling nor ground - and %00100000 ;this bit will tell us if there is a ceiling + 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: - cal GET_KEY - cp K_GRAPH - cal z,Teacher - - ld a,%00111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) + ld a,%10111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) out (1),a ;ask for them nop \ nop ;delay 8 clocks in a,(1) ;get zem! @@ -364,19 +354,23 @@ check_firekey: psh hl ;push hl on stack (instead of cal Fire_bullet) jp z,Fire_bullet ;fire smtn (bulletstorplasermultiples+stuff..) pop hl ;no cal to Fire_bullet made, so pop stack - ld hl,just_fired ;no: - ld (hl),0 ;reset just_fired + xor a ;no: + ld (just_fired),a ;reset just_fired check_selkey: ld a,%01011111 ;look at first column of keys (ALPHA to STO) out (1),a ;gimme nop \ nop ;what's taking you so long in a,(1) ;at last... our precious keyzzz... - ;old: now see this: + + bit 6,a ;'bout the GRAPH key... + cal z,Teacher ;you didn't _press_ it, did you?!? + rla ;test bit7 so we know f ALPHA has been pressed cal nc,select ;yeppy, select the currently selected upgrade cal Enemies_hit ;check for collision with enemies + cal inc_weapdamage _gamestuff1: cal Handle_Ship ;move you @@ -390,9 +384,24 @@ _gamestuff1: cal Display_Screen ;display all halt ;delay - jp game_main_loop ;LOOP + jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -;--------------------------- ground ------------------------------------------- +inc_weapdamage: + ld a,0 +weapincs =$-1 + inc a + cp 31 + ret nc ;return if increased 16 times or more already + ld (weapincs),a + + ld b,1 +weapdamage =$-1 + add a,b + + ld (curweapdamage),a + ret + +;--------------------------- ground ----------------------------------------- Handle_ground: ld a,(timer) @@ -470,10 +479,10 @@ groundloopright: groundloopup: ld (hl),a ;display black byte sbc hl,de ;go up (sbc must be used for 16-bit sub) - djnz groundloopup ;and loop >groundpos< times + dnz groundloopup ;and loop >groundpos< times ld b,c ;pop b used by groundloopup - djnz groundloopright ;loop right for entire screen (16x) + dnz groundloopright ;loop right for entire screen (16x) pop hl \ pop hl ;restore stack ret @@ -492,9 +501,10 @@ CheckGround: ;check for collision with the ground neg cp (hl) ret nc + ld b,5 jp damage_you -;--------------------------- ceiling ------------------------------------------ +;--------------------------- ceiling ---------------------------------------- Handle_ceiling: ld a,(timer) @@ -573,10 +583,10 @@ ceilingloopright: ceilingloopdown: ld (hl),a ;display black byte add hl,de ;go down - djnz ceilingloopdown ;and loop >groundpos< times + dnz ceilingloopdown ;and loop >groundpos< times ld b,c ;pop b used by groundloopup - djnz ceilingloopright ;loop right for entire screen (16x) + dnz ceilingloopright ;loop right for entire screen (16x) pop hl \ pop hl ;restore stack ret @@ -585,7 +595,8 @@ CheckCeiling: ;check for collision with the ground srl a ;x/2 srl a ;x/4 srl a ;x/8 (current ceiling-byte) - inc a + inc a ;correction + ld l,a ;hl = a ld h,0 ;" ld de,ceilingpos ;first ceiling-byte @@ -594,9 +605,10 @@ CheckCeiling: ;check for collision with the ground inc a cp (hl) ;compare with ceiling ret nc ;carry if ceiling is above you + ld b,5 jp damage_you ;otherwise you don't wanna be in that ship -;--------------------------- move stars --------------------------------------- +;--------------------------- move stars ------------------------------------- DisplayStars: ;inputs: hl=starx# a=stars# b=nrstars# ld e,(hl) @@ -604,7 +616,7 @@ DisplayStars: ;inputs: hl=starx# a=stars# b=nrstars# ld d,(hl) ld (de),a inc hl - djnz DisplayStars + dnz DisplayStars ret ;let's comment this: returns movestars2: @@ -642,10 +654,10 @@ newstarok: ld (ix),l ld (ix+1),h inc ix \ inc ix - djnz movestars_loop + dnz movestars_loop ret ;for stupid people, here's another comment... -;--------------------------- pause -------------------------------------------- +;--------------------------- pause ------------------------------------------ Pause: ld hl,$0200 ;top left @@ -658,25 +670,15 @@ pause: jr nz,pause ;no, wait some more ret ;continue -;--------------------------- teacher ------------------------------------------ +;--------------------------- teacher ---------------------------------------- Teacher: ld (iy+12),5 ;enable flashing cursor - cal _clrLCD - ld hl,$0000 ;top left - ld (_curRow),hl + cal _clrScrn + cal _homeup ;top left ld hl,txt_teacher cal _puts ;display message - ld hl,TEXT_MEM+15 - ld a,(hl) - psh af - ld a,(TEXT_MEM+42) - psh af - ld a,' ' - ld (hl),a - ld (TEXT_MEM+42),a - teacherloop: cal _getkey ;enter low-power mode and wait for key cp kEnter ;enter pressed? @@ -685,12 +687,7 @@ teacherloop: jr nz,teacherloop ;no, wait some more ld (iy+12),0 ;disable cursor - pop af - ld (TEXT_MEM+42),a - pop af - ld (TEXT_MEM+15),a - cal disp_icons - ret ;continue + jp disp_icons ;+ret teacherans: ld a,' ' @@ -703,12 +700,10 @@ teacherans: jr teacherloop -;--------------------------- exit --------------------------------------------- +;--------------------------- exit ------------------------------------------- quit: - im 1 - ld a,(CONTRAST) ;load original contrast level - out (2),a ;and set it back + im 1 ;release keyfix procedure ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling ld hl,GRAPH_MEM ;graph-screen location @@ -717,11 +712,10 @@ quit: ld bc,1024-1 ;do it 1024 times = entire screen ldir - cal _clrScrn ;as _clrLCD but also clears TEXT_MEM - cal _homeup ;set cursor to top-left - ret ;quit Nemesis :( + jp _clrWindow ;as _clrLCD but also clears TEXT_MEM (like the + ;_clrScrn) AND also executes _homeup and ret -;--------------------------- display ------------------------------------------ +;--------------------------- display ---------------------------------------- Display_Screen: ld hl,GRAPH_MEM ;from storage (top left) @@ -732,10 +726,10 @@ displayloop: displaytloop: ld a,(hl) ;copy byte from (hl) _invert: - xor $ff ; } ;invert byte (white<=>black) &&&& + cpl ;xor $ff: invert byte (white<=>black) ld (de),a ;to (de) inc hl \ inc de ;next byte - djnz displaytloop ;16x hl >> de + dnz displaytloop ;16x hl >> de dec c ;next line jr nz,displayloop ;loop 64x @@ -750,16 +744,15 @@ ldhld: cal UNPACK_HL ;one digit of hl add a,'0' ;make number ld (de),a ;save into savenr dec de ;point to next digit - djnz ldhld ;repeat for all digits + dnz ldhld ;repeat for all digits ld hl,savestr ;we (the program) saved the value righthere - cal _vputs ;the only thing left to do is to display it - ret ;and we're done again + jp _vputs ;the only thing left to do is to display it savestr: ;@here the score will be stored .db "00000",0 ;don't worry, it's just temporary -;------------------------- handle ship ---------------------------------------- +;------------------------- handle ship -------------------------------------- Handle_Ship: ld a,(your_occ) ;are @@ -790,32 +783,37 @@ ok: ;we are no_adv: and %11111011 ;reset move bit adv_ok: ld (your_multiples),a - ld a,b ;pop a (keys) + ld a,(timer) ;framecounter + and %1 ;switches 0<>1 each frame + inc a ;a = 1 or 2 (1.5 avg) + ld c,a ;c = your_speed + + ld a,b ;pop a (keys) rra ;rotate right (put last bit in c) ld b,a ;we need a later jr c,no_down ld a,(hl) - cp 49 ;55-6 = bottom of screen - jr z,no_down - inc a + add a,c + cp 50 ;56-6 = bottom of screen + jr nc,no_down ld (hl),a no_down: dec hl rr b ;because we now use b, it's rr instead of rra jr c,no_left ld a,(hl) - sub 1 ; doesn't affect c-flag + sub c ; doesn't affect c-flag jr c,no_left ;-1 = left side ld (hl),a no_left: rr b jr c,no_right ld a,(hl) - cp 121 ;127-6 = right side - jr z,no_right - inc a + add a,c + cp 122 ;128-6 = right side + jr nc,no_right ld (hl),a no_right: ld d,(hl) @@ -823,7 +821,7 @@ no_right: rr b jr c,no_up ld a,(hl) - sub 1 ; doesn't affect carry-flag + sub c ; doesn't affect carry-flag jr c,no_up ;-1 = top of screen ld (hl),a ;save new y @@ -904,21 +902,22 @@ explosion_stuff: ld e,(hl) jp putsprite -damage_you: +damage_you: ;damages you B points ld a,(your_inv) ;invulnerability left? or a ret nz ;return if inv>0 ld hl,your_armor ;armor left - ld a,(hl) ;check - dec a ;is it 0? - jp m,no_armor ;yes, 0hp left so explode + ld a,(hl) ;load hp in A + sub b ;decrease hp by B + jp m,no_armor ;<0hp left so explode ld (hl),a ;no, so save decreased hp cal disp_armor ;and display new value ld a,(your_pickup) ;how many pickups do you have? dec a ;is the armor-icon selected ret nz ;return if not - psh hl + + psh de \ psh ix ;&&& just2Bsave ld hl,VIDEO_MEM+(16*56) ld (PutWhere),hl ld ix,spr_icon ;if so, highlight armorIcon again @@ -926,14 +925,15 @@ damage_you: cal putwidesprite ;display icon ld hl,GRAPH_MEM ld (PutWhere),hl - pop hl + pop ix \ pop de ret ;and return + no_armor: ld a,%01 ;occ %xxxxxx01 = explode ld (your_occ),a ;set to explode ret -;------------------------- place multiples ------------------------------------ +;------------------------- place multiples ---------------------------------- Place_multiples: ld (mx),de ;set last multiple-position @@ -944,19 +944,27 @@ place_multiples: inc hl ;next ld (hl),e ;set prev-y to e inc hl ;next - djnz place_multiples ;repeat + dnz place_multiples ;repeat ret -;------------------------- select upgrade ------------------------------------- +;------------------------- select upgrade ----------------------------------- select: ld hl,your_pickup ;select pickups 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 - ld (hl),a ;reset pickups (a=0) - ld hl,your_armor ;change armor - inc (hl) ;increase HPs by one +select1: + ld a,(your_armor) ;load current armor + cp 25-6 ;may not become >=25 + jr c,select1_ ;ok then just add 6 + ld a,25-6 ;set to maximum (6 will be added below) +select1_: + add a,6 ;add 6 to armor + ld (your_armor),a ;change armor + xor a ;ld a,0 + ld (your_pickup),a ;reset pickups jp disp_icons ;display and return select2: dec a ;is it 2? @@ -972,20 +980,10 @@ select3: ld hl,your_weapon ld a,(hl) inc a - cp 10 - jp nc,disp_icons ;>=10 - ld (hl),a - - add a,a ;weap*2 - add a,a ; *4 - add a,a ; *8 - ld c,a - ld b,0 - ld hl,weapons-7 - add hl,bc - ld a,(hl) - ld (ybuls),a - + cp maxnrweapons + jp nc,disp_icons ;weapon maxed out + ld (hl),a ;set new weapon + cal loadweapon ;load it (damage and stuff) jp disp_icons ;display n return select4: dec a ;is it 4? @@ -1007,16 +1005,14 @@ select6: ld (hl),0 ;reset pickups jp disp_icons ;display/return -;------------------------- fire bullet ---------------------------------------- +;------------------------- fire bullet -------------------------------------- Fire_bullet: - ld hl,RanPos ;random - inc (hl) ;update random counter - ld hl,just_fired ld a,(hl) ;just_fired cp 5 ;already pressed? ret z ;return when already pressed (=5) + inc (hl) ;otherwise increase counter (0 to 4 >> 1 to 5) ld a,(your_weapon) ;if you have bullets..... dec a ;(1=laser) @@ -1042,7 +1038,7 @@ fireany: dec a ;1=yes jr z,fire_laser - ld ix,weapons-6 + ld ix,weapondata-6 add a,a ;weap*2 add a,a ; *4 add a,a ; *8 @@ -1063,7 +1059,7 @@ fireany: ld c,(ix) xor a cp c - jr nz,fire_ybullet + cal nz,fire_ybullet ret fire_torp: @@ -1108,11 +1104,11 @@ _nolc: ld c,a ;c = (Y*16+X/8) mod 256 drawlaser: ld (hl),%11111111 inc hl ;Go to next byte - djnz drawlaser + dnz drawlaser - ld a,(just_fired) ;fired for how long - cp 4 ;if 4th turn - ret nz ;then do damage, otherwise quit +; 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) @@ -1120,7 +1116,7 @@ handle_laser: check_laserhits: ;de = (x,y) ld b,nrenemies - ld hl,enemies + ld hl,enemies+1 laserhits: ;Hits with normal enemies psh hl @@ -1149,32 +1145,36 @@ laserhits: ;Hits with normal enemies nolashit: pop hl - inc hl ;go to next enemy - inc hl - inc hl - inc hl - djnz laserhits ;check all enemies + ld a,b ;psh bc + ld bc,enemysize + add hl,bc ;go to next enemy + ld b,a ;pop bc + dnz laserhits ;check all enemies ret -enemy_lashit: +enemy_lashit: ;&&&before nolashit + ld a,1 ;damage cal enemy_hit jr nolashit fire_ybullet: ld hl,ybullets - ld de,3 - ld a,(ybuls) - ld b,a + ld de,4 + ld b,maxbullets find_ybullet: ld a,(hl) or a jr z,found_ybullet ;0 = no bullet here add hl,de - djnz find_ybullet ;look next bullet - ret + dnz find_ybullet ;look next bullet + pop hl ;don't try to fire any other bullets + ret ;so ret twice found_ybullet: ld (hl),c ;use the bullet and set correct bullet-type + inc hl ;@damage + ld (hl),1 ;set bullet damage +curweapdamage =$-1 ld a,(firex) ;your x-pos add a,5 ;place bullet in front of you inc hl ;go to bullet-x @@ -1184,22 +1184,25 @@ found_ybullet: add a,(ix+1) ;place bullet at the middle of your ship inc hl ;go to bullet-y ld (hl),a ;set y + + xor a + ld (weapincs),a ;reset damage ret -;------------------------ handle bullets -------------------------------------- +;------------------------ handle bullets ------------------------------------ bullet_left: - ld a,125 + ld a,124 sub b cp (hl) ;off screen? (x>128-5) jr c,remove_bullet ld a,(hl) ;a = X - add a,b ;move 2 2 the right + add a,b ;move b to the right ld (hl),a ;save new pos. ld d,a ;d = X - inc hl ;to y-pos + inc hl ;@y-pos ld a,c cal _shracc dec a @@ -1235,54 +1238,73 @@ bullet_noymove: ret remove_bullet: - dec hl + pop hl ;cal bullet_left + pop hl ;enemy+type ld (hl),0 ;dump this bullet! - pop hl ;&&& - jr next_ybullet + jr next_ybullet+1 ;+1:skip pop hl at next_ybullet -Handle_bullets: ;&&&>> +Handle_bullets: ld hl,ybullets - ld a,(ybuls) - ld b,a + ld b,maxbullets scan_bullets: - psh bc - psh hl + psh bc ;bullet counter + psh hl ;save enemy+type ld (temp1),hl ;needed for check_bullethits - ld a,(hl) - inc hl + ld a,(hl) ;@bulletType + inc hl ;@damage + inc hl ;@x or a jp z,next_ybullet ;bulletType=0 >> no bullet - ld c,a + ld c,a ;c=type and %1111 - ld b,a + ld b,a ;b=0000type cal bullet_left ;move bullet left display_bullet: - ld ix,spr_bullet01 - psh de + psh de ;save de =position + dec hl ;@x + dec hl ;@damage + ld a,(hl) ;bullet damage=size + 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 ix,spr_bullet01 ;first sprite + add ix,de ;add offset (go to correct sprite) + pop de ;saved position + psh de ;but will be altered so save again cal putsprite ;display bullet pop de cal check_bullethits next_ybullet: - pop hl - pop bc + pop hl ;restore enemy+type inc hl inc hl inc hl - djnz scan_bullets ;next bullet (loop) + inc hl ;skip type,dam,x,y: next enemy+type + pop bc ;b=counter + dnz scan_bullets ;next bullet (loop) ret -;--------------------------- check bullethits -------------------------------- +;--------------------------- check bullethits ------------------------------- check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet ld b,nrenemies - ld hl,enemies + ld hl,enemies+1 hit_enemies: ;Hits with normal enemies + psh bc ;enemy counter psh hl ld a,(hl) @@ -1317,35 +1339,44 @@ hit_enemies: ;Hits with normal enemies jp m,nohit psh hl - ld hl,(temp1) - ld (hl),$00 ;remove bullet - pop hl - + ld hl,0 ;@bulletType +temp1 =$-2 + ld (hl),0 ;remove bullet + inc hl ;@damage + ld a,(hl) ;set damage + pop hl ;enemy+y cal enemy_hit - nohit: pop hl - inc hl - inc hl - inc hl - inc hl - djnz hit_enemies ;check next enemy + ld bc,enemysize + add hl,bc + pop bc + dnz hit_enemies ;check next enemy ret -enemy_hit: - dec hl - dec hl - dec hl - ld a,(hl) ;occ - ld c,a ;psh occ - and %11111100 ;occ/4 = HP left ; jump - ld (hl),%01 ;set to explode +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 + dec hl ;@x + dec hl ;@type + dec hl ;@hp00 (occ) + ld a,(hl) ;load hp00 + sub b ;decrease HP (if <0xx then c is set) + ld (hl),a ;save (no flag-changes) + dec hl ;@hp64; no change in c + ld a,(hl) ;load; no c-change + sbc a,0 ;if cf then decrease a + ld (hl),a ;save back the new value + ret nc ;if a>=0 then return, otherwise explode + + inc hl ;goto occ again + ld (hl),%01 ;set to explode ld a,(pickuptimer) ;counts enemies destroyed dec a ;enough destroyed for a pickup? jr nz,pickupdone ;otherwise just explode - ld (hl),%00000110 ;change it into a pickup (with 2 HP) + ld (hl),%110 ;change it into a pickup (with 2 HP) ld a,18 ;reset enemies counter (18 hits = next) pickupdone: ld (pickuptimer),a ;save new enemiescounter value @@ -1353,16 +1384,9 @@ pickupdone: ld (hl),$00 ;explosionFrame 0 ld hl,1 ;increase score by one - cal scoreInc - ret - -hpleft: - ld a,c ;pop occ - sub %00000100 ;decrease HP by one - ld (hl),a ;save - ret + jp scoreInc ;+ret -;--------------------------- handle torpedo ---------------------------------- +;--------------------------- handle torpedo --------------------------------- Handle_torp: ld a,(torp_occ) @@ -1396,7 +1420,7 @@ remove_torp: ld (torp_occ),a ret -;--------------------------- level events ------------------------------------- +;--------------------------- level events ----------------------------------- Level_event: ld hl,nextevent ;time to next event - ld (hl),1 ;set move-counter to 1 - inc hl ;hl to + inc de ;set move + ld a,1 ;movecounter = 1 + ld (de),a ;&&&(hl),1 better? - ld a,(level_move) - and %00010000 - jr z,ffiredelayed - ld a,1 ;set time-to-fire to 1 frame (fires directly) - jr ffireOK -ffiredelayed: - ld a,(level_fire) ;set "ttf" to normal nr of frames -ffireOK: - ld (hl),a - inc hl ;hl to - ld (hl),1 ;type 1 - inc hl ;hl to - ld a,(RanPos) - and %01111111 - ld (hl),a ;type 1 + inc de ;set fire + ld a,(level_info) + and %00000001 ;bit meaning directfire + jr nz,ffireOK ;(a=time-to-fire) = 1 frame (fires directly) + ld a,(level_fire) ;set ttf to normal nr of frames +ffireOK:ld (de),a ;save fire ret ;return -;--------------------------- enemy fires -------------------------------------- +;--------------------------- enemy fires ------------------------------------ Enemy_fires: ;de = x,y dec d @@ -1549,13 +1566,13 @@ find_ebullet: or a jr z,found_ebullet ;0 = not used inc hl \ inc hl \ inc hl - djnz find_ebullet ;look next bullet + dnz find_ebullet ;look next bullet ret found_ebullet: ld b,%1100 - ld a,(level_move) - and %10000000 + ld a,(level_info) + and %00001000 jr z,bulletok ld a,(y) @@ -1576,19 +1593,17 @@ bulletnotup: ld b,%1000 bulletok: -; ld a,c ;load bullet type -; add a,a ;type*2 %..Btype. -; add a,a ;type*4 %.Btype.. -; add a,a ;type*8 %Btype... - ;add bullet direction %BtypeDir - ld (hl),b ;set bullet direction + ld a,(level_info) + and %11110000 + or b + ld (hl),a ;set bullet direction inc hl ld (hl),d ;set x-pos inc hl ld (hl),e ;set y-pos ret -;----------------------------- enemy bullets ---------------------------------- +;----------------------------- enemy bullets -------------------------------- Enemy_bullets: ld hl,ebullets @@ -1597,17 +1612,17 @@ handle_bullet: psh bc psh hl ld a,(hl) ;load bulletType in a - or a ;is it 0? - jr nz,enemy_bullet ;no: handle bullet + and %1111 ;select direction-bits + jr nz,enemy_bullet ;non-0: handle bullet next_bullet: pop hl ;do not move the pop bc inc hl \ inc hl \ inc hl - djnz handle_bullet + dnz handle_bullet ret enemy_bullet: - ld b,a ;save type + ld b,a ;save type&%1111 inc hl ;bullet x ld a,(hl) ;check if it has reached the left side of scrn and %11111110 ;it is <2 (0 or 1)? @@ -1618,9 +1633,9 @@ enemy_bullet: inc hl ;@y ld a,b ;restore type - cp %1100 ;&&& use + cp %1100 ;is it a normal bullet? (cp = faster than bit) jr z,ebullet_common ;type %1100: normal bullet - and %111 + and %111 ;isolate important bits jr z,ebullet_down ;type %1000: moving down dec a jr z,ebullet_up ;type %1001: moving up @@ -1676,16 +1691,21 @@ ebullet_hits: cp 9 jr nc,next_bullet + pop hl ;points to bullettype again + psh hl ;and save it again (ivm call to damage_you) + ld a,(hl) ;load bullettype + cal _shracc ;isolate damage-bits (%1111???? -> %00001111) + ld b,a ;set damage-amount cal damage_you ;HIT!! remove_ebullet: pop hl ;hl could be destroyed by damage_you ld (hl),0 ;bullet > unused jr next_bullet+1 ;next bullet (SKIP THE = one byte) -;--------------------------- handle enemies ----------------------------------- +;--------------------------- handle enemies --------------------------------- Handle_enemies: - ld hl,enemies + ld hl,enemies+1 ld b,nrenemies ;handle all enemies handle_enemy: @@ -1731,36 +1751,35 @@ normal_enemy: ;occ "normal" 2 or "moving" 3 jr firing_done ;continue check_enemyfire: - ld bc,add2enemy+1-2 ;offset of - add hl,bc ;go there (@hl) + inc hl ;go to + inc hl ;go to + inc hl ;go to dec (hl) ;decrease counter till next blast - ld a,(hl) ;load new counter + ld a,(hl) ;&&&doesn't seem efficient to me or a ;has it reached zero? jr nz,firing_done ;finished if not ld a,(level_fire) ;re-set counter for next blast ld (hl),a ;save time to fire - inc hl ;next byte = bullettype - ld c,(hl) ;c = bullet type + inc hl ;next byte = bullettype &&& psh de ;save registers for firing-use cal Enemy_fires ;fires bullet pop de ;restore (destroyed by Enemy_fires) firing_done: - cal putwidesprite ;display sprite @ix + cal putwidesprite ;display sprite @ix next_enemy: pop hl - ld bc,$0004 + ld bc,enemysize add hl,bc pop bc - djnz handle_enemy + dnz handle_enemy ret remove_enemy: pop hl ld (hl),$0000 ;bye bye enemy - psh hl - jr next_enemy + jr next_enemy+1 ;continue AFTER pop hl (already done) exploding_enemy: inc hl @@ -1776,11 +1795,11 @@ exploding_enemy: ld (hl),a ;next frame jr next_enemy -;--------------------------- moving enemies ----------------------------------- +;--------------------------- moving enemies --------------------------------- moving_enemy: ld a,(level_move) - and %1111 + and a jr z,movetype_updown ;type 0 dec a jr z,movetype_vslow ;1 @@ -1836,19 +1855,17 @@ lure_up: ret movetype_smart: - ld bc,add2enemy - add hl,bc - + inc hl ;hl =@ ld a,(timer) - and %1111 - ld a,(hl) + and %1111 ; | + ld a,(hl) ;&&& \|/ jr nz,smartupdate inc a smartupdate: ld (hl),a or a ;reset carry flag - sbc hl,bc + dec hl ;reset hl to and %11111100 jr z,movetype_fast @@ -1870,9 +1887,7 @@ movetype_vfast: jp remove_enemy ;remove this enemy (off screen) movetype_updown: - ld bc,add2enemy - add hl,bc - + inc hl ;@ ld a,(hl) dec a jr nz,move_updated @@ -1881,7 +1896,7 @@ move_updated: ld (hl),a or a ;reset carry flag - sbc hl,bc + dec hl ;@ and %00100000 ld a,(hl);&&&ld a,e ;load current y-position jr z,movedown @@ -1897,7 +1912,7 @@ movedown: inc e ;otherwise save new position ret ;and return -;--------------------------- check collision ---------------------------------- +;--------------------------- check collision -------------------------------- Enemies_hit: ld hl,(x) ;e = X, d = Y @@ -1906,7 +1921,7 @@ Enemies_hit: ld d,h ld e,l ;e = X+7, d = Y+7 - ld hl,enemies + ld hl,enemies+1 ld b,nrenemies ;check all 20 enemies check_collision: psh hl @@ -1980,18 +1995,19 @@ collide: sub %00000100 ld (hl),a collide_done: + ld b,4 ;damage cal damage_you check_next: pop hl - inc hl - inc hl - inc hl - inc hl - djnz check_collision + ld a,b ;psh bc + ld bc,enemysize + add hl,bc + ld b,a ;pop bc + dnz check_collision ret -;--------------------------- story ------------------------------------------- +;--------------------------- story ------------------------------------------ storyPage: psh hl @@ -2028,21 +2044,20 @@ storyLine: pop hl ret -Story: - ld hl,story01-1 - cal storyPage - cal storyPage - cal storyPage - ret +dostory: + cal storyPage ;do some story + inc hl ;look at next hl + ld a,(hl) ;load in a + dec hl ;restory hl + inc a ;set z-flag if a = $ff + jr nz,dostory ;otherwise loop -story01: - .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 - .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 - .db $09,$19,"the Nemesis saga continues",0,1 - .db $2e,$21,"with NEMESIS 86" ,0,1 - .db $52,$36,"by Shiar" ,0,0,$19,$23 + ld bc,5 ;story ends + add hl,bc ;set hl to beginning of the level + ld (levelp),hl ;set the level-pointer + ret ;and return -;--------------------------- SFX --------------------------------------------- +;--------------------------- SFX -------------------------------------------- CDoSFX: ld hl,VIDEO_MEM @@ -2092,26 +2107,28 @@ SFXdisp: ;display this frame on screen 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 - djnz SFXdisp ;repeat until whole screen is displayed + dnz SFXdisp ;repeat until whole screen is displayed ld b,8 SFXdelay: halt - djnz SFXdelay + dnz SFXdelay - pop bc - djnz SFXframe + pop bc + dnz SFXframe ret -;--------------------------- show icon ---------------------------------------- +;--------------------------- show icon -------------------------------------- drawline: ld (hl),a ;draw one piece of the divider-line inc hl ;move right (8 pixels = 1 byte) - djnz drawline ;repeat (16bytes * 8pixels =128= screen width) + dnz drawline ;repeat (16bytes * 8pixels =128= screen width) ret disp_icons: + psh bc \ psh de \ psh hl \ psh ix ;&&& + ld hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom ld (PutWhere),hl ;place icons at bottom of normal screen ld b,16 ;draw 16x (screen width) @@ -2127,7 +2144,7 @@ disp_icons: ld ix,spr_icon01 ;armorIcon ld de,$1901 ;icon #1 cal putwidesprite ;display icon - cal disp_armor ;display value + cal disp_armor ;display bar ld ix,spr_icon00 ld a,(torp_occ) @@ -2144,7 +2161,9 @@ no_torp: ld hl,$3945 ;position to display bullet-type digit ld a,(your_weapon) ;digit dec a ;minus one (1=laser) - cal _disp_armor ;display digit + ld (_penCol),hl ;set location + add a,'0' ;make digit + cal _vputmap ;display char ld ix,spr_icon00 ;emptyIcon ld a,(your_weapon) @@ -2183,19 +2202,46 @@ no_multiples: iconsdone: ld hl,GRAPH_MEM ;normal game-screen ld (PutWhere),hl ;set sprite-position to normal screen + + pop ix \ pop hl \ pop de \ pop bc ret disp_armor: - ld hl,$3925 ;Display Armor left - ld a,(your_armor) ;load armor left -_disp_armor: - ld (_penCol),hl ;place @ armorIcon - add a,'0' ;make digit - cal _vputmap ;display char + ld hl,(57*16)+VIDEO_MEM+3 + ld b,3 +armorbarclr: + dec hl + ld (hl),0 + dnz armorbarclr + + ld a,(your_armor) ;load your armor + ld c,a ;psh a + srl a ;/2 + srl a ;/4 + srl a ;/8: don't display last 2 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 + inc hl ;next position + dnz armorbar ;loop it b times + +noarmorbar: + ld a,c ;pop a + and %111 ;display last bits of armor + ret z ;if armor=0 then bit = %00000000 (don't disp) + ld b,a ;into B + xor a ;bit = %00000000 +armorbarbit: + scf ;set carry flag + rra ;rotates A right and sets bit 7 (c-flag) + dnz armorbarbit ;repeat B times (so if B=6 then a=%11111100) +armorbarready: ; (an if B=3 then a=%11100000) + ld (hl),a ;draw this last byte ret disp_lives: - ld hl,$3900 ;display Lives + ld hl,$3A00 ;display Lives ld (_penCol),hl ;bottom left ld hl,savestr+2 ld (hl),'L' @@ -2207,10 +2253,9 @@ disp_lives: add a,'0' ;make digit ld (hl),a dec hl \ dec hl - cal _vputs ;display on screen - ret + jp _vputs ;display on screen +ret -;--------------------------- proc --------------------------------------------- +;--------------------------- proc ------------------------------------------- Random5016: cal Random50 ; a = 0..50 @@ -2257,12 +2302,12 @@ find_sprite: ;destroyed: de ix psh hl ld e,(hl) ;e = enemy type ld d,0 ;de = e - ld hl,sprites ;hl = @sprites offset-table + 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,spr_enemy00 ;first enemy sprite + ld ix,XLsprenemies ;first enemy sprite add ix,de ;add offset for current enemy add ix,de ;twice (offset stored as offset/2) pop hl @@ -2284,17 +2329,17 @@ waitnokeypressed: jr nz,waitnokeypressed ret -Decompress: +Decompress: ;hl=source(compressed) de=dest(decompressed) ld a,(hl) bit 7,a - jr z,Compressed + jr z,compressed inc hl - and 01111111b + and %01111111 ld b,0 ld c,a ldir jr Decompress -Compressed: +compressed: psh af or %11111100 ld b,a @@ -2319,7 +2364,7 @@ Compressed: pop hl jr Decompress -;--------------------------- game over / new game / death --------------------- +;--------------------------- game over / new game / death ------------------- chartable: .db 0,"!<>^",0,0,0,0 .db 0,"xtoje0",0 ;enter..clear @@ -2339,16 +2384,36 @@ save_hi: ret c ;not found? who cares... xor a - ld hl,4+stored_data_start-_asm_exec_ram + ld hl,4+storehi_start-_asm_exec_ram add hl,de ;hl=pointer to data in original prog adc a,b cal _SET_ABS_DEST_ADDR xor a - ld hl,stored_data_start + ld hl,storehi_start cal _SET_ABS_SRC_ADDR - ld hl,stored_data_end-stored_data_start + ld hl,storehi_end-storehi_start cal _SET_MM_NUM_BYTES - jp _mm_ldir ;save done (cal \ ret) + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 + +save_lvl: + ld hl,own_name-1 ;find own variable + rst 20h ;cal _ABS_MOV10TOOP1 + rst 10h ;cal _FINDSYM + ret c ;not found? who cares... + + xor a + ld hl,4+storesave_start-_asm_exec_ram + add hl,de ;hl=pointer to data in original prog + adc a,b + cal _SET_ABS_DEST_ADDR + xor a + ld hl,storesave_start + cal _SET_ABS_SRC_ADDR + ld hl,storesave_end-storesave_start + cal _SET_MM_NUM_BYTES + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 game_over: pop hl ;=ret (game_over was called from a procedure) @@ -2466,65 +2531,76 @@ hiscoredone: restore_line: set 1,(hl) add hl,de - djnz restore_line + dnz restore_line cal _getkey ;wait for keypress jp quit ;restore some things and return to TI-OS/shell New_game: - xor a ;score 0 + xor a ;ld a,0 ld (score),a ;reset score - ld (score+1),a ;reset score + ld (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 ;level #1 - ld (level),a ;reset level nr - ld hl,level01 ;set level pointer to level#1 + inc a ;ld a,1 + ld (level),a ;reset level nr (#1) + ld hl,XLlevelsdata ;set level pointer to level#1 ld (levelp),hl ;reset level pointer inc a ;ld a,2 ld (your_weapon),a ;default weapon ld a,4 ld (your_lives),a ;3 lives (4 will be decreased @ You_die) ld (pickuptimer),a ;next pickup after 4 enemies destroyed - inc a ;ld a,5 - ld (your_armor),a - ld a,(weapons+1) ;max number of bullets (varies per weap.class) - ld (ybuls),a You_die: - ld hl,your_lives - dec (hl) ;decrease lives - ld a,(hl) ;load lives left - inc a ;if lives=0ffh then a=0 - jp z,game_over ;if so, game's over - jr nonext_level + 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 + jr samelevel -;--------------------------- next level --------------------------------------- +;--------------------------- next level ------------------------------------- Next_level: + ld a,(your_armor) ;load current armor + cp 25-8 ;may not become >=25 + jr c,addok ;ok then just add 8 + ld a,25-8 ;set to maximum (8 will be added below) +addok: + add a,8 ;add 8 to armor + ld (your_armor),a ;change armor + ld hl,level ;level number ld a,(hl) inc a ld (hl),a - ld hl,(levelp) ;level pointer - ld bc,5+32+4+3 ;advance one level - add hl,bc ;update to point to next level - ld (levelp),hl ;save - + add a,a + add a,a ld h,0 ;increase score.... - ld l,a ;by level number + ld l,a ;by level number * 4 ld bc,20 add hl,bc ;plus 20 cal scoreInc ;update score -nonext_level: + ld hl,(levelp) ;level pointer + ld bc,5+32+4+4 ;advance one level + add hl,bc ;update to point to next level + ld (levelp),hl ;save + +samelevel: ld a,80 ld (nextevent),a ;time to first enemy appearance ld hl,(levelp) ;level pointer + xor a + cp (hl) + cal z,dostory + ld a,(hl) ;load new level-enemy type ld (level_enemy),a ;set level-enemy inc hl @@ -2534,6 +2610,9 @@ nonext_level: ld a,(hl) ;load nr of enemies in this level ld (eventleft),a ;set nr of events left inc hl + ld a,(hl) ; + ld (level_info),a ; + inc hl ld a,(hl) ;movement of enemies in this level ld (level_move),a ;do it inc hl @@ -2578,10 +2657,10 @@ torpsclear: ld hl,enemies ;remove all enemies and bullets ld (hl),0 ;clear first byte ld de,enemies+1 ;copy this to the next byte - ld bc,(add2enemy*2)+((nrybuls+nrebuls)*3)-1 - ldir ;clear enemy-info + enemiesxtra + all bullets + ld bc,(nrenemies*enemysize)+((nrybuls+nrebuls)*3)-1 + ldir ;clear enemies + bullets (y/e) -;--------------------------- setup game --------------------------------------- +;--------------------------- setup game ------------------------------------- game_setup: cal BLACKLCD @@ -2613,10 +2692,11 @@ game_setup: res 3,(iy+5) ;set white on black cal _getkey ;wait for keypress + cp kF1 + cal z,save_lvl - cal CLEARLCD ;clear screen - cal disp_icons ;display bottom icons - ret + cal _clrLCD ;clear screen + jp disp_icons ;display bottom icons +ret placestars: cal Random5016 ;a = (0..50)*16 = random y-pos @@ -2629,14 +2709,30 @@ placestars: ld (ix),l ;save x-pos (l) ld (ix+1),h ;save y-pos (h) inc ix \ inc ix ;next star - djnz placestars ;repeat for all stars + dnz placestars ;repeat for all stars ret -;--------------------------- putsprite ---------------------------------------- -;--------------------------- de =(X,Y) ---------------------------------------- +loadweapon: + ld a,(your_weapon) + add a,a ;weap*2 + add a,a ; *4 + add a,a ; *8 + ld c,a + ld b,0 + ld hl,weapondata-16 + add hl,bc + ld a,(hl) + ld (weapdamage),a ;damage of bullets + inc hl + ld a,(hl) +; ld (weapdaminc),a ;damage increase + ret + +;--------------------------- putsprite -------------------------------------- +;--------------------------- de =(X,Y) -------------------------------------- offsets_table: - .db 128,64,32,%10000,%01000,%00100,%00010,%00001 + .db $80,$40,$20,$10,8,4,2,1 putsprite: ld a,d ;a = X and %00000111 ;a = X mod 8 = bit nr. to mask @@ -2682,89 +2778,89 @@ _noplot:rrca jr nc,_notedge ;Test if edge of byte reached inc hl ;Go to next byte _notedge: - djnz _iloop + dnz _iloop pop hl ;Restore address ld bc,16 ;Go to next line add hl,bc pop bc ;Restore data - djnz _oloop - ret + dnz _oloop + ret ;s are used instead of = faster -;--------------------------- putbigsprite ------------------------------------- +;--------------------------- putbigsprite ----------------------------------- putwidesprite: - ld a,d - and 7 - ld hl,offsets_table - ld c,a - ld b,0 - add hl,bc - ld a,(hl) - ld (wsmc1+1),a - ld (wsmc2+1),a - ld hl,(PutWhere) - - ld a,e - add a,a - add a,a - add a,a - - rl b - add a,a - rl b - srl d - srl d - srl d - add a,d - jr nc,n1 - inc b -n1: ld c,a - add hl,bc - - ld d,(ix) - ld b,(ix+1) -woloop: psh bc ;Save # of rows - psh hl ;Save screen address - ld b,d ;Load width - ld c,(ix+2) ;Load one line of image - inc ix -wsmc1: ld a,1 ;Load pixel mask -wiloop: sla c ;Test leftmost pixel - jr nc,wnoplot ;See if a plot is needed - ld e,a ;OR pixel with screen - or (hl) - ld (hl),a - ld a,e + ld a,d + and 7 + ld hl,offsets_table + ld c,a + ld b,0 + add hl,bc + ld a,(hl) + ld (wsmc1+1),a + ld (wsmc2+1),a + ld hl,(PutWhere) + + ld a,e + add a,a + add a,a + add a,a + + rl b + add a,a + rl b + srl d + srl d + srl d + add a,d + jr nc,n1 + inc b +n1: ld c,a + add hl,bc + + ld d,(ix) + ld b,(ix+1) +woloop: psh bc ;Save # of rows + psh hl ;Save screen address + ld b,d ;Load width + ld c,(ix+2) ;Load one line of image + inc ix +wsmc1: ld a,1 ;Load pixel mask +wiloop: sla c ;Test leftmost pixel + jr nc,wnoplot ;See if a plot is needed + ld e,a ;OR pixel with screen + or (hl) + ld (hl),a + ld a,e wnoplot: rrca - jr nc,wnotedge ;Test if edge of byte reached - inc hl ;Go to next byte + jr nc,wnotedge ;Test if edge of byte reached + inc hl ;Go to next byte wnotedge: -wsmc2: cp 1 - jr z,wover_1 - - djnz wiloop - pop hl ;Restore address - ld bc,16 ;Go to next line - add hl,bc - pop bc ;Restore data - djnz woloop +wsmc2: cp 1 + jr z,wover_1 + + dnz wiloop + pop hl ;Restore address + ld bc,16 ;Go to next line + add hl,bc + pop bc ;Restore data + dnz woloop ret wover_1: - ld c,(ix+2) - inc ix - djnz wiloop - dec ix - pop hl - ld bc,16 - add hl,bc - pop bc - djnz woloop + ld c,(ix+2) + inc ix + dnz wiloop + dec ix + pop hl + ld bc,16 + add hl,bc + pop bc + dnz woloop ret -;------------------------------------------------------------------------------ -;------------------------------- sprites -------------------------------------- -;------------------------------------------------------------------------------ +;---------------------------------------------------------------------------- +;------------------------------- sprites ------------------------------------ +;---------------------------------------------------------------------------- spr_ship01: .db 7,7 ;ship alpha class @@ -2777,14 +2873,6 @@ spr_ship01: .db %01111000 ; ████ spr_ship01i: .db 7,7 ;ship alpha class - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %01010000 ; █ █ .db %10100000 ; █ █ .db %01010100 ; █ █ █ @@ -2819,16 +2907,38 @@ spr_multiple: .db %11111100 ; ██████ .db %01111000 ; ████ +;--------------------------------- bullets ---------------------------------- + spr_bullet01: - .db 5,3 ;your bullets - .db %00110000 ; ░▒▓█▒ - .db %11111000 ; ░▒▓████▒ - .db %00110000 ; ░▒▓█▒ + .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 ; ░▒▓███▒ + .db %11110000 ;▒████ + .db %11111000 ;▒█████ + .db %11110000 ;▒████ spr_bullett1: .db 4,3 ;▒▒▒ .db %11100000 ;▒███ @@ -2841,7 +2951,7 @@ spr_bullete1: .db %11110000 ; ▒███▓▒░ .db %01100000 ; ▒█▓▒░ -;---------------------------------------- explosion ------------------------------------------- +;-------------------------------- explosion --------------------------------- spr_explosion: .db 8,6 ;1 @@ -2917,7 +3027,7 @@ spr_yexplosion: .db %00000000 ; .db %00000000 ; -;--------------------------------------- bar ----------------------------------- +;------------------------------------ bar ----------------------------------- spr_iconhalf: .db 16,7 ;selected .......: @@ -2948,13 +3058,13 @@ spr_icon00: .db %10101010,%10101010 ; █ █ █ █ █ █ █ █ spr_icon01: .db 16,7 ;armor ; .......:.......: - .db %10001111,%10000000 ; █ █████ - .db %10010000,%01000000 ; █ █ █ ▒▒▒ - .db %10101110,%00100000 ; █ █ ███ █ ▒▒▒ - .db %10100111,%10100000 ; █ █ ████ █ ▒▒▒ - .db %10101110,%00100000 ; █ █ ███ █ ▒▒▒ - .db %10010000,%01000000 ; █ █ █ ▒▒▒ - .db %10001111,%10000000 ; █ █████ + .db %10000111,%11110000 ; █ ███████ + .db %10011000,%00001100 ; █ ██ ██ + .db %10110011,%11000110 ; █ ██ ████ ██ + .db %10110000,%11110110 ; █ ██ ████ ██ + .db %10110011,%11000110 ; █ ██ ████ ██ + .db %10011000,%00001100 ; █ ██ ██ + .db %10000111,%11110000 ; █ ███████ spr_icon02: .db 16,7 ;torpedo .......:.......: .db %10111000,%00010101 ; █ ███ █ █ █ @@ -2995,12 +3105,26 @@ spr_dividerline: .db 8,7 .db 128,128,128,128,128,128,128 ;128 = %10000000 -;---------------------------- texts ------------------------------------------- +;-------------------------- 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 -txt_about: .db " v0.95.A22",127,"by Shiar",0 +;---------------------------- texts ----------------------------------------- + +txt_about: .db " v0.96.A30",127,"by Shiar",0 txt_email: .db "shiar0@hotmail.com",0 -txt_menu1: .db "CONTINUE",0 -txt_menu2: .db "NEW GAME",0 +txt_menu1: .db "NEW GAME",0 +txt_menu2: .db "CONTINUE",0 txt_level: .db "LEVEL ",0 txt_gameover: .db "GAME OVER!",0 @@ -3012,33 +3136,286 @@ txt_pressenter: .db "Enter to continue",0 txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0 txt_teacherans: .db Lneg,"14.2063168184",0 -;---------------------------- save data --------------------------------------- +;---------------------------- save data ------------------------------------- PutWhere .dw GRAPH_MEM ;where to put the wide sprites -level .db $00 ;level number -levelp .dw $0000 ;pointer to level data - -score .dw $0000 +laserlasts .db 5 -stored_data_start: +storehi_start: hiscore .dw $0000 -hiname .db "Shiar.95",0 -stored_data_end: +hiname .db "Shiar.97",0 +storehi_end: + +storesave_start: +level .db $01 ;level number +levelp .dw XLlevelsdata ;pointer to level data +pickuptimer .db $04 ;counts when to place a pickup +score .dw $0000 your_pickup .db $00 your_occ .db $00 ;0=normal 1..16=exploding your_inv .db $00 ;invincibility left -your_armor .db $05 ;HP left -your_lives .db $00 ; +your_armor .db $0a ;HP left +your_lives .db $03 ; -your_weapon .db $00 ;laser avail: 0=no, 1=yes +your_weapon .db $02 ;weapon: 0=no, 1=laser, 2+=bullet n+1 your_multiples .db $00 ;multiples present torp_occ .db $00 ;torp.state: 0=unavail 1=avail 2=presnt torp_pos .dw $0000 ;torpedo position (x,y) +storesave_end: + -#include nemesis0.z80 +;XLlevelsdata:--------------------------------------------------------------- +XLlevelsdata: -;----------------------------- logo ------------------------------------------- + .db 0 + .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 + .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 + .db $09,$19,"the Nemesis saga continues",0,1 + .db $2e,$21,"with NEMESIS 86" ,0,1 + .db $52,$36,"by Shiar" ,0,0,$19,$23 + .db $ff + +;format:[enemy nr] [enemy frequency] [next lvl] +; [level_info: 0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] +; [level_move] [level_fire] [tunnel size] [groundtype] [16_ground] +; [16_ceiling] [stars1] [stars2] + + .db $15,$07,$08 ;fireFreq; moveType; enemyType +level01: ;efrequency must be odd if halfluring! + .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f ; 7 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1 ; 2 + .db $10,$07,$09 ; 3 + + .db 0 + .db $01,01,"And the storyline conti", + .db "nues.....",0,1 + .db $01,09,"You decide to fly close", + .db " to the",0,1 + .db $01,15,"surface of a nearby pl", + .db "anet =)",0,0,1,20 + .db $FF + + .db $10,$07,$09 ; 3 +level02: ;44 + .db $02,$13,$4b,%00100101,0,064,0,0 + .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0E,$07,$09 + + .db 0 + .db $01,01,"Blablabla...",0,1 + .db $01,34,"this storyline sux",0,0,1,39 + .DB $FF + + .db $0E,$07,$09 +level03: + .db $03,$2d,$3f,%00010110,0,255,-9,1 + .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20 + .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18 + .db -1,-1 + + .db $0D,$07,$08 +level04: + .db $04,$11,$41,%00100001,0,057,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0C,$07,$09 +level05: + .db $05,$11,$45,%00100101,%10,031,-7,1 + .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2 + .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0B,$07,$08 +level06: + .db $06,$19,$3a,%00100111,0,255,-4,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + + .db $08,$07,$09 +level07: + .db $07,$09,$ff,%00100001,0,043,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + +;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: + +spr_enemy00: + .db 8,8 ;pickup + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %11111111 ; ████████ + .db %11111111 ; ████████ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + +spr_enemy01: + .db 6,6 ;enemy type one + .db %00111100 ; ████ + .db %01110000 ; ███ + .db %11110000 ; ████ + .db %11110000 ; ████ + .db %01110000 ; ███ + .db %00111100 ; ████ +spr_enemy02: + .db 8,6 ;enemy type two + .db %00111111 ; █████ + .db %01111000 ; ████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111000 ; ████ + .db %00111111 ; █████ +spr_enemy03: + .db 6,6 ;enemy type three + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %11110000 ; ████ + .db %01111100 ; █████ +spr_enemy04: + .db 6,6 ;enemy type four + .db %00111000 ; ███ + .db %01111100 ; █████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %01111100 ; █████ + .db %00111000 ; ███ +spr_enemy05: + .db 7,6 ;enemy type five + .db %00011110 ; ████ + .db %01111110 ; ██████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111110 ; ██████ + .db %00011110 ; ████ +spr_enemy06: + .db 7,6 ;enemy type six + .db %00011100 ; ███ + .db %01111110 ; ██████ + .db %10111000 ; █ ███ + .db %10111000 ; █ ███ + .db %01111110 ; ██████ + .db %00011100 ; ███ +spr_enemy07: + .db 8,6 ;enemy type seven + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +spr_boss01: + .db 16,10 ;boss type one + .db %00000001,%11111111 ; █████████ + .db %00001111,%11111110 ; ███████████ + .db %00111111,%11110000 ; ██████████ + .db %01011111,%10000000 ; █ ██████ + .db %10011111,%01000000 ; █ █████ █ + .db %10011111,%01000000 ; █ █████ █ + .db %01011111,%10000000 ; █ ██████ + .db %00111111,%11110000 ; ██████████ + .db %00001111,%11111110 ; ███████████ + .db %00000001,%11111111 ; █████████ +spr_boss02: + .db 16,10 ;boss type:one : + .db %11111110,%00000000 ; ███████ + .db %00001111,%10001111 ; █████ ████ + .db %00111111,%11100011 ; █████████ ██ + .db %01001111,%11111110 ; █ ███████████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %01001111,%11111110 ; █ ███████████ + .db %00111111,%11100011 ; █████████ ██ + .db %00001111,%10001111 ; █████ ████ + .db %11111110,%00000000 ; ███████ + + +spr_enemy08: + .db 8,6 ;enemy type eight + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +;---------------------------------------------------------------------------- +;----------------------------- logo ------------------------------------------ +;---------------------------------------------------------------------------- logo_nemesis: .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000 @@ -3061,66 +3438,16 @@ logo_nemesis: .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001 -;----------------------------- end -------------------------------------------- +;----------------------------- end ------------------------------------------ .end .end -;------------------------------------------------------------------------------ +;---------------------------------------------------------------------------- +;---------------------------------------------------------------------------- +;---------------------------------------------------------------------------- -; 0.94.A08 -- 08.X.99 -- size 4531 (4456) -; -; + starfield background scrolling left (2 layers (front and back)) -; * enemies aim their bullets towards you: 5 different directions! -; # removed some unintended instructions -; * gamefield is now white on black instead of normal black on white! -; + enemies can also move slowly, fast, very fast, or 1st fast then slow -; # you can't fire when you're exploding -; + GROUND scrolling at bottom. You die if you hit the ground (!!!) -; (unlike the ground in version 0.925test there are NO bugs) -; + ceiling scrolling at top, just like the ground -; * ground and ceiling profile are different each level -; * ground and/or ceiling can be non-present (speeding up cause skipped) -; # no more BIG crash if enemies fire too much bullets ( >10) -; + frequency of enemies firing bullets differs per level -; * stars scroll at alternate speeds, different than any ship/pick (3/4) -; + special effect displaying titlescreen (stole from Spaze Invaders'83) -; * enemies can fire either directly on entering the level, or not -; + "tunnel" (playfield) can narrow/grow at random (depending on level) -; * minimum size of "tunnel" can be different per level -; + menu at startup. select "NEW GAME" and "LOAD GAME" with up/down -; - nemesis doesn't use the SpazeInvaders effect anymore (took too long) -; + choosing new game will display a demo first (text will be displayed -; with special effect [SI] saying the storyline will come soon) -; * levels altered to be more challenging and different (seven levels) -; # the usual bugs that come with new features removed (i think?) -; * you get 5 shield-points at start and after death -; -; 0.95.A13 -- 13.X.99 -- size 4656 -; -; + BOSSES! at the end of a level a huge enemy will appear -; * bosses will move towards you, slowly. level=done when boss destroyed -; + normal enemies can also try to ram your ship (like bosses do) -; * when colliding with an enemy, his armor will decrease (if any) -; -; 0.95.A17 -- 17.X.99 -- size 4965 -; -; # fix: bullets at right side weren't removed on time (1pix too late) -; * each level has it's own boss -; + your bullets can have different speeds/directions -; + third icon selects bullet-upgrade: single, faster, double, triple -; * number of bullets varies per bullet-class (type 1 is max. 2 bullets) -; * all temp. vars are stored in TEXT_MEM and TEXT_MEM2 (anti-crash:) -; -; 0.95.A18 -- 18.X.99 -- size 5052 -; -; # vertical line next to score at game over screen removed (minor) -; # some unintended pixels at icon bar now gone (joy, joy) -; # number of bullets of a new weapon is loaded correctly -; # cleans GRAPH_MEM (Graph-screen) and TEXT_MEM (calculate screen)! -; # data not stored at TEXT_MEM2 but now at _asm_exec_ram+5100 -; ; 0.95.A22 -- 22.X.99 -- size 5321 ; ; * total size of enemy-sprites can now be 510 bytes (space = doubled!) @@ -3137,8 +3464,37 @@ logo_nemesis: ; 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! +; creating bugs like unexplained loss of armor and stuff! (I think) ; +; 0.96.A31 -- 31.X.99 -- size 4836 + 888 ; -; + added - removed * changed # bug fixed - +; # 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 +; +; # 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) +; + bullets "charge up" (more damage) when not firing +; + more powerful bullets have different sprites (larger=more damage) +; +; +; + added - removed * changed # bug fixed \ No newline at end of file