wormy 0.97.115
authorMischa Poslawsky <wormy@shiar.org>
Tue, 15 Jan 2002 22:47:02 +0000 (23:47 +0100)
committerMischa Poslawsky <wormy@shiar.org>
Mon, 2 Mar 2009 21:31:53 +0000 (22:31 +0100)
wormy.txt
wormy.z80

index 1d5c319d3c373a4932aa1b391f48d30f2a7ac0fe..35f502982449b8806219ff5474232003fa962c89 100644 (file)
--- a/wormy.txt
+++ b/wormy.txt
@@ -139,5 +139,6 @@ Version:                 0.96.C24 (released end 2001)
         John Nesler     - more betatesting
          Many More       - betatesters
           too much..      - to list
+          Aaron Curtis    - doesn't fit in layout yet :(
 ______________________________________________________________________________
 =----------------------------------------------------------------------------=
\ No newline at end of file
index ab13324f4804c966a5685ce9c2a34c73896495fd..e3150cd5cbf3e0811fb83464cd562b6e51995e6f 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
-; Version                  :                                       97% (0.97.19)
-; Release Date             :                                      2002 January 9
+; Version                  :                                     97% (0.97.115A)
+; Release Date             :                                     2002 January 15
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
 ; Web Page                 :                                       www.shiar.org
-; Description              :                ruling Nibbles-like game 1-4 players
-; Where to get this game   :                       www.shiar.org (home of Wormy)
+; Description              :       perfect Nibbles game with free movement, nine
+;                                                    game modes, for 1-4 players
+; Where to get this game   :                                       www.shiar.org
 ; Other games by author(s) :                                        Nemesis beta
 ; Additional Credits to    : Matthew Shepcar  :   wrote original Peaworm, end'98
 ;                            Jonah Cohen      :              helped writing worm
 ; Files                    : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca
-;                            wormy.86p (6532) : efef32a8c541b4585087f55deb31f51d
+;                            wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d
 ;_______________________________________________________________________________
 
-;NOTES:
-;* Use for LEARNING practises ONLY!
-;   Don't _ever_ release altered code w/o permission!
-;* Code was originally by Scabby (Matthew Shepcar),
-;   a few lines by Jonah Cohen,
-;    and everything else by me - Shiar (Mischa Poslawsky).
-;* Although I've commented & labeled quite some stuff, I can't guarantee
-;   everybody will understand it. This is probably not the best source
-;    to learn z80 from. w00t the Shyer Way (tm).
-;* Also read wormy.txt please, thank you
-;* Don't scroll down if you get scared easily.
+;--- notes ---
+
+;     * Use for LEARNING practises ONLY!
+;        Don't _ever_ release altered code w/o permission!
+;         Please notify me of using code, and give me credits!
+;     * Code was originally by Scabby (Matthew Shepcar),
+;        a few lines by Jonah Cohen,
+;         and everything else by me - Shiar (Mischa Poslawsky).
+;     * Although I've commented & labeled quite some stuff, I can't guarantee
+;        everybody will understand it. This is probably not the best source
+;         to learn z80 from. w00t the Shyer Way (tm).
+;     * Also read wormy.txt please, thank you
+;     * Don't scroll down if you get scared easily.
 
 ;_______________________________________________________________________________
-; _______  _____        ______   _____
-;    |    |     |       |     \ |     |
-;    |    |_____| _____ |_____/ |_____|
+; _______  _____       ______   _____
+;    |    |     |      |     \ |     |
+;    |    |_____| ____ |_____/ |_____|
 ;_______________________________________________________________________________
 
 ; 97% = DONE
 ;     X [19] datalevels+nrlevels not in program if !intlevels
 ;     X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?)
 ;     X [19] alter level editor to use new address and set level id #97
+;     X [19A] team score!
+;     X [19A] autogrowth doesn't always work -> init (turn)
+;     X [111] ED: disabled objects counted causing CRASH when writing hiscore!
+;     X [111] LINK: init+multiple pea transmit seems to work..
+;     X [111] LINK: host/client swapped (host now sends level config)
+;     X [111] LINK: optimize transmit (most initcode same for client+host)
+;     X [113] menu limit in multifm not x10
+;     X [113] wormhit procedure seperate (called now)
+;     X [114] LINK: peas sent again :P
+;     X [114] internal level check and sprite storage removed
+;     X [115] layout data stuff at bottom
+;     X [115] ED: init place bar fixed
+;     X [115] ED: keys also usable together with mouse
+;     X [115] ED: improved version handling
+;     X [115] LINK: receive message not needed anymore afaik
+;     X [115A] $D8 used for spacing at g/o screen. i rule B)
+;     X [115A] exit at g/o goes back to menu
+;     X [115A] more in menu lets you reselect the levelfile
+;     X [115A] LINK: fixed waiting mode (minor display problem)
+;     * word-value display storage in chartable hole??
 ;  1% * misc (bugs, &&&, pollish, &&, &)
-;     * menu s/limit/peas in multifm
-;     * autogrowth doesn't always work
 ;     * look at init-z in line routine again
-;     * team score!
-;     * random pixel still occurs
-;     * LINK: optimize transmit
+;     * rare pea|wall overwrite <- apply stopworm fix?
 ;  1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
 ;     * LINK: called "Linkmatch" at g/o
+;     * LINK: minimize sent data (Gametype for example)
 ;     * LVL: episode #3: at least 5 lvls for each mp mode
 ;     * LVL: episode #4: 10 sp levels, including multipeas
 ;  1% * LVL: episode #5: ...
 ;     * LVL: Wormage
 ;     * LVL: Free Bird
 ;     * LVL: Jonah?
-
+;
 ;100% = bugs fixed + levels done
-;>    * switchable scoredecrease on death?
-;     * wall at pickup position fix
+;     * correct team winners
 ;     * arrow to offscreen peas
 ;110% * sound
 ;     * startpos
 ;120% * coop (DON'T COUNT ON IT)
+;     * pause in linkplay
 
 ;_______________________________________________________________________________
 ;  _/_/_____ __   _ _______        _     _ ______  _______
@@ -165,6 +185,8 @@ leveldata   = $F080 ;-F9FF (<=97F)
 #ifndef intlevels
 datalevels  = $FA00 ;-FA11 (12) (>=$C000)
 nrlevels    = $FA12 ;-FA1B (A)   (<$FA70)
+defspr      = $F078 ;-F07F (8)
+defsprsz    =  0
 #endif
 
 ;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong
@@ -212,7 +234,7 @@ start:              ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 97% .19",0
+ .db  " 97% .115A",0
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
@@ -262,6 +284,7 @@ Start:
   ld  i,a
   im  2 ;...it *does* work ;)
 
+restart:
   cal _RAM_PAGE_7
   ld  hl,$BFFF ;VAT start
   ld  ix,templevels
@@ -364,7 +387,7 @@ levelselectmenu: ;load next page
   ld  hl,$FC00+(2*16)
   ld  b,16*9
   cal menuinvloop
-  ld  hl,$FC00+(56*16)
+  ld  hl,$FC00+$380 ;(*,56)
   cal hr
   ld  hl,$0601 ;x=1
   ld  (_penCol),hl
@@ -492,8 +515,10 @@ levselectmenu:
 
 loadlevel:
   cal readylevelfile
+#ifdef intlevels
   or  a ;levelfile on page 0 (=internal)
   jr  z,levelloaded
+#endif
   cal skiptitle ;skip description
 
   cal _Get_Word_ahl
@@ -547,7 +572,7 @@ setdeflevels:
 
 ;--- trig tables ---
 
-  ld  hl,TrigPrecalc ;I believe this
+  ld  hl,trigtable   ;I believe this
   ld  de,SinCosTable  ;is one of the few
   psh de              ;pieces of original
   ld  bc,65            ;Peaworm code still
@@ -599,7 +624,7 @@ dispmainmenu:
   psh hl ;jump here after ret
   ld  hl,txtMenu
   ld  ix,posMenu
-;Mode|Level|Limit|Worms|worm #|controls
+;Mode|Level|Link|Worms|worm #|controls
 ; jr  dispmenucommon ;cal
 
 dispmenucommon_:
@@ -710,6 +735,9 @@ dispturndone:
   cal cshowA ;limit
   pop af ;a==0?
   jr  z,optionMenu ;do not display 0 behind 'None'
+  ld  a,c ;(gameCar)
+  rla ;and _dataPmult
+  jr  nz,optionMenu ;in multifood limit == #peas
   ld  a,'0'
   cal _vputmap ;x10
 
@@ -880,8 +908,8 @@ changenrworms:
   cal change4spOnly
   ld  a,(hl) ;hl=nrworms
   inc a
-  cp  5
-  jr  nc,mainMenu ;may not be >4
+  cp  7
+  jr  nc,mainMenu ;may not be >4+2
 changednrworms:
   ld  (hl),a
   jr  _dispmenusets ;mainMenu
@@ -889,6 +917,8 @@ changednrworms:
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
+  cp  K_MORE
+  jp  z,restart
   psh af
   cal menupos
   cal loadgamecar
@@ -913,13 +943,11 @@ selright:
 ; jr  z,changecurworm
 
 changecurworm:
-; hl=nrworms
-  ld  a,(curworm)
-  cp  (hl)
-  jr  nc,mainMenu ;may not become >(nrworms)
-  inc a
-changedcurworm:
-  ld  (curworm),a
+  ld  hl,curworm
+  ld  a,(hl)
+  cp  4
+  jr  nc,mainMenu ;may not become >4
+  inc (hl)
   jr  _dispmenusets ;mainMenu
 
 selleft:
@@ -936,24 +964,21 @@ selleft:
 ; jr  z,bchangecurworm
 
 bchangecurworm:
-  ld  a,(curworm)
-  dec a ;0-3
-  jr  nz,changedcurworm ;save >0
+  ld  hl,curworm
+  ld  a,(hl)
+  dec (hl) ;0-3
+  jr  nz,_dispmenusets ;save >0
+  inc (hl)
+_mainMenu:
   jr  mainMenu
 
-changenrwormsInit:
-  ld  a,(Gametype)
-  cp  3
-  ld  a,(hl) ;hl=nrworms
-  ret
 bchangenrworms:
   cal change4spOnly
   ld  a,(hl) ;hl=nrworms
-  dec a ;0-3
+  dec a ;0-(3+2)
   cp  2
   jr  nc,changednrworms ;save >=2
-_mainMenu:
-  jr  mainMenu
+  jr  _mainMenu
 
 change4spOnly:
   ld  a,(Gametype)
@@ -1043,7 +1068,7 @@ waitcustomkey:
 
 changekeys:
   cal getwormname
-  ld  hl,txtKeyleft
+  ld  hl,txtKleft
   cal getcustomkey ;left
   cal getcustomkey ;right
 ; jr  dispmenusets
@@ -1072,8 +1097,15 @@ dispmenusets:
   psh hl
   inc hl
   ld  a,(hl)
+  dec a ;0-5
+  and 3 ;0-3
+  inc a ;1-4
   add a,'0'
   cal _vputmap
+  ld  a,(hl)
+  cp  5
+  ld  hl,txtteamed
+  cal nc,_vputs
 
   ld  hl,$243E
   ld  (_penCol),hl
@@ -1208,7 +1240,7 @@ emptyname:
   ld  (hl),' '
   inc hl
   dnz emptyname
-  ld  a,maxnamelength
+  ld  a,maxnamesize
   ld  (namelength),a
 enternameloop:
   ld  hl,$FF07 ;begin pos
@@ -1233,7 +1265,7 @@ nokeypressed:
   jr  nz,continue
 backspace:
   ld  a,(hl)
-  cp  maxnamelength
+  cp  maxnamesize
   jr  nc,nokeypressed
   inc (hl)
   dec ix
@@ -1258,14 +1290,16 @@ continue:
   cal releasekeys
   jr  enternameloop
 
+savestr:
+  .db "00000" ;,0      ;&&&somehow put in chartable's 5-byte hole
 chartable:
-  .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
+  .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|-
+  .db -1,"XTOJE0",0    ;enter|+|-|*|/|^|clear|-
+  .db " WSNID9",0      ;(-)|3|6|9|)|tan|custom|-
+  .db "ZVRMHC8",-1     ;.|2|5|8|(|cos|prgm|del
+  .db "YUQLGB7#"       ;0|1|4|7|ee|sin|table|xvar
+  .db $D9,"-PKFA6'"    ;on|sto|,|x2|ln|log|graph|alpha
+  .db "54321*",-1,$D0  ;F5|F4|F3|F2|F1|2nd|exit|more
 
 nameentered:
   pop ix ;stringbegin
@@ -1460,119 +1494,120 @@ linkmatch:
   cal _clrWindow
   ld  c,wormVhost
   cal Qsend
-  ld  hl,txtWaiting
+  ld  hl,txtWaitn
   cal _puts
   cal Crecv
   ld  a,c
   cp  wormVclient
-  jr  z,client
-  cp  wormVhost
-  jr  z,host
-  pop hl ;error
-  jp  DisplayMenu ;return to menu
+  jr  nz,host
+
+;--- client ---
 
-host:
-  ld  c,wormVclient
-  cal Qsend
-  jr  sethost
 client:
-  ld  hl,txtReceive
-  cal _puts
-setclient:
- ;name/keys: wormy#1 = link    = 0  + link (name1)
- ;                 2 = worm #1 = #1 + local(name1)
- ;                 3 = link    = 0  + link (name2)
- ;                 4 = worm #2 = #2 + local(name2)
-  ld  de,worm2+left
-  ld  hl,worm1+left
-  ldi ;keys worm#2 = worm#1
-  ldi ;+right
-  ld  de,worm4+left
-  ldi ;keys worm#4 = worm#2
-  ldi
-  xor a
-  ld  (worm1+left),a ;worm 1...
-  ld  (worm3+left),a ;and worm 3 via link
-  ld  hl,worm1+name
-  ld  b,9
-  cal recvstuff
-  ld  hl,worm2+name
-  ld  b,9
-  cal sendstuff
+; ld  hl,txtReceiv
+; cal _puts ;shouldnt be necessary since this part always seems to work afaik
+
+ ;name/keys: wormy#1 = worm #1 = ok
+ ;                 2 = link    = 0  + link (name1)
+ ;                 3 = worm #2 = #2 + local(name2)
+ ;                 4 = link    = 0  + link (name2)
+  ld  e,worm3+left&255
+  cal moveworm2 ;3=2
+  ld  l,worm1+name&255
+  cal sendworm
+  ld  l,worm2+left&255
+  cal linkworm ;worm2+4 over link
   pop hl ;loadgamecar
   pop de ;leveldata
+  ld  de,linklevel
+  ld  hl,datalink
   psh de
   psh hl ;loadgamecar
-  ld  b,8
-  cal sendstuff
+  ld  b,8 ;&&&&&&&
+  cal recvstuff
   ld  hl,gameCar
   ld  b,1
-  cal sendstuff
+  cal recvstuff
   ld  hl,Gametype
   ld  b,1
-  cal sendstuff
+  cal recvstuff
   ex  de,hl
   ld  b,168
-  cal sendstuff
+  cal recvstuff
+
 _StartLevel:
   jr  StartLevel
-sendstuff:
-  psh de
-sendstuffloop:
-  psh bc
-  ld  c,(hl)
-  inc hl
-  cal Qsend
-  pop bc
-  dnz sendstuffloop
-  pop de
+
+linkerror:
+  pop hl ;error
+  jp  DisplayMenu ;return to menu
+
+;--- set/send worms ---
+
+moveworm2:
+  ld  hl,worm2+left
+moveworm: ;hl=wormN+left
+  ld  d,worm1/256
+  ld  bc,11
+  ldir ;keys+name worm(de) = worm(hl)
   ret
-recvstuff:
-  psh de
-recvstuffloop:
-  psh bc
-  cal Qrecv
-  ld  (hl),c
+linkworm: ;hl=wormN+left
+  ld  (hl),0 ;worm1|2+left
   inc hl
-  pop bc
-  dnz recvstuffloop
-  pop de
-  ret
-sethost:
- ;name/keys: wormy#1 = worm #1 = ok
- ;                 2 = link    = 0  + link (name1)
- ;                 3 = worm #2 = #2 + local(name2)
- ;                 4 = link    = 0  + link (name2)
-  ld  de,worm3+left
-  ld  hl,worm2+left
-  ldi ;keys worm#3 = worm#2
-  ldi ;+right
-  xor a
-  ld  (worm2+left),a ;worm 2+4..
-  ld  (worm4+left),a ;..over link
-  ld  hl,worm1+name
+  inc hl ;+name
+  ld  b,9
+  cal recvstuff
+  ld  bc,worm3-worm1-11 ;+2
+  add hl,bc ;b=0
+  ld  (hl),b ;worm3|4+left
+  inc hl
+  inc hl ;+name
+  ld  b,9
+  jp  recvstuff
+sendworm: ;hl=wormN+name
   ld  b,9
   cal sendstuff
-  ld  hl,worm2+name
+  ld  bc,worm3-worm1-9
+  add hl,bc ;worm(N+2)+name
   ld  b,9
-  cal recvstuff
+  jp  sendstuff
+
+;--- host ---
+
+host:
+  cp  wormVhost
+  jr  nz,linkerror
+  ld  c,wormVclient
+  cal Qsend
+
+ ;name/keys: wormy#1 = link    = 0  + link (name1)
+ ;                 2 = worm #1 = #1 + local(name1)
+ ;                 3 = link    = 0  + link (name2)
+ ;                 4 = worm #2 = #2 + local(name2)
+  ld  e,worm4+left&255
+  cal moveworm2 ;4=2
+  ld  e,worm2+left&255
+  ld  hl,worm1+left
+  cal moveworm ;2=1
+  ld  l,worm1+left&255
+  cal linkworm ;worm1+3 over link
+  ld  l,worm2+name&255
+  cal sendworm
   pop hl ;loadgamecar
   pop de ;leveldata
-  ld  de,linklevel ;&&&&&&&
-  ld  hl,datalink
   psh de
   psh hl ;loadgamecar
   ld  b,8
-  cal recvstuff
+  cal sendstuff
   ld  hl,gameCar
   ld  b,1
-  cal recvstuff
+  cal sendstuff
   ld  hl,Gametype
   ld  b,1
-  cal recvstuff
+  cal sendstuff
   ex  de,hl
   ld  b,168
-  cal recvstuff
+  cal sendstuff
 
 ;--- load level ---
 
@@ -1581,8 +1616,16 @@ StartLevel:
   ld  a,(hl)
   ld  (wormbeglives),a
   inc hl ;nrworms
+  ld  b,$11 ;=ignore (ld)
   ld  a,(hl)
+  cp  5
+  jr  c,teamset
+  sub 2
+  ld  b,$CD ;=continue (call)
+teamset:
   ld  (nrworms),a
+  ld  a,b
+  ld  (doteam),a ;do team score (CD) or not (11)
   inc hl ;level
   inc hl
   ld  a,(hl)
@@ -1590,6 +1633,7 @@ StartLevel:
   inc hl
   ld  a,(hl)
   ld  (growspeed),a
+  ld  (turn),a
   inc hl
   ld  a,(hl)
   ld  (turnleft),a
@@ -1681,10 +1725,10 @@ setspeed:
   add hl,bc ;hl=behind sprite
   jr  setsprite
 defaultsprite:
-  ld  a,defspritesz
+  ld  a,defsprsz
 defsprsize =$-1
 defsprite  =$+1
-  ld  de,defspriteimg
+  ld  de,defspr
 setsprite: ;de=@sprite ;a=sprsize
   ld  (sprsize),a
   ld  (spritepos),de
@@ -1878,9 +1922,9 @@ maskline:
 #endif
 
   ld  a,(gameCar)
-  rla ;bit _bitmultpeas,a
+  rla ;bit __bitPmult,a
   cal c,multnewpea ;a=0
-  rla ;bit _bitfood,a
+  rla ;bit __bitfood,a
   cal nc,NewPea
 nofood:
   ld  bc,(worm1+pos)
@@ -1940,10 +1984,10 @@ NoDelay:
   inc a ;-1
   jr  z,nextturnok
   dec (hl)
-  dec a ;0 (now <0)
+  dec a ;>=0
   jr  nz,nextturnok
 growspeed =$+1
-  ld  (hl),$FF
+  ld  (hl),$FF ;reset
 nextturnok:
 
   ld  a,(gameCar)
@@ -2107,9 +2151,9 @@ SpSave = $-2
   ld  hl,$FC10
   ld  b,16*11
   cal menuinvloop ;invert
-  ld  hl,$FD80
+  ld  hl,$FC00+$180
   cal hr ;menuinvloop w/ b=16
-  ld  hl,$FCE0
+  ld  hl,$FC00+$E0
   cal hr
   ld  hl,_curRow
   ld  (hl),2
@@ -2119,9 +2163,9 @@ SpSave = $-2
   ld  hl,$FC00
   ld  b,16*8
   cal menuinvloop ;invert
-  inc h ;$FD80
+  inc h ;$FC00+$180
   cal hr ;menuinvloop w/ b=16
-  ld  hl,$FCE0
+  ld  hl,$FC00+$E0
   cal hr
   ld  hl,_curRow
   inc (hl)
@@ -2137,12 +2181,14 @@ CURtxtGame =$-2
   ld  (_penCol),de
   ld  hl,txtName
   cal _vputs ;Name
-  ld  a,$3D
+  ld  a,$3C
   ld  (_penCol),a
   cal _vputs ;Died    Score
   ld  de,$0004
   ld  (_curRow),de
 
+;--- who won? ---
+
 findwinner:
   ld  hl,(worm1+score)
   ld  (winnerscore),hl
@@ -2183,6 +2229,16 @@ nonewdmwinner:
 
 ;--- display worms ---
 
+;x123456789012345678901
+;>>>>>> GAME OVER <<<<<
+;2Multiplayer
+;3Level 01
+;4           Died Score:
+;5NameName     03 00070
+;6Worm#02 @    05 00120
+;7Worm#03      15 00030
+;8Snaky   @    00 04820
+
   ld  a,(nrworms)
   ld  b,a
   ld  hl,worm1+died
@@ -2193,7 +2249,7 @@ displayWormStats:
   ld  bc,left-died
   add hl,bc ;+left
   xor a
-  cp  (hl)  ;input=0 = link
+  cp  (hl)  ;left=0 = link
   jr  nz,NoLinkIndic
   ld  a,9
   ld  (_curCol),a
@@ -2315,46 +2371,17 @@ NotNewHigh:
 hiscorecheckdone:
 
 waitkey:
+  ld  hl,DisplayMenu
+  psh hl ;main menu
+waitkeyloop:
   cal ubergetkey
   cp  K_ENTER
-  jp  z,DisplayMenu
+  ret z
   cp  K_SECOND
-  jp  z,DisplayMenu
+  ret z
   cp  K_EXIT
-  jr  nz,waitkey
-
-;x123456789012345678901
-;>>>>>> GAME OVER <<<<<
-;2Multiplayer
-;3Level 01
-;4           Died Score:
-;5NameName     03 00070
-;6Worm#02 @    05 00120
-;7Worm#03      15 00030
-;8Snaky   @    00 04820
-
-ExitNoStats:
-  cal linkok
-  ld  hl,_asapvar
-  rst 20h ;_ABS_MOV10TOOP1
-  rst 10h ;_FINDSYM
-  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,savestart
-  cal _SET_ABS_SRC_ADDR
-  ld  hl,saveend-savestart
-  cal _MM_LDIR_SET_SIZE
-
-  cal releasekeys
-  res 4,(iy+9)
-  set 2,(iy+13)
-  im  1 ;remove keyfix
-  jp  _clrWindow
+  jr  nz,waitkeyloop
+  ret
 
 loadhiscoreposinahl:
   ld  hl,0 ;for peaworm and singleplayer
@@ -2381,7 +2408,7 @@ hiscrposa =$+1
   adc a,0 ;ahl=saveloc
   ret
 highsave:
-  .db 0,0,"WOR ",0
+  .db 0,0,"SHI ",0
 
 iswinner:
   ld  a,10
@@ -2389,6 +2416,31 @@ iswinner:
   ld  a,'*'
   jp  _putc ;..then put *
 
+;--- quit ---
+
+ExitNoStats:
+  cal linkok
+  ld  hl,_asapvar
+  rst 20h ;_ABS_MOV10TOOP1
+  rst 10h ;_FINDSYM
+  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,savestart
+  cal _SET_ABS_SRC_ADDR
+  ld  hl,saveend-savestart
+  cal _MM_LDIR_SET_SIZE
+
+  cal releasekeys
+  res 4,(iy+9)
+  set 2,(iy+13)
+  im  1 ;remove keyfix
+  jp  _clrWindow
+
 ;_______________________________________________________________________________
 ; _  _  _  _____   ______ _______       _______ _______ _     _ _______ _______
 ; |  |  | |     | |_____/ |  |  |       |______    |    |     | |______ |______
@@ -2396,7 +2448,7 @@ iswinner:
 ;_______________________________________________________________________________
 
 respawncheck:
-  cp  respawndelay-1
+  cp  rspawndelay-1
   jr  nz,unnamedlabel
   cal saverespawncounter
 removeworm:
@@ -2566,7 +2618,7 @@ donediddelydone:
 ;--- move worm ---
 
 Wormmove:
-  psh bc                        ; >> pos
+  psh bc ;pos
   ld  a,(hl)
   add a,a
   add a,d
@@ -2592,13 +2644,13 @@ notnegY:
   jr  nc,notmoveY
   inc c
 notmoveY: ;bc=newpos
-  ld  (ix+pos2),e
-  ld  (ix+pos2+1),d
   ld  (ix+pos),c
   ld  (ix+pos+1),b
+  ld  (ix+pos2),e
+  ld  (ix+pos2+1),d
 
 ;-check-
-  pop hl                         ; << pos (old)
+  pop hl ;pos (old)
   ld  a,h
   sub b
   and 1
@@ -2614,216 +2666,17 @@ notmoveY: ;bc=newpos
 GotFour:
   cal chk4pixels
   rl  d
-  jp  nc,Drawworm
+  cal c,hitworm
 
-;--- worm hit ---
+;--- draw worm ---
 
-Hitworm:
-  ld  a,(gameCar)
-#ifdef optdie
-; if race - originally
-  ld  h,a
-  cal checkhitotherworm
-  ld  a,h
-#endif
-  bit _bitctfpeas,a
-  jr  nz,chkctfpeas
-  rla ;and _datamultpeas
-  jp  c,chkmultpeas
-  rla ;and _datafood
-  jp  c,WormDead ;no food
+Drawworm:
+  ld  c,(ix+pos)
+  ld  b,(ix+pos+1)
 
-  ld  hl,0
-PeaY =$-2
-PeaX =$-1
-  cal chkpeahit
-  jp  nc,WormDead
-pickpea:
-  cal DrawPea ;remove pea
-  cal NewPea
-pickpea_:
-  ld  a,(ix+grow)
-  add a,15
-peagrowth =$-1
-  ld  (ix+grow),a
-  jr  nc,wormset2grow
-  inc (ix+grow+1)
-wormset2grow:
-  ld  hl,Left
-  dec (hl) ;dec left before display
-  psh af
-  ld  e,10
-  cal IncScore
-  pop af
-  jp  nz,Drawworm ;continue
   ld  a,(Gametype)
-  or  a
-  jp  nz,Exit ;stack restored
-
-  ld  hl,Level
-  ld  a,(hl)
-  inc (hl)
-  ld  l,a ;hl=Level
-  ld  h,0
-  add hl,hl
-  add hl,hl
-  cal _HLTIMES10
-  ex  de,hl
-  cal _IncScore ;score+(40*level)
-  cal removeworm
-  pop hl                         ; << call
-  pop hl                         ; << call
-  ld  (ix+delay),2
-  jp  Nextlevel
-
-chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
-  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
-
-chkctfpeas:
-  ld  hl,(peaspos) ;1st pea
-  ld  a,(ix+reserv)
-  ld  e,a ;push a
-  and %01 ;ourpea (0|1)
-  jr  z,sel_otherpea
-  ld  hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
-sel_otherpea:
-  cal chkpeahit
-  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
-  psh af
-  cal WormDead
-  pop af ;which flag? (=and %1)
-  ld  hl,drawctfpea1 ;restore #1
-  jr  z,nottheotherflag
-  inc hl ;ld hl,drawctfpea2
-  inc hl ;restore #2
-nottheotherflag:
-  ld  (hl),3 ;draw delay 3 turns
-  ret
-
-hitflag: ;correct pea hit
-  ld  a,e ;pop a
-  xor %11 ;invert flag taken + ownflag
-  ld  (ix+reserv),a
-  and %10 ;just returned?
-  psh af ;safe z-flag
-  cal DrawPea ;remove
-  pop af
-  jr  nz,Drawworm ;flag taken, continue game
-  psh hl
-  ld  e,20 ;flag captured+returned
-  cal IncScore
-  pop hl
-  ld  a,3 ;draw delay
-  ld  (drawctfpea1),a ;redraw..
-  ld  (drawctfpea2),a ;..both flags
-  jr  Drawworm
-
-chkmultpeas:
-  ld  de,peaspos-1
-  ld  hl,lefttotalb
-lefttotal =$+1
-  ld  (hl),0
-chkmultpealoop:
-  ex  de,hl
-  inc hl
-  ld  e,(hl)
-  inc hl
-  ld  d,(hl)
-  ex  de,hl
-  psh de
-  cal chkpeahit
-  pop de
-  jr  c,pickmultpea
-  ld  hl,lefttotalb
-  dec (hl)
-  jr  nz,chkmultpealoop
-  jp  WormDead
-pickmultpea:
-  ld  a,247
-  ld  (de),a
-  dec de
-  ld  (de),a
-  cal DrawPea
-  jp  pickpea_
-
-;--- misc ---
-
-#ifdef optdie
-nextotherwormbit:
-  ld  a,c
-  sub (hl)
-  inc hl
-  inc a
-  cp  4
-  jr  nc,nothit1 ;no
-  ld  a,b
-  sub (hl)
-  inc a
-  cp  4
-  ret c ;nz ;yes
-nothit1:
-  inc hl
-  cal resbit
-ChkWorm:
-  cal _cphlde
-  jr  nz,nextotherwormbit
-  ret ;z
-#endif
-
-checkhitlapline:
-  ld  a,(peaspos) ;63
-  sub b ;x==63
-  jr  z,nextlaphalf
-  inc a
-  ret nz
-nextlaphalf:
-  ld  a,(peaspos+1) ;yline
-  cp  c ;ypos
-  ld  a,1
-  jr  nc,checklap ;y>yline -> a=1
-  xor a ;y<yline -> a=0
-checklap:
-  cp  (ix+reserv)
-  ret z ;same as before
-  ld  (ix+reserv),a ;1st time
-  ld  e,a
-  ld  a,(handledworm)
-  and 1 ;group 0 (1,3) or 1 (2,4)
-  xor e
-  ret z ;(group 0 and y<yline) or (group 1 and y>yline)
-  psh bc
-  ld  e,20
-  cal IncScore ;lap!
-  pop bc
-  ret
-
-;--- draw worm ---
-
-Drawworm:
-  ld  c,(ix+pos)
-  ld  b,(ix+pos+1)
-
-  ld  a,(Gametype)
-  cp  gamerace
-  cal z,checkhitlapline
+  cp  gamerace
+  cal z,checkhitlapline
 
   cal set4pixels
   dec c
@@ -2980,6 +2833,212 @@ checkballhit:
   pop de
   ret
 
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______ __   __       _     _ _____ _______
+; |  |  | |     | |_____/ |  |  |   \_/         |_____|   |      |
+; |__|__| |_____| |    \_ |  |  |    |    _____ |     | __|__    |
+;_______________________________________________________________________________
+
+hitworm:
+  ld  a,(gameCar)
+#ifdef optdie
+; if race - originally
+  ld  h,a
+  cal checkhitotherworm
+  ld  a,h
+#endif
+  bit __bitPctf,a
+  jr  nz,chkctfpeas
+  rla ;and _dataPmult
+  jp  c,chkmultpeas
+  rla ;and _datafood
+  jp  c,wormdead ;no food
+
+  ld  hl,0
+PeaY =$-2
+PeaX =$-1
+  cal chkpeahit
+  jp  nc,wormdead
+pickpea:
+  cal DrawPea ;remove pea
+  cal NewPea
+pickpea_:
+  ld  a,(ix+grow)
+  add a,15
+peagrowth =$-1
+  ld  (ix+grow),a
+  jr  nc,wormset2grow
+  inc (ix+grow+1)
+wormset2grow:
+  ld  hl,Left
+  dec (hl) ;dec left before display
+  psh af
+  ld  e,10
+  cal IncScore
+  pop af
+  jp  nz,Drawworm ;continue
+  ld  a,(Gametype)
+  or  a
+  jp  nz,Exit ;stack restored
+
+  ld  hl,Level
+  ld  a,(hl)
+  inc (hl)
+  ld  l,a ;hl=Level
+  ld  h,0
+  add hl,hl
+  add hl,hl
+  cal _HLTIMES10
+  ex  de,hl
+  cal _IncScore ;score+(40*level)
+  cal removeworm
+  pop hl ;<<$some call
+  pop hl ;<<call HandleWorm
+  pop hl ;<<call hitworm
+  ld  (ix+delay),2
+  jp  Nextlevel
+
+chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
+  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
+
+;--- other modes ---
+
+chkctfpeas:
+  ld  hl,(peaspos) ;1st pea
+  ld  a,(ix+reserv)
+  ld  e,a ;push a
+  and %01 ;ourpea (0|1)
+  jr  z,sel_otherpea
+  ld  hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
+sel_otherpea:
+  cal chkpeahit
+  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
+  psh af
+  cal wormdead
+  pop af ;which flag? (=and %1)
+  ld  hl,drawctfpea1 ;restore #1
+  jr  z,nottheotherflag
+  inc hl ;ld hl,drawctfpea2
+  inc hl ;restore #2
+nottheotherflag:
+  ld  (hl),3 ;draw delay 3 turns
+  ret
+
+hitflag: ;correct pea hit
+  ld  a,e ;pop a
+  xor %11 ;invert flag taken + ownflag
+  ld  (ix+reserv),a
+  and %10 ;just returned?
+  psh af ;safe z-flag
+  cal DrawPea ;remove
+  pop af
+  ret nz ;flag taken, continue game
+  psh hl
+  ld  e,20 ;flag captured+returned
+  cal IncScore
+  pop hl
+  ld  a,3 ;draw delay
+  ld  (drawctfpea1),a ;redraw..
+  ld  (drawctfpea2),a ;..both flags
+  ret ;Drawworm
+
+chkmultpeas:
+  ld  de,peaspos-1
+  ld  hl,lefttotalb
+lefttotal =$+1
+  ld  (hl),0
+chkmultpealoop:
+  ex  de,hl
+  inc hl
+  ld  e,(hl)
+  inc hl
+  ld  d,(hl)
+  ex  de,hl
+  psh de
+  cal chkpeahit
+  pop de
+  jr  c,pickmultpea
+  ld  hl,lefttotalb
+  dec (hl)
+  jr  nz,chkmultpealoop
+  jp  wormdead
+pickmultpea:
+  ld  a,247
+  ld  (de),a
+  dec de
+  ld  (de),a
+  cal DrawPea
+  jp  pickpea_
+
+;--- misc ---
+
+#ifdef optdie
+nextotherwormbit:
+  ld  a,c
+  sub (hl)
+  inc hl
+  inc a
+  cp  4
+  jr  nc,nothit1 ;no
+  ld  a,b
+  sub (hl)
+  inc a
+  cp  4
+  ret c ;nz ;yes
+nothit1:
+  inc hl
+  cal resbit
+ChkWorm:
+  cal _cphlde
+  jr  nz,nextotherwormbit
+  ret ;z
+#endif
+
+checkhitlapline:
+  ld  a,(peaspos) ;63
+  sub b ;x==63
+  jr  z,nextlaphalf
+  inc a
+  ret nz
+nextlaphalf:
+  ld  a,(peaspos+1) ;yline
+  cp  c ;ypos
+  ld  a,1
+  jr  nc,checklap ;y>yline -> a=1
+  xor a ;y<yline -> a=0
+checklap:
+  cp  (ix+reserv)
+  ret z ;same as before
+  ld  (ix+reserv),a ;1st time
+  ld  e,a
+  ld  a,(handledworm)
+  and 1 ;group 0 (1,3) or 1 (2,4)
+  xor e
+  ret z ;(group 0 and y<yline) or (group 1 and y>yline)
+  psh bc
+  ld  e,20
+  cal IncScore ;lap!
+  pop bc
+  ret
+
 ;_______________________________________________________________________________
 ;  _____   ______  _____  _______ _______
 ; |_____] |_____/ |     | |       |______
@@ -3015,13 +3074,15 @@ Seed =$+1
   add a,2
   ret
 
+wormdead:
+  pop hl ;<<call
 WormDead:
 #ifdef invincible
   jp  stopworm
 #endif
   ld  a,2
   ld  (flashtime),a
-  ld  (ix+delay),respawndelay
+  ld  (ix+delay),rspawndelay
 
 thislevel =$+1
   ld  hl,0
@@ -3170,6 +3231,7 @@ NewPea:
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
+drawpea_:
   ld  de,0
 spritepos =$-2
 ; jp PutSprite
@@ -3218,6 +3280,48 @@ nextbitok:
 ; ______| |_____  |_____| |    \_ |______
 ;_______________________________________________________________________________
 
+addteamscore:
+  ld  a,(handledworm)
+  cp  2
+  ld  de,worm3-worm1
+  jr  c,bla
+  ld  de,worm1-worm3
+bla:
+  psh ix
+  add ix,de
+  ex  de,hl
+  cal ldscoreinhl
+  pop ix
+  add hl,de
+  ret
+
+_divHLby1000:
+  psh hl
+  ld  b,3
+divideagain: ;3x
+  cal _divHLby10
+  dnz divideagain
+  ld  a,l ;a=hl/1000
+  pop hl
+  ret
+
+DecScore10:
+  cal ldscoreinhl
+  ld  de,-10
+  add hl,de
+  jr  nc,showstats ;<0=0
+  jr  scorecommon
+
+extralives:
+  cal _divHLby1000
+  ld  c,a
+  add hl,de ;increase score
+  cal _divHLby1000
+  cp  c
+  jr  z,scorecommon ;hl/1000 not increased
+  inc (ix+lives)
+  jr  scorecommon
+
 timematchscore:
   ;piece of crap checking whether you've already won in timematch
   ld  a,(nrworms)
@@ -3254,33 +3358,6 @@ nneexxtt:
   dnz chktimematchover
   jp  anyworm ;g/o
 
-_divHLby1000:
-  psh hl
-  ld  b,3
-divideagain: ;3x
-  cal _divHLby10
-  dnz divideagain
-  ld  a,l ;a=hl/1000
-  pop hl
-  ret
-
-extralives:
-  cal _divHLby1000
-  ld  c,a
-  add hl,de ;increase score
-  cal _divHLby1000
-  cp  c
-  jr  z,scorecommon ;hl/1000 not increased
-  inc (ix+lives)
-  jr  scorecommon
-
-DecScore10:
-  cal ldscoreinhl
-  ld  de,-10
-  add hl,de
-  jr  nc,showstats ;<0=0
-  jr  scorecommon
-
 IncScore: ;inc score by e
   ld  d,0
 _IncScore ; inc by de
@@ -3292,6 +3369,8 @@ _IncScore ; inc by de
 scorecommon:
   ld  (ix+score+1),h
   ld  (ix+score),l ;save
+doteam:
+  cal addteamscore ;cal=CD | ld de,*=11
   ld  de,0
 scorelimit =$-2
   ld  a,d
@@ -3369,7 +3448,7 @@ showlives:
   jr  cshowA00
 
 cshowA: ;small w/ leading 0
-  or  a
+  or  a ;destr. ahl
   jr  nz,cshowA00
   ld  hl,txtNone
   jp  _vputs
@@ -3443,18 +3522,16 @@ showA0: ;big w/ leading 0
   jp  _putc
 
 _D_HL_DECI:
-  ld  de,savestr+4
+  ld  de,savestr+5
   ld  b,5
 ldhld:
   cal _divHLby10
   add a,'0'
-  ld  (de),a
   dec de
+  ld  (de),a
   dnz ldhld
-  ld  hl,savestr
+  ex  de,hl ;ld hl,savestr
   ret
-savestr:
-  .db "00000",0
 
 ldscoreinhl:
   ld  h,(ix+score+1)
@@ -3982,8 +4059,43 @@ line4sm:
   jr  DoneLine
 
 
+;..and last but not least..:
+;_______________________________________________________________________________
+;        _____ __   _ _     _   /
+; |        |   | \  | |____/   /
+; |_____ __|__ |  \_| |    \_ .
+;_______________________________________________________________________________
+
+timeout = $8000
+lossout = 20
+
+;--- multiple bytes ---
+
+sendstuff:
+  psh de
+sendstuffloop:
+  psh bc
+  ld  c,(hl)
+  inc hl
+  cal Qsend
+  pop bc
+  dnz sendstuffloop
+  pop de
+  ret
+recvstuff:
+  psh de
+recvstuffloop:
+  psh bc
+  cal Qrecv
+  ld  (hl),c
+  inc hl
+  pop bc
+  dnz recvstuffloop
+  pop de
+  ret
+
 ;--- foo ---
-;wild insert
+
 receivenewpeaoverlink:
   cal Qrecv ;Crecv
   ld  l,c
@@ -4002,16 +4114,6 @@ sendnewpeaoverlink:
   ld  c,h
 ; jr  Qsend ;that's why it's here
 
-;..and last but not least..:
-;_______________________________________________________________________________
-;        _____ __   _ _     _   /
-; |        |   | \  | |____/   /
-; |_____ __|__ |  \_| |    \_ .
-;_______________________________________________________________________________
-
-timeout = $8000
-lossout = 20
-
 ;--- send ---
 
 Qsend:         ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
@@ -4181,6 +4283,8 @@ LevelDefC: ;ctf
 ; |_____/ |     |    |    |     |
 ;_______________________________________________________________________________
 
+;--- graphics ---
+
 wtPicture: ;title
 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
@@ -4210,131 +4314,141 @@ wtWormy: ;g/o
 
 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
 
-txtMenu:  .db "Mode",0  ;1st menu item
-         .db "Level",0 ;2nd
-         .db "Link",0  ;...
-         .db "Worms",0
-         .db "worm #",0
-posMenu:  .db 5
-         .dw $2418,$231E,$2824,$1F2A,$1730
-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: .db 6
-         .dw $2618,$251E,$2524,$222A,$1A30,$1C36
-txtpMenu: .db "Resume",0  ;1st menu item
-         .db "Turn Off",0 ;2nd
-         .db "Contrast",$CF,5,0  ;...
-         .db "Exit",0
-pospMenu: .db 4
-         .dw $3418,$331E,$2F24,$3A2A
-txtGame:  .db "Singleplayer",0
-txtGame1: .db "Peaworm",0
-txtGame2: .db "Tron",0
-txtGame3: .db "Deathmatch",0
-txtGame4: .db "Foodmatch",0
-txtGame5: .db "Multifoodmatch",0
-txtGame6: .db "Timematch",0
-txtGame7: .db "Race",0
-txtGame8: .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
-         .db txtGame8-txtGame
+#ifndef coolzgfx
+txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
+#endif
+
+;--- menus ---
+
+txtMenu:   .db "Mode",0  ;1st menu item
+          .db "Level",0 ;2nd
+          .db "Link",0  ;...
+          .db "Worms",0
+          .db "worm #",0
+posMenu:   .db  5
+          .dw $2418,$231E,$2824,$1F2A,$1730
+txtteamed: .db " vs 2",0
+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:  .db  6
+          .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+txtpMenu:  .db "Resume",0  ;1st menu item
+          .db "Turn Off",0 ;2nd
+          .db "Contrast",$CF,5,0  ;...
+          .db "Exit",0
+pospMenu:  .db  4
+          .dw $3418,$331E,$2F24,$3A2A
+
+;--- text ---
+
+txtGame:   .db "Singleplayer",0
+txtGame1:  .db "Peaworm",0
+txtGame2:  .db "Tron",0
+txtGame3:  .db "Deathmatch",0
+txtGame4:  .db "Foodmatch",0
+txtGame5:  .db "Multifoodmatch",0
+txtGame6:  .db "Timematch",0
+txtGame7:  .db "Race",0
+txtGame8:  .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
+          .db txtGame8-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
-posLevsel = $0320
-txtLevsel:  .db $CF," SELECT LEVELS ",5,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
-.db  48, 51, 54, 57, 59, 62, 65, 67
-.db  70, 73, 75, 78, 80, 82, 85, 87
-.db  89, 91, 94, 96, 98,100,102,103
-.db 105,107,108,110,112,113,114,116
-.db 117,118,119,120,121,122,123,123
-.db 124,125,125,126,126,126,126,126
-.db 127
+txtKleft:  .db ":left",0
+txtKright: .db "/right",0
+posLevsel   =  $0320
+txtLevsel: .db $CF," SELECT LEVELS ",5,0
+txtWaitn:  .db "Waiting" ;"...",0
+txtReceiv: .db "...",0
 
+#ifdef readytext
+txtReady:  .db "Prepare!",0
+txtposReady =   7
+#endif
 txtLevel:  .db "Level ",0
 txtWorms:  .db "Worms: 0",0    ;follows txtLevel
 txtName:   .db "Name",0
-txtWinner: .db "Wins   "       ;follows txtName
-txtDied:   .db "Died    "      ;follows txtWinner
+txtWinner: .db "Wins",$D8      ;follows txtName
+txtDied:   .db "Died",$D8      ;follows txtWinner
 txtScore:  .db "Score",0       ;follows txtDied
 txtLeft:   .db " left",0       ;follows txtScore
-txthiscore:.db "HiScore:",0
-#ifdef readytext
-txtReady:  .db "Prepare!",0
-txtposReady = 7
-#endif
-#ifndef coolzgfx
-txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
-#endif
+txthiscore:.db "HiScore:" ;,0
+
+;--- foo ---
+
+trigtable: .db   0,  3,  6,  9, 12, 15, 18, 21
+           .db  24, 27, 30, 33, 36, 39, 42, 45
+           .db  48, 51, 54, 57, 59, 62, 65, 67
+           .db  70, 73, 75, 78, 80, 82, 85, 87
+           .db  89, 91, 94, 96, 98,100,102,103
+           .db 105,107,108,110,112,113,114,116
+           .db 117,118,119,120,121,122,123,123
+           .db 124,125,125,126,126,126,126,126,127
 
 #ifdef intlevels
-datalevels: .dw LevelDef, LevelDefM,LevelDefT
-            .dw LevelDefM,LevelDefM,LevelDefM,LevelDefM
-            .dw LevelDefR,LevelDefC
-nrlevels:   .db 2,3,1,3,3,3,3,3,1,0     ;=defaults
+datalevels:.dw LevelDef, LevelDefM,LevelDefT
+           .dw LevelDefM,LevelDefM,LevelDefM,LevelDefM
+           .dw LevelDefR,LevelDefC
+nrlevels:  .db 2,3,1,3,3,3,3,3,1,0     ;=defaults
+defhiscrpos:
+           .db 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI"
+#else
+defhiscrpos = 0
 #endif
 
-_datalink      = %00000001 ;linkplay
-_datafoodl     = %00000010 ;left=0 limit
-_datasingl     = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
-_datactfpeas   = %00001000 ;ctf peas=1
-_bitctfpeas    = 3
-_datatime      = %00010000 ;time incs score (timematch)
-_datafood      = %01000000 ;food present=0
-_bitfood       = 6
-_datamultpeas  = %10000000 ;multiple peas=1 (no _datafood)
-_bitmultpeas   = 7
-;reserved        %00100000 ;for future use
-
-savestart:        ;      �game info (see above)
-                  ;      | �lives (0=unlimited)
-                  ;      | | �nrworms (can be altered by user)
-                  ;      | | | �level (reset to 1 at startup)
-                  ;      | | | |  �speed/delay (-1=def)
-                  ;      | | | |  |  �grow speed (-1=none; 0=continuous)
-                  ;      | | | |  |  |  �turn speed (8=def)
-                  ;      | | | |  |  |  |  �score limit (0=none)
-gamesingle   =  0 ;      | | | |  |  |  |  |
-datasingle: .db  %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
-gamepeas     =  1
-datapeas:   .db  %00000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
-gametron     =  2
-datatron:   .db  %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
-gamedeathm   =  3
-datadeathm: .db  %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
-gamefoodm    =  4
-datafoodm:  .db  %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
-gamemfoodm   =  5
-datamfoodm: .db  %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas))
-gametimem    =  6
-datatimem:  .db  %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
-gamerace     =  7
-datarace:   .db  %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
-gamectf      =  8
-datactf:    .db  %01001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
+;--- game settings ---
+
+_datalink   =  %00000001 ;linkplay (1!)
+_datafoodl  =  %00000010 ;left=0 limit
+_datasingl  =  %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) &&1?
+_dataPctf   =  %00001000 ;ctf peas=1
+__bitPctf   =   3
+_datatime   =  %00010000 ;time incs score (timematch)
+;reserved      %00100000 ;for future use
+_datafood   =  %01000000 ;food present=0 (6!)
+_dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
+
+savestart:       ;      �game info (see above)
+                 ;      | �lives (0=unlimited)
+                 ;      | | �nrworms (can be altered by user)
+                 ;      | | | �level (reset to 1 at startup)
+                 ;      | | | |  �speed/delay (-1=def)
+                 ;      | | | |  |  �grow speed (-1=none; 0=continuous)
+                 ;      | | | |  |  |  �turn speed (8=def)
+                 ;      | | | |  |  |  |  �score limit (0=none)
+gamesingle  =  0 ;      | | | |  |  |  |  |
+datasingle:.db  %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+gamepeas    =  1
+datapeas:  .db  %00000100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
+gametron    =  2
+datatron:  .db  %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+gamedeathm  =  3
+datadeathm:.db  %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
+gamefoodm   =  4
+datafoodm: .db  %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+gamemfoodm  =  5
+datamfoodm:.db  %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
+gametimem   =  6
+datatimem: .db  %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
+gamerace    =  7
+datarace:  .db  %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
+gamectf     =  8
+datactf:   .db  %01001000,0,6,1,-1,-1, 8,10 ;CTF (100 score)
 
 worm1set:  .dw worm1p,worm1p
            .db %11110111,1,-01,K_RIGHT,K_LEFT
@@ -4349,55 +4463,45 @@ worm4set:  .dw worm4p,worm4p
            .db %11111101,0,-01,K_PLUS,K_ENTER
 worm4name: .db "JIM     ",0
 
-defhiscrpos:
-#ifdef intlevels
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-#endif
-
-Gametype:  .db 0 ;last gamemode
+Gametype:  .db  0 ;last gamemode
 
 saveend:
 
-               ;set:
-heading  = 0   ;level*
-pos      = 2   ;level*
-pos2     = 4   ;level
-grow     = 6   ;level
-died     = 8   ;game
-score    = 9   ;game
-delay    = 11  ;game
-               ;19B @game
-lives    = 12
-head     = 13  ;4B (head=tail)
-tail     = 15  ;also@next level
-storepos = 17
-reserv   = 18  ;loop (race:lap|ctf:pea)
-input    = 19 ;---currently unused afaik---
-left     = 20
-right    = 21
-name     = 22
-wormsize = 31
-
-startdelay    = 30
-respawndelay  = 30
-maxnamelength = 8+1
-
-defspritesz = 4
-defspriteimg:  .db %01100000
-               .db %11110000
-               .db %11110000
-               .db %01100000
+                    ;set:
+heading     =   0   ;level*
+pos         =   2   ;level*
+pos2        =   4   ;level
+grow        =   6   ;level
+died        =   8   ;game
+score       =   9   ;game
+delay       =   11  ;game
+                    ;19B @game
+lives       =   12
+head        =   13  ;4B (head=tail)
+tail        =   15  ;also@next level
+storepos    =   17
+reserv      =   18  ;loop (race:lap|ctf:pea)
+input       =   19 ;---currently unused afaik---
+left        =   20
+right       =   21
+name        =   22
+wormsize    =   31
+
+startdelay  =   30
+rspawndelay =   30
+maxnamesize =   8+1
 
 #ifdef intlevels
-deflevels:
-  .db "Internal Levels",0
-  .db "by Shiar" ;,0
+defsprsz    =   4
+defspr:    .db %01100000
+           .db %11110000
+           .db %11110000
+           .db %01100000
+
+deflevels: .db "Internal Levels",0
+           .db "by Shiar" ;,0
 
-  .db 0,deflevels/256,deflevels&255
+           .db 0,deflevels/256,deflevels&255
 #endif
 templevels: