X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/9ab1a608dddf3b6161db1cade9284c4ffe8bc0a2..ececf2878a429d97287102bc8315f05c8aa423f1:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 22711b9..6ed5a09 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,6 +1,6 @@ ; 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 @@ -16,22 +16,21 @@ ;----------- 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 @@ -42,10 +41,12 @@ ;----------------------------- #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 @@ -54,12 +55,12 @@ #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) @@ -76,13 +77,15 @@ _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 +_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 ------- @@ -108,7 +111,8 @@ worm3p = $B800 ;-BBFF (400) %10111O00 worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) -peaspos = $AE01 +turn10 = $AE01 +peaspos = $AE02 ;--- temporary @@ -125,8 +129,8 @@ DispBuffer = $FC70 .org _asm_exec_ram -wormVhost = 092 -wormVclient = 192 +wormVhost = 093 +wormVclient = 193 start: nop @@ -136,21 +140,20 @@ start: .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' @@ -189,7 +192,7 @@ Start: 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 @@ -201,20 +204,17 @@ searchloop: 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: @@ -227,40 +227,34 @@ 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 @@ -268,77 +262,123 @@ defaultlevels: 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 @@ -349,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 @@ -368,6 +407,14 @@ levelloaded: 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 ----- ;----------------------------- @@ -400,51 +447,296 @@ NegativeSineWave: ;----------------------------- 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 @@ -458,23 +750,21 @@ selright: 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 @@ -483,103 +773,135 @@ selleft: 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) @@ -593,31 +915,48 @@ clroldsetsloop: 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 --- @@ -670,90 +1009,84 @@ menuup: 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 @@ -761,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 @@ -778,8 +1108,30 @@ 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 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 @@ -793,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 @@ -831,13 +1183,15 @@ skipobjects: 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 @@ -858,30 +1212,43 @@ LetsGetThisPartyOn: 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: @@ -892,9 +1259,9 @@ 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 @@ -903,28 +1270,27 @@ linkmatch: 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 @@ -934,7 +1300,6 @@ multiplayer: ;----------------------------- GameOver: - cal _clrLCD ld hl,worm1set ld de,worm1 ld a,4 ;4x (all worms) @@ -942,11 +1307,12 @@ createwormsloop: 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 @@ -959,17 +1325,18 @@ 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? 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 @@ -978,6 +1345,13 @@ StartLevel: 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 @@ -1029,51 +1403,63 @@ 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 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 @@ -1144,7 +1530,7 @@ noctf: ;----------------------------- psh hl ; >> levelp new - cal showstats + cal forceshowstats ld a,(gameCar) and _datafood jr z,nofood @@ -1188,27 +1574,44 @@ maskline: 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 @@ -1222,8 +1625,13 @@ ReadyDelay: ;----------------------------- 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 @@ -1237,7 +1645,7 @@ screeninvertloop: ld (hl),a inc hl xor a - cp h + cp h ;end at >$FFFF jr nz,screeninvertloop noflash: @@ -1251,13 +1659,50 @@ Delay: 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 @@ -1265,6 +1710,8 @@ handleworms: ld bc,worm2-worm1 add ix,bc pop bc + ld hl,handledworm + inc (hl) ;1..nrworms dnz handleworms ;----------------------------- @@ -1298,15 +1745,23 @@ WormDead: 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) @@ -1315,83 +1770,169 @@ thislevel =$+1 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 ;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 - 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 @@ -1405,7 +1946,7 @@ checkhilevel: 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 @@ -1416,41 +1957,50 @@ hilevelcheckdone: 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 ;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 @@ -1463,7 +2013,7 @@ waitkey: jr nz,waitkey ;x123456789012345678901 -;1----- GAME OVER ----- +;>>>>>> GAME OVER <<<<< ;2Multiplayer ;3Level 01 ;4 Died Score: @@ -1473,6 +2023,7 @@ waitkey: ;8Snaky @ 00 04820 ExitNoStats: + cal linkok ld hl,_asapvar rst 20h ;_ABS_MOV10TOOP1 rst 10h ;_FINDSYM @@ -1486,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) @@ -1496,37 +2046,34 @@ ExitNoStats: 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 ------------ @@ -1576,7 +2123,6 @@ unnamedlabel: respawndue: ld l,a cal inputcall - ld (sendbyte),a ld a,h ;previous cp l ;changed? ret z @@ -1585,77 +2131,93 @@ respawndue: 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) @@ -1734,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 @@ -1781,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 @@ -1800,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,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 ;----------------------------- @@ -1908,6 +2456,7 @@ nolap: ld (ix+reserv),a ret +#ifdef optdie checkhitotherworm: .db $dd,$7d ;ld a,lx cp worm2&255 @@ -1927,6 +2476,7 @@ chkworm: pop ix ret z ;not hit pop bc ;call +#endif stopworm: ld bc,0 previouspos =$-2 @@ -1944,14 +2494,13 @@ Drawworm: 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) @@ -2123,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 @@ -2147,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 ----------- @@ -2197,13 +2794,17 @@ scorecommon: 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 @@ -2212,36 +2813,52 @@ showstats: 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: @@ -2250,7 +2867,7 @@ __vputmap: pop ix ret -showstatsS: +showstatsS: ;(singleplayer) ld hl,txtLevel cal __vputs ld a,0 @@ -2310,6 +2927,11 @@ showA: jp _putc cshowA: + or a + jr nz,cshowavalue + ld hl,txtNone + jp _vputs +cshowavalue: ld l,a ld h,0 cal _divHLby10 @@ -2618,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: @@ -2676,20 +3257,59 @@ 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 @@ -2697,6 +3317,7 @@ boxloop: inc e dnz boxloop ret +#endif drawfatline: cal drawline @@ -2713,8 +3334,8 @@ drawfatline: ;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 @@ -2814,53 +3435,123 @@ line4sm: 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=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 @@ -2879,9 +3570,10 @@ sendfinish: 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 ;-------------- @@ -2891,17 +3583,12 @@ sendfinish: 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 @@ -2924,9 +3611,10 @@ recvwaitack: 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 ----------- ;----------------------------- @@ -2936,7 +3624,6 @@ LevelDef: .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 @@ -2952,60 +3639,90 @@ LevelDefM: .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 @@ -3021,69 +3738,78 @@ TrigPrecalc: .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 ( -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: @@ -3100,9 +3826,7 @@ lives = 12 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 @@ -3125,13 +3849,13 @@ maxnamelength = 8+1 .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: