wormy 0.95.1914
[wormy.git] / wormy.z80
index 6ed5a09dfdc5329daa4672abb5140d3034744374..edb70567e7d1f53e739135f999a81bf4f9f31cfa 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -1,10 +1,9 @@
 ; Title                      : Wormy
-; Version                    : 93%
+; Version                    : 95%
 ; Release Date               : summer 2001
 ; Filename                   : wormy.86p (5kb)
 ; Author(s)                  : Shiar
-; Email Address              : shiar0@hotmail.com
-; ICQ UIN                    : #43840958
+; 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)
@@ -16,7 +15,7 @@
 ;----------- TO-DO -----------
 ;-----------------------------
 
-; 93% = DONE
+; 95% = DONE
 
 ;    [* internal levels         ]
 ;    [  * check levels/gametype ]
 ;   * LINK
 ;     * 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
-;  1% * fix wormstop in race
+;  1% * 1/3 worms over link
+;;;1% * get g/o signal (l&l) working
+;;;1% * send new peas' positions
 
 ;100% = bugs fixed + levels done
 
@@ -42,8 +39,8 @@
 
 #define buffer      ;use display buffer (otherwise write directly to screen)
 #define readymask   ;"greys" out the field before starting a level
-;#define hlines     ;horizontal-line routine for more speed drawing boxes
-                       ;^^(doesn't work properly)^^
+#define coolzgfx    ;nice graphics for game over screen
+
 ;#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
@@ -100,19 +97,21 @@ worm2       = $AC1F ;-AC3B (1F)
 worm3       = $AC3E ;-AC59 (1F)
 worm4       = $AC5D ;-AC77 (1F)
 balls       = $AC7C ;-ACFF (3x43d)
-SinCosTable = $AD00 ;-AE00 (4x40)
+SinCosTable = $AD00 ;-AE00 (4*40)
         ;free $AE01 ;-AFFF (1FF)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
         ;free $BF91 ;-BFFF (6F)
-
-     ;program $D748 ;-E7FF (106D+4A)
-        ;free $E800 ;-EFFF (800)
+     ;program $D748 ;-EFFF (186D+4A)
 worm4p      = $F000 ;-F3FF (400)      %11110O00
 leveldata   = $F400 ;-FA70 (<=671)
 
-turn10  = $AE01
-peaspos = $AE02
+turn10      = $AE01 ;      (1) (counter)
+peaspos     = $AE02 ;-AE05 (4) (peas)
+
+;MEM|8---9---A---B---C---D---E---F---|
+;   |..[------]||[]|......[-----]|[].|
+;   |   SCREEN 2* 13      PRGM   4LV |
 
 ;--- temporary
 
@@ -135,25 +134,26 @@ wormVclient = 193
 start:
   nop
   jp Start
-  .dw 1
+  .db 1
+  nop
   .dw WormTxt
   .dw WormIcon
 
 WormTxt:
-  .db "WORMY by SHIAR -- beta 93%",0
+  .db "WORMY by SHIAR -- beta 95%",0
 WormIcon:
   .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
+  .db %00000000,%00111100
+  .db %00000000,%01010010
+  .db %00000000,%01100001
+  .db %01100011,%10011001
+  .db %10010100,%01101001
+  .db %10011001,%00011001
+  .db %01000010,%11000001
+  .db %00111100,%00111110
 
 levelhead  = 'w'
-levelhead2 = 94 ;wormy levels header = "93"
+levelhead2 = 95 ;wormy levels header = "95"
 
 int_handler:
   ex af,af'
@@ -173,20 +173,20 @@ Start:
   im  1
   ld  a,$D4
   ld  h,a
-  ld  l,0     ;ld hl,$D400
+  ld  l,0 ;ld hl,$D400
   ld  d,a
-  ld  e,1     ;ld de,$D401
+  ld  e,1 ;ld de,$D401
   ld  b,e
-  ld  c,l     ;ld bc,$0100
-  dec a       ;ld a,$D3
+  ld  c,l ;ld bc,$0100
+  dec a   ;ld a,$D3
   ld  (hl),a
   ldir
   ld  hl,int_handler
   ld  d,a
-  ld  e,a     ;ld de,$D3D3
+  ld  e,a ;ld de,$D3D3
   ld  bc,int_end-int_handler
   ldir
-  inc a       ;ld a,$D4
+  inc a   ;ld a,$D4
   ld  i,a
   im  2
 
@@ -265,83 +265,50 @@ searchcomplete:
   ld  a,255
   ld  (ix),a ;end mark
 
+  ld  ix,templevels-6
+levelselectmenu:
+  psh ix ;offset
+  ld  a,-2
+  ld  (availevels),a
   cal _clrWindow
-  ld  hl,templevels-3
-  psh hl
-  ld  hl,$0020
+  ld  hl,$0320
   ld  (_penCol),hl
   ld  hl,txtLevsel
-  cal _vputs ;"< Select levels: >"
+  cal _vputs ;"< SELECT LEVELS >"
+  ld  hl,$FC00+(2*16)
+  ld  b,16*9
+  cal menuinvloop
+  ld  hl,$FC00+(56*16)
+  cal hr
   ld  hl,$0601 ;x=1
   ld  (_penCol),hl
-  pop hl
 dispnextlevel:
-  ld  a,(hl)
+  ld  a,(ix+3)
+  ld  b,a
   inc a ;cp 255
-  jr  z,_levselect
-  ld  a,(hl) ;ade=(hl)
+  jr  z,__levselect
 displevel:
-  inc hl
-  ld  d,(hl)
-  inc hl
-  ld  e,(hl)
-  inc hl
-  psh hl
-  ex  de,hl ;ahl=ade=(hl)
-  cal _load_ram_ahl ;hl=ahl
-  ld  b,(hl) ;b=title size
-  cal _vputs
   ld  hl,_penCol
   ld  (hl),$01 ;x=1
   inc hl
   ld  a,(hl)
   add a,6
   ld  (hl),a ;y+6
+  cp  49 ;bottom of screen
+  jr  nc,_levselect
+  ld  de,3
+  add ix,de
   ld  hl,availevels
   inc (hl)
-  pop hl
+  ld  a,b ;(ix+0)
+  ld  h,(ix+1)
+  ld  l,(ix+2) ;ahl=(ix)
+  cal _load_ram_ahl ;hl=ahl
+  cal _vputs
   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 \ halt
-  psh bc
-  cal GET_KEY
-  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
-  cp  K_EXIT-1
-  jp  z,ExitNoStats
-  cp  K_ENTER-1
-  jr  nz,levselect
-; jr  z,loadlevel
-
-loadlevel:
+readylevelfile: ;selected level at ahl
+; ld  hl,templevels-3
   ld  a,b
   add a,3 ;sellev+3 (#0==-3)
   ld  e,a
@@ -349,28 +316,89 @@ loadlevel:
   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
-
   inc hl
   ld  d,(hl)
   inc hl
   ld  e,(hl)
   ex  de,hl ;ahl=ade
 skiptitle:
-  ld  b,a ;psh ahl
+  ld  d,a ;psh ahl
   psh hl
   cal _GETB_AHL ;ld a,(ahl)
   pop hl
   or  a
-  ld  a,b ;pop ahl
+  ld  a,d ;pop ahl
   psh af
   cal _INC_PTR_AHL ;ahl++
   pop af ;cp 0
   jr  nz,skiptitle ;goto #0-terminator
+  ret
+
+levup:
+  cal menupos
+  dec b ;up
+  ld  a,b
+  cp  -3
+  jr  nz,levselect
+  inc b ;undo
+  jr  levselect
+levdown:
+  cal menupos
+  inc b ;down
+  ld  a,b
+  cp  -2
+availevels =$-1
+  jr  nz,levselect
+  dec b ;back up
+levselect:
+  cal menupos
+  ld  hl,$3900
+  ld  (_penCol),hl
+  pop hl
+  psh hl
+  cal readylevelfile
+  cal _load_ram_ahl ;hl=ahl
+  ld  de,$FFA0 ;desc.text
+  xor a
+levdescclearloop:
+  ld (de),a ;empty
+  inc de
+  cp  d ;de>$FFFF (offscreen)
+  jr  nz,levdescclearloop
+  cal _vputs
+  jr  levselectmenu+1
+__levselect:
+  ld  ix,templevels-6 ;reset 2 1st page
+_levselect:
+  ld  b,-2 ;level selected
+  jr  levselect
+levselectmenu:
+  psh hl
+  psh bc
+  cal ubergetkey
+  pop bc ;GET_KEY destr. b
+  dec a ;cp K_DOWN
+  jr  z,levdown
+  sub K_UP-1
+  jr  z,levup
+  pop hl
+  inc a ;cp K_RIGHT
+  jp  z,levelselectmenu
+  cp  K_ENTER-K_RIGHT
+  jr  z,loadlevel
+  sub K_EXIT-K_RIGHT
+  jp  z,ExitNoStats
+  inc a ;cp K_SECOND
+  jr  nz,levselectmenu
+; jr  z,loadlevel
+
+loadlevel:
+  cal readylevelfile
+  or  a ;levelfile on page 0 (=internal)
+  jr  z,levelloaded
+  cal skiptitle ;skip description
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
@@ -421,7 +449,7 @@ setdeflevels:
 
   ld  hl,TrigPrecalc
   ld  de,SinCosTable
-  psh de                        ; >> 1
+  psh de
   ld  bc,65
   ldir
   dec hl
@@ -432,7 +460,7 @@ MirrorSineWave:
   ld  (de),a
   inc de
   dnz MirrorSineWave
-  pop hl                         ; << 0k
+  pop hl ;SinCosTable
   ld  b,128+64
 NegativeSineWave:
   xor a
@@ -453,9 +481,11 @@ DisplayMenu: ;---draw menu---
   ld  hl,wtPicture
   ld  bc,16*16
   ldir
-  ld  hl,$FC00+$160
+  ld  hl,$FC00+$010 ;(*,01)
+  cal hr
+  ld  hl,$FC00+$160 ;(*,22)
   cal hr
-  ld  hl,$FC00+$3E0
+  ld  hl,$FC00+$3E0 ;(*,62)
   cal hr
 dispmainmenu:
   ld  hl,Gametype
@@ -514,7 +544,7 @@ dispomenusets:
   ld  (_penCol),hl
   cal loadgamecar
   psh hl
-  cal cshowA ;lives
+  cal cshowA0 ;lives
 
   ld  hl,$2A3E
   ld  (_penCol),hl
@@ -528,7 +558,7 @@ dispomenusets:
   cal _vputs
   jr  dispspeeddone
 dispspeed:
-  cal cshowA
+  cal cshowA0
 dispspeeddone:
 
   ld  hl,$363E
@@ -538,7 +568,7 @@ dispspeeddone:
   psh hl
   ld  a,(hl) ;(growth)
   inc a ;-1=None; 0..98->1..99
-  cal cshowA
+  cal cshowA0
 
   ld  hl,$303E
   ld  (_penCol),hl
@@ -552,7 +582,7 @@ dispspeeddone:
   cal _vputs
   jr  dispturndone
 dispturn:
-  cal cshowA ;turn speed
+  cal cshowA0 ;turn speed
 dispturndone:
 
   ld  hl,$243E
@@ -562,7 +592,7 @@ dispturndone:
   ld  a,(hl) ;(scorelimit)
   or  a
   psh af
-  cal cshowA ;limit
+  cal cshowA0 ;limit
   pop af ;a==0?
   jr  z,optionMenu ;do not display 0 behind 'None'
   ld  a,'0'
@@ -586,9 +616,9 @@ notoselect
   cal loadgamecar
   inc hl
   pop af
-  cp  K_LEFT
+  sub K_LEFT
   jr  z,seloleft
-  cp  K_RIGHT
+  dec a ;K_RIGHT
   ld  a,b
   jr  nz,optionMenu
 
@@ -657,7 +687,7 @@ changelimitInit:
 changespeed:
   cal changespeedInit
   inc a
-  cp  99
+  cp  20
   jr  nc,_optionMenu ;>98
 changedspeed:
   dec hl ;(Speed)
@@ -738,9 +768,9 @@ notselect
   cal loadgamecar
   inc hl
   pop af
-  cp  K_LEFT
+  sub K_LEFT
   jr  z,selleft
-  cp  K_RIGHT
+  dec a ;K_RIGHT
   ld  a,b
   jr  nz,mainMenu
 
@@ -793,7 +823,6 @@ changenrworms:
   jr  nc,mainMenu ;may not be >4
 changednrworms:
   ld  (hl),a
-_dispmenusets:
   jr  _dispmenusets ;mainMenu
 changenrwormsInit:
   ld  a,(Gametype)
@@ -824,6 +853,7 @@ bchangelink:
   ld  a,1 ;change LS-bit (=link)
   xor (hl) ;0=1; 1=0
   ld  (hl),a
+_dispmenusets:
   jr  dispmenusets ;mainMenu
 
 changegame:
@@ -877,9 +907,8 @@ getcustomkey:
   cal _vputs
   dec ix
 waitcustomkey:
-  halt \ halt
   psh hl
-  cal GET_KEY
+  cal ubergetkey
   pop hl
   or  a
   jr  z,waitcustomkey
@@ -918,8 +947,8 @@ dispmenusets:
   ld  hl,$2A3E ;worms
   ld  (_penCol),hl
   cal loadgamecar
-  inc hl
   psh hl
+  inc hl
   ld  a,(hl)
   add a,'0'
   cal _vputmap
@@ -935,10 +964,20 @@ displink:
 
   ld  hl,$1E3E ;level
   ld  (_penCol),hl
-  pop hl ;loadgamecar; hl++
-  inc hl
-  ld  a,(hl) ;(curlevel)
-  cal cshowA
+  pop hl ;loadgamecar
+  psh bc
+  ld  d,0
+  cal hlatlevel
+  ld  a,(Gametype)
+  or  a ;gamesingle
+  jr  nz,displvlname
+  ld  a,(Level)
+  cal cshowA0
+  jr  lvldisped
+displvlname:
+  cal _vputs
+lvldisped:
+  pop bc
 
   ld  hl,$3032
   ld  (_penCol),hl
@@ -963,8 +1002,7 @@ curworm =$-1
 menucall:
   psh bc
 menuwaitkey:
-  halt \ halt
-  cal GET_KEY
+  cal ubergetkey
   or  a
   jr  z,menuwaitkey
   pop bc ;GET_KEY destr. b
@@ -1064,8 +1102,7 @@ enternameloop:
   ld  a,'_'
   cal __vputmap
 nokeypressed:
-  halt
-  cal GET_KEY
+  cal ubergetkey
   or  a
   jr  z,nokeypressed
 
@@ -1115,6 +1152,11 @@ nameentered:
 
 ;--proc
 
+ubergetkey:
+  halt ;woo hoo
+  halt ;save them batteries! yeah!
+  jp  GET_KEY
+
 clrold:
   ld  hl,$FD97 ;begin pos
   ld  a,35 ;nr of lines
@@ -1132,7 +1174,41 @@ clroldsetsloop:
   jr  nz,clroldsettings
   ret
 
+hlatlevel: ;d must be 0
+  psh hl ;loadgamecar
+  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
+  cal _ldHLind ;ld hl,(hl)
+  pop de ;de=loadgamecar
+  inc de \ inc de
+  ld  a,(de) ;(curlevel)
+  ld  (Level),a
+  ld  d,a ;begin level
+skiplevelloop:
+  dec d ;levels to skip
+  ret z
+  cal skiplevel
+  jr  skiplevelloop
+  ret ;hl=begin of correct level
+
+skiplvltitle: ;zf=singleplayer
+  ld  a,(hl)
+  or  a ;null-terminator
+  inc hl
+  jr  nz,skiplvltitle
+  ret
+
 skiplevel: ;@hl - destr:ab - alter:hl
+  ld  a,(Gametype)
+  or  a ;gamesingle
+  psh af
+  cal nz,skiplvltitle
   inc hl
   inc hl
   inc hl
@@ -1145,8 +1221,7 @@ skipsprite:
   ld  b,(hl) ;balls
   inc b
   inc b ;skip 6
-  ld  a,(Gametype)
-  cp  gamesingle
+  pop af ;cp (Gametype),0
   jr  z,skipworms
   inc b ;multiplayer lvl
   inc b
@@ -1235,28 +1310,7 @@ LetsGetThisPartyOn:
   ld  (scorelimit),hl
 
   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
-
-  cal _ldHLind ;ld hl,(hl)
-  pop de ;de=loadgamecar
-  inc de \ inc de
-  ld  a,(de) ;(curlevel)
-  ld  (Level),a
-  ld  d,a ;begin level
-skiplevelloop:
-  dec d ;levels to skip
-  jr  z,levelsskipped
-  cal skiplevel
-  jr  skiplevelloop
-levelsskipped:
+  cal hlatlevel
 
   psh hl  ;1st level
   ld  a,(gameCar)
@@ -1288,12 +1342,9 @@ client:
   cal _puts
   ld  a,$E6
 multiplayer:
-;  cal linkok
-;  ld a,D0LD1L
-;  out (7),a
   ld  (SwapPos),a
-  ld  a,2
-  ld  (nrworms),a
+; ld  a,2
+; ld  (nrworms),a
 
 ;-----------------------------
 ;--------- game over ---------
@@ -1305,9 +1356,9 @@ GameOver:
   ld  a,4 ;4x (all worms)
 createwormsloop:
   ex  de,hl
-  ld  bc,died
+  ld  bc,died ;8
   add hl,bc
-  ld  b,0
+; ld  b,0
   ld  (hl),b ;died=0
   inc hl
   ld  (hl),b ;score=0
@@ -1328,7 +1379,6 @@ wormbeglives =$-1
 StartLevel:
   cal _clrWindow
   pop hl ;begin of current level
-  ld  de,Left
   ld  a,(hl)
   inc a ;=255?
   jp  nz,nextlevel
@@ -1344,16 +1394,23 @@ StartLevel:
   inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 nextlevel:
+  ld  a,(Gametype)
+  or  a ;gamesingle
+  psh af
+  cal nz,skiplvltitle
+  ld  de,Left
   ldi
+  ld  de,Speed
   ld  a,0
 customspeed =$-1
   inc a ;$FF=def
-  jr  z,defspeed
+  jr  nz,setspeed
+  ld  a,(hl) ;speed from level
+  inc a
+setspeed:
   dec a
-  ld  (hl),a ;store new speed
-defspeed:
-  ld  de,Speed
-  ldi
+  ld  (de),a ;custom speed
+  inc hl
   ld  de,peagrowth
   ldi
   ld  a,(hl)
@@ -1403,8 +1460,7 @@ toobad_noballs:
 #endif
 
   ld  hl,worm1
-  ld  a,(Gametype)
-  cp  gamesingle
+  pop af ;cp (Gametype),0
   ld  b,1
   jr  z,worminit
   ld  b,4
@@ -1430,7 +1486,7 @@ worminit:
 
   inc a ;ld a,1
   ld  (turn10),a
-  ld  a,2
+  inc a ;ld a,2
   ld  (flashtime),a
 
 ;-------- draw level ---------
@@ -1466,16 +1522,16 @@ setfieldy:
   psh hl                        ; >> 1
   psh de                        ; >> 2
   ld  de,ScrBuffer+1
-  ld  bc,63
+  ld  bc,63 ;first 2 rows
   ld  (hl),%11111111
-  ldir
+  ldir ;draw upper border
   inc hl
-  ld  (hl),%11000000
+  ld  (hl),%11000000 ;first left border
   inc hl
   ld  b,31
 ClearLine:
-  ld  (hl),c
-  inc hl
+  ld  (hl),c ;=0
+  inc hl ;clear rest of line
   dnz ClearLine
   psh hl                        ; >> 3
 
@@ -1487,12 +1543,12 @@ ClearLine:
   rra
   rra
   ld  l,a
-  ld  h,0
+  ld  h,c ;0
   add hl,de
   pop af                         ; << 3
   and %00000111
   ld  b,a
-  ld  c,0
+; ld  c,0
   ld  a,%11000000
   jr  z,NoVertShift
 VertShift:
@@ -1515,15 +1571,18 @@ NoVertShift:
 
   pop hl                         ; << levelp
   ld  a,(Gametype)
-  cp  gamectf
-  jr  nz,noctf
+  cp  gamerace ;or gamectf
+  jr  c,levelhasbeensetup
   ld  de,peaspos
-  ld  bc,4
+  ld  c,2 ;ld bc,2 (2 bytes)
+  jr  z,loadextralevelstuff ;cp gamerace
+  ld  c,4 ;ld bc,4 (2nd flag in ctf)
+loadextralevelstuff:
   ldir
-  psh hl
-  cal DrawAllPeas
-  pop hl
-noctf:
+  ld  a,1 ;draw delay
+  ld  (drawctfpea1),a
+  ld  (drawctfpea2),a
+levelhasbeensetup:
 
   cal drawstuff
 
@@ -1531,13 +1590,6 @@ noctf:
 
   psh hl                        ; >> levelp new
   cal forceshowstats
-  ld  a,(gameCar)
-  and _datafood
-  jr  z,nofood
-  cal NewPea
-nofood:
-  ld  bc,(worm1+pos)
-  cal DisplayField
 
 #ifdef readymask
   ld  hl,$FC70
@@ -1583,36 +1635,51 @@ SwapPos: ;$18 xx -> $E6 xx
 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
+  ld  hl,worm1+name
+  ld  b,9
+  cal recvstuff
+  ld  hl,worm2+name
+  ld  b,9
+  cal sendstuff
   jr  initfinished
+sendstuff:
+  psh bc
+  ld  c,(hl)
+  inc hl
+  psh hl
+  cal Qsend
+  pop hl
+  pop bc
+  dnz sendstuff
+  ret
+recvstuff:
+  psh bc
+  psh hl
+  cal Qrecv
+  pop hl
+  ld  (hl),c
+  inc hl
+  pop bc
+  dnz recvstuff
+  ret
 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
+  ld  hl,worm1+name
+  ld  b,9
+  cal sendstuff
+  ld  hl,worm2+name
+  ld  b,9
+  cal recvstuff
 initfinished:
+  ld  a,(gameCar)
+  and _datafood
+  jr  z,nofood
+  ld  ix,worm1
+  cal NewPea
+nofood:
+  ld  bc,(worm1+pos)
+  cal DisplayField
 
   ld  b,startdelay
 ReadyDelay:
@@ -1682,16 +1749,15 @@ nextturnok:
   cal forceshowstats ;update score
 nodispupdate:
 
-drawctfpea1:
-  jr  drawctfpea2
-  ld  bc,drawctfpea1
+  ld  a,(Gametype)
+  cp  gamectf
+  jr  nz,noctfpeas2draw
+  ld  de,drawctfpea1
   ld  hl,(peaspos)
-  cal tryDrawPea
-drawctfpea2:
-  jr  noctfpeas2draw
-  ld  bc,drawctfpea2
+  cal tryDrawPea ;pea#1
+  ld  de,drawctfpea2
   ld  hl,(peaspos+2)
-  cal tryDrawPea
+  cal tryDrawPea ;pea#2
 noctfpeas2draw:
 
 
@@ -1711,7 +1777,7 @@ handleworms:
   add ix,bc
   pop bc
   ld  hl,handledworm
-  inc (hl) ;1..nrworms
+  inc (hl) ;0..nrworms-1
   dnz handleworms
 
 ;-----------------------------
@@ -1767,7 +1833,9 @@ handledworm =$-2
   dec (ix+lives)
   psh af
   ld  de,10
-  cal DecScore
+  ld  a,(Gametype)
+  cp  gamectf ;ctf no death penalty
+  cal nz,DecScore
   pop af
   ret nz ;HandleWorm done
   ld  a,(wormbeglives)
@@ -1776,7 +1844,7 @@ handledworm =$-2
   ld  a,(gameCar)
   and _datatime
   jr  z,anyworm ;quit at any worm's death
-  ld  a,(nrworms) ;livematch: all worms must've died
+  ld  a,(nrworms) ;timematch: all worms must've died
   ld  b,a ;# of worms
   ld  hl,worm1+lives-(worm2-worm1)
   ld  de,worm2-worm1
@@ -1799,6 +1867,21 @@ SpSave = $-2
   ld  a,D0LD1L
   out (7),a    ;both wires low = game over signal
   cal _clrWindow
+#ifdef coolzgfx
+  ld  de,$FC30 ;(0,1)
+  ld  hl,wtWormy
+  ld  bc,16*7
+  ldir
+  ld  hl,$FC10
+  ld  b,16*11
+  cal menuinvloop ;invert
+  ld  hl,$FD80
+  cal hr ;menuinvloop w/ b=16
+  ld  hl,$FCE0
+  cal hr
+  ld  hl,_curRow
+  ld  (hl),2
+#else
   ld  hl,txtGO
   cal _puts
   ld  hl,$FC00
@@ -1808,11 +1891,9 @@ SpSave = $-2
   cal hr ;menuinvloop w/ b=16
   ld  hl,$FCE0
   cal hr
-; ld  l,$74
-; ld  b,8
-; cal menuinvloop
   ld  hl,_curRow
   inc (hl)
+#endif
   ld  hl,txtGame
 CURtxtGame =$-2
   cal _puts
@@ -1898,20 +1979,18 @@ NoLinkIndic:
   ld  a,13
   ld  (_curCol),a
   ld  a,(hl) ;worm+died
-  cal showA
+  cal showA0
   pop hl
 
   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
+  scf ;jr nz,notwinner
+  cal z,iswinner
 nodmwinner:
   jr  c,notwinner ;no singleplayer winners
   inc hl ;worm+score
@@ -1919,10 +1998,7 @@ nodmwinner:
   ld  de,0
 winnerscore =$-2
   cal _cphlde ;==highest score..
-  jr  nz,notwinner
-iswinner:
-  ld  a,'*'
-  cal _putc ;..then put *
+  cal z,iswinner
 notwinner:
   ld  a,16
   ld  (_curCol),a
@@ -1987,6 +2063,9 @@ newhigh:            ;New>Old
   ld  hl,5
   cal _MM_LDIR_SET_SIZE ;save new
   cal _RAM_PAGE_1
+  ld  hl,_curRow
+  dec (hl)
+  cal iswinner
 
 NotNewHigh:
   ld  hl,$3149
@@ -2002,9 +2081,7 @@ NotNewHigh:
 hiscorecheckdone:
 
 waitkey:
-  halt
-  halt
-  cal GET_KEY
+  cal ubergetkey
   cp  K_ENTER
   jp  z,DisplayMenu
   cp  K_SECOND
@@ -2057,12 +2134,9 @@ hi_:
   ld  bc,(Level)
   add a,c
   ld  b,a ;levels to skip (including 1 for singleplayer)
+  ld  de,5 ;to add per level
 addlevelposition:
-  inc hl
-  inc hl ;add one word per level
-  inc hl
-  inc hl
-  inc hl ;plus 3 bytes for name
+  add hl,de ;one word+3 bytes for name
   dnz addlevelposition
 hi__:
   xor a ;ahl=0(+hl)
@@ -2075,6 +2149,12 @@ hiscrposa =$+1
 highsave:
   .db 0,0,"WOR ",0
 
+iswinner:
+  ld  a,10
+  ld  (_curCol),a
+  ld  a,'*'
+  jp  _putc ;..then put *
+
 ;-----------------------------
 ;----------- worm ------------
 ;-----------------------------
@@ -2211,7 +2291,7 @@ nogrow:
   ld  a,(gameCar)
   and _datatime
   jr  z,notimescore
-  ld  de,1
+  ld  e,1
   cal IncScore
 notimescore:
 
@@ -2321,7 +2401,7 @@ peagrowth =$-1
   ld  hl,Left
   dec (hl)
   psh af
-  ld  de,10
+  ld  e,10
   cal IncScore
   pop af
   jp  nz,Drawworm ;continue
@@ -2341,7 +2421,7 @@ peagrowth =$-1
   add hl,hl
   cal _HLTIMES10
   ex  de,hl
-  cal IncScore ;score+(40*level)
+  cal _IncScore ;score+(40*level)
   cal removeworm
   pop hl                         ; << call
   pop hl                         ; << call
@@ -2386,9 +2466,12 @@ sel_otherpea:
   jr  z,nottheotherflag
   ld  hl,drawctfpea2 ;restore #2
 nottheotherflag:
-  ld  (hl),$E6 ;and nn
+  ld  (hl),3 ;draw delay 3 turns
   ret
 
+drawctfpea1: .db 0
+drawctfpea2: .db 0
+
 hitflag: ;correct pea hit
   ld  a,e ;pop a
   xor %11 ;invert flag taken + ownflag
@@ -2399,20 +2482,14 @@ hitflag: ;correct pea hit
   pop af
   jr  nz,Drawworm ;flag taken, continue game
   psh hl
-  ld  de,20 ;flag captured+returned
+  ld  e,20 ;flag captured+returned
   cal IncScore
   pop hl
-  ld  a,$E6 ;and nn
+  ld  a,3 ;draw delay
   ld  (drawctfpea1),a ;redraw..
   ld  (drawctfpea2),a ;..both flags
   jr  Drawworm
 
-DrawAllPeas:
-  ld  hl,(peaspos)
-  cal DrawPea
-  ld  hl,(peaspos+2)
-  jp  DrawPea
-
 ;-----------------------------
 
 nextotherwormbit:
@@ -2436,24 +2513,30 @@ ChkWorm:
   ret ;z
 
 checkhitlapline:
-  ld  a,63
-  sub b
+  ld  a,(peaspos) ;63
+  sub b ;x==63
   jr  z,nextlaphalf
   inc a
   ret nz
 nextlaphalf:
-  ld  a,c
-  and 32 ;y>=32?
-  jr  nz,nolap
+  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)
-  jr  z,nolap
+  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  de,20
-  cal IncScore
+  ld  e,20
+  cal IncScore ;lap!
   pop bc
-  xor a
-nolap:
-  ld  (ix+reserv),a
   ret
 
 #ifdef optdie
@@ -2695,13 +2778,36 @@ chkloopx:
   ret ;z=empty space
 
 tryDrawPea: ;hl=peapos;bc=dopea
-  psh bc
+  ld  a,(de)
+  or  a ;0=drawn
+  ret z
+  psh de
   cal CheckPea
-  pop bc
+  pop de
   ret nz ;unsuccesful
-  ld  a,$18 ;jr
-  ld  (bc),a
-  jr  DrawPea
+  ex  de,hl
+  dec (hl) ;hl=appeartime
+  ex  de,hl ;hl=peaspos
+  jr  z,DrawPea
+  ret
+
+sendnewpeaoverlink:
+  ld  a,(gameCar)
+  rra ;and _datalink
+  ret nc ;no link
+  ld  a,(ix+left)
+  or  a
+  jr  z,receivenewpeaoverlink
+  ld  c,l ;send pea's pos
+  cal Qsend
+  ld  c,h
+  jp  Qsend ;&&&possible jr
+receivenewpeaoverlink:
+  cal Qrecv ;Crecv
+  ld  l,c
+  cal Qrecv ;Crecv
+  ld  h,c
+  ret
 
 NewPea:
   ld  a,(FieldWidth)
@@ -2712,9 +2818,10 @@ NewPea:
   add a,56-4
   cal randompos
   ld  l,a
-  ld  (PeaY),hl
   cal CheckPea
   jr  nz,NewPea
+  cal sendnewpeaoverlink
+  ld  (PeaY),hl
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
@@ -2762,6 +2869,41 @@ nextbitok:
 
 ;----------- score -----------
 
+timematchscore: ;piece of crap checking whether you've already won in timematch
+  ld  a,(nrworms)
+  ld  b,a ;# of worms
+  dec a
+  ret z ;singleplayer
+  ld  hl,worm1+lives
+  ld  de,worm2-worm1
+  ld  a,(handledworm)
+  ld  c,a ;wormcounter
+chktimematchover:
+  xor a
+  cp  c
+  jr  z,nneexxtt ;yourself
+  cp  (hl)
+  ret nz ;someone else still alive
+  dec hl ;+delay
+  dec hl ;+score+1
+  ld  a,(hl)
+  cp  (ix+score+1)
+  jr  c,nneexxtt_ ;you>him
+  ret nz ;not highest
+  dec hl ;+score
+  ld  a,(hl)
+  cp  (ix+score)
+  ret nc ;you<=him
+  inc hl
+nneexxtt_:
+  inc hl
+  inc hl
+nneexxtt:
+  dec c
+  add hl,de
+  dnz chktimematchover
+  jp  anyworm ;g/o
+
 _divHLby1000:
   psh hl
   ld  b,3
@@ -2772,26 +2914,36 @@ divideagain: ;3x
   pop hl
   ret
 
-IncScore:
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
+extralives:
   cal _divHLby1000
   ld  c,a
-  add hl,de
+  add hl,de ;increase score
   cal _divHLby1000
   cp  c
   jr  z,scorecommon ;hl/1000 not increased
   inc (ix+lives)
   jr  scorecommon
+
 DecScore: ;&&&
   ld  h,(ix+score+1)
   ld  l,(ix+score)
   or  a
   sbc hl,de
   jr  c,showstats ;<0=0
+  jr  scorecommon
+
+IncScore: ;inc score by e
+  ld  d,0
+_IncScore ; inc by de
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
+  ld  a,(Gametype)
+  or  a ;if singleplayer...
+  jr  z,extralives
+  add hl,de ;score+=de
 scorecommon:
   ld  (ix+score+1),h
-  ld  (ix+score),l
+  ld  (ix+score),l ;save
   ld  de,0
 scorelimit =$-2
   ld  a,d
@@ -2803,7 +2955,13 @@ scorelimit =$-2
 showstats:
   ld  a,(gameCar)
   and _datatime
-  ret nz ;no disp for timematches
+  jr  nz,timematchscore ;no disp for timematches
+  ld  hl,$FC00 ;&&&only necessary in deathmatch
+  ld  b,6*16-1 
+clearstats:
+  ld  (hl),a ;=0
+  inc hl
+  dnz clearstats
 forceshowstats:
   psh ix
   ld  h,0
@@ -2860,6 +3018,18 @@ showscore:
   jr  __vputs
 showlives:
   ld  a,(ix+lives)
+showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
+  cp  10
+  jr  c,showleastsign
+  ld  l,a
+  ld  h,0
+  cal _divHLby10
+  psh af
+  ld  a,l
+  add a,'0'
+  cal __vputmap
+  pop af
+showleastsign:
   add a,'0'
 __vputmap:
   psh ix
@@ -2872,19 +3042,7 @@ showstatsS: ;(singleplayer)
   cal __vputs
   ld  a,0
 Level =$-1
-  cp  10
-  jr  c,tilllevel9
-  ld  l,a
-  ld  h,0
-  cal _divHLby10
-  psh af
-  ld  a,l
-  add a,'0'
-  cal __vputmap
-  pop af
-tilllevel9:
-  add a,'0'
-  cal __vputmap
+  cal showA
 
   ld  a,98
   ld  (_penCol),a
@@ -2901,7 +3059,7 @@ showleft:
   ld  (_penCol),a
   ld  a,0
 Left =$-1
-  cal cshowA
+  cal cshowA0
 
   ld  hl,txtLeft
 __vputs:
@@ -2914,7 +3072,7 @@ showLevel:
   ld  hl,txtLevel
   cal _puts
   ld  a,(Level)
-showA:
+showA0: ;big w/ leading 0
   ld  l,a
   ld  h,0
   cal _divHLby10
@@ -2926,7 +3084,7 @@ showA:
   add a,'0'
   jp  _putc
 
-cshowA:
+cshowA0: ;small w/ leading 0
   or  a
   jr  nz,cshowavalue
   ld  hl,txtNone
@@ -3264,52 +3422,81 @@ drawstuff:
 
 drawsmtn:
   dec a ;1 = line
-  jp  z,drawline
+  jr  z,drawline
   dec a ;2 = fatline
-  jp  z,drawfatline
+  jr  z,drawfatline
   dec a ;3 = box
-  jp  z,drawbox
-  dec a ;4 = circle
-  jp  z,drawcircle
-  dec a ;5 = hline
-#ifdef hlines
-  jp  z,drawhline
-#else
-  jp  z,drawline
-#endif
+  jr  z,drawbox
+; dec a ;4 = circle
+; jp  z,drawcircle
 
-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
+drawcircle: ;(d,e),h   ;de=x,y; h=z
+  ld  c,h              ;c=yy=z
   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
+  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<h<0 = $FF**
+  cp  h                ;h<0?
+  jr  z,circlenext     ;jump if zz<0
+
+  ld  a,c              ;yy
+  dec a                ;89<a<128
+  add a,a              ;a=2yy-2 ;nc
+  ld  e,a              ;de=a
+  sbc hl,de            ;zz=zz-2yy+2
+  dec c                ;yy--
+circlenext:
+  ld  a,b              ;xx
+  inc a                ;0<a<92
+  add a,a              ;2xx+2
+  inc a
+  ld  e,a              ;de=a
+  add hl,de            ;zz=zz+2xx+3
+
+  pop de               ;x,y
+  ld  a,b
+  cp  c
+  ret nc               ;xx>=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
-  pop bc
   ret
-#else
+
+drawbox: ;(d,e)-(h,l)
+  ld  b,l ;Delta-y
   ld  l,e
 boxloop:
   cal drawline
@@ -3317,7 +3504,6 @@ boxloop:
   inc e
   dnz boxloop
   ret
-#endif
 
 drawfatline:
   cal drawline
@@ -3329,7 +3515,7 @@ drawfatline:
   cal drawline
   dec d
   dec h
-  jp  drawline
+; jp  drawline
 
 ;LINE (d,e)-(h,l)
 ;destroyes a
@@ -3435,72 +3621,6 @@ 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<h<0 = $FF**
-  cp  h                ;h<0?
-  jr  z,circlenext     ;jump if zz<0
-
-  ld  a,c              ;yy
-  dec a                ;89<a<128
-  add a,a              ;a=2yy-2 ;nc
-  ld  e,a              ;de=a
-  sbc hl,de            ;zz=zz-2yy+2
-  dec c                ;yy--
-circlenext:
-  ld  a,b              ;xx
-  inc a                ;0<a<92
-  add a,a              ;2xx+2
-  inc a
-  ld  e,a              ;de=a
-  add hl,de            ;zz=zz+2xx+3
-
-  pop de               ;x,y
-  ld  a,b
-  cp  c
-  ret nc               ;xx>=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 ------------
 ;-----------------------------
@@ -3534,9 +3654,7 @@ linkfine:
   and %11
   ret
 
-;--------------
 ;---- SEND ----
-;--------------
 
 Csend:
   ld  b,32
@@ -3564,8 +3682,7 @@ sendbit:
 sendwaitack:
   cal checklink                ;other calc must lower other wire
   jr  nz,sendwaitack
-  ld  a,D0HD1H         ;raise one, ok to raise other
-  out (7),a
+  cal linkok           ;raise one, ok to raise other (out (7),D0HD1H)
 sendfinish:
   cal checklink
   cp  %11              ;both raised (by other calc)
@@ -3576,9 +3693,7 @@ sendfinish:
   ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
-;--------------
 ;---- RECV ----
-;--------------
 
 Crecv:         ;--- receive 8 bits into A/C --- destr:abcdehl ---
   cal Qrecv
@@ -3606,8 +3721,7 @@ received:
 recvwaitack:
   cal checklink
   jr  z,recvwaitack    ;same wire will be raised again by other calc
-  ld  a,D0HD1H
-  out (7),a            ;raise both
+  cal linkok           ;raise both
 recvfinish:
   dnz recvloop         ;repeat for all bits
   xor a                        ;nc=no error
@@ -3624,64 +3738,89 @@ 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
+
+  .db 255              ;last level
+   ret                 ;ending code
 
 LevelDefM:
+  .db "Empty Arena",0
   .db 8,4,15,15,0,0
   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
   .db 128,57
   .db 0
 
+  .db "Fast Fun :))",0
   .db 8,0,18,12,5
   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
   .db 128,57
   .db 0
 
+  .db "Two Circles",0
   .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
 .db 4,40,26,20,0
 .db 4,90,40,11,0,0
 
 LevelDefT: ;tron=no delay
+  .db "Empty Tron Level",0
   .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
 
+LevelDefR: ;race
+  .db "Round and Round",0
+  .db 8,4,18,12,5
+  .db %1110000,%10001000,%10001000,%10001000,%1110000,0
+  .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
+  .db 128,57
+  .db 63,27
+  .db 4,63,27,10,0,0
+
 LevelDefC: ;ctf
+  .db "Default CTF",0
   .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 $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
   .db 128,57
-  .db 10,10,50,50
+  .db 27,8,27,116
   .db 0
 
 ;-----------------------------
 ;---------- data -------------
 ;-----------------------------
 
-wdPicture = 16
 wtPicture:
-.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
+.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
+.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
+.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
+.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
+.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
+.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000,%00111001,%11000110,%00000011,%11000010,%00011100,%01100010,%00100001,%01101000
+.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100,%00111001,%11000110,%01111000,%00100001,%00000000,%00000001,%11000001,%01101000
+.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00011111,%10000110,%10000101,%11100001,%00000000,%00000000,%00000001,%00010000
+.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00001111,%00001110,%10010110,%00010001,%00000000,%00000000,%00000000,%11100000
+.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100,%00000000,%00001100,%01100100,%00001001,%00111111,%11111111,%11000000,%00000000
+.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001110,%00000000,%00001100,%01000000,%10000001,%01000000,%00000000,%00000000,%00000000
+.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00000110,%00000000,%00011100,%01000000,%11000001,%01100101,%01001001,%10000011,%01100011
+.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00000111,%10000000,%00111000,%01000001,%00100001,%00110101,%00010101,%01000101,%01010100
+.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
+.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
+
+wtWormy:
+.db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
+.db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
+.db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000
+.db %00100000,%00000000,%00001110,%00110010,%00011001,%10011011,%01101010,%11100000,%00110011,%01101101,%11000111,%10000001,%00011100,%00000000,%00000000,%00001100
+.db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
+.db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
+.db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
+
+;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
 
 txtMenu:  .db "Mode",0  ;1st menu item
          .db "Level",0 ;2nd
@@ -3722,7 +3861,8 @@ txtYes:    .db "Yes",0
 txtNo:     .db "No",0
 txtKeyleft: .db ":left",0
 txtKeyright:.db "/right",0
-txtLevsel:  .db $CF," Select levels ",5,0
+posLevsel = $0320
+txtLevsel:  .db $CF," SELECT LEVELS ",5,0
 txtWaiting: .db "Waiting...",0
 txtReceive: .db "Receiving..." ;,0
 
@@ -3745,14 +3885,18 @@ txtDied:   .db "Died    "       ;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
 
 datalevels: .dw LevelDef, LevelDefM
             .dw LevelDefT,LevelDefM
             .dw LevelDefM,LevelDefM
-            .dw LevelDefM,LevelDefC
+            .dw LevelDefR,LevelDefC
 nrlevels:   .db 1,3,1,3,3,3,3,1     ;=defaults
 
 _datalink      = %0000001 ;linkplay
@@ -3787,19 +3931,19 @@ datatimem:  .db  %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
 gamerace     =  6 ;used
 datarace:   .db  %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
 gamectf      =  7 ;used
-datactf:    .db  %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
+datactf:    .db  %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
 
 worm1set:  .dw worm1p,worm1p
-           .db %11110111,%00,-01,K_RIGHT,K_LEFT
+           .db %11110111,1,-01,K_RIGHT,K_LEFT
 worm1name: .db "WORMY   ",0
 worm2set:  .dw worm2p,worm2p
-           .db %11111011,%01,-01,K_F2,K_F1
+           .db %11111011,0,-01,K_F2,K_F1
 worm2name: .db "VIPER   ",0
 worm3set:  .dw worm3p,worm3p
-           .db %11111011,%00,-01,K_COMMA,K_STO
+           .db %11111011,1,-01,K_COMMA,K_STO
 worm3name: .db "NIBBLER ",0
 worm4set:  .dw worm4p,worm4p
-           .db %11111011,%01,-01,K_PLUS,K_ENTER
+           .db %11111011,0,-01,K_PLUS,K_ENTER
 worm4name: .db "JIM     ",0
 
 defhiscrpos:
@@ -3846,7 +3990,27 @@ maxnamelength = 8+1
 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "   shiar0@hotmail.com",0
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
+.db "   wormy@shiar.org",0
 
 defspritesz = 4
 defspriteimg:  .db %01100000
@@ -3855,7 +4019,9 @@ defspriteimg:     .db %01100000
                .db %01100000
 
 deflevels:
-  .db "Internal Levels" ;,0
+  .db "Internal Levels",0
+  .db "by SHIAR -- still t"
+  .db "o be added...." ;,0
 
   .db 0,deflevels/256,deflevels&255
 templevels: