From 8fa1ae2c72bf2560f741a0d0a38827b0579fc961 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Thu, 21 Dec 2000 22:37:36 +0100 Subject: [PATCH] version 1.0: weapon updates, start ti-83 version + does NOT display Done after running in TI-OS! (anti-teacher ;) * storyline completed (probably the crappiest story ever!) # only first byte of ship's sprite altered; now loads whole word - tail beam removed (up double only); odd ships now contain laser # fixed laserbeam display when firing at right edge # star relocation altered to work correctly w/ new screen location # halfluring wasn't 50% (more like 75%) since random enemy spawning * restored multiples for bullets (since it's unlikely you'll select 1) # fixed mem overlapping causing "weird stuff" when moving multiples # bullets fired below screen bottom are moved up onto screen + SOURCE ALSO TI-83 COMPATIBLE (still few bugs like hiscore, bullets) # upgrading beam weapon removed multiples # clipping at left side wrong in TI-83 version fixed --- nemesis.txt | 47 +- nemesis.z80 | 2029 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 1381 insertions(+), 695 deletions(-) diff --git a/nemesis.txt b/nemesis.txt index e7ff9a0..b6426d6 100644 --- a/nemesis.txt +++ b/nemesis.txt @@ -14,16 +14,15 @@ ------------------------------------------------------------------------------ Title : Nemesis - Version : 1.0.A23 Beta - Release Date : 23.X.00 - Filename : nemesis.86p (size 7212) + Version : 1.0.111 Beta + Release Date : 11.I.01 + Filename : nemesis.86p (size 6785) Author : Shiar Email Address : shiar0@hotmail.com Web Page : http://www.shiar.org Description : cool arcade-shoot-em-up-game Where to get this game : www.shiar.org | ticalc.org - Other games by author : Worm - + Other games by author : Wormy >>>>>>> NOTE ON V.99 --------------------------------------------------------- @@ -33,7 +32,6 @@ to me. Thanks, and have fun! (No comments on levels, storyline and difficulty plz, working on that) - >>>>>>> INTRO TO NEMESIS ----------------------------------------------------- Nemesis is an old arcade-game for many platforms, originally for arcades. @@ -41,15 +39,12 @@ I first played Nemesis III for the MSX (1988), but Konami made at least 41 Nemesis-games - named Nemesis=Gradius, LifeForce=Salamander, Parodius - for systems including the C64, Game Boy, (S)NES and PlayStation(2). - >>>>>>> THA GAME ------------------------------------------------------------- After selecting NEW GAME, you have to choose your ship to fly with. Note the last two are HARDCORE-ships, which have a lot less armor than the others. - Before a level starts, you can press [F1] to save the game. If you choose CONTINUE GAME later, you'll start at that level. - In the game itself you just have to keep yourself from getting destroyed. The following keys might come in handy: @@ -63,63 +58,54 @@ The following keys might come in handy: At the bottom you can see the current power of your weapon, your lives left, armor left, your upgrades and score. - >>>>>>> UPGRADES ------------------------------------------------------------- Flying over a small pickup will increase your armor and activate the shield for a short time. The shield will reduce any damage, and completely absorb enemy bullets in normal mode. - After defeating a boss, a larger pickup will appear, which you can use to upgrade your ship. These upgrades are: 1 - BEAM: The standard weapon all vessels are equipped with. Selecting this icon will upgrade your weapon to a more powerful one. This can only be done nine times. - 2 - LASER: A direct weapon which replaces the beam-weapon. Can also be upgraded upto nine times. - - 3 - TAILBEAM / UP DOUBLE: Depending on the vessel you fly with, this -activates either a tail beam (a bullet going backwards) or up double (bullet -going up 45 degrees). This extra weapon is only available when your ship is -equipped with a beam weapon. - - - MULTIPLES: or "options". Will be selected if you've got lasers. These -will follow your ship and fire when you do, effectively doubling your damage. -You can have four of them. - + 3 - MULTIPLES: or "options". These will follow your ship and fire when you +do, effectively doubling your damage. You can have as much as four of them. 4 - SCORE: If you collect four pickups, your score will be increased by 250 points. This is for the real hardcore shmuppers who don't need no skinkin' upgrades. - >>>>>>> BETA STUFF ----------------------------------------------------------- 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: shiar@mailroom.com, +program, or even send me something if you don't. Again: shiar0@hotmail.com, PLEASE! - Tested on TI86es and emulators with ROM 1.2, 1.4 and 1.6 using YAS, -Rascall and Asm(. Nemesis will NOT run correctly under RASCALL with the -memory LOCKED! Besides that there shouldn't be any bugs. + Tested on TI86es and emulators with ROM 1.2, 1.4 and 1.6 using Asm(, +YAS (recommended), Rascall, ASE and iShell. TI83 with ROM 1.10 and Ion 1.6. +- Nemesis will NOT run correctly under RASCALL with the memory LOCKED! +- There could be problems with ASE (ase crashing after running). I don't know + for sure yet, still working on it. +- The TI-83 version will crash about every five seconds. Still in development. +Besides that there shouldn't be any bugs. Version 1.0 will probably have 13 levels, NO bugs (depending on how good you betatest-guys do your job :P) and the source will be included. It will -NOT feature multiplayer or greyscale graphics. - +NOT (never) feature multiplayer or greyscale graphics. >>>>>>> CREDITS -------------------------------------------------------------- Programming/levels/gfx - SHIAR Official betatesters - DAVE -- BLACKBELT -- MATTHEW DALE + ALLEN -- DAISUKE NUNOME -- JASON TAN Support (advise/ideas/etc) - JONAH -- SCABBY -- BRIAN KOROPOFF Original engine (Galaxian) - PATRICK DAVIDSON Original Nemesises - KONAMI Also alot of thanks to EVERYBODY WHO SENT ME SOMETHING and everybody I forgot. - >>>>>>> RULEZ AND REGULATIONS ------------------------------------------------ * Thou shalt not hold me responsible for damage to your calc or anything else @@ -128,5 +114,4 @@ Also alot of thanks to EVERYBODY WHO SENT ME SOMETHING and everybody I forgot. * Thou shalt not ask money for this program * Thou shalt eat plenty of vegetables every day - ---------------------------------------------------------------------- <<<<<<< \ No newline at end of file diff --git a/nemesis.z80 b/nemesis.z80 index 495d581..f0a5bb1 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,42 +1,164 @@ -;---------------------------------------------------------------------------- -;-------------------------------- NEMESIS ----------------------------------- -;----------------------------------------------- cool arcade-shoot-em-up-game +;----------------------------------------------------------------------------- +;---------------------------- N E M E S I S -------------------------------- +;------------------------------------------------ cool arcade-shoot-em-up-game + +; --------- Version - 1.01.314 --------- +; --------- Release Date - 2002 March 14 --------- +; --------- Author(s) - Shiar --------- +; --------- Email Address - nemesis@shiar.org --------- +; --------- Web Page - www.shiar.org --------- +; --------- Description - cool shoot-em-up arcade --------- +; --------- Where to get this game - shiar.org --------- +; --------- Other games by author(s) - Wormy --------- + +; ---------------------------------------------------------------------- +; --- This source should only be used for learning practises, do not --- +; --- alter it, and certainly never distribute an altered version!! --- +; ---------------------------------------------------------------------- + +;---------------------- nemesis.z80 start ------------------------------------ + + #define TI86 ;TI83 + + #define cal call ;just to make it harder for you to understand + #define rcl call ;RemoteCaLl / RomCalL + #define rjp jp ;RomJumP + #define dnz djnz ;Dec&Jump while NonZero becomes Do w.Non-Zero + #define psh push ; >:-> + +#ifdef TI83 ;----------------------------------------------------------------- +#include "ion.inc" ;standard TI-83 ROMcalls (Ion shell) + + #define halt or a + +scrwidth = 12 + +#define teacherkey ;compiled with teacher key: 92 bytes extra + +VIDEO_MEM = plotsscreen +dispbuffer = VIDEO_MEM ;virtual screen (MUST be mod$400=0!!) + +BUSY_OFF = _indicatorOff +_curRow = currow +_curCol = curcol +_penCol = pencol +;_clrLCD = _clrlcdf ;clears screen +_clrScrn = _clrscrf ;also clears TEXT_MEM +_clrWindow = _clrscrf +GET_KEY = $4014 ;_getcsc +CONTRAST = contrast +_dispahl = _disphl +UNPACK_HL = $4008 ;_divhlby10 +CP_HL_DE = _cphlde +Lpi = $C4 +Lneg = $1A +K_DOWN = 1 +K_LEFT = 2 +K_RIGHT = 3 +K_UP = 4 +K_ENTER = 9 +K_DEL = $20 +K_ALPHA = $30 ;48 +K_F1 = $35 ;Y= +K_SECOND = $36 ;54 +K_EXIT = $37 ;Mode +kEnter = 5 +kGrMenu = 44 + +storepos = saferam2 ;<1024 bytes needed to store things + + .org progstart + + ret + jr nc,init +Title: .db "Nemesis 83 TEST by SHIAR",0 +#endif ;---------------------------------------------------------------------- + + +#ifdef TI85 ;----------------------------------------------------------------- +#include "usgard.h" ;usgard shell + +scrwidth = 16 + +;#define clearbuffer ;clears the display buffer after usage +;#define fixkeys ;fixes left+down bug: 47 bytes extra size +;#define teacherkey ;compiled with teacher key: 92 bytes extra +;#define story ;storyline shown (w/ neat effect): 871 bytes +;#define shiscore ;save hiscore/savegame +;#define invertable -;------- by SHIAR | shiar0@hotmail.com | icq#43840958 | www.shiar.org ------- +dispbuffer = $8400 ;$C9FA ;virtual screen (MUST be mod$400=0!!) + ;8100-8C00 +;_clrWindow = $4a86 ;_clrLCD and _clrScrn +;_ex_ahl_bde = $45f3 ;exchange values between AHL and BDE +;_shracc = $4383 ;like _shlacc but just the opposite :P +;_dispahl = $4a33 ;display value in ahl <100000 (cheap TI) +;_asapvar = $d6fc ;our own variable name (likely "nemesis") -;!!! This source should only be used for learning practises, do not !!! -;!!! alter it, and certainly never distribute an altered version!! !!! +storepos = TEXT_MEM ;<1024 bytes needed to store things +saferam1 = DELC_MEM -;TO DO: levels 12 and 13 | draw bosses 12 and 13 (41/42) + .org 0 +Title: .db "Nemesis 85 Alpha" ;Usgard description +; .db " - 4 Nunome",0 ;present + .db " by SHIAR",0 ;author +#endif ;---------------------------------------------------------------------- -;---------------------- nemesis.z80 start ----------------------------------- +#ifdef TI86 ;----------------------------------------------------------------- #include "asm86.h" #include "ti86asm.inc" ;standard ti86 romcalls #include "ti86abs.inc" ;used to save hiscores and stuff - .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 +scrwidth = 16 -#define teacherkey ;compiled with teacher key: 88 bytes extra +;#define clearbuffer ;clears the display buffer after usage +#define fixkeys ;fixes left+down bug: 47 bytes extra size +#define teacherkey ;compiled with teacher key: 92 bytes extra +;#define story ;storyline shown (w/ neat effect): 871 bytes +#define shiscore ;save hiscore/savegame +#define invertable dispbuffer = $8400 ;$C9FA ;virtual screen (MUST be mod$400=0!!) - + ;8100-8C00 _clrWindow = $4a86 ;_clrLCD and _clrScrn _ex_ahl_bde = $45f3 ;exchange values between AHL and BDE _shracc = $4383 ;like _shlacc but just the opposite :P _dispahl = $4a33 ;display value in ahl <100000 (cheap TI) _asapvar = $d6fc ;our own variable name (likely "nemesis") -storepos = _asm_exec_ram+7000 ;1024 bytes needed to store things +storepos = _asm_exec_ram+7800 ;<1024 bytes needed to store things + ;$F5C0..F9C0 (safe mem D748..FA6F) + + .org _asm_exec_ram + + nop ;hello yas/ase/rascall/whathever + jp init ;here's the program, but first: a description + .dw $0001 ;description type 2 (description + YASicon) + .dw Title ;pointer to description (all shells) + .dw Icon ;pointer to YAS icon + +Title: .db "Nemesis v1.0.C21" ;Ashell/Rascall/YAS/any shell description +; .db " - 4 Nunome",0 ;present + .db " by SHIAR",0 ;author + +Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 7bytes + .db %11100000 ; ███ + .db %01111000 ; ████ + .db %00111110 ; █████ + .db %01111001 ; ████ █ + .db %00111110 ; █████ + .db %01111000 ; ████ + .db %11100000 ; ███ ;recommend 80x50 screen mode + .db 0 ;YAS 0.92 compatibility +#endif ;---------------------------------------------------------------------- -;---------------------- in-game vars ---------------------------------------- +;---------------------- in-game vars ----------------------------------------- just_fired = storepos ; +0 ;counts how long a blast lasts +#ifdef shiscore hiscorepos = storepos ; +0 ;entering hiscore name +#endif x = storepos+1 ; +1 ;your ship's position y = x+1 ; +2 ;your y-pos @@ -45,59 +167,72 @@ firey = firex+1 ; +4 ;(1 byte) eventleft = firey+1 ; +5 ;nr. of enemies still to come level_enemy = eventleft+1 ; +6 ;enemy type -level_info = level_enemy+1 ; +7 ;ceiling/ground (%00) present +level_info = level_enemy+1 ; +7 ;ground (%0) present spacespace = level_info+1 ; +8 -groundinfo = spacespace+1 ; +9 -stars1 = groundinfo+1 ; +10 ;slow stars byte (<< %1) -stars2 = stars1+1 ; +11 ;fast stars byte (<<< %1) -groundpos = stars2+1 ; +12 $10 -ceilingpos = groundpos+16 ; +28 $10 +stars1 = spacespace+1 ; +9 ;slow stars byte (<< %1) +stars2 = stars1+1 ; +10 ;fast stars byte (<<< %1) +groundpos = stars2+1 ; +11 $10 nrstars1 = 10 -starx1 = ceilingpos+16 ; +44 ;20 +starx1 = groundpos+16 ; +27 ;20 nrstars2 = 10 -starx2 = starx1+(nrstars1*2) ; +64 ;20 +starx2 = starx1+(nrstars1*2) ; +47 ;20 mm = 4 ;max. number of multiples -your_prevpos = starx2+(nrstars2*2) ; +84 ;14*mm+2 ;previous positions +your_prevpos = starx2+(nrstars2*2) ; +67 ;14*mm+2 ;previous positions -enemies = storepos+200 ;+200 ;info about each enemy +enemies = your_prevpos+(mm*14+4);+125 ;info about each enemy enemysize = 11 ;infobytes per enemy nrenemies = 16 ;max. nr of enemies +#ifdef TI86 ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y) -nrybuls = 128 ;+376\ -ebullets = ybullets+(nrybuls*4) ;+888 ;30 bytes = 10(state,x,y) +#else +ybullets = saferam1 +#endif +nrybuls = 128 ;+301 +ebullets = ybullets+(nrybuls*4) ;+813 ;30 bytes = 10(state,x,y) nrebuls = 48 -lvlenemies = ebullets+(nrebuls*3) ;-1032 +lvlenemies = ebullets+(nrebuls*3) ;-957 ;enemies: ; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 1X=normal)] -; [ship sprite (DW!) or explosion frame] [x] [y] [movetype] [movecounter] -; [firecounter] [firefreq] [firetype] +; [ship sprite (DW!) or explosion frame] [x] [y] [movetype] +; [movecounter] [firecounter] [firefreq] [firetype] -;---------------------- introduction ---------------------------------------- +;---------------------------- save data -------------------------------------- - nop ;hello yas/ase/rascall/whathever - jp init ;here's the program, but first: a description - .dw $0001 ;description type 2 (description + YASicon) - .dw Title ;pointer to description (all shells) - .dw Icon ;pointer to YAS icon +;#ifdef shiscore +storehi_start: +hiscore .dw 0 ;default hiscore +hiname .db "by shiar",0,0 ; " " name +storehi_end: +;#endif -Title: .db "Nemesis v1.0.A23 by SHIAR",0 +invertmode: cpl ;/or a ;saves B<>W mode setting cpl -Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 7bytes - .db %11100000 ; ███ - .db %01111000 ; ████ - .db %00111110 ; █████ - .db %01111001 ; ████ █ - .db %00111110 ; █████ - .db %01111000 ; ████ - .db %11100000 ; ███ ;recommend 80x50 screen mode - .db 0 ;YAS 0.92 compatibility +storesave_start: ;--SAVED GAME-- defs: +your_ship .dw spr_ship03 ;your sprite (^invertmode^) sprs1 +level .db 4 ;level number 1 +levelp .dw level05 ;pointer to level data lev00 +pickuptimer .db 4 ;counts when to place a pickup 4 +your_score .dw 0 ;current score 0 +your_pickup .db 3 ;pickups already picked up 0 +your_occ .db 0 ;0=normal 1..16=exploding 0 +your_shield .db 0 ;invincibility left 0 +your_armor .db 24 ;HP left 24 +your_lives .db 3 ;lives left 3 +your_weapon .db 3 ;current weapon upgrade 0 +your_multiples .db 0 ;multiples present 0 +your_extra .db 0 ;extra beam present 0 +hardcore .db 0 ;hardcore mode if non-0 0 +storesave_end: -;---------------------- init ------------------------------------------------ +time2invert: .db 0 ;time until b<>w switch (0 at startup) +;45+31=76 +;---------------------- init ------------------------------------------------- +#ifdef fixkeys int_handler: ;new interrupt proc ex af,af' ;just af only (no need for exx) in a,($03) ;read bit 3 port 3 @@ -106,14 +241,32 @@ int_handler: ;new interrupt proc res 0,a ;yes: then we have a problem (freeze), so... out ($03),a ;...mask the ON key interrupts! jp $0039 ;all done, return -int_end: +int_end: ;(size 15 bytes) +#endif -init: cal BUSY_OFF ;turns the run-indicator off, obviously - cal _clrScrn ;clean the screen - xor a ;ld a,0 +init: rcl BUSY_OFF ;turns the run-indicator off, obviously +#ifdef TI83 + ld (iy+13),0 + res 6,(iy+9) ;TI-83 uses statmem + set textwrite,(iy+20) ;write text to gbuf + rcl _clrLCD +#endif +#ifdef TI86 res 2,(iy+13) ;don't scroll the screen - cal _flushallmenus ;remove TI menus + rcl _flushallmenus ;remove TI-86 menus + rcl _clrScrn ;clean the screen + ld hl,$8200 + ld c,10 +_clrmem: + ld b,0 +clrmem: ld (hl),-1 + inc hl + djnz clrmem + dec c + jr nz,_clrmem +#endif +#ifdef fixkeys FixKeys: ;fixes some key problems like left+down bug im 1 ld a,$D4 @@ -133,49 +286,57 @@ FixKeys: ;fixes some key problems like left+down bug inc a ;ld a,$D4 ld i,a im 2 +#endif -;---------------------- main menu ------------------------------------------- +;---------------------- main menu -------------------------------------------- LogoPut: xor a ;white bitmask (a=0) ld hl,logo_nemesis ;from... - ld de,VIDEO_MEM+16 ;...to one line from top + ld de,VIDEO_MEM+scrwidth;...to one line from top +#ifdef TI86 ld b,e ;ld b,16: one line +#else + ld b,scrwidth +#endif AboveLogo: ld (de),a ;clear/n byte inc de ;next dnz AboveLogo ;repeat for the first line - ld bc,16*19 ;logo size + ld bc,scrwidth*19 ;logo size ldir ;display one line of logo - ld hl,16*$33+VIDEO_MEM ;$33 rows down - ld b,16*7 ;draw black 7 lines + ld hl,scrwidth*$33+VIDEO_MEM ;$33 rows down + ld b,scrwidth*7 ;draw black 7 lines ld a,%11111111 ;horizontal line mask underline: ld (hl),a ;draw one piece of the divider-line inc hl ;move right (8 pixels = 1 byte) dnz underline ;repeat +#ifdef TI83 + cal fastCopy ;draw buffer on screen +#endif ld hl,_txt_email ;at the very bottom of tha screen ld (_penCol),hl ld hl,txt_email ;hey, my e-mail address so SEND ME SOMETHING!! - cal _vputs ;VERY important, so display in small font ?:} + rcl _vputs ;VERY important, so display in small font ?:} set 3,(iy+5) ;set white on black ld de,_txt_about ;near the bottom of the screen ld (_penCol),de ;hl=txt_email++=txt_about - cal _vputs ;display version + me + rcl _vputs ;display version + me res 3,(iy+5) ;return to default black on white dispmenu: ld de,$0304 ld (_curRow),de ld hl,txt_menu1 ;NEW GAME - cal _puts + rcl _puts ld de,$0305 ld (_curRow),de ld hl,txt_menu2 ;CONTINUE GAME - cal _puts + rcl _puts menuloop: ld a,0 ;current menu item (0 or 1); 0 by default @@ -185,13 +346,13 @@ menuitem =$-1 ld l,a ;y-coord. = sel menu item + 4 = 4/5 ld (_curRow),hl ;set position ld a,5 ;'*' - cal _putmap ;mark selected menu item + rcl _putmap ;mark selected menu item ld a,l ;y-pos 4/5 xor 1 ;invert (4=5; 5=4) ld (_curRow),a ;set new row position ld a,32 ;' ' (empty, just remove any * present) - cal _putc + rcl _putc cal getsomekeys ;read keys (z if enter/2nd pressed) ld hl,menuitem @@ -230,6 +391,7 @@ do_invert: ;invert screen (b<>w) pop hl ret +#ifdef invertable mode_invert: ld hl,invertmode ;change invert mode (will be stored) ld a,$98 @@ -241,10 +403,11 @@ mode_invert: ld hl,4+invertmode-_asm_exec_ram psh hl ;src jp storesmtn +#endif -;---------------------------------------------------------------------------- -;---------------------- game loop ------------------------------------------- -;---------------------------------------------------------------------------- +;----------------------------------------------------------------------------- +;---------------------- game loop -------------------------------------------- +;----------------------------------------------------------------------------- game_main_loop: ;REPEATS FROM HERE EVERY FRAME ld hl,timer ;update time @@ -254,7 +417,7 @@ Clear_screen: ld hl,dispbuffer ;move from (hl) = top left ld (hl),0 ;first pixel will be copied all over the screen ld de,dispbuffer+1 ;(de) = next pixel, thus clearing whole screen - ld bc,16*56-1 ;loop 896 times = (128/8) * (64-8 for scorebar) + ld bc,scrwidth*56-1 ;loop 896 times = (128/8) * (64-8 for scorebar) ldir ;all clear! ld a,0 ;current frame/turn 0-255 @@ -275,9 +438,7 @@ movestarsdone: ld a,(level_info) ;level info rra ;ground present? (%1) - jr nc,game_stuff ;no, so both non-present - rra ;bit representing the presence of any ceiling - cal nz,Handle_ceiling ;scroll the ceiling (if any) +check4collision + jr nc,game_stuff ;no, continue game cal Handle_ground ;scroll the ground and check if we're dead game_stuff: @@ -336,9 +497,18 @@ _gamestuff1: cal Level_event ;insert enemies cal Display_Screen ;display all +#ifdef TI86 delay: halt ;delay and preserve batteries :) - jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#else ;halt doesn't work on TI-83 + ld b,0 +delay: + xor 1 + and 1 + jr z,delay + dnz delay +#endif + jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;------- weapon ------- @@ -368,16 +538,24 @@ weapdamage =$-1 disp_charge: ;display charge bar - ld hl,(58*16)+VIDEO_MEM+3 - ld b,3 +#ifdef TI86 + ld hl,(58*scrwidth)+VIDEO_MEM+3 + ld b,3 ;bar width 3 +#else + ld hl,(58*scrwidth)+VIDEO_MEM+2 + ld b,2 ;bar width 1.5 +#endif chargebarclr: dec hl - ld (hl),0 + ld (hl),0 ;clear (previous) bar dnz chargebarclr ld a,(weapincs) ;load bar size (0-80) srl a ;half the size (0-40) srl a ;again half that size (0-20 pixels) +#ifdef TI83 + srl a ;and again if 83 (smaller screen) +#endif ld c,a ;psh a srl a ;/2 srl a ;/4 @@ -402,13 +580,16 @@ chargebarready: ; (an if B=3 then a=%11100000) ld (hl),a ;draw this last byte ret -;--------------------------- ground ----------------------------------------- +spr_bossA2: ;the following 51 bytes also function as the + .db 8,51 ; sprite for boss A2 (the fullscreen asteroid) + +;--------------------------- ground ------------------------------------------ Handle_ground: ld a,(timer) and %111 ;once every 8 frames jr nz,Display_ground ;otherwise skip the scroll - ld bc,15 ;scroll all 16 bytes minus one (teh new byte) + ld bc,scrwidth-1 ;scroll all 16 bytes minus one (teh new byte) ld hl,groundpos+1 ;from.. ld de,groundpos ;to (one byte to the left) ldir ;LoaDIncreaseRepeat = scroll! @@ -422,9 +603,10 @@ Handle_ground: dec a ;a=-2..2 ld b,a add a,(hl) ;substract to spacesize - cp 57 - jr nc,newground ;if nothing left then don't change + cp 128 + jr c,newground ;if nothing left then don't change ld c,a + ld a,d ;current grond height add a,b ;add offset (2 higher/lower) => new position or a ;=0? jr z,newground ;may not be 0 (=256) @@ -437,10 +619,10 @@ newground: ld (groundpos+15),a ;save new byte on the right Display_ground: - ld b,16 ;screen width + ld b,scrwidth ;screen width ld de,groundpos-1 ;height of current byte (previous actually) psh de ;use later - ld hl,dispbuffer+(56*16)-1 ;screen position + ld hl,dispbuffer+(56*scrwidth)-1 ;screen position psh hl groundloopright: @@ -451,7 +633,7 @@ groundloopright: ld a,(de) ;height of current byte ld b,a ;save in b - ld de,-16 ;to substract to go one line up + ld de,-scrwidth ;to substract to go one line up ld a,%11111111 ;bitmask black groundloopup: ld (hl),a ;display black byte @@ -480,90 +662,7 @@ CheckGround: ;check for collision with the ground ld b,auch_ground jp damage_you -;--------------------------- ceiling ---------------------------------------- - -Handle_ceiling: - ld a,(timer) - and %111 ;once every 8 frames - jr nz,Display_ceiling ;otherwise skip the scroll - ld bc,15 ;scroll all 15 bytes (16th is new position) - ld hl,ceilingpos+1 ;from.. - ld de,ceilingpos ;to (one byte to the left) - ldir ;LoaDIncreaseRepeat = scroll! - - ld a,(ceilingpos+14) - ld d,a ;d=new ceiling - ld hl,spacespace - - ld bc,$201 ;range=1..3 - cal Random ;a=1-3 - dec a - jr z,newceiling ;1:same - dec a - jr z,ctunnelup ;2:up -ctunneldown: ;3:down - ld a,(hl) - or a ;(spacespace)=0: - jr z,newceiling+2 ;keep same ceiling - inc (hl) - inc d - jr newceiling -ctunnelup: - ld a,1 - cp d ;if size=1 then don't - jr z,newceiling - dec d - dec (hl) -newceiling: - ld a,d - ld (ceilingpos+15),a ;save the new byte - -Display_ceiling: - ld b,16 ;screen width - ld de,ceilingpos-1 ;height of current byte - psh de ;use later - ld hl,dispbuffer-17 ;screen position - psh hl - -ceilingloopright: - ld c,b ;push b for ceilingloopdown - pop hl \ inc hl ;get screen position and go one right - pop de \ inc de ;get height info and set to the next byte - psh de \ psh hl ;save these for the next time - ld a,(de) ;height of current byte - ld b,a ;save in b - - ld de,16 ;to substract to go one line up - ld a,%11111111 ;bitmask black - or a -ceilingloopdown: - ld (hl),a ;display black byte - add hl,de ;go down - dnz ceilingloopdown ;and loop >ceilingpos< times - - ld b,c ;pop b used by ceilingloopdown - dnz ceilingloopright ;loop right for entire screen (16x) - pop hl \ pop hl ;restore stack - -CheckCeiling: ;check for collision with the ceiling - ld a,(x) ;your x - srl a ;x/2 - srl a ;x/4 - srl a ;x/8 (current ceiling-byte) - inc a ;correction - - ld l,a ;hl = a - ld h,0 ;" - ld de,ceilingpos ;first ceiling-byte - add hl,de ;current ceiling-byte - ld a,(y) ;your y-pos - inc a - cp (hl) ;compare with ceiling - ret nc ;carry if ceiling is above you - ld b,auch_ground - jp damage_you ;otherwise you don't wanna be in that ship - -;--------------------------- move stars ------------------------------------- +;--------------------------- move stars -------------------------------------- DisplayStars: ;inputs: hl=starx# a=stars# b=nrstars# ld e,(hl) @@ -588,7 +687,7 @@ movestars1: ld a,(timer) rra ld a,(stars1) - ret c + ret c ;once every other turn... rlca ld (stars1),a ret nc @@ -596,41 +695,42 @@ movestars1: movestars_loop: ld h,(ix+1) - ld l,(ix) - dec hl + ld l,(ix) ;star (ix) pos in hl + dec hl ;one byte left (hl--) - ld a,l - and %00001111 - cp (dispbuffer&15)-1 ;$C9FAand15-- = 9 - jr nz,newstarok - cal RandomY + ld a,dispbuffer/256-1 ;screen high byte minus one (it may be equal) + cp h ;compare w/ star high byte + jr c,newstarok ;screen32 then bc=bc+256) - add a,a ;y*16 (width of screen) + add a,a ;width of screen (y*16 (86) | y*12 (83)) rl b ;b=b*2+overflow (if y>64 then bc=bc+512) inc a ;8 pixels to right (a=even so no overflow) @@ -1332,8 +1561,9 @@ fire_laser: _nolc: ld c,a ;c = (Y*16+X/8) mod 256 ld hl,dispbuffer ;save-location add hl,bc ;bc = Y*16+X/8: hl=screen address - ld a,15 ;128/8=16=screen width ** minus one (inc a ^^) + ld a,scrwidth-1 ;128/8=16=screen width ** minus one (inc a ^^) sub d ;minus x-start (d=X/8) + jr z,handle_laser ;if size=0=256x (right edge) then skip display ld b,a drawlaser: ld (hl),%11111111 @@ -1396,7 +1626,7 @@ nolashit: ld c,a ;c=0 ret -;------------------------ handle bullets ------------------------------------ +;------------------------ handle bullets ------------------------------------- Handle_bullets: ld hl,ybullets @@ -1421,15 +1651,19 @@ scan_bullets: add a,(hl) ;a = X + (hl) to the right sub 16 ;and 16 to the left (so -16..+15) jr c,remove_bullet ;remove if x<0 - cp 128 + cp 8*scrwidth jr nc,remove_bullet ;or x>=128 ld (hl),a ;save new pos. ld d,a ;d = X inc hl ;@y-pos ld a,c - cal _shracc ;%11100000->1110 +#ifdef TI86 + rcl _shracc ;%11100000->1110 ;Note: a _shracc procedure inside Nemesis itself would be 27 cycles faster +#else + srl a \ srl a \ srl a \ srl a ;83 doesn't have a shracc call +#endif srl a ;%1110->111 dec a jr z,bullet_noymove ;1=straight forward @@ -1520,7 +1754,7 @@ bullethitbullet: ;"bullet" just displaying a bullet hit cal putsprite ;display hit-sprite jr next_ybullet ;handle the other bullets -;--------------------------- check bullethits ------------------------------- +;--------------------------- check bullethits -------------------------------- check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet ld b,nrenemies @@ -1614,7 +1848,7 @@ pickupdone: ld hl,1 ;increase score by one jp scoreInc ;+ret -;--------------------------- level events ----------------------------------- +;--------------------------- level events ------------------------------------ Level_event: ld a,0 ;time to next event @@ -1721,13 +1955,22 @@ chk_noenemy: ;find an unused (no) enemy jr z,lure_enemy ;yes: create a 100% luring enemy inc a ;is it -3? jr z,lure_enemy ;yes: pick one (50% lure) + inc a ;is it -4? + jr z,ground_enemy ;yes: place @ current ground position ;otherwise? yset_enemy: ;set 0+3..$FC+3 as y-position ld (de),a jr ypos_OK +ground_enemy: + ld a,(groundpos+15) ;ground height + neg ;negative (high ground, low y-pos) + add a,50 ;at the bottom + ld (de),a ;is turret's position + jr ypos_OK halflure_enemy: ld a,(timer) ;look at frame-number rra ;make random if odd frame nr. + rra ;...well make that frame/2 jr nc,random_enemy ;1st possibility: random enemy lure_enemy: ;2nd possibility: luring enemy ld a,(y) ;place at same y-pos as YOUR ship @@ -1750,7 +1993,7 @@ ypos_OK: ;random value successfully created ldi ; " firetype ret ;return -;--------------------------- enemy fires ------------------------------------ +;--------------------------- enemy fires ------------------------------------- Enemy_fires: ;de = x,y; c = type; ix = enemy_sprite ld hl,ebullets ;first bullet to check @@ -1784,13 +2027,29 @@ found_ebullet: dec a jr z,bulletdouble ;type #8 = double dec a - jr z,bulletquad ;type #9 = quad + jr z,bulletwide5 ;type #9 = wide 5x dec a jr z,bulletdquad ;type #10 = double-quad dec a jr z,bulletran ;type #11 = random dec a jr z,firesenemies ;type #12 = mine + Dquad + dec a + jr z,basefiresenemies ;type #13 = enemies + 10 + dec a + jr z,randomfire ;type #14 = random @full height + dec a + jr z,bulletwide3 ;type #15 = wide triple + dec a + jr z,bulletfullfire ;type #16 = straight 5x + +randomfire: + ld c,0 + ld b,62 + cal Random ;a=0..62 + ld e,a + ld (hl),1 + jp _bulletok basefiresenemies: ;type #13 = base ld bc,$3A00 @@ -1810,45 +2069,59 @@ firesenemies: ;type #12 = mine / Dquad ld a,boss1enemy ;otherwise place enemy #[boss1enemy] jp place_enemy -bulletran: +bulletran: ;type #11 = fires bullets 1-5 at random cal random14 - ld (hl),a + ld (hl),a ;set type a=1..5 jr _bulletok bulletdquad: ;type #10 = double-quad - cal bulletquad ;fire type #1 to 5 + cal bulletwide5 ;fire type #1 to 5 +addedgebullets: inc hl ld a,e - sub 5 - ld e,a ;offset 5 up + sub 7 + ld e,a ;offset 7 up ld c,1 ;type #1 = normal cal enemy_fires_again inc hl ld a,e - add a,10 - ld e,a ;offset 10 down (5 total) + add a,14 + ld e,a ;offset 14 down (7 total) _enemy_fires_again: jr enemy_fires_again -bulletquad: ;type #9 = quad +bulletwide5: ;type #9 = wide 5x (fires 4 dirs + 1 straight) cal bullettriple ;fire type #1, 4 and 5 inc hl ;next bullet ld c,2 ;type #2 = down cal enemy_fires_again inc hl ld c,3 ;type #3 = up - jr enemy_fires_again + jr _enemy_fires_again + +bulletfullfire: ;type #16 = straight 5 bullets + cal bullettriple ;fire 3 bullets at center (offset -2,+0,+2) + inc e \ inc e ;restore base (Y)position + jr addedgebullets ;fire 2 more bullets (at offsets -7 and +7) + +bullettriple: ;type #7 = triple + cal bulletdouble+1 ;fire double weapon (offset +0,+2) + dec e \ dec e ;two px back up + dec e \ dec e ;and another two up (offset -2) + inc hl ;next bullet position + ld c,1 ;type #1 = normal + jr _enemy_fires_again ;find and fire another bullet bulletdouble: ;type #8 = double - dec e ;one up - ld c,1 ;type #1 + dec e ;one up (1st bullet not centered:offset -1,+1) + ld c,1 ;type #1 = straight cal bulletok ;fire bullet inc hl ;next bullet position inc e inc e ;two px down jr _enemy_fires_again ;find and fire another bullet -bullettriple: ;type #7 = triple +bulletwide3: ;type #15 = spread (3 bullets) ld (hl),1 ;type #1 = normal cal _bulletok ;fire inc hl ;next bullet @@ -1883,10 +2156,15 @@ _bulletok: inc hl ld (hl),d ;set x-pos inc hl + ld a,58-5 ;bottom + cp e ;bullet-y... + jr nc,bulletonscreen ;bottom? - jr z,ebullet_common ;then keep it there + cp 58-4 ;y>=bottom? + jr nc,ebullet_common ;then keep it there ld (hl),e ;otherwise save new y ebullet_common: @@ -1976,7 +2254,7 @@ remove_ebullet: ld (hl),0 ;bullet > unused ret -;--------------------------- handle enemies --------------------------------- +;--------------------------- handle enemies ---------------------------------- Handle_enemies: ld hl,enemies+1 @@ -2075,7 +2353,7 @@ keep_enemy: cal explosion_stuff ;display explosion jr next_enemy -;--------------------------- moving enemies --------------------------------- +;--------------------------- moving enemies ---------------------------------- moving_enemy: dec d ;move left once @@ -2085,7 +2363,7 @@ moving_enemy: ld b,a ld a,(timer) dec b - jr z,movetype_updown ;1 = (1<) up / down + jp z,movetype_updown ;1 = (1<) up / down dec b jr z,movetype_vslow ;2 = (.25<) dec b @@ -2093,25 +2371,39 @@ moving_enemy: dec b jr z,movetype_lslow ;4 = (.75<) dec b - jr z,movetype_fast ;5 = (1.5<) + jr z,movetype_mfast ;5 = (1.25<) + dec b + jr z,movetype_fast ;6 = (1.5<) + dec b + jr z,movetype_vfast ;7 = (2 <) dec b - jr z,movetype_vfast ;6 = (2 <) + jr z,movetype_xfast ;8 = (3 <) dec b - jr z,movetype_slowlure ;7 = (1<) move y towards you 50% + jr z,movetype_slowlure ;9 = (1<) move y towards you 50% inc d ;speed 0 dec b - jr z,movetype_lure ;8 = (0) move y towards you + jr z,movetype_lure ;10 = (0) move y towards you dec b - jr z,movetype_slowlure ;9 = (0) lure 1/2 speed + jr z,movetype_slowlure ;11 = (0) lure 1/2 speed dec b - jr z,movetype_fulllure ;10 = x+y towards you 1/2 speed + jr z,movetype_fulllure ;12 = x+y towards you 1/2 speed dec b - jr z,movetype_right ;11 = (.5>) + jr z,movetype_right ;13 = (.5>) dec b - jr z,movetype_fright ;12 = (1>) + jr z,movetype_fright ;14 = (1>) dec b - ret z ;13 = (0) + jr z,movetype_right ;15 = (0) + dec b + ret z ;16 = + +movetype_lboss: + ld a,104 + cp d + jr c,dothemovethingy + inc d ;x<110: move right +dothemovethingy: + jr movetype_updown ;move up and down and up and down and... movetype_right: rra @@ -2178,12 +2470,19 @@ movetype_vslow: inc d ;don't move 75% ret +movetype_mfast: + rra + ret c ;50% chance (makes it 25% total) movetype_fast: rra ret c ;once every other turn movetype_vfast: dec d ;move left twice ret +movetype_xfast: + dec d ;woowoo, now that's fast! + dec d ;move left trice! + ret movetype_updown: inc hl ;@movecount @@ -2206,7 +2505,7 @@ movedown: inc e ;otherwise save new position ret ;and return -;--------------------------- check collision -------------------------------- +;--------------------------- check collision --------------------------------- Enemies_hit: ld hl,(x) ;e = X, d = Y @@ -2300,11 +2599,22 @@ check_next: dnz check_collision ;loop for all enemies ret -;--------------------------- story ------------------------------------------ +;--------------------------- story ------------------------------------------- + +dostory: +#ifdef story + cal storyPage ;do some story + ld a,(hl) ;load next byte in a + inc a ;set z-flag if a = $ff + jr nz,dostory ;otherwise loop + inc hl + inc hl ;set hl to beginning of the level + ld (levelp),hl ;set the level-pointer + ret ;and return storyPage: psh hl ;hl will be destroyed by _clrLCD - cal _clrLCD ;clear screen + rcl _clrLCD ;clear screen pop hl ld a,(hl) ld (curline),a ;begin line for special effect @@ -2314,7 +2624,7 @@ storyLine: ld e,(hl) ;horizontal text-position ld (_penCol),de ;set position inc hl - cal _vputs ;display text + rcl _vputs ;display text ld a,(hl) ;load next byte inc hl @@ -2327,7 +2637,7 @@ storyLine: ld de,dispbuffer ;to GRAPH_MEM ld bc,1024 ;entire screen ldir - cal _clrLCD ;clear VIDEO_MEM + rcl _clrLCD ;clear VIDEO_MEM pop hl pop bc ;last byte (<>0) is lines to SFX psh hl @@ -2336,42 +2646,7 @@ storyLine: pop hl ret -dostory: - cal storyPage ;do some story - ld a,(hl) ;load next byte in a - inc a ;set z-flag if a = $ff - jr nz,dostory ;otherwise loop - inc hl - inc hl ;set hl to beginning of the level - ld (levelp),hl ;set the level-pointer - ret ;and return - - -DoSFX: ;in:(curline)=beginLine;b=nrOfLines - jr sfxlaser - ld hl,dispbuffer - ld b,64 -sfxscrollloop: - psh bc - psh hl - ld de,VIDEO_MEM - ld hl,VIDEO_MEM+16 - ld bc,63*16 - ldir - pop hl - ld bc,16 - ldir - ld b,16 -sfxscrolldelay: - halt ;delay - dnz sfxscrolldelay ;8x - pop bc - dnz sfxscrollloop - ret - - -sfxlaser: - psh bc +DoSFX: psh bc ;in:(curline)=beginLine;b=nrOfLines ld a,0 ;get line number curline =$-1 @@ -2402,16 +2677,24 @@ sfxlaserdisp: ;display this frame on screen dec a ;counter jr nz,sfxlaserdisp ;repeat until whole screen is displayed - ld b,8 + ld b,11 ;11x 1/200sec = ~20 frames/s sfxlaserdelay: halt ;delay dnz sfxlaserdelay ;8x pop bc ;counter - dnz sfxlaser + dnz DoSFX ret +#else + rcl _clrWindow + ld hl,welldone + rcl _puts + jp getsomekeys ;wait for a key +welldone: + .db "-CONGRATULATIONS!-",0 +#endif -;--------------------------- proc ------------------------------------------- +;--------------------------- proc -------------------------------------------- random14: ;random 1..1+4 ld c,1 @@ -2437,20 +2720,38 @@ ranseed =$-1 ;SMC :P rancount: .db 0 RandomY: ;HL = random Y 0..50 right side ((1..51)*16-1) +#ifdef TI86 psh bc ld bc,50*256+1 ;range=1..51 cal Random ;a = 1..51 - ld h,0 + add a,a + add a,a + ld h,0 ld l,a ;hl = 1..51 add hl,hl - add hl,hl - add hl,hl add hl,hl ;hl = 1..51 * 16 (left side at random y) dec hl ;hl = 0..50 * 16 (" at right side of screen) ld de,dispbuffer add hl,de ;position on screen pop bc ret +#else + psh bc + ld bc,50*256+1 ;range=1..51 + cal Random ;a = 1..51 + ld d,a ;*1 + add a,a ;*2 + add a,d ;*3 + ld h,0 + ld l,a ;hl = 1..51 * 3 + add hl,hl + add hl,hl ;hl = 1..51 * 12 (left side at random y) + dec hl ;hl = 0..50 * 12 (" at right side of screen) + ld de,dispbuffer + add hl,de ;position on screen + pop bc + ret +#endif scoreInc: ;increase score by HL psh bc ;don't destroy bc (or any registers Xcept hl) @@ -2479,15 +2780,18 @@ BLACKLCD: ld hl,VIDEO_MEM ;screen location (top left) ld de,VIDEO_MEM+1 ld (hl),%11111111 - ld bc,1024-1 ;do it 1024 times = entire screen + ld bc,scrwidth*64-1 ;do it 1024 times = entire screen ldir +#ifdef TI83 + cal fastCopy +#endif set 3,(iy+5) ;set white on black ret getsomekeys: halt ;wait a li'l while and save batteries :P halt - cal GET_KEY ;input keys + rcl GET_KEY ;input keys or a jr z,getsomekeys ;wait if none cp K_SECOND ;2nd pressed? @@ -2515,8 +2819,9 @@ findenemyspecs: ;enemy #a specs in (hl); in:b=0; out:ac=? add hl,bc ;hl = enm#0 + type*10 ret ;hl = enemy specs -;--------------------------- game over / new game / death ------------------- +;--------------------------- game over / new game / death -------------------- +#ifdef shiscore chartable: ;use chartable-1 and add GET_KEY scancode .db ".<>!",0,0,0,0 ;down,L,R,up .db 0,"xtoje0",0 ;enter..clear @@ -2552,29 +2857,34 @@ storesmtn: ;stores data [stack=src; stack+1=dest; stack+2=size] pop hl ;data offset add hl,de ;hl=pointer to data in real prog adc a,b ;if hl overflow also increase a - cal _SET_ABS_DEST_ADDR ;destination = real program = ahl + rcl _SET_ABS_DEST_ADDR ;destination = real program = ahl xor a ;RAM page #0 pop hl ;data position in normal program ($D748+) - cal _SET_ABS_SRC_ADDR ;set as source (ahl) + rcl _SET_ABS_SRC_ADDR ;set as source (ahl) pop hl ;size - cal _SET_MM_NUM_BYTES ;set - cal _mm_ldir ;copy data to real program + rcl _SET_MM_NUM_BYTES ;set + rcl _mm_ldir ;copy data to real program jp _RAM_PAGE_1 ;and finally: reset ram page +#endif game_over: ;stack=+0 cal BLACKLCD ;clear screen - ld hl,$0603 +#ifdef TI86 + ld hl,$0603 ;centered on 86 +#else + ld hl,$0403 ;centered on 83 (smaller screen) +#endif ld (_curRow),hl ;center ld hl,txt_gameover - cal _puts ;display "GAME OVER" + rcl _puts ;display "GAME OVER" cal releasekeys ;wait for all keys to be released ld hl,$0007 ld (_curRow),hl - +#ifdef shiscore ld de,(your_score) ;current score ld hl,(hiscore) ;hiscore - cal CP_HL_DE ;de<=hl means no hiscore (or same) + rcl CP_HL_DE ;de<=hl means no hiscore (or same) jr nc,no_hiscore ;skip the new hiscore part ld (hiscore),de ;otherwise save current score as new hiscore @@ -2584,7 +2894,7 @@ ask_hiname: ;and ask for new hiscore name ld (hiscorepos),a ;current char (counts backwards 9-1) enter_name_loop: ld a,'_' ;cursor appearance - cal _putmap ;display (do not advance cursorpos) + rcl _putmap ;display (do not advance cursorpos) nokeypressed: cal getsomekeys ;wait for any key jr z,nomore ;if [enter] or [2nd] pressed we're all done @@ -2609,7 +2919,7 @@ nokeypressed: jr z,nokeypressed ;don't add anything afterall ld (ix),a ;save new char - cal _putc ;and also display on screen + rcl _putc ;and also display on screen inc ix ;goto next char cal releasekeys ;wait for the key to be released jr enter_name_loop ;and continue the loop @@ -2622,46 +2932,55 @@ backup: ;backspace dec ix ;and string to previous char as well ld a,32 ;remove cursor - cal _putmap ;by replacing it by ' ' + rcl _putmap ;by replacing it by ' ' ld hl,_curCol dec (hl) ;cursor one back jr enter_name_loop ;continue name loop nomore: ;name's done ld a,' ' ;remove cursor - cal _putc ;(or actually replace with ' ') + rcl _putc ;(or actually replace with ' ') ld (ix),0 ;end of string marker (zero-terminated) cal save_hi ;store hiscore with name in real program jr hiscoredone ;continue with game over screen - +#endif no_hiscore: ;no new hiscore ld hl,hiname ;just display old name - cal _puts + rcl _puts + hiscoredone: xor a ;clear a (Ahl will be displayed) ld hl,$1006 ;bottom-1 right ld (_curRow),hl ;set ld hl,(your_score) ;your score - cal _dispahl ;display it (a=0) + rcl _dispahl ;display it (a=0) +#ifdef TI86 ld hl,$314b ;bottom-1 right before score ^^ +#else + ld hl,$312b +#endif ld (_penCol),hl ;set ld hl,txt_score ;"Score" - cal _vputs ;display (small) + rcl _vputs ;display (small) ld hl,$1007 ;bottom right ld (_curRow),hl ;set ld hl,(hiscore) ;hi-score - cal _dispahl ;display + rcl _dispahl ;display +#ifdef TI86 ld hl,$3946 ;bottom right before hiscore ^^ +#else + ld hl,$3926 +#endif ld (_penCol),hl ;set ld hl,txt_hiscore ;"Hiscore" - cal _vputs ;display (small) + rcl _vputs ;display (small) res 3,(iy+5) - ld b,16 - ld de,16 - ld hl,VIDEO_MEM+(49*16)-1 + ld b,scrwidth + ld de,scrwidth + ld hl,VIDEO_MEM+(49*scrwidth)-1 restore_line: set 1,(hl) add hl,de @@ -2673,12 +2992,12 @@ restore_line: invship: ;procedure used in New_game psh af inc b - ld de,$C0 - ld hl,VIDEO_MEM+$30-$C0;begin pos + ld de,12*scrwidth + ld hl,scrwidth*(3-12)+VIDEO_MEM;begin pos invshipinit: add hl,de dnz invshipinit - ld b,$B0 ;12 lines down + ld b,12*scrwidth ;12 lines down invshiploop: ld a,(hl) cpl ;invert byte @@ -2689,9 +3008,11 @@ invshiploop: ret New_game: ;start a new game (SP=+0) - cal _clrLCD + rcl _clrLCD +#ifdef TI86 ld a,VIDEO_MEM/$400 ld (PutWhere),a ;will be reset after displaying iconbar +#endif ld ix,spr_ship01 ;first ship: sprite ld de,$0105 ;position ld b,4 ;number of ships to display @@ -2699,7 +3020,11 @@ dispshipsloop: psh bc ;counter psh de ;position ld h,e +#ifdef TI86 ld l,40 ;x=40 +#else + ld l,30 +#endif ld (_penCol),hl ;small cursor position psh ix ;ix destroyed by _vputmap ld hl,txt_difhardcore ;hardcore ships text @@ -2710,16 +3035,20 @@ dispshipsloop: jr z,dispdifficulty ;0 indicates hardcore difficulty ship ld hl,txt_difnormal ;normal difficulty ships text dispdifficulty: - cal _vputs ;display difficulty + rcl _vputs ;display difficulty +#ifdef TI86 ld a,95 +#else + ld a,70 +#endif ld (_penCol),a ;set x=95 pop af ;ship nr (backwards 3..0) - ld hl,txt_updouble ;updouble for ships 1 + ld hl,txt_shpbeam ;updouble for ships 1 and %1 ;gives 0,1,0,1 (for ships 0,1,0,1) jr nz,dispsbeam - ld hl,txt_tailbeam ;tailbeam for ships 0 + ld hl,txt_shplaser ;tailbeam for ships 0 dispsbeam: - cal _vputs ;display special beam type + rcl _vputs ;display special beam type pop ix pop de psh de ;peek de @@ -2738,6 +3067,9 @@ dispsbeam: selectship: psh bc cal invship +#ifdef TI83 + cal fastCopy +#endif cal getsomekeys pop bc jr z,startthenewgame ;enter/2nd @@ -2770,8 +3102,11 @@ searchyourship: dnz searchyourship ld (your_ship),hl and 1 ;gives: 1,0,1,0 for the ships - inc a ;ships now give 1,2,1,2 - ld (your_extramode),a ;sets tail beam or up double (1 or 2) + xor 1 ;well, make it 0,1,0,1 :) + jr z,whichship ;ships 0 have bullets + ld a,maxweapon ;ships 1 have lasers (0,8,0,8) +whichship: + ld (your_weapon),a ;set bullet#1 or laser#1 depending on ship pop af ;ship# 0..3 and %10 ;ships give 0,0,1,1 ld (hardcore),a ;hardcore mode set for ships 3 and 4 @@ -2779,7 +3114,6 @@ searchyourship: ld (your_score),a ;reset score ld (your_score+1),a ;reset score (0) ld (your_extra),a ;no extra beam - ld (your_weapon),a ;no laser ld (your_pickup),a ;reset pickups ld (your_multiples),a ;no multiples inc a ;ld a,1 @@ -2800,13 +3134,7 @@ You_die: ;stack must be +1 jp z,game_over ;and game's over jr samelevel -gamedone: - cal dostory ;display end (hl=(levelp)) - ld hl,250 - cal scoreInc ;game complete bonus: 250 - jp game_over ;game over (+hiscore) - -;--------------------------- next level ------------------------------------- +;--------------------------- next level -------------------------------------- Next_level: ;stack must be +1 pop hl @@ -2824,7 +3152,13 @@ Next_level: ;stack must be +1 ld a,(level) ;level number inc a ;next level # cp endlevel+1 ;last level done? - jr nc,gamedone ;yes: display end story and quit + jr c,gamenotdone ;no: continue game +gamedone: ;yes: + cal dostory ;display end (hl=(levelp)) + ld hl,500 + cal scoreInc ;game complete bonus: 500 + jp game_over ;game over (+hiscore) +gamenotdone: ld (level),a add a,a @@ -2841,16 +3175,19 @@ samelevel: ldi ;ld (_invert),(invertmode) ld de,your_shipspr ;sets your ship's sprite ldi ;ld (your_shipspr),(your_ship) + ldi ;and second byte (heh it's a word) ld a,80 ld (nextevent),a ;time to first enemy appearance ld hl,(levelp) ;level pointer +#ifdef story dec hl ;byte before level (boss byte) xor a ;if it's zero it means here's a story cp (hl) inc hl ;begin of level cal z,dostory ;do the story and set (levelp) to real level +#endif ld a,(hl) ;number of (different) enemies in this level inc hl @@ -2872,7 +3209,7 @@ samelevel: ld c,4 ;5xLDI: loads (level_info) (spacespace) ldir ; (stars1) (stars2) ld a,1 - ld b,32 ;fill (groundpos) and (ceilingpos) + ld b,16 ;fill (groundpos) fillground: ld (de),a inc de @@ -2897,53 +3234,65 @@ fillground: cal loadweapon ;load (your_weapon) + xor a ld hl,enemies ;remove all enemies and bullets - ld (hl),0 ;clear first byte + ld (hl),a ;clear first byte ld de,enemies+1 ;copy this to the next byte +#ifdef TI86 ;on '86 everything's located here ld bc,(nrenemies*enemysize)+(nrybuls*4)+(nrebuls*3)-1 - ldir ;clear enemies + bullets (y/e) +#else ;on '83 it's a little harder... + ld bc,(nrenemies*enemysize)-1 + ldir ;just clear the enemies + ld hl,ybullets ;now remove all the bullets (different loc.) + ld (hl),a ;clear 1st byte + ld de,ybullets+1 ;copy2next + ld bc,(nrybuls*4)+(nrebuls*3)-1 +#endif + ldir ;clear enemies + ybullets + ebullets -;--------------------------- setup game ------------------------------------- +;--------------------------- setup game -------------------------------------- game_setup: cal BLACKLCD ;white on black ld hl,txt_level ld de,$0703 ld (_curRow),de ;center - cal _puts ;display "LEVEL " + rcl _puts ;display "LEVEL " ld a,(level) ;current level ld l,a ld h,0 ;in hl - cal UNPACK_HL ;create first digit + rcl UNPACK_HL ;create first digit add a,'0' ;0-9 ld b,a ;into b - cal UNPACK_HL ;second digit + rcl UNPACK_HL ;second digit add a,'0' ;0-9 - cal _putc ;display second digit + rcl _putc ;display second digit ld a,b - cal _putmap ;display first digit + rcl _putmap ;display first digit ld hl,txt_lives ;bar text: "Lx0"... ld de,$0904 ld (_curRow),de ;display lives left below level nr - cal _puts + rcl _puts ld a,(your_lives) ;lives left add a,'0' ;make value 0='0' - cal _putc + rcl _putc cal releasekeys ;wait for user to release all keys ld hl,txt_savekey ;"Press [F1] to save" ld de,$3A46 ;bottom-right ld (_penCol),de - cal _vputs + rcl _vputs res 3,(iy+5) ;set white on black cal getsomekeys ;wait for keypress +#ifdef shiscore cp K_F1 cal z,save_lvl +#endif - cal _clrLCD ;clear screen + rcl _clrLCD ;clear screen cal disp_icons ;display bottom icons +ret jp game_main_loop @@ -2954,7 +3303,7 @@ placestars: ld d,0 ld e,a ;de = a = 2-14 or a - sbc hl,de ;substract from random y => random pos anywhere + sbc hl,de ;substract from rand y => random pos anywhere ld (ix),l ;save x-pos (l) ld (ix+1),h ;save y-pos (h) @@ -2982,12 +3331,25 @@ loadweapon: ld (laserdur),a ret -;---------------------------------------------------------------------------- -;--------------------------- putsprite -------------------------------------- -;---------------------------------------------------------------------------- +;--misc-- +#ifdef TI83 +_clrLCD: + rcl _clrlcdf + ld hl,dispbuffer ;move from (hl) = top left + ld (hl),0 ;first pixel will be copied all over the screen + ld de,dispbuffer+1 ;(de) = next pixel, thus clearing whole screen + ld bc,scrwidth*64-1 ;loop 896 times = (128/8) * (64-8 for scorebar) + ldir ;all clear! + ret +#endif + +;----------------------------------------------------------------------------- +;--------------------------- putsprite --------------------------------------- +;----------------------------------------------------------------------------- ;in: de=(x,y); ix=sprite ;out: ix=behind sprite; hl:a=right below sprite; b=0; d=width; ce=? +#ifdef TI86 putsprite: ld c,(ix) ;save width _putsprite: ;putsprite with custom width @@ -3067,8 +3429,97 @@ CSbitdrawn: pop bc ;rows counter dnz CSyloop CSdone: ret +#endif -;--------------------------- putbigsprite ----------------------------------- +#ifdef TI83 +putsprite: + ld c,(ix) ;save width +_putsprite: ;putsprite with custom width + ld a,d ;a=X + bit 7,d ;check sign bit of X + jr z,CSpositive ;X>=0 + + neg ;a=|X| + cp (ix) ;off screen? + ret nc ;X<=-width: don't draw at all + ld b,a ;b=|X|mod 8=1..7=bits to draw + psh bc + ld a,%11111111 ;all bits set (draw everything) +CSclipleft: + srl a ;remove first bit in a for each b + dnz CSclipleft ;b=1: a=%01111111 + ;b=2: a=%00111111 + ;b=3: a=%00011111 + ;b=4: a=%00001111 + ;b=5: a=%00000111 + ;b=6: a=%00000011 + ;b=7: a=%00000001 + pop bc + psh af + ld a,96 + sub b + ld d,a + pop af + dec e ;Y-- + jr CSdisplay ;done clipping + +CSpositive: + sub 97-8 ;minus (screen width - byte width) + ld b,a + ld a,%11111111 ;clipmask + jr c,CSdisplay ;x+width<128 then entire sprite is on screen + inc b ;b = number of pixels off screen +CSclipright: + add a,a ;remove last bit in a for each b + dnz CSclipright ;b=1: a=%11111110 + ;b=2: a=%11111100 + ;b=3: a=%11111000 + ;b=4: a=%11110000 + ;b=5: a=%11100000 + ;b=6: a=%11000000 + ;b=7: a=%10000000 + ;b>7: a=%00000000 = off screen + +CSdisplay: ;display the sprite ix at (d,e) masked + ld (CSclipmask),a ;set mask + cal findpixel ;convert de to screen location hl:a + ld (CSbitmask),a + + ld d,c ;width + ld b,(ix+1) ;height +CSyloop: + psh bc ;save rows to go + psh hl ;screen + ld b,d ;width + ld a,(ix+2) ;load image line + and 255 ;mask +CSclipmask =$-1 + ld c,a ;c=image + inc ix ;next +CSbitmask =$+1 + ld a,1 ;saved bitmask +CSxloop: + sla c ;test leftmost pixel + jr nc,CSnodraw ;don't draw if it's 0 + ld e,a ;psh af: save bitmask + or (hl) + ld (hl),a ;OR pixel with screen + ld a,e ;pop af +CSnodraw: + rrca ;next bit + jr nc,CSbitdrawn ;carry set if bit "jumped" + inc hl ;next byte +CSbitdrawn: + dnz CSxloop + pop hl ;screen at x-offset=0 + ld bc,12 + add hl,bc ;next line + pop bc ;rows counter + dnz CSyloop +CSdone: ret +#endif + +;--------------------------- putbigsprite -----------------------------------= putwidesprite: ;destr: abcdehl+ix (ix=behind sprite; hl:a=right below sprite; b=0; d=width) @@ -3097,9 +3548,10 @@ safeputsprite: ;cal putsprite with de intact pop de ret -;------------------------------- findpixel ---------------------------------- +;------------------------------- findpixel ----------------------------------- ;based upon CLEM's fp | 131 cycles | 28 bytes | in:(d,e); out:hla; destr:de +#ifdef TI86 findpixel: ld a,e ;a=e=Y add a,a @@ -3126,10 +3578,22 @@ PutWhere =$-1 ;screen base position/$400 (where x+y=0) FPbit =$+1 set 0,a ret +#endif + +#ifdef TI83 +findpixel: + psh bc + psh de + ld a,d + cal ionGetPixel + pop de + pop bc + ret +#endif -;---------------------------------------------------------------------------- -;------------------------------- sprites ------------------------------------ -;---------------------------------------------------------------------------- +;----------------------------------------------------------------------------- +;------------------------------- sprites ------------------------------------- +;----------------------------------------------------------------------------- spr_ship01: ;(normal; up double) .db 7,7 ;ship alpha class (vic viper) @@ -3170,6 +3634,24 @@ spr_ship02i: .db %11111010 ;█████ █ spr_ship03: ;(hardcore; up double) + .db 7,7 ;ship gamma class + .db %11111000 ;█████ + .db %01100000 ; ██ + .db %11111100 ;██████ + .db %11100110 ;███ ██ + .db %11111100 ;██████ + .db %01100000 ; ██ + .db %11111000 ;█████ +spr_ship03i: + .db 8,7 + .db %11111010 ;█████ █ + .db %01100001 ; ██ █ + .db %11111101 ;██████ █ + .db %11100111 ;███ ███ + .db %11111101 ;██████ █ + .db %01100001 ; ██ █ + .db %11111010 ;█████ █ + .db 7,7 ;ship delta class (lord british) .db %11000000 ; ██ .db %11110000 ; ████ @@ -3178,7 +3660,7 @@ spr_ship03: ;(hardcore; up double) .db %11111100 ; ██████ .db %11110000 ; ████ .db %11000000 ; ██ -spr_ship03i: +;spr_ship03i: .db 8,7 .db %11111100 ; ██████ .db %11110010 ; ████ █ @@ -3208,7 +3690,7 @@ spr_ship04i: .db %11110000 ;████ auch_bullet = 1 ;damage to you when hit by an enemy bullet -auch_ground = 5 ;the same when you hit the ground/ceiling +auch_ground = 5 ;the same but when you hit the ground auch_collide = 4 ;when you hit an enemy auch_ecollide = 2*4 ;damage to the enemy that hit you (skip bit 0/1) @@ -3231,7 +3713,7 @@ spr_lashit: .db %01111100 ; █████ .db %00111000 ; ███ -;-------------------------------- explosions -------------------------------- +;-------------------------------- explosions --------------------------------- ;spr_lashit: ;the same as spr_multiple2 ; .db 7,7 @@ -3405,7 +3887,7 @@ spr_yexplosion: .db %01000000 ; █ .db %00010100 ; █ █ -;--------------------------------- bullets ---------------------------------- +;--------------------------------- bullets ----------------------------------- bullettable: .db (spr_bullet01-spr_bullet01) ;0 @@ -3537,13 +4019,15 @@ doublebeam = %01010010 ;45 degrees extrabulletpos: .db 3 ;tail/double yposition -;------------------------------------ bar ----------------------------------- +;------------------------------------ bar ------------------------------------ + +#ifdef TI86 spr_lship: .db 5,3 ;li'l ship indicating lives left - .db %11100000 ;███ - .db %01111000 ; ████ - .db %11100000 ;███ + .db %11100000 ;███ ▒▒▒ + .db %01111000 ; ████ ▒▒▒▒ + .db %11100000 ;███ ▒▒▒ lshipsize = 5 ;space between two ship icons spr_icon: @@ -3579,58 +4063,40 @@ spr_icon00: .db %01010110 .db %10101010 .db %11111110 -; .db %00000000 -spr_icon00_: - .db 16,7 ;unused .......:.......: - .db %10101010 ;█ █ █ █ █ █ █ █ - .db %11010101 ;██ █ █ █ █ █ █ █ - .db %10101010 ;█ █ █ █ █ █ █ █ - .db %11010101 ;██ █ █ █ █ █ █ █ - .db %10101010 ;█ █ █ █ █ █ █ █ - .db %11010101 ;██ █ █ █ █ █ █ █ - .db %10101010 ;█ █ █ █ █ █ █ █ - .db 7 - .db %10101010 - .db %01010101 - .db %10101010 - .db %01010101 - .db %10101010 - .db %01010101 - .db %10101010 -spr_icon01: - .db 16,7 ;shield .......:.......: - .db %10001111 ;█ ███████ █ ▒ - .db %10011001 ;█ ██ █████ █ ▒ - .db %10111100 ;█ ████ ████ █ ▒ - .db %10111000 ;█ ███ █ ██ █ ▒ - .db %10111100 ;█ ████ ████ █ ▒ - .db %10011001 ;█ ██ █████ █ ▒ - .db %10001111 ;█ ███████ █ ▒ - .db 7 - .db %11100100 - .db %11110010 - .db %01111010 - .db %10011010 - .db %01111010 - .db %11110010 - .db %11100100 +;spr_icon01: +; .db 16,7 ;shield .......:.......: +; .db %10001111 ;█ ███████ █ ▒ +; .db %10011001 ;█ ██ █████ █ ▒ +; .db %10111100 ;█ ████ ████ █ ▒ +; .db %10111000 ;█ ███ █ ██ █ ▒ +; .db %10111100 ;█ ████ ████ █ ▒ +; .db %10011001 ;█ ██ █████ █ ▒ +; .db %10001111 ;█ ███████ █ ▒ +; .db 7 +; .db %11100100 +; .db %11110010 +; .db %01111010 +; .db %10011010 +; .db %01111010 +; .db %11110010 +; .db %11100100 maxarmor = 63 ;maximum HPs you can get -spr_icon02a: - .db 16,6 ;tailbeam.......:.......: - .db %10000000 ;█ ▒ - .db %10000011 ;█ ██ ▒ - .db %10000001 ;█ ███ ▒ - .db %10111011 ;█ ███ ███ ██ ██▒ - .db %10000001 ;█ ███ ▒ - .db %10000011 ;█ ██ ▒ +;spr_icon02a: +; .db 16,6 ;tailbeam.......:.......: ; .db %10000000 ;█ ▒ - .db 5 - .db %00000000 - .db %00000000 - .db %11000000 - .db %10110011 - .db %11000000 -spr_icon02b: +; .db %10000011 ;█ ██ ▒ +; .db %10000001 ;█ ███ ▒ +; .db %10111011 ;█ ███ ███ ██ ██▒ +; .db %10000001 ;█ ███ ▒ +; .db %10000011 ;█ ██ ▒ +; .db %10000000 ;█ ▒ +; .db 5 +; .db %00000000 +; .db %00000000 +; .db %11000000 +; .db %10110011 +; .db %11000000 +spr_icon02: .db 16,7 ;updouble.......:.......: .db %10000000 ;█ ██ ▒ .db %10000000 ;█ ██ ▒ @@ -3692,24 +4158,108 @@ spr_icon05: .db %10000000 .db %00000000 .db %11000011 + +#endif +#ifdef TI83 + +spr_lship: + .db 3,3 ;li'l ship indicating lives left + .db %11000000 ;██ ▒▒ + .db %01100000 ; ██ ▒▒ + .db %11000000 ;██ ▒▒ +lshipsize = 3 ;space between two ship icons + +spr_icon: + .db 10,7 ;selected.......:.......: + .db %11111111 ;███████████ + .db %11000000 ;██ █ + .db %11000000 ;██ █ + .db %11000000 ;██ █ + .db %11000000 ;██ █ + .db %11000000 ;██ █ + .db %11111111 ;███████████ + .db 7 + .db %11100000 + .db %00100000 + .db %00100000 + .db %00100000 + .db %00100000 + .db %00100000 + .db %11100000 +spr_icon00: + .db 9,7 ;unused .......:.......: + .db %10000000 ;█ + .db %10111111 ;█ ███████ + .db %10101010 ;█ █ █ █ █ + .db %10110101 ;█ ██ █ ██ + .db %10101010 ;█ █ █ █ █ + .db %10111111 ;█ ███████ + .db %10000000 ;█ + .db 6 + .db %00000000 + .db %10000000 + .db %10000000 + .db %10000000 + .db %10000000 + .db %10000000 +maxarmor = 63 ;maximum HPs you can get +spr_icon03: + .db 5,7 ;laser .......:.......: + .db %10000000 ;█ ▒ + .db %10100000 ;█ █ ▒▒▒ ▒ + .db %10100000 ;█ █ ▒▒▒ ▒ + .db %10100000 ;█ █ ▒▒▒ ▒ + .db %10100000 ;█ █ ▒▒▒ ▒ + .db %10111000 ;█ ███ ▒▒▒ ▒ + .db %10000000 ;█ ▒ +spr_icon04: + .db 5,7 ;bullets .......:.......: + .db %10000000 ;█ ▒ + .db %10110000 ;█ ██ ▒▒▒ ▒ + .db %10101000 ;█ █ █ ▒▒▒ ▒ + .db %10110000 ;█ ██ ▒▒▒ ▒ + .db %10101000 ;█ █ █ ▒▒▒ ▒ + .db %10110000 ;█ ██ ▒▒▒ ▒ + .db %10000000 ;█ ▒ +spr_icon05: + .db 7,7 ;multiple.......:.......: + .db %10000000 ;█ ▒ + .db %10100010 ;█ █ █ ▒ + .db %10110110 ;█ ██ ██ ▒ + .db %10101010 ;█ █ █ █ ▒ + .db %10100010 ;█ █ █ ▒ + .db %10100010 ;█ █ █ ▒ + .db %10000000 ;█ ▒ + +#endif + spr_dividerline: .db 8,7 .db 128,128,128,128,128,128,128 ;128 = %10000000 -;---------------------------- texts ----------------------------------------- +;---------------------------- texts ------------------------------------------ +#ifdef TI83 +txt_email: .db 127," www.shiar.org ",127,0 ;title screen +_txt_email = $3A20 +txt_about: .db "v1.0.C21 ",127," by Shiar",0 ;right behind txt_email +_txt_about = $3311 +#endif +#ifdef TI86 txt_email: .db "www.shiar.org ",127 ;title screen .db " shiar0@hotmail.com",0 _txt_email = $3A01 ;$3A1E=just email -txt_about: .db "v1.0.A23 ",127," by Shiar",0 ;right behind txt_email +txt_about: .db "v1.0.C21 ",127," by Shiar",0 ;right behind txt_email _txt_about = $3321 +#endif + txt_menu1: .db "NEW GAME",0 txt_menu2: .db "CONTINUE",0 txt_difhardcore:.db "Hardcore!",0 txt_difnormal: .db "Normal",0 -txt_updouble: .db "Up Double",0 -txt_tailbeam: .db "Tail Beam",0 +txt_shpbeam: .db "Beam",0 +txt_shplaser: .db "Laser",0 txt_level: .db "LEVEL ",0 ;new level screen txt_lives: .db "Lx0",0 @@ -3729,199 +4279,317 @@ txt_teacher: .db "(2",Lpi,"*.98)/sin 13",0 ;teacher txt_teacherans: .db Lneg,"14.6549373495",0 #endif -;---------------------------- save data ------------------------------------- - -storehi_start: -hiscore .dw 0 ;default hiscore -hiname .db "by shiar",0 ; " " name -storehi_end: - -invertmode: cpl ;/or a ;saves B<>W mode setting cpl - -storesave_start: ;--SAVED GAME-- defs: -your_ship .dw spr_ship01 ;your sprite (^invertmode^) sprs1 -level .db 1 ;level number 1 -levelp .dw level00 ;pointer to level data lev00 -pickuptimer .db 4 ;counts when to place a pickup 4 -your_extramode .db 1 ;you have tail or double 1 -your_score .dw 0 ;current score 0 -your_pickup .db 0 ;pickups already picked up 0 -your_occ .db 0 ;0=normal 1..16=exploding 0 -your_shield .db 0 ;invincibility left 0 -your_armor .db 24 ;HP left 24 -your_lives .db 3 ;lives left 3 -your_weapon .db 9 ;current weapon upgrade 0 -your_multiples .db 0 ;multiples present 0 -your_extra .db 0 ;extra beam present 0 -hardcore .db 0 ;hardcore mode if non-0 0 -storesave_end: - -time2invert: .db 0 ;time until b<>w switch (0 at startup) - -;------------------------------ levels data --------------------------------- +;------------------------------ levels data ---------------------------------- ;format:boss: [moveType] [enemyType] ; @level: [nr.dif.enemies]x [enemy nr] ; [min. enemy frequency] [enemy frequency max.inc] -; [next lvl (=nrenemies+4)] [level_info: 000000 1:ceiling 1:ground] +; [next lvl (=nrenemies+4)] [level_info: 0000000 1:ground] ; [tunnel size] [groundtype] [stars1] [stars2] ;efrequency must be odd if halfluring! +#ifdef story .db 0 ;storyline ID levelstart: ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end] - .db 1,33,"Imperial ships have",0,0 - .db 7,9,"been sent to intercept you",0,0 ;,7-1+6,-1 - .db 41,33,"Note STORYLINE and LEVELS",0,0 - .db 48,38,"---- AINT DONE YET! ----",0,48-1+6,-1 - - .db 30 -level00:.db 5,3,5,3,2,2 + .db 28,35,"COSMIC YEAR 6718",0,28-28+6 + .db 10,8,"INTELLIGENCE REPORTS ", + .db "BACTERION",0,0 + .db 17,7,"FORCES ARE BUILDING A ", + .db "NEW VESSEL",0,0 + .db 33,32,"A POWERFUL VESSEL",0,0 + .db 40,15,"THAT COULD EASILY DESTROY", + .db " US",0,0 + .db 47,36,"ONCE COMPLETED",0,47-10+6 + + .db 22,1,"YOU HAVE TO GO INTO THE ", + .db "HEART OF THEIR",0,0 + .db 28,1,"SPACE AND DESTROY THE VESSEL", + .db " BEFORE",0,0 + .db 34,22,"IT BECOMES OPERATIONAL.",0,34-22+6 + .db 25,56,"GOOD",0,0 + .db 32,56,"LUCK",0,32-25+6 + .db -1 +#endif + .db 40 +#ifndef story +levelstart: +#endif +level00: ;intro + .db 5,3,5,3,2,2 .db 28,73,13 - .db %00,0,1,1 + .db %0,0,1,1 - .db 31 ;boss for level01 -level01:.db 2,3,5 ;enemies + .db 41 +level01:.db 2,3,5 .db 26,70,20 - .db %00,0,1,1 + .db %0,0,1,1 - .db 32 + .db 42 level02:.db 3,3,4,5 .db 20,60,60 - .db %00,0,1,1 + .db %0,0,1,1 - .db 33 + .db 43 level03:.db 4,4,5,6,7 .db 17,40,75 - .db %00,0,1,1 - + .db %0,0,1,1 +#ifdef story .db 0 - .db 1,1,"Long-Range scanners are ", - .db "showing",0,0 - .db 8,1,"lots of enemy vessels ", - .db "advancing fast.",0,8-1+6 - .db 24,1,"I'm changing course to a", - .db " nearby ",0,0 - .db 31,1,"asteroid belt and try to",0,0 - .db 38,1,"lose them inthere.",0,38-24+6,-1 - -;---- approaching asteroid belt - .db 34 -level04:.db 5,8,8,9,11,12 + .db 25,2,"LONG-RANGE SCANNERS ARE ", + .db "SHOWING",0,0 + .db 32,2,"LOTS OF ENEMY VESSELS ", + .db "APPROACHING",0,32-25+6 + .db 22,9,"I'M CHANGING COURSE TO A", + .db " NEARBY",0,0 + .db 28,4,"ASTEROID BELT AND TRY TO ", + .db "LOSE THEM",0,0 + .db 34,48,"INTHERE...",0,34-22+6 + .db -1 +#endif + .db 44 +level04: ;approaching asteroid belt + .db 5,8,8,9,11,12 .db 17,27,70 - .db %00,0,1,1 + .db %0,0,1,1 -;---- inside - .db 35 -level05:.db 7,10,11,9,11,12,12,14 + .db 45 +level05: ;inside belt + .db 7,10,11,9,11,12,12,14 .db 12,24,80 - .db %00,0,1,1 + .db %0,0,1,1 - .db 36 -level06:.db 10,10,11,12,12,14,13,13,14,15,15 + .db 46 +level06: ;(deep inside) + .db 10,10,11,12,12,14,13,13,14,15,15 .db 7,18,180 - .db %00,0,1,1 - -;out - .db 37 + .db %0,0,1,1 +#ifdef story + .db 0 + .db 28,6,"APPROACHING BACTERION ", + .db "TERRATORY",0,6 + .db 25,10,"READING LOTS OF ENEMY ", + .db "VESSELS",0,0 + .db 32,24,"ON AN INTERCEPT COURSE",0,32-25+6 + .db -1 +#endif + .db 47 level07:.db 4,16,17,18,6 .db 22,29,62 - .db %00,0,1,1 ;-1=%11111111=line + .db %0,0,1,1 ;-1=%11111111=line - .db 38 + .db 48 level08:.db 5,16,17,18,19,19 .db 20,38,57 - .db %00,0,1,1 + .db %0,0,1,1 - .db 39 -level09:.db 3,19,20,21 + .db 49 +level09: ;lot of triples + .db 3,19,20,21 .db 19,63,57 - .db %00,0,1,1 - - .db 40 -level10:.db 7,22,23,24,24,24,25,26 - .db 20,22,63 - .db %00,0,1,1 - -;endlevel - .db 41 -level11:.db 1,26 - .db 20,20,80 - .db %00,0,1,1 - - .db 0,1,1,"That`s all folks...",0,0 - .db 20,50,"for now...",0,20-0+6,-1 - -endlevel = 12 + .db %0,0,1,1 + + .db 50 +level10: ;likely no pickups here (hard) + .db 7,22,23,24,24,24,25,26 + .db 22,26,51 + .db %0,0,1,1 +#ifdef story + .db 0 + .db 24,18,"REACHED THEIR HOMEPLANET",0,0 + .db 33,18,"SCANNING FOR THE VESSEL...",0,33-24+6 + .db -1 +#endif + .db 50 +level11: ;planet level + .db 8,27,27,28,28,29,29,29,30 + .db 6,8,108 + .db %1,-7,-1,-1 + + .db 50 +level12: ;planet level 2 + .db 4,39,30,31,31 + .db 16,8,49 + .db %1,-10,1,1 +#ifdef story + .db 0 + .db 18,11,"ENEMY VESSEL STRAIGHT " + .db "AHEAD...",0,0 + .db 25,16,"IT SEEMS TO BE " + .db "OPERATIONAL!!",0,0 + .db 33,19,"WELL YOU'VE COME THIS " + .db "FAR;",0,0 + .db 39,8,"TRY TO DESTROY IT, OR DIE " + .db "TRYING....",0,39-18+6 + .db -1 +#endif + .db 51 +level13: ;endlevel + .db 1,26 + .db 5,20,18 + .db %0,0,1,1 +#ifdef story + .db 0 + .db 1,1,"Thats all folks...",0,0 + .db 20,50,"for now...",0,20-1+6 + .db -1 +#endif +endlevel = 13+1 pickupfreq = 19 -;------------------------------ enemies ------------------------------------- +;------------------------------ enemies -------------------------------------- ;format: [HP64] [000000:HP 00:occ] [sprite] [xpos] [appearance(ypos)] ; [movetype] [time2fire] [firefreq] [firetype] -;occ: 00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy -;appearances: 1=random; 2=lure; 3=halflure -;movetypes: 1=updown; 2=1/4x; 3=1/2x; 4=3/4x; 5=3/2x; 6=2x; 7=ylure50%; -; 8=ylure; 9=ylure50%; 10=x+y-lure 50%; 11=-1/2x; 12=-1x -;firetypes: 1=normal; 6=aiming; 7=triple; 8=double; 9=quad; 10=dquad; 11=ran +;occ: %00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy +;appearances: 0+=ypos; -1=random; -2=lure; -3=halflure +;movetypes: 0=1x; 1=updown; 2=0.25x; 3=0.5x; 4=0.75x; 5=1.25x; 6=1.5x; +; 7=2x; 8=3x; 9=ylure50%; 10=ylure; 11=ylure50%; 12=x+y-lure 50%; +; 13=-1/2x; 14=-1x; 16=boss; 17=right+1 +;firetypes: 1=normal; 2=down; 3=up; 4=1/2down; 5=1/2up; 6=aiming(2-5); +; 7=triple; 8=double; 9=wide5; 10=wide7; 11=ran; 12=10+enemies +; 13=base; 14=ranY; 15=wide3; 16=5x enemyspecs: ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes +#ifdef TI86 ;0-1=pickups - .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,-2,03, 0, 0,1 ;pickup - .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,-2,03, 0, 0,1 ;bigpickup -;2-7=basic enemies , , , , , , , , - .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,-1,00,12, 0,1 ;intro - .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,-1,00,10, 0,1 ;weak - .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,-1,03, 6,50,1 ;slow - .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,-1,00, 1, 0,1 - .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,-3,00,19,39,8 ;heavy - .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,-3,05, 1, 0,1 ;fast -;8-10=backwards enemies, , , , , , , , - .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,-3,11,19,92,1 - .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,-1,12,11,45,1 - .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,-1,11,10,41,8 ;small -;11-15=asteroid , , , , , , , , - .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,-1,04, 0, 0,1 - .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,-1,00, 0, 0,1 - .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,-1,05, 0, 0,1 - .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,-1,03, 0, 0,1 ;slow+hard - .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,-1,06, 0, 0,1 -;16-21=improved enemies, , , , , , , , - .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,-3,00, 3,40,1 - .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,-3,00, 1,36,1 - .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,-1,01, 9,52,1 ;updown - .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,-3,04, 7,99,7 ;3x - .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,-2,01,17, 0,7 ;updown3x - .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,-2,07,62,60,8 ;lure -;22-26=hi-speed , , , , , , , , - .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,-2,05, 3,32,8 ;fast - .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,-3,07, 2,28,1 ;lure - .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,-3,06, 0, 0,1 ;vfast+nofire - .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,-1,07, 1,20,8 ;lure - .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,-2,01, 3,7,11 ;updown+ran -;27-28=unused, , , , , , , , , - .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,-2,03, 0, 0,1 ;27 -;29=final boss' enemy - .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving - .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,09, 0, 0,1 ;mid+lure -boss1enemy = 28 -boss2enemy = 29 -;30-34=first bosses , , , , , , , , - .db 2,%01000111,spr_boss01 &255,spr_boss01 /256,127,-1,09,35,50,7 ;triple - .db 2,%01010011,spr_boss02 &255,spr_boss02 /256,127,-1,09,20,12,1 ;small - .db 2,%01111011,spr_boss03 &255,spr_boss03 /256,127,-1,09,15,11,8 ;normal - .db 2,%10011111,spr_boss04 &255,spr_boss04 /256,127,-3,10,10,11,1 ;moving - .db 1,%11111011,spr_boss05 &255,spr_boss05 /256,127,-2,10, 1, 4,1 ;weak+rapidfire -;35-36=asteroid bosses , , , , , , , , - .db 4,%00010111,spr_bossA1 &255,spr_bossA1 /256,127,-1,10,36,14,6 - .db 4,%01101111,spr_bossA1 &255,spr_bossA1 /256,127,-2,10,28,12,6 -;37-41=big bosses , , , , , , , , - .db 4,%00010111,spr_boss07 &255,spr_boss07 /256,127,-3,08,31, 8,7 - .db 5,%00101011,spr_boss06 &255,spr_boss06 /256,127,-3,08,13, 7,7 - .db 6,%10001111,spr_boss08 &255,spr_boss08 /256,127,-1,08,18, 8,9 ;quad - .db 7,%00101011,spr_boss09 &255,spr_boss09 /256,127,-1,08,21, 9,10 ;6x - .db 9,%11011011,spr_boss09 &255,spr_boss09 /256,127,-1,08,12,11,12 ;enemies - .db 9,%11011011,spr_boss0E &255,spr_boss0E /256,119,00,13,12,13,13 + .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,-2,03, 0, 0,1 ;pickup + .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,-2,03, 0, 0,1 ;bigpickup +;2-7=basic enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,-1,00,12, 0,1 ;intro + .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,-1,00,10, 0,1 ;weak + .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,-1,03, 6,50,1 ;slow + .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,-1,00, 1, 0,1 + .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,-3,00,19,39,8 ;heavy + .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,-3,05, 1, 0,1 ;fast +;8-10=backwards enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,-3,13,19,92,1 + .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,-1,14,11,45,1 + .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,-1,13,10,41,8 ;small +;11-15=asteroid ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,-1,04, 0, 0,1 + .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,-1,00, 0, 0,1 + .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,-1,06, 0, 0,1 + .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,-1,03, 0, 0,1 ;slow+hard + .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,-1,07, 0, 0,1 +;16-21=improved enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,-3,00, 3,40,1 + .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,-3,00, 1,36,1 + .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,-1,01, 9,52,1 ;updown + .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,-3,04, 7,99,15 ;3x + .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,-2,01,17, 0,15 ;updown3x + .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,-2,09,62,60,8 ;lure +;22-26=hi-speed ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,-2,06, 3,32,8 ;fast + .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,-3,09, 2,28,1 ;lure + .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,-3,07, 0, 0,1 ;vfast+nofire + .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,-1,09, 1,20,8 ;lure+ + .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,-2,01, 3,7,11 ;updown+ran +;27-29=hyper ,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%00001011,spr_enemyN1&255,spr_enemyN1/256,128,-1,07, 0, 0,1 + .db 1,%00010111,spr_enemyN2&255,spr_enemyN2/256,128,-2,07, 0, 0,1 + .db 1,%00001111,spr_enemyN3&255,spr_enemyN3/256,128,-1,08, 0, 0,1 ;xfast +;30-31=turrets,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%10001111,spr_enemyT1&255,spr_enemyT1/256,128,-4,00, 1,15,3 ;turret L + .db 1,%11011011,spr_enemyT1&255,spr_enemyT1/256,128,-4,00, 1,16,5 ;turret l + + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128, 0, 0, 0, 0,0 +;37-38=final boss' enemy,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving + .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,11, 0, 0,1 ;mid+lure +;39=misc ,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db -1,%11111111,spr_enemyM2&255,spr_enemyM2/256,128,-2,08, 0, 0,1 ;bullet +boss1enemy = 37 +boss2enemy = 38 +;40-44=first bosses ,spr_ &255,spr_ /256, X, Y, d,WT,WF,W + .db 2,%01000111,spr_boss01&255,spr_boss01 /256,127,-1,11,35,48,15 ;triple + .db 2,%01010011,spr_boss02&255,spr_boss02 /256,127,-1,11,20,12,1 ;single + .db 2,%11011011,spr_boss03&255,spr_boss03 /256,127,-1,10,15, 8,8 ;double + .db 3,%00111111,spr_boss04&255,spr_boss04 /256,127,-3,12,10,11,1 ;Flure + .db 4,%01011011,spr_boss05&255,spr_boss05 /256,000,-2,17, 1,3,11 ;ranfire +;45-46=asteroid bosses ,spr_ &255,spr_ /256, X, Y, , , , + .db 5,%01101111,spr_bossA1&255,spr_bossA1 /256,127,-2,12,28,14,7 ;Flure + .db 20,%00011111,spr_bossA2&255,spr_bossA2 /256,119,00,16,31, 3,14 ;fullscreen +;47-51=big bosses ,spr_ &255,spr_ /256, X, Y, , , , + .db 4,%00010111,spr_boss07&255,spr_boss07 /256,127,-3,10,31, 8,16 ;5x + .db 6,%10001111,spr_boss08&255,spr_boss08 /256,127,-1,10,18, 8,9 ;quad + .db 3,%10111011,spr_boss06&255,spr_boss06 /256,127,-2,12, 1, 4,1 ;weak+rapidfire + .db 7,%11101011,spr_boss09&255,spr_boss09 /256,127,-1,10,21, 9,10 ;6x + .db 9,%11011011,spr_boss10&255,spr_boss10 /256,127,-1,10,12,11,12 ;enemies +#else +;0-1=pickups + .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,96,-2,03, 0, 0,1 ;pickup + .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,96,-2,03, 0, 0,1 ;bigpickup +;2-7=basic enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,96,-1,00,12, 0,1 ;intro + .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,96,-1,00,10, 0,1 ;weak + .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,96,-1,03, 6,50,1 ;slow + .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,96,-1,00, 1, 0,1 + .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,96,-3,00,19,39,8 ;heavy + .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,96,-3,05, 1, 0,1 ;fast +;8-10=backwards enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,00,-3,13,19,92,1 + .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,00,-1,14,11,45,1 + .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,00,-1,13,10,41,8 ;small +;11-15=asteroid ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,96,-1,04, 0, 0,1 + .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,96,-1,00, 0, 0,1 + .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,96,-1,06, 0, 0,1 + .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,96,-1,03, 0, 0,1 ;slow+hard + .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,96,-1,07, 0, 0,1 +;16-21=improved enemies ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,96,-3,00, 3,40,1 + .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,96,-3,00, 1,36,1 + .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,96,-1,01, 9,52,1 ;updown + .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,96,-3,04, 7,99,15 ;3x + .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,96,-2,01,17, 0,15 ;updown3x + .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,96,-2,09,62,60,8 ;lure +;22-26=hi-speed ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,96,-2,06, 3,32,8 ;fast + .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,96,-3,09, 2,28,1 ;lure + .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,96,-3,07, 0, 0,1 ;vfast+nofire + .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,96,-1,09, 1,20,8 ;lure+ + .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,96,-2,01, 3,7,11 ;updown+ran +;27-29=hyper ,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%00001011,spr_enemyN1&255,spr_enemyN1/256,96,-1,07, 0, 0,1 + .db 1,%00010111,spr_enemyN2&255,spr_enemyN2/256,96,-2,07, 0, 0,1 + .db 1,%00001111,spr_enemyN3&255,spr_enemyN3/256,96,-1,08, 0, 0,1 ;xfast +;30-31=turrets,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 1,%10001111,spr_enemyT1&255,spr_enemyT1/256,96,-4,00, 1,15,3 ;turret L + .db 1,%11011011,spr_enemyT1&255,spr_enemyT1/256,96,-4,00, 1,16,5 ;turret l + + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0 + .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,96, 0, 0, 0, 0,0 +;37-38=final boss' enemy,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,96,-3,01, 0, 0,1 ;moving + .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,96,23,11, 0, 0,1 ;mid+lure +;39=misc ,% ,spr_enemy &255,spr_enemy /256, X, Y, d,WT,WF,W + .db -1,%11111111,spr_enemyM2&255,spr_enemyM2/256,96,-2,08, 0, 0,1 ;bullet +boss1enemy = 37 +boss2enemy = 38 +;40-44=first bosses ,spr_ &255,spr_ /256, X, Y, d,WT,WF,W + .db 2,%01000111,spr_boss01&255,spr_boss01 /256,95,-1,11,35,48,15 ;triple + .db 2,%01010011,spr_boss02&255,spr_boss02 /256,95,-1,11,20,12,1 ;single + .db 2,%11011011,spr_boss03&255,spr_boss03 /256,95,-1,10,15, 8,8 ;double + .db 3,%00111111,spr_boss04&255,spr_boss04 /256,95,-3,12,10,11,1 ;Flure + .db 4,%01011011,spr_boss05&255,spr_boss05 /256,00,-2,17, 1,3,11 ;ranfire +;45-46=asteroid bosses ,spr_ &255,spr_ /256, X, Y, , , , + .db 5,%01101111,spr_bossA1&255,spr_bossA1 /256,95,-2,12,28,14,7 ;Flure + .db 20,%00011111,spr_bossA2&255,spr_bossA2 /256,87,00,16,31, 3,14 ;fullscreen +;47-51=big bosses ,spr_ &255,spr_ /256, X, Y, , , , + .db 4,%00010111,spr_boss07&255,spr_boss07 /256,95,-3,10,31, 8,16 ;5x + .db 6,%10001111,spr_boss08&255,spr_boss08 /256,95,-1,10,18, 8,9 ;quad + .db 3,%10111011,spr_boss06&255,spr_boss06 /256,95,-2,12, 1, 4,1 ;weak+rapidfire + .db 7,%11101011,spr_boss09&255,spr_boss09 /256,95,-1,10,21, 9,10 ;6x + .db 9,%11011011,spr_boss10&255,spr_boss10 /256,95,-1,10,12,11,12 ;enemies +#endif spr_enemy00: spr_enemyP1: @@ -4152,7 +4820,7 @@ spr_enemyS3: .db %01111110 ; ██████ .db %00011110 ; ████ spr_enemyS4: - .db 8,6 ;cheap intercept + .db 8,6 ;fast interceptor .db %00011011 ; ██ ██ .db %01110110 ; ███ ██ .db %10111100 ; █ ████ @@ -4208,6 +4876,25 @@ spr_enemyN5: .db %01010010 ; █ █ █ .db %01111100 ; ████ +spr_enemyT1: + .db 8,7 ;turret left + .db %11000000 ;██ + .db %01100000 ; ██ + .db %00110000 ; ██ + .db %01011100 ; █ ███ + .db %10110110 ;█ ██ ██ + .db %01011010 ; █ ██ █ + .db %11111111 ;████████ +spr_enemyT2: + .db 8,7 ;turret right + .db %00000011 ; ██ + .db %00000110 ; ██ + .db %00001100 ; ██ + .db %00111010 ; ███ █ + .db %01101101 ; ██ ██ █ + .db %01011010 ; █ ██ █ + .db %11111111 ;████████ + spr_enemyM1: .db 8,7 ;mine .db %00111100 ; ████ @@ -4217,6 +4904,14 @@ spr_enemyM1: .db %11111111 ;████████ .db %01011010 ; █ ██ █ .db %00111100 ; ████ +spr_enemyM2: + .db 7,6 ;giant bullet + .db %00011000 ; ██▒ + .db %01111110 ; ██████▒ + .db %11111000 ;█████▒ + .db %11111100 ;██████▒ + .db %01111110 ; ██████▒ + .db %00111000 ; ███▒ spr_boss01: .db 9,12 ;.......:.2.....: @@ -4364,7 +5059,30 @@ spr_bossA1: .db %11110000 .db %11110000 .db %11000000 -spr_boss06: ;modelled after a Nemesis][MSX boss +spr_boss06: + .db 16,10 ;.......:.......: + .db %10111110 ;█ █████ ███ + .db %00000011 ; ███ ████ + .db %01110101 ; ███ █ ████ ██ █ + .db %11111101 ;██████ █ ███ █ + .db %00000110 ; ██ █ █ ██ █ + .db %00000110 ; ██ █ █ ██ █ + .db %11111101 ;██████ █ ███ █ + .db %01110101 ; ███ █ ████ ██ █ + .db %00000011 ; ███ ████ + .db %10111110 ;█ █████ ███ + .db 10 + .db %00111000 + .db %10001111 + .db %11101101 + .db %01110010 + .db %10101101 + .db %10101101 + .db %01110010 + .db %11101101 + .db %10001111 + .db %00111000 +spr_boss07: ;modelled after a Nemesis][MSX boss .db 16,15 ;.......:.......: .db %00001111 ; █████ .db %00111110 ; █████ █████ @@ -4397,7 +5115,7 @@ spr_boss06: ;modelled after a Nemesis][MSX boss .db %01111111 .db %11111000 .db %10000000 -spr_boss07: ;modelled after a Nemesis][MSX boss +spr_boss08: ;modelled after a Nemesis][MSX boss .db 16,18 ;.......:.......: .db %00000000 ; █ █ .db %00000111 ; ███ ███ @@ -4437,7 +5155,7 @@ spr_boss07: ;modelled after a Nemesis][MSX boss .db %11010000 .db %01110000 .db %01010000 -spr_boss08: +spr_boss09: .db 14,14 ;.......:......7: .db %01100111 ; ██ ████ ██ .db %11001011 ;██ █ ██ █ ██ @@ -4468,7 +5186,7 @@ spr_boss08: .db %00110100 .db %01001100 .db %10011000 -spr_boss09: +spr_boss10: .db 16,19 ;.......:.......: .db %01111011 ; ████ ███ .db %10000110 ;█ ██ █████ @@ -4509,65 +5227,35 @@ spr_boss09: .db %10100000 .db %11111000 .db %10000000 -spr_boss0E: - .db 8,51 ;.......:.......: - .db %00111011 ; ████ ██ - .db %01100110 ;█ ██ - .db %01110011 ; ██ - .db %00111011 ; ███ ██ - .db %01000111 ; ███ - .db %10101100 ; ██ - .db %01110111 ; ██ ███ - .db %00111011 ; ████ ██ - .db %01100100 ;███ █ - .db %01000001 ; ████ - .db %01100100 ;███ █ - .db %01111011 ; ████ ██ - .db %01110111 ; ██ ███ - .db %01001100 ; ██ - .db %00100111 ; ███ - .db %00111011 ; ███ ██ - .db %01000011 ; ██ - .db %10010110 ;█ ██ - .db %01111011 ; ████ ██ - .db %00110101 ; █ - .db %00001011 ; ██ - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000011 ; ██ - .db %00001101 ; █ - .db %01111011 ; ████ ██ - .db %11000110 ;█ ██ - .db %01000011 ; ██ - .db %01111011 ; ███ ██ - .db %00100111 ; ███ - .db %01011100 ; ██ - .db %00110111 ; ██ ███ - .db %01111011 ; ████ ██ - .db %11100100 ;███ █ - .db %00000001 ; ████ - .db %11100100 ;███ █ - .db %01111011 ; ████ ██ - .db %00110111 ; ██ ███ - .db %00101100 ; ██ - .db %01000111 ; ███ - .db %00111011 ; ███ ██ - .db %01001011 ; ██ - .db %10000110 ;█ ██ - .db %01111011 ; ████ ██ - .db %00001101 ; ████ +;spr_bossA2: ;in asm code -;---------------------------------------------------------------------------- +;----------------------------------------------------------------------------- ;----------------------------- logo ------------------------------------------ -;---------------------------------------------------------------------------- +;----------------------------------------------------------------------------- logo_nemesis: +#ifdef TI83 +.db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011 +.db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011 +.db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011 +.db %00011111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%01111011 +.db %00000000,%00000000,%00000001,%00011110,%00010000,%00000000,%10000001,%00011110,%00010000,%000000001,%00000000,%00001000 +.db %00000000,%00000000,%00000011,%00011110,%00110000,%00000001,%10000011,%00011110,%00110000,%000000011,%00000000,%00011000 +.db %00000000,%00000000,%00000111,%00011110,%01110000,%00000011,%10000111,%00011110,%01110000,%000000111,%00000000,%00111001 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000 +.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000 +.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000 +.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011 +.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011 +#endif +#ifdef TI86 .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111110 .db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11111100 .db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11111000 @@ -4587,16 +5275,17 @@ logo_nemesis: .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00011011 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001 +#endif -;----------------------------- end ------------------------------------------ +;----------------------------- end ------------------------------------------- .end .end -;---------------------------------------------------------------------------- -;---------------------------------------------------------------------------- -;---------------------------------------------------------------------------- +;----------------------------------------------------------------------------- +;----------------------------------------------------------------------------- +;----------------------------------------------------------------------------- ; 0.99.99 -- 9.IX.00 -- size 6936 ; @@ -4667,7 +5356,7 @@ logo_nemesis: ; * the armor bar is now 5 pixels in height; very visible ; # if selecting upgrade or starting level, charge bar wasn't displayed ; -; 1.00.A23 -- 23.X.00 -- size 7212 +; 1.00.C21 -- 21.XII.00 -- size 6797 ; ; * armor-bar background, empty upgrades sprites changed ; + shows sprite when laser hits an enemy (his "shield"?) @@ -4676,10 +5365,22 @@ logo_nemesis: ; * armor-bar background changed (more elegant and smaller code) ; # "flash" when end-boss spawns mine fixed ; + enemy's y start position can be specified per enemy -; * first icon is now laser, second one's bullets ; + when bullets selected, upgrade icons won't appear half the time ; # remainder pixels in armor bar (appeared after heavy damage) removed ; + your ship's explosion is now also 8 frames (half enemy expl. speed) +; + does NOT display Done after running in TI-OS! (anti-teacher ;) +; * storyline completed (probably the crappiest story ever!) +; # only first byte of ship's sprite altered; now loads whole word +; - tail beam removed (up double only); odd ships now contain laser +; # fixed laserbeam display when firing at right edge +; # star relocation altered to work correctly w/ new screen location +; # halfluring wasn't 50% (more like 75%) since random enemy spawning +; * restored multiples for bullets (since it's unlikely you'll select 1) +; # fixed mem overlapping causing "weird stuff" when moving multiples +; # bullets fired below screen bottom are moved up onto screen +; + SOURCE ALSO TI-83 COMPATIBLE (still few bugs like hiscore, bullets) +; # upgrading beam weapon removed multiples +; # clipping at left side wrong in TI-83 version fixed ; ; ; + added - removed * changed # bug fixed -- 2.30.0