;------------------------------------------------------------------------------
;---------------------- NEMESIS -----------------------------------------------
;------------------------------------------------------------------------------
-; >>> NEMESIS <<< Version 0.96 BETA by SHIAR
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
; Title : Nemesis
; Version : 0.96
; Release Date : 30.X.99
-; Filename : nemesis.86p (4836) nemesis0.86p (888)
+; Filename : nemesis.86p (5kb)
; Author(s) : Shiar
; Email Address : shiar0@hotmail.com
; ICQ ; #43840958
-; Web Page : come.to/shiar
-; Description : cool arcade-shoot-em-up-game (release 12/99)
-; Where to get this game : www.ticalc.org
-; Other games by author : N/A
+; Web Page : www.shiar.org
+; Description : cool arcade-shoot-em-up-game
+; Where to get this game : www.shiar.org | www.ticalc.org
+; Other games by author : Worm
-; ABOUT: This source should only be used for learning practises, do not
-; alter it, and certainly do not distribute an altered version!!
+; ABOUT: This source should only be used for learning practises, do not
+; alter it, and certainly do not distribute an altered version!!
; NOTE: &&& marks uncertainties or things to optimize
-;---------------------- nemesis.z80 start -------------------------------------
+;---------------------- nemesis.z80 start -----------------------------------
#include "asm86.h"
#include "ti86asm.inc" ;standard ti86 romcalls
storepos = _asm_exec_ram+6000 ;120 OF 165
storepos2 = _asm_exec_ram+6200 ;141 OF 167
-exlevel = _asm_exec_ram+6400 ;784+OF 2.7kb
-
-XLlevelsdata = exlevel+8 ;size: upto 1016 bytes
-XLweapondata = exlevel+1024 ;size: always 64 byte
-XLenemytable = exlevel+1088 ;size: always 16 byt
-XLenemyinfos = exlevel+1104 ;size: always 64 by
-XLsprenemies = exlevel+1168 ;size: like 128 b (upto 1kb)
-
-;---------------------- in-game vars ------------------------------------------
-temp1 = storepos ;+0+1 ;temp (2 bytes) bullet
+;---------------------- in-game vars ----------------------------------------
just_fired = storepos+2 ; +2 ;counts how long a blast lasts
curline = storepos+2 ; +2 ;used to display SFX
;^-----------------------------------<1 ;-120=$78
-nrenemies = 10 ;max. nr of enemies
-enemysize = 7
-enemies = storepos2 ; +0 ;info about each enemy (6byt)
+enemies = storepos2 ; +0 ;info about each enemy
+enemysize = 7 ;infobytes per enemy
+nrenemies = 16 ;max. nr of enemies
-nrybuls = 10
-ybullets = enemies+(nrenemies*6) ;+80 ;60 bytes = 20(state,x,y)
-nrebuls = 10
-ebullets = ybullets+(nrybuls*3) ;+110 ;30 bytes = 10(state,x,y)
+ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y)
+nrybuls = 32 ; +80\
+ebullets = ybullets+(nrybuls*4) ;+110 ;30 bytes = 10(state,x,y)
+nrebuls = 16
ybuls = ebullets+(nrebuls*3) ;+140
+maxbullets = 32
;^-----------------------------------<2 ;-141=$8D
;level_info:
; [0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire]
;enemies:
-; [HP] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)]
+; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)]
; [ship type or explosion frame] [x] [y] [move] [fire]
-;---------------------- introduction ------------------------------------------
+;---------------------- introduction ----------------------------------------
nop ;hello yas/ase/rascall/whathever
jp init ;here's the program, but first: a description
.db %11100000 ; ███ ;recommend 80x50 screen mode
.DB 0 ;clear stupid YAS-line
-;---------------------- init --------------------------------------------------
+;---------------------- init ------------------------------------------------
level_name: .db 8,"nemesis0"
-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)
init: cal BUSY_OFF ;turns the run-indicator off, obviously
cal _clrScrn ;clean the screen
-
-Loadlevel:
- ld hl,level_name-1 ;find own variable
- rst 20h ;cal _ABS_MOV10TOOP1
- rst 10h ;cal _FINDSYM
- ret c ;not found? who cares...
-
- cal _ex_ahl_bde
- cal _SET_ABS_SRC_ADDR
- xor a
- ld hl,exlevel
- cal _SET_ABS_DEST_ADDR
- ld hl,4+4
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
-
- ld hl,(exlevel+4+2)
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
-
- xor a
- ld hl,XLweapondata
- cal _SET_ABS_DEST_ADDR
- ld hl,272
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir ;save done (cal \ ret)
-
-setup: xor a ;<ld a,0>: reset:
+ xor a ;ld a,0
ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen
+ cal _flushallmenus ;remove TI menus
ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems.
- cal StartFix
-setcontrast:
- ld a,(CONTRAST) ;load current contrast level
- cp $1f ;if already at maximum...
- jr z,skipdarken ;...then skip level increase
- inc a ;otherwise increase contrast level
-skipdarken:
- out (2),a ;set it
-;---------------------- main menu ---------------------------------------------
+FixKeys: ;fixes some key problems like left+down bug
+ im 1
+ ld a,$D4
+ ld bc,$0100
+ ld h,a
+ ld l,c ;ld hl,$D400
+ ld d,a
+ ld e,b ;ld de,$D401
+ dec a ;ld a,$D3
+ ld (hl),a
+ ldir
+ ld hl,int_handler
+ ld d,a
+ ld e,a ;ld de,$D3D3
+ ld bc,int_end-int_handler
+ ldir
+ inc a ;ld a,$D4
+ ld i,a
+ im 2
+
+;---------------------- main menu -------------------------------------------
LogoPut:
xor a ;white bitmask (a=0)
- ld b,16 ;one line
ld hl,logo_nemesis ;from...
ld de,VIDEO_MEM+16 ;...to one line from top
+ ld b,e ;ld b,16: one line
AboveLogo:
ld (de),a ;clear/n byte
inc de ;next
ld bc,16*19 ;logo size
ldir ;display one line of logo
-; ld hl,GRAPH_MEM ;cleared line
-; ld bc,16 ;size=one line
-; ldir ;also clear one line below the logo
-
-; ld a,-1 ;first line is -1+1=0
-; ld b,21 ;with first 21 lines:
-; cal DoSFX ;do special effect &&&skip
-
ld hl,VIDEO_MEM+(16*$39)+4 ;$39 rows down, 4 cols right (4*8=$20)
ld b,8 ;draw 8x one byte = 8*8 = 64 pixels wide
ld a,%11111111 ;horizontal line mask
ld (_curRow),hl
cal _putc
- halt \ halt \ halt \ halt
+ halt \ halt
cal GET_KEY ;wait for keypress
cp K_UP
ld a,(menuitem)
dec a
jr nz,startnewgame
- cal Continue_game
- jr game_main_loop
-
-startnewgame:
- cal New_game
+ cal samelevel
jr game_main_loop
menuchange:
jr menuloop
do_invert:
- ld (hl),$EE
+ ld (hl),$2F ;cpl
ret
undo_invert
- ld (hl),$E6
+ ld (hl),$B7 ;or a
ret
-;------------------------------------------------------------------------------
-;---------------------- game loop ---------------------------------------------
-;------------------------------------------------------------------------------
+startnewgame:
+ cal New_game
+
+;----------------------------------------------------------------------------
+;---------------------- game loop -------------------------------------------
+;----------------------------------------------------------------------------
game_main_loop: ;REPEATS FROM HERE EVERY FRAME
ld hl,timer ;update time
cal CheckGround ;check for collision with the ground
check_keys:
- cal GET_KEY
- cp K_GRAPH
- cal z,Teacher
-
- ld a,%00111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5)
+ ld a,%10111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5)
out (1),a ;ask for them
nop \ nop ;delay 8 clocks
in a,(1) ;get zem!
psh hl ;push hl on stack (instead of cal Fire_bullet)
jp z,Fire_bullet ;fire smtn (bulletstorplasermultiples+stuff..)
pop hl ;no cal to Fire_bullet made, so pop stack
- ld hl,just_fired ;no:
- ld (hl),0 ;reset just_fired
+ xor a ;no:
+ ld (just_fired),a ;reset just_fired
check_selkey:
ld a,%01011111 ;look at first column of keys (ALPHA to STO)
out (1),a ;gimme
nop \ nop ;what's taking you so long
in a,(1) ;at last... our precious keyzzz...
- ;old: <bit 7,a \ cal z,select> now see this:
+
+ bit 6,a ;'bout the GRAPH key...
+ cal z,Teacher ;you didn't _press_ it, did you?!?
+
rla ;test bit7 so we know f ALPHA has been pressed
cal nc,select ;yeppy, select the currently selected upgrade
cal Enemies_hit ;check for collision with enemies
+ cal inc_weapdamage
_gamestuff1:
cal Handle_Ship ;move you
cal Display_Screen ;display all
halt ;delay
- jp game_main_loop ;LOOP^^^^^^^^^^^^^
+ jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-;--------------------------- ground -------------------------------------------
+inc_weapdamage:
+ ld a,0
+weapincs =$-1
+ inc a
+ cp 31
+ ret nc ;return if increased 16 times or more already
+ ld (weapincs),a
+
+ ld b,1
+weapdamage =$-1
+ add a,b
+
+ ld (curweapdamage),a
+ ret
+
+;--------------------------- ground -----------------------------------------
Handle_ground:
ld a,(timer)
ld b,5
jp damage_you
-;--------------------------- ceiling ------------------------------------------
+;--------------------------- ceiling ----------------------------------------
Handle_ceiling:
ld a,(timer)
ld b,5
jp damage_you ;otherwise you don't wanna be in that ship
-;--------------------------- move stars ---------------------------------------
+;--------------------------- move stars -------------------------------------
DisplayStars: ;inputs: hl=starx# a=stars# b=nrstars#
ld e,(hl)
dnz movestars_loop
ret ;for stupid people, here's another comment...
-;--------------------------- pause --------------------------------------------
+;--------------------------- pause ------------------------------------------
Pause:
ld hl,$0200 ;top left
jr nz,pause ;no, wait some more
ret ;continue
-;--------------------------- teacher ------------------------------------------
+;--------------------------- teacher ----------------------------------------
Teacher:
ld (iy+12),5 ;enable flashing cursor
jr teacherloop
-;--------------------------- exit ---------------------------------------------
+;--------------------------- exit -------------------------------------------
quit:
- im 1
- ld a,(CONTRAST) ;load original contrast level
- out (2),a ;and set it back
+ im 1 ;release keyfix procedure
ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling
ld hl,GRAPH_MEM ;graph-screen location
jp _clrWindow ;as _clrLCD but also clears TEXT_MEM (like the
;_clrScrn) AND also executes _homeup and ret
-; cal _clrScrn
-; jp _homeup
-;--------------------------- display ------------------------------------------
+
+;--------------------------- display ----------------------------------------
Display_Screen:
ld hl,GRAPH_MEM ;from storage (top left)
displaytloop:
ld a,(hl) ;copy byte from (hl)
_invert:
- xor $ff ; } ;invert byte (white<=>black)
+ cpl ;xor $ff: invert byte (white<=>black)
ld (de),a ;to (de)
inc hl \ inc de ;next byte
dnz displaytloop ;16x hl >> de
savestr: ;@here the score will be stored
.db "00000",0 ;don't worry, it's just temporary
-;------------------------- handle ship ----------------------------------------
+;------------------------- handle ship --------------------------------------
Handle_Ship:
ld a,(your_occ) ;are
ld (your_occ),a ;set to explode
ret
-;------------------------- place multiples ------------------------------------
+;------------------------- place multiples ----------------------------------
Place_multiples:
ld (mx),de ;set last multiple-position
dnz place_multiples ;repeat
ret
-;------------------------- select upgrade -------------------------------------
+;------------------------- select upgrade -----------------------------------
select:
ld hl,your_pickup ;select pickups
jr nz,select2 ;no, carry on
select1:
ld a,(your_armor) ;load current armor
- cp 24 ;is it >=24
- ret nc ;then return (armor may not be 25 or more)
- xor a
- ld (your_pickup),a ;reset pickups (a=0)
- ld hl,your_armor ;change armor
- inc (hl) ;increase HPs by one
+ cp 25-6 ;may not become >=25
+ jr c,select1_ ;ok then just add 6
+ ld a,25-6 ;set to maximum (6 will be added below)
+select1_:
+ add a,6 ;add 6 to armor
+ ld (your_armor),a ;change armor
+ xor a ;ld a,0
+ ld (your_pickup),a ;reset pickups
jp disp_icons ;display and return
select2:
dec a ;is it 2?
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,XLweapondata-7
- add hl,bc
- ld a,(hl)
- ld (ybuls),a
-
+ cp maxnrweapons
+ jp nc,disp_icons ;weapon maxed out
+ ld (hl),a ;set new weapon
+ cal loadweapon ;load it (damage and stuff)
jp disp_icons ;display n return
select4:
dec a ;is it 4?
ld (hl),0 ;reset pickups
jp disp_icons ;display/return
-;------------------------- fire bullet ----------------------------------------
+;------------------------- fire bullet --------------------------------------
Fire_bullet:
- ld hl,RanPos ;random
- inc (hl) ;update random counter
-
-; ld a,(laserlasts)
-; ld b,5
ld hl,just_fired
ld a,(hl) ;just_fired
cp 5 ;already pressed?
dec a ;1=yes
jr z,fire_laser
- ld ix,XLweapondata-6
+ ld ix,weapondata-6
add a,a ;weap*2
add a,a ; *4
add a,a ; *8
ld c,(ix)
xor a
cp c
- jr nz,fire_ybullet
+ cal nz,fire_ybullet
ret
fire_torp:
dnz laserhits ;check all enemies
ret
-enemy_lashit:
+enemy_lashit: ;&&&before nolashit
+ ld a,1 ;damage
cal enemy_hit
jr nolashit
fire_ybullet:
ld hl,ybullets
- ld de,3
- ld a,(ybuls)
- ld b,a
+ ld de,4
+ ld b,maxbullets
find_ybullet:
ld a,(hl)
or a
jr z,found_ybullet ;0 = no bullet here
add hl,de
dnz find_ybullet ;look next bullet
- ret
+ pop hl ;don't try to fire any other bullets
+ ret ;so ret twice
found_ybullet:
ld (hl),c ;use the bullet and set correct bullet-type
+ inc hl ;@damage
+ ld (hl),1 ;set bullet damage
+curweapdamage =$-1
ld a,(firex) ;your x-pos
add a,5 ;place bullet in front of you
inc hl ;go to bullet-x
add a,(ix+1) ;place bullet at the middle of your ship
inc hl ;go to bullet-y
ld (hl),a ;set y
+
+ xor a
+ ld (weapincs),a ;reset damage
ret
-;------------------------ handle bullets --------------------------------------
+;------------------------ handle bullets ------------------------------------
bullet_left:
ld a,124
ld (hl),a ;save new pos.
ld d,a ;d = X
- inc hl ;to y-pos
+ inc hl ;@y-pos
ld a,c
cal _shracc
dec a
ret
remove_bullet:
- dec hl
+ pop hl ;cal bullet_left
+ pop hl ;enemy+type
ld (hl),0 ;dump this bullet!
- pop hl
- jr next_ybullet
+ jr next_ybullet+1 ;+1:skip pop hl at next_ybullet
Handle_bullets:
ld hl,ybullets
- ld a,(ybuls)
- ld b,a
+ ld b,maxbullets
scan_bullets:
- psh bc
- psh hl
+ psh bc ;bullet counter
+ psh hl ;save enemy+type
ld (temp1),hl ;needed for check_bullethits
- ld a,(hl)
- inc hl
+ ld a,(hl) ;@bulletType
+ inc hl ;@damage
+ inc hl ;@x
or a
jp z,next_ybullet ;bulletType=0 >> no bullet
- ld c,a
+ ld c,a ;c=type
and %1111
- ld b,a
+ ld b,a ;b=0000type
cal bullet_left ;move bullet left
display_bullet:
- ld ix,spr_bullet01
- psh de
+ psh de ;save de =position
+ dec hl ;@x
+ dec hl ;@damage
+ ld a,(hl) ;bullet damage=size
+ ld hl,XLbullettable ;pointer to first bullet
+ srl a
+ srl a ;per 4
+ inc a ;must be at least 1
+nextbulletlook:
+ inc hl ;next bullet sprite pointer
+ dec a ;for each 4 points of damage
+ jr nz,nextbulletlook
+ ld d,a ;ld d,0
+ ld a,(hl) ;load pointer offset
+ ld e,a ;convert to 16bit
+ ld ix,spr_bullet01 ;first sprite
+ add ix,de ;add offset (go to correct sprite)
+ pop de ;saved position
+ psh de ;but will be altered so save again
cal putsprite ;display bullet
pop de
cal check_bullethits
next_ybullet:
- pop hl
- pop bc
+ pop hl ;restore enemy+type
inc hl
inc hl
inc hl
+ inc hl ;skip type,dam,x,y: next enemy+type
+ pop bc ;b=counter
dnz scan_bullets ;next bullet (loop)
ret
-;--------------------------- check bullethits --------------------------------
+;--------------------------- check bullethits -------------------------------
check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet
ld b,nrenemies
ld hl,enemies+1
hit_enemies: ;Hits with normal enemies
+ psh bc ;enemy counter
psh hl
ld a,(hl)
jp m,nohit
psh hl
- ld hl,(temp1)
- ld (hl),$00 ;remove bullet
- pop hl
-
+ ld hl,0 ;@bulletType
+temp1 =$-2
+ ld (hl),0 ;remove bullet
+ inc hl ;@damage
+ ld a,(hl) ;set damage
+ pop hl ;enemy+y
cal enemy_hit
-
nohit:
pop hl
- ld a,b ;psh bc
ld bc,enemysize
add hl,bc
- ld b,a ;pop bc
+ pop bc
dnz hit_enemies ;check next enemy
ret
-enemy_hit:
- dec hl
- dec hl
- dec hl
- ld a,(hl) ;occ
- ld c,a ;psh occ
- and %11111100 ;occ/4 = HP left ;<srl a\srl a
- jr nz,hpleft ;not zero -> jump
- ld (hl),%01 ;set to explode
+enemy_hit: ;in:a=damage;hl=enemy+y
+ add a,a ;a=damage to inflict
+ add a,a ;first 2 bits used for occ.
+ ld b,a
+ dec hl ;@x
+ dec hl ;@type
+ dec hl ;@hp00 (occ)
+ ld a,(hl) ;load hp00
+ sub b ;decrease HP (if <0xx then c is set)
+ ld (hl),a ;save (no flag-changes)
+ dec hl ;@hp64; no change in c
+ ld a,(hl) ;load; no c-change
+ sbc a,0 ;if cf then decrease a
+ ld (hl),a ;save back the new value
+ ret nc ;if a>=0 then return, otherwise explode
+
+ inc hl ;goto occ again
+ ld (hl),%01 ;set to explode
ld a,(pickuptimer) ;counts enemies destroyed
dec a ;enough destroyed for a pickup?
jr nz,pickupdone ;otherwise just explode
- ld (hl),%00000110 ;change it into a pickup (with 2 HP)
+ ld (hl),%110 ;change it into a pickup (with 2 HP)
ld a,18 ;reset enemies counter (18 hits = next)
pickupdone:
ld (pickuptimer),a ;save new enemiescounter value
ld hl,1 ;increase score by one
jp scoreInc ;+ret
-hpleft:
- ld a,c ;pop occ
- sub %00000100 ;decrease HP by one
- ld (hl),a ;save
- ret
-
-;--------------------------- handle torpedo ----------------------------------
+;--------------------------- handle torpedo ---------------------------------
Handle_torp:
ld a,(torp_occ)
ld (torp_occ),a
ret
-;--------------------------- level events -------------------------------------
+;--------------------------- level events -----------------------------------
Level_event:
ld hl,nextevent ;time to next event <ld a,(nextevent)
add hl,bc
cp (hl) ;(hl) = 0 ??
jr nz,chk_noenemy ;jump if enemy present (non-0)
-
- ld d,h
- ld e,l
+ ex de,hl ;de=hl=usable enemy
place_enemy:
ld a,(level_enemy) ;enemy type to place (lvl)
ld a,(hl) ;load hitpoints+occ of this enemy class
ld (de),a ;save occ
+ inc hl ;next enemyInfo byte
dec de ;goto hp
- xor a
+ ld a,(hl) ;load hp64
ld (de),a ;save hp64
inc de ;next byte (or previous): occ again
ffireOK:ld (de),a ;save fire
ret ;return
-;--------------------------- enemy fires --------------------------------------
+;--------------------------- enemy fires ------------------------------------
Enemy_fires: ;de = x,y
dec d
ld (hl),e ;set y-pos
ret
-;----------------------------- enemy bullets ----------------------------------
+;----------------------------- enemy bullets --------------------------------
Enemy_bullets:
ld hl,ebullets
ld (hl),0 ;bullet > unused
jr next_bullet+1 ;next bullet (SKIP THE <POP HL> = one byte)
-;--------------------------- handle enemies -----------------------------------
+;--------------------------- handle enemies ---------------------------------
Handle_enemies:
ld hl,enemies+1
ld (hl),a ;next frame
jr next_enemy
-;--------------------------- moving enemies -----------------------------------
+;--------------------------- moving enemies ---------------------------------
moving_enemy:
ld a,(level_move)
inc e ;otherwise save new position
ret ;and return
-;--------------------------- check collision ----------------------------------
+;--------------------------- check collision --------------------------------
Enemies_hit:
ld hl,(x) ;e = X, d = Y
dnz check_collision
ret
-;--------------------------- story -------------------------------------------
+;--------------------------- story ------------------------------------------
storyPage:
psh hl
ld (levelp),hl ;set the level-pointer
ret ;and return
-;--------------------------- SFX ---------------------------------------------
+;--------------------------- SFX --------------------------------------------
CDoSFX:
ld hl,VIDEO_MEM
halt
dnz SFXdelay
- pop bc
+ pop bc
dnz SFXframe
ret
-;--------------------------- show icon ----------------------------------------
+;--------------------------- show icon --------------------------------------
drawline:
ld (hl),a ;draw one piece of the divider-line
dec hl \ dec hl
jp _vputs ;display on screen +ret
-;--------------------------- proc ---------------------------------------------
+;--------------------------- proc -------------------------------------------
Random5016:
cal Random50 ; a = 0..50
pop hl
jr Decompress
-;--------------------------- game over / new game / death ---------------------
+;--------------------------- game over / new game / death -------------------
chartable:
.db 0,"!<>^",0,0,0,0
.db 0,"xtoje0",0 ;enter..clear
cal _SET_ABS_SRC_ADDR
ld hl,storehi_end-storehi_start
cal _SET_MM_NUM_BYTES
- jp _mm_ldir ;save done (cal \ ret)
+ cal _mm_ldir ;save done (cal \ ret)
+ jp _RAM_PAGE_1
save_lvl:
ld hl,own_name-1 ;find own variable
cal _SET_ABS_SRC_ADDR
ld hl,storesave_end-storesave_start
cal _SET_MM_NUM_BYTES
- jp _mm_ldir ;save done (cal \ ret)
- ret
+ cal _mm_ldir ;save done (cal \ ret)
+ jp _RAM_PAGE_1
game_over:
pop hl ;=ret (game_over was called from a procedure)
cal _getkey ;wait for keypress
jp quit ;restore some things and return to TI-OS/shell
-Continue_game:
- jr nonext_level
-
New_game:
xor a ;ld a,0
ld (score),a ;reset score
ld (your_lives),a ;3 lives (4 will be decreased @ You_die)
ld (pickuptimer),a ;next pickup after 4 enemies destroyed
- xor a
- cp (hl)
- cal z,dostory
-
You_die:
ld a,12
- ld (your_armor),a ;5 HPs/shields
- ld hl,your_lives
- dec (hl) ;decrease lives
- ld a,(hl) ;load lives left
- inc a ;if lives=0ffh then a=0
- jp z,game_over ;if so, game's over
- jr nonext_level
+ ld (your_armor),a ;12 HPs/shields
+ ld a,(your_lives) ;load lives left
+ dec a ;decrease lives
+ ld (your_lives),a ;if lives=0ffh GO
+ jp c,game_over
+ jr samelevel
-;--------------------------- next level ---------------------------------------
+;--------------------------- next level -------------------------------------
Next_level:
+ ld a,(your_armor) ;load current armor
+ cp 25-8 ;may not become >=25
+ jr c,addok ;ok then just add 8
+ ld a,25-8 ;set to maximum (8 will be added below)
+addok:
+ add a,8 ;add 8 to armor
+ ld (your_armor),a ;change armor
+
ld hl,level ;level number
ld a,(hl)
inc a
add hl,bc ;update to point to next level
ld (levelp),hl ;save
- xor a
- cp (hl)
- cal z,dostory
-
-nonext_level:
- ld a,(your_weapon)
- add a,a ;weap*2
- add a,a ; *4
- add a,a ; *8
- ld c,a
- ld b,0
- ld hl,XLweapondata-7
- add hl,bc
- ld a,(hl)
- ld (ybuls),a ;max number of bullets (varies per weap.class)
-
+samelevel:
ld a,80
ld (nextevent),a ;time to first enemy appearance
ld hl,(levelp) ;level pointer
+ xor a
+ cp (hl)
+ cal z,dostory
+
ld a,(hl) ;load new level-enemy type
ld (level_enemy),a ;set level-enemy
inc hl
ld bc,(nrenemies*enemysize)+((nrybuls+nrebuls)*3)-1
ldir ;clear enemies + bullets (y/e)
-;--------------------------- setup game ---------------------------------------
+;--------------------------- setup game -------------------------------------
game_setup:
cal BLACKLCD
dnz placestars ;repeat for all stars
ret
-;--------------------------- putsprite ----------------------------------------
-;--------------------------- de =(X,Y) ----------------------------------------
+loadweapon:
+ ld a,(your_weapon)
+ add a,a ;weap*2
+ add a,a ; *4
+ add a,a ; *8
+ ld c,a
+ ld b,0
+ ld hl,weapondata-16
+ add hl,bc
+ ld a,(hl)
+ ld (weapdamage),a ;damage of bullets
+ inc hl
+ ld a,(hl)
+; ld (weapdaminc),a ;damage increase
+ ret
+
+;--------------------------- putsprite --------------------------------------
+;--------------------------- de =(X,Y) --------------------------------------
offsets_table:
- .db 128,64,32,%10000,%01000,%00100,%00010,%00001
+ .db $80,$40,$20,$10,8,4,2,1
putsprite:
ld a,d ;a = X
and %00000111 ;a = X mod 8 = bit nr. to mask
srl d ;d/4
srl d ;d/8 (8 bits in byte) ** c is set when overflow
add a,d ;a = (Y*16+X/8) mod 256
- jp nc,_n1 ;jump if no carry = no overflow = a<=255
+ jr nc,_n1 ;jump if no carry = no overflow = a<=255
inc b ;a>255 so increase bc by 256
_n1: ld c,a ;c = (Y*16+X/8) mod 256
add hl,bc ;bc = Y*16+X/8
inc ix
_smc1: ld a,1 ;Load pixel mask
_iloop: sla c ;Test leftmost pixel
- jp nc,_noplot ;See if a plot is needed
+ jr nc,_noplot ;See if a plot is needed
ld e,a ;OR pixel with screen
or (hl)
ld (hl),a
ld a,e
_noplot:rrca
- jp nc,_notedge ;Test if edge of byte reached
+ jr nc,_notedge ;Test if edge of byte reached
inc hl ;Go to next byte
_notedge:
dnz _iloop
dnz _oloop
ret ;<jp>s are used instead of <jr> = faster
-;--------------------------- putbigsprite -------------------------------------
+;--------------------------- putbigsprite -----------------------------------
putwidesprite:
ld a,d
dnz woloop
ret
-;------------------------------------------------------------------------------
-;------------------------------- sprites --------------------------------------
-;------------------------------------------------------------------------------
+;----------------------------------------------------------------------------
+;------------------------------- sprites ------------------------------------
+;----------------------------------------------------------------------------
spr_ship01:
.db 7,7 ;ship alpha class
.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 ; █ █ █
.db %11111100 ; ██████
.db %01111000 ; ████
+;--------------------------------- bullets ----------------------------------
+
spr_bullet01:
- .db 5,3 ;your bullets
- .db %00110000 ; ░▒▓█▒
- .db %11111000 ; ░▒▓████▒
- .db %00110000 ; ░▒▓█▒
+ .db 5,3 ;dam=0-3
+ .db %00110000 ; ▒██
+ .db %01001000 ; ▒█ ▒█
+ .db %00110000 ; ▒██
spr_bullet02:
+ .db 5,3 ;dam=4-7
+ .db %00110000 ; ▒██
+ .db %01101000 ; ▒██▒█
+ .db %00110000 ; ▒██
+spr_bullet03:
+ .db 5,3 ;dam=8-11
+ .db %00110000 ; ▒██
+ .db %11101000 ;▒███▒█
+ .db %00110000 ; ▒██
+spr_bullet04:
+ .db 5,3 ;dam=8-11
+ .db %00110000 ; ▒██
+ .db %11111000 ;▒█████
+ .db %00110000 ; ▒██
+spr_bullet05:
+ .db 5,3 ;dam=8-11
+ .db %01110000 ; ▒███
+ .db %11111000 ;▒█████
+ .db %01110000 ; ▒███
+spr_bullet06:
.db 5,3
- .db %11110000 ; ░▒▓███▒
- .db %11111000 ; ░▒▓████▒
- .db %11110000 ; ░▒▓███▒
+ .db %11110000 ;▒████
+ .db %11111000 ;▒█████
+ .db %11110000 ;▒████
spr_bullett1:
.db 4,3 ;▒▒▒
.db %11100000 ;▒███
.db %11110000 ; ▒███▓▒░
.db %01100000 ; ▒█▓▒░
-;---------------------------------------- explosion -------------------------------------------
+;-------------------------------- explosion ---------------------------------
spr_explosion:
.db 8,6 ;1
.db %00000000 ;
.db %00000000 ;
-;--------------------------------------- bar -----------------------------------
+;------------------------------------ bar -----------------------------------
spr_iconhalf:
.db 16,7 ;selected .......:
.db 8,7
.db 128,128,128,128,128,128,128 ;128 = %10000000
-;---------------------------- texts -------------------------------------------
+;-------------------------- weapondata --------------------------------------
+
+;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset]
+maxnrweapons = 8+1
+weapondata:
+ .db 2,1,%00000010,2,%00000000,0,%00000000,0 ;single fire
+ .db 2,1,%00000011,2,%00000000,0,%00000000,0 ;fast single
+ .db 16,2,%00000010,0,%00000010,5,%00000000,0 ;double
+ .db 16,1,%00010010,2,%00110010,2,%01000010,2 ;triple
+ .db 16,1,%00010011,2,%00110011,2,%01000011,2
+ .db 16,1,%00010011,2,%00110011,2,%01000100,2
+ .db 16,1,%00010100,2,%00110100,2,%01000101,2
+ .db 16,1,%00010100,2,%00110100,2,%01000101,2
+
+;---------------------------- texts -----------------------------------------
txt_about: .db " v0.96.A30",127,"by Shiar",0
txt_email: .db "shiar0@hotmail.com",0
txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0
txt_teacherans: .db Lneg,"14.2063168184",0
-;---------------------------- save data ---------------------------------------
+;---------------------------- save data -------------------------------------
PutWhere .dw GRAPH_MEM ;where to put the wide sprites
laserlasts .db 5
storehi_start:
hiscore .dw $0000
-hiname .db "Shiar.96",0
+hiname .db "Shiar.97",0
storehi_end:
storesave_start:
level .db $01 ;level number
-levelp .dw XLlevelsdata+4 ;pointer to level data
+levelp .dw XLlevelsdata ;pointer to level data
pickuptimer .db $04 ;counts when to place a pickup
score .dw $0000
your_armor .db $0a ;HP left
your_lives .db $03 ;
-your_weapon .db $02 ;laser avail: 0=no, 1=yes
+your_weapon .db $02 ;weapon: 0=no, 1=laser, 2+=bullet n+1
your_multiples .db $00 ;multiples present
torp_occ .db $00 ;torp.state: 0=unavail 1=avail 2=presnt
torp_pos .dw $0000 ;torpedo position (x,y)
storesave_end:
-;----------------------------- logo -------------------------------------------
+
+;XLlevelsdata:---------------------------------------------------------------
+XLlevelsdata:
+
+ .db 0
+ .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06
+ .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06
+ .db $09,$19,"the Nemesis saga continues",0,1
+ .db $2e,$21,"with NEMESIS 86" ,0,1
+ .db $52,$36,"by Shiar" ,0,0,$19,$23
+ .db $ff
+
+;format:[enemy nr] [enemy frequency] [next lvl]
+; [level_info: 0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire]
+; [level_move] [level_fire] [tunnel size] [groundtype] [16_ground]
+; [16_ceiling] [stars1] [stars2]
+
+ .db $15,$07,$08 ;fireFreq; moveType; enemyType
+level01: ;efrequency must be odd if halfluring!
+ .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f ; 7
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16
+ .db 1,1 ; 2
+ .db $10,$07,$09 ; 3
+
+ .db 0
+ .db $01,01,"And the storyline conti",
+ .db "nues.....",0,1
+ .db $01,09,"You decide to fly close",
+ .db " to the",0,1
+ .db $01,15,"surface of a nearby pl",
+ .db "anet =)",0,0,1,20
+ .db $FF
+
+ .db $10,$07,$09 ; 3
+level02: ;44
+ .db $02,$13,$4b,%00100101,0,064,0,0
+ .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1
+ .db $0E,$07,$09
+
+ .db 0
+ .db $01,01,"Blablabla...",0,1
+ .db $01,34,"this storyline sux",0,0,1,39
+ .DB $FF
+
+ .db $0E,$07,$09
+level03:
+ .db $03,$2d,$3f,%00010110,0,255,-9,1
+ .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20
+ .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18
+ .db -1,-1
+
+ .db $0D,$07,$08
+level04:
+ .db $04,$11,$41,%00100001,0,057,0,0
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1
+ .db $0C,$07,$09
+level05:
+ .db $05,$11,$45,%00100101,%10,031,-7,1
+ .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2
+ .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1
+ .db $0B,$07,$08
+level06:
+ .db $06,$19,$3a,%00100111,0,255,-4,1
+ .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+ .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1
+
+ .db $08,$07,$09
+level07:
+ .db $07,$09,$ff,%00100001,0,043,0,0
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .db 1,1
+
+;XLenemytable:---------------------------------------------------------------
+XLbullettable:
+ .db (spr_bullet01-spr_bullet01) ;0
+ .db (spr_bullet01-spr_bullet01) ;4
+ .db (spr_bullet02-spr_bullet01) ;8
+ .db (spr_bullet02-spr_bullet01) ;12
+ .db (spr_bullet03-spr_bullet01) ;16
+ .db (spr_bullet03-spr_bullet01) ;20
+ .db (spr_bullet03-spr_bullet01) ;24
+ .db (spr_bullet04-spr_bullet01) ;28
+ .db (spr_bullet04-spr_bullet01) ;32
+ .db (spr_bullet04-spr_bullet01) ;36
+ .db (spr_bullet05-spr_bullet01) ;40
+ .db (spr_bullet05-spr_bullet01) ;44
+ .db (spr_bullet05-spr_bullet01) ;48
+ .db (spr_bullet06-spr_bullet01) ;52
+ .db (spr_bullet06-spr_bullet01) ;56
+ .db (spr_bullet06-spr_bullet01) ;60
+
+XLenemytable:
+ .db $00 ;00
+ .db (spr_enemy01-spr_enemy00)/2 ;01
+ .db (spr_enemy02-spr_enemy00)/2 ;02
+ .db (spr_enemy03-spr_enemy00)/2 ;03
+ .db (spr_enemy04-spr_enemy00)/2 ;04
+ .db (spr_enemy05-spr_enemy00)/2 ;05
+ .db (spr_enemy06-spr_enemy00)/2 ;06
+ .db (spr_enemy07-spr_enemy00)/2 ;07
+ .db (spr_boss01 -spr_enemy00)/2 ;08
+ .db (spr_boss02 -spr_enemy00)/2 ;09
+ .db (spr_enemy08-spr_enemy00)/2 ;0A
+ .db (spr_enemy00-spr_enemy00)/2 ;0B
+ .db (spr_enemy00-spr_enemy00)/2 ;0C
+ .db (spr_enemy00-spr_enemy00)/2 ;0D
+ .db (spr_enemy00-spr_enemy00)/2 ;0E
+ .db (spr_enemy00-spr_enemy00)/2 ;0F
+
+;XLenemyinfos:---------------------------------------------------------------
+XLenemyinfos:
+
+;format: [000000:HP 00:occ] [HP64] [appearance(ypos)] [unused]
+
+ .db %00100110,0,1,1 ;#1 HP:1 app:random
+ .db %00101010,0,2,3 ;#2 HP:1 app:halflure
+ .db %00001111,0,3,2 ;#3 HP:1 app:lure
+
+ .db %00000110,0,4,2 ;#4 HP:2 app:lure
+ .db %00000111,0,5,3 ;#5 HP:2 app:random moving
+ .db %00001011,0,6,2 ;#6 HP:3 app:lure moving
+
+ .db %00011011,0,7,3 ;#7 HP:7 app:halflure moving
+
+ .db %00110011,1,8,1 ;boss1
+ .db %00111011,0,9,3 ;boss2
+
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+ .db %00000000,0,0,0
+
+;XLsprenemies:---------------------------------------------------------------
+XLsprenemies:
+
+spr_enemy00:
+ .db 8,8 ;pickup
+ .db %00011000 ; ██
+ .db %00011000 ; ██
+ .db %00011000 ; ██
+ .db %11111111 ; ████████
+ .db %11111111 ; ████████
+ .db %00011000 ; ██
+ .db %00011000 ; ██
+ .db %00011000 ; ██
+
+spr_enemy01:
+ .db 6,6 ;enemy type one
+ .db %00111100 ; ████
+ .db %01110000 ; ███
+ .db %11110000 ; ████
+ .db %11110000 ; ████
+ .db %01110000 ; ███
+ .db %00111100 ; ████
+spr_enemy02:
+ .db 8,6 ;enemy type two
+ .db %00111111 ; █████
+ .db %01111000 ; ████
+ .db %11111100 ; ██████
+ .db %11111100 ; ██████
+ .db %01111000 ; ████
+ .db %00111111 ; █████
+spr_enemy03:
+ .db 6,6 ;enemy type three
+ .db %01111100 ; █████
+ .db %11110000 ; ████
+ .db %11111000 ; █████
+ .db %11111000 ; █████
+ .db %11110000 ; ████
+ .db %01111100 ; █████
+spr_enemy04:
+ .db 6,6 ;enemy type four
+ .db %00111000 ; ███
+ .db %01111100 ; █████
+ .db %11111000 ; █████
+ .db %11111000 ; █████
+ .db %01111100 ; █████
+ .db %00111000 ; ███
+spr_enemy05:
+ .db 7,6 ;enemy type five
+ .db %00011110 ; ████
+ .db %01111110 ; ██████
+ .db %11111100 ; ██████
+ .db %11111100 ; ██████
+ .db %01111110 ; ██████
+ .db %00011110 ; ████
+spr_enemy06:
+ .db 7,6 ;enemy type six
+ .db %00011100 ; ███
+ .db %01111110 ; ██████
+ .db %10111000 ; █ ███
+ .db %10111000 ; █ ███
+ .db %01111110 ; ██████
+ .db %00011100 ; ███
+spr_enemy07:
+ .db 8,6 ;enemy type seven
+ .db %00011110 ; ████
+ .db %01111111 ; ███████
+ .db %10011100 ; █ ███
+ .db %10011100 ; █ ███
+ .db %01111111 ; ███████
+ .db %00011110 ; ████
+
+spr_boss01:
+ .db 16,10 ;boss type one
+ .db %00000001,%11111111 ; █████████
+ .db %00001111,%11111110 ; ███████████
+ .db %00111111,%11110000 ; ██████████
+ .db %01011111,%10000000 ; █ ██████
+ .db %10011111,%01000000 ; █ █████ █
+ .db %10011111,%01000000 ; █ █████ █
+ .db %01011111,%10000000 ; █ ██████
+ .db %00111111,%11110000 ; ██████████
+ .db %00001111,%11111110 ; ███████████
+ .db %00000001,%11111111 ; █████████
+spr_boss02:
+ .db 16,10 ;boss type:one :
+ .db %11111110,%00000000 ; ███████
+ .db %00001111,%10001111 ; █████ ████
+ .db %00111111,%11100011 ; █████████ ██
+ .db %01001111,%11111110 ; █ ███████████
+ .db %10001101,%01111100 ; █ ██ █ █████
+ .db %10001101,%01111100 ; █ ██ █ █████
+ .db %01001111,%11111110 ; █ ███████████
+ .db %00111111,%11100011 ; █████████ ██
+ .db %00001111,%10001111 ; █████ ████
+ .db %11111110,%00000000 ; ███████
+
+
+spr_enemy08:
+ .db 8,6 ;enemy type eight
+ .db %00011110 ; ████
+ .db %01111111 ; ███████
+ .db %10011100 ; █ ███
+ .db %10011100 ; █ ███
+ .db %01111111 ; ███████
+ .db %00011110 ; ████
+
+;----------------------------------------------------------------------------
+;----------------------------- logo ------------------------------------------
+;----------------------------------------------------------------------------
logo_nemesis:
.db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000
.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101
.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001
-;----------------------------- end --------------------------------------------
+;----------------------------- end ------------------------------------------
.end
.end
-;------------------------------------------------------------------------------
+;----------------------------------------------------------------------------
+;----------------------------------------------------------------------------
+;----------------------------------------------------------------------------
; 0.95.A22 -- 22.X.99 -- size 5321
;
; instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster)
; * ground/ceiling/stars are continued when at boss (c00l level 3 boss)
;
+; 0.97.622 -- 06.VI.99 -- size 5kb
;
-; + added - removed * changed # bug fixed
-
+; # bullets do damage in all levels
+; * more armor at armor-upgrade and extra armor at end of a level
+; - internal levels again (no need 4 external, safer/smaller)
+; # some registers not correctly pushed/popped
+; * several optimizations (init.procs some bytes smaller)
+; + bullets "charge up" (more damage) when not firing
+; + more powerful bullets have different sprites (larger=more damage)
+;
+;
+; + added - removed * changed # bug fixed
\ No newline at end of file