; 93% = DONE
-; * 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 ;"greys" out the field before starting a level
;#define hlines ;horizontal-line routine for more speed drawing boxes
- ;(doesn't work properly)
-
+ ;^^(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
_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 ;"""" 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
worm4p = $F000 ;-F3FF (400) %11110O00
leveldata = $F400 ;-FA70 (<=671)
-peaspos = $AE01
+turn10 = $AE01
+peaspos = $AE02
;--- temporary
WormTxt:
.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 = 93 ;wormy levels header = "93"
+levelhead2 = 94 ;wormy levels header = "93"
int_handler:
ex af,af'
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
cp K_SECOND-1
jr z,loadlevel
cp K_EXIT-1
- ret z
+ jp z,ExitNoStats
cp K_ENTER-1
jr nz,levselect
; jr z,loadlevel
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 hl,$FC00+$3E0
cal hr
dispmainmenu:
- ld hl,dispmenusets ;mainMenu
+ 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
hr: ;draw horizontal line at hl
ld b,16
-hrloop:
- ld (hl),-1
- inc hl
- dnz hrloop
- ret
+ jp menuinvloop
;--- menu loop ---
or a
jr z,changegame
dec a
- jp z,changelevel ;&&&jr??
+ jr z,changelevel
dec a
-; jr z,changelives
+ jr z,changelink
dec a
jr z,changenrworms
; dec a
dec a
jr z,bchangelevel
dec a
-; jr z,bchangelives
+ jr z,bchangelink
dec a
jr z,bchangenrworms
; dec a
jr mainMenu
changenrworms:
- ld a,(Gametype)
- cp 2
- jr c,mainMenu ;type 0/1
- ;hl=nrworms
- ld a,(hl)
+ 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
+ jr _dispmenusets ;mainMenu
+changenrwormsInit:
+ ld a,(Gametype)
+ cp 3
+ ld a,(hl) ;hl=nrworms
+ ret
bchangenrworms:
- ;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
- jr dispmenusets ;mainMenu
+ cal getnrlevels
+ xor a
+ cp (hl)
+ ret
bchangegame:
ld a,(Gametype)
dec a
- jr changedgame
+ cal changedgame
+ jr z,bchangegame
+ jr dispmenusets ;mainMenu
changelevel:
inc hl ;hl=loadgamecar+2
psh hl
ld a,(hl) ;(curlevel)
- ld hl,Gametype
- ld d,0
- ld e,(hl)
- ld hl,nrlevels
- add hl,de
+ cal getnrlevels
cp (hl) ;max level for sel.game
pop hl
jr z,_mainMenu
jr nz,changedlevel
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
ld hl,$243E
ld (_penCol),hl
rr c ;(gameCar)
- ld hl,txtYes
- jr c,displink
ld hl,txtNo
+ jr nc,displink
+ ld hl,txtYes
displink:
cal _vputs
ld hl,$303E
ld (_penCol),hl
cal getwormname
- ld hl,worm1name-18
- add hl,de
+ psh ix ;wormNname
+ pop hl ;ld hl,ix
cal _vputs
ld hl,$363E ;controls
ld (_penCol),hl
- ld hl,txtMenu6
+ ld hl,txtMenuR
cal _vputs
jp mainMenu
ret
changeworms:
- cal _clrWindow
- ld hl,txtEName
- cal _puts ;"Enter name player "
- ld a,(curworm)
- add a,'0'
- cal _putc
-
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 ;end mark
- 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 de,7 ;bytes to add
ld a,35 ;nr of lines
+clroldcustom:
+ ld de,7 ;bytes to add
clroldsettings:
ld c,9 ;bytes to clear
clroldsetsloop:
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
psh hl ;1st level
ld a,(gameCar)
- and _datalink
- jr z,GameOver
+ rra ;and _datalink
+ jr nc,GameOver
linkmatch:
cal _clrWindow
ld a,$E6
multiplayer:
; cal linkok
- ld a,D0LD1L
- out (7),a
+; 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)
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?
ld hl,Level
dec (hl) ;curlevel-- (not beyond last lvl)
cal releasekeys
- cal _clrWindow
pop hl
;show end msg or smtn
ld bc,Exit
#endif
ld hl,worm1
- ld a,(gameCar)
- cp _datasp
+ ld a,(Gametype)
+ cp gamesingle
ld b,1
jr z,worminit
ld b,4
pop bc ;<0
dnz worminit
+ inc a ;ld a,1
+ ld (turn10),a
+ ld a,2
+ ld (flashtime),a
+
;-------- draw level ---------
ld a,(de)
;-----------------------------
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
SwapPos: ;$18 xx -> $E6 xx
; jr xx -> and xx
setclient:
ld (worm1+left),a ;worm 1...
ld (worm3+left),a ;and worm 3 via link
- cal Crecv
+ cal Qrecv
ld a,c
ld (worm2+name+0),a
- cal Crecv
+ cal Qrecv
ld a,c
ld (worm2+name+1),a
- cal Crecv
+ cal Qrecv
ld a,c
ld (worm2+name+2),a
- cal Crecv
+ cal Qrecv
ld a,c
ld (worm2+name+3),a
- cal Crecv
+ cal Qrecv
ld a,c
ld (worm2+name+4),a
jr initfinished
ld (hl),a
inc hl
xor a
- cp h
+ cp h ;end at >$FFFF
jr nz,screeninvertloop
noflash:
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
ld a,(wormbeglives)
or a ;0=no live limit
ret z ;don't end game
- ld a,(Gametype)
- cp gametron
- jr nz,anyworm ;if not Tron, quit at any worm's death
- ld a,(nrworms)
+ ld a,(gameCar)
+ 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
#endif
Exit:
+ cal releasekeys
ld sp,0 ;pop all
SpSave = $-2
ld a,D0LD1L
ld b,16*8
cal menuinvloop ;invert
inc h ;$FD80
- ld b,16
- cal menuinvloop ;<hr>
+ cal hr ;menuinvloop w/ b=16
ld hl,$FCE0
- ld b,16
- cal menuinvloop ;<hr>
+ cal hr
; ld l,$74
; ld b,8
; cal menuinvloop
ld (_penCol),de
ld hl,txtName
cal _vputs ;Name
- ld a,$4F
+ ld a,$3D
ld (_penCol),a
cal _vputs ;Died Score
ld de,$0004
ld (_curRow),de
+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
+ psh hl
ld bc,left-died
add hl,bc ;+left
xor a
cp (hl) ;input=0 = link
jr nz,NoLinkIndic
- ld a,8
+ ld a,9
ld (_curCol),a
ld a,$DC ;-O
cal _putc
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
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
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 h,0
+ ld hl,0 ;for peaworm and singleplayer
ld a,(Gametype)
- cp 2
- ld l,h ;hl=0 for peaworm and singleplayer
- jr nz,hi_
- ld a,(nrlevels+1)
- ld l,a ;skip peaworm slots for tron mode
-hi_:
or a ;Singleplayer?
- ld b,0 ;offset 0 for SP
jr z,hi__
- ld a,(Level)
+ 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__:
- add hl,hl ;one WORD per hiscore
xor a ;ahl=0(+hl)
ld bc,defhiscrpos
hiscrposhl =$-2
hiscrposa =$+1
adc a,0 ;ahl=saveloc
ret
+highsave:
+ .db 0,0,"WOR ",0
;-----------------------------
;----------- worm ------------
jr z,inlink ;input by link
cal inkeys ;input by keys
ld a,(gameCar)
- and _datalink
- ret z ;no link
+ rra ;and _datalink
+ ret nc ;no link
ld c,l ;send our keys
jp Qsend
inlink:
inc (ix+grow)
nogrow:
- ld a,(Gametype)
- cp gametron
- jr nz,notron
+ ld a,(gameCar)
+ and _datatime
+ jr z,notimescore
ld de,1
cal IncScore
-notron:
+notimescore:
ld l,(ix+heading)
cal inputcall
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,WormDead ;stopworm ;own pea hit
-
- ld a,e ;peek a (that's 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
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 -----------
jp nc,Exit
showstats:
- ld a,(Gametype)
- cp gametron
- ret z
-showstatsEven4tron:
+ 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:
+showstat: ;(multiplayer)
ld a,(Gametype)
- cp gametron
- jr z,showscore
- ld a,(wormbeglives)
- or a ;0=death limit
- jr nz,showlives
+ 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,(ix+lives)
add a,'0'
pop ix
ret
-showstatsS:
+showstatsS: ;(singleplayer)
ld hl,txtLevel
cal __vputs
ld a,0
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
+ jp z,drawbox
dec a ;4 = circle
- cal z,drawcircle
+ jp z,drawcircle
dec a ;5 = hline
#ifdef hlines
- cal z,drawhline
+ jp z,drawhline
#else
- cal z,drawline
+ jp z,drawline
#endif
- pop hl
- inc hl
- jr drawstuff
-
drawbox: ;(d,e)-(h,l)
ld b,l ;Delta-y
#ifdef hlines
ret
-
-
-
-
-
-
;-----------------------------
;----------- link ------------
;-----------------------------
ret
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
.db "Link",0 ;...
.db "Worms",0
.db "worm #",0
-txtMenu6: .db "controls",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 ;...
txtGame4: .db "Foodmatch",0
txtGame5: .db "Timematch",0
txtGame6: .db "Race",0
-txtGame7: .db "CTF",0
-; .db "Domination",0 ;8
-posGame: .db 0,txtGame1-txtGame
+txtGame7: .db "CTF" ;,0
+
+posGame: .db 0
+ .db txtGame1-txtGame
.db txtGame2-txtGame
.db txtGame3-txtGame
.db txtGame4-txtGame
txtKeyleft: .db ":left",0
txtKeyright:.db "/right",0
txtLevsel: .db $CF," Select levels ",5,0
-txtEName: .db "Enter name player ",0
txtWaiting: .db "Waiting...",0
txtReceive: .db "Receiving..." ;,0
txtLevel: .db "Level ",0
txtWorms: .db "Worms: 0",0 ;follows txtLevel
txtName: .db "Name",0
-txtDied: .db "Died " ;follows txtName
+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
txtposReady = 7
txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
-_datalink = %0000001 ;linkplay
-
-_datafoodl = %0000010 ;left=0 limit
-_datanextl = %0000100 ;next level if left=0
-_datasingl = %0000100 ;singleplayer=1 (=hiscore+keep_length)
-_datamultpeas = %0001000 ;multiple peas=1
-_datatime = %0010000 ;time incs score
-_datafood = %0100000 ;food present
-_datadie = %1000000 ;worm dies on impact
-_datasp = %1100110
-
datalevels: .dw LevelDef, LevelDefM
.dw LevelDefT,LevelDefM
.dw LevelDefM,LevelDefM
.dw LevelDefM,LevelDefC
nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults
-savestart: ; �game info
- ; | �lives
+_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 (set to 1 at startup)
- ; | | | | �speed (-1=def)
- ; | | | | | �grow speed (-1=none)
- ; | | | | | | �turn speed
- ; | | | | | | | �score limit
-gamesingle = 0 ; | | | | | | | |
+ ; | | | �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 %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
gametron = 2
datatron: .db %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
-gamedeathm = 3
+gamedeathm = 3 ;used
datadeathm: .db %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
gamefoodm = 4
datafoodm: .db %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
gametimem = 5
-datatimem: .db %1010000,1,2,1,-1,-1, 8,10 ;Timematch (1 live, 100 score)
-gamerace = 6
+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
+gamectf = 7 ;used
datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
worm1set: .dw worm1p,worm1p
.db %11110111,%00,-01,K_RIGHT,K_LEFT
-worm1name: .db "Wormy ",0
+worm1name: .db "WORMY ",0
worm2set: .dw worm2p,worm2p
- .db %11111011,%11,-01,K_F2,K_F1
-worm2name: .db "Viper ",0
+ .db %11111011,%01,-01,K_F2,K_F1
+worm2name: .db "VIPER ",0
worm3set: .dw worm3p,worm3p
.db %11111011,%00,-01,K_COMMA,K_STO
-worm3name: .db "Nibbler ",0
+worm3name: .db "NIBBLER ",0
worm4set: .dw worm4p,worm4p
- .db %11111011,%00,-01,K_PLUS,K_ENTER
-worm4name: .db "Jim ",0
+ .db %11111011,%01,-01,K_PLUS,K_ENTER
+worm4name: .db "JIM ",0
defhiscrpos:
- .dw 0,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: