wormedit 0.5.2103
[wormy.git] / wormy.z80
index 0ff73a0d022c78b5e47506baadee378103e2217c..26d374f60d594d24140cb4a24a9707a40bc56e4b 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -1,32 +1,51 @@
-; Title                      : Wormy
-; Version                    : 96% (0.96.C21)
-; Release Date               : UUHHhhh... soon?!?
-; Filename                   : wormy.86p (5kb)
-; 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)
+;   ����                                                        ����
+;  ����                                                         �����
+; ���                                                            ����     ����
+;���      �����          ��������       �����     ����  ����      ���     �����
+;���     �������       �����������     �������   �������������     ��    ��� ���
+;��     ���   ���     �����    ����   ����  ��� ���  ����  ���     ���  ���� ���
+;��     ��     ��     ��  �      ��� ����      ���  ������  ���    ���  ���   ��
+;��     ��     ��     �� ��      ��� ���       ��� ���� ��� ���    ��� ����   ��
+;��     ���   ���     �� ��       �� ���       �������   ��� ��     �������   ��
+;��     ���   ���    ��� ��       �� ��        �� ���    ��� ���     �����   ���
+;���     ��� ���     ��� ��       �� ���       �� ����  ���� ���             ���
+;���      �����     ���  ���     ��� ���       ��  ��������  ���            ���
+; ���      ���      ���  ���     ��� ���       ���  ������   ���            ���
+;  ����  �������  ����    ���   ���  ����      ���            �����       ����
+;   �������� ��������     ���������   ���      ���             ���������������
+;    �����     �����       �������     ��       ���              �����������
+;
+; 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 -----------
 ;-----------------------------
 
 
 ;-----------------------------
 ;----------- TO-DO -----------
 ;-----------------------------
 
-; 96% = DONE
+; 97% = DONE
 
 
-;     * complete readme
-;  1% * misc (pollish, bugs, &&&)
-;     * mem at worm #4 (still 12 bytes or so.....)
-;     * fix line proc (+large circles)
+;  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
 ;   * LINK
-;  1% * fix transmit game/level data
+;  1% * fix transmit game/level data (?)
+;     * >Somehow do a lot of testing with 2 calcs< *sigh*
 
 ;100% = bugs fixed + levels done
 
 
 ;100% = bugs fixed + levels done
 
-;>110%:        sound, startpos
+;      arrow to offscreen peas
+;      multiple peas in sp level
+;>110%:        sound, startpos (?)
 ;>120%:        coop (DON'T COUNT ON IT)
 
 ;-----------------------------
 ;>120%:        coop (DON'T COUNT ON IT)
 
 ;-----------------------------
 ;-----------------------------
 ;-----------------------------
 
 ;-----------------------------
 ;-----------------------------
 
+;NOTES:
+;* Use for LEARNING practises ONLY!
+;   Don't ever release altered code w/o permission!
+;* Code was originally by Scabby (Matthew Shepcar),
+;   a few lines by Jonah Cohen,
+;    and everything else by me - Shiar (Mischa Poslawsky).
+;* Although I've commented 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).
+;* 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
 #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 intlevels  ;internal levels
 ;#define readytext  ;displays "prepare" before level starts
@@ -97,19 +128,19 @@ worm4       = $AC5D ;-AC77 (1F)
 balls       = $AC7C ;-ACFF (3x43d)
 SinCosTable = $AD00 ;-AE00 (4*40)
 turn10      = $AE01 ;-AE01 (1) (counter)
 balls       = $AC7C ;-ACFF (3x43d)
 SinCosTable = $AD00 ;-AE00 (4*40)
 turn10      = $AE01 ;-AE01 (1) (counter)
-peaspos     = $AE02 ;-AE05 (4) (peas)
+peaspos     = $AE02 ;-AE05 (4+) (peas)
 ;free       = $AE06 ;-AFFF (1FA)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
 ;free       = $BF91 ;-BFFF (6F)
 ;free       = $AE06 ;-AFFF (1FA)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
 ;free       = $BF91 ;-BFFF (6F)
-;program    = $D748 ;-EFFF (186D+4A)
+;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?!?
 
 worm4p      = $F000 ;-F3FF (400)      %11110O00
 leveldata   = $F400 ;-FA70 (<=671)
        ;can you believe i actually left $269 bytes of memory unused?!?
 
-;MEM|8---9---A---B---C---D---E---F---|
-;   |..[------]||[]|......[-----]|[].|
-;   |   SCREEN 2* 13      PRGM   4LV |
+;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong
+;   |..[------]||[]|......[-----]|[].| ;if you still understand
+;   |   SCREEN 2* 13      PRGM   4LV | ;after looking at this
 
 ;--- temporary
 
 
 ;--- temporary
 
@@ -120,6 +151,7 @@ DispBuffer  = $BC00 ;(10x57d)    @game
 #else
 DispBuffer  = $FC70
 #endif
 #else
 DispBuffer  = $FC70
 #endif
+lefttotalb  = $AFFF
 
 ;-----------------------------
 ;------- program start -------
 
 ;-----------------------------
 ;------- program start -------
@@ -127,14 +159,12 @@ DispBuffer  = $FC70
 
  .org %1101011101001000
 
 
  .org %1101011101001000
 
-start:
-  nop
+start:         ;turn back NOW!
+  nop      ;and so it begins...
   jp  Start
   jp  Start
-  ld  bc,42
- .org $-1   ;3y3 M 1337!
-  .dw WormTxt
-  .dw WormIcon
-WormTxt:
+  ld  bc,$5242
+  rst 10h
+ .dw  WormIcon
   ld  d,a
   ld  c,a
   ld  d,d
   ld  d,a
   ld  c,a
   ld  d,d
@@ -144,21 +174,21 @@ WormTxt:
   ld  a,c
   jr  nz,$+$55
   ld  c,b
   ld  a,c
   jr  nz,$+$55
   ld  c,b
 .dw 16713
 .db %1010010
.dw  16713
.db  %1010010
   jr  nz,$+47
   dec l
   jr  nz,$+47
   dec l
 .db " 96% C21",0
.db  " 97% .13",0
 WormIcon:
 WormIcon:
 .db 8,2
 .db %00000000,%00111100
 .db %00000000,%01010010
 .db %00000000,%01100001
 .db %01100011,%10011001
 .db %10010100,%01101001
 .db %10011001,%00011001
 .db %01000010,%11000001
 .db %00111100,%00111110
.db  8,2
.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 = 95 ;wormy levels header = "95"
 
 levelhead  = 'w'
 levelhead2 = 95 ;wormy levels header = "95"
@@ -251,7 +281,7 @@ stringfound:
   inc ix
 _searchnext:
   cal _RAM_PAGE_7
   inc ix
 _searchnext:
   cal _RAM_PAGE_7
-  jr searchnext
+  jr  searchnext
 
 loadgametype:
   psh de
 
 loadgametype:
   psh de
@@ -278,7 +308,11 @@ searchcomplete:
 #else
   ld  ix,templevels-3
 #endif
 #else
   ld  ix,templevels-3
 #endif
-levelselectmenu:
+  cp  (ix+3) ;1st=255
+  jp  z,ExitNoStats ;->no lvls
+  cp  (ix+6) ;2nd=255
+  jr  z,loadlevel1 ;->1 lvl
+levelselectmenu: ;load next page
   psh ix ;offset
   ld  a,-2
   ld  (availevels),a
   psh ix ;offset
   ld  a,-2
   ld  (availevels),a
@@ -295,7 +329,9 @@ levelselectmenu:
   ld  hl,$0601 ;x=1
   ld  (_penCol),hl
 dispnextlevel:
   ld  hl,$0601 ;x=1
   ld  (_penCol),hl
 dispnextlevel:
-  ld  a,(ix+3)
+  ld  de,3
+  add ix,de
+  ld  a,(ix)
   ld  b,a
   inc a ;cp 255
   jr  z,__levselect
   ld  b,a
   inc a ;cp 255
   jr  z,__levselect
@@ -308,8 +344,6 @@ displevel:
   ld  (hl),a ;y+6
   cp  49 ;bottom of screen
   jr  nc,_levselect
   ld  (hl),a ;y+6
   cp  49 ;bottom of screen
   jr  nc,_levselect
-  ld  de,3
-  add ix,de
   ld  hl,availevels
   inc (hl)
   ld  a,b ;(ix+0)
   ld  hl,availevels
   inc (hl)
   ld  a,b ;(ix+0)
@@ -319,6 +353,12 @@ displevel:
   cal _vputs
   jr  dispnextlevel
 
   cal _vputs
   jr  dispnextlevel
 
+loadlevel1:
+  psh ix
+  pop hl
+  ld  b,-2
+  jr  loadlevel
+
 readylevelfile: ;selected level at ahl
 ; ld  hl,templevels-3/0
   ld  a,b
 readylevelfile: ;selected level at ahl
 ; ld  hl,templevels-3/0
   ld  a,b
@@ -419,12 +459,12 @@ loadlevel:
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
-  ld  d,8 ;counter
+  ld  d,9 ;counter
   ld  bc,datalevels
   cal loadgametype
   ld  (hilvlposa),a ;singleplayer levels
   ld  (hilvlposhl),hl
   ld  bc,datalevels
   cal loadgametype
   ld  (hilvlposa),a ;singleplayer levels
   ld  (hilvlposhl),hl
-  ld  d,4
+  ld  d,5
   cal loadgametype
 
   cal _SET_ABS_SRC_ADDR ;levelsstart
   cal loadgametype
 
   cal _SET_ABS_SRC_ADDR ;levelsstart
@@ -463,11 +503,11 @@ setdeflevels:
 ;----- build trig tables -----
 ;-----------------------------
 
 ;----- build trig tables -----
 ;-----------------------------
 
-  ld  hl,TrigPrecalc
-  ld  de,SinCosTable
-  psh de
-  ld  bc,65
-  ldir
+  ld  hl,TrigPrecalc ;I believe this
+  ld  de,SinCosTable  ;is one of the few
+  psh de              ;pieces of original
+  ld  bc,65            ;Peaworm code still
+  ldir                  ;left intact..
   dec hl
   ld  b,63
 MirrorSineWave:
   dec hl
   ld  b,63
 MirrorSineWave:
@@ -504,11 +544,9 @@ DisplayMenu: ;---draw menu---
   ld  hl,$FC00+$3E0 ;(*,62)
   cal hr
 dispmainmenu:
   ld  hl,$FC00+$3E0 ;(*,62)
   cal hr
 dispmainmenu:
-  ld  hl,Gametype
-  ld  a,(hl)
+  ld  a,(Gametype)
   dec a ;will be inced @changegame
   dec a ;will be inced @changegame
-  and 7
-  ld  (hl),a
+  cal changedgame
   ld  hl,changegame ;dispmenusets ;mainMenu
   psh hl ;jump here after ret
   ld  hl,txtMenu
   ld  hl,changegame ;dispmenusets ;mainMenu
   psh hl ;jump here after ret
   ld  hl,txtMenu
@@ -784,6 +822,17 @@ select:   ;2nd/enter
   dec a ;6th: controls
   jp  z,changekeys
   jp  LetsGetThisPartyOn ;otherwise
   dec a ;6th: controls
   jp  z,changekeys
   jp  LetsGetThisPartyOn ;otherwise
+
+changenrworms:
+  cal change4spOnly
+  ld  a,(hl) ;hl=nrworms
+  inc a
+  cp  5
+  jr  nc,mainMenu ;may not be >4
+changednrworms:
+  ld  (hl),a
+  jr  _dispmenusets ;mainMenu
+
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
@@ -839,15 +888,6 @@ bchangecurworm:
   jr  nz,changedcurworm ;save >0
   jr  mainMenu
 
   jr  nz,changedcurworm ;save >0
   jr  mainMenu
 
-changenrworms:
-  cal change4spOnly
-  ld  a,(hl) ;hl=nrworms
-  inc a
-  cp  5
-  jr  nc,mainMenu ;may not be >4
-changednrworms:
-  ld  (hl),a
-  jr  _dispmenusets ;mainMenu
 changenrwormsInit:
   ld  a,(Gametype)
   cp  3
 changenrwormsInit:
   ld  a,(Gametype)
   cp  3
@@ -887,7 +927,12 @@ changegame:
   jr  z,changegame
   jr  dispmenusets ;mainMenu
 changedgame:
   jr  z,changegame
   jr  dispmenusets ;mainMenu
 changedgame:
-  and 7 ;mod 8
+  cp  9
+  jr  c,changedgameok
+  sub 255-8 ;-1 -> 8
+  jr  nc,changedgameok
+  xor a ;9 -> 0
+changedgameok:
   ld  (Gametype),a
   cal getnrlevels
   xor a
   ld  (Gametype),a
   cal getnrlevels
   xor a
@@ -1207,7 +1252,7 @@ hlatlevel: ;d must be 0
   add a,a ;nc
   add a,e
   add a,a ;8->2bytes
   add a,a ;nc
   add a,e
   add a,a ;8->2bytes
-  add a,24+1 ;go to datalevels
+  add a,28+1 ;go to datalevels
   ld  e,a ;=de
   sbc hl,de ;datalevels
   cal _ldHLind ;ld hl,(hl)
   ld  e,a ;=de
   sbc hl,de ;datalevels
   cal _ldHLind ;ld hl,(hl)
@@ -1350,7 +1395,7 @@ OhMyGodItsALabel: ;pj34r my coding skillz
   ld  a,0
 gameCar =$-1
   rra ;and _datalink
   ld  a,0
 gameCar =$-1
   rra ;and _datalink
-  jp  nc,StartLevel ;&&&jr
+  jr  nc,_StartLevel
 
 ;--------- link ------------
 
 
 ;--------- link ------------
 
@@ -1415,6 +1460,7 @@ setclient:
   ex  de,hl
   ld  b,168
   cal sendstuff
   ex  de,hl
   ld  b,168
   cal sendstuff
+_StartLevel:
   jr  StartLevel
 sendstuff:
   psh de
   jr  StartLevel
 sendstuff:
   psh de
@@ -1497,6 +1543,14 @@ StartLevel:
   inc hl
   ld  l,(hl)
   ld  h,0
   inc hl
   ld  l,(hl)
   ld  h,0
+  ld  a,(gameCar)
+  rla
+  ld  a,0 ;(Left)=256
+  jr  nc,setscorelimit
+  ld  a,l
+  ld  l,h
+setscorelimit:
+  ld  (customleft),a
   cal _HLTIMES10 ;hl=10*(hl)
   ld  (scorelimit),hl
 
   cal _HLTIMES10 ;hl=10*(hl)
   ld  (scorelimit),hl
 
@@ -1522,8 +1576,25 @@ donextlevel:
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
-  ld  de,Left
-  ldi
+  ld  a,(hl)
+  and 127
+  jr  nz,setleft
+customleft =$+1
+  ld  a,0
+setleft:
+  ld  (Left),a
+  inc a
+  ld  (lefttotal),a
+  dec a
+  xor (hl) ;bit (hl),7
+  ld  bc,gameCar
+  ld  a,(bc)
+  jr  z,leftloaded
+  or  128+32
+leftloaded:
+  ld  (bc),a
+  inc de
+  inc hl
   ld  de,Speed
   ld  a,0
 customspeed =$-1
   ld  de,Speed
   ld  a,0
 customspeed =$-1
@@ -1753,11 +1824,14 @@ maskline:
 #endif
 
   ld  a,(gameCar)
 #endif
 
   ld  a,(gameCar)
-  and _datafood
-  jr  z,nofood
-  ld  ix,worm1
+  bit _bitfood,a
+  jr  nz,nofood
+;  ld  ix,worm1
   cal NewPea
   cal NewPea
+  xor a
 nofood:
 nofood:
+  rla ;bit _bitmultpeas,a
+  cal c,multnewpea
   ld  bc,(worm1+pos)
   cal DisplayField
 
   ld  bc,(worm1+pos)
   cal DisplayField
 
@@ -2481,22 +2555,28 @@ Hitworm:
   ld  a,(gameCar)
   ld  h,a
 #ifdef optdie
   ld  a,(gameCar)
   ld  h,a
 #ifdef optdie
-  and _datadie
-  cal z,checkhitotherworm
+; if race - originally
+  cal checkhitotherworm
   ld  a,h
 #endif
   ld  a,h
 #endif
-  and _datamultpeas ;&&bit
+  and _datactfpeas ;&&bit
   jr  nz,chkctfpeas
   ld  a,h
   jr  nz,chkctfpeas
   ld  a,h
+  and _datamultpeas ;&&bit
+  jp  nz,chkmultpeas
+  ld  a,h
   and _datafood
   and _datafood
-  jp  z,WormDead ;no food
+  jp  nz,WormDead ;no food
 
   ld  hl,0
 PeaY =$-2
 PeaX =$-1
   cal chkpeahit
   jp  nc,WormDead
 
   ld  hl,0
 PeaY =$-2
 PeaX =$-1
   cal chkpeahit
   jp  nc,WormDead
+pickpea:
   cal DrawPea ;remove pea
   cal DrawPea ;remove pea
+  cal NewPea
+pickpea_:
   ld  a,(ix+grow)
   add a,15
 peagrowth =$-1
   ld  a,(ix+grow)
   add a,15
 peagrowth =$-1
@@ -2504,17 +2584,16 @@ peagrowth =$-1
   jr  nc,wormset2grow
   inc (ix+grow+1)
 wormset2grow:
   jr  nc,wormset2grow
   inc (ix+grow+1)
 wormset2grow:
-  cal NewPea
   ld  hl,Left
   ld  hl,Left
-  dec (hl)
+  dec (hl) ;dec left before display
   psh af
   ld  e,10
   cal IncScore
   pop af
   jp  nz,Drawworm ;continue
   psh af
   ld  e,10
   cal IncScore
   pop af
   jp  nz,Drawworm ;continue
-  ld  a,(gameCar)
-  and _datafoodl
-  jp  z,Drawworm
+; ld  a,(gameCar) ;(Left)>256
+; and _datafoodl
+; jp  z,Drawworm
   ld  a,(Gametype)
   or  a
   jp  nz,Exit ;stack restored
   ld  a,(Gametype)
   or  a
   jp  nz,Exit ;stack restored
@@ -2597,6 +2676,34 @@ hitflag: ;correct pea hit
   ld  (drawctfpea2),a ;..both flags
   jr  Drawworm
 
   ld  (drawctfpea2),a ;..both flags
   jr  Drawworm
 
+chkmultpeas:
+  ld  de,peaspos-1
+  ld  hl,lefttotalb
+lefttotal =$+1
+  ld  (hl),0
+chkmultpealoop:
+  ex  de,hl
+  inc hl
+  ld  e,(hl)
+  inc hl
+  ld  d,(hl)
+  ex  de,hl
+  psh de
+  cal chkpeahit
+  pop de
+  jr  c,pickmultpea
+  ld  hl,lefttotalb
+  dec (hl)
+  jr  nz,chkmultpealoop
+  jp  WormDead
+pickmultpea:
+  ld  a,247
+  ld  (de),a
+  dec de
+  ld  (de),a
+  cal DrawPea
+  jp  pickpea_
+
 ;-----------------------------
 
 nextotherwormbit:
 ;-----------------------------
 
 nextotherwormbit:
@@ -2967,6 +3074,22 @@ tryDrawPea: ;hl=peapos;bc=dopea
   jr  z,DrawPea
   ret
 
   jr  z,DrawPea
   ret
 
+multnewpea:
+  ld  de,peaspos
+  ld  a,(Left)
+  ld  b,a
+multpealoop:
+  psh bc
+  psh de
+  cal NewPea
+  pop de
+  ld  hl,PeaY
+  ldi
+  ldi
+  pop bc
+  dnz multpealoop
+  ret
+
 NewPea:
   ld  a,(FieldWidth)
   add a,127-4
 NewPea:
   ld  a,(FieldWidth)
   add a,127-4
@@ -3280,9 +3403,9 @@ savestr:
 
 ;-----------------------------
 
 
 ;-----------------------------
 
-DisplayField:
-  ld  a,c
-  sub 29
+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.
+  sub 29       ;if something doesn't work, I probably _did_ alter it ;)
   jr  nc,NotMinYScroll
   xor a
 NotMinYScroll:
   jr  nc,NotMinYScroll
   xor a
 NotMinYScroll:
@@ -3551,7 +3674,7 @@ FindPixel: ;(b,c) to hl:a
 FP_Bit =$+1
   set 0,a
 
 FP_Bit =$+1
   set 0,a
 
-  psh de ;&&&
+  psh de ;&&& C`MON! THIS IS UGLY! *hit myself*
   ld  de,ScrBuffer
   add hl,de
   pop de
   ld  de,ScrBuffer
   add hl,de
   pop de
@@ -3589,6 +3712,12 @@ drawsmtn:
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
+;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.
+;Nice comments, also. So here we go: Shiar's Circle Routine:
+;(using the Bresenham method)
+
 drawcircle: ;(d,e),h   ;de=x,y; h=z
   ld  c,h              ;c=yy=z
   ld  a,h
 drawcircle: ;(d,e),h   ;de=x,y; h=z
   ld  c,h              ;c=yy=z
   ld  a,h
@@ -3652,7 +3781,7 @@ circledraw:               ;destr:de
   ld  b,c
   ld  c,a              ;ex b,c
   pop hl
   ld  b,c
   ld  c,a              ;ex b,c
   pop hl
-  ret
+  ret                  ;thats it
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
@@ -3676,8 +3805,10 @@ drawfatline:
   dec h
 ; jp  drawline
 
   dec h
 ; jp  drawline
 
-;LINE (d,e)-(h,l)
-;destroyes a
+;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
+;large lines (>128 pixels in length or something) won't be flawless.
 
 drawline: ;(d,e)-(h,l)
   psh bc  ;destr: a
 
 drawline: ;(d,e)-(h,l)
   psh bc  ;destr: a
@@ -3918,13 +4049,13 @@ LevelDef:
 
 LevelDefM:
   .db "Empty Arena",0
 
 LevelDefM:
   .db "Empty Arena",0
-  .db 8,4,15,15,0,0
+  .db 5,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 $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 8+128,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 %1110000,%10001000,%10001000,%10001000,%1110000,0
   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
   .db 128,57
@@ -4025,9 +4156,10 @@ txtGame1: .db "Peaworm",0
 txtGame2: .db "Tron",0
 txtGame3: .db "Deathmatch",0
 txtGame4: .db "Foodmatch",0
 txtGame2: .db "Tron",0
 txtGame3: .db "Deathmatch",0
 txtGame4: .db "Foodmatch",0
-txtGame5: .db "Timematch",0
-txtGame6: .db "Race",0
-txtGame7: .db "CTF" ;,0
+txtGame5: .db "Multifoodmatch",0
+txtGame6: .db "Timematch",0
+txtGame7: .db "Race",0
+txtGame8: .db "CTF" ;,0
 
 posGame:  .db 0
          .db txtGame1-txtGame
 
 posGame:  .db 0
          .db txtGame1-txtGame
@@ -4037,6 +4169,7 @@ posGame:  .db 0
          .db txtGame5-txtGame
          .db txtGame6-txtGame
          .db txtGame7-txtGame
          .db txtGame5-txtGame
          .db txtGame6-txtGame
          .db txtGame7-txtGame
+         .db txtGame8-txtGame
 
 txtNone:   .db "None",0
 txtDef:    .db "Default",0
 
 txtNone:   .db "None",0
 txtDef:    .db "Default",0
@@ -4079,47 +4212,51 @@ txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #ifdef intlevels
 datalevels: .dw LevelDef, LevelDefM
             .dw LevelDefT,LevelDefM
 #ifdef intlevels
 datalevels: .dw LevelDef, LevelDefM
             .dw LevelDefT,LevelDefM
-            .dw LevelDefM,LevelDefM
+            .dw LevelDefM,LevelDefM,LevelDefM
             .dw LevelDefR,LevelDefC
             .dw LevelDefR,LevelDefC
-nrlevels:   .db 0,3,1,3,3,3,3,1     ;=defaults
+nrlevels:   .db 2,3,1,3,3,3,3,3,1,0     ;=defaults
 #else
 #else
-datalevels: .dw 0,0,0,0,0,0,0,0
-nrlevels:   .dw 0,0,0,0
+datalevels: .dw 0,0,0,0,0,0,0,0,0
+nrlevels:   .dw 0,0,0,0,0
 #endif
 
 #endif
 
-_datalink      = %0000001 ;linkplay
-_datafoodl     = %0000010 ;left=0 limit
-_datasingl     = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
-_datamultpeas  = %0001000 ;multiple peas=1
-_datatime      = %0010000 ;time incs score (timematch)
-_datafood      = %0100000 ;food present
-_datadie       = %1000000 ;worm dies on impact
-;reserved       %10000000 ;for future use
-
-savestart:        ;     �game info (see above)
-                  ;     | �lives (0=unlimited)
-                  ;     | | �nrworms (can be altered by user)
-                  ;     | | | �level (reset to 1 at startup)
-                  ;     | | | |  �speed/delay (-1=def)
-                  ;     | | | |  |  �grow speed (-1=none; 0=continuous)
-                  ;     | | | |  |  |  �turn speed (8=def)
-                  ;     | | | |  |  |  |  �score limit (0=none)
-gamesingle   =  0 ;used | | | |  |  |  |  |
-datasingle: .db  %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+_datalink      = %00000001 ;linkplay
+_datafoodl     = %00000010 ;left=0 limit
+_datasingl     = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
+_datactfpeas   = %00001000 ;ctf peas=1
+_datatime      = %00010000 ;time incs score (timematch)
+_datafood      = %00100000 ;food present=0
+_bitfood       = 5
+_datamultpeas  = %10000000 ;multiple peas=1 (no _datafood)
+_bitmultpeas   = 7
+;reserved        %01000000 ;for future use
+
+savestart:        ;      �game info (see above)
+                  ;      | �lives (0=unlimited)
+                  ;      | | �nrworms (can be altered by user)
+                  ;      | | | �level (reset to 1 at startup)
+                  ;      | | | |  �speed/delay (-1=def)
+                  ;      | | | |  |  �grow speed (-1=none; 0=continuous)
+                  ;      | | | |  |  |  �turn speed (8=def)
+                  ;      | | | |  |  |  |  �score limit (0=none)
+gamesingle   =  0 ;      | | | |  |  |  |  |
+datasingle: .db  %01000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
 gamepeas     =  1
 gamepeas     =  1
-datapeas:   .db  %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
+datapeas:   .db  %01000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
 gametron     =  2
 gametron     =  2
-datatron:   .db  %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
-gamedeathm   =  3 ;used
-datadeathm: .db  %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
+datatron:   .db  %01110100,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)
 gamefoodm    =  4
 gamefoodm    =  4
-datafoodm:  .db  %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
-gametimem    =  5
-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,10 ;CTF (100 score)
+datafoodm:  .db  %01000000,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))
+gametimem    =  6
+datatimem:  .db  %01110000,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)
+gamectf      =  8
+datactf:    .db  %01001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
 
 worm1set:  .dw worm1p,worm1p
            .db %11110111,1,-01,K_RIGHT,K_LEFT
 
 worm1set:  .dw worm1p,worm1p
            .db %11110111,1,-01,K_RIGHT,K_LEFT