X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/1ef9903729b6d0785ae56e2422120b030f3ef1f6..18959d722238409d68bd3a979624cc80c7d5b3d9:/worm.z80 diff --git a/worm.z80 b/worm.z80 index d5b88d1..af6b84a 100644 --- a/worm.z80 +++ b/worm.z80 @@ -1,33 +1,36 @@ ; Title : Worm -; Version : 89% -; Release Date : april 2000??? -; Filename : worm.86p (4kb) +; Version : 92% +; Release Date : june 2000 +; Filename : worm.86p (5kb) ; Author(s) : Shiar -; Email Address : shiar@mailroom.com +; Email Address : shiar0@hotmail.com ; ICQ UIN : #43840958 -; Web Page : www.games3.net/shiar -; Description : ruling multiplayer game for 86 (most like Nibbles) -; Where to get this game : games3.net/shiar (home of Worm) -; Other games by author(s) : Shiar: Nemesis beta +; Web Page : www.shiar.org +; Description : ruling Nibbles-like game 1-4 players +; Where to get this game : www.shiar.org (home of Worm) +; Other games by author(s) : Nemesis beta ; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) -; Jonah Cohen (wrote some parts of worm) +; Jonah Cohen (helped writing worm) ;----------------------------- ;----------- TO-DO ----------- ;----------------------------- -; 89% = DONE +; 92% = DONE -; 3% * linkplay -; 1% * titlescreen +; * customizable keys +; * internal levels +; * check levels/gametype +; * enough hiscore saves! +; * complete readme +; 2% * misc (pollish, bugs, &&&) +; * LINK +; 2% * fix deaths linkplay and transmit game/level data ; 2% * make linkplay available for all gametypes (not just deathmatch) -; * game types: -; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top) -; 1% * domination?: take control points by running over them and hold them -; * complete readme (+custom level info) -; 2% * ... (pollish, &&&) - -; 99% = beta release +; * CTF +; 1% * fix pea XOR problem in ctf (+dom?) +; * fix wormstop +; 1% * domination?: take control points by running over them and hold them ;100% = bugs fixed + levels done @@ -37,6 +40,12 @@ ;----------------------------- ;----------------------------- +#define buffer ;use display buffer (otherwise write directly to screen) +#define readymask ;"grays" out the field before starting a level + +;#define readytext ;displays "prepare" before level starts +;#define invincible ;worms cannot die =) + #define cal call #define psh push #define dnz djnz @@ -68,34 +77,46 @@ _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl _mm_ldir = $52ED ;24bit ldir _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1 _RAM_PAGE_7 = $47F3 -_PTEMP_END = $D29A +_PTEMP_END = $D29A ;end of VAT _load_ram_ahl = $462F ;ahl->page+hl _writeb_inc_ahl = $5567 ;ld (ahl),c +_jforce = $409C ;TI-OS stack restored +_EXLP = $4493 ;swap (hl),(de) b times ;----------------------------- ;------- data storage ------- ;----------------------------- -leveldata = $EA00 ;size< $400 -ScrBuffer = $8100 ;size=$2000 (32x256) - ;->mod$800 -templevels = $BC00 ;size= 3*$10 -DispBuffer = $BC00 ;size= $390 (16x57) -SinCosTable = $B500 ;size= $100 (4x64) - -worm1 = $B400 -worm2 = $B41E -worm3 = $B43C -worm4 = $B45A -ball1 = $B478 - -resbit = 2 ;and%11111011 -worm1p = $B000 ;%10110000 -$B3FF -worm2p = $B800 ;%10111000 -$BBFF -worm3p = $F000 ;%11110000 -$F3FF -worm4p = $A800 ;$E800=%11101000 ;$D748+$1000+ - -WormVersion = 088 +;--- permanent + +ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +worm2p = $A800 ;-ABFF (400) %10101O00 +worm1 = $AC00 ;-AC1D (31d) +worm2 = $AC1F ;-AC3B (1F) +worm3 = $AC3E ;-AC59 (1F) +worm4 = $AC5D ;-AC77 (1F) +balls = $AC7C ;-ACFF (3x43d) +SinCosTable = $AD00 ;-AE00 (4x40) + ;free $AE01 ;-AFFF (1FF) +worm1p = $B000 ;-B7FF (800) %1011O000 +worm3p = $B800 ;-BBFF (400) %10111O00 + ;free $BF91 ;-BFFF (6F) + + ;program $D748 ;-E7FF (106D+4A) + ;free $E800 ;-EFFF (800) +worm4p = $F000 ;-F3FF (400) %11110O00 +leveldata = $F400 ;-FA70 (<=671) + +peaspos = $AE01 + +;--- temporary + +namelength = $BC00 ;(1) @menu +#ifdef buffer +DispBuffer = $BC00 ;(10x57d) @game +#else +DispBuffer = $FC70 +#endif ;----------------------------- ;------- program start ------- @@ -103,6 +124,9 @@ WormVersion = 088 .org _asm_exec_ram +wormVhost = 092 +wormVclient = 192 + start: nop jp Start @@ -111,7 +135,7 @@ start: .dw WormIcon WormMsg: - .db "WORM by SHIAR -- pre-beta 89%",0 + .db "WORM by SHIAR -- alpha 92%",0 WormIcon: .db 9,2 .db %10010110,%01101111 @@ -124,20 +148,49 @@ WormIcon: .db %11101111,%00001111 .db %11000011,%10000000 -levelhead = '8' -levelhead2 = '9' ;worm levels header = "89" +levelhead = 'w' +levelhead2 = 92 ;worm levels header = "92" + +int_handler: + ex af,af' + in a,($03) + bit 3,a + jp z,$0039 + res 0,a + out ($03),a + jp $0039 +int_end: Start: ld (SpSave),sp cal _runindicoff cal _flushallmenus - cal _clrLCD + + im 1 + ld a,$D4 + ld h,a + ld l,0 ;ld hl,$D400 + ld d,a + ld e,1 ;ld de,$D401 + ld b,e + ld c,l ;ld bc,$0100 + dec a ;ld a,$D3 + ld (hl),a + ldir + ld hl,int_handler + ld d,a + ld e,a ;ld de,$D3D3 + ld bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld bc,templevels searchloop: - ld de,(_PTEMP_END+1) + ld de,(_PTEMP_END+1) ;VAT end or a ;nc sbc hl,de ;hl" + ld hl,$0004 + ld (_curRow),hl pop hl ld a,(hl) - cp 255 + cp 255 ;&& jr nz,displevel - ld hl,templevels + ld hl,templevels-3 ld a,(hl) displevel: inc hl @@ -271,6 +323,9 @@ levselect: loadlevel: ld a,c + or a ;levelfile on page 0 (=internal) + jr z,levelloaded + ex de,hl ;ahl=cde inc b ;b=titlesize+1 skiptitle: @@ -287,21 +342,26 @@ skiptitle: ld d,4 cal loadgametype - cal _SET_ABS_SRC_ADDR + cal _SET_ABS_SRC_ADDR ;levelsstart xor a ld hl,leveldata - cal _SET_ABS_DEST_ADDR - xor a + cal _SET_ABS_DEST_ADDR ;store in mem. ld hl,0 leveldataSize =$-2 cal _SET_MM_NUM_BYTES cal _mm_ldir cal _LOAD_ABS_SRC_ADDR ;->ahl -levelloaded: ld (hiscrposa),a ld (hiscrposhl),hl - cal _RAM_PAGE_1 ;&&& + cal _RAM_PAGE_1 + + ld hl,leveldata + ld de,defsprsize + ldi ;(de),(hl)\inc hl + ld (defsprite),hl +levelloaded: + cal _RAM_PAGE_1 res 2,(iy+13) ;appAutoScroll ld a,r @@ -340,19 +400,37 @@ NegativeSineWave: ld a,1 ld (curlevel),a + +;--- draw menu --- + DisplayMenu: cal _clrWindow - ld hl,txtWelcome - cal _puts + ld de,$FC42 ;(10,2) + ld hl,wtPicture + ld a,16 ;height +disptitleloop: + ld bc,8 ;width + ldir + ex de,hl + ld bc,8 ;next line + add hl,bc + ex de,hl + dec a + jr nz,disptitleloop + ld hl,txtMenu + ld de,$0D5A + ld (_penCol),de + cal _vputs ;by Shiar + ld de,$0207 ld (_curRow),de - cal _puts ;--- + cal _puts ;Level <00> dec e ;$0206 ld (_curRow),de - cal _puts ;Level + cal _puts ;Limit <00> dec e ;$0205 ld (_curRow),de - cal _puts ;Worms: 2 + cal _puts ;Worms <2> dec e ;$0204 ld (_curRow),de ld hl,(CURtxtGame) @@ -361,26 +439,33 @@ DisplayMenu: xor a cal menudraw jr howmanyworms + +;--- menu loop --- + mainMenu: cal menucall jr nz,notselect -select: +select: ;2nd/enter ld a,b - dec a ;2nd item + dec a ;2nd item jp z,changeworms jp LetsGetThisPartyOn ;1/3/4 notselect cp K_EXIT jp z,ExitNoStats + cp K_LEFT + jr z,selleft cp K_RIGHT ld a,b jr nz,mainMenu + +selright: or a jr z,changegame dec a jr z,changenrworms dec a - jp nz,LetsGetThisPartyOn + jp z,changelives changelevel: ld hl,Gametype @@ -389,18 +474,34 @@ changelevel: ld hl,nrlevels add hl,de ld d,(hl) ;max level for sel.game +curlevel =$+1 ld a,1 -curlevel =$-1 inc a cp d jr c,changedlevel - ld a,1 + ld a,d changedlevel: ld (curlevel),a -dispcurlevel: - ld hl,$0806 +_dispcurlevel: + ld hl,$0807 ld (_curRow),hl cal showA + jp displives ;mainMenu + +selleft: + ld a,b + dec a + jr z,bchangenrworms + dec a + jp z,bchangelives + dec a + jr nz,mainMenu + +bchangelevel: + ld a,(curlevel) + dec a + jr nz,changedlevel +_mainMenu: jr mainMenu changegame: @@ -422,33 +523,83 @@ okilydokily: cal _puts ld (NEXTtxtGame),hl howmanyworms: + ld hl,nrworms ld a,(Gametype) cp 2 - ld a,1 - jr c,oneworm -nrworms =$+1 - ld a,2 -oneworm: - jr dispnrworms ;jr mainMenu + ld (hl),1 + jr c,dispnrworms + inc (hl) ;2 + jr dispnrworms ;mainMenu changenrworms: ld a,(Gametype) - cp 2 - jr c,mainMenu ;type 0/1 + cp 2 ;&& + jr c,_mainMenu ;type 0/1 + ld hl,nrworms ld a,(hl) inc a cp 5 - jr c,changednrworms - ld a,1 + jr nc,dispcurlevel changednrworms: ld (hl),a dispnrworms: - ld hl,$0905 + ld a,(hl) ;hl=nrworms + ld hl,$0805 ld (_curRow),hl - cal showA + add a,'0' + cal _putc +dispcurlevel: ld a,(curlevel) - jr dispcurlevel ;mainMenu + jr _dispcurlevel ;mainMenu + +bchangenrworms: + ld hl,nrworms + ld a,(hl) + dec a ;1-3 + jr nz,changednrworms + jr dispcurlevel + + +changelives: + cal changelivesInit + inc a + cp 100 + jr nc,displives +changedlives: + ld (hl),a +displives: + cal loadgamecar + ld hl,$0806 + ld (_curRow),hl + cal showA ;liveslimit + sub '0' ;original A + ld l,a + ld a,c + and _datascore + ld a,' ' + jr z,limitok + ld a,'0' +limitok: + cal _putc ;x10 + jp mainMenu +bchangelives: + cal changelivesInit + dec a + jr z,displives + 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 displives + +;--- handle menukeys --- menucall: psh bc @@ -466,7 +617,6 @@ menuwaitkey: ret z cp K_SECOND ret ;z=select - menupos: ld a,b add a,4 @@ -494,23 +644,37 @@ menudraw: ld a,'*' jp _putc ;a=K_STO +;--- 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 - ld a,(nrworms) +nrworms =$+1 + ld a,1 wormnrname: + add a,'0' + cal _putc + sub '0' + + ld d,a ;1x 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 - ld ix,worm1name-18 + ld d,0 ;de=a + + ld ix,worm1name-19 add ix,de ld a,maxnamelength cal entername @@ -518,6 +682,9 @@ wormnrname: jp DisplayMenu entername: + ld h,1 + ld l,h ;) + ld (_curRow),hl ld (namelength),a enternameloop: ld a,'_' @@ -568,26 +735,18 @@ continue: ld (ix),a cal _putc inc ix - cal waitnokeypressed + cal releasekeys jr enternameloop -waitnokeypressed: - halt - cal GET_KEY - or a - jr nz,waitnokeypressed - ret -namelength: - .db 0 chartable: - .db 0,"!<>^",0,0,0,0 - .db 0,"xtoje0",0 ;enter..clear - .db " wsnid9",0 ;(-)..custom - .db "zvrmhc8",0 ;dot..del - .db "yuqlgb7*" ;0..xvar - .db 0,"-pkfa6'" ;on..alpha - .db "54321.",0,0 ;F5..more + .db 0,".<>!",0,0,0,0 ;down,L,R,up + .db 0,"XTOJE0",0 ;enter..clear + .db " WSNID9",0 ;(-)..custom + .db "ZVRMHC8",0 ;dot..del + .db "YUQLGB7#" ;0..xvar + .db $D9,"-PKFA6'" ;on..alpha + .db "54321*",0,$D0 ;F5..more ;--proc @@ -605,8 +764,8 @@ skipsprite: inc b inc b ;skip 6 ld a,c - and _datasingl - jr nz,skipworms + cp _datasp + jr z,skipworms inc b ;multiplayer lvl inc b inc b ;skip other 3 worms (9 bytes) @@ -618,16 +777,46 @@ skipworms: skipballs: inc hl dnz skipballs - cal skiplines ;lines -skiplines: ;boxes - ld a,(hl) ;lines/boxes - add a,a + +skipflags: + ld a,(Gametype) + cp gamectf + jr nz,noflagstoskip + inc hl + inc hl + inc hl + inc hl +noflagstoskip: + +skipobjects: + ld a,(hl) + inc hl + or a + ret z ;0=end + inc hl + inc hl + inc hl + inc hl + jr skipobjects + +loadgamecar: +;in: (Gametype) +;out: Gametype+1=hl +;build: c=(gameCar)=(hl-1) +; a=(wormbeglives)=(hl) +;destr: acdehl + ld hl,datasingle + ld a,(Gametype) add a,a - inc a - ld b,a ;4x(hl)+1 -skiplb + ld e,a + ld d,0 + add hl,de + ld a,(hl) + ld (gameCar),a + ld c,a inc hl - dnz skiplb + ld a,(hl) + ld (wormbeglives),a ret ;----------------------------- @@ -638,19 +827,17 @@ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - ld hl,gamesdata - ld a,(Gametype) - ld e,a - ld d,0 - add hl,de - ld a,(hl) - ld (gameCar),a + cal loadgamecar + ld l,a + ld h,0 ;hl=a + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl ;set limit - add hl,de - ld e,8 ;=de - add hl,de + cal loadgamecar ;nc + ld e,24+1 ;=de + sbc hl,de ;datalevels - ld c,a + ld a,c ;(gameCar) and _datasingl jr z,notsingle ld a,1 @@ -658,11 +845,10 @@ LetsGetThisPartyOn: notsingle: ld a,c and _datascore - ld de,$FF64 ;virt.infinate - jr z,setscorelimit - ld d,0 ;de=100 -setscorelimit: - ld (scorelimit),de + jr nz,scorelimitset + dec a ;ld a,$FF ;=no_limit + ld (scorelimit),a +scorelimitset: cal _ldHLind ;ld hl,(hl) ld a,(curlevel) @@ -682,30 +868,34 @@ levelsskipped: linkmatch: cal _clrWindow - ld a,WormVersion - cal send - jr c,client ;2nd - -host: + ld c,wormVhost + cal Qsend ld hl,txtWaiting cal _puts - cal receive - cp WormVersion - jp nz,LinkBreak - cal send + cal Crecv +; ld a,c + cp wormVclient + jr z,client + cp wormVhost + jr nz,linkiniterror - ld hl,SwapPos - ld (hl),$f6 +host: + ld c,wormVclient + cal Qsend + ld a,$18 jr multiplayer +linkiniterror: + pop hl + jp DisplayMenu + client: ld hl,txtReceive cal _puts - cal receive - cp WormVersion - jp nz,LinkBreak + ld a,$f6 multiplayer: + ld (SwapPos),a ld a,2 ld (nrworms),a @@ -715,42 +905,31 @@ multiplayer: GameOver: cal _clrLCD - ld hl,0 - ld (worm1+died),hl -;+died=0 \ +score1=0 - ld (worm2+died),hl - ld (worm3+died),hl - ld (worm4+died),hl - inc h - ld (worm1+score+1),hl -;+score2=0 \ +delay=1 - ld (worm2+score+1),hl - ld (worm3+score+1),hl - ld (worm4+score+1),hl - ld hl,worm1set+4 - ld de,worm1+lives -;&&&>* - cal _MOV5B ;9xld(de),(hl) - cal _mov9b - ld hl,worm2set+4 - ld de,worm2+lives - cal _MOV5B - cal _mov9b - ld hl,worm3set+4 - ld de,worm3+lives - cal _MOV5B - cal _mov9b - ld hl,worm4set+4 - ld de,worm4+lives - cal _MOV5B - cal _mov9b + ld hl,worm1set + ld de,worm1 + ld a,4 ;4x (all worms) +createwormsloop: + ex de,hl + ld bc,died + add hl,bc + ld (hl),0 ;died=0 + inc hl + ld (hl),0 ;score=0 + inc hl + ld (hl),0 ;score+1=0 + inc hl + ld (hl),2 ;delay=2 + inc hl + ld (hl),3 ;lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ld bc,18 + ldir ;copy 18 bytes + dec a ;loop + jr nz,createwormsloop - ld a,(Gametype) - cp 1 ;=peaworm - jr nz,worminitdone - ld (worm1+lives),a ;&&&<* -worminitdone: - pop hl + pop hl ;begin of current level StartLevel: ld de,Left @@ -759,10 +938,7 @@ StartLevel: jp nz,nextlevel psh hl - ld b,150 -waitsomemore: - halt - dnz waitsomemore + cal releasekeys cal _clrWindow pop hl ;show end msg or smtn @@ -795,9 +971,11 @@ nextlevel: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defsprsize - ld de,peasprite -setsprite: + ld a,defspritesz +defsprsize =$-1 +defsprite =$+1 + ld de,defspriteimg +setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -811,41 +989,20 @@ setsprite: add a,c ld c,a ld b,0 - ld de,ball1 + ld de,balls ldir toobad_noballs: -#ifdef 0 - ld a,(gameCar) - and _datahunt - jr z,nohunter - ld a,huntersize - ld (worm2+grow),a -nohunter: -#endif - ex de,hl +#ifndef invincible ld (thislevel),de - psh de - ld hl,worm1set - ld de,worm1+head - cal _MOV4B - ld hl,worm2set - ld de,worm2+head - cal _MOV4B - ld hl,worm3set - ld de,worm3+head - cal _MOV4B - ld hl,worm4set - ld de,worm4+head - cal _MOV4B - pop de +#endif ld hl,worm1 ld a,(gameCar) - and _datanextl + cp _datasp ld b,1 - jr nz,worminit + jr z,worminit ld b,4 worminit: psh bc ; >> 1 @@ -939,53 +1096,20 @@ NoVertShift: ld c,64 ldir -;-draw lines- pop hl ; << levelp - ld a,(hl) - inc hl - or a - jr z,NoLines -DrawLines: - psh af ; >> 1 - cal loaddrawdata - psh hl ; >> 2 - ld l,(hl) - ld h,a - cal Line - inc d - inc h - cal Line - inc e - inc l - cal Line - dec d - dec h - cal Line - pop hl ; << 1 - inc hl - pop af ; << 0k - dec a - jr nz,DrawLines -NoLines: - - ld a,(hl) - inc hl - or a - jr z,noboxes -drawboxes: - psh af - cal loaddrawdata + ld a,(Gametype) + cp gamectf + jr nz,noctf + ld de,peaspos + ld bc,4 + ldir psh hl - ld l,(hl) - ld h,a - cal drawbox + cal DrawAllPeas pop hl - inc hl - pop af - dec a - jr nz,drawboxes -noboxes: +noctf: + + cal drawstuff ;----------------------------- @@ -998,6 +1122,27 @@ noboxes: nofood: ld bc,(worm1+pos) cal DisplayField + +#ifdef readymask + ld hl,$FC70 + ld d,%10101010 + ld c,56 +maskloop: + ld a,d + xor %11111111 + ld d,a + ld b,$10 +maskline: + ld a,(hl) + or d + ld (hl),a + inc hl + dnz maskline + dec c + jr nz,maskloop +#endif + +#ifdef readytext ld hl,$FDE0 ld de,$FDE1 ld (hl),%11111111 @@ -1009,36 +1154,38 @@ nofood: ld hl,txtReady cal _puts res 3,(iy+5) +#endif ld a,0 gameCar =$-1 and _datalink - jr z,SwapPos ;no link + jr z,initfinished ;no link + xor a - ld (worm2+input),a + ld (worm2+input),a ;worm 2 via link ld (worm2+left),a - ld (Speed),a - + ld (Speed),a ;max.speed SwapPos: ;$18 xx -> $F6 xx + ; jr xx -> or xx jr initfinished inc a - ld (worm2+left),a - ld hl,(worm1+pos) - ld de,(worm2+pos) - ld (worm2+pos),hl - ld (worm1+pos),de - ld a,(worm1+heading) - ld b,a - ld a,(worm2+heading) - ld (worm1+heading),a - ld a,b - ld (worm2+heading),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 initfinished: - ld b,0 + ld b,startdelay ReadyDelay: halt dnz ReadyDelay + cal releasekeys ;----------------------------- ;----------- LOOP ------------ @@ -1074,7 +1221,10 @@ Delay: jr nz,Delay NoDelay: - cal handlethoseneatlittleballs + ld a,0 +nrballs =$-1 + or a + cal nz,handlethoseneatlittleballs ld ix,worm1 ld a,(nrworms) @@ -1110,10 +1260,12 @@ CheckExit: jr Exit WormDead: +#ifdef invincible + jp stopworm +#else ld a,2 ld (flashtime),a - ld a,respawndelay - ld (ix+delay),a + ld (ix+delay),respawndelay thislevel =$+1 ld de,0 @@ -1139,10 +1291,13 @@ thislevel =$+1 ld a,$A7 ;exit@end of turn ld (CheckExit),a ;set exit state ret ;finish turn +#endif Exit: ld sp,0 ;pop all SpSave = $-2 + ld a,D0HD1H + out (7),a cal _clrWindow ld hl,txtGO cal _puts @@ -1170,13 +1325,13 @@ displayWormStats: ld bc,input-died add hl,bc ;+input xor a - cp (hl) + cp (hl) ;input=0 = link jr nz,NoLinkIndic - ld b,7 + ld b,7 ;{DOWN} inc hl ;+left cp (hl) jr z,hostLinkIndic - dec b + dec b ;{UP} hostLinkIndic: ld a,8 ld (_curCol),a @@ -1196,9 +1351,9 @@ NoLinkIndic: ld a,13 ld (_curCol),a ld a,(hl) ;worm+died - psh hl cal showA pop hl + psh hl ld a,16 ld (_curCol),a @@ -1218,20 +1373,20 @@ NoLinkIndic: checkhilevel: ld hl,nrlevels ld a,(Level) - inc a cp (hl) jr c,hilevelcheckdone ld (hl),a ;save local ld c,a ld a,0 hilvlposa =$-1 - ld hl,0 + ld hl,nrlevels hilvlposhl =$-2 ;save external cal _writeb_inc_ahl ;ld (ahl),c hilevelcheckdone: ld a,(gameCar) and _datasingl + jr z,hiscorecheckdone checkhiscore: cal loadhiscoreposinahl @@ -1265,13 +1420,16 @@ NotNewHigh: ;de=current hiscore cal showHL hiscorecheckdone: + cal releasekeys waitkey: halt halt cal GET_KEY cp K_ENTER jp z,DisplayMenu -; cp K_EXIT + cp K_SECOND + jp z,DisplayMenu + cp K_EXIT jr nz,waitkey ;x123456789012345678901 @@ -1288,89 +1446,66 @@ ExitNoStats: ld hl,_asapvar rst 20h ;_ABS_MOV10TOOP1 rst 10h ;_FINDSYM - ld hl,4 + ld hl,savestart-_asm_exec_ram+4 xor a add hl,de adc a,b ;ahl=bde+4 cal _SET_ABS_DEST_ADDR xor a - ld hl,_asm_exec_ram + ld hl,savestart cal _SET_ABS_SRC_ADDR - ld hl,end-_asm_exec_ram + ld hl,saveend-savestart cal _SET_MM_NUM_BYTES cal _mm_ldir + cal releasekeys res 4,(iy+9) set 2,(iy+13) + im 1 ;remove keyfix 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 a,(Gametype) - or a -externalhiscoresavepos: - ld a,0 -hiscrposa =$-1 - ld hl,0 + 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 + ld bc,defhiscrpos hiscrposhl =$-2 - ret z ;(Gametype)=0 - cal _INC_PTR_AHL + 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 ret ;----------------------------- ;----------- worm ------------ ;----------------------------- -inlink: - ld a,0 -sendbyte =$-1 - ld b,(ix+left) - dec b - jr z,receivefirst - cal send - cal receive - ld l,a - ret -receivefirst: - psh af - cal receive - ld l,a - pop af - psh hl - cal send - pop hl - ret - -inkeys: ;use jp not call! - out (1),a ;nop\nop - in a,(1) - ld b,a - and (ix+right) - jr z,notright - ld a,l - add a,8 - ld l,a -notright: - ld a,b - and (ix+left) - ret z - ld a,l - sub 8 - ld l,a - ret - -chkinput: - ld bc,donediddelydone - psh bc ;ret-dest. -inputcall: - ld a,(ix+input) - or a - jr nz,inkeys - jr inlink - respawncheck: cp respawndelay-1 jr nz,unnamedlabel + cal saverespawncounter removeworm: ld h,(ix+tail+1) ld l,(ix+tail) @@ -1382,7 +1517,7 @@ removewormloop: inc hl ld b,(hl) inc hl - res resbit,h + cal resbit psh hl cal res4pixels pop hl @@ -1401,7 +1536,8 @@ safewormsizedone: ;de=ix+head ld (ix+tail+1),d - ld (ix+tail),e + ld (ix+tail),e ;head=tail/size=0 + ret unnamedlabel: cp 1 @@ -1409,12 +1545,66 @@ unnamedlabel: jr nz,saverespawncounter respawndue: ld l,a - cal inputcall - ld a,h ;previous - cp l ;changed? + cal inputcall + ld (sendbyte),a + ld a,h ;previous + cp l ;changed? + ret z + ld (ix+delay),a ;=0 + ret +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) + ld b,a + and (ix+right) + jr z,notright + ld a,l + add a,8 + ld l,a +notright: + ld a,b + and (ix+left) ret z -saverespawncounter: - ld (ix+delay),h + ld a,l + sub 8 + ld l,a + ret + +inputcall: + ld a,(ix+input) + 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 + ld l,c + psh hl + ld a,(sendbyte) + ld c,a + cal Csend + pop hl ret ;------- handle worm --------- @@ -1422,10 +1612,17 @@ saverespawncounter: HandleWorm: ld a,(ix+delay) dec a - jr nz,respawncheck + jp nz,respawncheck + + ld a,(Gametype) + cp gametron + jr nz,notron + ld de,1 + cal IncScore +notron: ld l,(ix+heading) - jr chkinput + cal inputcall donediddelydone: ld a,l ld (sendbyte),a @@ -1437,6 +1634,18 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) + psh hl + ld hl,previouspos + ld (hl),c + inc hl + ld (hl),b + inc hl + inc hl + ld (hl),e + inc hl + ld (hl),d + pop hl + ;-------- move worm ---------- Wormmove: @@ -1495,27 +1704,19 @@ GotFour: Hitworm: ld a,(gameCar) ld h,a - and _datafood - jp z,WormDead + and _datadie + cal z,checkhitotherworm + ld a,h + and _datamultpeas ;&&bit + jr nz,multiple_peas ld a,h - and _datahunt - cal nz,checkhitotherworm + and _datafood + jp z,WormDead ;no food ld hl,0 PeaY =$-2 PeaX =$-1 - ld a,(sprsize) - inc a - ld d,a - ld a,b - sub h - inc a - cp d ;=(sprsize)+1 - jp nc,WormDead - ld a,c - sub l - inc a - cp d + cal chkpeahit jp nc,WormDead cal DrawPea ;remove pea ld a,(ix+grow) @@ -1529,10 +1730,10 @@ peagrowth =$-1 ld de,10 cal IncScore pop af - jr nz,still_alive_not_dead + jp nz,Drawworm ;continue ld a,(gameCar) and _datafoodl - jr z,still_alive_not_dead + jp z,Drawworm ld a,(Gametype) or a jp nz,Exit ;stack restored @@ -1547,20 +1748,95 @@ peagrowth =$-1 cal _HLTIMES10 ex de,hl cal IncScore ;score+(40*level) + cal removeworm pop hl ; << call pop hl ; << call pop hl ; << levelp new + ld (ix+delay),2 jp StartLevel +chkpeahit: ;hl=peapos + ld a,(sprsize) + inc a + ld d,a + ld a,b + sub h + inc a + cp d ;=(sprsize)+1 + ret nc ;nc=no pea + ld a,c + sub l + inc 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: + 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 + jr z,sel_otherpea + ld hl,(peaspos+2) ;2nd pea +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 + ld (ix+reserv),a + cal DrawPea ;restore own flag + jr sillylabel ;inv both\die + +hitflag: ;correct pea hit + ld a,e ;pop a + xor %01 ;0=1;1=0 + ld (ix+reserv),a + cal flagtoken + psh af ;safe z-flag + cal DrawPea ;remove + pop af + jr z,flagcaptured + jr stopworm + +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 + ;----------------------------- -checkhitotherworm: - .db $dd,$7d ;ld a,lx - cp worm2&255 - ret nz -ThisIsJustASillyUselessLabel: - ld hl,(worm1+tail) - ld de,(worm1+head) nextotherwormbit: ld a,c sub (hl) @@ -1572,13 +1848,14 @@ nextotherwormbit: sub (hl) inc a cp 4 - jr c,otherwormHIT ;yes + ret c ;nz ;yes nothit1: inc hl - res resbit,h + cal resbit +ChkWorm: cal _cphlde jr nz,nextotherwormbit - ret + ret ;z checkhitlapline: ld a,63 @@ -1601,29 +1878,51 @@ nolap: ld (ix+reserv),a ret -otherwormHIT: - psh ix - ld de,10 - cal IncScore +checkhitotherworm: + .db $dd,$7d ;ld a,lx + cp worm2&255 + psh ix + jr nz,chkworm2 ; ret nz ld ix,worm1 - cal WormDead - pop ix - pop bc -still_alive_not_dead: + jr chkworm +chkworm2: + ld ix,worm2 + +chkworm: + ld h,(ix+tail+1) + ld l,(ix+tail) + ld e,(ix+head) + ld d,(ix+head+1) + cal ChkWorm + pop ix + ret z ;not hit + pop bc ;call +stopworm: + ld bc,0 +previouspos =$-2 + ld de,0 + ld (ix+pos),c + ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d + ret ;-------- draw worm ---------- Drawworm: - ld a,(gameCar) - and _datahunt - cal nz,HuntingTimeScore - ld c,(ix+pos) ld b,(ix+pos+1) - ld a,(gameCar) - and _datalaps - cal nz,checkhitlapline + ld a,(Gametype) + ld d,a + cp gamerace + cal z,checkhitlapline + + cal set4pixels + dec c + ld a,d + cp gametron + ret z ;keep tail in "Tron" ld l,(ix+head) ld h,(ix+head+1) @@ -1631,12 +1930,10 @@ Drawworm: inc hl ld (hl),b inc hl - res resbit,h + cal resbit ld (ix+head),l ld (ix+head+1),h - cal set4pixels - ld a,(ix+grow) dec a jr z,removetail @@ -1650,7 +1947,7 @@ removetail: inc hl ld b,(hl) inc hl - res resbit,h + cal resbit ld (ix+tail),l ld (ix+tail+1),h @@ -1673,13 +1970,8 @@ ResPixel: ;----------------------------- handlethoseneatlittleballs: - ld a,0 -nrballs =$-1 - or a - ret z - - ld hl,ball1 - ld b,a + ld hl,balls + ld b,a ;a=(nrballs) handleballs psh bc psh hl @@ -1772,6 +2064,22 @@ checkballhit: ;----------- procs ----------- ;----------------------------- +releasekeys: + halt + ld a,%10000000 ;all key-masks + out (1),a + in a,(1) + inc a ;cp %11111111 (no keys pressed) + jr nz,releasekeys ;keep waitin + cal GET_KEY ;clear buffer + ret + +resbit: + ld a,h + and (ix+storepos) + ld h,a + ret + randompos: ld b,a Random: ;(2..b+2) @@ -1821,10 +2129,9 @@ chkloopx: DrawPea: ;hl=(PeaY) ld b,h ld c,l - ld de,peasprite + ld de,0 spritepos =$-2 - cal PutSprite ;||-ed - ret + jp PutSprite ;||-ed ;----------- score ----------- @@ -1838,14 +2145,6 @@ divideagain: ;3x pop hl ret -HuntingTimeScore: - .db $dd,$7d ;ld a,lx - cp worm2&255 - ret z ;=worm#2 - dec (ix+reserv) - ret nz - ld hl,10 - IncScore: ld h,(ix+score+1) ld l,(ix+score) @@ -1868,6 +2167,9 @@ scorecommon: ld (ix+score),l ld de,0 scorelimit =$-2 + inc e + jr z,showstats ;de=$FF??=no limit + dec e cal _cphlde jp nc,Exit @@ -1898,14 +2200,18 @@ showstatloop: showstat: ld a,(gameCar) - and _datalivel - jr nz,showlives + and _datascore + jr z,showlives showscore: ld h,(ix+score+1) ld l,(ix+score) cal _D_HL_DECI jr __vputs showlives: + ld a,(Gametype) + cp gametron + jr z,showscore + ld a,(ix+lives) add a,'0' __vputmap: @@ -2029,10 +2335,10 @@ NotMaxYScroll: jr nc,NotMinXScroll xor a NotMinXScroll: - cp 128 + cp 128 FieldWidth = $-1 - jr c,NotMaxXScroll - ld a,(FieldWidth) + jr c,NotMaxXScroll + ld a,(FieldWidth) NotMaxXScroll: psh af ; >> 3 and %11111000 @@ -2050,7 +2356,7 @@ NotMaxXScroll: inc c CopyScreen: add hl,bc - ld b,57 + ld b,57 CopyScreenLoop: psh bc ; >> 4 ld bc,16 @@ -2105,10 +2411,12 @@ Bit7: AfterShiftDelay: halt AfterShift: +#ifdef buffer ld hl,DispBuffer ld de,$fc00+$70 ld bc,1024-$70 ldir +#endif pop de ; << 1 pop bc ; << 0k ret @@ -2284,7 +2592,8 @@ PutSprite: ;||@(b,c) cal FindPixel putspr: ld (beginbit),a - ld a,(sprsize) + ld a,0 +sprsize =$-1 ld b,a ;rows sprloopy: psh bc ;rows @@ -2317,21 +2626,61 @@ nextbitok: dnz sprloopy ret -;--- line --- +;--- objects --- + +drawstuff: + ld a,(hl) + inc hl + or a ;0 = + ret z ;no more -loaddrawdata: ld d,(hl) inc hl ld e,(hl) inc hl - ld a,(hl) + ld b,(hl) + inc hl + psh hl + ld l,(hl) + ld h,b + + dec a ;1 = line + cal z,drawline + dec a ;2 = fatline + cal z,drawfatline + dec a ;3 = box + cal z,drawbox + + pop hl inc hl + jr drawstuff + +drawbox: ;(d,e)-(h,l) + ld b,l ;Delta-y + ld l,e +boxloop: + cal drawline + inc l + inc e + dnz boxloop ret +drawfatline: + cal drawline + inc d + inc h + cal drawline + inc e + inc l + cal drawline + dec d + dec h + jp drawline + ;LINE (d,e)-(h,l) ;destroyes a -Line: +drawline: psh bc psh hl psh de @@ -2432,133 +2781,118 @@ line4sm: dnz LineLoopSteep jr DoneLine -drawbox: ;(d,e)-(h,l) - ld b,l ;Delta-y - ld l,e -boxloop: - cal Line - inc l - inc e - dnz boxloop - ret - ;----------------------------- ;----------- link ------------ ;----------------------------- -TIMEOUT = $1000 +timeout = $800 + +checklink: + dec de + ld a,d + or e + jr z,linkerror + + ld a,$BF + out (1),a + in a,(1) + bit 6,a + jp z,Exit -receive: - cal GET_KEY - cp K_EXIT - jp z,LinkBreak in a,(7) and %11 - cp %11 - jr z,receive - cal Qreceive - jr c,receive ret -Qreceive: - ld b,8 - jr ReceiveCont -receiveloop: - ld de,TIMEOUT -WaitRecBit: - cal CheckLink - jr z,LinkFailed - cp %11 - jr z,WaitRecBit -ReceiveCont: - sub 2 - ld a,2 - ld d,D0LD1H - jr c,ReceiveLow - rra - ld d,D0HD1L -ReceiveLow: - rr c - ld (AckBit),a - ld a,d - out (7),a - ld de,TIMEOUT -WaitAckRec: - cal CheckLink - cp 0 -AckBit =$-1 - jr nz,WaitAckRec - ld a,D0HD1H - out (7),a - ld d,4 -WaitReadyRec: - dec d - jr z,ReadyRec - in a,(7) - cp %11 - jr nz,WaitReadyRec -ReadyRec: - dnz receiveloop - jr LinkSuccess +linkerror: + scf + ld a,%11 + pop hl + ret + +;-------------- +;---- SEND ---- +;-------------- -send: - ld b,9 +Csend: ;--- send 8 bits in A --- destr:abcdehl --- ld c,a - jr SendAcked -SendBits: - rr c - ld a,D0LD1H - jr nc,SendLow - ld a,D0HD1L -SendLow: - out (7),a - ld de,TIMEOUT -WaitAckSend: - cal CheckLink - jr nz,WaitAckSend -SendAcked: +Csendloop: + cal Qsend + ret nc ;NC = all ok ld a,D0HD1H - out (7),a - ld de,TIMEOUT -WaitReadySend: - cal CheckLink - cp %11 - jr nz,WaitReadySend - dnz SendBits -LinkSuccess: - ld a,c ;pop a - ret + out (7),a ;both high + jr Csendloop ;CF = error -LinkFailed: +Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcdehl --- + ld de,timeout + cal checklink + cp %11 ;are they? scf - ld a,c - ret -LinkBreak: - ld a,D0HD1H + ret nz ;nope, wait + ld b,8 ;bits to send +sendloop: + ld de,timeout + rl c ;bit to send in cf + ld a,D0LD1H ;0: lower white + jr nc,sendbit + ld a,D0HD1L ;1: lower red +sendbit: + out (7),a ;lower one (send bit) +sendwaitack: + cal checklink ;other calc must lower other wire + jr nz,sendwaitack + ld a,D0HD1H ;raise one, ok to raise other out (7),a - jp Exit - -CheckLink: - pop hl - dec de - ld a,d - or e - jr z,LinkFailed - - ld a,$BF - out (1),a +sendfinish: + cal checklink + cp %11 ;both raised (by other calc) + jr nz,sendfinish nop \ nop - in a,(1) - psh af - ld a,%11111111 - out (1),a - pop af - bit 6,a + dnz sendloop ;repeat for all bits + xor a ;nc... + ret ;=ok - in a,(7) - and %11 - jp (hl) +;-------------- +;---- RECV ---- +;-------------- + +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 + ld b,8 ;bits to receive +recvloop: + ld de,timeout +recvwait: + cal checklink + cp %11 + jr z,recvwait ;both high = nothing sent (yet) + rra ;received bit in cf + ld a,D0LD1H + jr c,received ;lower white wire as well + ld a,D0HD1L ;lower red +received: + rl c ;save bit in c + out (7),a ;both wires low +recvwaitack: + cal checklink + jr z,recvwaitack ;same wire will be raised again by other calc + ld a,D0HD1H + out (7),a ;raise both +recvfinish: + dnz recvloop ;repeat for all bits + xor a ;nc=no error + ld a,c ;result in a + ret ;----------------------------- ;---------- levels ----------- @@ -2568,21 +2902,70 @@ LevelDef: .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls .db 0,2,63 ;start d, y, x .db 128,57 ;field width (128-255), height (57-255) - .db 0,0 ;no additional lines, boxes + .db 0 ;no additional lines, boxes .db 255 ret LevelDefM: - .db 8,0,15,15,0,0 + .db 8,4,15,15,0,0 + .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 + .db 128,57 + .db 0 + + .db 8,0,18,12,5 + .db %1110000,%10001000,%10001000,%10001000,%1110000,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 - .db 0,0 + .db 0 + +LevelDefT: + .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 ;----------------------------- ;---------- data ------------- ;----------------------------- +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 "Level 00",0 ;4th menu item + .db "Limit 00 ",0 ;3rd + .db "Worms 0",0 ;2nd +txtGame: .db "Singleplayer",0 ;0 (1st) +txtGame2: .db "Peaworm ",0 ;1 (next 1st) + .db "Tron ",0 ;2 + .db "Deathmatch",0 ;3 + .db "Foodmatch ",0 ;4 + .db "LinkMatch",0 ;5 + .db "Race ",0 ;6 + .db "CTF ",0 ;7 +; .db "Domination",0 ;8 +txtLevsel: .db $CF," Select levels: ",5,0 +txtName: .db "Enter name player ",0 +txtWaiting: .db "Waiting...",0 +txtReceive: .db "Receiving..." ;,0 + TrigPrecalc: .db 0, 3, 6, 9, 12, 15, 18, 21 .db 24, 27, 30, 33, 36, 39, 42, 45 @@ -2594,23 +2977,6 @@ TrigPrecalc: .db 124,125,125,126,126,126,126,126 .db 127 -txtWelcome: .db "Welcome to Worm!! ", - .db "by Shiar",0 - .db "Have fun!",0 ;4th menu item - .db "Level 00",0 ;3rd - .db "Worms: 0",0 ;2nd -txtGame: .db "Singleplayer",0 ;0 (1st) -txtGame2: .db "Peaworm ",0 ;1 - .db "Deathmatch",0 ;2 - .db "Foodmatch ",0 ;3 - .db "LinkMatch",0 ;4 (>options) - .db "Hunting ",0 ;5 - .db "Race ",0 ;6 - .db "CTF ",0 ;7 - .db "Domination",0 ;(>=8) -txtWaiting: .db "Waiting...",0 -txtReceive: .db "Receiving...",0 - txtLevel: .db "Level ",0 txtWorms: .db "Worms: 0",0 ;follows txtLevel txtDied: .db "Died ",0 @@ -2621,55 +2987,62 @@ txtReady: .db "Prepare!",0 txtposReady = 7 txtGO: .db "----- GAME OVER -----",0 -gamesdata: - -_datalink = %00000001 -_datalivel = %00000010 ;ix+lives=0 limit +_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 -_datahunt = %00100000 -_datalaps = %01000000 ;give lap score +_datadie = %01000000 ;worm dies on impact _datascore = %10000000 ;score>=100 limit +_datamultpeas = %00100000 +_datasp = %01011110 -datasingle: .db %00011110 -datapeas: .db %00011010 -datadeathm: .db %00000010 -datafoodm: .db %10010000 -datalinkm: .db %00000011 -datahuntin: .db %10100000 -datarace: .db %11000000 -datactf: .db %00000000 ;==(8 modes) -;datadomin: .db %00000000 -datalevels: .dw LevelDef, LevelDef +datalevels: .dw LevelDef, LevelDefM + .dw LevelDefT,LevelDefM .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefM - .dw LevelDefM,LevelDefM -nrlevels: .db 1,1,1,1,1,1,1,1 +nrlevels: .db 1,2,2,2,2,2,2,1 ;=defaults + +savestart: + +gamesingle = 0 +datasingle: .db %01011110,3 ;3 lives ( -worm1name: .db "Left ",0 + .db %11110111,%00,%01111110,%10,%100 ;< > +worm1name: .db "worm #01",0 worm2set: .dw worm2p,worm2p - .db 3,0,%00111111,%10000,%1000 ;f1 f2 -worm2name: .db "Right ",0 + .db %11111011,%11,%00111111,%10000,%1000 ;f1 f2 +worm2name: .db "worm #02",0 worm3set: .dw worm3p,worm3p - .db 3,0,%01011111,%10,%100 ;sto , -worm3name: .db "Top ",0 + .db %11111011,0,%01011111,%10,%100 ;sto , +worm3name: .db "worm #03",0 worm4set: .dw worm4p,worm4p - .db 3,0,%01111101,%10,%1 ;enter + -worm4name: .db "Bottom ",0 + .db %11111011,0,%01111101,%10,%1 ;enter + +worm4name: .db "worm #04",0 -hipeaworm: .dw 0 -end: +defhiscrpos: + .dw 0,0,0,0,0 -defsprsize = 4 -sprsize: .db 4 -peasprite: .db %01100000 - .db %11110000 - .db %11110000 - .db %01100000 +saveend: ;set: heading = 0 ;level* @@ -2679,21 +3052,46 @@ grow = 6 ;level died = 8 ;game score = 9 ;game delay = 11 ;game - -head = 12 ;level -tail = 14 ;level -lives = 16 ;game -reserv = 17 ;loop + ;19B @game +lives = 12 +head = 13 ;4B (head=tail) +tail = 15 ;also@next level +storepos = 17 +reserv = 18 ;loop ;race:lap - ;hunt:time -input = 18 ;& -left = 19 ;& -right = 20 ;& -name = 21 ;game -wormsize = 30 - -respawndelay = 40 -maxnamelength = 9 + ;ctf:pea +input = 19 +left = 20 +right = 21 +name = 22 +wormsize = 31 + +startdelay = 30 +respawndelay = 30 +maxnamelength = 8+1 + +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db " shiar0@hotmail.com",0 + +defspritesz = 4 +defspriteimg: .db %01100000 + .db %11110000 + .db %11110000 + .db %01100000 + +deflevels: + .db 15,"Internal Levels" + + .db 0,deflevels/256,deflevels&255 +templevels: ;----------------------------- ;----------- end -------------