; Title : Wormy
-; Version : 92.5%
-; Release Date : february 2001
+; Version : 93%
+; Release Date : summer 2001
; Filename : wormy.86p (5kb)
; Author(s) : Shiar
; Email Address : shiar0@hotmail.com
;----------- TO-DO -----------
;-----------------------------
-; 92% = DONE
+; 93% = DONE
-; * implement circle-routine!
-; 1% * customizable keys
-; * internal levels
-; * check levels/gametype
-; * enough hiscore saves!
-; * complete readme
+; [* internal levels ]
+; [ * check levels/gametype ]
+; [ * enough hiscore saves! ]
+; [* complete readme ]
; 1% * misc (pollish, bugs, &&&)
; * LINK
-; 2% * fix deaths linkplay and transmit game/level data
-; 2% * make linkplay available for all gametypes (not just deathmatch)
+; * fix first packet loss
+; 1% * transmit game/level data
+; 1% * get g/o signal (l&l) working
+; 2% * send new peas' positions
; * CTF
-; 1% * fix pea XOR problem in ctf (+dom?)
-; * fix wormstop
-; 1% * domination?: take control points by running over them and hold them
+; 1% * fix pea XOR problem in ctf
+; 1% * fix wormstop in race
;100% = bugs fixed + levels done
;-----------------------------
#define buffer ;use display buffer (otherwise write directly to screen)
-#define readymask ;"grays" out the field before starting a level
-
+#define readymask ;"greys" out the field before starting a level
+;#define hlines ;horizontal-line routine for more speed drawing boxes
+ ;^^(doesn't work properly)^^
;#define readytext ;displays "prepare" before level starts
;#define invincible ;worms cannot die =)
+;#define optdie ;in race games worms don't die when they run into each other
#define cal call
#define psh push
#include "asm86.h"
#include "ti86asm.inc"
-_SHRACC = $4383
-_SHLACC = $438B
+_SHRACC = $4383 ;4x srl a
+_SHLACC = $438B ;4x sll a
_divHLby10 = $4044 ;hl=hl/10
_divAby10 = $4DAF ;a=a/10
_HLTIMES10 = $41BF ;hl=hl*10
-_cphlde = $403C
+_cphlde = $403C ;cp hl,de
_clrWindow = $4A86 ;clear screen
_asapvar = $D6FC ;own name (worm)
_MOV4B = $429B ;4x ld (de),(hl)
_SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
_SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
_mm_ldir = $52ED ;24bit ldir
+_MM_LDIR_SET_SIZE = $524D ;_SET_MM_NUM_BYTES + _mm_ldir
_RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
-_RAM_PAGE_7 = $47F3
+_RAM_PAGE_7 = $47F3 ;"""" 7
_PTEMP_END = $D29A ;end of VAT
_load_ram_ahl = $462F ;ahl->page+hl
-_writeb_inc_ahl = $5567 ;ld (ahl),c
+_writeb_inc_ahl = $5567 ;ld (ahl++),c
_jforce = $409C ;TI-OS stack restored
_EXLP = $4493 ;swap (hl),(de) b times
+_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl
;-----------------------------
;------- data storage -------
worm4p = $F000 ;-F3FF (400) %11110O00
leveldata = $F400 ;-FA70 (<=671)
-peaspos = $AE01
+turn10 = $AE01
+peaspos = $AE02
;--- temporary
.org _asm_exec_ram
-wormVhost = 092
-wormVclient = 192
+wormVhost = 093
+wormVclient = 193
start:
nop
.dw WormIcon
WormTxt:
- .db "WORMY by SHIAR -- alpha 92.5%",0
+ .db "WORMY by SHIAR -- beta 93%",0
WormIcon:
- .db 9,2
- .db %10010110,%01101111
- .db %10110101,%01001011
- .db %01110011,%01001001
- .db %00000011,%10000000
- .db %00000001,%11100000
- .db %00111000,%11111000
- .db %01111110,%00111111
- .db %11101111,%00001111
- .db %11000011,%10000000
+ .db 8,2
+ .db %00110000,%00111100
+ .db %01110000,%00111110
+ .db %11100000,%00000111
+ .db %11000011,%11000011
+ .db %11000111,%11100011
+ .db %11101110,%01100111
+ .db %01111100,%01111110
+ .db %00111000,%00111100
levelhead = 'w'
-levelhead2 = 92 ;wormy levels header = "92"
+levelhead2 = 94 ;wormy levels header = "93"
int_handler:
ex af,af'
cal _RAM_PAGE_7
ld hl,$BFFF ;VAT start
- ld bc,templevels
+ ld ix,templevels
searchloop:
ld de,(_PTEMP_END+1) ;VAT end
or a ;nc
cp $0C ;string
jr z,stringfound
searchnext:
- cal _RAM_PAGE_7
pop hl
dec hl ;5x
dec hl
dec hl
dec hl
dec hl
- psh bc
ld b,(hl) ;name size
inc b
skipname:
dec hl
dnz skipname
- pop bc
jr searchloop
stringfound:
ex de,hl ;ld ahl,(hl)
cal _AHL_PLUS_2_PG3 ;string id
cal _Get_Word_ahl ;ld de,(ahl)
- cal _RAM_PAGE_1
- ld (bc),a
+ ld (ix),a
ld a,levelhead
cp e
- jr nz,searchnext ;not worm
+ jr nz,_searchnext ;not worm
ld a,levelhead2
cp d
- jr nz,searchnext
-
- inc bc
- ld a,h
- ld (bc),a
- inc bc
- ld a,l
- ld (bc),a
- inc bc
- jr searchnext
+ jr nz,_searchnext
+ inc ix ;save level's ahl
+ ld a,h
+ ld (ix),a
+ inc ix
+ ld a,l
+ ld (ix),a
+ inc ix
+_searchnext:
+ cal _RAM_PAGE_7
+ jr searchnext
loadgametype:
psh de
- inc bc
- inc bc
cal _Get_Word_ahl ;ld de,(ahl++)
psh af
- ld a,d
- or e
- jr z,defaultlevels
ld a,e ;set new level
ld (bc),a
inc bc
ld a,d
ld (bc),a
- dec bc
-defaultlevels:
+ inc bc
pop af
pop de ;counter
dec d ;8x
ret
searchcomplete:
- cal _RAM_PAGE_1
ld a,255
- ld (bc),a ;end mark
+ ld (ix),a ;end mark
+
+ cal _clrWindow
ld hl,templevels-3
-dispnextlevel:
- cal _RAM_PAGE_1
psh hl
- cal _clrWindow
- ld a,2
- ld (_curRow),a
+ ld hl,$0020
+ ld (_penCol),hl
ld hl,txtLevsel
- cal _puts ;"< Select levels: >"
- ld hl,$0004
- ld (_curRow),hl
+ cal _vputs ;"< Select levels: >"
+ ld hl,$0601 ;x=1
+ ld (_penCol),hl
pop hl
+dispnextlevel:
ld a,(hl)
- cp 255 ;&&
- jr nz,displevel
- ld hl,templevels-3
- ld a,(hl)
+ inc a ;cp 255
+ jr z,_levselect
+ ld a,(hl) ;ade=(hl)
displevel:
inc hl
ld d,(hl)
inc hl
ld e,(hl)
- inc hl ;ade=(hl)
- psh hl ;HL
- ld c,a
- ld h,d
- ld l,e ;cde=ahl=(hl)
+ inc hl
+ psh hl
+ ex de,hl ;ahl=ade=(hl)
cal _load_ram_ahl ;hl=ahl
ld b,(hl) ;b=title size
- psh bc
- cal _putps ;destr=abchl
- pop bc ;cde=hl
- pop hl ;HL
+ cal _vputs
+ ld hl,_penCol
+ ld (hl),$01 ;x=1
+ inc hl
+ ld a,(hl)
+ add a,6
+ ld (hl),a ;y+6
+ ld hl,availevels
+ inc (hl)
+ pop hl
+ jr dispnextlevel
+
+levup:
+ cal menupos
+ dec b ;up
+ ld a,b
+ cp -4
+ jr nz,levselected
+ inc b ;undo
+ jr levselected
+levdown:
+ cal menupos
+ inc b ;down
+ ld a,b
+ cp -3
+availevels =$-1
+ jr nz,levselected
+ dec b ;back up
+levselected:
+ jp menupos
+
+_levselect:
+ ld b,-3 ;level selected
+ cal menupos
levselect:
- halt
- psh hl
- psh de
+ halt \ halt
psh bc
cal GET_KEY
- pop bc
- pop de
- pop hl
- cp K_RIGHT
- jr z,dispnextlevel
- sub K_SECOND
+ pop bc ;GET_KEY destr. b
+ cp K_UP
+ cal z,levup
+ dec a ;K_DOWN
+ cal z,levdown
+ cp K_SECOND-1
jr z,loadlevel
- dec a ;K_EXIT
- ret z
- cp K_ENTER-K_EXIT+256
+ cp K_EXIT-1
+ jp z,ExitNoStats
+ cp K_ENTER-1
jr nz,levselect
+; jr z,loadlevel
loadlevel:
- ld a,c
+ ld a,b
+ add a,3 ;sellev+3 (#0==-3)
+ ld e,a
+ add a,a ;*2
+ add a,e ;*3
+ ld e,a
+ ld d,0 ;de=sellev*3
+ ld hl,templevels-3
+ add hl,de
+ ld a,(hl) ;ade=(hl)
or a ;levelfile on page 0 (=internal)
jr z,levelloaded
- ex de,hl ;ahl=cde
- inc b ;b=titlesize+1
+ inc hl
+ ld d,(hl)
+ inc hl
+ ld e,(hl)
+ ex de,hl ;ahl=ade
skiptitle:
- cal _INC_PTR_AHL
- dnz skiptitle
+ ld b,a ;psh ahl
+ psh hl
+ cal _GETB_AHL ;ld a,(ahl)
+ pop hl
+ or a
+ ld a,b ;pop ahl
+ psh af
+ cal _INC_PTR_AHL ;ahl++
+ pop af ;cp 0
+ jr nz,skiptitle ;goto #0-terminator
cal _Get_Word_ahl
ld (leveldataSize),de
+
ld d,8 ;counter
- ld bc,datalevels-2
+ ld bc,datalevels
cal loadgametype
- ld (hilvlposa),a
+ ld (hilvlposa),a ;singleplayer levels
ld (hilvlposhl),hl
ld d,4
cal loadgametype
cal _SET_ABS_DEST_ADDR ;store in mem.
ld hl,0
leveldataSize =$-2
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
+ cal _MM_LDIR_SET_SIZE
cal _LOAD_ABS_SRC_ADDR ;->ahl
ld (hiscrposa),a
ld a,r
ld (Seed),a
+ ld hl,datasingle+3
+ ld b,8
+ ld de,8
+setdeflevels:
+ ld (hl),1 ;def=level#1
+ add hl,de ;next
+ dnz setdeflevels
+
;-----------------------------
;----- build trig tables -----
;-----------------------------
;-----------------------------
DisplayMenu: ;---draw menu---
+ cal linkok
cal _clrWindow
- ld de,$FC42 ;(10,2)
+ ld de,$FC40 ;(0,4)
ld hl,wtPicture
- ld a,16 ;height
-disptitleloop:
- ld bc,8 ;width
+ ld bc,16*16
ldir
- ex de,hl
- ld bc,8 ;next line
- add hl,bc
- ex de,hl
- dec a
- jr nz,disptitleloop
-
+ ld hl,$FC00+$160
+ cal hr
+ ld hl,$FC00+$3E0
+ cal hr
+dispmainmenu:
+ ld hl,Gametype
+ ld a,(hl)
+ dec a ;will be inced @changegame
+ and 7
+ ld (hl),a
+ ld hl,changegame ;dispmenusets ;mainMenu
+ psh hl ;jump here after ret
ld hl,txtMenu
ld ix,posMenu
- ld b,5
+;Mode|Level|Limit|Worms|worm #|controls
+; jr dispmenucommon ;cal
+
+dispmenucommon:
+ ld de,$FD80 ;begin pos
+ ld b,36*16/3
+ xor a
+clroldmenuloop:
+ ld (de),a
+ inc de
+ ld (de),a
+ inc de
+ ld (de),a
+ inc de
+ dnz clroldmenuloop
+
+ ld b,6
dispmenuloop:
ld d,(ix)
inc ix
ld e,(ix)
inc ix
ld (_penCol),de
- cal _vputs ;by Shiar \ Mode \ Level \ Limit \ Worms
+ cal _vputs
dnz dispmenuloop
+; ld b,0 ;b=menu#
+ ret
- ld b,0 ;b=menu#
- jr setgame ;> dispmenusets > mainMenu
+hr: ;draw horizontal line at hl
+ ld b,16
+ jp menuinvloop
;--- menu loop ---
+dispoptionmenu:
+ ld hl,txtoMenu
+ ld ix,posoMenu
+;Back|Lives|Limit|Speed|Rotation|Growth
+ cal dispmenucommon
+
+dispomenusets:
+ cal clrold
+
+ ld hl,$1E3E
+ ld (_penCol),hl
+ cal loadgamecar
+ psh hl
+ cal cshowA ;lives
+
+ ld hl,$2A3E
+ ld (_penCol),hl
+ pop hl ;loadgamecar
+ inc hl \ inc hl \ inc hl
+ psh hl
+ ld a,(hl) ;(Speed)
+ inc a ;1..99
+ jr nz,dispspeed
+ ld hl,txtDef
+ cal _vputs
+ jr dispspeeddone
+dispspeed:
+ cal cshowA
+dispspeeddone:
+
+ ld hl,$363E
+ ld (_penCol),hl
+ pop hl ;loadgamecar
+ inc hl
+ psh hl
+ ld a,(hl) ;(growth)
+ inc a ;-1=None; 0..98->1..99
+ cal cshowA
+
+ ld hl,$303E
+ ld (_penCol),hl
+ pop hl ;loadgamecar
+ inc hl
+ psh hl
+ ld a,(hl)
+ cp 8
+ jr nz,dispturn
+ ld hl,txtDef
+ cal _vputs
+ jr dispturndone
+dispturn:
+ cal cshowA ;turn speed
+dispturndone:
+
+ ld hl,$243E
+ ld (_penCol),hl
+ pop hl ;loadgamecar
+ inc hl
+ ld a,(hl) ;(scorelimit)
+ or a
+ psh af
+ cal cshowA ;limit
+ pop af ;a==0?
+ jr z,optionMenu ;do not display 0 behind 'None'
+ ld a,'0'
+ cal _vputmap ;x10
+
+optionMenu:
+ cal menupos
+ cal menucall
+ jr nz,notoselect
+oselect:
+ cal menupos
+ ld a,b
+ or a ;1st item?
+ jp z,dispmainmenu ;mainMenu
+ jr optionMenu
+notoselect
+ cp K_EXIT
+ jp z,dispmainmenu
+ psh af
+ cal menupos
+ cal loadgamecar
+ inc hl
+ pop af
+ cp K_LEFT
+ jr z,seloleft
+ cp K_RIGHT
+ ld a,b
+ jr nz,optionMenu
+
+seloright:
+ dec a
+ jr z,changelives
+ dec a
+ jr z,changelimit
+ dec a
+ jr z,changespeed
+ dec a
+ jr z,changeturn
+ dec a
+ jr z,changegrowth
+
+seloleft:
+ ld a,b
+ dec a
+ jr z,bchangelives
+ dec a
+ jr z,bchangelimit
+ dec a
+ jr z,bchangespeed
+ dec a
+ jr z,bchangeturn
+ dec a
+ jr z,bchangegrowth
+_optionMenu:
+ jr optionMenu
+
+changelives:
+ cal loadgamecar ;a=(hl)
+ inc a
+ cp 100
+ jr nc,optionMenu ;>99
+changedlives:
+ ld (hl),a
+_dispomenusets:
+ jp dispomenusets ;optionMenu
+bchangelives:
+ cal loadgamecar
+ sub 1 ;dec does not set cf
+ jr c,optionMenu ;<0
+ jr changedlives
+
+changelimit:
+ cal changelimitInit
+ inc a
+ cp 100
+ jr nc,optionMenu ;>99
+changedlimit:
+ ld (hl),a
+ jr _dispomenusets ;optionMenu
+bchangelimit:
+ cal changelimitInit
+ sub 1 ;dec does not set cf
+ jr c,optionMenu ;<0
+ jr changedlimit
+changelimitInit:
+ cal loadgamecar
+ ld de,6
+ add hl,de
+ ld a,(hl) ;(scorelimit)
+ ret
+
+changespeed:
+ cal changespeedInit
+ inc a
+ cp 99
+ jr nc,_optionMenu ;>98
+changedspeed:
+ dec hl ;(Speed)
+ ld (hl),a
+ jr _dispomenusets ;optionMenu
+bchangespeed:
+ cal changespeedInit
+ dec a
+ cp -2
+__optionMenu: ;w/ zf
+ jr z,_optionMenu ;<-1
+ jr changedspeed
+changespeedInit:
+ cal loadgamecar
+ ld de,3
+ add hl,de
+ ld a,(hl) ;(Speed)
+ inc hl ;=saves 2 bytes :P
+ ret
+
+changeturn:
+ cal changespeedInit
+ inc hl ;(turnspeed)
+ ld a,(hl)
+ inc a
+ cp 26
+ jr nc,_optionMenu ;>25
+changedturn:
+ ld (hl),a
+ jr _dispomenusets ;optionMenu
+bchangeturn:
+ cal changespeedInit
+ inc hl
+ ld a,(hl)
+ dec a
+ cp 3
+ jr c,_optionMenu ;<3
+ jr changedturn
+
+changegrowth:
+ cal changespeedInit
+ ld a,(hl)
+ inc a
+ cp 99
+ jr nc,_optionMenu ;>98
+changedgrowth:
+ ld (hl),a
+ jr _dispomenusets ;optionMenu
+bchangegrowth:
+ cal changespeedInit
+ ld a,(hl)
+ dec a
+ cp -2
+ jr z,__optionMenu ;<-1
+ jr changedgrowth
+
+;---
+
mainMenu:
cal menupos
cal menucall
jr nz,notselect
select: ;2nd/enter
+ cal menupos
ld a,b
- dec a ;2nd item?
+ dec a ;2nd item: level
+ jp z,dispoptionmenu
+ sub 3 ;5th item: wormname
jp z,changeworms
- jp LetsGetThisPartyOn ;1/3/4
+ dec a ;6th: controls
+ jp z,changekeys
+ jp LetsGetThisPartyOn ;otherwise
notselect
cp K_EXIT
jp z,ExitNoStats
psh af
cal menupos
+ cal loadgamecar
+ inc hl
pop af
cp K_LEFT
jr z,selleft
dec a
jr z,changelevel
dec a
- jr z,changelives
+ jr z,changelink
+ dec a
+ jr z,changenrworms
; dec a
-; jr z,changenrworms
+; jr z,changecurworm
-changenrworms:
- ld a,(Gametype)
- cp 2
- jr c,mainMenu ;type 0/1
- ld hl,nrworms
- ld a,(hl)
+changecurworm:
+; hl=nrworms
+ ld a,(curworm)
+ cp (hl)
+ jr nc,mainMenu ;may not become >(nrworms)
inc a
- cp 5
- jr nc,mainMenu ;may not be >4
-changednrworms:
- ld (hl),a
- jr dispmenusets ;mainMenu
-
+changedcurworm:
+ ld (curworm),a
+ jr _dispmenusets ;mainMenu
selleft:
ld a,b
dec a
jr z,bchangelevel
dec a
- jr z,bchangelives
+ jr z,bchangelink
+ dec a
+ jr z,bchangenrworms
; dec a
-; jr z,bchangenrworms
+; jr z,bchangecurworm
+
+bchangecurworm:
+ ld a,(curworm)
+ dec a ;0-3
+ jr nz,changedcurworm ;save >0
+ jr mainMenu
+changenrworms:
+ cal change4spOnly
+ ld a,(hl) ;hl=nrworms
+ inc a
+ cp 5
+ jr nc,mainMenu ;may not be >4
+changednrworms:
+ ld (hl),a
+_dispmenusets:
+ jr _dispmenusets ;mainMenu
+changenrwormsInit:
+ ld a,(Gametype)
+ cp 3
+ ld a,(hl) ;hl=nrworms
+ ret
bchangenrworms:
- ld hl,nrworms
- ld a,(hl)
+ cal change4spOnly
+ ld a,(hl) ;hl=nrworms
dec a ;0-3
- jr nz,changednrworms ;save >0
+ cp 2
+ jr nc,changednrworms ;save >=2
_mainMenu:
jr mainMenu
+change4spOnly:
+ ld a,(Gametype)
+ cp 3
+ ret nc
+ pop hl ;cal
+ jr _mainMenu ;don't change for singleplayer
+
+changelink:
+bchangelink:
+ cal change4spOnly
+ dec hl ;inced earlier
+ dec hl ;gameCar
+ ld a,1 ;change LS-bit (=link)
+ xor (hl) ;0=1; 1=0
+ ld (hl),a
+ jr dispmenusets ;mainMenu
+
changegame:
- ld a,0
-Gametype =$-1
+ ld a,(Gametype)
inc a
+ cal changedgame
+ jr z,changegame
+ jr dispmenusets ;mainMenu
changedgame:
and 7 ;mod 8
ld (Gametype),a
-setgame:
- ld a,1
- ld (curlevel),a ;reset level#
- ld hl,nrworms ;reset #worms
- ld a,(Gametype)
- cp 2
- ld (hl),1
- jr c,dispmenusets ;<2=singleplayer
- inc (hl) ;2
- jr dispmenusets ;mainMenu
+ cal getnrlevels
+ xor a
+ cp (hl)
+ ret
bchangegame:
ld a,(Gametype)
dec a
- jr changedgame
-
-changelives:
- cal changelivesInit
- inc a
- cp 100
- jr nc,mainMenu
-changedlives:
- ld (hl),a
+ cal changedgame
+ jr z,bchangegame
jr dispmenusets ;mainMenu
-bchangelives:
- cal changelivesInit
- dec a
- jr z,_mainMenu
- jr changedlives
-changelivesInit:
- cal loadgamecar ;c=(gameCar)
-;a=(hl)=(Gametype+1)=(wormbeglives)
- ld a,(Gametype) ;&&&
- cp 3
- ld a,(hl)
- ret nc ;change lives
- pop hl ;restore stack
- jr _mainMenu ;singleplayer (no limit)
changelevel:
- ld hl,Gametype
- ld d,0
- ld e,(hl)
- ld hl,nrlevels
- add hl,de
- ld d,(hl) ;max level for sel.game
-curlevel =$+1
- ld a,1
- cp d
+ inc hl ;hl=loadgamecar+2
+ psh hl
+ ld a,(hl) ;(curlevel)
+ cal getnrlevels
+ cp (hl) ;max level for sel.game
+ pop hl
jr z,_mainMenu
inc a
changedlevel:
- ld (curlevel),a
+ ld (hl),a
jr dispmenusets ;mainMenu
bchangelevel:
- ld a,(curlevel)
+ inc hl
+ ld a,(hl) ;(curlevel)
dec a
jr nz,changedlevel
-__mainMenu:
jr _mainMenu
+getnrlevels: ;for current gametype at hl
+ ld hl,Gametype
+ ld d,0
+ ld e,(hl)
+ ld hl,nrlevels
+ add hl,de
+ ret
+
+getcustomkey:
+ cal _vputs
+ dec ix
+waitcustomkey:
+ halt \ halt
+ psh hl
+ cal GET_KEY
+ pop hl
+ or a
+ jr z,waitcustomkey
+ cp K_EXIT
+ ret z
+ cp K_MORE
+ jr z,waitcustomkey
+ ld (ix),a
+ ret
+
+changekeys:
+ cal getwormname
+ ld hl,txtKeyleft
+ cal getcustomkey ;left
+ cal getcustomkey ;right
+; jr dispmenusets
+
;---display current settings---
dispmenusets:
- ld hl,$FD95
- ld de,5
- ld a,23
-clroldsettings:
- ld c,11
-clroldsetsloop:
- ld (hl),d ;=0
- inc hl
- dec c
- jr nz,clroldsetsloop
- add hl,de
- dec a
- jr nz,clroldsettings
-
- ld de,$182E
+ cal clrold
+ ld de,$183E
ld (_penCol),de
ld d,0
ld a,(Gametype)
ld (CURtxtGame),hl ;save for g/o
cal _vputs ;Singleplayer
- ld hl,$1E2E ;level
+ ld hl,$2A3E ;worms
ld (_penCol),hl
- ld a,(curlevel)
+ cal loadgamecar
+ inc hl
+ psh hl
+ ld a,(hl)
+ add a,'0'
+ cal _vputmap
+
+ ld hl,$243E
+ ld (_penCol),hl
+ rr c ;(gameCar)
+ ld hl,txtNo
+ jr nc,displink
+ ld hl,txtYes
+displink:
+ cal _vputs
+
+ ld hl,$1E3E ;level
+ ld (_penCol),hl
+ pop hl ;loadgamecar; hl++
+ inc hl
+ ld a,(hl) ;(curlevel)
cal cshowA
- ld hl,$2A2E ;worms
+ ld hl,$3032
ld (_penCol),hl
- ld a,(nrworms)
+ ld a,1
+curworm =$-1
add a,'0'
cal _vputmap
-
- cal loadgamecar
- ld hl,$242E
+ ld hl,$303E
ld (_penCol),hl
- cal cshowA ;liveslimit
- sub '0' ;original A
- ld l,a
- ld a,c
- and _datascore
- ld a,' '
- jr z,limitok
- ld a,'0'
-limitok:
- cal _vputmap ;x10
- jr __mainMenu
+ cal getwormname
+ psh ix ;wormNname
+ pop hl ;ld hl,ix
+ cal _vputs
+ ld hl,$363E ;controls
+ ld (_penCol),hl
+ ld hl,txtMenuR
+ cal _vputs
+ jp mainMenu
;--- handle menukeys ---
dec b
menuupdown:
ld a,b
- and %11 ;4=0;-1=3
+ cp 6
+ jr nz,menunewchk
+ xor a ;6=0
+menunewchk:
+ inc b
+ jr nz,menunewok
+ ld a,5 ;-1=5
+menunewok:
ld b,a
jr menupos
;--- change name ---
-; of worm#(nrworms)
-;or #1 if Gametype<2
-
-changeworms:
- cal _clrWindow
- ld hl,txtName
- cal _puts ;"Enter name player "
- ld a,(Gametype)
- cp 2
- ld a,1
- jr c,wormnrname
-nrworms =$+1
- ld a,1
-wormnrname:
- add a,'0'
- cal _putc
- sub '0'
+; of worm#(curworm)
- ld d,a ;1x
+getwormname: ;of (curworm)
+ ld a,(curworm)
add a,a ;2x
ld e,a
add a,a ;4x
add a,a ;8x
add a,a ;16x
add a,e ;18x
- add a,d ;19x
ld e,a
ld d,0 ;de=a
- ld ix,worm1name-19
+ ld ix,worm1name-18
add ix,de
+ ret
+
+changeworms:
+ cal getwormname
+ psh ix
+ pop hl ;ld hl,ix
+ psh hl
+ ld b,8
+emptyname:
+ ld (hl),' '
+ inc hl
+ dnz emptyname
ld a,maxnamelength
- cal entername
- ld (ix),0
- jp DisplayMenu
-
-entername:
- ld h,1
- ld l,h ;)
- ld (_curRow),hl
ld (namelength),a
enternameloop:
+ ld hl,$FF07 ;begin pos
+ ld a,6 ;nr of lines
+ cal clroldcustom
+ ld hl,$303E
+ ld (_penCol),hl
+ pop hl
+ psh hl
+ ld (ix),0
+ cal __vputs
+ ld (ix),' '
ld a,'_'
- cal _putc
- ld hl,_curCol
- dec (hl)
+ cal __vputmap
nokeypressed:
halt
cal GET_KEY
or a
jr z,nokeypressed
+ ld hl,namelength
cp K_DEL
jr nz,continue
backspace:
- ld hl,namelength
ld a,(hl)
cp maxnamelength
jr nc,nokeypressed
inc (hl)
-
dec ix
- ld a,' '
- ld (ix),a
- cal _putc
- ld hl,_curCol
- dec (hl)
- dec (hl)
jr enternameloop
continue:
cp K_ENTER
- ret z
+ jr z,nameentered
cp K_EXIT
- ret z
-
- ld hl,namelength
- dec (hl)
- ret z
+ jr z,nameentered
+ dec (hl) ;(namelength)
+ jr z,nameentered
ld hl,chartable
ld e,a
ld d,0
ld a,(hl)
or a
jr z,nokeypressed
-
ld (ix),a
- cal _putc
inc ix
cal releasekeys
jr enternameloop
-
chartable:
.db 0,".<>!",0,0,0,0 ;down,L,R,up
.db 0,"XTOJE0",0 ;enter..clear
.db $D9,"-PKFA6'" ;on..alpha
.db "54321*",0,$D0 ;F5..more
+nameentered:
+ pop ix ;stringbegin
+ ld (ix+8),0 ;end mark
+ jp DisplayMenu
+
;--proc
+clrold:
+ ld hl,$FD97 ;begin pos
+ ld a,35 ;nr of lines
+clroldcustom:
+ ld de,7 ;bytes to add
+clroldsettings:
+ ld c,9 ;bytes to clear
+clroldsetsloop:
+ ld (hl),d ;=0
+ inc hl
+ dec c
+ jr nz,clroldsetsloop
+ add hl,de
+ dec a
+ jr nz,clroldsettings
+ ret
+
skiplevel: ;@hl - destr:ab - alter:hl
inc hl
inc hl
ld b,(hl) ;balls
inc b
inc b ;skip 6
- ld a,c
- cp _datasp
+ ld a,(Gametype)
+ cp gamesingle
jr z,skipworms
inc b ;multiplayer lvl
inc b
loadgamecar:
;in: (Gametype)
-;out: Gametype+1=hl
+;out: hl=dataTYPE
;build: c=(gameCar)=(hl-1)
; a=(wormbeglives)=(hl)
;destr: acdehl
ld hl,datasingle
ld a,(Gametype)
add a,a
+ add a,a
+ add a,a ;8 bytes per mode
ld e,a
ld d,0
add hl,de
ld (CheckExit),a ;set exit state
cal loadgamecar
- ld l,a
- ld h,0 ;hl=a
- cal _HLTIMES10 ;hl=10*(hl)
- ld (scorelimit),hl ;set limit
+ psh hl
+ ld (wormbeglives),a
+ inc hl ;nrworms
+ ld a,(hl)
+ ld (nrworms),a
+ inc hl ;level
+ inc hl
+ ld a,(hl)
+ ld (customspeed),a
+ inc hl
+ ld a,(hl)
+ ld (growspeed),a
+ inc hl
+ ld a,(hl)
+ ld (turnleft),a
+ ld (turnright),a ;more efficient
+ inc hl
+ ld l,(hl)
+ ld h,0
+ cal _HLTIMES10 ;hl=10*(hl)
+ ld (scorelimit),hl
- cal loadgamecar ;nc
- ld e,24+1 ;=de
+ pop hl ;loadgamecar
+ psh hl
+ ld a,(Gametype) ;8bytes -> 7bytes
+ ld e,a
+ add a,a ;nc
+ add a,e
+ add a,a ;8->2bytes
+ add a,24+1 ;go to datalevels
+ ld e,a ;=de
sbc hl,de ;datalevels
- ld a,c ;(gameCar)
- and _datasingl
- jr z,notsingle
- ld a,1
- ld (nrworms),a
-notsingle:
- ld a,c
- and _datascore
- jr nz,scorelimitset
- dec a ;ld a,$FF ;=no_limit
- ld (scorelimit),a
-scorelimitset:
-
cal _ldHLind ;ld hl,(hl)
- ld a,(curlevel)
+ pop de ;de=loadgamecar
+ inc de \ inc de
+ ld a,(de) ;(curlevel)
ld (Level),a
ld d,a ;begin level
skiplevelloop:
levelsskipped:
psh hl ;1st level
- ld a,c
- and _datalink
- jr z,GameOver
+ ld a,(gameCar)
+ rra ;and _datalink
+ jr nc,GameOver
linkmatch:
cal _clrWindow
ld hl,txtWaiting
cal _puts
cal Crecv
-; ld a,c
+ ld a,c
cp wormVclient
jr z,client
cp wormVhost
- jr nz,linkiniterror
+ jr z,host
+ pop hl ;error
+ jp DisplayMenu ;return to menu
host:
ld c,wormVclient
cal Qsend
ld a,$18
jr multiplayer
-
-linkiniterror:
- pop hl
- jp DisplayMenu
-
client:
ld hl,txtReceive
cal _puts
-
- ld a,$f6
+ ld a,$E6
multiplayer:
+; cal linkok
+; ld a,D0LD1L
+; out (7),a
ld (SwapPos),a
ld a,2
ld (nrworms),a
;-----------------------------
GameOver:
- cal _clrLCD
ld hl,worm1set
ld de,worm1
ld a,4 ;4x (all worms)
ex de,hl
ld bc,died
add hl,bc
- ld (hl),0 ;died=0
+ ld b,0
+ ld (hl),b ;died=0
inc hl
- ld (hl),0 ;score=0
+ ld (hl),b ;score=0
inc hl
- ld (hl),0 ;score+1=0
+ ld (hl),b ;score+1=0
inc hl
ld (hl),2 ;delay=2
inc hl
dec a ;loop
jr nz,createwormsloop
- pop hl ;begin of current level
-
StartLevel:
+ cal _clrWindow
+ pop hl ;begin of current level
ld de,Left
ld a,(hl)
inc a ;=255?
jp nz,nextlevel
psh hl
+ ld hl,Level
+ dec (hl) ;curlevel-- (not beyond last lvl)
cal releasekeys
- cal _clrWindow
pop hl
;show end msg or smtn
ld bc,Exit
jp (hl) ;go there ("call")
nextlevel:
ldi
+ ld a,0
+customspeed =$-1
+ inc a ;$FF=def
+ jr z,defspeed
+ dec a
+ ld (hl),a ;store new speed
+defspeed:
ld de,Speed
ldi
ld de,peagrowth
#endif
ld hl,worm1
- ld a,(gameCar)
- cp _datasp
+ ld a,(Gametype)
+ cp gamesingle
ld b,1
jr z,worminit
ld b,4
worminit:
- psh bc ; >> 1
+ psh bc ;>1
ex de,hl
- ldi ;d
+ ldi ;d
ld a,SinCosTable/256
ld (de),a
inc de
- ldi ;y
- ldi ;x
+ ldi ;y
+ ldi ;x
ex de,hl
-
xor a
- ld (hl),a ;y2
+ ld (hl),a ;y2
inc hl
- ld (hl),a ;x2
+ ld (hl),a ;x2
ld bc,(worm2-worm1)-5
add hl,bc
- pop bc ; << 0k
+ pop bc ;<0
dnz worminit
+ inc a ;ld a,1
+ ld (turn10),a
+ ld a,2
+ ld (flashtime),a
+
;-------- draw level ---------
ld a,(de)
inc de
sub 128
+ jr nc,setfieldx
+ xor a ;fieldx<128
+setfieldx:
ld (FieldWidth),a
ld a,(de)
inc de
+ ld l,a
sub 57
+ jr nc,setfieldy
+ xor a ;fieldy<57
+setfieldy:
ld (FieldHeight),a
- add a,57-5
psh de ; >> levelp
+ ld a,l ;pop
+ sub 5
ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
add hl,hl
- add hl,hl
+ add hl,hl ;32=scr.width
ex de,hl
ld hl,ScrBuffer
;-----------------------------
psh hl ; >> levelp new
- cal showstats
+ cal forceshowstats
ld a,(gameCar)
and _datafood
jr z,nofood
ld a,0
gameCar =$-1
- and _datalink
- jr z,initfinished ;no link
-
+ rra ;and _datalink
+ jr nc,initfinished ;no link
xor a
- ld (worm2+input),a ;worm 2 via link
- ld (worm2+left),a
- ld (Speed),a ;max.speed
-SwapPos: ;$18 xx -> $F6 xx
- ; jr xx -> or xx
+SwapPos: ;$18 xx -> $E6 xx
+ ; jr xx -> and xx
+ jr sethost
+setclient:
+ ld (worm1+left),a ;worm 1...
+ ld (worm3+left),a ;and worm 3 via link
+ cal Qrecv
+ ld a,c
+ ld (worm2+name+0),a
+ cal Qrecv
+ ld a,c
+ ld (worm2+name+1),a
+ cal Qrecv
+ ld a,c
+ ld (worm2+name+2),a
+ cal Qrecv
+ ld a,c
+ ld (worm2+name+3),a
+ cal Qrecv
+ ld a,c
+ ld (worm2+name+4),a
jr initfinished
- inc a
- ld (worm2+left),a ;1
- ld hl,worm1
- ld de,worm2
- ld b,4 ;+heading +pos
- cal _EXLP ;swap positions
-;&&& over link
- ld hl,worm1+name
- ld de,worm2+name
- ld b,maxnamelength
- cal _EXLP ;swap positions
+sethost:
+ ld (worm2+left),a ;worm 2+4..
+ ld (worm4+left),a ;..over link
+ ld c,'T'
+ cal Qsend
+ ld c,'e'
+ cal Qsend
+ ld c,'s'
+ cal Qsend
+ ld c,'t'
+ cal Qsend
+ ld c,0
+ cal Qsend
initfinished:
ld b,startdelay
;-----------------------------
GameLoop:
- ld bc,(worm1+pos)
- cal DisplayField
+ ld bc,(worm1+pos) ;camera worm #1
+ ld a,(worm1+left)
+ or a ;if #1 not over link
+ jr nz,showfield
+ ld bc,(worm2+pos) ;otherwise view from #2
+showfield:
+ cal DisplayField ;display piece of level
ld a,1
flashtime =$-1
ld (hl),a
inc hl
xor a
- cp h
+ cp h ;end at >$FFFF
jr nz,screeninvertloop
noflash:
jr nz,Delay
NoDelay:
+ ld (handledworm),a ;reset
+
+ ld hl,turn
+ ld a,(hl)
+ inc a ;-1
+ jr z,nextturnok
+ dec (hl)
+ dec a ;0 (now <0)
+ jr nz,nextturnok
+growspeed =$+1
+ ld (hl),$FF
+nextturnok:
+
+ ld a,(gameCar)
+ and _datatime
+ jr z,nodispupdate
+ ld hl,turn10
+ dec (hl)
+ jr nz,nodispupdate ;just once every 10 turns
+ ld (hl),10 ;reset counter
+ cal forceshowstats ;update score
+nodispupdate:
+
+drawctfpea1:
+ jr drawctfpea2
+ ld bc,drawctfpea1
+ ld hl,(peaspos)
+ cal tryDrawPea
+drawctfpea2:
+ jr noctfpeas2draw
+ ld bc,drawctfpea2
+ ld hl,(peaspos+2)
+ cal tryDrawPea
+noctfpeas2draw:
+
+
ld a,0
nrballs =$-1
or a
cal nz,handlethoseneatlittleballs
ld ix,worm1
- ld a,(nrworms)
+ ld a,1
+nrworms =$-1
ld b,a
handleworms:
psh bc
ld bc,worm2-worm1
add ix,bc
pop bc
+ ld hl,handledworm
+ inc (hl) ;1..nrworms
dnz handleworms
;-----------------------------
ld (ix+delay),respawndelay
thislevel =$+1
+ ld hl,0
ld de,0
- ld a,(de)
- inc de
+handledworm =$-2
+ add hl,de
+ add hl,de
+ add hl,de
+ ld a,(hl)
+ inc hl
ld (ix+heading),a
- ld a,(de)
- ld (ix+pos),a
- inc de
- ld a,(de)
- ld (ix+pos+1),a
+ ld a,(hl)
+ ld (ix+pos),a ;y
+ inc hl
+ ld a,(hl)
+ ld (ix+pos+1),a ;x
+ xor a
+ ld (ix+pos2),a ;y2
+ ld (ix+pos2+1),a ;x2
inc (ix+died)
dec (ix+lives)
cal DecScore
pop af
ret nz ;HandleWorm done
+ ld a,(wormbeglives)
+ or a ;0=no live limit
+ ret z ;don't end game
ld a,(gameCar)
- and _datalivel
- ret z
+ and _datatime
+ jr z,anyworm ;quit at any worm's death
+ ld a,(nrworms) ;livematch: all worms must've died
+ ld b,a ;# of worms
+ ld hl,worm1+lives-(worm2-worm1)
+ ld de,worm2-worm1
+ xor a ;check for 0 lives
+checklives:
+ add hl,de ;next worm
+ cp (hl) ;lives==0?
+ ret nz ;any >0: don't exit
+ dnz checklives
+anyworm:
ld a,$A7 ;exit@end of turn
ld (CheckExit),a ;set exit state
ret ;finish turn
#endif
Exit:
+ cal releasekeys
ld sp,0 ;pop all
SpSave = $-2
- ld a,D0HD1H
- out (7),a
+ ld a,D0LD1L
+ out (7),a ;both wires low = game over signal
cal _clrWindow
ld hl,txtGO
cal _puts
+ ld hl,$FC00
+ ld b,16*8
+ cal menuinvloop ;invert
+ inc h ;$FD80
+ cal hr ;menuinvloop w/ b=16
+ ld hl,$FCE0
+ cal hr
+; ld l,$74
+; ld b,8
+; cal menuinvloop
+ ld hl,_curRow
+ inc (hl)
ld hl,txtGame
CURtxtGame =$-2
cal _puts
- ld de,0002
- ld (_curRow),de
+ ld a,$0D ;$0D02
+ ld (_curCol),a
cal showLevel
- ld de,$0B03
+
+ ld de,$1901
+ ld (_penCol),de
+ ld hl,txtName
+ cal _vputs ;Name
+ ld a,$3D
+ ld (_penCol),a
+ cal _vputs ;Died Score
+ ld de,$0004
ld (_curRow),de
- ld hl,txtDied
- cal _puts
- cal _puts ;txtScore
- xor a
- ld (_curCol),a
+
+findwinner:
+ ld hl,(worm1+score)
+ ld (winnerscore),hl
+ ld b,3 ;(nrworms)-1
+ ld hl,worm2+score
+findwinnerloop:
+ psh hl
+ cal _ldHLind
+ ld de,(winnerscore)
+ ld a,h
+ cp d
+ jr c,nonewwinner ;h<d
+ jr nz,newwinner ;h>d
+ ld a,e
+ cp l
+ jr nc,nonewwinner ;l<e
+newwinner:
+ ld (winnerscore),hl
+nonewwinner:
+ pop hl
+ ld de,worm2-worm1
+ add hl,de
+ dnz findwinnerloop
+
+ ld a,(nrworms)
+ ld b,a
+ cpl ;high value (>$FB)
+ ld hl,worm1+died
+finddmwinner:
+ cp (hl)
+ jr c,nonewdmwinner
+ ld a,(hl) ;less deaths
+nonewdmwinner:
+ ld de,worm2-worm1
+ add hl,de
+ dnz finddmwinner
+ ld (dmwinner),a
+
+;---display worms---
ld a,(nrworms)
ld b,a
ld hl,worm1+died
displayWormStats:
psh bc
- psh hl
- ld bc,input-died
- add hl,bc ;+input
+ psh hl
+ ld bc,left-died
+ add hl,bc ;+left
xor a
cp (hl) ;input=0 = link
jr nz,NoLinkIndic
- ld b,7 ;{DOWN}
- inc hl ;+left
- cp (hl)
- jr z,hostLinkIndic
- dec b ;{UP}
-hostLinkIndic:
- ld a,8
+ ld a,9
ld (_curCol),a
- ld a,b
+ ld a,$DC ;-O
cal _putc
xor a
ld (_curCol),a
- dec hl
NoLinkIndic:
- inc hl
inc hl
inc hl ;+name
cal _puts
-
pop hl
+
psh hl
ld a,13
ld (_curCol),a
ld a,(hl) ;worm+died
cal showA
pop hl
- psh hl
- ld a,16
+ psh hl
+ ld a,10
ld (_curCol),a
+ ld a,(Gametype)
+ cp gamedeathm
+ jr nz,nodmwinner ;deathmatch?
+ ld a,0 ;winner's deaths
+dmwinner =$-1
+ cp (hl) ;equals this worm?
+ jr nz,notwinner
+ jr iswinner
+nodmwinner:
+ jr c,notwinner ;no singleplayer winners
inc hl ;worm+score
cal _ldHLind ;ld hl,(hl)
- cal showHL ;worm+score
-
+ ld de,0
+winnerscore =$-2
+ cal _cphlde ;==highest score..
+ jr nz,notwinner
+iswinner:
+ ld a,'*'
+ cal _putc ;..then put *
+notwinner:
+ ld a,16
+ ld (_curCol),a
+ pop hl
+ psh hl
+ inc hl ;worm+score
+ cal _ldHLind
+ cal showHL
pop hl
+
ld bc,worm2-worm1
add hl,bc
pop bc
ld a,(Level)
cp (hl)
jr c,hilevelcheckdone
- ld (hl),a ;save local
+ ld (hl),a ;save local
ld c,a
ld a,0
hilvlposa =$-1
ld a,(gameCar)
and _datasingl
-
- jr z,hiscorecheckdone
+ jr z,hiscorecheckdone ;no SP
checkhiscore:
cal loadhiscoreposinahl
- cal _Get_Word_ahl ;de=old_hi
- psh de
- cal _RAM_PAGE_1 ;&&
- pop de
- ld hl,(worm1+score)
-
- ld a,h ;New
- cp d ;Old
- jr c,NotNewHigh ;New<Old
- jr nz,newhigh ;New>Old
-
- ld a,e ;old
- cp l ;new
- jr nc,NotNewHigh ;new<old
+ cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
+ xor a
+ ld hl,highsave
+ cal _SET_ABS_DEST_ADDR ;to local
+ ld hl,5 ;5 bytes
+ cal _MM_LDIR_SET_SIZE ;get old score+name
+ cal _RAM_PAGE_1
-newhigh: ;New>=Old
- ex de,hl
+ ld de,(highsave) ;de=prev. hiscore
+ ld hl,(worm1+score) ;hl=worm1's score
+ cal _cphlde ;sub hl,de
+ jr c,NotNewHigh ;new<old
+ jr z,NotNewHigh ;new<=old
+newhigh: ;New>Old
+ ld (highsave),hl ;store new hiscore
+ ld de,highsave+2 ;to
+ ld hl,worm1+name ;from
+ ld bc,3 ;3 chars
+ ldir ;store new hiname
cal loadhiscoreposinahl
- cal _Set_Word_ahl ;de->(ahl)
- cal _RAM_PAGE_1
+ cal _SET_ABS_DEST_ADDR ;to ahl
+ xor a
+ ld hl,highsave
+ cal _SET_ABS_SRC_ADDR ;from local
+ ld hl,5
+ cal _MM_LDIR_SET_SIZE ;save new
+ cal _RAM_PAGE_1
-NotNewHigh: ;de=current hiscore
- ld hl,$0807
- ld (_curRow),hl
+NotNewHigh:
+ ld hl,$3149
+ ld (_penCol),hl
ld hl,txthiscore
+ cal _vputs
+ ld hl,$0C07
+ ld (_curRow),hl
+ ld hl,highsave+2
cal _puts
- ex de,hl ;pop
+ ld hl,(highsave)
cal showHL
hiscorecheckdone:
- cal releasekeys
waitkey:
halt
halt
jr nz,waitkey
;x123456789012345678901
-;1----- GAME OVER -----
+;>>>>>> GAME OVER <<<<<
;2Multiplayer
;3Level 01
;4 Died Score:
;8Snaky @ 00 04820
ExitNoStats:
+ cal linkok
ld hl,_asapvar
rst 20h ;_ABS_MOV10TOOP1
rst 10h ;_FINDSYM
ld hl,savestart
cal _SET_ABS_SRC_ADDR
ld hl,saveend-savestart
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
+ cal _MM_LDIR_SET_SIZE
cal releasekeys
res 4,(iy+9)
jp _clrWindow
loadhiscoreposinahl:
- ld a,(Level)
- ld b,a
-
- ld h,0 ;hl=
- ld a,(nrlevels+1) ;# peaworm lvls
- add a,a
- ld l,a
-
+ ld hl,0 ;for peaworm and singleplayer
ld a,(Gametype)
- dec a
- ld c,a
- dec a ;z=(Gametype)=2
- jr z,tronhi
- ld l,h ;hl=0
-tronhi:
-
- xor a ;ahl=0(+x)
- psh bc
+ or a ;Singleplayer?
+ jr z,hi__
+ dec a ;peaworm?
+ jr z,hi_
+ ld a,(nrlevels+1) ;skip peaworm slots if tron mode
+hi_:
+ ld bc,(Level)
+ add a,c
+ ld b,a ;levels to skip (including 1 for singleplayer)
+addlevelposition:
+ inc hl
+ inc hl ;add one word per level
+ inc hl
+ inc hl
+ inc hl ;plus 3 bytes for name
+ dnz addlevelposition
+hi__:
+ xor a ;ahl=0(+hl)
ld bc,defhiscrpos
hiscrposhl =$-2
add hl,bc
- pop bc
- adc a,0
-hiscrposa =$-1 ;ahl=saveloc
-
- inc c
- ret z ;(Gametype)=0
-addlevelposition:
- cal _AHL_PLUS_2_PG3
- dnz addlevelposition
+hiscrposa =$+1
+ adc a,0 ;ahl=saveloc
ret
+highsave:
+ .db 0,0,"WOR ",0
;-----------------------------
;----------- worm ------------
respawndue:
ld l,a
cal inputcall
- ld (sendbyte),a
ld a,h ;previous
cp l ;changed?
ret z
saverespawncounter:
ld (ix+delay),a
jr inputcall
-; ld a,(ix+input)
-; or a
-; jr z,inlink
-; ret
-inkeys: ;use jp not call!
- out (1),a ;nop\nop
- in a,(1)
+chkkey: ;key=a
+ dec a
ld b,a
- and (ix+right)
- jr z,notright
+ srl b
+ srl b
+ srl b ;b=a/8
+ and 7 ;a=a\8
+ ld c,a ;push keybit
+ ld a,-1
+ out (1),a
+ inc b
+ ld a,%01111111 ;default
+bitmask:
+ rlca ;rotate left
+ dnz bitmask ;a/8 times
+ out (1),a ;send bitmask
+ in a,(1) ;input keys
+ ld b,c ;pop keybit
+ inc b
+keybit:
+ rra
+ dnz keybit ;check match (cf set)
+ ret
+
+inkeys: ;use jp not call!
+ cal chkkey
+ jr nc,notright
ld a,l
add a,8
+turnright =$-1
ld l,a
notright:
- ld a,b
- and (ix+left)
- ret z
+ ld a,(ix+right)
+ cal chkkey
+ ret nc
ld a,l
sub 8
+turnleft =$-1
ld l,a
ret
-
inputcall:
- ld a,(ix+input)
+ ld a,(ix+left)
or a
- jr nz,inkeys
-
-inlink:
- ld b,(ix+left)
- dec b
- jr z,receivefirst
- psh hl
- ld c,0
-sendbyte =$-1
- cal Csend
- cal Crecv
- pop hl
- ld l,c
- ret
-receivefirst:
- psh hl
- cal Crecv
- pop hl
+ jr z,inlink ;input by link
+ cal inkeys ;input by keys
+ ld a,(gameCar)
+ rra ;and _datalink
+ ret nc ;no link
+ ld c,l ;send our keys
+ jp Qsend
+inlink:
+ cal Qrecv ;Crecv
ld l,c
- psh hl
- ld a,(sendbyte)
- ld c,a
- cal Csend
- pop hl
ret
;------- handle worm ---------
HandleWorm:
+ xor a
+ cp (ix+lives)
+ jr nz,alive
+ ld a,(wormbeglives)
+ or a
+ ret nz ;live limit
+alive:
ld a,(ix+delay)
dec a
jp nz,respawncheck
- ld a,(Gametype)
- cp gametron
- jr nz,notron
+ xor a
+ cp 0
+turn =$-1
+ jr nz,nogrow
+ inc (ix+grow)
+nogrow:
+
+ ld a,(gameCar)
+ and _datatime
+ jr z,notimescore
ld de,1
cal IncScore
-notron:
+notimescore:
ld l,(ix+heading)
cal inputcall
donediddelydone:
- ld a,l
- ld (sendbyte),a
ld (ix+heading),l
ld h,(ix+heading+1)
Hitworm:
ld a,(gameCar)
ld h,a
+#ifdef optdie
and _datadie
cal z,checkhitotherworm
ld a,h
+#endif
and _datamultpeas ;&&bit
- jr nz,multiple_peas
+ jr nz,chkctfpeas
ld a,h
and _datafood
jp z,WormDead ;no food
cal removeworm
pop hl ; << call
pop hl ; << call
- pop hl ; << levelp new
ld (ix+delay),2
jp StartLevel
-chkpeahit: ;hl=peapos
+chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
ld a,(sprsize)
inc a
ld d,a
cp d
ret ;c=pea
-flagcaptured:
- psh hl
- ld de,30
- cal IncScore
- pop hl
-sillylabel:
- cal WormDead
-DrawAllPeas:
- ld hl,(peaspos)
- cal DrawPea
- ld hl,(peaspos+2)
- jp DrawPea
-
-multiple_peas:
+chkctfpeas:
ld hl,(peaspos) ;1st pea
- psh hl
ld a,(ix+reserv)
ld e,a ;push a
- and %01
- jr nz,sel_ownpea
- ld hl,(peaspos+2) ;2nd pea
-sel_ownpea:
- cal chkpeahit
- pop hl ;(peapos) 1st pea
- jp c,stopworm ;own pea hit
-
- ld a,e ;peek a (that x86 asm for pop\push ;)
- and %01
+ and %01 ;ourpea (0|1)
jr z,sel_otherpea
- ld hl,(peaspos+2) ;2nd pea
+ ld hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
sel_otherpea:
cal chkpeahit
- jp c,hitflag
-
-;no peas hit
- ld a,e
- cal flagtoken
- jp z,WormDead
- ld b,a ;%10
- srl b ;%01
- add a,b ;%11
+ jr c,hitflag
+;no peas hit:
+ ld a,e ;peek a (that's x86asm for pop\push ;)
+ bit 1,a ;%10 = carrying flag?
+ jp z,WormDead ;if not just die
+ xor %11 ;drop flag
ld (ix+reserv),a
- cal DrawPea ;restore own flag
- jr sillylabel ;inv both\die
+ psh af
+ cal WormDead
+ pop af ;which flag? (=and %1)
+ ld hl,drawctfpea1 ;restore #1
+ jr z,nottheotherflag
+ ld hl,drawctfpea2 ;restore #2
+nottheotherflag:
+ ld (hl),$E6 ;and nn
+ ret
hitflag: ;correct pea hit
ld a,e ;pop a
- xor %01 ;0=1;1=0
+ xor %11 ;invert flag taken + ownflag
ld (ix+reserv),a
- cal flagtoken
+ and %10 ;just returned?
psh af ;safe z-flag
cal DrawPea ;remove
pop af
- jr z,flagcaptured
- jr stopworm
+ jr nz,Drawworm ;flag taken, continue game
+ psh hl
+ ld de,20 ;flag captured+returned
+ cal IncScore
+ pop hl
+ ld a,$E6 ;and nn
+ ld (drawctfpea1),a ;redraw..
+ ld (drawctfpea2),a ;..both flags
+ jr Drawworm
-flagtoken:
- and %01 ;current
- add a,a ;<< for cp
- ld b,a ;in b
- ld a,e
- and %10 ;own
- cp b ;same?
- ret ;Z=yes: no flag taken
+DrawAllPeas:
+ ld hl,(peaspos)
+ cal DrawPea
+ ld hl,(peaspos+2)
+ jp DrawPea
;-----------------------------
ld (ix+reserv),a
ret
+#ifdef optdie
checkhitotherworm:
.db $dd,$7d ;ld a,lx
cp worm2&255
pop ix
ret z ;not hit
pop bc ;call
+#endif
stopworm:
ld bc,0
previouspos =$-2
ld b,(ix+pos+1)
ld a,(Gametype)
- ld d,a
cp gamerace
cal z,checkhitlapline
cal set4pixels
dec c
- ld a,d
- cp gametron
+ ld a,(growspeed)
+ or a ;0=tron
ret z ;keep tail in "Tron"
ld l,(ix+head)
add a,2
ret
-NewPea:
- ld a,(FieldWidth)
- add a,127-4
- cal randompos
- ld h,a
- ld a,(FieldHeight)
- add a,56-4
- cal randompos
- ld l,a
- ld (PeaY),hl
-
-CheckPea:
+CheckPea: ;@hl; destr:abcde
ld c,l
ld a,(sprsize)
ld e,a
cal FindPixel
and (hl)
pop hl
- jr nz,NewPea ;pixel found
+ ret nz ;nz=pixel found
inc b
dec d
jr nz,chkloopx
inc c
dec e
jr nz,chkloopy
-;all ok; empty space
+ ret ;z=empty space
+
+tryDrawPea: ;hl=peapos;bc=dopea
+ psh bc
+ cal CheckPea
+ pop bc
+ ret nz ;unsuccesful
+ ld a,$18 ;jr
+ ld (bc),a
+ jr DrawPea
+NewPea:
+ ld a,(FieldWidth)
+ add a,127-4
+ cal randompos
+ ld h,a
+ ld a,(FieldHeight)
+ add a,56-4
+ cal randompos
+ ld l,a
+ ld (PeaY),hl
+ cal CheckPea
+ jr nz,NewPea
DrawPea: ;hl=(PeaY)
ld b,h
ld c,l
ld de,0
spritepos =$-2
- jp PutSprite ;||-ed
+; jp PutSprite
+
+PutSprite: ;||@(b,c)
+ ;by SHIAR only ix saved
+ cal FindPixel
+ ld (beginbit),a
+ ld a,0
+sprsize =$-1
+ ld b,a ;rows
+sprloopy:
+ psh bc ;rows
+ psh hl
+ ld a,(de)
+ ld c,a
+ inc de
+ ld a,(sprsize)
+ ld b,a ;width
+beginbit =$+1
+ ld a,1
+sprloopx:
+ sla c ;draw?
+ jr nc,sprnodraw
+ psh af
+ xor (hl)
+ ld (hl),a
+ pop af
+sprnodraw:
+ rrca ;next bit
+ jp nc,nextbitok
+ inc hl ;next byte
+nextbitok:
+ dnz sprloopx
+
+ pop hl
+ ld bc,32 ;next line
+ add hl,bc
+ pop bc
+ dnz sprloopy
+ ret
;----------- score -----------
ld (ix+score),l
ld de,0
scorelimit =$-2
- inc e
- jr z,showstats ;de=$FF??=no limit
- dec e
+ ld a,d
+ or e
+ jr z,showstats ;de=0=no limit
cal _cphlde
jp nc,Exit
showstats:
+ ld a,(gameCar)
+ and _datatime
+ ret nz ;no disp for timematches
+forceshowstats:
psh ix
ld h,0
ld l,h
ld b,a
ld ix,worm1
ld a,(gameCar)
- and _datanextl
+ and _datasingl
jr nz,showstatsS
showstatloop:
psh bc
+#ifdef longnames
+ ld b,3
+ psh ix
+shownameloop: ;1st 3 chars
+ ld a,(ix+name)
+ or a
+ jr z,nameshown
+ cal __vputmap
+ inc ix
+ dnz shownameloop
+nameshown:
+ ld a,':'
+ cal _vputmap
+ pop ix
+#else
+ ld a,(ix+name)
+ cal __vputmap
+ ld a,':'
+ cal __vputmap
+#endif
cal showstat
ld de,worm2-worm1
- add ix,de
+ add ix,de ;next
ld hl,_penCol
ld a,(hl)
- add a,10
+ add a,4 ;div
ld (hl),a
pop bc
dnz showstatloop
pop ix
ret
-showstat:
- ld a,(gameCar)
- and _datascore
+showstat: ;(multiplayer)
+ ld a,(Gametype)
+ cp gamedeathm
jr z,showlives
showscore:
ld h,(ix+score+1)
ld l,(ix+score)
cal _D_HL_DECI
- jr __vputs
+ jr __vputs
showlives:
- ld a,(Gametype)
- cp gametron
- jr z,showscore
-
ld a,(ix+lives)
add a,'0'
__vputmap:
pop ix
ret
-showstatsS:
+showstatsS: ;(singleplayer)
ld hl,txtLevel
cal __vputs
ld a,0
jp _putc
cshowA:
+ or a
+ jr nz,cshowavalue
+ ld hl,txtNone
+ jp _vputs
+cshowavalue:
ld l,a
ld h,0
cal _divHLby10
pop de
ret
-;--- sprite ---
-
-PutSprite: ;||@(b,c)
- ;by SHIAR only ix saved
- cal FindPixel
-putspr:
- ld (beginbit),a
- ld a,0
-sprsize =$-1
- ld b,a ;rows
-sprloopy:
- psh bc ;rows
- psh hl
- ld a,(de)
- ld c,a
- inc de
- ld a,(sprsize)
- ld b,a ;width
-beginbit =$+1
- ld a,1
-sprloopx:
- sla c ;draw?
- jr nc,sprnodraw
- psh af
- xor (hl)
- ld (hl),a
- pop af
-sprnodraw:
- rrca ;next bit
- jp nc,nextbitok
- inc hl ;next byte
-nextbitok:
- dnz sprloopx
-
- pop hl
- ld bc,32 ;next line
- add hl,bc
- pop bc
- dnz sprloopy
- ret
-
;--- objects ---
drawstuff:
psh hl
ld l,(hl)
ld h,b
+ cal drawsmtn
+ pop hl
+ inc hl
+ jr drawstuff
+drawsmtn:
dec a ;1 = line
- cal z,drawline
+ jp z,drawline
dec a ;2 = fatline
- cal z,drawfatline
+ jp z,drawfatline
dec a ;3 = box
- cal z,drawbox
-
- pop hl
- inc hl
- jr drawstuff
+ jp z,drawbox
+ dec a ;4 = circle
+ jp z,drawcircle
+ dec a ;5 = hline
+#ifdef hlines
+ jp z,drawhline
+#else
+ jp z,drawline
+#endif
drawbox: ;(d,e)-(h,l)
ld b,l ;Delta-y
+#ifdef hlines
+boxloop:
+ cal drawhline
+ inc e
+ dnz boxloop
+ ret
+drawhline: ;(d,e)-(h,e)
+ psh bc
+ ld b,d
+ ld c,e
+ psh hl
+ cal FindPixel
+ ld c,a ;starting mask
+ ld a,h
+ sub b
+ ld b,a
+ inc b ;1+x2-x1
+hlineloop:
+ ld a,(hl)
+ or c
+ ld (hl),a
+ rrc c ;mask >>
+ jr nc,hlinenext
+ inc hl ;next byte
+hlinenext:
+ dnz hlineloop
+ pop hl
+ pop bc
+ ret
+#else
ld l,e
boxloop:
cal drawline
inc e
dnz boxloop
ret
+#endif
drawfatline:
cal drawline
;LINE (d,e)-(h,l)
;destroyes a
-drawline:
- psh bc
+drawline: ;(d,e)-(h,l)
+ psh bc ;destr: a
psh hl
psh de
ld a,d
dnz LineLoopSteep
jr DoneLine
+drawcircle: ;(d,e),h ;de=x,y; h=z
+ ld c,h ;c=yy=z
+ ld a,h
+ neg
+ ld l,a ;l=-z
+ xor a
+ ld b,a ;b=xx=0
+ dec a ;-$00**
+ ld h,a ;hl=zz=-z
+circloop:
+ psh de ;x,y
+ ex (sp),hl ;push zz \ pop x,y
+ cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy)
+ ;(x-xx,y-yy)-(x+xx,y-yy)
+ cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx)
+ ;(x-yy,y-xx)-(x+yy,y-xx)
+
+ ex (sp),hl ;push x,y \ pop zz
+ xor a
+ ld d,a ;d=0
+ dec a ;-256<h<0 = $FF**
+ cp h ;h<0?
+ jr z,circlenext ;jump if zz<0
+
+ ld a,c ;yy
+ dec a ;89<a<128
+ add a,a ;a=2yy-2 ;nc
+ ld e,a ;de=a
+ sbc hl,de ;zz=zz-2yy+2
+ dec c ;yy--
+circlenext:
+ ld a,b ;xx
+ inc a ;0<a<92
+ add a,a ;2xx+2
+ inc a
+ ld e,a ;de=a
+ add hl,de ;zz=zz+2xx+3
+
+ pop de ;x,y
+ ld a,b
+ cp c
+ ret nc ;xx>=yy
+ inc b ;xx++
+ jr circloop
+
+circledraw: ;destr:de
+ psh hl
+ ld a,h ;hl=x,y
+ sub b ;bc=xx,yy
+ ld d,a ;d=x-xx
+ add hl,bc ;h=x+xx; l=y+yy
+ ld e,l ;e=y+yy
+ cal drawline ;(h-b,l+c)-(h+b,l+c)
+ ld a,l
+ sub c ;a=y again
+ sub c
+ ld l,a ;l=y-yy
+ ld e,l ;e=l=y-yy
+ cal drawline ;(h-b,l-c)-(h+b,l-c)
+ ld a,b ;swap xx and yy
+ ld b,c
+ ld c,a ;ex b,c
+ pop hl
+ ret
+
+
;-----------------------------
;----------- link ------------
;-----------------------------
-timeout = $800
+linkok:
+ ld a,D0HD1H
+ out (7),a ;raise both wires = link ok
+ ret
+
+timeout = $8000
+lossout = 20
-checklink:
- dec de
+checklink: ;load wires in A and check for timeout
+ dec de ;decrease timer
ld a,d
or e
- jr z,linkerror
-
- ld a,$BF
- out (1),a
- in a,(1)
- bit 6,a
- jp z,Exit
-
+ jr nz,linkfine ;ok if de>0
+;de==0 = timeout
+ cal linkok
+ ld a,0 ;losses so far
+linklosses =$-1
+ inc a ;and this is another one
+ ld (linklosses),a
+ pop de ;return from link
+ cp lossout ;quit if too many errors
+ ret c ;otherwise just continue
+linkerr:
+ jp Exit
+linkfine:
in a,(7)
and %11
ret
-linkerror:
- scf
- ld a,%11
- pop hl
- ret
-
;--------------
;---- SEND ----
;--------------
-Csend: ;--- send 8 bits in A --- destr:abcdehl ---
- ld c,a
-Csendloop:
+Csend:
+ ld b,32
+csendwait:
+ nop
+ dnz csendwait
cal Qsend
- ret nc ;NC = all ok
- ld a,D0HD1H
- out (7),a ;both high
- jr Csendloop ;CF = error
+ jr c,Csend
+ ret
-Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcdehl ---
- ld de,timeout
- cal checklink
- cp %11 ;are they?
- scf
- ret nz ;nope, wait
+Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde
+ nop \ nop
+ in a,(7)
+ and %11 ;both wires low = exit signal
+ jr z,linkerr ;error otherwise
ld b,8 ;bits to send
sendloop:
ld de,timeout
cal checklink
cp %11 ;both raised (by other calc)
jr nz,sendfinish
- nop \ nop
+; nop \ nop
dnz sendloop ;repeat for all bits
xor a ;nc...
+ ld (linklosses),a ;reset number of losses
ret ;=ok
;--------------
Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl ---
cal Qrecv
ret nc ;return if all went ok
- ld a,D0HD1H
- out (7),a ;raise both on error
jr Crecv ;and try again
-Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcdehl ---
- ld de,timeout
- cal checklink
- jp z,Exit ;both low = error, quit
- cp %11
- scf
- ret z ;both high = nothing yet, wait
+Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde ---
+ in a,(7)
+ and %11
+ jr z,linkerr ;both low = error, quit
ld b,8 ;bits to receive
recvloop:
ld de,timeout
recvfinish:
dnz recvloop ;repeat for all bits
xor a ;nc=no error
- ld a,c ;result in a
+ ld (linklosses),a ;reset number of losses
ret
+
;-----------------------------
;---------- levels -----------
;-----------------------------
.db 0,2,63 ;start d, y, x
.db 128,57 ;field width (128-255), height (57-255)
.db 0 ;no additional lines, boxes
-
.db 255
ret
.db 128,57
.db 0
-LevelDefT:
+ .db 8,5,18,12,0,0
+ .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+ .db 128,57
+ .db 4,40,26,20,0
+ .db 4,90,40,11,0,0
+
+LevelDefT: ;tron=no delay
+ .db 8,4,18,12,5
+ .db %1110000,%10001000,%10001000,%10001000,%1110000,0
+ .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
+ .db 128,57
+ .db 0
+
+LevelDefC: ;ctf
.db 8,4,18,12,5
.db %1110000,%10001000,%10001000,%10001000,%1110000,0
.db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
.db 128,57
+ .db 10,10,50,50
.db 0
;-----------------------------
;---------- data -------------
;-----------------------------
+wdPicture = 16
wtPicture:
-.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
-.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
-.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
-.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
-.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
-.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
-.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
-.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
-.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
-.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
-.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
-.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
-.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
-
-txtMenu: .db "by Shiar",0
- .db "Mode",0
- .db "Level",0 ;4th menu item
- .db "Limit",0 ;3rd
- .db "Worms",0 ;2nd
-posMenu: .dw $0D5A,$1418,$131E,$1524,$0F2A
-txtGame: .db "Singleplayer",0 ;0 (1st)
-txtGame1: .db "Peaworm",0 ;1 (next 1st)
-txtGame2: .db "Tron",0 ;2
-txtGame3: .db "Deathmatch",0 ;3
-txtGame4: .db "Foodmatch",0 ;4
-txtGame5: .db "LinkMatch",0 ;5
-txtGame6: .db "Race",0 ;6
-txtGame7: .db "CTF",0 ;7
-; .db "Domination",0 ;8
-posGame: .db 0,txtGame1-txtGame
- .db txtGame2-txtGame
- .db txtGame3-txtGame
- .db txtGame4-txtGame
- .db txtGame5-txtGame
- .db txtGame6-txtGame
- .db txtGame7-txtGame
-
-txtLevsel: .db $CF," Select levels: ",5,0
-txtName: .db "Enter name player ",0
+.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000
+.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000
+.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000
+.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000
+.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000
+.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000
+.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011
+.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100
+.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101
+.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101
+.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011
+
+txtMenu: .db "Mode",0 ;1st menu item
+ .db "Level",0 ;2nd
+ .db "Link",0 ;...
+ .db "Worms",0
+ .db "worm #",0
+ .db 0
+posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936
+txtMenuR: .db "controls",0
+txtoMenu: .db "Back",0 ;1st menu item
+ .db "Lives",0 ;2nd
+ .db "Limit",0 ;...
+ .db "Speed",0
+ .db "Rotation",0
+ .db "Growth",0
+posoMenu: .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+txtGame: .db "Singleplayer",0
+txtGame1: .db "Peaworm",0
+txtGame2: .db "Tron",0
+txtGame3: .db "Deathmatch",0
+txtGame4: .db "Foodmatch",0
+txtGame5: .db "Timematch",0
+txtGame6: .db "Race",0
+txtGame7: .db "CTF" ;,0
+
+posGame: .db 0
+ .db txtGame1-txtGame
+ .db txtGame2-txtGame
+ .db txtGame3-txtGame
+ .db txtGame4-txtGame
+ .db txtGame5-txtGame
+ .db txtGame6-txtGame
+ .db txtGame7-txtGame
+
+txtNone: .db "None",0
+txtDef: .db "Default",0
+txtYes: .db "Yes",0
+txtNo: .db "No",0
+txtKeyleft: .db ":left",0
+txtKeyright:.db "/right",0
+txtLevsel: .db $CF," Select levels ",5,0
txtWaiting: .db "Waiting...",0
txtReceive: .db "Receiving..." ;,0
.db 127
txtLevel: .db "Level ",0
-txtWorms: .db "Worms: 0",0 ;follows txtLevel
-txtDied: .db "Died ",0
-txtScore: .db "Score",0 ;follows txtDied
-txtLeft: .db " left",0 ;follows txtScore
+txtWorms: .db "Worms: 0",0 ;follows txtLevel
+txtName: .db "Name",0
+txtWinner: .db "Wins " ;follows txtName
+txtDied: .db "Died " ;follows txtWinner
+txtScore: .db "Score",0 ;follows txtDied
+txtLeft: .db " left",0 ;follows txtScore
txthiscore:.db "HiScore:",0
txtReady: .db "Prepare!",0
txtposReady = 7
-txtGO: .db "----- GAME OVER -----",0
-
-_datalink = %00000001 ;linkplay
-_datalivel = %00000010 ;lives=0 limit
-_datafoodl = %00000100 ;left=0 limit
-_datanextl = %00001000 ;next level if left=0
-_datasingl = %00001000 ;singleplayer=1
- ;1=hiscore+keep_length
-_datafood = %00010000 ;food present
-_datadie = %01000000 ;worm dies on impact
-_datascore = %10000000 ;score>=100 limit
-_datamultpeas = %00100000
-_datasp = %01011110
+txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
datalevels: .dw LevelDef, LevelDefM
.dw LevelDefT,LevelDefM
.dw LevelDefM,LevelDefM
- .dw LevelDefM,LevelDefM
-nrlevels: .db 1,2,2,2,2,2,2,1 ;=defaults
-
-savestart:
-
-gamesingle = 0
-datasingle: .db %01011110,3 ;3 lives (<must b unique)
+ .dw LevelDefM,LevelDefC
+nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults
+
+_datalink = %0000001 ;linkplay
+_datafoodl = %0000010 ;left=0 limit
+_datasingl = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
+_datamultpeas = %0001000 ;multiple peas=1
+_datatime = %0010000 ;time incs score (timematch)
+_datafood = %0100000 ;food present
+_datadie = %1000000 ;worm dies on impact
+;reserved %10000000 ;for future use
+
+savestart: ; �game info (see above)
+ ; | �lives (0=unlimited)
+ ; | | �nrworms (can be altered by user)
+ ; | | | �level (reset to 1 at startup)
+ ; | | | | �speed/delay (-1=def)
+ ; | | | | | �grow speed (-1=none; 0=continuous)
+ ; | | | | | | �turn speed (8=def)
+ ; | | | | | | | �score limit (0=none)
+gamesingle = 0 ;used | | | | | | | |
+datasingle: .db %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
gamepeas = 1
-datapeas: .db %01011010,1 ;1 "
+datapeas: .db %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
gametron = 2
-datatron: .db %01000010,1
-gamedeathm = 3
-datadeathm: .db %01000010,3
+datatron: .db %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+gamedeathm = 3 ;used
+datadeathm: .db %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
gamefoodm = 4
-datafoodm: .db %11010000,10 ;10 score limit (=100)
-gamelinkm = 5
-datalinkm: .db %01000011,3
-gamerace = 6
-datarace: .db %10000000,10
-gamectf = 7
-datactf: .db %11100000,9
-;gamedomin = 8
-;datadomin: .db %01100000,3 ;==(8 modes)
+datafoodm: .db %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+gametimem = 5
+datatimem: .db %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
+gamerace = 6 ;used
+datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
+gamectf = 7 ;used
+datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
worm1set: .dw worm1p,worm1p
- .db %11110111,%00,%01111110,%10,%100 ;< >
-worm1name: .db "worm #01",0
+ .db %11110111,%00,-01,K_RIGHT,K_LEFT
+worm1name: .db "WORMY ",0
worm2set: .dw worm2p,worm2p
- .db %11111011,%11,%00111111,%10000,%1000 ;f1 f2
-worm2name: .db "worm #02",0
+ .db %11111011,%01,-01,K_F2,K_F1
+worm2name: .db "VIPER ",0
worm3set: .dw worm3p,worm3p
- .db %11111011,0,%01011111,%10,%100 ;sto ,
-worm3name: .db "worm #03",0
+ .db %11111011,%00,-01,K_COMMA,K_STO
+worm3name: .db "NIBBLER ",0
worm4set: .dw worm4p,worm4p
- .db %11111011,0,%01111101,%10,%1 ;enter +
-worm4name: .db "worm #04",0
+ .db %11111011,%01,-01,K_PLUS,K_ENTER
+worm4name: .db "JIM ",0
defhiscrpos:
- .dw 0,0,0,0,0
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+
+Gametype: .db 0 ;last gamemode
saveend:
head = 13 ;4B (head=tail)
tail = 15 ;also@next level
storepos = 17
-reserv = 18 ;loop
- ;race:lap
- ;ctf:pea
+reserv = 18 ;loop (race:lap|ctf:pea)
input = 19
left = 20
right = 21
.db " shiar0@hotmail.com",0
defspritesz = 4
-defspriteimg: .db %01100000
- .db %11110000
- .db %11110000
- .db %01100000
+defspriteimg: .db %01100000
+ .db %11110000
+ .db %11110000
+ .db %01100000
deflevels:
- .db 15,"Internal Levels"
+ .db "Internal Levels" ;,0
.db 0,deflevels/256,deflevels&255
templevels: