wormy 0.97.116
[wormy.git] / wormy.z80
index e3150cd5cbf3e0811fb83464cd562b6e51995e6f..18efe0cc6bdaff4a1d604d71d9d796c39e14fccf 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -16,8 +16,8 @@
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
-; Version                  :                                     97% (0.97.115A)
-; Release Date             :                                     2002 January 15
+; Version                  :                                      97% (0.97.116)
+; Release Date             :                                     2002 January 16
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
 ; Web Page                 :                                       www.shiar.org
 ;     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)
+;     X [116] incs at skiplevels effectively replaced by add (-4 bytes)
+;     X [116] another 2 bytes shaved off
+;     X [116] LINK: received gamemode now displayed correctly at g/o
+;     X [116] gamecar right after gametype saves about 20 bytes
+;     X [116] LINK: minimize sent data
+;     X [116] remove +input in worm storage
+;     X [116] head position init uses same data as tail (-4 bytes)
 ;     * word-value display storage in chartable hole??
 ;  1% * misc (bugs, &&&, pollish, &&, &)
 ;     * look at init-z in line routine again
 ;     * 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: ...
@@ -168,13 +173,13 @@ worm4p      = $A400 ;-A5FF (200)      %101001O0
 ;free       = $A600 ;-A7FF (200)
 worm2p      = $A800 ;-ABFF (400)      %10101O00
 SinCosTable = $AC00 ;-AD00 (4*40)
-worm1       = $AD01 ;-AD1F (1F)
-worm2       = $AD20 ;-AD3E (1F)
-worm3       = $AD3F ;-AD5D (1F)
-worm4       = $AD5E ;-AD7C (1F)
-balls       = $AD7D ;-AE00 (<=3x44d)
-turn10      = $AE01 ;-AE01 (1)  (counter)
-peaspos     = $AE02 ;-AF05 (4-260) (peas)
+worm1       = $AD01 ;-AD1E (1E)
+worm2       = $AD1F ;-AD3C (1E)
+worm3       = $AD3D ;-AD5A (1E)
+worm4       = $AD5B ;-AD78 (1E)
+balls       = $AD79 ;-AE00 (<=3x2D) (bb<=45)
+turn10      = $AE01 ;-AE01 (1)     (counter)
+peaspos     = $AE02 ;-AF05 (4-260)    (peas)
 ;free       = $AF06 ;-AFFF (F9)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
@@ -186,7 +191,6 @@ leveldata   = $F080 ;-F9FF (<=97F)
 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
@@ -207,6 +211,28 @@ lefttotalb  = $BF91 ;(1)         @game
 drawctfpea1 = peaspos+4
 drawctfpea2 = peaspos+6
 
+;--- layout ---
+
+;(wormN)             set:
+heading     =   0   ;level*
+pos         =   2   ;level*
+pos2        =   4   ;level
+grow        =   6   ;level
+died        =   8   ;game:
+score       =   9
+delay       =   11
+lives       =   12
+head        =   13
+                    ; �15B (wormNset)
+tail        =   15  ; |also@next level
+storepos    =   17  ; |
+reserv      =   18  ; |loop (race:lap|ctf:pea)
+left        =   19  ; |
+right       =   20  ; |
+name        =   21  ; |_
+
+wormsize    =   30 ;^mark^
+
 ;_______________________________________________________________________________
 ;  _____   ______  _____   ______       _______ _______ _______  ______ _______
 ; |_____] |_____/ |     | |  ____       |______    |    |_____| |_____/    |
@@ -234,7 +260,7 @@ start:              ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 97% .115A",0
+ .db  " 97% .116",0
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
@@ -300,11 +326,8 @@ searchloop:
   jr  z,stringfound
 searchnext:
   pop hl
-  dec hl ;5x
-  dec hl
-  dec hl
-  dec hl
-  dec hl
+  ld  de,-5
+  add hl,de
   ld  b,(hl) ;name size
   inc b
 skipname:
@@ -617,7 +640,7 @@ DisplayMenu:
   ld  hl,$FC00+$3E0 ;(*,62)
   cal hr
 dispmainmenu:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   dec a ;will be inced @changegame
   cal changedgame
   ld  hl,changegame ;dispmenusets ;mainMenu
@@ -674,7 +697,7 @@ dispoptionmenu:
 
 dispomenusets:
 #ifdef spprotect
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datasingl
   jp  nz,LetsGetThisPartyOn
 #endif
@@ -735,7 +758,7 @@ dispturndone:
   cal cshowA ;limit
   pop af ;a==0?
   jr  z,optionMenu ;do not display 0 behind 'None'
-  ld  a,c ;(gameCar)
+  ld  a,c ;(gamecar)
   rla ;and _dataPmult
   jr  nz,optionMenu ;in multifood limit == #peas
   ld  a,'0'
@@ -981,7 +1004,7 @@ bchangenrworms:
   jr  _mainMenu
 
 change4spOnly:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  3
   ret nc
   pop hl ;cal
@@ -991,7 +1014,7 @@ changelink:
 bchangelink:
   cal change4spOnly
   dec hl ;inced earlier
-  dec hl ;gameCar
+  dec hl ;gamecar
   ld  a,1 ;change LS-bit (=link)
   xor (hl) ;0=1; 1=0
   ld  (hl),a
@@ -999,7 +1022,7 @@ _dispmenusets:
   jr  dispmenusets ;mainMenu
 
 changegame:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   inc a
   cal changedgame
   jr  z,changegame
@@ -1011,13 +1034,13 @@ changedgame:
   jr  nc,changedgameok
   xor a ;9 -> 0
 changedgameok:
-  ld  (Gametype),a
+  ld  (gametype),a
   cal getnrlevels
   xor a
   cp  (hl)
   ret
 bchangegame:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   dec a
   cal changedgame
   jr  z,bchangegame
@@ -1043,7 +1066,7 @@ bchangelevel:
   jr  _mainMenu
 
 getnrlevels: ;for current gametype at hl
-  ld  hl,Gametype
+  ld  hl,gametype
   ld  d,0
   ld  e,(hl)
   ld  hl,nrlevels
@@ -1076,20 +1099,11 @@ changekeys:
 ;--- display current settings ---
 
 dispmenusets:
-  cal clrold
   ld  de,$183E
   ld  (_penCol),de
-  ld  d,0
-  ld  a,(Gametype)
-  ld  e,a
-  ld  hl,posGame
-  add hl,de ;hl=posGame+(Gametype)
-  ld  a,(hl) ;str.offset
-  ld  e,a ;^d=0^
-  ld  hl,txtGame
-  add hl,de ;txtGameX
-  ld  (CURtxtGame),hl ;save for g/o
-  cal _vputs ;Singleplayer
+  cal clrold
+  cal loadtxtgame
+  cal _vputs ;Singleplayer or smtn
 
   ld  hl,$2A3E ;worms
   ld  (_penCol),hl
@@ -1109,7 +1123,7 @@ dispmenusets:
 
   ld  hl,$243E
   ld  (_penCol),hl
-  rr  c ;(gameCar)
+  rr  c ;(gamecar)
   ld  hl,txtNo
   jr  nc,displink
   ld  hl,txtYes
@@ -1122,7 +1136,7 @@ displink:
   psh bc
   ld  d,0
   cal hlatlevel
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a ;gamesingle
   jr  nz,displvlname
   ld  a,(Level)
@@ -1217,16 +1231,16 @@ menunewok:
 
 getwormname: ;of (curworm)
   ld  a,(curworm)
-  add a,a  ;2x
   ld  e,a
+  add a,a  ;2x
   add a,a  ;4x
   add a,a  ;8x
   add a,a ;16x
-  add a,e ;18x
+  sub e   ;15x
   ld  e,a
   ld  d,0 ;de=a
 
-  ld  ix,worm1name-18
+  ld  ix,worm1name-15
   add ix,de
   ret
 
@@ -1317,7 +1331,7 @@ ubergetkey:
   halt ;save them batteries! yeah!
   jp  GET_KEY
 
-clrold:
+clrold: ;destr:acdehl (acd=0)
   ld  hl,$FD97 ;begin pos
   ld  a,35 ;nr of lines
 clroldcustom:
@@ -1336,19 +1350,21 @@ clroldsetsloop:
 
 hlatlevel: ;d must be 0
   psh hl ;loadgamecar
-  ld  a,(Gametype) ;8bytes -> 7bytes
+  ld  a,(gametype)
   add a,a
   ld  e,a ;=de
   ld  hl,datalevels
-  add hl,de
+  add hl,de ;+2*mode
   cal _ldHLind ;ld hl,(hl)
-  pop de ;de=loadgamecar
-  inc de \ inc de
-  ld  a,(de) ;(curlevel)
+  ex  (sp),hl ;hl=loadgamecar
+  ld  e,2 ;=de
+  add hl,de
+  ld  a,(hl) ;(curlevel)
   ld  (Level),a
-  ld  d,a ;begin level
+  ld  c,a ;begin level
+  pop hl ;@level1
 skiplevelloop:
-  dec d ;levels to skip
+  dec c ;levels to skip
   ret z
   cal skiplevel
   jr  skiplevelloop
@@ -1361,15 +1377,13 @@ skiplvltitle: ;zf=singleplayer
   jr  nz,skiplvltitle
   ret
 
-skiplevel: ;@hl - destr:ab - alter:hl
-  ld  a,(Gametype)
+skiplevel: ;@hl; de=2 - destr:ab - alter:hl
+  ld  a,(gametype)
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
-  inc hl
-  inc hl
-  inc hl
-  inc hl ;skip 4
+  add hl,de
+  add hl,de ;skip 4
   ld  b,(hl) ;spritesize
   inc b
 skipsprite:
@@ -1378,52 +1392,39 @@ skipsprite:
   ld  b,(hl) ;balls
   inc b
   inc b ;skip 6
-  pop af ;cp (Gametype),0
-  jr  z,skipworms
+  pop af ;cp (gametype),0
+  jr  z,skipstuff
   inc b ;multiplayer lvl
   inc b
   inc b ;skip other 3 worms (9 bytes)
-skipworms:
-  ld  a,b
-  add a,a
-  add a,b
-  ld  b,a ;3x(balls+2)
-skipballs:
-  inc hl
-  dnz skipballs
-
-skipflags:
-  ld  a,(Gametype)
-  cp  gamerace
+skipstuff:
+  add hl,de
+  inc hl ;3x(balls+2)
+  dnz skipstuff
+  sub gamerace ;a=(gametype)
   jr  z,skiplaps
-  cp  gamectf
-  jr  nz,noflagstoskip
-  inc hl
-  inc hl
+  dec a ;gamectf
+  jr  nz,skipobjects
+  add hl,de
 skiplaps:
-  inc hl
-  inc hl
-noflagstoskip:
-
+  add hl,de
 skipobjects:
   xor a
   or  (hl)
   inc hl ;nf
   ret z ;0=end
-  inc hl
-  inc hl
-  inc hl
-  inc hl
+  add hl,de
+  add hl,de
   jr  skipobjects
 
 loadgamecar:
-;in:    (Gametype)
+;in:    (gametype)
 ;out:   hl=dataTYPE
-;build: c=(gameCar)=(hl-1)
+;build: c=(gamecar)=(hl-1)
 ;       a=(wormbeglives)=(hl)
 ;destr: acdehl
   ld  hl,datasingle
-  ld  a,(Gametype)
+  ld  a,(gametype)
   add a,a
   add a,a
   add a,a ;8 bytes per mode
@@ -1431,7 +1432,7 @@ loadgamecar:
   ld  d,0
   add hl,de
   ld  a,(hl)
-  ld  (gameCar),a
+  ld  (gamecar),a
   ld  c,a
   inc hl
   ld  a,(hl)
@@ -1457,31 +1458,34 @@ createwormsloop:
   ld  bc,died ;0008
   add hl,bc
 ; ld  b,0
-  ld  (hl),b ;died=0
+  ld  (hl),b ;+died=0
   inc hl
-  ld  (hl),b ;score=0
+  ld  (hl),b ;+score=0
   inc hl
-  ld  (hl),b ;score+1=0
+  ld  (hl),b ;+score+1=0
   inc hl
-  ld  (hl),2 ;delay=2
+  ld  c,2
+  ld  (hl),c ;+delay=2
   inc hl
-  ld  (hl),3 ;lives=x
+  ld  (hl),3 ;+lives=x
 wormbeglives =$-1
   inc hl
   ex  de,hl  ;de=wormX+head
-  ld  bc,18
-  ldir       ;copy 18 bytes
+  ldir       ;+head=+tail (2)
+  dec hl
+  dec hl
+  ld  c,wormsize-tail ;=bc
+  ldir       ;copy 15 bytes
   dec a      ;loop
   jr  nz,createwormsloop
 
-OhMyGodItsALabel:      ;pj34r my coding skillz
+OhMyGodItsALabel:  ;pj34r my coding skillz
   cal loadgamecar
   psh hl ;datatype
   cal hlatlevel
   ex  (sp),hl ;pop \ psh leveldata
   psh hl ;psh loadgamecar
-  ld  a,0
-gameCar =$-1
+  ld  a,(gamecar)
   rra ;and _datalink
   jr  nc,_StartLevel
 
@@ -1523,17 +1527,16 @@ client:
   ld  hl,datalink
   psh de
   psh hl ;loadgamecar
-  ld  b,8 ;&&&&&&&
-  cal recvstuff
-  ld  hl,gameCar
-  ld  b,1
-  cal recvstuff
-  ld  hl,Gametype
-  ld  b,1
-  cal recvstuff
+  ld  b,8
+  cal recvstuff ;game setup
+  ld  hl,gametype ;+gamecar
+  ld  b,2
+  cal recvstuff ;transmit game
   ex  de,hl
   ld  b,168
-  cal recvstuff
+  cal recvstuff ;level
+  ld  d,b
+  cal loadtxtgame ;set CURtxtGame
 
 _StartLevel:
   jr  StartLevel
@@ -1598,16 +1601,13 @@ host:
   psh de
   psh hl ;loadgamecar
   ld  b,8
-  cal sendstuff
-  ld  hl,gameCar
-  ld  b,1
-  cal sendstuff
-  ld  hl,Gametype
-  ld  b,1
-  cal sendstuff
+  cal sendstuff ;setup
+  ld  hl,gametype ;+gamecar
+  ld  b,2
+  cal sendstuff ;game
   ex  de,hl
   ld  b,168
-  cal sendstuff
+  cal sendstuff ;level
 
 ;--- load level ---
 
@@ -1641,7 +1641,7 @@ teamset:
   inc hl
   ld  l,(hl)
   ld  h,0
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   rla
   ld  a,h ;(Left)=256
   jr  nc,setscorelimit
@@ -1670,7 +1670,8 @@ Nextlevel:
   inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 donextlevel:
-  ld  a,(Gametype)
+  ld  bc,gametype
+  ld  a,(bc)
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
@@ -1685,7 +1686,7 @@ setleft:
   ld  (lefttotal),a
   dec a
   xor (hl) ;bit (hl),7
-  ld  bc,gameCar
+  inc bc ;gamecar
   ld  a,(bc)
   jr  z,leftloaded
   or  128+32
@@ -1725,7 +1726,11 @@ setspeed:
   add hl,bc ;hl=behind sprite
   jr  setsprite
 defaultsprite:
+#ifndef intlevels
+  ld  a,42 ;always overwritten
+#else
   ld  a,defsprsz
+#endif
 defsprsize =$-1
 defsprite  =$+1
   ld  de,defspr
@@ -1753,7 +1758,7 @@ toobad_noballs:
 #endif
 
   ld  hl,worm1
-  pop af ;cp (Gametype),0
+  pop af ;cp (gametype),0
   ld  b,1
   jr  z,worminit
   ld  b,4
@@ -1867,7 +1872,7 @@ NoVertShift:
 
 
   pop hl                         ; << levelp
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamerace ;or gamectf
   jr  c,levelhasbeensetup
   ld  de,peaspos
@@ -1921,7 +1926,7 @@ maskline:
   res 3,(iy+5)
 #endif
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   rla ;bit __bitPmult,a
   cal c,multnewpea ;a=0
   rla ;bit __bitfood,a
@@ -1990,7 +1995,7 @@ growspeed =$+1
   ld  (hl),$FF ;reset
 nextturnok:
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,nodispupdate
   ld  hl,turn10
@@ -2000,7 +2005,7 @@ nextturnok:
   cal forceshowstats ;update score
 nodispupdate:
 
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamectf
   jr  nz,noctfpeas2draw
   ld  de,drawctfpea1
@@ -2271,7 +2276,7 @@ NoLinkIndic:
   pop hl
 
   psh hl
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamedeathm
   jr  nz,nodmwinner ;deathmatch?
   ld  a,0 ;winner's deaths
@@ -2303,7 +2308,8 @@ notwinner:
   pop bc
   dnz displayWormStats
 
-  ld  a,(Gametype)
+  ld  de,gametype
+  ld  a,(de)
   or  a ;singleplayer (0) only
   jr  nz,hilevelcheckdone
 checkhilevel:
@@ -2320,7 +2326,8 @@ hilvlposhl =$-2 ;save external
   cal _writeb_inc_ahl ;ld (ahl),c
 hilevelcheckdone:
 
-  ld  a,(gameCar)
+  inc de
+  ld  a,(de) ;gamecar
   and _datasingl
   jr  z,hiscorecheckdone ;no SP
 checkhiscore:
@@ -2385,7 +2392,7 @@ waitkeyloop:
 
 loadhiscoreposinahl:
   ld  hl,0 ;for peaworm and singleplayer
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a ;Singleplayer?
   jr  z,hi__
   dec a ;peaworm?
@@ -2473,7 +2480,7 @@ DoesWormTailEqualsWormHead:
   cal _cphlde
   jr  nz,removewormloop
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datasingl
   jr  nz,safewormsizedone
   ld  a,0
@@ -2548,7 +2555,7 @@ inputcall:
   or  a
   jr  z,inlink ;input by link
   cal inkeys ;input by keys
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   rra ;and _datalink
   ret nc ;no link
   ld  c,l ;send our keys
@@ -2583,7 +2590,7 @@ turn =$-1
   inc (ix+grow)
 nogrow:
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,notimescore
   ld  e,1
@@ -2674,7 +2681,7 @@ Drawworm:
   ld  c,(ix+pos)
   ld  b,(ix+pos+1)
 
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamerace
   cal z,checkhitlapline
 
@@ -2840,13 +2847,11 @@ checkballhit:
 ;_______________________________________________________________________________
 
 hitworm:
-  ld  a,(gameCar)
 #ifdef optdie
 ; if race - originally
-  ld  h,a
   cal checkhitotherworm
-  ld  a,h
 #endif
+  ld  a,(gamecar)
   bit __bitPctf,a
   jr  nz,chkctfpeas
   rla ;and _dataPmult
@@ -2877,7 +2882,7 @@ wormset2grow:
   cal IncScore
   pop af
   jp  nz,Drawworm ;continue
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a
   jp  nz,Exit ;stack restored
 
@@ -3106,7 +3111,7 @@ handledworm =$-2
   inc (ix+died)
   dec (ix+lives)
   psh af
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamectf ;ctf no death penalty
   cal nz,DecScore10
   pop af
@@ -3114,7 +3119,7 @@ handledworm =$-2
   ld  a,(wormbeglives)
   or  a ;0=no live limit
   ret z ;don't end game
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,anyworm ;quit at any worm's death
   ld  a,(nrworms) ;timematch: all worms must've died
@@ -3132,6 +3137,18 @@ anyworm:
   ld  (CheckExit),a ;set exit state
   ret ;finish turn
 
+loadtxtgame: ;in:d=0; out:hl=txtGame+(gametype); destr:ade
+  ld  a,(gametype)
+  ld  e,a
+  ld  hl,posGame
+  add hl,de ;hl=posGame+(gametype)
+  ld  a,(hl) ;str.offset
+  ld  e,a ;^d=0^
+  ld  hl,txtGame
+  add hl,de ;txtGameX
+  ld  (CURtxtGame),hl ;save for g/o
+  ret
+
 #ifdef optdie
 checkhitotherworm:
  .db  $dd,$7d ;ld a,lx
@@ -3362,7 +3379,7 @@ IncScore: ;inc score by e
   ld  d,0
 _IncScore ; inc by de
   cal ldscoreinhl
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a ;if singleplayer...
   jr  z,extralives
   add hl,de ;score+=de
@@ -3380,7 +3397,7 @@ scorelimit =$-2
   jp  nc,Exit
 
 showstats:
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  nz,timematchscore ;no disp for timematches
   ld  hl,$FC00 ;&&&only necessary in deathmatch
@@ -3398,7 +3415,7 @@ forceshowstats:
   ld  a,(nrworms)
   ld  b,a
   ld  ix,worm1
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datasingl
   jr  nz,showstatsS
 showstatloop:
@@ -3487,7 +3504,7 @@ Level =$-1
   ld  (_penCol),a
   ld  a,(ix+lives)
   cal cshowA0 ;showlives
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datafoodl
   pop ix
   ret z
@@ -4103,7 +4120,7 @@ receivenewpeaoverlink:
   ld  h,c
   ret
 sendnewpeaoverlink:
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   rra ;and _datalink
   ret nc ;no link
   ld  a,(worm1+left)
@@ -4320,95 +4337,93 @@ txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 
 ;--- menus ---
 
-txtMenu:   .db "Mode",0  ;1st menu item
-          .db "Level",0 ;2nd
-          .db "Link",0  ;...
-          .db "Worms",0
-          .db "worm #",0
-posMenu:   .db  5
+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
+txtteamed: .db                 " vs 2",0 ;4th tail
+txtMenuR:  .db              "controls",0 ;6th
+
+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
+
+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
-txtKleft:  .db ":left",0
-txtKright: .db "/right",0
+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
+txtKleft:  .db                 ":left",0
+txtKright: .db                "/right",0
 posLevsel   =  $0320
 txtLevsel: .db $CF," SELECT LEVELS ",5,0
-txtWaitn:  .db "Waiting" ;"...",0
-txtReceiv: .db "...",0
+txtWaitn:  .db         "Waiting";"...",0
+txtReceiv: .db                   "...",0
 
 #ifdef readytext
-txtReady:  .db "Prepare!",0
-txtposReady =   7
+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",$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
+txtLevel:  .db                "Level ",0
+txtWorms:  .db              "Worms: 0",0 ;follows txtLevel
+txtName:   .db                  "Name",0
+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
 
 ;--- 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
+trigtable: .db    0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45
+           .db   48, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 80, 82, 85, 87
+           .db   89, 91, 94, 96, 98,100,102,103,105,107,108,110,112,113,114,116
+           .db  117,118,119,120,121,122,123,123,124,125,125,126,126,126,126,126
+           .db                                                              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,LevelDefM,LevelDefM
+           .dw          LevelDefM,LevelDefM,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
+defhiscrpos =  0
 #endif
 
 ;--- game settings ---
@@ -4417,89 +4432,73 @@ _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
+__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)
+savestart:;---
+
+worm1set:  .dw worm1p
+           .db  %11110111,1,K_RIGHT,K_LEFT
+worm1name: .db   "WORMY   ",0 ;15 bytes
+worm2set:  .dw worm2p
+           .db  %11111011,0,K_F2,K_F1
+worm2name: .db   "VIPER   ",0
+worm3set:  .dw worm3p
+           .db  %11111011,1,K_COMMA,K_STO
+worm3name: .db   "NIBBLER ",0
+worm4set:  .dw worm4p
+           .db  %11111101,0,K_PLUS,K_ENTER
+worm4name: .db   "JIM     ",0
+
+         ;            �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)
+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)
+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)
+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)
+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)
+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)
+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)
+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
-worm1name: .db "WORMY   ",0
-worm2set:  .dw worm2p,worm2p
-           .db %11111011,0,-01,K_F2,K_F1
-worm2name: .db "VIPER   ",0
-worm3set:  .dw worm3p,worm3p
-           .db %11111011,1,-01,K_COMMA,K_STO
-worm3name: .db "NIBBLER ",0
-worm4set:  .dw worm4p,worm4p
-           .db %11111101,0,-01,K_PLUS,K_ENTER
-worm4name: .db "JIM     ",0
-
-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
-rspawndelay =   30
-maxnamesize =   8+1
+datactf:   .db %01001000,0,6,1,-1,-1, 8,10 ;CTF (100 score)
+
+gametype:  .db 0 ;last gamemode
+gamecar:         ;made before needed (not saved)
+
+saveend:;---
+
+startdelay  =  17
+rspawndelay =  31
+maxnamesize =  8+1
 
 #ifdef intlevels
-defsprsz    =   4
+           .db $42 ;gamecar
+defsprsz    =  4
 defspr:    .db %01100000
            .db %11110000
            .db %11110000
            .db %01100000
 
 deflevels: .db "Internal Levels",0
-           .db "by Shiar" ;,0
+           .db       "by Shiar";,0
 
            .db 0,deflevels/256,deflevels&255
 #endif