From ed35457487733b232bd6555e3ca233bc77e72bf7 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Sun, 31 Oct 1999 16:08:58 +0100 Subject: [PATCH] version 0.96 (beta): external levels, armor bar, continue # 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) --- nemesis.txt | 49 +-- nemesis.z80 | 882 ++++++++++++++++++++++++++++----------------------- nemesis0.z80 | 258 +++++++++------ 3 files changed, 663 insertions(+), 526 deletions(-) diff --git a/nemesis.txt b/nemesis.txt index 7469338..16ec69c 100644 --- a/nemesis.txt +++ b/nemesis.txt @@ -1,19 +1,19 @@ ------------------------------------------------------------------------------ Title : Nemesis - Version : 0.95.A22 Beta - Release Date : 22.X.99 - Filename : nemesis.86p (size 5321) + Version : 0.96.A31 Beta + Release Date : 31.X.99 + Filename : nemesis.86p (size 4842) Author(s) : Shiar - Email Address : shiar0@hotmail.com (mind the 0) + Email Address : shiar@mailroom.com ICQ : #43840958 - Web Page : come.to/shiar + Web Page : http://come.to/shiar Description : cool arcade-shoot-em-up-game Where to get this game : www.ticalc.org Other games by author : N/Y - Additional credits to : See below + Additional credits to : See bottom ->>>>>>> NOTE ON V.95 --------------------------------------------------------- +>>>>>>> NOTE ON V.96 --------------------------------------------------------- YES! NEMESIS was on the NEWS in TICALC.ORG! With a nice screenshot so you just couldn't ignore it!! And my, I received a lot of messages. Thanks to @@ -21,17 +21,17 @@ everybody, I'm very happy! More happiness: a new update featuring alot of bug fixes (Nemesis has now got some good beta-testers!), bosses, weapon-upgrades, LEFT+DOWN-bug fixed -(THANKS2 BRIAN KOROPOFF!), teacher key, hiscore name, much more. Again thank -you all and keep sending me stuff! I really appreciate it! +(THANKS2 BRIAN KOROPOFF!), teacher key, armor-bar, hiscorenames, external +levels, and much more. Again thank you all and keep sending me stuff! +I really appreciate it! >>>>>>> INTRO TO NEMESIS ----------------------------------------------------- - Nemesis is an old arcade-game for the MSX. It was a really good game, -that's why Konami made not only the three Nemesis games for the MSX -(Nemesis I (1986), ][ (1987) and III ('88)) but also four more Nemesis-clones -for the MSX as well as 36 versions for other systems including the Game Boy, -(S)NES and Play Station (as far as I'm aware of). + Nemesis is an old arcade-game for many platforms, originally for arcades. +I first played Nemesis III for the MSX (1988), but Konami made at least +> 41 < Nemesis-games (mostly named Nemesis, Gradius, Salamander, Parodius) +for systems including the Game Boy, (S)NES and Play Station. >>>>>>> CONTROLS ------------------------------------------------------------- @@ -45,7 +45,8 @@ MORE : pause EXIT : exit GRAPH : teacher! (press graph again to resume) - In main menu you can press F1 to toggle b<>w (not saved yet). + In main menu you can press F1 to toggle b<>w (will not be saved... yet). + A game can be saved by pressing F1 at the level-screen. >>>>>>> PICKUPS AND SO ------------------------------------------------------- @@ -63,17 +64,17 @@ This icon can be chosen more than once, to increase your shield-points. There are just seven levels for now, don't try to get to level eight. Things to come: +* compressed level-files * different enemies in one level * save options (like b<>w) -* save game -* more LEVELS!! more enemies more upgrades -* storyline +* boss key (saves game and quits) +* more LEVELS!! more enemies more upgrades more story * maybe obstacles? * source code release ? grayscale, sounds, multiplayer-option: probably not Continue to send me any IDEAS and BUGS found!! Or send me you like this -program, or even send me something if you don't. Again: shiar0@hotmail.com, +program, or even send me something if you don't. Again: shiar@mailroom.com, or ICQ #43840958! PLEASE! Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and @@ -82,10 +83,11 @@ Asm(. Nemesis will NOT run correctly under RASCALL with the memory LOCKED! >>>>>>> CREDITS -------------------------------------------------------------- - SHIAR programming and everything else. SHIAR0@HOTMAIL.COM + SHIAR programming and everything else. SHIAR@MAILROOM.COM DAVE betatester (if you need a bug, ask Dave :) BLACKBELT betatester (the one and only..) JONAH COHEN for teaching me z80 and stuff, also kinda betatester + FREE BIRD working on the storyline MATTHEW DALE betatester KONAMI for writing the original Nemesises and more great games PATRICK DAVIDSON wrote Galaxian; Nemesis uses his gfx-engine @@ -163,5 +165,12 @@ Most significant version changes since version 0.61. * Graph cleared, unintended pixels removed, prog reload, major bugfixes * When you got a hiscore, you can enter your name + Version 0.96Beta Size:4842 31.X + +* Armor-bar and enemy-bullets doing 1/4 damage (can vary per level) +* External levels (in nemesis0.86p) storing level/enemy-data and story +* You move faster, ground at boss, more bugs fixed, code optimized +* Game can be saved at start of a level (continue game does work now) + ---------------------------------------------------------------------- <<<<<<< diff --git a/nemesis.z80 b/nemesis.z80 index 48f79a6..3233444 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,12 +1,12 @@ ;------------------------------------------------------------------------------ ;---------------------- NEMESIS ----------------------------------------------- ;------------------------------------------------------------------------------ -; >>> NEMESIS <<< Version 0.95 BETA by SHIAR +; >>> NEMESIS <<< Version 0.96 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 (4836) nemesis0.86p (888) ; Author(s) : Shiar ; Email Address : shiar0@hotmail.com ; ICQ ; #43840958 @@ -24,21 +24,33 @@ #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 - -storepos = $8000 ;120 OF 165 -storepos2 = $8100 ;141 OF 167 +_clrWindow = $4a86 ;a new procedure from AsmStudio86 inc. files +_ex_ahl_bde = $45f3 +_shracc = $4383 +_dispahl = $4a33 +_asapvar = $d6fc + +storepos = _asm_exec_ram+6000 ;120 OF 165 +storepos2 = _asm_exec_ram+6200 ;141 OF 167 +exlevel = _asm_exec_ram+6400 ;784+OF 2.7kb + +XLlevelsdata = exlevel+8 ;size: upto 1016 bytes +XLweapondata = exlevel+1024 ;size: always 64 byte +XLenemytable = exlevel+1088 ;size: always 16 byt +XLenemyinfos = exlevel+1104 ;size: always 64 by +XLsprenemies = exlevel+1168 ;size: like 128 b (upto 1kb) ;---------------------- in-game vars ------------------------------------------ -temp1 = storepos ;$C0FA-C0FB ;temp (2 bytes) bullet +temp1 = storepos ;+0+1 ;temp (2 bytes) bullet just_fired = storepos+2 ; +2 ;counts how long a blast lasts curline = storepos+2 ; +2 ;used to display SFX @@ -56,9 +68,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 @@ -84,25 +96,22 @@ 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) +enemysize = 6 +enemies = storepos2 ; +0 ;info about each enemy (6byt) nrybuls = 10 -ybullets = enemiesxtra+add2enemy ;+80 ;60 bytes = 20(state,x,y) +ybullets = enemies+(nrenemies*6) ;+80 ;60 bytes = 20(state,x,y) nrebuls = 10 ebullets = ybullets+(nrybuls*3) ;+110 ;30 bytes = 10(state,x,y) ybuls = ebullets+(nrebuls*3) ;+140 ;^-----------------------------------<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) +; [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] +; [ship type or explosion frame] [x] [y] [move] [fire] ;---------------------- introduction ------------------------------------------ @@ -112,7 +121,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 ; ███ @@ -126,6 +135,8 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes ;---------------------- init -------------------------------------------------- +level_name: .db 8,"nemesis0" + StartFix: im 1 ld hl,$D400 @@ -154,11 +165,38 @@ int_end: init: cal BUSY_OFF ;turns the run-indicator off, obviously cal _clrScrn ;clean the screen - xor a ;: reset: + +Loadlevel: + ld hl,level_name-1 ;find own variable + rst 20h ;cal _ABS_MOV10TOOP1 + rst 10h ;cal _FINDSYM + ret c ;not found? who cares... + + cal _ex_ahl_bde + cal _SET_ABS_SRC_ADDR + xor a + ld hl,exlevel + cal _SET_ABS_DEST_ADDR + ld hl,4+4 + cal _SET_MM_NUM_BYTES + cal _mm_ldir + + ld hl,(exlevel+4+2) + cal _SET_MM_NUM_BYTES + cal _mm_ldir + + xor a + ld hl,XLweapondata + cal _SET_ABS_DEST_ADDR + ld hl,272 + cal _SET_MM_NUM_BYTES + cal _mm_ldir ;save done (cal \ ret) + +setup: xor a ;: reset: ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems. cal StartFix - +setcontrast: ld a,(CONTRAST) ;load current contrast level cp $1f ;if already at maximum... jr z,skipdarken ;...then skip level increase @@ -176,7 +214,7 @@ LogoPut: 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 @@ -195,7 +233,7 @@ AboveLogo: 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 @@ -261,8 +299,12 @@ menuloop: ld a,(menuitem) dec a - cal z,Story - cal New_game ;prepare level + jr nz,startnewgame + cal Continue_game + jr game_main_loop + +startnewgame: + cal New_game jr game_main_loop menuchange: @@ -322,10 +364,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,10 +376,10 @@ 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 @@ -470,10 +512,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,6 +534,7 @@ CheckGround: ;check for collision with the ground neg cp (hl) ret nc + ld b,5 jp damage_you ;--------------------------- ceiling ------------------------------------------ @@ -573,10 +616,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 +628,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,6 +638,7 @@ 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 --------------------------------------- @@ -604,7 +649,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,7 +687,7 @@ 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 -------------------------------------------- @@ -662,21 +707,11 @@ pause: 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 +720,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,' ' @@ -717,10 +747,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 +; cal _clrScrn +; jp _homeup ;--------------------------- display ------------------------------------------ Display_Screen: @@ -732,10 +762,10 @@ displayloop: displaytloop: ld a,(hl) ;copy byte from (hl) _invert: - xor $ff ; } ;invert byte (white<=>black) &&&& + 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,11 +780,10 @@ 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 @@ -790,32 +819,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 +857,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 +938,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,8 +961,9 @@ 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 @@ -944,7 +980,7 @@ 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 ------------------------------------- @@ -953,8 +989,14 @@ 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) +select1: + ld a,(your_armor) ;load current armor + cp 24 ;is it >=24 + ret nc ;then return (armor may not be 25 or more) + xor a + ld (your_pickup),a ;reset pickups (a=0) ld hl,your_armor ;change armor inc (hl) ;increase HPs by one jp disp_icons ;display and return @@ -981,7 +1023,7 @@ select3: add a,a ; *8 ld c,a ld b,0 - ld hl,weapons-7 + ld hl,XLweapondata-7 add hl,bc ld a,(hl) ld (ybuls),a @@ -1013,10 +1055,13 @@ Fire_bullet: ld hl,RanPos ;random inc (hl) ;update random counter +; ld a,(laserlasts) +; ld b,5 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 +1087,7 @@ fireany: dec a ;1=yes jr z,fire_laser - ld ix,weapons-6 + ld ix,XLweapondata-6 add a,a ;weap*2 add a,a ; *4 add a,a ; *8 @@ -1108,11 +1153,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) @@ -1149,11 +1194,11 @@ 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: @@ -1170,7 +1215,7 @@ find_ybullet: or a jr z,found_ybullet ;0 = no bullet here add hl,de - djnz find_ybullet ;look next bullet + dnz find_ybullet ;look next bullet ret found_ybullet: @@ -1189,13 +1234,13 @@ found_ybullet: ;------------------------ 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 @@ -1237,10 +1282,10 @@ bullet_noymove: remove_bullet: dec hl ld (hl),0 ;dump this bullet! - pop hl ;&&& + pop hl jr next_ybullet -Handle_bullets: ;&&&>> +Handle_bullets: ld hl,ybullets ld a,(ybuls) ld b,a @@ -1273,7 +1318,7 @@ next_ybullet: inc hl inc hl inc hl - djnz scan_bullets ;next bullet (loop) + dnz scan_bullets ;next bullet (loop) ret ;--------------------------- check bullethits -------------------------------- @@ -1325,11 +1370,11 @@ hit_enemies: ;Hits with normal enemies nohit: pop hl - inc hl - inc hl - inc hl - inc hl - djnz hit_enemies ;check next enemy + ld a,b ;psh bc + ld bc,enemysize + add hl,bc + ld b,a ;pop bc + dnz hit_enemies ;check next enemy ret enemy_hit: @@ -1353,8 +1398,7 @@ pickupdone: ld (hl),$00 ;explosionFrame 0 ld hl,1 ;increase score by one - cal scoreInc - ret + jp scoreInc ;+ret hpleft: ld a,c ;pop occ @@ -1423,64 +1467,63 @@ Level_event: ld (hl),123 ;set delay ret ;don't place any more enemies -place_boss: ;&&& - ld hl,(levelp) - dec hl - ld a,(hl) +place_boss: + ld hl,(levelp) ;the leveldata (including the boss) + dec hl ;points to leveldata\boss\enemynr + ld a,(hl) ;load it ld (level_enemy),a ;set new enemy (boss) - dec hl - ld a,(hl) - ld (level_move),a ;set boss movement (very slow) - dec hl - ld a,(hl) - ld (level_fire),a ;set rapid fire - cal do_event - ret + dec hl ;points to level\boss\movement + ld a,(hl) ;load + ld (level_move),a ;set boss movement + dec hl ;@level\boss\firefreq + ld a,(hl) ;load in a + ld (level_fire),a ;set firefrequency + jp do_event ;+ret standby_event: ld b,nrenemies - ld de,enemies-4 + ld hl,enemies-enemysize + ld de,enemysize chk_enemyleft: - inc de - inc de - inc de - inc de - ld a,(de) + add hl,de + ld a,(hl) or a ;0 = no enemy present jr nz,enemyleft - djnz chk_enemyleft + dnz chk_enemyleft ret enemyleft: + ld hl,eventleft inc (hl) ret do_event: - ld de,enemies-4 + ld hl,enemies-enemysize + ld bc,enemysize + xor a ;a=0 chk_noenemy: - inc de - inc de - inc de - inc de - ld a,(de) - or a ;0 = no enemy present - jr nz,chk_noenemy + add hl,bc + cp (hl) ;(hl) = 0 ?? + jr nz,chk_noenemy ;jump if enemy present (non-0) + + ld d,h + ld e,l place_enemy: ld a,(level_enemy) ;enemy type to place (lvl) - ld hl,enemy00 ;enemy 1 specs + ld hl,XLenemyinfos-4 ;enemy "0" specs (1 before enemy #1) add a,a ;a=type*2 add a,a ;a=type*4 ld c,a ;c=type - ld b,0 ;bc = enemy nr. + ld b,0 ;bc = enemy nr.&&&XX add hl,bc ;hl = enemy specs ld a,(hl) ;load hitpoints+occ of this enemy class - ld (de),a ;occ + ld (de),a ;save occ inc hl ;next enemyInfo byte inc de ;next byte of current enemy ld a,(hl) ;load enemy class (nr) - ld (de),a ;enemy type + ld (de),a ;save enemy type inc de ;set x-pos psh de @@ -1488,7 +1531,7 @@ place_enemy: 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 + ld (de),a ;= x-position (save) inc de ;set y-pos inc hl ;where to place?? @@ -1513,26 +1556,16 @@ random_enemy: ypos_OK: ;random value successfully created ld (de),a ;save y-position - ld hl,add2enemy-3 ;offset to xtra enemy info - add hl,de ;hl points to - 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 -------------------------------------- @@ -1549,13 +1582,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,12 +1609,10 @@ 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 @@ -1597,17 +1628,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 +1649,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,6 +1707,11 @@ 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 @@ -1731,36 +1767,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 @@ -1780,7 +1815,7 @@ exploding_enemy: 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 +1871,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 +1903,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 +1912,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 @@ -1980,15 +2011,16 @@ 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 ------------------------------------------- @@ -2028,19 +2060,18 @@ 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 --------------------------------------------- @@ -2092,15 +2123,15 @@ 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 + dnz SFXframe ret ;--------------------------- show icon ---------------------------------------- @@ -2108,10 +2139,12 @@ SFXdelay: 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 +2160,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 +2177,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 +2218,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,8 +2269,7 @@ 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 --------------------------------------------- @@ -2257,12 +2318,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 +2345,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 @@ -2339,17 +2400,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) +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 + jp _mm_ldir ;save done (cal \ ret) + ret + game_over: pop hl ;=ret (game_over was called from a procedure) game_over_nopop: @@ -2466,34 +2546,39 @@ 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 +Continue_game: + jr nonext_level + 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 + + xor a + cp (hl) + cal z,dostory You_die: + ld a,12 + ld (your_armor),a ;5 HPs/shields ld hl,your_lives dec (hl) ;decrease lives ld a,(hl) ;load lives left @@ -2509,18 +2594,35 @@ Next_level: 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 + 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 + + xor a + cp (hl) + cal z,dostory + nonext_level: + 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,XLweapondata-7 + add hl,bc + ld a,(hl) + ld (ybuls),a ;max number of bullets (varies per weap.class) + ld a,80 ld (nextevent),a ;time to first enemy appearance @@ -2534,6 +2636,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,8 +2683,8 @@ 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 --------------------------------------- @@ -2613,10 +2718,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,7 +2735,7 @@ 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 ---------------------------------------- @@ -2659,7 +2765,7 @@ putsprite: srl d ;d/4 srl d ;d/8 (8 bits in byte) ** c is set when overflow add a,d ;a = (Y*16+X/8) mod 256 - jr nc,_n1 ;jump if no carry = no overflow = a<=255 + jp nc,_n1 ;jump if no carry = no overflow = a<=255 inc b ;a>255 so increase bc by 256 _n1: ld c,a ;c = (Y*16+X/8) mod 256 add hl,bc ;bc = Y*16+X/8 @@ -2673,93 +2779,93 @@ _oloop: psh bc ;Save # of rows inc ix _smc1: ld a,1 ;Load pixel mask _iloop: sla c ;Test leftmost pixel - jr nc,_noplot ;See if a plot is needed + jp nc,_noplot ;See if a plot is needed ld e,a ;OR pixel with screen or (hl) ld (hl),a ld a,e _noplot:rrca - jr nc,_notedge ;Test if edge of byte reached + jp 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 ------------------------------------- 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 ;------------------------------------------------------------------------------ @@ -2948,13 +3054,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 ; █ ███ █ █ █ @@ -2997,10 +3103,10 @@ spr_dividerline: ;---------------------------- texts ------------------------------------------- -txt_about: .db " v0.95.A22",127,"by Shiar",0 +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 @@ -3015,28 +3121,30 @@ txt_teacherans: .db Lneg,"14.2063168184",0 ;---------------------------- 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.96",0 +storehi_end: + +storesave_start: +level .db $01 ;level number +levelp .dw XLlevelsdata+4 ;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 ;laser avail: 0=no, 1=yes 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) - -#include nemesis0.z80 +storesave_end: ;----------------------------- logo ------------------------------------------- @@ -3069,58 +3177,6 @@ logo_nemesis: ;------------------------------------------------------------------------------ -; 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,7 +3193,27 @@ 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 +; +; # 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) ; ; ; + added - removed * changed # bug fixed diff --git a/nemesis0.z80 b/nemesis0.z80 index ca96ca6..93816e9 100644 --- a/nemesis0.z80 +++ b/nemesis0.z80 @@ -1,26 +1,156 @@ -;---------------------------- enemy data -------------------------------------- - -sprites: - .db $00 - .db (spr_enemy01-spr_enemy00)/2 - .db (spr_enemy02-spr_enemy00)/2 - .db (spr_enemy03-spr_enemy00)/2 - .db (spr_enemy04-spr_enemy00)/2 - .db (spr_enemy05-spr_enemy00)/2 - .db (spr_enemy06-spr_enemy00)/2 - .db (spr_enemy07-spr_enemy00)/2 - .db (spr_boss01 -spr_enemy00)/2 - .db (spr_boss02 -spr_enemy00)/2 - .db (spr_enemy08-spr_enemy00)/2 +;header:---------------------------------------------------------------------- + + .db $c9,0 ;ret \ nop = nemesis-header + .dw lend-lstart ;levelsdata-size = 134h = 308d < 505d + +;XLlevelsdata:---------------------------------------------------------------- + +;format:[enemy nr] [enemy frequency] [next lvl] [level_info] [level_move] +; [level_fire] [tunnel size] [groundtype] [16_ground] [16_ceiling] +; [stars1] [stars2] + +lstart: + .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 + + .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 -spr_enemy00: - .db 7,5 ;pickup - .db %11111110 ; ███████ - .db %11111110 ; ███████ - .db %11000110 ; ██ ██ - .db %11111110 ; ███████ - .db %11111110 ; ███████ .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,%00000110,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,%00000001,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,%00000101,%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,%00000111,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,%00000001,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 +lend: + +;XLweapondata:---------------------------------------------------------------- + +;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset] + + .db 0,3,%00000010,2,%00000000,0,%00000000,0 ;single fire + .db 0,3,%00000011,2,%00000000,0,%00000000,0 ;fast single fire + .db 0,6,%00000010,0,%00000010,5,%00000000,0 ;double fire + .db 0,9,%00010010,2,%00110010,2,%01000010,2 ;triple fire + .db 0,10,%00010011,2,%00110011,2,%01000011,2 ;triple fire + .db 0,10,%00010011,2,%00110011,2,%01000100,2 ;triple fire + .db 0,10,%00010100,2,%00110100,2,%01000101,2 ;triple fire + .db 0,10,%00010100,2,%00110100,2,%01000101,2 ;triple fire + +;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:---------------------------------------------------------------- + +;format: [000000:HP 00:occ] [type] [appearance(ypos)] [unused] + + .db %00000010,1,1,0 ;#1 HP:1 app:random + .db %00000010,2,3,0 ;#2 HP:1 app:halflure + .db %00001111,3,2,0 ;#3 HP:1 app:lure + + .db %00000110,4,2,0 ;#4 HP:2 app:lure + .db %00000111,5,3,0 ;#5 HP:2 app:random moving + .db %00001011,6,2,0 ;#6 HP:3 app:lure moving + + .db %00011011,7,3,0 ;#7 HP:7 app:halflure moving + + .db %00110011,8,1,0 ;boss1 + .db %00111011,9,3,0 ;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:---------------------------------------------------------------- + +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 @@ -109,90 +239,12 @@ spr_enemy08: .db 8,6 ;enemy type eight .db %00011110 ; ████ .db %01111111 ; ███████ -enemy00:.db %10011100 ; █ ███ + .db %10011100 ; █ ███ .db %10011100 ; █ ███ .db %01111111 ; ███████ .db %00011110 ; ████ - ;enemyInfo: %000000:HP %10:occ $00:type $00:app $00:unused -enemy01: ;#1 HP:1 app:random - .db %00000010,1,1,0 -enemy02: ;#2 HP:1 app:halflure - .db %00000010,2,3,0 -enemy03: ;#3 HP:1 app:lure - .db %00001111,3,2,0 - -enemy04: ;#4 HP:2 app:lure - .db %00000110,4,2,0 -enemy05: ;#5 HP:2 app:random moving - .db %00000111,5,3,0 -enemy06: ;#6 HP:3 app:lure moving - .db %00001011,6,2,0 - -enemy07: ;#7 HP:7 app:halflure moving - .db %00011011,7,3,0 - -boss01: - .db %00110011,8,1,0 -boss02: - .db %00111011,9,3,0 - -;----------------------------- level info ------------------------------------- - - ;format: enemy nr; enemy frequency; next lvl; level_move; level_fire - ;tunnel size; groundtype; 17_ground; 17_ceiling; stars1; stars2 - - .db $15,$07,$08 ;fireFreq; moveType; enemyType -level01: ;efrequency must be odd if halfluring! - .db $01,$1b,$2f,%00010000,255,0,0 ;0f>>2f - .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 $10,$07,$09 -level02: - .db $02,$13,$4b,%01010000,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 -level03: - .db $03,$2d,$3f,%01100000,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,%00010000,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,%01010010,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,%01110000,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,%00010000,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 - -weapons: - .db 0,3,%00000010,2,%00000000,0,%00000000,0 ;single fire - .db 0,3,%00000011,2,%00000000,0,%00000000,0 ;fast single fire - .db 0,6,%00000010,0,%00000010,5,%00000000,0 ;double fire - .db 0,9,%00010010,2,%00110010,2,%01000010,2 ;triple fire - .db 0,10,%00010011,2,%00110011,2,%01000011,2 ;triple fire - .db 0,10,%00010011,2,%00110011,2,%01000100,2 ;triple fire - .db 0,10,%00010100,2,%00110100,2,%01000101,2 ;triple fire +;----------------------------------------------------------------------------- + .end +.end \ No newline at end of file -- 2.30.0