worm 0.89.0423
authorMischa Poslawsky <wormy@shiar.org>
Sun, 23 Apr 2000 17:07:42 +0000 (19:07 +0200)
committerMischa Poslawsky <wormy@shiar.org>
Sun, 22 Feb 2009 15:13:37 +0000 (16:13 +0100)
- bonus score for completing a level, extra live for each 1000 points

worm.z80
wormlvl.z80

index fef817cf862683c1aec9e50ec7255980f35cd99e..d5b88d118fd333243bd3847e680083471f60ded9 100644 (file)
--- a/worm.z80
+++ b/worm.z80
@@ -1,5 +1,5 @@
 ; Title                      : Worm
 ; Title                      : Worm
-; Version                    : 0.986
+; Version                    : 89%
 ; Release Date               : april 2000???
 ; Filename                   : worm.86p (4kb)
 ; Author(s)                  : Shiar
 ; Release Date               : april 2000???
 ; Filename                   : worm.86p (4kb)
 ; Author(s)                  : Shiar
 ;----------- TO-DO -----------
 ;-----------------------------
 
 ;----------- TO-DO -----------
 ;-----------------------------
 
-; 86% = DONE
+; 89% = DONE
 
 
-;  1% * levelfile select
 ;  3% * linkplay
 ;  1% * titlescreen
 ;  2% * make linkplay available for all gametypes (not just deathmatch)
 ;  3% * linkplay
 ;  1% * titlescreen
 ;  2% * make linkplay available for all gametypes (not just deathmatch)
-;  1% * two worms collide with heads -> both should die
 ;     * game types:
 ;  1%   * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
 ;  1%   * domination?: take control points by running over them and hold them
 ;     * game types:
 ;  1%   * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
 ;  1%   * domination?: take control points by running over them and hold them
-;  1% * name change + other options
 ;     * complete readme (+custom level info)
 ;  2% * ... (pollish, &&&)
 
 ;     * complete readme (+custom level info)
 ;  2% * ... (pollish, &&&)
 
@@ -49,8 +46,9 @@
 
 _SHRACC            = $4383
 _SHLACC            = $438B
 
 _SHRACC            = $4383
 _SHLACC            = $438B
-_divHLby10         = $4044
-_divAby10          = $4DAF
+_divHLby10         = $4044 ;hl=hl/10
+_divAby10          = $4DAF ;a=a/10
+_HLTIMES10         = $41BF ;hl=hl*10
 _cphlde            = $403C
 _clrWindow         = $4A86 ;clear screen
 _asapvar           = $D6FC ;own name (worm)
 _cphlde            = $403C
 _clrWindow         = $4A86 ;clear screen
 _asapvar           = $D6FC ;own name (worm)
@@ -61,6 +59,7 @@ _ldHLind           = $4010 ;ld hl,(hl)
 _swapt_            = $45F3 ;ex_ahl_bde
 _Get_Word_ahl      = $521D ;ld de,(ahl)
 _Set_Word_ahl      = $5221 ;ld (ahl),de
 _swapt_            = $45F3 ;ex_ahl_bde
 _Get_Word_ahl      = $521D ;ld de,(ahl)
 _Set_Word_ahl      = $5221 ;ld (ahl),de
+_INC_PTR_AHL       = $4637 ;ahl=ahl+1
 _AHL_PLUS_2_PG3    = $4C3F ;ahl=ahl+2
 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
 _AHL_PLUS_2_PG3    = $4C3F ;ahl=ahl+2
 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
@@ -68,6 +67,10 @@ _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
 _SET_MM_NUM_BYTES  = $464F ;number of bytes for mm.ldir = ahl
 _mm_ldir           = $52ED ;24bit ldir
 _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
 _SET_MM_NUM_BYTES  = $464F ;number of bytes for mm.ldir = ahl
 _mm_ldir           = $52ED ;24bit ldir
 _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
+_RAM_PAGE_7        = $47F3
+_PTEMP_END         = $D29A
+_load_ram_ahl      = $462F ;ahl->page+hl
+_writeb_inc_ahl    = $5567 ;ld (ahl),c
 
 ;-----------------------------
 ;------- data  storage -------
 
 ;-----------------------------
 ;------- data  storage -------
@@ -76,13 +79,15 @@ _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
 leveldata   = $EA00 ;size< $400
 ScrBuffer   = $8100 ;size=$2000 (32x256)
          ;->mod$800
 leveldata   = $EA00 ;size< $400
 ScrBuffer   = $8100 ;size=$2000 (32x256)
          ;->mod$800
+templevels  = $BC00 ;size= 3*$10
 DispBuffer  = $BC00 ;size= $390 (16x57)
 SinCosTable = $B500 ;size= $100  (4x64)
 
 worm1 = $B400
 DispBuffer  = $BC00 ;size= $390 (16x57)
 SinCosTable = $B500 ;size= $100  (4x64)
 
 worm1 = $B400
-worm2 = $B42A
-worm3 = $B454
-worm4 = $B47E ;-B4A8
+worm2 = $B41E
+worm3 = $B43C
+worm4 = $B45A
+ball1 = $B478
 
 resbit  = 2   ;and%11111011
 worm1p = $B000   ;%10110000 -$B3FF
 
 resbit  = 2   ;and%11111011
 worm1p = $B000   ;%10110000 -$B3FF
@@ -90,7 +95,7 @@ worm2p = $B800   ;%10111000 -$BBFF
 worm3p = $F000   ;%11110000 -$F3FF
 worm4p = $A800   ;$E800=%11101000 ;$D748+$1000+
 
 worm3p = $F000   ;%11110000 -$F3FF
 worm4p = $A800   ;$E800=%11101000 ;$D748+$1000+
 
-WormVersion = 086
+WormVersion = 088
 
 ;-----------------------------
 ;------- program start -------
 
 ;-----------------------------
 ;------- program start -------
@@ -106,7 +111,7 @@ start:
   .dw WormIcon
 
 WormMsg:
   .dw WormIcon
 
 WormMsg:
-  .db "WORM by SHIAR -- pre-beta 86%",0
+  .db "WORM by SHIAR -- pre-beta 89%",0
 WormIcon:
   .db 9,2
   .db %10010110,%01101111
 WormIcon:
   .db 9,2
   .db %10010110,%01101111
@@ -119,9 +124,8 @@ WormIcon:
   .db %11101111,%00001111
   .db %11000011,%10000000
 
   .db %11101111,%00001111
   .db %11000011,%10000000
 
-levelfile:
-  .db 7,"wormlvl"
-levelhead = 'T'
+levelhead  = '8'
+levelhead2 = '9' ;worm levels header = "89"
 
 Start:
   ld  (SpSave),sp
 
 Start:
   ld  (SpSave),sp
@@ -129,25 +133,64 @@ Start:
   cal _flushallmenus
   cal _clrLCD
 
   cal _flushallmenus
   cal _clrLCD
 
-  ld  hl,levelfile-1
-  rst 20h ;_ABS_MOV10TOOP1
-  rst 10h ;_FINDSYM
-  ret c ;not found
-  ex  de,hl
-  ld  a,b ;cal _ex_ahl_bde
-  cal _AHL_PLUS_2_PG3
+  cal _RAM_PAGE_7
+  ld  hl,$BFFF ;VAT start
+  ld  bc,templevels
+searchloop:
+  ld  de,(_PTEMP_END+1)
+  or  a ;nc
+  sbc hl,de ;hl<de?
+  jr  c,searchcomplete
+  add hl,de
+  psh hl
+  ld  a,(hl)
+  cp  $0C ;string
+  jr  z,stringfound
+searchnext:
+  pop hl
+  dec hl ;5x
+  dec hl
+  dec hl
+  dec hl
+  dec hl
+ psh bc
+  ld  b,(hl) ;name size
+  inc b
+skipname:
+  dec hl
+  dnz skipname
+ pop bc
+  jr  searchloop
 
 
-  cal _Get_Word_ahl
-  ld  b,a ;psh af
+stringfound:
+  dec hl
+  ld  e,(hl)
+  dec hl
+  ld  d,(hl)
+  dec hl
+  ld  a,(hl)
+  ex  de,hl ;ld ahl,(hl)
+  cal _AHL_PLUS_2_PG3 ;string id
+  cal _Get_Word_ahl ;ld de,(ahl)
+ cal _RAM_PAGE_1
+ ld (bc),a
   ld  a,levelhead
   ld  a,levelhead
-  cp  e ;1st byte = w?
-  ret nz ;not worm level
-  ld  a,b ;pop af
-  cal _Get_Word_ahl
-  ld  (leveldataSize),de
+  cp  e
+  jr  nz,searchnext ;not worm
+  ld  a,levelhead2
+  cp  d
+  jr  nz,searchnext
+
+ inc bc
+ ld a,h
+ ld (bc),a
+ inc bc
+ ld a,l
+ ld (bc),a
+ inc bc
+ cal _RAM_PAGE_7
+ jr searchnext
 
 
-  ld  d,8 ;counter
-  ld  bc,datalevels-2
 loadgametype:
   psh de
   inc bc
 loadgametype:
   psh de
   inc bc
@@ -168,6 +211,81 @@ defaultlevels:
   pop de ;counter
   dec d ;8x
   jr  nz,loadgametype
   pop de ;counter
   dec d ;8x
   jr  nz,loadgametype
+  ret
+
+searchcomplete:
+  cal _RAM_PAGE_1
+  ld  a,255
+  ld  (bc),a ;end mark
+  ld  hl,templevels
+  psh hl
+  or  a
+  sbc hl,bc
+  pop hl
+  jp  z,levelloaded ;no ext files
+dispnextlevel:
+  cal _RAM_PAGE_1
+  psh hl
+  cal _clrWindow
+  ld  a,4
+  ld  (_curRow),a
+  pop hl
+  ld  a,(hl)
+  cp  255
+  jr  nz,displevel
+  ld  hl,templevels
+  ld  a,(hl)
+displevel:
+  inc hl
+  ld  d,(hl)
+  inc hl
+  ld  e,(hl)
+  inc hl  ;ade=(hl)
+  psh hl  ;HL
+  ld  c,a
+  ld  h,d
+  ld  l,e ;cde=ahl=(hl)
+  cal _load_ram_ahl ;hl=ahl
+  ld  b,(hl) ;b=title size
+  psh bc
+  cal _putps ;destr=abchl
+  pop bc  ;cde=hl
+  pop hl  ;HL
+levselect:
+  halt
+  psh hl
+  psh de
+  psh bc
+  cal GET_KEY
+  pop bc
+  pop de
+  pop hl
+  cp  K_RIGHT
+  jr  z,dispnextlevel
+  sub K_SECOND
+  jr  z,loadlevel
+  dec a ;K_EXIT
+  ret z
+  cp  K_ENTER-K_EXIT+256
+  jr  nz,levselect
+
+loadlevel:
+  ld  a,c
+  ex  de,hl ;ahl=cde
+  inc b ;b=titlesize+1
+skiptitle:
+  cal _INC_PTR_AHL
+  dnz skiptitle
+
+  cal _Get_Word_ahl
+  ld  (leveldataSize),de
+  ld  d,8 ;counter
+  ld  bc,datalevels-2
+  cal loadgametype
+  ld  (hilvlposa),a
+  ld  (hilvlposhl),hl
+  ld  d,4
+  cal loadgametype
 
   cal _SET_ABS_SRC_ADDR
   xor a
 
   cal _SET_ABS_SRC_ADDR
   xor a
@@ -180,8 +298,9 @@ leveldataSize =$-2
   cal _mm_ldir
 
   cal _LOAD_ABS_SRC_ADDR ;->ahl
   cal _mm_ldir
 
   cal _LOAD_ABS_SRC_ADDR ;->ahl
-  ld  (hisaveposa),a
-  ld  (hisaveposhl),hl
+levelloaded:
+  ld  (hiscrposa),a
+  ld  (hiscrposhl),hl
  cal _RAM_PAGE_1 ;&&&
 
   res 2,(iy+13) ;appAutoScroll
  cal _RAM_PAGE_1 ;&&&
 
   res 2,(iy+13) ;appAutoScroll
@@ -219,30 +338,37 @@ NegativeSineWave:
 ;---------- menu -------------
 ;-----------------------------
 
 ;---------- menu -------------
 ;-----------------------------
 
+  ld  a,1
+  ld  (curlevel),a
 DisplayMenu:
 DisplayMenu:
-  ld  a,2
-  ld  (nrworms),a
-gomainMenu:
   cal _clrWindow
   ld  hl,txtWelcome
   cal _puts
   cal _clrWindow
   ld  hl,txtWelcome
   cal _puts
-  ld  de,$0205
+  ld  de,$0207
+  ld  (_curRow),de
+  cal _puts ;---
+  dec e ;$0206
+  ld  (_curRow),de
+  cal _puts ;Level
+  dec e ;$0205
   ld  (_curRow),de
   ld  (_curRow),de
-  cal _puts ;txtOptions
+  cal _puts ;Worms: 2
   dec e ;$0204
   ld  (_curRow),de
   ld  hl,(CURtxtGame)
   dec e ;$0204
   ld  (_curRow),de
   ld  hl,(CURtxtGame)
-  cal _puts
+  cal _puts ;Singleplayer
 
   xor a
 
   xor a
+  cal menudraw
+  jr  howmanyworms
 mainMenu:
   cal menucall
   jr  nz,notselect
 select:
   ld  a,b
 mainMenu:
   cal menucall
   jr  nz,notselect
 select:
   ld  a,b
-  or  a
-  jr  nz,gooptionsMenu
-  jp  LetsGetThisPartyOn
+  dec a ;2nd item
+  jp  z,changeworms
+  jp  LetsGetThisPartyOn ;1/3/4
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
@@ -250,47 +376,36 @@ notselect
   ld  a,b
   jr  nz,mainMenu
   or  a
   ld  a,b
   jr  nz,mainMenu
   or  a
-  jr  z,Variation
+  jr  z,changegame
+  dec a
+  jr  z,changenrworms
+  dec a
+  jp  nz,LetsGetThisPartyOn
 
 
-gooptionsMenu:
-  cal _clrWindow
-  ld  hl,txtWelcome
-  cal _puts
-  ld  hl,txtLevel
-  ld  de,$0205
-  ld  (_curRow),de
-  cal _puts ;txtLevel
-  dec e ;$0204
-  ld  (_curRow),de
-  cal _puts ;txtWorms
-  ld  a,(nrworms)
-  add a,'0'
-  cal _putc
-  xor a
-optionsMenu:
-  cal menucall
-  jr  nz,notopselect
-opselect:
-  ld  a,b
-  or  a
-  jr  nz,changelevel
-changeworms:
-  ld  hl,nrworms
-  inc (hl)
-  ld  a,4
-  cp  (hl)
-  jr  nc,gooptionsMenu
-  ld  (hl),2
-  jr  gooptionsMenu
 changelevel:
 changelevel:
-  jr  optionsMenu
-notopselect:
-  cp  K_EXIT
-  jr  z,gomainMenu
-  ld  a,b
-  jr  optionsMenu
+  ld  hl,Gametype
+  ld  d,0
+  ld  e,(hl)
+  ld  hl,nrlevels
+  add hl,de
+  ld  d,(hl) ;max level for sel.game
+  ld  a,1
+curlevel =$-1
+  inc a
+  cp  d
+  jr  c,changedlevel
+  ld  a,1
+changedlevel:
+  ld  (curlevel),a
+dispcurlevel:
+  ld  hl,$0806
+  ld  (_curRow),hl
+  cal showA
+  jr  mainMenu
 
 
-Variation:
+changegame:
+  ld  a,1
+  ld  (curlevel),a
   ld  a,0
 Gametype =$-1
   ld  hl,txtGame2
   ld  a,0
 Gametype =$-1
   ld  hl,txtGame2
@@ -306,53 +421,223 @@ okilydokily:
   ld  (CURtxtGame),hl
   cal _puts
   ld  (NEXTtxtGame),hl
   ld  (CURtxtGame),hl
   cal _puts
   ld  (NEXTtxtGame),hl
-  ld  a,b
-  jp  mainMenu
+howmanyworms:
+  ld  a,(Gametype)
+  cp  2
+  ld  a,1
+  jr  c,oneworm
+nrworms =$+1
+  ld  a,2
+oneworm:
+  jr  dispnrworms ;jr mainMenu
 
 
-menucall:
-  psh af
-  ld  hl,$0004
-  ld  (_curRow),hl
-  ld  a,' '
-  cal _putc
-  ld  hl,$0005
-  ld  (_curRow),hl
-  cal _putc
-  pop af
-  psh af
-  ld  h,0
-  add a,4
-  ld  l,a
+changenrworms:
+  ld  a,(Gametype)
+  cp  2
+  jr  c,mainMenu ;type 0/1
+  ld  hl,nrworms
+  ld  a,(hl)
+  inc a
+  cp  5
+  jr  c,changednrworms
+  ld  a,1
+changednrworms:
+  ld  (hl),a
+dispnrworms:
+  ld  hl,$0905
   ld  (_curRow),hl
   ld  (_curRow),hl
-  ld  a,'*'
-  cal _putc
-menukeys:
+  cal showA
+  ld  a,(curlevel)
+  jr  dispcurlevel ;mainMenu
+
+menucall:
+  psh bc
+menuwaitkey:
   halt \ halt
   cal GET_KEY
   or  a
   halt \ halt
   cal GET_KEY
   or  a
-  jr  z,menukeys
+  jr  z,menuwaitkey
   pop bc ;pop a as b
   cp  K_UP
   pop bc ;pop a as b
   cp  K_UP
-  jr  nz,notup
-updown:
-  ld  a,b
-  xor 1
-  ld  b,a
-  inc a ;nz
-  ret
-notup:
+  cal z,menuup
   cp  K_DOWN
   cp  K_DOWN
-  jr  z,updown
+  cal z,menudown
   cp  K_ENTER
   ret z
   cp  K_SECOND
   ret ;z=select
 
   cp  K_ENTER
   ret z
   cp  K_SECOND
   ret ;z=select
 
+menupos:
+  ld  a,b
+  add a,4
+  ld  h,0
+  ld  l,a
+  ld  (_curRow),hl
+  ret
+menuclr:
+  cal menupos
+  ld  a,' '
+  jp  _putc
+menudown:
+  cal menuclr
+  inc b
+  jr  menuupdown
+menuup:
+  cal menuclr
+  dec b
+menuupdown:
+  ld  a,b
+  and %11 ;4=0;-1=3
+menudraw:
+  ld  b,a
+  cal menupos
+  ld  a,'*'
+  jp  _putc ;a=K_STO
+
+changeworms:
+  cal _clrWindow
+  ld  a,(Gametype)
+  cp  2
+  ld  a,1
+  jr  c,wormnrname
+  ld  a,(nrworms)
+wormnrname:
+  add a,a  ;2x
+  ld  e,a
+  add a,a  ;4x
+  add a,a  ;8x
+  add a,a ;16x
+  add a,e ;18x
+  ld  e,a
+  ld  d,0
+  ld  ix,worm1name-18
+  add ix,de
+  ld  a,maxnamelength
+  cal entername
+  ld  (ix),0
+  jp  DisplayMenu
+
+entername:
+  ld  (namelength),a
+enternameloop:
+  ld  a,'_'
+  cal _putc
+  ld  hl,_curCol
+  dec (hl)
+nokeypressed:
+  halt
+  cal GET_KEY
+  or  a
+  jr  z,nokeypressed
+
+  cp  K_DEL
+  jr  nz,continue
+backspace:
+  ld  hl,namelength
+  ld  a,(hl)
+  cp  maxnamelength
+  jr  nc,nokeypressed
+  inc (hl)
+
+  dec ix
+  ld  a,' '
+  ld  (ix),a
+  cal _putc
+  ld  hl,_curCol
+  dec (hl)
+  dec (hl)
+  jr  enternameloop
+continue:
+  cp  K_ENTER
+  ret z
+  cp  K_EXIT
+  ret z
+
+  ld  hl,namelength
+  dec (hl)
+  ret z
+
+  ld  hl,chartable
+  ld  e,a
+  ld  d,0
+  add hl,de
+  ld  a,(hl)
+  or  a
+  jr  z,nokeypressed
+
+  ld  (ix),a
+  cal _putc
+  inc ix
+  cal waitnokeypressed
+  jr  enternameloop
+
+waitnokeypressed:
+  halt
+  cal GET_KEY
+  or  a
+  jr  nz,waitnokeypressed
+  ret
+
+namelength:
+  .db 0
+chartable:
+  .db 0,"!<>^",0,0,0,0
+  .db 0,"xtoje0",0      ;enter..clear
+  .db " wsnid9",0       ;(-)..custom
+  .db "zvrmhc8",0       ;dot..del
+  .db "yuqlgb7*"        ;0..xvar
+  .db 0,"-pkfa6'"       ;on..alpha
+  .db "54321.",0,0      ;F5..more
+
+;--proc
+
+skiplevel: ;@hl - destr:ab - alter:hl
+  inc hl
+  inc hl
+  inc hl
+  inc hl ;skip 4
+  ld  b,(hl) ;spritesize
+  inc b
+skipsprite:
+  inc hl
+  dnz skipsprite
+  ld  b,(hl) ;balls
+  inc b
+  inc b ;skip 6
+  ld  a,c
+  and _datasingl
+  jr  nz,skipworms
+  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
+  cal skiplines ;lines
+skiplines: ;boxes
+  ld  a,(hl) ;lines/boxes
+  add a,a
+  add a,a
+  inc a
+  ld  b,a ;4x(hl)+1
+skiplb
+  inc hl
+  dnz skiplb
+  ret
+
 ;-----------------------------
 ;-------- start game ---------
 ;-----------------------------
 
 LetsGetThisPartyOn:
 ;-----------------------------
 ;-------- start game ---------
 ;-----------------------------
 
 LetsGetThisPartyOn:
+  ld  a,$17 ;no exit
+  ld  (CheckExit),a ;set exit state
+
   ld  hl,gamesdata
   ld  a,(Gametype)
   ld  e,a
   ld  hl,gamesdata
   ld  a,(Gametype)
   ld  e,a
@@ -365,13 +650,13 @@ LetsGetThisPartyOn:
   ld  e,8 ;=de
   add hl,de
 
   ld  e,8 ;=de
   add hl,de
 
-  ld  b,a ;psh af
+  ld  c,a
   and _datasingl
   jr  z,notsingle
   ld  a,1
   ld  (nrworms),a
 notsingle:
   and _datasingl
   jr  z,notsingle
   ld  a,1
   ld  (nrworms),a
 notsingle:
-  ld  a,b ;pop af \push
+  ld  a,c
   and _datascore
   ld  de,$FF64 ;virt.infinate
   jr  z,setscorelimit
   and _datascore
   ld  de,$FF64 ;virt.infinate
   jr  z,setscorelimit
@@ -380,8 +665,18 @@ setscorelimit:
   ld  (scorelimit),de
 
   cal _ldHLind ;ld hl,(hl)
   ld  (scorelimit),de
 
   cal _ldHLind ;ld hl,(hl)
-  psh hl
-  ld  a,b ;pop af
+  ld  a,(curlevel)
+  ld  (Level),a
+  ld  d,a ;begin level
+skiplevelloop:
+  dec d ;levels to skip
+  jr  z,levelsskipped
+  cal skiplevel
+  jr  skiplevelloop
+levelsskipped:
+
+  psh hl  ;1st level
+  ld  a,c
   and _datalink
   jr  z,GameOver
 
   and _datalink
   jr  z,GameOver
 
@@ -432,8 +727,6 @@ GameOver:
   ld  (worm2+score+1),hl
   ld  (worm3+score+1),hl
   ld  (worm4+score+1),hl
   ld  (worm2+score+1),hl
   ld  (worm3+score+1),hl
   ld  (worm4+score+1),hl
-  ld  a,l
-  ld  (Level),a
   ld  hl,worm1set+4
   ld  de,worm1+lives
 ;&&&>*
   ld  hl,worm1set+4
   ld  de,worm1+lives
 ;&&&>*
@@ -474,8 +767,8 @@ waitsomemore:
   pop hl
 ;show end msg or smtn
   ld  bc,Exit
   pop hl
 ;show end msg or smtn
   ld  bc,Exit
-  psh bc ;where to go afterwards
-  inc hl ;location of ending-code
+  psh bc   ;where to go afterwards
+  inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 nextlevel:
   ldi
   jp  (hl) ;go there ("call")
 nextlevel:
   ldi
@@ -495,7 +788,6 @@ nextlevel:
   inc hl
   or  a
   jr  z,defaultsprite
   inc hl
   or  a
   jr  z,defaultsprite
-  ld  (sprsize),a
   ld  d,h
   ld  e,l ;ld de,hl
   ld  c,a
   ld  d,h
   ld  e,l ;ld de,hl
   ld  c,a
@@ -503,8 +795,10 @@ nextlevel:
   add hl,bc ;hl=behind sprite
   jr  setsprite
 defaultsprite:
   add hl,bc ;hl=behind sprite
   jr  setsprite
 defaultsprite:
+  ld  a,defsprsize
   ld  de,peasprite
 setsprite:
   ld  de,peasprite
 setsprite:
+  ld  (sprsize),a
   ld  (spritepos),de
 
   ld  a,(hl)
   ld  (spritepos),de
 
   ld  a,(hl)
@@ -512,9 +806,13 @@ setsprite:
   ld  (nrballs),a
   or  a
   jr  z,toobad_noballs
   ld  (nrballs),a
   or  a
   jr  z,toobad_noballs
-  ld  de,ballpos
-  ldi
-  ldi
+  ld  c,a
+  add a,a
+  add a,c
+  ld  c,a
+  ld  b,0
+  ld  de,ball1
+  ldir
 toobad_noballs:
 
 #ifdef 0
 toobad_noballs:
 
 #ifdef 0
@@ -776,7 +1074,7 @@ Delay:
   jr  nz,Delay
 NoDelay:
 
   jr  nz,Delay
 NoDelay:
 
-  cal handlethatneatlittleball
+  cal handlethoseneatlittleballs
 
   ld  ix,worm1
   ld  a,(nrworms)
 
   ld  ix,worm1
   ld  a,(nrworms)
@@ -797,54 +1095,24 @@ HandleKeys:
   ld  a,%10111111
   out (1),a
   in  a,(1)
   ld  a,%10111111
   out (1),a
   in  a,(1)
-  rla ;[MORE]?
-  jr  c,NotPaused
+  rla ;MORE?
+  jr  c,CheckExit
   ld  bc,$0103
   out (c),b
   halt ;pause/off
   ld  b,11
   out (c),b
 
   ld  bc,$0103
   out (c),b
   halt ;pause/off
   ld  b,11
   out (c),b
 
-NotPaused:
-  rla ;[EXIT]?
+CheckExit:
+  rla  ;=$17 (c=EXIT-key)
+      ;or$A7 (c=0)
   jp  c,GameLoop
   jr  Exit
 
 WormDead:
   ld  a,2
   ld  (flashtime),a
   jp  c,GameLoop
   jr  Exit
 
 WormDead:
   ld  a,2
   ld  (flashtime),a
-
-  ld  h,(ix+tail+1)
-  ld  l,(ix+tail)
-  ld  d,(ix+head+1)
-  ld  e,(ix+head)
-  jr  DoesWormTailEqualsWormHead ;chk4 size=0
-removewormloop:
-  ld  c,(hl)
-  inc hl
-  ld  b,(hl)
-  inc hl
-  res resbit,h
-  psh hl
-  cal res4pixels
-  pop hl
-  inc (ix+grow)
-DoesWormTailEqualsWormHead:
-  cal _cphlde
-  jr  nz,removewormloop
-
-  ld  a,(gameCar)
-  and _datasingl
-  jr  nz,safewormsizedone
-  ld  a,0
-beginsize =$-1
-  ld  (ix+grow),a
-safewormsizedone:
-
-  ;de=ix+head
-  ld  (ix+tail+1),d
-  ld  (ix+tail),e
-  ld  a,50
+  ld  a,respawndelay
   ld  (ix+delay),a
 
 thislevel =$+1
   ld  (ix+delay),a
 
 thislevel =$+1
@@ -868,6 +1136,9 @@ thislevel =$+1
   ld  a,(gameCar)
   and _datalivel
   ret z
   ld  a,(gameCar)
   and _datalivel
   ret z
+  ld  a,$A7 ;exit@end of turn
+  ld  (CheckExit),a ;set exit state
+  ret ;finish turn
 
 Exit:
   ld  sp,0 ;pop all
 
 Exit:
   ld  sp,0 ;pop all
@@ -889,8 +1160,8 @@ CURtxtGame =$-2
   xor a
   ld  (_curCol),a
 
   xor a
   ld  (_curCol),a
 
-  ld  b,2
-nrworms =$-1
+  ld  a,(nrworms)
+  ld  b,a
   ld  hl,worm1+died
 displayWormStats:
   psh bc
   ld  hl,worm1+died
 displayWormStats:
   psh bc
@@ -941,6 +1212,24 @@ NoLinkIndic:
   pop bc
   dnz displayWormStats
 
   pop bc
   dnz displayWormStats
 
+  ld  a,(Gametype)
+  or  a ;singleplayer (0) only
+  jr  nz,hilevelcheckdone
+checkhilevel:
+  ld  hl,nrlevels
+  ld  a,(Level)
+  inc a
+  cp  (hl)
+  jr  c,hilevelcheckdone
+  ld  (hl),a    ;save local
+  ld  c,a
+  ld  a,0
+hilvlposa =$-1
+  ld  hl,0
+hilvlposhl =$-2 ;save external
+  cal _writeb_inc_ahl ;ld (ahl),c
+hilevelcheckdone:
+
   ld  a,(gameCar)
   and _datasingl
   jr  z,hiscorecheckdone
   ld  a,(gameCar)
   and _datasingl
   jr  z,hiscorecheckdone
@@ -1018,16 +1307,14 @@ ExitNoStats:
 
 loadhiscoreposinahl:
   ld  a,(Gametype)
 
 loadhiscoreposinahl:
   ld  a,(Gametype)
-  dec a
-  jr  nz,externalhiscoresavepos
-  ld  a,0
-  ld  hl,hipeaworm
-  ret
+  or  a
 externalhiscoresavepos:
   ld  a,0
 externalhiscoresavepos:
   ld  a,0
-hisaveposa =$-1
+hiscrposa =$-1
   ld  hl,0
   ld  hl,0
-hisaveposhl =$-2
+hiscrposhl =$-2
+  ret z ;(Gametype)=0
+  cal _INC_PTR_AHL
   ret
 
 ;-----------------------------
   ret
 
 ;-----------------------------
@@ -1082,6 +1369,41 @@ inputcall:
   jr  inlink
 
 respawncheck:
   jr  inlink
 
 respawncheck:
+  cp  respawndelay-1
+  jr  nz,unnamedlabel
+removeworm:
+  ld  h,(ix+tail+1)
+  ld  l,(ix+tail)
+  ld  d,(ix+head+1)
+  ld  e,(ix+head)
+  jr  DoesWormTailEqualsWormHead ;chk4 size=0
+removewormloop:
+  ld  c,(hl)
+  inc hl
+  ld  b,(hl)
+  inc hl
+  res resbit,h
+  psh hl
+  cal res4pixels
+  pop hl
+  inc (ix+grow)
+DoesWormTailEqualsWormHead:
+  cal _cphlde
+  jr  nz,removewormloop
+
+  ld  a,(gameCar)
+  and _datasingl
+  jr  nz,safewormsizedone
+  ld  a,0
+beginsize =$-1
+  ld  (ix+grow),a
+safewormsizedone:
+
+  ;de=ix+head
+  ld  (ix+tail+1),d
+  ld  (ix+tail),e
+
+unnamedlabel:
   cp  1
   ld  h,a
   jr  nz,saverespawncounter
   cp  1
   ld  h,a
   jr  nz,saverespawncounter
@@ -1211,16 +1533,24 @@ peagrowth =$-1
   ld  a,(gameCar)
   and _datafoodl
   jr  z,still_alive_not_dead
   ld  a,(gameCar)
   and _datafoodl
   jr  z,still_alive_not_dead
+  ld  a,(Gametype)
+  or  a
+  jp  nz,Exit ;stack restored
+
   ld  hl,Level
   ld  a,(hl)
   inc (hl)
   ld  hl,Level
   ld  a,(hl)
   inc (hl)
+  ld  l,a ;hl=Level
+  ld  h,0
+  add hl,hl
+  add hl,hl
+  cal _HLTIMES10
+  ex  de,hl
+  cal IncScore ;score+(40*level)
   pop hl                         ; << call
   pop hl                         ; << call
   pop hl                         ; << levelp new
   pop hl                         ; << call
   pop hl                         ; << call
   pop hl                         ; << levelp new
-  ld  a,(gameCar)
-  and _datanextl
-  jp  nz,StartLevel
-  jp  Exit
+  jp  StartLevel
 
 ;-----------------------------
 
 
 ;-----------------------------
 
@@ -1342,34 +1672,73 @@ ResPixel:
 ;---------- ball -------------
 ;-----------------------------
 
 ;---------- ball -------------
 ;-----------------------------
 
-handlethatneatlittleball:
+handlethoseneatlittleballs:
   ld  a,0
 nrballs =$-1
   or  a
   ret z
   ld  a,0
 nrballs =$-1
   or  a
   ret z
-ballpos =$+1
-  ld  bc,$0503
+
+  ld  hl,ball1
+  ld  b,a
+handleballs
+  psh bc
+  psh hl
+  ld  c,(hl)
+  inc hl
+  ld  b,(hl)
+  inc hl
+  ld  d,(hl)
+  cal handleball
+  dec c
+  pop hl
+  ld  (hl),c
+  inc hl
+  ld  (hl),b
+  inc hl
+  ld  (hl),d
+  inc hl
+  pop bc
+  dnz handleballs
+  ret
+
+handleball:
   cal res4pixels
   dec c
   cal res4pixels
   dec c
-  ld  e,b
+
 ballxmove:
 ballxmove:
-  inc b ;=%000100 dec=%000101
+  bit 0,d ;1=L; 0=R
+  jr  z,ballright
+ballleft:
+  dec b
   cal checkballhit
   cal checkballhit
-  jr  z,ballxdone
-  ld  b,e
-  ld  hl,ballxmove
-  cal letsmovetheotherway
-ballxdone:
-  ld  e,c
+  jr  z,ballymove
+  inc b ;undo
+  res 0,d ;go right
+  jr  ballymove
+ballright:
+  inc b
+  cal checkballhit
+  jr  z,ballymove
+  dec b ;back
+  set 0,d ;>left
+
 ballymove:
 ballymove:
-  inc c ;=%001100 dec=%001101
+  bit 1,d ;1=up; 0=down
+  jr  z,balldown
+ballup:
+  dec c
   cal checkballhit
   jr  z,balldone
   cal checkballhit
   jr  z,balldone
-  ld  c,e
-  ld  hl,ballymove
-  cal letsmovetheotherway
+  inc c
+  res 1,d ;go down
+  jr  balldone
+balldown:
+  inc c
+  cal checkballhit
+  jr  z,balldone
+  dec c
+  set 1,d ;up
 balldone:
 balldone:
-  ld  (ballpos),bc
 
 set4pixels: ;@(b,c)
   cal SetPixel
 
 set4pixels: ;@(b,c)
   cal SetPixel
@@ -1391,10 +1760,12 @@ letsmovetheotherway:
   ret
 
 checkballhit:
   ret
 
 checkballhit:
+  psh de
   ld  d,0
   cal chk4pixels
   xor a
   cp  d
   ld  d,0
   cal chk4pixels
   xor a
   cp  d
+  pop de
   ret
 
 ;-----------------------------
   ret
 
 ;-----------------------------
@@ -1457,25 +1828,41 @@ spritepos =$-2
 
 ;----------- score -----------
 
 
 ;----------- score -----------
 
+_divHLby1000:
+  psh hl
+  ld  b,3
+divideagain: ;3x
+  cal _divHLby10
+  dnz divideagain
+  ld  a,l ;a=hl/1000
+  pop hl
+  ret
+
 HuntingTimeScore:
   .db $dd,$7d ;ld a,lx
   cp  worm2&255
   ret z ;=worm#2
   dec (ix+reserv)
   ret nz
 HuntingTimeScore:
   .db $dd,$7d ;ld a,lx
   cp  worm2&255
   ret z ;=worm#2
   dec (ix+reserv)
   ret nz
-  ld  de,10
+  ld  hl,10
 
 IncScore:
   ld  h,(ix+score+1)
   ld  l,(ix+score)
 
 IncScore:
   ld  h,(ix+score+1)
   ld  l,(ix+score)
+  cal _divHLby1000
+  ld  c,a
   add hl,de
   add hl,de
+  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  scorecommon
 DecScore: ;&&&
   ld  h,(ix+score+1)
   ld  l,(ix+score)
   or  a
   sbc hl,de
-  ret c
+  jr  c,showstats ;<0=0
 scorecommon:
   ld  (ix+score+1),h
   ld  (ix+score),l
 scorecommon:
   ld  (ix+score+1),h
   ld  (ix+score),l
@@ -2209,8 +2596,10 @@ TrigPrecalc:
 
 txtWelcome: .db "Welcome to Worm!! ",
             .db "by Shiar",0
 
 txtWelcome: .db "Welcome to Worm!! ",
             .db "by Shiar",0
-txtOptions: .db "Options",0
-txtGame:    .db "Singleplayer",0  ;0
+            .db "Have fun!",0 ;4th menu item
+            .db "Level 00",0 ;3rd
+            .db "Worms: 0",0 ;2nd
+txtGame:    .db "Singleplayer",0  ;0 (1st)
 txtGame2:   .db "Peaworm     ",0  ;1
             .db "Deathmatch",0    ;2
             .db "Foodmatch ",0    ;3
 txtGame2:   .db "Peaworm     ",0  ;1
             .db "Deathmatch",0    ;2
             .db "Foodmatch ",0    ;3
@@ -2257,58 +2646,54 @@ datalevels: .dw LevelDef, LevelDef
             .dw LevelDefM,LevelDefM
             .dw LevelDefM,LevelDefM
             .dw LevelDefM,LevelDefM
             .dw LevelDefM,LevelDefM
             .dw LevelDefM,LevelDefM
             .dw LevelDefM,LevelDefM
+nrlevels:   .db 1,1,1,1,1,1,1,1
 
 worm1set:  .dw worm1p,worm1p
            .db 3,0,%01111110,%10,%100 ;< >
 
 worm1set:  .dw worm1p,worm1p
            .db 3,0,%01111110,%10,%100 ;< >
-worm1name: .db "Worm #1 ",0
+worm1name: .db "Left    ",0
 worm2set:  .dw worm2p,worm2p
            .db 3,0,%00111111,%10000,%1000 ;f1 f2
 worm2set:  .dw worm2p,worm2p
            .db 3,0,%00111111,%10000,%1000 ;f1 f2
-worm2name: .db "Worm #2 ",0
+worm2name: .db "Right   ",0
 worm3set:  .dw worm3p,worm3p
            .db 3,0,%01011111,%10,%100 ;sto ,
 worm3set:  .dw worm3p,worm3p
            .db 3,0,%01011111,%10,%100 ;sto ,
-worm3name: .db "Worm #3 ",0
+worm3name: .db "Top     ",0
 worm4set:  .dw worm4p,worm4p
            .db 3,0,%01111101,%10,%1 ;enter +
 worm4set:  .dw worm4p,worm4p
            .db 3,0,%01111101,%10,%1 ;enter +
-worm4name: .db "Worm #4 ",0
+worm4name: .db "Bottom  ",0
 
 hipeaworm: .dw 0
 end:
 
 
 hipeaworm: .dw 0
 end:
 
-;sprsize = 7
-;peasprite: .db %00111000
-;           .db %01110100
-;           .db %11111010
-;           .db %11111110
-;           .db %11111110
-;           .db %01111100
-;           .db %00111000
-
-sprsize:   .db 5
-peasprite: .db %01110000
-           .db %11101000
-           .db %11111000
-           .db %11111000
-           .db %01110000
-
-              ;set:
-heading = 0   ;level*
-pos     = 2   ;level*
-pos2    = 4   ;level
-grow    = 6   ;level
-died    = 8   ;game
-score   = 9   ;game
-delay   = 11  ;game
-
-head    = 12  ;level
-tail    = 14  ;level
-lives   = 16  ;game
-reserv  = 17  ;loop
+defsprsize   = 4
+sprsize:   .db 4
+peasprite: .db %01100000
+           .db %11110000
+           .db %11110000
+           .db %01100000
+
+               ;set:
+heading  = 0   ;level*
+pos      = 2   ;level*
+pos2     = 4   ;level
+grow     = 6   ;level
+died     = 8   ;game
+score    = 9   ;game
+delay    = 11  ;game
+
+head     = 12  ;level
+tail     = 14  ;level
+lives    = 16  ;game
+reserv   = 17  ;loop
  ;race:lap
  ;hunt:time
  ;race:lap
  ;hunt:time
-input   = 18  ;&
-left    = 19  ;&
-right   = 20  ;&
-name    = 21  ;game
+input    = 18  ;&
+left     = 19  ;&
+right    = 20  ;&
+name     = 21  ;game
+wormsize = 30
+
+respawndelay  = 40
+maxnamelength = 9
 
 ;-----------------------------
 ;----------- end -------------
 
 ;-----------------------------
 ;----------- end -------------
index fd1c51a630ba6baac3c4528bd3fbd40d5d723756..1eeda2eb17d15b9977c7966f354b5178cdc01b56 100644 (file)
@@ -1,43 +1,46 @@
 #include "asm86.h"
 #include "ti86asm.inc"
 
 #include "asm86.h"
 #include "ti86asm.inc"
 
-  .org $EA00-20
+  .org $E9E3-16       ;$E9E3-[name size]
 
 
-  .db 'T',0          ;worm header (Test version)
-  .dw hiscore-single ;leveldata size
+  .db "89"            ;worm header (version .88)
+  .db 16,"Worm LevelPack I" ;level name
+  .dw hiscore-single  ;leveldata size
 
 
 levelsdata:
 
 
 
 levelsdata:
 
-  .dw single         ;points to singleplayer levels
-  .dw 0              ;...peaworm level (0 = no levels/empty level)
-  .dw deathmatch     ;...deathmatch
-  .dw foodmatch      ;...foodmatch
-  .dw linkmatch      ;...linkmatch
-  .dw hunting        ;...hunting
-  .dw race           ;...race
-  .dw ctf            ;...capture the flag
+  .dw single          ;points to singleplayer levels
+  .dw 0               ;...peaworm level (0 = no levels/empty level)
+  .dw deathmatch      ;...deathmatch
+  .dw foodmatch       ;...foodmatch
+  .dw linkmatch       ;...linkmatch
+  .dw hunting         ;...hunting
+  .dw race            ;...race
+  .dw ctf             ;...capture the flag
 
 
+  .db 2,2,3,2         ;max. choosable level+1 for each gametype
+  .db 2,2,2,2         ;so: 2 = level 1 only; 4 = level 1 to 3 available
 
 single:
 
 
 single:
 
-  .db 5,4,15         ;peas in level, delay (0=fastest), pea-growth
-  .db 15,5           ;begin_size, sprite size (0=use default sprite)
-  .db %01110000      ;sprite
+  .db 5,4,15          ;peas in level, delay (0=fastest), pea-growth
+  .db 15,5            ;begin_size, sprite size (0=use default sprite)
+  .db %01110000       ;sprite
   .db %10001000
   .db %10001000
   .db %10001000
   .db %01110000
   .db %10001000
   .db %10001000
   .db %10001000
   .db %01110000
-  .db 0              ;balls (0 or 1)
-  .db 0,2,63         ;your start d (0=down,$80=up), y, x
-  .db 128,57         ;field width (128-255), height (57-255)
-  .db 0,0            ;no additional lines, boxes
+  .db 0               ;balls (see below)
+  .db 0,2,63          ;your start d (0=down,$80=up), y, x
+  .db 128,57          ;field width (128-255), height (57-255)
+  .db 0,0             ;no additional lines, boxes
 
   .db 8,4,15,15,0,0
   .db $40,14,2
   .db 128,57
 
   .db 8,4,15,15,0,0
   .db $40,14,2
   .db 128,57
-  .db 1              ;one line:
-  .db 28,28,100,28   ;line coords: x1,y1,x2,y2
+  .db 1               ;one line:
+  .db 28,28,100,28    ;line coords: x1,y1,x2,y2
   .db 0
 
   .db 9,4,15,15,0,0
   .db 0
 
   .db 9,4,15,15,0,0
@@ -48,9 +51,9 @@ single:
   .db 28,41,100,41
   .db 0
 
   .db 28,41,100,41
   .db 0
 
-  .db 4,3,15,10,0,1  ;...bouncing ball
-  .dw $20F           ;ball begin position
-  .db 0,2,63
+  .db 4,3,15,10,0,1
+  .db 2,4,0           ;1 bouncing ball, begin y, x, direction (%11=left+up)
+  .db 0,2,124
   .db 128,57
   .db 2
   .db 28,14,100,41
   .db 128,57
   .db 2
   .db 28,14,100,41
@@ -96,7 +99,7 @@ single:
   .db 0
 
   .db 12,3,15,15,0,0
   .db 0
 
   .db 12,3,15,15,0,0
-  .db $40,4,0
+  .db $40,2,2
   .db 128,90
   .db 6
   .db 20,16,54,16
   .db 128,90
   .db 6
   .db 20,16,54,16
@@ -108,7 +111,7 @@ single:
   .db 0
 
   .db 8,2,15,15,0,0
   .db 0
 
   .db 8,2,15,15,0,0
-  .db $C0,72,48
+  .db $C0,67,48
   .db 128,128
   .db 13
   .db 34,56,56,34
   .db 128,128
   .db 13
   .db 34,56,56,34
@@ -126,7 +129,7 @@ single:
   .db 91,106,115,106
   .db 0
 
   .db 91,106,115,106
   .db 0
 
-  .db 255            ;end marker
+  .db 255             ;end marker
 
 ;Code to run when all levels are done:
 ;Worm waits a second, then screen is cleared and this code will be run.
 
 ;Code to run when all levels are done:
 ;Worm waits a second, then screen is cleared and this code will be run.
@@ -134,27 +137,32 @@ single:
 ;If you don't want an ending, simply put <ret>.
 
    ld   hl,endtext
 ;If you don't want an ending, simply put <ret>.
 
    ld   hl,endtext
-   call _puts        ;display text
-   jp   _getkey      ;wait for a key
-                     ;jp ? = call ? + ret
+   call _puts         ;display text
+   jp   _getkey       ;wait for a key
+                      ;jp ? = call ? + ret
 endtext:
   .db "  Congratulations!!",0
 
 
 deathmatch:
   .db 8,5,15,31,0,0
 endtext:
   .db "  Congratulations!!",0
 
 
 deathmatch:
   .db 8,5,15,31,0,0
-  .db $40,28,2       ;begin stats for each player
-  .db $C0,28,125     ;player 2 moves left
-  .db $00,2,63       ;player 3 moves down
-  .db $80,54,63      ;player 4 moves up
+  .db $40,28,2        ;begin stats for each player
+  .db $C0,28,125      ;player 2 moves left
+  .db $00,2,63        ;player 3 moves down
+  .db $80,54,63       ;player 4 moves up
   .db 128,57
   .db 0
   .db 128,57
   .db 0
-  .db 4              ;4 boxes:
-  .db 16,12,48,12    ;x1,y1,x2,ysize(y2-y1)
-  .db 80,12,112,12   ;...
+  .db 4               ;4 boxes:
+  .db 16,12,48,12     ;x1,y1,x2,ysize(y2-y1)
+  .db 80,12,112,12    ;...
   .db 16,34,48,12
   .db 80,34,112,12
 
   .db 16,34,48,12
   .db 80,34,112,12
 
+  .db 8,4,18,15,0,0
+  .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+  .db 128,57
+  .db 0,0
+
 
 foodmatch:
 ctf:
 
 foodmatch:
 ctf:
@@ -193,7 +201,8 @@ race:
 
 
 hiscore:
 
 
 hiscore:
-  .dw 0              ;singleplayer hiscore will be saved here
+  .dw 0               ;singleplayer hiscore will be saved here
+  .dw 0               ;same for peaworm hiscore
 
 
   .end
 
 
   .end