From: Mischa Poslawsky Date: Fri, 22 Oct 1999 11:03:52 +0000 (+0200) Subject: version 0.95: bosses, bullet upgrades, hiscore name X-Git-Url: http://git.shiar.net/nemesis.git/commitdiff_plain/b8db53984e76eb9e413a2c8c40863b326dcb4d37 version 0.95: bosses, bullet upgrades, hiscore name + 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) ^ point release .A13 # 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:) ^ point release .A17 # 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 ^ point release .A18 * total size of enemy-sprites can now be 510 bytes (space = doubled!) # bullets hit enemies correctly that aren't 6x6; even the 16x10 bosses! * at g/o or nextlevel checks for keys released instead of waiting abit + name stored with hiscore (max. 8 chars, Shiar.95 by default) + when entering hi-name DEL goes back one char (with check 4 no chars) # program is reloaded at start so some score-bugs solved! (_asapvar=0) * at death, upgrades and pickups AREN'T removed! (just armor=0) # bullet is not displayed after being removed anymore # armor-icon stays hilighted when armor is decreased * when stars move off screen, they are placed at a NEW y-pos! * the starting x-positions of stars are not random, so the stars are spread all over screen. y is still random and changes during game * make_random functions smaller and used by different procs # MAJOR BUG! a "random" value was placed somewhere in mem thus creating bugs like unexplained loss of armor and stuff! ^ point release .A22 --- diff --git a/nemesis.txt b/nemesis.txt index a918efb..7469338 100644 --- a/nemesis.txt +++ b/nemesis.txt @@ -1,23 +1,28 @@ - ╔═══════════════════╗ - ║ N E M E S I S ║██ Game: Nemesis version 0.94.1004 BETA! - ║───────────────────║██ By: SHIAR shiar0@hotmail.com - ║ 0.94BETA by SHIAR ║██ ICQ #43840958 - ╚═══════════════════╝██ http://come.to/shiar - █████████████████████ Calc: TI-86 only, for now.. - Size: 3549 bytes on calc - Description: Arcade-game based on an old MSX-game. +------------------------------------------------------------------------------ + Title : Nemesis + Version : 0.95.A22 Beta + Release Date : 22.X.99 + Filename : nemesis.86p (size 5321) + Author(s) : Shiar + Email Address : shiar0@hotmail.com (mind the 0) + ICQ : #43840958 + Web Page : 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 +>>>>>>> NOTE ON V.95 --------------------------------------------------------- ->>>>>>> NOTE ON V.94 --------------------------------------------------------- + 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 +everybody, I'm very happy! - The 0.94 version took a bit longer because I'm a very busy at school. -Anyways, here it is. You might've noticed the game's now in TWO versions: -normal black on white, and a new *WHITE on BLACK* (like real space) version. - - PLEASE TELL ME WHAT YOU THINK: is this better or should I stick to B on W?? -I've included a short version history in this readme so you can see what's new -and what's not (TI-News hadn't got a clue last update). + 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! >>>>>>> INTRO TO NEMESIS ----------------------------------------------------- @@ -25,25 +30,22 @@ and what's not (TI-News hadn't got a clue last update). 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 (Salamander, Parodius, Space Manbow and Life Force) as well as -versions for the: ZX Spectrum (2 versions); MSX (4x); Comodore 64 (2x); -arcades (2x); PC Engine (4x); Game Boy (3x); NES (4x); SNES (4x); and -Play Station (11x) (as far as I'm aware of). +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). >>>>>>> CONTROLS ------------------------------------------------------------- - You control a hi-tech upgradable vessel (storyline coming soon) and you have -blast 'n evade your way through a lot of enemies. Some enemies leave pickups -which you can collect in order to power-up your ship. Keys* are: + The universal TI-86 keys: -Arrow keys: stupid question, self-destructs your ship of course -2nd: fire your weapon(s) (disruptor as default, upgradable to laserbeam) -ALPHA: enable the currently selected upgrade -MORE: pause, press Enter to continue -EXIT: resets your calc and clears your ROM memory (just keep playing :) +Arrow keys : move +2nd : fire +ALPHA : select powerup +MORE : pause +EXIT : exit +GRAPH : teacher! (press graph again to resume) - * tried to use the universal TI-86 key meanings + In main menu you can press F1 to toggle b<>w (not saved yet). >>>>>>> PICKUPS AND SO ------------------------------------------------------- @@ -53,15 +55,58 @@ ship. The highlighted icon in the score bar (bottom) can be activated by pressing ALPHA. The number in the first icon shows your shield-points left. This icon can be chosen more than once, to increase your shield-points. - Other upgrades: _____________________________________________ - | ARMOR | TORPEDO | EMPTY | LASER | MULTIPLES | - `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' - All upgrades and pickups will be lost when your ship is destroyed! + Other upgrades: ARMOR/SHIELD | TORPEDO | WEAPON-UPG | LASER | MULTIPLES + + +>>>>>>> BETA STUFF ----------------------------------------------------------- + + There are just seven levels for now, don't try to get to level eight. +Things to come: + +* different enemies in one level +* save options (like b<>w) +* save game +* more LEVELS!! more enemies more upgrades +* storyline +* 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, +or ICQ #43840958! PLEASE! + + Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and +Asm(. Nemesis will NOT run correctly under RASCALL with the memory LOCKED! + + +>>>>>>> CREDITS -------------------------------------------------------------- + + SHIAR programming and everything else. SHIAR0@HOTMAIL.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 + MATTHEW DALE betatester + KONAMI for writing the original Nemesises and more great games + PATRICK DAVIDSON wrote Galaxian; Nemesis uses his gfx-engine + BRIAN KOROPOFF for solving the left+down bug! + + and EVERYBODY WHO SENT ME SOMETHING!! (too much to list here) + + +>>>>>>> RULEZ AND REGULATIONS ------------------------------------------------ + +* Damage to you, your calc, or anything else was not caused by Nemesis + and I am certainly not responsible +* One shall NOT release an altered version of Nemesis +* This documentation must be included with distribution (except calc2calc) +* No money shall be asked for this program +* Eat plenty of vegetables every day >>>>>>> HISTORY -------------------------------------------------------------- -Some version changes (not all) from version 0.61. +Most significant version changes since version 0.61. Version 0.7 Beta Size:2303 02.IX @@ -99,66 +144,24 @@ Some version changes (not all) from version 0.61. Version 0.93Beta Size:3098 11.IX (second major release) -* Pickups move slower -* Keys changed to 2nd and Alpha * Counts score and saves highest score +* Pickups move slower, keys changed to 2nd and Alpha * Multiples move only when you move (like in MSX-Nemesis) * A lot of small fixes and changes (really a lot of them) - Version 0.94Beta Size:4456 08.X (yet another release) + Version 0.94Beta Size:4456 08.X (yet another release; ticalc news) * Two-layer starfield scrolling in the background -* Some enemies aim their bullets towards you -* Bugfixes etc. (like the fire-when-already-destroyed-bug) -* Enemies can move at different speeds or move patterns -* Ground scrolling at bottom and ceiling scrolling at top -* Tunnel effect in some levels -* Main menu (choose continue or start new game) -* Levels changed, bugs fixed, enemy firing rate differs, and more - - ->>>>>>> BETA STUFF ----------------------------------------------------------- - - There are just seven levels for now, don't try to get to level eight. -Things to come: - -* more LEVELS!! more enemies more upgrades -* maybe obstacles? -* storyline -* save game -* save names with hi-score -* source code release -* bosses at the end of a level! -* different enemies in one level -- NO greyscale - - 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, or ICQ #43840958! -PLEASE! - - Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and -Asm(. - - BUG: When you go to the next level, and you are running under RASCALL with -the memory LOCKED, you lose all upgrades and go to level 3. Thanks to TomTTBH! - - ->>>>>>> CREDITS -------------------------------------------------------------- - - SHIAR programming and everything else. SHIAR0@HOTMAIL.COM -> PATRICK DAVIDSON wrote GALAXIAN, nemesis uses the same gfx-engine - KONAMI for writing the original Nemesises and more great games - FRAGGIE beta tester #1 and being very positive about the game - FREE BIRD beta tester #2, will help me writing the storyline - ELEANOR GILES for sending me mail / reporting a bug / making my day! - JAMES RUBINGH sent me an ICQ message, thank you - TOMTTBH another ICQ message and a BUG report! - +* Enemies can move at different speeds or move patterns and can aim bullets +* Ground scrolling at bottom and ceiling scrolling @ top (also tunnel-effect) +* Main menu, levels changed, bugs fixed, enemy firing rate differs, and more ->>>>>>> DISCLAIMER AND END --------------------------------------------------- + Version 0.95Beta Size:5285 21.X - Take any program and read the disclaimer. The same thing applies here. Now -go and play Nemesis and SEND ME SOMETHING! +* Boss at the end of a level +* Bullet-upgrades (speed/multiple bullets) and 3-bullet limit +* Graph cleared, unintended pixels removed, prog reload, major bugfixes +* When you got a hiscore, you can enter your name ---------------------------------------------------------------------- <<<<<<< diff --git a/nemesis.z80 b/nemesis.z80 index 76a0b6c..48f79a6 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,89 +1,103 @@ ;------------------------------------------------------------------------------ ;---------------------- NEMESIS ----------------------------------------------- ;------------------------------------------------------------------------------ - -; >>> NEMESIS <<< Version 0.94 BETA by SHIAR -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; SHIAR *** shiar0@hotmail.com *** ICQ#43840958 *** come.to/shiar +; >>> NEMESIS <<< Version 0.95 BETA by SHIAR ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; DESCRIPTION: Fast+cool arcade-game based on the old MSX-game -; CALC: TI-86 only -; FILES: 86P (3624) Z80 (62443) -; BETA: I hope to release the full game around december 1999 +; Title : Nemesis +; Version : 0.95 +; Release Date : 22.X.99 +; Filename : nemesis.86p (5321) +; 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 + ; ABOUT: This source should only be used for learning practises, do not ; alter it, and certainly do not distribute an altered version!! -; &&& marks uncertainties or things to optimize +; NOTE: &&& marks uncertainties or things to optimize ;---------------------- nemesis.z80 start ------------------------------------- - .include "asm86.h" - .include "ti86asm.inc" - .include "ti86abs.inc" +#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 -_dispahl = $4A33 +TEXT_MEM = _textShadow ;167 bytes ($A7): C0F9-C1A0 -TEXT_MEM = $C0F9 ;-$C1A0 ;_textShadow ;167 bytes ($A7) -DELC_LEN = $C012 ;-$C076 ;_undelBufLen ;100 bytes ($64) +storepos = $8000 ;120 OF 165 +storepos2 = $8100 ;141 OF 167 ;---------------------- in-game vars ------------------------------------------ -just_fired = TEXT_MEM ;$C0F9 ;counts how long a blast lasts -curline = TEXT_MEM ;$C0F9 ;used to display SFX -menuitem = TEXT_MEM ;$C0F9 -temp1 = TEXT_MEM+1 ;$C0FA-C0FB ;(2 bytes) -RanPos = TEXT_MEM+3 ;$C0FC ;used for making random values -timer = TEXT_MEM+4 ;$C0FD ;frame counter - -x = TEXT_MEM+5 ;$C0FE ;your ship's position -y = x+1 ;$C0FF ;your y-pos -firex = TEXT_MEM+7 ;$C100 ;(1 byte) -firey = firex+1 ;$C101 ;(1 byte) -mx = TEXT_MEM+9 ;$C102 ;position of multiple#1 -my = mx+1 ;$C103 ;multiple y-pos - -bossx = $8001 -bossy = bossx+1 -bossmy = bossy+1 - -level_enemy = TEXT_MEM+11 ;$C104 ;enemy type -eventtime = TEXT_MEM+12 ;$C105 ;enemy frequency -eventleft = TEXT_MEM+13 ;$C106 ;nr. of enemies still to come -nextevent = TEXT_MEM+14 ;$C107 ;time to next event -pickuptimer = TEXT_MEM+15 ;$C108 ;counts when to place a pickup -level_occ = TEXT_MEM+16 ;$C109 -level_move = $8010 -level_fire = $8011 - -spacespace = $8012 -groundinfo = spacespace+1 ;$8013 -groundpos = groundinfo+1 ;$8014 $10 -ceilingpos = groundpos+16 ;$8023 $10 -stars1 = ceilingpos+16 ;$8033 -stars2 = stars1+1 ;$8034 - -nrybullets = 20 -ybullets = TEXT_MEM+17 ;$C10A ;60 bytes = 20(state,x,y) -nrebullets = 10 -ebullets = ybullets+(nrybullets*3) ;30 bytes = 10(state,x,y) - -your_locpos = ebullets+(nrebullets*3) ;position in your_prevpos table -your_prevpos = your_locpos+1 ;saves previous positions (32d) - +temp1 = storepos ;$C0FA-C0FB ;temp (2 bytes) bullet + +just_fired = storepos+2 ; +2 ;counts how long a blast lasts +curline = storepos+2 ; +2 ;used to display SFX +menuitem = storepos+2 ; +2 ;used to store menu location +hiscorepos = storepos+2 ; +2 +RanPos = storepos+3 ; +3 ;used for making random values +timer = storepos+4 ; +4 ;frame counter + ;--------YOU +x = storepos+5 ; +5 ;your ship's position +y = x+1 ; +6 ;your y-pos +firex = y+1 ; +7 ;(1 byte) +firey = firex+1 ; +8 ;(1 byte) + ; ** + ;--------LEVEL +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_fire = level_move+1 ;+16 + ; ** + ;--------OBJECTS +spacespace = storepos+19 ;+19 +groundinfo = spacespace+1 ;+20 +groundpos = groundinfo+1 ;+21 $10 +ceilingpos = groundpos+16 ;+37 $10 + ; ^^ ;--------STARS +stars1 = ceilingpos+16 ;+53 +stars2 = stars1+1 ;+54 nrstars1 = 7 -starx1 = your_prevpos+32 ;ends at C192 +starx1 = storepos+55 ;+55 nrstars2 = 7 -starx2 = starx1+(nrstars1*2) ;ends at C1A0 - -nrenemies = 10 -enemies = DELC_LEN+1 -add2enemy = nrenemies*4 -enemiesxtra = enemies+add2enemy - +starx2 = starx1+(nrstars1*2) ;+69 + ; ^^ ;--------MULTIPLES +mx = starx2+(nrstars2*2) ;+83 ;position of multiple#1 +my = mx+1 ;+84 ;multiple y-pos +m2x = my+1 ;+85 +m2y = m2x+1 ;+86 +your_locpos = m2y+1 ;+87 ;position in your_prevpos tabl +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) + +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) + +ybuls = ebullets+(nrebuls*3) ;+140 + +;^-----------------------------------<2 ;-141=$8D +;level_move: +; %1 (directfire) 1 (ground) 1 (ceiling) 1 (diagfire) 1111 (move) ;enemies: ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving) ; %11111111 (ship type or explosion frame) %11111111 (x) %11111111 (y) @@ -98,7 +112,7 @@ enemiesxtra = enemies+add2enemy .dw Title ;pointer to description (all shells) .dw Icon ;pointer to YAS icon -Title: .db "Nemesis v0.94 by Shiar",0 +Title: .db "Nemesis v0.95 by Shiar",0 Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes .db %11100000 ; ███ @@ -112,12 +126,38 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes ;---------------------- init -------------------------------------------------- -init: - cal BUSY_OFF ;turns the run-indicator off, obviously - cal CLEARLCD ;clean the screen +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 + +int_handler: + ex af,af' + in a,($03) + bit 3,a + jp z,$0039 + res 0,a + out ($03),a + jp $0039 +int_end: + +init: cal BUSY_OFF ;turns the run-indicator off, obviously + cal _clrScrn ;clean the screen xor a ;: reset: - ld (iy+13),a ;>system vars - ld (DELC_LEN),a ;>buffer so we can use the space to store vars + 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 ld a,(CONTRAST) ;load current contrast level cp $1f ;if already at maximum... @@ -211,6 +251,11 @@ menuloop: jr z,menuchange cp K_EXIT jp z,game_over_nopop + ld hl,_invert + cp K_F1 + cal z,undo_invert + cp K_F2 + cal z,do_invert cp K_ENTER jr nz,menuloop @@ -226,6 +271,13 @@ menuchange: ld (menuitem),a jr menuloop +do_invert: + ld (hl),$EE + ret +undo_invert + ld (hl),$E6 + ret + ;------------------------------------------------------------------------------ ;---------------------- game loop --------------------------------------------- ;------------------------------------------------------------------------------ @@ -240,10 +292,9 @@ game_main_loop: ;REPEATS FROM HERE EVERY FRAME updaterandom: ld hl,RanPos ;random counter - ld a,r - add a,(hl) ;random value + ld a,r ;add r register to randomize + add a,(hl) ;add previous random value add a,b ;even more random by adding timer -;.db $80+7 ; ld (hl),a ;save even more random value back Clear_screen: @@ -255,10 +306,10 @@ Clear_screen: ld a,(timer) and %11 - jr z,movestarsdone + jr z,movestarsdone ;don't move stars once every 4 frames cal movestars1 ;move the stars on the FRONT layer - cal movestars2 ;move the distant stars far, far away + cal movestars2 ;move the distant stars movestarsdone: ld a,(stars1) ;star positions (the missing byte...) @@ -291,15 +342,19 @@ game_stuff: 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) out (1),a ;ask for them nop \ nop ;delay 8 clocks in a,(1) ;get zem! -check_exitkey: ;why give it a label? i dunno, i'm just crazy +check_exitkey: bit 6,a ;test bit 6 = exit-key = EXIT jp z,game_over_nopop ; pressed, so be it -check_morekey: ;again, another unused label... poor compiler +check_morekey: ;another unused label... poor compiler bit 7,a ;test bit 7 = more-key = PAUSE cal z,Pause ;yes, go to pause @@ -314,7 +369,7 @@ check_firekey: check_selkey: ld a,%01011111 ;look at first column of keys (ALPHA to STO) - out (1),a ;gimme gimme + out (1),a ;gimme nop \ nop ;what's taking you so long in a,(1) ;at last... our precious keyzzz... ;old: now see this: @@ -328,22 +383,14 @@ _gamestuff1: cal Handle_bullets ;move your bullets cal Handle_torp ;move your torpedo - cal Handle_enemies ;move enemies + cal Handle_enemies ;move enemies cal Enemy_bullets ;move enemy bullets -; ld a,(level_occ) -; or a -; jr nz,bosslevel ;levelocc<>0 so no - cal Level_event ;insert enemies - jr _gamestuff2 -bosslevel: - cal Handle_boss -_gamestuff2: cal Display_Screen ;display all halt ;delay - jp game_main_loop ;LOOP + jp game_main_loop ;LOOP ;--------------------------- ground ------------------------------------------- @@ -354,7 +401,6 @@ Handle_ground: ld bc,15 ;scroll all 16 bytes minus one (teh new byte) ld hl,groundpos+1 ;from.. ld de,groundpos ;to (one byte to the left) -; ld a,(de) ;load byte on left (will be lost after scroll) ldir ;LoaDIncreaseRepeat = scroll! ld a,(groundinfo) ;what kind of ground @@ -363,30 +409,30 @@ Handle_ground: jr ground_boring ground_tunnel: - ld a,(groundpos+14) - ld (groundpos+15),a - ld hl,spacespace - - ld a,(RanPos) - ld b,a - bit 1,a - jr z,ground_previous - bit 2,a - jr z,gtunneldown + ld a,(groundpos+14) + ld (groundpos+15),a + ld hl,spacespace + + ld a,(RanPos) + ld b,a + bit 1,a + jr z,ground_previous + bit 2,a + jr z,gtunneldown gtunnelup: - ld a,(hl) - or a - jr z,ground_previous ;a>=0 (a=0 actually, because a<0 = a>0) - inc (hl) - ld a,(groundpos+15) - inc a - jr newground + ld a,(hl) + or a + jr z,ground_previous ;a>=0 (a=0 actually) + inc (hl) + ld a,(groundpos+15) + inc a + jr newground gtunneldown: - ld a,(groundpos+15) - dec a - jr z,ground_previous - dec (hl) - jr newground + ld a,(groundpos+15) + dec a + jr z,ground_previous + dec (hl) + jr newground ground_previous: ld a,(groundpos+14) ;type 1 @@ -466,30 +512,30 @@ Handle_ceiling: jr ceiling_boring ceiling_tunnel: - ld a,(ceilingpos+14) - ld (ceilingpos+15),a - ld hl,spacespace - - ld a,(RanPos) - ld b,a - bit 4,a - jr z,ceiling_previous - bit 5,a - jr z,ctunnelup + ld a,(ceilingpos+14) + ld (ceilingpos+15),a + ld hl,spacespace + + ld a,(RanPos) + ld b,a + bit 4,a + jr z,ceiling_previous + bit 5,a + jr z,ctunnelup ctunneldown: - ld a,(hl) - or a - jr z,ceiling_previous - inc (hl) - ld a,(ceilingpos+15) - inc a - jr newceiling + ld a,(hl) + or a + jr z,ceiling_previous + inc (hl) + ld a,(ceilingpos+15) + inc a + jr newceiling ctunnelup: - ld a,(ceilingpos+15) - dec a - jr z,ceiling_previous - dec (hl) - jr newceiling + ld a,(ceilingpos+15) + dec a + jr z,ceiling_previous + dec (hl) + jr newceiling ceiling_previous: ld a,(ceilingpos+14) ;type 1 @@ -590,8 +636,7 @@ movestars_loop: and %00001111 cp 9 ;(GRAPH_MEM&%00001111)-- = $C9FAand15-1 = $A-1 jr nz,newstarok - ld de,16 - add hl,de + cal Random5016 newstarok: ld (ix),l @@ -613,14 +658,67 @@ pause: jr nz,pause ;no, wait some more ret ;continue +;--------------------------- teacher ------------------------------------------ + +Teacher: + ld (iy+12),5 ;enable flashing cursor + cal _clrLCD + ld hl,$0000 ;top left + ld (_curRow),hl + 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? + jr z,teacherans + cp kGrMenu ;keypressed = graph? + 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 + +teacherans: + ld a,' ' + cal _putc + + ld hl,$0701 + ld (_curRow),hl + ld hl,txt_teacherans + cal _puts + jr teacherloop + + ;--------------------------- exit --------------------------------------------- quit: - cal CLEARLCD ;clears screen - cal _homeup ;set cursor to top-left + im 1 ld a,(CONTRAST) ;load original contrast level out (2),a ;and set it back - ld (iy+13),6 ;restore system-flags + ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling + + ld hl,GRAPH_MEM ;graph-screen location + ld de,GRAPH_MEM+1 + ld (hl),0 + 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 :( ;--------------------------- display ------------------------------------------ @@ -633,7 +731,8 @@ displayloop: ld b,16 ;display width = 16 bytes (16*8bits=256pixels) displaytloop: ld a,(hl) ;copy byte from (hl) -; xor $ff ; } ;invert byte (white<=>black) &&&& +_invert: + xor $ff ; } ;invert byte (white<=>black) &&&& ld (de),a ;to (de) inc hl \ inc de ;next byte djnz displaytloop ;16x hl >> de @@ -711,7 +810,7 @@ no_down: jr c,no_left ;-1 = left side ld (hl),a no_left: - rr b + rr b jr c,no_right ld a,(hl) cp 121 ;127-6 = right side @@ -735,20 +834,15 @@ no_up: ld e,(hl) or a ;is it 0? jr z,handle_multiples ;yes so ship = normal (display \ continue) - ld b,a ;save inv-time ld a,(timer) ;load frame nr. - and %00000011 ;a=0 once every four frames + and %00000111 ;a=0 once every four frames jr nz,not_time ;a<>0 = not time to update counter dec (hl) ;decrease inv-time left not_time: - and %00000010 ;a switches 0<->1 every 2 frames - jr z,no_flicker ;don't show normal sprite anyway - ld a,b ;pop inv-time - and %11110000 ;inv-time <16 ticks left? - jr z,handle_multiples ;yes: display normal sprite and continue - -no_flicker: - ld ix,spr_ship01i ;display inv-ship (ld ix is faster than add ix) + and %00000100 ;a switches 0<->1 every 2 frames + jr z,handle_multiples ;show normal ship +inv_flicker: + ld ix,spr_ship01i ;don't display ship handle_multiples: cal putsprite ;display your ship @@ -820,6 +914,19 @@ damage_you: jp m,no_armor ;yes, 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 + ld hl,VIDEO_MEM+(16*56) + ld (PutWhere),hl + ld ix,spr_icon ;if so, highlight armorIcon again + ld de,$1901 ;position + cal putwidesprite ;display icon + ld hl,GRAPH_MEM + ld (PutWhere),hl + pop hl ret ;and return no_armor: ld a,%01 ;occ %xxxxxx01 = explode @@ -862,13 +969,30 @@ select3: dec a ;is it 3? jr nz,select4 ;no, carry on ld (hl),a ;reset pickups + 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 + jp disp_icons ;display n return select4: dec a ;is it 4? jr nz,select5 ;no, carry on again ld (hl),a ;reset pickups inc a ;a=1 - ld (your_laser),a ;ready laser + ld (your_weapon),a ;ready laser jp disp_icons ;display + return select5: dec a ;is it 5? @@ -894,9 +1018,9 @@ Fire_bullet: 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_laser) ;if you have bullets..... - or a ;(0=no laser) - jr nz,fireOK + ld a,(your_weapon) ;if you have bullets..... + dec a ;(1=laser) + jr z,fireOK ld (hl),5 ;.....then can't fire next turn (go to 5 imm.) fireOK: @@ -912,9 +1036,46 @@ fireOK: ld (firex),hl ;set firepos ;blast again and fireany: - ld a,(your_laser) ;do you have laser? + cal fire_torp ;&&& + + ld a,(your_weapon) ;do you have laser? dec a ;1=yes - jr nz,fire_ybullet ;no, just fire a bullet + jr z,fire_laser + + ld ix,weapons-6 + add a,a ;weap*2 + add a,a ; *4 + add a,a ; *8 + ld c,a + ld b,0 + add ix,bc + + ld c,(ix) + cal fire_ybullet + inc ix + inc ix + ld c,(ix) + xor a + cp c + cal nz,fire_ybullet + inc ix + inc ix + ld c,(ix) + xor a + cp c + jr nz,fire_ybullet + ret + +fire_torp: + ld de,(firex) + ld hl,torp_occ ;torpedo... + ld a,(hl) ;load torpInfo + dec a ;do you have (unused) torpedoes? + ret nz ;nope (a must be 1) + ld (hl),2 ;yes; use torpedo + ld (torp_pos),de ;save torpedo position (in de) + ret + fire_laser: ;yes, fire that laser instead ld a,(firex) ;a = your x-pos @@ -940,7 +1101,7 @@ fire_laser: ;yes, fire that laser instead inc b ;a>255 so increase bc by 256 _nolc: ld c,a ;c = (Y*16+X/8) mod 256 add hl,bc ;bc = Y*16+X/8 - + ld a,15 ;128/8=16=screen width ** minus one (inc a ^^) sub d ;minus x-start (d=X/8) ld b,a @@ -949,12 +1110,15 @@ drawlaser: inc hl ;Go to next byte djnz drawlaser + ld a,(just_fired) ;fired for how long + cp 4 ;if 4th turn + ret nz ;then do damage, otherwise quit + handle_laser: ld a,(firex) ld d,a ;d was divided, so reload the laser-x check_laserhits: ;de = (x,y) - ld ix,nolashit ld b,nrenemies ld hl,enemies @@ -978,10 +1142,10 @@ laserhits: ;Hits with normal enemies inc hl ld a,(hl) ;check y sub e - jp z,enemy_hit ;a-e=0 = laser on top line of enemy = hit + jr z,enemy_lashit ;a-e=0 = laser on top line of enemy = hit jr nc,nolashit ;a-e>0 = enemy above laser = no hit add a,5 ;add enemy height - jp p,enemy_hit ;a-e>0 = hit + jp p,enemy_lashit ;a-e>0 = hit nolashit: pop hl @@ -990,16 +1154,17 @@ nolashit: inc hl inc hl djnz laserhits ;check all enemies + ret - ld a,d ; - ld d,e - ld e,a - jr fire_torp ;fire torpedoes as well +enemy_lashit: + cal enemy_hit + jr nolashit fire_ybullet: ld hl,ybullets ld de,3 - ld b,nrybullets + ld a,(ybuls) + ld b,a find_ybullet: ld a,(hl) or a @@ -1009,74 +1174,113 @@ find_ybullet: ret found_ybullet: - ld (hl),1 ;use bullet + ld (hl),c ;use the bullet and set correct bullet-type ld a,(firex) ;your x-pos add a,5 ;place bullet in front of you inc hl ;go to bullet-x ld (hl),a ;set x - ld e,a ;save torp-x in e ld a,(firey) ;your y-pos - add a,2 ;place bullet at the middle of your ship + add a,(ix+1) ;place bullet at the middle of your ship inc hl ;go to bullet-y ld (hl),a ;set y - add a,3 ;place torpedo at bottom of ship - ld d,a ;save torp-y in d - -fire_torp: - ld hl,torp_occ ;torpedo... - ld a,(hl) ;load torpInfo - dec a ;do you have (unused) torpedoes? - ret nz ;nope (a must be 1) - ld (hl),2 ;yes; use torpedo - ld (torp_pos),de ;save torpedo position (in de) ret ;------------------------ handle bullets -------------------------------------- +bullet_left: + ld a,125 + 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 + ld (hl),a ;save new pos. + ld d,a ;d = X + + inc hl ;to y-pos + ld a,c + cal _shracc + dec a + jr z,bullet_noymove + dec a + jr z,bullet_up + dec a + jr z,bullet_halfup + dec a + jr z,bullet_down + +bullet_halfdown: + ld a,(timer) + and 1 + jr z,bullet_noymove +bullet_down: + ld a,(hl) + inc a + cp 55 + jr z,bullet_noymove + ld (hl),a +bullet_halfup: + ld a,(timer) + and 1 + jr z,bullet_noymove +bullet_up: + ld a,(hl) + dec a + jr z,bullet_noymove + ld (hl),a +bullet_noymove: + ld e,(hl) ;e = Y + ret + remove_bullet: dec hl ld (hl),0 ;dump this bullet! - ret + pop hl ;&&& + jr next_ybullet -Handle_bullets: +Handle_bullets: ;&&&>> ld hl,ybullets - ld b,nrybullets + ld a,(ybuls) + ld b,a scan_bullets: psh bc psh hl - ld (temp1),hl + ld (temp1),hl ;needed for check_bullethits ld a,(hl) inc hl - dec a ;type 1? - cal z,bullet_2left ;yes: 2left - pop hl - pop bc - ld de,3 - add hl,de ;3 x - djnz scan_bullets ;next bullet (loop) - ret -bullet_2left: - ld a,(hl) ;d = X - cp 122 ;off screen? (x>128-5) - jr nc,remove_bullet - add a,2 ;move 2 2 the right - ld (hl),a ;save new pos. - ld d,a + or a + jp z,next_ybullet ;bulletType=0 >> no bullet - inc hl ;to y-pos - ld e,(hl) ;e = Y + ld c,a + and %1111 + ld b,a + cal bullet_left ;move bullet left +display_bullet: ld ix,spr_bullet01 psh de cal putsprite ;display bullet pop de -check_bullethits: ;INPUT: de=X,Y + cal check_bullethits + +next_ybullet: + pop hl + pop bc + inc hl + inc hl + inc hl + djnz scan_bullets ;next bullet (loop) + ret + +;--------------------------- check bullethits -------------------------------- + +check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet ld b,nrenemies ld hl,enemies - ld ix,nohit hit_enemies: ;Hits with normal enemies psh hl @@ -1090,27 +1294,44 @@ hit_enemies: ;Hits with normal enemies or a ;enemy #0 = pickup jr z,nohit ;yes: don't destroy + psh de + cal find_sprite + pop de + inc hl ld a,(hl) ;check x sub d + sub 5 + jp p,nohit add a,5 + add a,(ix) jp m,nohit - cp 8 - jr nc,nohit inc hl ld a,(hl) ;check y sub e - add a,5 + sub 3 + jp p,nohit + add a,3 + add a,(ix+1) jp m,nohit - cp 10 - jr nc,nohit psh hl ld hl,(temp1) ld (hl),$00 ;remove bullet pop hl + cal enemy_hit + +nohit: + pop hl + inc hl + inc hl + inc hl + inc hl + djnz hit_enemies ;check next enemy + ret + enemy_hit: dec hl dec hl @@ -1133,24 +1354,15 @@ pickupdone: ld hl,1 ;increase score by one cal scoreInc - jp (ix) + ret hpleft: ld a,c ;pop occ sub %00000100 ;decrease HP by one ld (hl),a ;save - jp (ix) - -nohit: - pop hl - inc hl - inc hl - inc hl - inc hl - djnz hit_enemies ;check next enemy ret -;--------------------------- handle torpedo ----------------------------------- +;--------------------------- handle torpedo ---------------------------------- Handle_torp: ld a,(torp_occ) @@ -1202,11 +1414,47 @@ Level_event: or a ;has it reached 0? jp z,Next_level ;yes: level finished dec a ;has it reached 1? - jr nz,do_event ;nope: wait for enemies to leave + jr z,standby_event ;yes: wait until no enemies present/left + dec a ;has it reached 2? + jr z,place_boss ;yep: place the BigBossTM! + dec a ;has it reached 3? + jr nz,do_event ;nope: >3 = place an enemy inc hl ;nextevent located behind eventleft ld (hl),123 ;set delay ret ;don't place any more enemies +place_boss: ;&&& + ld hl,(levelp) + dec hl + ld a,(hl) + 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 + +standby_event: + ld b,nrenemies + ld de,enemies-4 +chk_enemyleft: + inc de + inc de + inc de + inc de + ld a,(de) + or a ;0 = no enemy present + jr nz,enemyleft + djnz chk_enemyleft + ret +enemyleft: + inc (hl) + ret + + do_event: ld de,enemies-4 chk_noenemy: @@ -1231,11 +1479,15 @@ place_enemy: inc hl ;next enemyInfo byte inc de ;next byte of current enemy - ld a,(hl) ;load movement+type of this enemy class + ld a,(hl) ;load enemy class (nr) ld (de),a ;enemy type inc de ;set x-pos - ld a,122 ;appear at right edge of screen (128-6) + psh de + cal find_sprite + pop de + ld a,128 ;appear at right edge of screen + sub (ix) ;minus the width of this enemy (not offscreen) ld (de),a ;= x-position inc de ;set y-pos @@ -1255,12 +1507,8 @@ lure_enemy: ;2nd possibility: luring enemy jr ypos_OK random_enemy: - cal Random ;make a (in a) random value 0-255 - cp 51 ;y may not be more than 51 - jr c,ypos_OK ;OK if a<51 - and %00111111 ;a = 0..63 - sub 13 ;a = -13..50 - jr c,random_enemy ;not OK if a<0 + ld b,e ;b will be added to random-value + cal Random50 ;make a (in a) random value 0-51 ypos_OK: ;random value successfully created ld (de),a ;save y-position @@ -1287,15 +1535,6 @@ ffireOK: ld (hl),a ;type 1 ret ;return -Random: - ld a,(RanPos) ;a handy random-var. - ld hl,x ;add your x-coord for randomness - adc a,(hl) - ld hl,y ;add your y-coord for randomness - adc a,(hl) - ld (RanPos),a ;save altered random-var - ret ;RanPos also in #a - ;--------------------------- enemy fires -------------------------------------- Enemy_fires: ;de = x,y @@ -1303,7 +1542,7 @@ Enemy_fires: ;de = x,y dec d ;d = x-2 inc e ;e = y+1 - ld b,nrebullets + ld b,nrebuls ld hl,ebullets find_ebullet: ld a,(hl) @@ -1353,7 +1592,7 @@ bulletok: Enemy_bullets: ld hl,ebullets - ld b,nrebullets + ld b,nrebuls handle_bullet: psh bc psh hl @@ -1462,18 +1701,8 @@ handle_enemy: normal_enemy: ;occ "normal" 2 or "moving" 3 inc hl - psh hl - - ld e,(hl) ;e = enemy type - ld c,e ;c = e - ld d,0 ;de = e - ld hl,sprites ;hl = @sprites offset-table - add hl,de ;points to offset of current enemy offset - ld e,(hl) ;de = @enemy offset - - ld ix,spr_enemy00 ;first enemy sprite - add ix,de ;add offset for current enemy - pop hl + ld c,(hl) ;c = enemy type = de + cal find_sprite inc hl ld a,(hl) ;x @@ -1488,6 +1717,7 @@ normal_enemy: ;occ "normal" 2 or "moving" 3 dec a ;is it 1? cal nz,moving_enemy ;2 = moving enemy + ld (hl),e dec hl ;@x ld (hl),d ;store new x ld a,c ;a = enemy type @@ -1516,7 +1746,7 @@ check_enemyfire: cal Enemy_fires ;fires bullet pop de ;restore (destroyed by Enemy_fires) firing_done: - cal putsprite ;display sprite @ix + cal putwidesprite ;display sprite @ix next_enemy: pop hl @@ -1551,13 +1781,59 @@ exploding_enemy: moving_enemy: ld a,(level_move) and %1111 - jr z,movetype_updown + jr z,movetype_updown ;type 0 dec a - jr z,movetype_vslow + jr z,movetype_vslow ;1 dec a - jr z,movetype_fast + jr z,movetype_fast ;2 + dec a + jr z,movetype_vfast ;3 + dec a + jr z,movetype_smart ;4 dec a - jr z,movetype_vfast + jr z,movetype_lure ;5 + dec a + jr z,movetype_slowlure ;6 + dec a + jr z,movetype_stoplure ;7 +; dec a +; jr z,movetype_fulllure ;8 + +movetype_fulllure: + inc d + ld a,(timer) + and 1 + ret z + cal movetype_lure + ld a,(x) + cp d + jr c,lure_left +lure_right: + inc d + ret +lure_left: + dec d + ret + +movetype_stoplure: + inc d + jr movetype_slowlure + +movetype_slowlure: + ld a,(timer) + and 1 + ret z + +movetype_lure: + ld a,(y) + cp e + jr c,lure_up +lure_down: + inc e + ret +lure_up: + dec e + ret movetype_smart: ld bc,add2enemy @@ -1591,7 +1867,7 @@ movetype_vfast: dec d ;move left ret nz ;finished pop hl ;restore stack (no ret used) - jr remove_enemy ;remove this enemy (off screen) + jp remove_enemy ;remove this enemy (off screen) movetype_updown: ld bc,add2enemy @@ -1607,24 +1883,29 @@ move_updated: or a ;reset carry flag sbc hl,bc and %00100000 - ld a,(hl) ;load current y-position + ld a,(hl);&&&ld a,e ;load current y-position jr z,movedown moveup: dec a ;decrease y-pos (=move up) ret m ;don't move off the screen (y<0) - ld (hl),a ;save new y-pos + dec e ;save new y-pos ret ;finish movedown: inc a ;increase y-pos cp 55 ;compare with bottom ret nc ;return if it has passed that line (>40) - ld (hl),a ;otherwise save new position + inc e ;otherwise save new position ret ;and return ;--------------------------- check collision ---------------------------------- Enemies_hit: - ld de,(x) ;e = X, d = Y + ld hl,(x) ;e = X, d = Y + ld de,$0707 ;add 7 to both d and e + add hl,de + ld d,h + ld e,l ;e = X+7, d = Y+7 + ld hl,enemies ld b,nrenemies ;check all 20 enemies check_collision: @@ -1634,46 +1915,36 @@ check_collision: jr z,check_next ;2 or 3 = ok inc hl -collide_enemy: -; psh hl -; psh bc -; ld hl,enemy00 ;enemy 1 specs -; add a,a ;a=type*2 -; add a,a ;a=type*4 -; ld c,a ;c=type -; ld b,0 ;bc = 4 * enemy nr. -; add hl,bc ;hl = enemy specs -; ld a,(hl) ;load size byte -; pop bc -; pop hl -; ld c,a ;save size in c +collide_enemy: ;&&& include in Handle_enemy proc + psh de + cal find_sprite + pop de inc hl ld a,(hl) ;check x match - sub e ;enemy position minus yours + sub e ;enemy position minus yours minus 7 + jp p,check_next add a,6 + add a,(ix) jp m,check_next - cp 12 - jr nc,check_next inc hl ld a,(hl) ;check y match sub d ;same as with x-check + jp p,check_next add a,6 + add a,(ix+1) jp m,check_next - cp 12 - jr nc,check_next dec hl dec hl take_pickup: - ld a,(hl) ;load enemy type - psh hl ;we need hl ld hl,2 ;increase score by 2 cal scoreInc pop hl ;we're done + ld a,(hl) ;load enemy type or a jr nz,collide ;enemy when <>0 @@ -1694,13 +1965,22 @@ not_maxpickup: ld (hl),a ;remove jr check_next ;all done, next.. +destroy_enemy: + ld (hl),%01 ;set to explode + inc hl + ld (hl),0 ;explosionFrame 0 + jr collide_done + collide: - xor a - ld (hl),a ;explosionFrame 0 dec hl - inc a - ld (hl),a ;set to explode - cal damage_you ;auch! + ld a,(hl) + and %11111100 + jr z,destroy_enemy + ld a,(hl) + sub %00000100 + ld (hl),a +collide_done: + cal damage_you check_next: pop hl @@ -1823,41 +2103,24 @@ SFXdelay: djnz SFXframe ret -;--------------------------- handle boss ------------------------------------- - -Handle_boss: - ld hl,GRAPH_MEM - ld (PutWhere),hl - ld ix,spr_boss01 - ld hl,bossx - ld d,(hl) - inc hl - ld e,(hl) - jp putwidesprite - -;--------------------------- update score ------------------------------------ +;--------------------------- show icon ---------------------------------------- -scoreInc: - psh bc - ld bc,(score) - add hl,bc - ld (score),hl - pop bc +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) ret -;--------------------------- show icon ---------------------------------------- - disp_icons: - ld hl,VIDEO_MEM+(16*57);57 rows down = seven rows from bottom + ld hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom + ld (PutWhere),hl ;place icons at bottom of normal screen + ld b,16 ;draw 16x (screen width) + ld a,%11111111 ;horizontal line mask + cal drawline ;draw divider-line + ld b,16*7 ;draw 16x (screen width) 7x (height) xor a ;blank line mask -cleanline: - ld (hl),a ;draw one piece of the divider-line - inc hl ;move right (8 pixels = 1 byte) - djnz cleanline ;repeat (16bytes * 7rows * 8pixels) - - ld hl,VIDEO_MEM+(56*16) - ld (PutWhere),hl + cal drawline ;clear scorebar cal disp_lives @@ -1875,14 +2138,18 @@ no_torp: ld de,$2901 ;icon #2 cal putwidesprite ;display - ld ix,spr_icon03 ;emptyIcon + ld ix,spr_icon03 ;bulletIcon ld de,$3901 ;icon #3 - cal putwidesprite + cal putwidesprite ;display icon + 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 ix,spr_icon00 ;emptyIcon - ld a,(your_laser) - or a - jr z,no_laser + ld a,(your_weapon) + dec a + jr nz,no_laser ld ix,spr_icon04 ;laserIcon no_laser: ld de,$4901 ;icon #4 @@ -1897,13 +2164,13 @@ no_multiples: ld de,$5901 ;icon #5 cal putwidesprite - ld ix,spr_icon03 + ld ix,spr_dividerline ld de,$6901 cal putwidesprite ld a,(your_pickup) ;pickups taken add a,a ;picks*2 (sets z-flag) - ret z ;return if no pickups + jr z,iconsdone ;return if no pickups add a,a ;picks*4 add a,a ;picks*8 add a,a ;picks*$10 @@ -1913,12 +2180,16 @@ no_multiples: ld ix,spr_icon cal putwidesprite +iconsdone: + ld hl,GRAPH_MEM ;normal game-screen + ld (PutWhere),hl ;set sprite-position to normal screen ret disp_armor: ld hl,$3925 ;Display Armor left - ld (_penCol),hl ;place @ armorIcon ld a,(your_armor) ;load armor left +_disp_armor: + ld (_penCol),hl ;place @ armorIcon add a,'0' ;make digit cal _vputmap ;display char ret @@ -1941,56 +2212,239 @@ disp_lives: ;--------------------------- proc --------------------------------------------- +Random5016: + cal Random50 ; a = 0..50 + inc a ; a = 1..51 + ld h,0 + ld l,a ;hl = 1..51 + add hl,hl ;hl = 1..51 * 2 + add hl,hl ;hl = 1..51 * 4 + add hl,hl ;hl = 1..51 * 8 + add hl,hl ;hl = 1..51 * 16 (left side at random y) + dec hl ;hl = 1..51 * 16 (" at right side of screen) + ld de,GRAPH_MEM + add hl,de ;position on screen + ret + +Random50: + cal Random + cp 51 ;y may not be more than 50 + ret c ;OK if a<51 + and %00111111 ;a = 0..63 + sub 13 ;a = -13..50 + ret nc ;OK if a>=0 + add a,13+(50-12) ;a = -13..-1 >=> 0..12 >=> 39..50 + ret + +Random: + ld a,(RanPos) ;a handy random-var. + ld hl,x ;add your x-coord for randomness + adc a,(hl) + inc hl ;add your y-coord for randomness + adc a,(hl) + ld (RanPos),a ;save altered random-var + ret ;RanPos also in #a + +scoreInc: + psh bc + ld bc,(score) + add hl,bc + ld (score),hl + pop bc + ret + +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 + 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 + add ix,de ;add offset for current enemy + add ix,de ;twice (offset stored as offset/2) + pop hl + ret + BLACKLCD: ld hl,VIDEO_MEM ;screen location (top left) ld de,VIDEO_MEM+1 ld (hl),%11111111 - ld bc,1024 ;loop 1024 times = entire screen + ld bc,1024-1 ;do it 1024 times = entire screen ldir set 3,(iy+5) ;set white on black ret +waitnokeypressed: + halt \ halt + cal GET_KEY + or a + jr nz,waitnokeypressed + ret + +Decompress: + ld a,(hl) + bit 7,a + jr z,Compressed + inc hl + and 01111111b + ld b,0 + ld c,a + ldir + jr Decompress +Compressed: + psh af + or %11111100 + ld b,a + inc hl + ld c,(hl) + inc hl + pop af + and %01111100 + rrca + rrca + or a + ret z + psh hl + ld h,d + ld l,e + add hl,bc + inc a + inc a + ld b,0 + ld c,a + ldir + pop hl + jr Decompress + ;--------------------------- game over / new game / death --------------------- +chartable: + .db 0,"!<>^",0,0,0,0 + .db 0,"xtoje0",0 ;enter..clear + .db " wsnid9",0 ;(-)..custom + .db "zvrmhc8",0 ;dot..del + .db "yuqlgb7x" ;0..xvar + .db 0,"-pkfa6'" ;on..alpha + .db "54321.",0,0 ;F5..more + own_name: - .db $12,7,"nemesis" + .db 7,"nemesis" save_hi: - ld hl,own_name ;find own variable - xor a - cal _ABS_MOV10TOOP1 - cal _FINDSYM + ld hl,own_name-1 ;find own variable + rst 20h ;cal _ABS_MOV10TOOP1 + rst 10h ;cal _FINDSYM ret c ;not found? who cares... - ld a,b ;save the stored section - ld h,d - ld l,e - ld b,0 - ld de,4+stored_data_start-_asm_exec_ram - add hl,de + xor a + ld hl,4+stored_data_start-_asm_exec_ram + add hl,de ;hl=pointer to data in original prog adc a,b cal _SET_ABS_DEST_ADDR - ld a,0 + xor a ld hl,stored_data_start cal _SET_ABS_SRC_ADDR ld hl,stored_data_end-stored_data_start cal _SET_MM_NUM_BYTES - cal _mm_ldir - ret ;save done + jp _mm_ldir ;save done (cal \ ret) game_over: pop hl ;=ret (game_over was called from a procedure) game_over_nopop: cal BLACKLCD ;clear screen + cal waitnokeypressed ld hl,$0603 ld (_curRow),hl ;center ld hl,txt_gameover cal _puts ;display "GAME OVER" - xor a ;clear a (AHL will be displayed) + ld hl,$0007 + ld (_curRow),hl + + ld de,(score) + ld hl,(hiscore) + cal CP_HL_DE + jr nc,no_hiscore + ld (hiscore),de + +ask_hiname: + ld ix,hiname + ld a,9 + ld (hiscorepos),a +enter_name_loop: + ld a,'_' + cal _putc + ld hl,_curCol + dec (hl) +nokeypressed: + halt \ halt + cal GET_KEY + or a + jr z,nokeypressed + + cp K_DEL + jr z,backup + cp K_ENTER + jr z,nomore + cp K_EXIT + jr z,nomore + + ld hl,hiscorepos + ld b,(hl) + dec b + jr z,nokeypressed + ld (hl),b + + ld hl,chartable + ld e,a + ld d,0 + add hl,de + ld a,(hl) + or a + jr z,nokeypressed + + ld (ix),a + cal _putc + inc ix + cal waitnokeypressed + jr enter_name_loop + +backup: + ld hl,hiscorepos + ld a,(hl) + cp 9 + jr nc,nokeypressed + inc (hl) + + dec ix + ld (ix),' ' + ld a,32 + cal _putc + ld hl,_curCol + dec (hl) + dec (hl) + jr enter_name_loop + +nomore: + ld a,' ' + cal _putc + ld (ix),0 + cal save_hi + jr hiscoredone + +no_hiscore: + ld hl,hiname + cal _puts + +hiscoredone: + xor a ;clear a (Ahl will be displayed) ld hl,$1006 ;bottom-1 right ld (_curRow),hl ;set ld hl,(score) ;your score cal _dispahl ;display it (a=0) + ld hl,$314b ;bottom-1 right before score ^^ ld (_penCol),hl ;set ld hl,txt_score ;"Score" @@ -2006,18 +2460,14 @@ game_over_nopop: cal _vputs ;display (small) res 3,(iy+5) - ld de,(score) - ld hl,(hiscore) - cal CP_HL_DE - jr nc,no_hiscore - ld (hiscore),de - -no_hiscore: - cal save_hi + ld b,16 + ld de,16 + ld hl,VIDEO_MEM+(49*16)-1 +restore_line: + set 1,(hl) + add hl,de + djnz restore_line - ld b,$20 -wait2: halt \ halt - djnz wait2 ;delay cal _getkey ;wait for keypress jp quit ;restore some things and return to TI-OS/shell @@ -2025,13 +2475,23 @@ New_game: xor a ;score 0 ld (score),a ;reset score ld (score+1),a ;reset score + 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 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 @@ -2039,15 +2499,6 @@ You_die: ld a,(hl) ;load lives left inc a ;if lives=0ffh then a=0 jp z,game_over ;if so, game's over - - xor a ;a=0 -; ld (your_armor),a ;no armor - ld (torp_occ),a ;no torpedoes - ld (your_laser),a ;no laser - ld (your_pickup),a ;reset pickups - ld (your_multiples),a ;no multiples - ld a,5 ;&&& betatest; remove when released! - ld (your_armor),a jr nonext_level ;--------------------------- next level --------------------------------------- @@ -2059,7 +2510,7 @@ Next_level: ld (hl),a ld hl,(levelp) ;level pointer - ld bc,5+32+4 ;advance four bytes (=one level) + ld bc,5+32+4+3 ;advance one level add hl,bc ;update to point to next level ld (levelp),hl ;save @@ -2091,12 +2542,9 @@ nonext_level: inc hl ld de,spacespace - ld bc,36 + ld bc,17+17+2 ldir -; xor a -; ld (level_occ),a ;no boss (yet) - ld ix,starx1 ld b,nrstars1 cal placestars @@ -2111,15 +2559,12 @@ nonext_level: ld hl,your_occ ;hl = your_occ ld (hl),a ;reset your ship (not exploding) inc hl ;hl = your_inv - ld (hl),50 ;set 50 frames invulnerable + ld (hl),25 ;set 25*4=100 frames invulnerable ld hl,x ;begin position x=... ld (hl),a ;...=a=0=left inc hl ;y=... ld a,24 ;...=24=middle ld (hl),a ;your y - ld (bossy),a ;and y of boss - ld a,80 - ld (bossx),a ld a,(torp_occ) or a ;no torpedoes? @@ -2128,19 +2573,13 @@ nonext_level: torpsclear: ld de,$0018 ;x=0, y=24 (like you..) - cal Place_multiples ;place all multiple-positions at (0,24) +; cal Place_multiples ;place all multiple-positions at (0,24) - ld hl,ybullets ;clear your/enemy bullets - ld (hl),a ;clear first byte - ld de,ybullets+1 ;and copy this byte to the next byte - ld bc,(nrybullets+nrebullets)*3-1 ;bc times (all bullets) - ldir - - ld hl,enemies ;and remove all enemies as well - ld (hl),a ;clear first byte - ld de,enemies+1 ;point to the next - ld bc,add2enemy+nrenemies*2 ;clear enemy-info + enemiesxtra - ldir + 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 ;--------------------------- setup game --------------------------------------- @@ -2173,53 +2612,24 @@ game_setup: cal _puts ;display the string res 3,(iy+5) ;set white on black - ld b,$20 -wait: halt \ halt - djnz wait ;delay cal _getkey ;wait for keypress cal CLEARLCD ;clear screen cal disp_icons ;display bottom icons - - ld hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom - ld b,16 ;draw 16x (screen width) - ld a,%11111111 ;horizontal line mask -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) - ret - + ret placestars: - add a,b - rlca \ rlca - ld hl,(RanPos) - add a,(hl) - xor %00100100 - rlca - ld (hl),a - - ld h,0 ; l = 0 - ld l,a ;hl = 0..255 - add hl,hl ;hl = 0..510 - ld c,a ;hl = 0..765 - - ld a,r ;a = 0..255 - rra ;a = 0..127 + cal Random5016 ;a = (0..50)*16 = random y-pos + ld a,b ;a = b = star nr. = 1..7 + add a,a ;a = 2b = 2..14 ld d,0 - ld e,a - add hl,de - ld e,c - add hl,de + ld e,a ;de = a = 2-14 + add hl,de ;add to random y => random pos anywhere - ld de,GRAPH_MEM - add hl,de - - ld (ix),l - ld (ix+1),h - inc ix \ inc ix - djnz 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 ret ;--------------------------- putsprite ---------------------------------------- @@ -2253,7 +2663,7 @@ putsprite: 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 - + ld d,(ix) ld b,(ix+1) _oloop: psh bc ;Save # of rows @@ -2309,10 +2719,10 @@ putwidesprite: jr nc,n1 inc b n1: ld c,a - add hl,bc + add hl,bc - ld d,(ix) - ld b,(ix+1) + ld d,(ix) + ld b,(ix+1) woloop: psh bc ;Save # of rows psh hl ;Save screen address ld b,d ;Load width @@ -2360,13 +2770,21 @@ spr_ship01: .db 7,7 ;ship alpha class .db %01111000 ; ████ .db %11100000 ; ███ - .db %11111100 ; ██████ + .db %01111100 ; █████ .db %11110010 ; ████ █ - .db %11111100 ; ██████ + .db %01111100 ; █████ .db %11100000 ; ███ .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 ; █ █ █ @@ -2425,7 +2843,7 @@ spr_bullete1: ;---------------------------------------- explosion ------------------------------------------- -spr_explosion: +spr_explosion: .db 8,6 ;1 .db %00000000 .db %00011100 ; ███ @@ -2490,8 +2908,26 @@ spr_explosion: .db %00000010 ; █▒ .db %00100100 ; █▒ █ +spr_yexplosion: + .db 8,6 ;8 + .db %00000000 ; + .db %00000000 ; + .db %00000000 ; + .db %00000000 ; + .db %00000000 ; + .db %00000000 ; + ;--------------------------------------- bar ----------------------------------- +spr_iconhalf: + .db 16,7 ;selected .......: + .db %11111111 ; ████████ + .db %00000001 ; █ + .db %00000001 ; █ + .db %00000001 ; █ + .db %00000001 ; █ + .db %00000001 ; █ + .db %11111111 ; ████████ spr_icon: .db 16,7 ;selected .......:.......: .db %11111111,%11111111 ; ████████████████ @@ -2529,14 +2965,14 @@ spr_icon02: .db %10011000,%11110101 ; █ ██ ████ █ █ .db %11100110,%00110010 ; ███ ██ ██ █ spr_icon03: - .db 8,7 ;empty .......: - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ - .db %10000000 ;00000000 ; █ + .db 16,7 ;bullets .......:.......: + .db %10000000,%11000000 ; █ ██ + .db %10000011,%11100000 ; █ █████ ▒▒▒ + .db %10011000,%11000000 ; █ ██ ██ ▒▒▒ + .db %11111100,%00000000 ; ██████ ▒▒▒ + .db %10011000,%11000000 ; █ ██ ██ ▒▒▒ + .db %10000011,%11100000 ; █ █████ ▒▒▒ + .db %10000000,%11000000 ; █ ██ spr_icon04: .db 16,7 ;laser .......:.......: .db %10000000,%00000000 ; █ @@ -2555,10 +2991,13 @@ spr_icon05: .db %10011000,%00000000 ; █ ██ .db %10111100,%11000011 ; █ ████ ██ ██ .db %10011000,%00000000 ; █ ██ +spr_dividerline: + .db 8,7 + .db 128,128,128,128,128,128,128 ;128 = %10000000 ;---------------------------- texts ------------------------------------------- -txt_about: .db " v0.94.A08",127,"by Shiar",0 +txt_about: .db " v0.95.A22",127,"by Shiar",0 txt_email: .db "shiar0@hotmail.com",0 txt_menu1: .db "CONTINUE",0 txt_menu2: .db "NEW GAME",0 @@ -2568,7 +3007,10 @@ txt_gameover: .db "GAME OVER!",0 txt_score: .db "Score",0 txt_hiscore: .db "Hiscore",0 txt_lives: .db "Lx0?",0 + txt_pressenter: .db "Enter to continue",0 +txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0 +txt_teacherans: .db Lneg,"14.2063168184",0 ;---------------------------- save data --------------------------------------- @@ -2580,177 +3022,21 @@ score .dw $0000 stored_data_start: hiscore .dw $0000 +hiname .db "Shiar.95",0 stored_data_end: your_pickup .db $00 your_occ .db $00 ;0=normal 1..16=exploding your_inv .db $00 ;invincibility left -your_armor .db $00 ;HP left +your_armor .db $05 ;HP left your_lives .db $00 ; -your_laser .db $00 ;laser avail: 0=no, 1=yes +your_weapon .db $00 ;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) -;---------------------------- enemy data -------------------------------------- - -sprites: - .db $00 - .db spr_enemy01-spr_enemy00 - .db spr_enemy02-spr_enemy00 - .db spr_enemy03-spr_enemy00 - .db spr_enemy04-spr_enemy00 - .db spr_enemy05-spr_enemy00 - .db spr_enemy06-spr_enemy00 - .db spr_enemy07-spr_enemy00 - .db spr_enemy08-spr_enemy00 - -spr_enemy00: - .db 7,5 ;pickup - .db %11111110 ; ███████ - .db %11111110 ; ███████ - .db %11000110 ; ██ ██ - .db %11111110 ; ███████ - .db %11111110 ; ███████ -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_enemy08: - .db 8,6 ;enemy type eight - .db %00011110 ; ████ - .db %01111111 ; ███████ -enemy00:.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 - -;----------------------------- level info ------------------------------------- - - ;format: enemy nr; enemy frequency; next lvl; level_move; level_fire - ;tunnel size; groundtype; 17_ground; 17_ceiling; stars1; stars2 -level01: ;efrequency must be odd if halfluring! - .db $01,$1b,$2f,%00010000,255,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 -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 -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 - -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 -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 -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 - -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 +#include nemesis0.z80 ;----------------------------- logo ------------------------------------------- @@ -2783,7 +3069,7 @@ logo_nemesis: ;------------------------------------------------------------------------------ -;0.94.1008 -- 08.X.99 -- size 4531 (4456) +; 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! @@ -2811,6 +3097,48 @@ logo_nemesis: ; # 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!) +; # bullets hit enemies correctly that aren't 6x6; even the 16x10 bosses! +; * at g/o or nextlevel checks for keys released instead of waiting abit +; + name stored with hiscore (max. 8 chars, Shiar.95 by default) +; + when entering hi-name DEL goes back one char (with check 4 no chars) +; # program is reloaded at start so some score-bugs solved! (_asapvar=0) +; * at death, upgrades and pickups AREN'T removed! (just armor=0) +; # bullet is not displayed after being removed anymore +; # armor-icon stays hilighted when armor is decreased +; * when stars move off screen, they are placed at a NEW y-pos! +; * the starting x-positions of stars are not random, so the stars are +; spread all over screen. y is still random and changes during game +; * make_random functions smaller and used by different procs +; # MAJOR BUG! a "random" value was placed somewhere in mem thus +; creating bugs like unexplained loss of armor and stuff! +; ; ; + added - removed * changed # bug fixed diff --git a/nemesis0.z80 b/nemesis0.z80 new file mode 100644 index 0000000..ca96ca6 --- /dev/null +++ b/nemesis0.z80 @@ -0,0 +1,198 @@ +;---------------------------- 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 + +spr_enemy00: + .db 7,5 ;pickup + .db %11111110 ; ███████ + .db %11111110 ; ███████ + .db %11000110 ; ██ ██ + .db %11111110 ; ███████ + .db %11111110 ; ███████ + .db 0 + +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 ; ███████ +enemy00:.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 +