wormy 0.97.109
[wormy.git] / wormy.z80
index 26d374f60d594d24140cb4a24a9707a40bc56e4b..ab13324f4804c966a5685ce9c2a34c73896495fd 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -1,4 +1,4 @@
-;   ����                                                        ����
+;___����________________________________________________________����____________
 ;  ����                                                         �����
 ; ���                                                            ����     ����
 ;���      �����          ��������       �����     ����  ����      ���     �����
 ; ���      ���      ���  ���     ��� ���       ���  ������   ���            ���
 ;  ����  �������  ����    ���   ���  ����      ���            �����       ����
 ;   �������� ��������     ���������   ���      ���             ���������������
-;    �����     �����       �������     ��       ���              �����������
+;    �����     �����       �������     ��       ���              �����������
+;_______________________________________________________________________________
 ;
-; Version                  : 97% (0.97.13)
-; Release Date             : UUHHhhh... soon?!?
-; 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)
-; 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 (80898 bytes) 1234
-
-;-----------------------------
-;----------- TO-DO -----------
-;-----------------------------
-
-; 97% = DONE
-
-;  1% * misc (bugs, &&&, pollish, &&, &)
-;     * score >9 dispay
-;     * mem at worm #4 (still 12 bytes or so.. or more? or less?)
-;     * look at init-z in line routine again
-;   * LINK
-;  1% * fix transmit game/level data (?)
-;     * >Somehow do a lot of testing with 2 calcs< *sigh*
-
-;100% = bugs fixed + levels done
-
-;      arrow to offscreen peas
-;      multiple peas in sp level
-;>110%:        sound, startpos (?)
-;>120%:        coop (DON'T COUNT ON IT)
-
-;-----------------------------
-;-----------------------------
-;-------  W O R M Y  ---------
-;-----------------------------
-;-----------------------------
+; Version                  :                                       97% (0.97.19)
+; Release Date             :                                      2002 January 9
+; 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)
+; 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
+;_______________________________________________________________________________
 
 ;NOTES:
 ;* Use for LEARNING practises ONLY!
-;   Don't ever release altered code w/o permission!
+;   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 quite some stuff, I can't guarantee
+;* 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.
 
-#define buffer      ;use display buffer (otherwise write directly to screen)
-#define readymask   ;"greys" out the field before starting a level
-#define coolzgfx    ;nice graphics for game over screen
-multpeas
+;_______________________________________________________________________________
+; _______  _____        ______   _____
+;    |    |     |       |     \ |     |
+;    |    |_____| _____ |_____/ |_____|
+;_______________________________________________________________________________
 
-;#define intlevels  ;internal levels
-;#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
+; 97% = DONE
+;     X [15] lives >9 dispay
+;     X [15] sp modes not configurable
+;     X [16] LVL: episode #2: 10 sp levels
+;     X [17] lives stats for every liveslimited game (also !dm)
+;     X [18] LINK: fix transmit game/level data
+;     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
+;  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
+;  1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
+;     * LINK: called "Linkmatch" at g/o
+;     * 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?
 
-#define cal call
-#define psh push
-#define dnz djnz
+;100% = bugs fixed + levels done
+;>    * switchable scoredecrease on death?
+;     * wall at pickup position fix
+;     * arrow to offscreen peas
+;110% * sound
+;     * startpos
+;120% * coop (DON'T COUNT ON IT)
+
+;_______________________________________________________________________________
+;  _/_/_____ __   _ _______        _     _ ______  _______
+; _/_/   |   | \  | |       |      |     | |     \ |______
+; / /  __|__ |  \_| |_____  |_____ |_____| |_____/ |______
+;_______________________________________________________________________________
 
 #include "asm86.h"
 #include "ti86asm.inc"
+
+ #define cal call
+ #define psh push
+ #define dnz djnz
+
 _SHRACC            = $4383 ;4x srl a
 _SHLACC            = $438B ;4x sll a
 _divHLby10         = $4044 ;hl=hl/10
@@ -111,38 +124,54 @@ _load_ram_ahl      = $462F ;ahl->page+hl
 _writeb_inc_ahl    = $5567 ;ld (ahl++),c
 _jforce            = $409C ;TI-OS stack restored
 _EXLP              = $4493 ;swap (hl),(de) b times
-_GETB_AHL         = $46C3 ;a=(ahl) \ hl=ahl
-
-;-----------------------------
-;------- data  storage -------
-;-----------------------------
-
-;--- permanent
-
-ScrBuffer   = $8820 ;-A7FF (20*FF=1FE0)
+_GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
+
+ #define buffer     ;use display buffer (otherwise write directly to screen)
+ #define readymask  ;"greys" out the field before starting a level
+ #define coolzgfx   ;nice graphics for game over screen
+ #define spprotect  ;options not changable for singleplayer modes
+;#define intlevels  ;-internal levels
+;#define readytext  ;-displays "prepare" before level starts
+;#define invincible ;-worms cannot die =)
+;#define optdie     ;-in race games worms dont die when they run into each other
+
+;_______________________________________________________________________________
+; _______ _______  _____   ______ _______  ______ _______
+; |______    |    |     | |_____/ |_____| |  ____ |______
+; ______|    |    |_____| |    \_ |     | |_____| |______
+;_______________________________________________________________________________
+
+;--- permanent ---
+
+ScrBuffer   = $8420 ;-A3FF (20*FF=1FE0)
+worm4p      = $A400 ;-A5FF (200)      %101001O0
+;free       = $A600 ;-A7FF (200)
 worm2p      = $A800 ;-ABFF (400)      %10101O00
-worm1       = $AC00 ;-AC1D (31d)
-worm2       = $AC1F ;-AC3B (1F)
-worm3       = $AC3E ;-AC59 (1F)
-worm4       = $AC5D ;-AC77 (1F)
-balls       = $AC7C ;-ACFF (3x43d)
-SinCosTable = $AD00 ;-AE00 (4*40)
-turn10      = $AE01 ;-AE01 (1) (counter)
-peaspos     = $AE02 ;-AE05 (4+) (peas)
-;free       = $AE06 ;-AFFF (1FA)
+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)
+;free       = $AF06 ;-AFFF (F9)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
+;buffer     = $BC00 ;-BF90 (390)
 ;free       = $BF91 ;-BFFF (6F)
 ;program    = $D748 ;-EFFF (186D+4A)           ;6327
-worm4p      = $F000 ;-F3FF (400)      %11110O00
-leveldata   = $F400 ;-FA70 (<=671)
-       ;can you believe i actually left $269 bytes of memory unused?!?
+leveldata   = $F080 ;-F9FF (<=97F)
+#ifndef intlevels
+datalevels  = $FA00 ;-FA11 (12) (>=$C000)
+nrlevels    = $FA12 ;-FA1B (A)   (<$FA70)
+#endif
 
 ;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong
-;   |..[------]||[]|......[-----]|[].| ;if you still understand
+;   |..[------]||[]|......[-----]|[].| ;if you still understand    < OUTDATED <
 ;   |   SCREEN 2* 13      PRGM   4LV | ;after looking at this
 
-;--- temporary
+;--- temporary ---
 
 namelength  = $BC00 ;(1)         @menu
 datalink    = $BC00 ;(8)        @init
@@ -151,11 +180,16 @@ DispBuffer  = $BC00 ;(10x57d)    @game
 #else
 DispBuffer  = $FC70
 #endif
-lefttotalb  = $AFFF
+linklevel   = $AECC ;(<=134)     @game+init
+lefttotalb  = $BF91 ;(1)         @game
+drawctfpea1 = peaspos+4
+drawctfpea2 = peaspos+6
 
-;-----------------------------
-;------- program start -------
-;-----------------------------
+;_______________________________________________________________________________
+;  _____   ______  _____   ______       _______ _______ _______  ______ _______
+; |_____] |_____/ |     | |  ____       |______    |    |_____| |_____/    |
+; |       |    \_ |_____| |_____| _____ ______|    |    |     | |    \_    |
+;_______________________________________________________________________________
 
  .org %1101011101001000
 
@@ -178,7 +212,7 @@ start:              ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 97% .13",0
+ .db  " 97% .19",0
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
@@ -191,7 +225,7 @@ WormIcon:
  .db  %00111100,%00111110
 
 levelhead  = 'w'
-levelhead2 = 95 ;wormy levels header = "95"
+levelhead2 = 97 ;wormy levels header = "97"
 
 int_handler:
   ex  af,af'
@@ -295,10 +329,16 @@ loadgametype:
   inc bc
   pop af
   pop de ;counter
-  dec d ;8x
+  dec d ;9x
   jr  nz,loadgametype
   ret
 
+;_______________________________________________________________________________
+;        _______ _    _       _______ _______        _______ _______ _______
+; |      |______  \  /        |______ |______ |      |______ |          |
+; |_____ |______   \/   _____ ______| |______ |_____ |______ |_____     |
+;_______________________________________________________________________________
+
 searchcomplete:
   ld  a,255
   ld  (ix),a ;end mark
@@ -499,9 +539,13 @@ setdeflevels:
   add hl,de ;next
   dnz setdeflevels
 
-;-----------------------------
-;----- build trig tables -----
-;-----------------------------
+;_______________________________________________________________________________
+; _______  _____   ______ _______       _____ __   _ _____ _______
+; |  |  | |     | |_____/ |______         |   | \  |   |      |
+; |  |  | |_____| |    \_ |______ _____ __|__ |  \_| __|__    |
+;_______________________________________________________________________________
+
+;--- trig tables ---
 
   ld  hl,TrigPrecalc ;I believe this
   ld  de,SinCosTable  ;is one of the few
@@ -526,11 +570,15 @@ NegativeSineWave:
   inc de
   dnz NegativeSineWave
 
-;-----------------------------
-;---------- menu -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _____ __   _       _______ _______ __   _ _     _
+; |  |  | |_____|   |   | \  |       |  |  | |______ | \  | |     |
+; |  |  | |     | __|__ |  \_| _____ |  |  | |______ |  \_| |_____|
+;_______________________________________________________________________________
+
+;---draw menu---
 
-DisplayMenu: ;---draw menu---
+DisplayMenu:
   cal linkok
   cal _clrWindow
   ld  de,$FC40 ;(0,4)
@@ -591,7 +639,7 @@ hrloop:
   dnz hrloop
   ret
 
-;--- menu loop ---
+;--- options menu ---
 
 dispoptionmenu:
   ld  hl,txtoMenu
@@ -600,13 +648,18 @@ dispoptionmenu:
   cal dispmenucommon_
 
 dispomenusets:
+#ifdef spprotect
+  ld  a,(gameCar)
+  and _datasingl
+  jp  nz,LetsGetThisPartyOn
+#endif
   cal clrold
 
   ld  hl,$1E3E
   ld  (_penCol),hl
   cal loadgamecar
   psh hl
-  cal cshowA0 ;lives
+  cal cshowA ;lives
 
   ld  hl,$2A3E
   ld  (_penCol),hl
@@ -620,7 +673,7 @@ dispomenusets:
   cal _vputs
   jr  dispspeeddone
 dispspeed:
-  cal cshowA0
+  cal cshowA
 dispspeeddone:
 
   ld  hl,$363E
@@ -630,7 +683,7 @@ dispspeeddone:
   psh hl
   ld  a,(hl) ;(growth)
   inc a ;-1=None; 0..98->1..99
-  cal cshowA0
+  cal cshowA
 
   ld  hl,$303E
   ld  (_penCol),hl
@@ -644,7 +697,7 @@ dispspeeddone:
   cal _vputs
   jr  dispturndone
 dispturn:
-  cal cshowA0 ;turn speed
+  cal cshowA ;turn speed
 dispturndone:
 
   ld  hl,$243E
@@ -654,7 +707,7 @@ dispturndone:
   ld  a,(hl) ;(scorelimit)
   or  a
   psh af
-  cal cshowA0 ;limit
+  cal cshowA ;limit
   pop af ;a==0?
   jr  z,optionMenu ;do not display 0 behind 'None'
   ld  a,'0'
@@ -806,7 +859,7 @@ bchangegrowth:
   jr  z,__optionMenu ;<-1
   jr  changedgrowth
 
-;---
+;--- main menu ---
 
 mainMenu:
   cal menupos
@@ -995,7 +1048,7 @@ changekeys:
   cal getcustomkey ;right
 ; jr  dispmenusets
 
-;---display current settings---
+;--- display current settings ---
 
 dispmenusets:
   cal clrold
@@ -1041,7 +1094,7 @@ displink:
   or  a ;gamesingle
   jr  nz,displvlname
   ld  a,(Level)
-  cal cshowA0
+  cal cshowA00
   jr  lvldisped
 displvlname:
   cal _vputs
@@ -1219,9 +1272,11 @@ nameentered:
   ld  (ix+8),0 ;end mark
   jp  DisplayMenu
 
-;-----------------------------
-;------- procs-n-stuff -------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _____ _______ _______        _____   ______  _____  _______ _______
+; |  |  |   |   |______ |             |_____] |_____/ |     | |       |______
+; |  |  | __|__ ______| |_____  _____ |       |    \_ |_____| |_____  ______|
+;_______________________________________________________________________________
 
 ubergetkey:
   halt ;woo hoo
@@ -1248,13 +1303,10 @@ clroldsetsloop:
 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,28+1 ;go to datalevels
+  add a,a
   ld  e,a ;=de
-  sbc hl,de ;datalevels
+  ld  hl,datalevels
+  add hl,de
   cal _ldHLind ;ld hl,(hl)
   pop de ;de=loadgamecar
   inc de \ inc de
@@ -1352,9 +1404,11 @@ loadgamecar:
   ld  (wormbeglives),a
   ret
 
-;-----------------------------
-;-------- start game ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _______  ______ _______        ______ _______ _______ _______
+; |______    |    |_____| |_____/    |          |  ____ |_____| |  |  | |______
+; ______|    |    |     | |    \_    |    _____ |_____| |     | |  |  | |______
+;_______________________________________________________________________________
 
 LetsGetThisPartyOn:
   ld  a,$17 ;no exit
@@ -1397,7 +1451,7 @@ gameCar =$-1
   rra ;and _datalink
   jr  nc,_StartLevel
 
-;--------- link ------------
+;--- link ---
 
 wormVhost   = 095
 wormVclient = 195
@@ -1504,8 +1558,8 @@ sethost:
   cal recvstuff
   pop hl ;loadgamecar
   pop de ;leveldata
-  ld  hl,templevels ;&&&&&&&
-  ld  de,datalink
+  ld  de,linklevel ;&&&&&&&
+  ld  hl,datalink
   psh de
   psh hl ;loadgamecar
   ld  b,8
@@ -1520,7 +1574,7 @@ sethost:
   ld  b,168
   cal recvstuff
 
-;-------- load level ---------
+;--- load level ---
 
 StartLevel:
   pop hl ;loadgamecar
@@ -1545,7 +1599,7 @@ StartLevel:
   ld  h,0
   ld  a,(gameCar)
   rla
-  ld  a,0 ;(Left)=256
+  ld  a,h ;(Left)=256
   jr  nc,setscorelimit
   ld  a,l
   ld  l,h
@@ -1609,7 +1663,7 @@ setspeed:
   ld  de,peagrowth
   ldi
   ld  a,(hl)
-  ld  (worm1+grow),a
+  ld  (worm1+grow),a ;&&sh
   ld  (worm2+grow),a
   ld  (worm3+grow),a
   ld  (worm4+grow),a
@@ -1687,7 +1741,7 @@ worminit:
   inc a ;ld a,2
   ld  (flashtime),a
 
-;-------- draw level ---------
+;--- draw level ---
 
 initlevel:
   ld  a,(de)
@@ -1785,7 +1839,7 @@ levelhasbeensetup:
 
   cal drawstuff
 
-;--------- prepare -----------
+;--- prepare ---
 
 leveldone:
   psh hl                        ; >> levelp new
@@ -1824,14 +1878,11 @@ maskline:
 #endif
 
   ld  a,(gameCar)
-  bit _bitfood,a
-  jr  nz,nofood
-;  ld  ix,worm1
-  cal NewPea
-  xor a
-nofood:
   rla ;bit _bitmultpeas,a
-  cal c,multnewpea
+  cal c,multnewpea ;a=0
+  rla ;bit _bitfood,a
+  cal nc,NewPea
+nofood:
   ld  bc,(worm1+pos)
   cal DisplayField
 
@@ -1841,9 +1892,11 @@ ReadyDelay:
   dnz ReadyDelay
   cal releasekeys
 
-;-----------------------------
-;----------- LOOP ------------
-;-----------------------------
+;_______________________________________________________________________________
+;  ______ _______ _______ _______               _____   _____   _____
+; |  ____ |_____| |  |  | |______       |      |     | |     | |_____]
+; |_____| |     | |  |  | |______ _____ |_____ |_____| |_____| |
+;_______________________________________________________________________________
 
 GameLoop:
   ld  bc,(worm1+pos) ;camera worm #1
@@ -1934,9 +1987,11 @@ handleworms:
   inc (hl) ;0..nrworms-1
   dnz handleworms
 
-;-----------------------------
-;---------- keys -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _     _ _______ __   __ _______
+; |____/  |______   \_/   |______
+; |    \_ |______    |    ______|
+;_______________________________________________________________________________
 
 HandleKeys:
   ld  a,%10111111
@@ -1950,7 +2005,7 @@ CheckExit:
   jp  c,GameLoop
   jp  Exit ;jr?
 
-;------- pause menu -------
+;--- pause menu ---
 
 disppausemenu:
   ld  hl,txtpMenu
@@ -2031,6 +2086,12 @@ donepausing:
   cal releasekeys
   jp  GameLoop
 
+;_______________________________________________________________________________
+;  ______ _______ _______ _______        _____  _    _ _______  ______
+; |  ____ |_____| |  |  | |______       |     |  \  /  |______ |_____/
+; |_____| |     | |  |  | |______ _____ |_____|   \/   |______ |    \_
+;_______________________________________________________________________________
+
 Exit:
   cal releasekeys
   ld  sp,0 ;pop all
@@ -2120,7 +2181,7 @@ nonewdmwinner:
   dnz finddmwinner
   ld  (dmwinner),a
 
-;---display worms---
+;--- display worms ---
 
   ld  a,(nrworms)
   ld  b,a
@@ -2177,7 +2238,8 @@ notwinner:
   psh hl
   inc hl ;worm+score
   cal _ldHLind
-  cal showHL
+  cal _D_HL_DECI
+  cal _puts ;showHL
   pop hl
 
   ld  bc,worm2-worm1
@@ -2248,7 +2310,8 @@ NotNewHigh:
   ld  hl,highsave+2
   cal _puts
   ld  hl,(highsave)
-  cal showHL
+  cal _D_HL_DECI
+  cal _puts ;showHL
 hiscorecheckdone:
 
 waitkey:
@@ -2326,9 +2389,11 @@ iswinner:
   ld  a,'*'
   jp  _putc ;..then put *
 
-;-----------------------------
-;----------- worm ------------
-;-----------------------------
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______       _______ _______ _     _ _______ _______
+; |  |  | |     | |_____/ |  |  |       |______    |    |     | |______ |______
+; |__|__| |_____| |    \_ |  |  | _____ ______|    |    |_____| |       |
+;_______________________________________________________________________________
 
 respawncheck:
   cp  respawndelay-1
@@ -2441,9 +2506,11 @@ inlink:
   ld  l,c
   ret
 
-;-----------------------------
-;------- handle worm ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______       _______        _____ _    _ _______
+; |  |  | |     | |_____/ |  |  |       |_____| |        |    \  /  |______
+; |__|__| |_____| |    \_ |  |  | _____ |     | |_____ __|__   \/   |______
+;_______________________________________________________________________________
 
 HandleWorm:
   xor a
@@ -2496,7 +2563,7 @@ donediddelydone:
   pop hl
 #endif
 
-;-------- move worm ----------
+;--- move worm ---
 
 Wormmove:
   psh bc                        ; >> pos
@@ -2549,24 +2616,22 @@ GotFour:
   rl  d
   jp  nc,Drawworm
 
-;--------- worm hit ----------
+;--- worm hit ---
 
 Hitworm:
   ld  a,(gameCar)
-  ld  h,a
 #ifdef optdie
 ; if race - originally
+  ld  h,a
   cal checkhitotherworm
   ld  a,h
 #endif
-  and _datactfpeas ;&&bit
+  bit _bitctfpeas,a
   jr  nz,chkctfpeas
-  ld  a,h
-  and _datamultpeas ;&&bit
-  jp  nz,chkmultpeas
-  ld  a,h
-  and _datafood
-  jp  nz,WormDead ;no food
+  rla ;and _datamultpeas
+  jp  c,chkmultpeas
+  rla ;and _datafood
+  jp  c,WormDead ;no food
 
   ld  hl,0
 PeaY =$-2
@@ -2591,9 +2656,6 @@ wormset2grow:
   cal IncScore
   pop af
   jp  nz,Drawworm ;continue
-; ld  a,(gameCar) ;(Left)>256
-; and _datafoodl
-; jp  z,Drawworm
   ld  a,(Gametype)
   or  a
   jp  nz,Exit ;stack restored
@@ -2650,14 +2712,12 @@ sel_otherpea:
   pop af ;which flag? (=and %1)
   ld  hl,drawctfpea1 ;restore #1
   jr  z,nottheotherflag
-  ld  hl,drawctfpea2 ;restore #2
+  inc hl ;ld hl,drawctfpea2
+  inc hl ;restore #2
 nottheotherflag:
   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
@@ -2704,8 +2764,9 @@ pickmultpea:
   cal DrawPea
   jp  pickpea_
 
-;-----------------------------
+;--- misc ---
 
+#ifdef optdie
 nextotherwormbit:
   ld  a,c
   sub (hl)
@@ -2725,6 +2786,7 @@ ChkWorm:
   cal _cphlde
   jr  nz,nextotherwormbit
   ret ;z
+#endif
 
 checkhitlapline:
   ld  a,(peaspos) ;63
@@ -2753,7 +2815,7 @@ checklap:
   pop bc
   ret
 
-;-------- draw worm ----------
+;--- draw worm ---
 
 Drawworm:
   ld  c,(ix+pos)
@@ -2821,9 +2883,11 @@ ResPixel:
   ld  (hl),a
   ret
 
-;-----------------------------
-;---------- ball -------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______   _____  _     _ __   _ _______ __   __ ______  _______
+; |_____] |     | |     | | \  | |         \_/   |_____] |_____| |      |
+; |_____] |_____| |_____| |  \_| |_____     |    |_____] |     | |_____ |_____
+;_______________________________________________________________________________
 
 handlethoseneatlittleballs:
   ld  hl,balls
@@ -2916,9 +2980,11 @@ checkballhit:
   pop de
   ret
 
-;-----------------------------
-;----------- procs -----------
-;-----------------------------
+;_______________________________________________________________________________
+;  _____   ______  _____  _______ _______
+; |_____] |_____/ |     | |       |______
+; |       |    \_ |_____| |_____  ______|
+;_______________________________________________________________________________
 
 releasekeys:
   halt
@@ -2979,10 +3045,9 @@ handledworm =$-2
   inc (ix+died)
   dec (ix+lives)
   psh af
-  ld  de,10
   ld  a,(Gametype)
   cp  gamectf ;ctf no death penalty
-  cal nz,DecScore
+  cal nz,DecScore10
   pop af
   ret nz ;HandleWorm done
   ld  a,(wormbeglives)
@@ -3010,23 +3075,21 @@ anyworm:
 checkhitotherworm:
  .db  $dd,$7d ;ld a,lx
   cp  worm2&255
- psh ix
jr nz,chkworm2 ; ret nz
 psh ix
 jr  nz,chkworm2 ;ret nz
   ld  ix,worm1
jr chkworm
 jr  chkworm
 chkworm2:
- ld ix,worm2
-
+  ld  ix,worm2
 chkworm:
ld h,(ix+tail+1)
ld l,(ix+tail)
ld e,(ix+head)
ld d,(ix+head+1)
 ld  h,(ix+tail+1)
 ld  l,(ix+tail)
 ld  e,(ix+head)
 ld  d,(ix+head+1)
   cal ChkWorm
- pop ix
 pop ix
   ret z ;not hit
   pop bc ;call
-
 stopworm:
   ld  bc,0
 previouspos =$-2
@@ -3088,6 +3151,7 @@ multpealoop:
   ldi
   pop bc
   dnz multpealoop
+  ld  a,-1
   ret
 
 NewPea:
@@ -3148,7 +3212,11 @@ nextbitok:
   dnz sprloopy
   ret
 
-;----------- score -----------
+;_______________________________________________________________________________
+; _______ _______  _____   ______ _______
+; |______ |       |     | |_____/ |______
+; ______| |_____  |_____| |    \_ |______
+;_______________________________________________________________________________
 
 timematchscore:
   ;piece of crap checking whether you've already won in timematch
@@ -3206,19 +3274,17 @@ extralives:
   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
+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
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
+  cal ldscoreinhl
   ld  a,(Gametype)
   or  a ;if singleplayer...
   jr  z,extralives
@@ -3241,7 +3307,8 @@ showstats:
   ld  hl,$FC00 ;&&&only necessary in deathmatch
   ld  b,6*16-1 
 clearstats:
-  ld  (hl),a ;=0
+ ; ld  (hl),a ;=0
+ ;&&&&&&
   inc hl
   dnz clearstats
 forceshowstats:
@@ -3290,19 +3357,23 @@ nameshown:
   ret
 
 showstat: ;(multiplayer)
-  ld  a,(Gametype)
-  cp  gamedeathm
-  jr  z,showlives
+  ld  a,(wormbeglives)
+  or  a
+  jr  nz,showlives
 showscore:
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
+  cal ldscoreinhl
   cal _D_HL_DECI
   jr  __vputs
 showlives:
   ld  a,(ix+lives)
-showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
-  cp  10
-  jr  c,showleastsign
+  jr  cshowA00
+
+cshowA: ;small w/ leading 0
+  or  a
+  jr  nz,cshowA00
+  ld  hl,txtNone
+  jp  _vputs
+cshowA00:
   ld  l,a
   ld  h,0
   cal _divHLby10
@@ -3311,7 +3382,7 @@ showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
   add a,'0'
   cal __vputmap
   pop af
-showleastsign:
+cshowA0:
   add a,'0'
 __vputmap:
   psh ix
@@ -3324,24 +3395,29 @@ showstatsS: ;(singleplayer)
   cal __vputs
   ld  a,0
 Level =$-1
-  cal showA
+  cp  10
+  psh af
+  cal c,cshowA0
+  pop af
+  cal nc,cshowA00
 
-  ld  a,98
+  ld  a,97
   ld  (_penCol),a
   cal showscore
   ld  a,123
   ld  (_penCol),a
-  cal showlives
+  ld  a,(ix+lives)
+  cal cshowA0 ;showlives
   ld  a,(gameCar)
   and _datafoodl
   pop ix
   ret z
 showleft:
-  ld  a,31
+  ld  a,33
   ld  (_penCol),a
   ld  a,0
 Left =$-1
-  cal cshowA0
+  cal cshowA
 
   ld  hl,txtLeft
 __vputs:
@@ -3366,27 +3442,6 @@ showA0: ;big w/ leading 0
   add a,'0'
   jp  _putc
 
-cshowA0: ;small w/ leading 0
-  or  a
-  jr  nz,cshowavalue
-  ld  hl,txtNone
-  jp  _vputs
-cshowavalue:
-  ld  l,a
-  ld  h,0
-  cal _divHLby10
-  psh af
-  ld  a,l
-  add a,'0'
-  cal __vputmap
-  pop af
-  add a,'0'
-  jp  __vputmap
-
-showHL:
-  cal _D_HL_DECI
-  jp  _puts
-
 _D_HL_DECI:
   ld  de,savestr+4
   ld  b,5
@@ -3401,7 +3456,16 @@ ldhld:
 savestr:
   .db "00000",0
 
-;-----------------------------
+ldscoreinhl:
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
+  ret
+
+;_______________________________________________________________________________
+; ______  _____ _______  _____         _______ __   __
+; |     \   |   |______ |_____] |      |_____|   \_/
+; |_____/ __|__ ______| |       |_____ |     |    |
+;_______________________________________________________________________________
 
 DisplayField:  ;all done by Jonah Cohen iirc. (-scrolling is scary-)
   ld  a,c      ;not the fastest routine outthere, but it does get the job done.
@@ -3625,7 +3689,11 @@ ChunkRow:
   ld  c,$37 ;scf
   ret
 
-;----------- draw ------------
+;_______________________________________________________________________________
+; ______   ______ _______ _  _  _
+; |     \ |_____/ |_____| |  |  |
+; |_____/ |    \_ |     | |__|__|
+;_______________________________________________________________________________
 
 ;--- pixel ---
 
@@ -3712,6 +3780,8 @@ drawsmtn:
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
+;--- circle ---
+
 ;IMHO, one weery nice routine. Oh lemme be proud just *once*.
 ;Not perfect since it uses a screwy lineroutine to draw stuff
 ;but, just _look_ at it. Ain't it grand? Z80 at its best.
@@ -3783,6 +3853,8 @@ circledraw:               ;destr:de
   pop hl
   ret                  ;thats it
 
+;--- box ---
+
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
   ld  l,e
@@ -3793,6 +3865,8 @@ boxloop:
   dnz boxloop
   ret
 
+;--- fatline ---
+
 drawfatline:
   cal drawline
   inc d
@@ -3805,6 +3879,8 @@ drawfatline:
   dec h
 ; jp  drawline
 
+;--- line ---
+
 ;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it
 ;himself tho.) I did make a few optimizations and commented the thing.
 ;A nice routine (also Bresenham), but for Wormy not perfect since really
@@ -3918,7 +3994,7 @@ sendnewpeaoverlink:
   ld  a,(gameCar)
   rra ;and _datalink
   ret nc ;no link
-  ld  a,(ix+left)
+  ld  a,(worm1+left)
   or  a
   jr  z,receivenewpeaoverlink
   ld  c,l ;send pea's pos
@@ -3927,14 +4003,16 @@ sendnewpeaoverlink:
 ; jr  Qsend ;that's why it's here
 
 ;..and last but not least..:
-;-----------------------------
-;----------- link ------------
-;-----------------------------
+;_______________________________________________________________________________
+;        _____ __   _ _     _   /
+; |        |   | \  | |____/   /
+; |_____ __|__ |  \_| |    \_ .
+;_______________________________________________________________________________
 
 timeout = $8000
 lossout = 20
 
-;---- SEND ----
+;--- send ---
 
 Qsend:         ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
   nop \ nop
@@ -3963,7 +4041,7 @@ sendfinish:
   ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
-;---- RECV ----
+;--- recv ---
 
 Crecv:         ;--- receive 8 bits into A/C --- destr:abCde ---
   cal Qrecv
@@ -3998,7 +4076,7 @@ recvfinish:
   ld (linklosses),a    ;reset number of losses
   ret
 
-;---- COMMON ----
+;--- common ---
 
 linkok:
   ld  a,D0HD1H
@@ -4033,10 +4111,11 @@ linkerr:
   jp  Exit
 
 #ifdef intlevels
-
-;-----------------------------
-;---------- levels -----------
-;-----------------------------
+;_______________________________________________________________________________
+; _____ __   _ _______              _______ _    _ _______        _______
+;   |   | \  |    |          |      |______  \  /  |______ |      |______
+; __|__ |  \_|    |    _____ |_____ |______   \/   |______ |_____ ______|
+;_______________________________________________________________________________
 
 LevelDef:
   .db 5,4,15,15,0,0    ;peas,speed,growth,begin_size,sprite,balls
@@ -4096,9 +4175,11 @@ LevelDefC: ;ctf
 
 #endif
 
-;-----------------------------
-;---------- data -------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______  _______ _______ _______
+; |     \ |_____|    |    |_____|
+; |_____/ |     |    |    |     |
+;_______________________________________________________________________________
 
 wtPicture: ;title
 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
@@ -4210,26 +4291,23 @@ txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #endif
 
 #ifdef intlevels
-datalevels: .dw LevelDef, LevelDefM
-            .dw LevelDefT,LevelDefM
-            .dw LevelDefM,LevelDefM,LevelDefM
+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
-#else
-datalevels: .dw 0,0,0,0,0,0,0,0,0
-nrlevels:   .dw 0,0,0,0,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      = %00100000 ;food present=0
-_bitfood       = 5
+_datafood      = %01000000 ;food present=0
+_bitfood       = 6
 _datamultpeas  = %10000000 ;multiple peas=1 (no _datafood)
 _bitmultpeas   = 7
-;reserved        %01000000 ;for future use
+;reserved        %00100000 ;for future use
 
 savestart:        ;      �game info (see above)
                   ;      | �lives (0=unlimited)
@@ -4240,21 +4318,21 @@ savestart:        ;      
                   ;      | | | |  |  |  �turn speed (8=def)
                   ;      | | | |  |  |  |  �score limit (0=none)
 gamesingle   =  0 ;      | | | |  |  |  |  |
-datasingle: .db  %01000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+datasingle: .db  %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
 gamepeas     =  1
-datapeas:   .db  %01000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
+datapeas:   .db  %00000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
 gametron     =  2
-datatron:   .db  %01110100,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  %01100000,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  %01000000,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  %11100010,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  %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
+datatimem:  .db  %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
 gamerace     =  7
-datarace:   .db  %01100000,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,4,1,-1,-1, 8,10 ;CTF (100 score)
 
@@ -4268,7 +4346,7 @@ worm3set:  .dw worm3p,worm3p
            .db %11111011,1,-01,K_COMMA,K_STO
 worm3name: .db "NIBBLER ",0
 worm4set:  .dw worm4p,worm4p
-           .db %11111011,0,-01,K_PLUS,K_ENTER
+           .db %11111101,0,-01,K_PLUS,K_ENTER
 worm4name: .db "JIM     ",0
 
 defhiscrpos:
@@ -4323,9 +4401,11 @@ deflevels:
 #endif
 templevels:
 
-;-----------------------------
-;----------- end -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _     _ _______ _______ . _______       _______
+;    |    |_____| |_____|    |    ' |______       |_____| |      |
+;    |    |     | |     |    |      ______| _____ |     | |_____ |_____
+;_______________________________________________________________________________
 
   .end