X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/711d2428b9a29f7c412e208f87f109b9671424a3..ececf2878a429d97287102bc8315f05c8aa423f1:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index b7db1ce..6ed5a09 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -18,18 +18,19 @@ ; 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 @@ -42,10 +43,10 @@ #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 @@ -76,11 +77,12 @@ _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source _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 @@ -109,7 +111,8 @@ worm3p = $B800 ;-BBFF (400) %10111O00 worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) -peaspos = $AE01 +turn10 = $AE01 +peaspos = $AE02 ;--- temporary @@ -139,19 +142,18 @@ start: 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' @@ -245,20 +247,14 @@ _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 @@ -340,7 +336,7 @@ levselect: 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 @@ -378,10 +374,11 @@ skiptitle: 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 @@ -392,8 +389,7 @@ skiptitle: 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 @@ -462,7 +458,12 @@ DisplayMenu: ;---draw menu--- 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 @@ -496,11 +497,7 @@ dispmenuloop: hr: ;draw horizontal line at hl ld b,16 -hrloop: - ld (hl),-1 - inc hl - dnz hrloop - ret + jp menuinvloop ;--- menu loop --- @@ -751,9 +748,9 @@ selright: 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 @@ -776,7 +773,7 @@ selleft: dec a jr z,bchangelevel dec a -; jr z,bchangelives + jr z,bchangelink dec a jr z,bchangenrworms ; dec a @@ -789,48 +786,71 @@ bchangecurworm: 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 @@ -845,6 +865,14 @@ bchangelevel: 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 @@ -899,9 +927,9 @@ dispmenusets: 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 @@ -921,12 +949,12 @@ curworm =$-1 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 @@ -1011,62 +1039,54 @@ getwormname: ;of (curworm) 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 @@ -1074,14 +1094,11 @@ continue: 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 @@ -1091,12 +1108,18 @@ chartable: .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: @@ -1122,8 +1145,8 @@ skipsprite: 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 @@ -1160,7 +1183,7 @@ skipobjects: loadgamecar: ;in: (Gametype) -;out: Gametype+1=hl +;out: hl=dataTYPE ;build: c=(gameCar)=(hl-1) ; a=(wormbeglives)=(hl) ;destr: acdehl @@ -1237,8 +1260,8 @@ levelsskipped: psh hl ;1st level ld a,(gameCar) - and _datalink - jr z,GameOver + rra ;and _datalink + jr nc,GameOver linkmatch: cal _clrWindow @@ -1266,8 +1289,8 @@ client: 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 @@ -1277,7 +1300,6 @@ multiplayer: ;----------------------------- GameOver: - cal _clrLCD ld hl,worm1set ld de,worm1 ld a,4 ;4x (all worms) @@ -1303,8 +1325,9 @@ wormbeglives =$-1 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? @@ -1314,7 +1337,6 @@ StartLevel: ld hl,Level dec (hl) ;curlevel-- (not beyond last lvl) cal releasekeys - cal _clrWindow pop hl ;show end msg or smtn ld bc,Exit @@ -1381,8 +1403,8 @@ toobad_noballs: #endif ld hl,worm1 - ld a,(gameCar) - cp _datasp + ld a,(Gametype) + cp gamesingle ld b,1 jr z,worminit ld b,4 @@ -1406,6 +1428,11 @@ worminit: pop bc ;<0 dnz worminit + inc a ;ld a,1 + ld (turn10),a + ld a,2 + ld (flashtime),a + ;-------- draw level --------- ld a,(de) @@ -1503,7 +1530,7 @@ noctf: ;----------------------------- psh hl ; >> levelp new - cal showstats + cal forceshowstats ld a,(gameCar) and _datafood jr z,nofood @@ -1547,8 +1574,8 @@ maskline: 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 @@ -1556,19 +1583,19 @@ SwapPos: ;$18 xx -> $E6 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 @@ -1618,7 +1645,7 @@ screeninvertloop: ld (hl),a inc hl xor a - cp h + cp h ;end at >$FFFF jr nz,screeninvertloop noflash: @@ -1645,6 +1672,29 @@ 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 @@ -1723,10 +1773,10 @@ handledworm =$-2 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 @@ -1743,6 +1793,7 @@ anyworm: #endif Exit: + cal releasekeys ld sp,0 ;pop all SpSave = $-2 ld a,D0LD1L @@ -1754,11 +1805,9 @@ SpSave = $-2 ld b,16*8 cal menuinvloop ;invert inc h ;$FD80 - ld b,16 - cal menuinvloop ;
+ cal hr ;menuinvloop w/ b=16 ld hl,$FCE0 - ld b,16 - cal menuinvloop ;
+ cal hr ; ld l,$74 ; ld b,8 ; cal menuinvloop @@ -1775,25 +1824,65 @@ CURtxtGame =$-2 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 ;hd + ld a,e + cp l + jr nc,nonewwinner ;l$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 @@ -1803,23 +1892,47 @@ NoLinkIndic: 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 @@ -1847,37 +1960,47 @@ hilevelcheckdone: 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 ;NewOld - - ld a,e ;old - cp l ;new - jr nc,NotNewHigh ;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 ;newOld + 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 @@ -1914,8 +2037,7 @@ ExitNoStats: 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) @@ -1924,24 +2046,25 @@ ExitNoStats: 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 @@ -1949,6 +2072,8 @@ hiscrposhl =$-2 hiscrposa =$+1 adc a,0 ;ahl=saveloc ret +highsave: + .db 0,0,"WOR ",0 ;----------------------------- ;----------- worm ------------ @@ -2053,8 +2178,8 @@ inputcall: 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: @@ -2083,12 +2208,12 @@ turn =$-1 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 @@ -2171,11 +2296,13 @@ GotFour: 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 @@ -2218,11 +2345,10 @@ peagrowth =$-1 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 @@ -2237,70 +2363,55 @@ chkpeahit: ;hl=peapos 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 ;----------------------------- @@ -2345,6 +2456,7 @@ nolap: ld (ix+reserv),a ret +#ifdef optdie checkhitotherworm: .db $dd,$7d ;ld a,lx cp worm2&255 @@ -2364,6 +2476,7 @@ chkworm: pop ix ret z ;not hit pop bc ;call +#endif stopworm: ld bc,0 previouspos =$-2 @@ -2559,18 +2672,7 @@ Seed =$+1 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 @@ -2583,21 +2685,80 @@ chkloopx: 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 ----------- @@ -2640,10 +2801,10 @@ scorelimit =$-2 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 @@ -2652,34 +2813,51 @@ showstatsEven4tron: 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' @@ -2689,7 +2867,7 @@ __vputmap: pop ix ret -showstatsS: +showstatsS: ;(singleplayer) ld hl,txtLevel cal __vputs ld a,0 @@ -3062,47 +3240,6 @@ FP_Bit =$+1 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: @@ -3120,26 +3257,27 @@ 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 @@ -3363,12 +3501,6 @@ circledraw: ;destr:de ret - - - - - - ;----------------------------- ;----------- link ------------ ;----------------------------- @@ -3416,6 +3548,7 @@ csendwait: 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 @@ -3555,8 +3688,9 @@ txtMenu: .db "Mode",0 ;1st menu item .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 ;... @@ -3571,9 +3705,10 @@ txtGame3: .db "Deathmatch",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 @@ -3588,7 +3723,6 @@ txtNo: .db "No",0 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 @@ -3606,7 +3740,8 @@ TrigPrecalc: 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 @@ -3614,63 +3749,67 @@ txtReady: .db "Prepare!",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: