relicense under the GPL version 3
[wormy.git] / wormy.z80
index 899e22e4eb3b823de833ff9046bf61674fee579a..576ac7096cdf2d56bbac5f3f462829a390e8703c 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -1,43 +1,40 @@
-;___����________________________________________________________����____________
-;  ����                                                         �����
-; ���                                                            ����     ����
-;���      �����          ��������       �����     ����  ����      ���     �����
-;���     �������       �����������     �������   �������������     ��    ��� ���
-;��     ���   ���     �����    ����   ����  ��� ���  ����  ���     ���  ���� ���
-;��     ��     ��     ��  �      ��� ����      ���  ������  ���    ���  ���   ��
-;��     ��     ��     �� ��      ��� ���       ��� ���� ��� ���    ��� ����   ��
-;��     ���   ���     �� ��       �� ���       �������   ��� ��     �������   ��
-;��     ���   ���    ��� ��       �� ��        �� ���    ��� ���     �����   ���
-;���     ��� ���     ��� ��       �� ���       �� ����  ���� ���             ���
-;���      �����     ���  ���     ��� ���       ��  ��������  ���            ���
-; ���      ���      ���  ���     ��� ���       ���  ������   ���            ���
-;  ����  �������  ����    ���   ���  ����      ���            �����       ����
-;   �������� ��������     ���������   ���      ���             ���������������
-;    �����     �����       �������     ��       ���              �����������
+;___▄███________________________________________________________▄▄▄▄____________
+;  ███▀                                                         ████▌
+; ███                                                            ▀███     ▐██▄
+;▐██      ▄███▄          ▄▄████▄▄       ▄████     ▄██▄  ▄██▄      ▐██     █████
+;██▌     ███████       ▄██████████     ███████   ████████████▄     ██    ███ ███
+;██     ██▀   ▀██     ▐██▀▀    ▀███   ███▀  ██▌ ██▀  ████  ▀██     ██▌  ▐██▌ ▐██
+;██     ██     ██     ██  ▄      ██▌ ▐██▌      ▐██  ██████  ██▌    ███  ███   ██
+;██     ██     ██     ██ ██      ▐██ ███       ██▌ ███▀ ▐██ ▀██    ███ ▐███   ██
+;██     ██▌   ▐██     ██ ██       ██ ██▌       ██▌▐██▌   ██▌ ██     ██████▀   ██
+;██     ▐██   ██▌    ▐██ ██       ██ ██        ██ ▐██    ██▌ ██▌     ▀███▀   ▐██
+;██▌     ██▄ ▄██     ██▌ ██       ██ ██▌       ██ ▐██▌  ▐██▌ ██▌             ██▌
+;▐██      █████     ▐██  ██▌     ▐██ ██▌       ██  ▀██▄▄██▀  ███            ▐██
+; ███      ███      ██▌  ▐██     ██▌ ███       ██▌  ▀████▀   ▐██            ███
+;  ███▄  ▄█████▄  ▄███    ██▌   ███  ▐██▌      ██▌            ███▄▄       ▄███
+;   ███████▀ ▀███████     ▐██▄▄███▌   ███      ▐██             ██████████████▌
+;    ▀███▀     ▀██▀▀       ▀█████▀     ██       ██▌              ▀█████████▀
 ;_______________________________________________________________________________
 ;
-; Version                  :                                       99% (0.99.34)
-; Release Date             :                                        2002 March 4
+; Version                  :                                      100% (1.00.36)
+; Release Date             :                                        2002 March 6
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
-; Web Page                 :                                       www.shiar.org
+; Web Page                 :                                     http://shiar.nl
+; License:                 :                GNU General Public License version 3
 ; Description              :  perfect Nibbles game with free movement, nine game
 ;                                 modes, for 1-4 players, many levels and editor
-; Where to get this game   :                                     wormy.shiar.org
 ; Other games by author(s) :                                        Nemesis beta
 ; Additional Credits to    : Matthew Shepcar  :   wrote original Peaworm, end'98
 ;                            Jonah Cohen      :              helped writing worm
-; Files                    : wormy.txt (9283) : 12345678901234567890123456789012
-;                            wormy.z80 (100k) : 515ad14b922572bdc8a96e780b8b24ca
-;                            wormy.86g (8867) : efef32a8c541b4585087f55deb31f51d
 ;_______________________________________________________________________________
 
 ;--- notes ---------------------------------------------------------------------
 
 ; * Game README is wormy.txt
-;  * Use for LEARNING practises ONLY!
-;   * Don't _ever_ release altered code w/o permission!
-;    * Give me credits when you use any of this stuff
+;  * All code under the GPL version 3
+;   * You may alter and redistribute (parts of) this code
+;      but only under the same license; credits would be appreciated
 ;     * I'm not responsible for any damage this might cause, yada yada...
 ;      * Although I've commented & labeled quite some stuff, due to
 ;         crazy optimizations and weird coding, it may be harder to
 ;    |    |_____| ____ |_____/ |_____|
 ;_______________________________________________________________________________
 
-; 98% = PREVIOUS
-;     X [119] ED: new 53 file format with support for 128 objects instead of 32
-;     X [119] LVL: episode #4: 10 hard sp levels (ordered XO-XO-XO-X)
-;     X [120] fixed greymask (and it now ands instead of ors)
-;     X [120] fixed growth set after death
-;     X [121] fixed linkplay (couldn't turn it on anymore..)
-;     X [121] LVL: Wormage + Wormage ][ (2x 10 sp levels)
-;     X [121] pea randomizer doesn't give x>128
-;     X [121] mixed single-/multipea singleplayer levels (re)set correctly
-;     X [126] circles left|above 0,0 drawn correctly now!
-;     X [126] fixed multiple pages of levelfiles
-;     X [29]  optimized a few more bytes (less empty bytes so prettier binary ;)
-;     X [225] ED: ctf/race level copy/move fix
-;     X [225] LVL: episode #1: 5 ctf+5 race; episode #3 removed (all in #1 now)
-;     X [225] add v2 id (yas2)
-;     X [227] redundant calls removed or moved
-;     X [227] fixed: ctf score increased by taking _any_ pea
-;     X [227] no more points in race for dieing on the second half
-;     X [227] no score decrease for dieing in race (no longer needed, see above)
-; 99% = CURRENT
-;     X [34] two more jp to jr
+; 99% = PREVIOUS
 ;     X [34] freeze when no space left to place pea (break after 10k tries)
 ;     X [34] wow another bit of code 'reniced' (easter egg or something :)
-;     X [34] highly improved randomizer (now _really_ with values >127)
-;     * replace 'left' at the change-control prompt (maybe!!!)
-;  1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
-;     * LVL: episode #5: 10 easy sp levels (do i _have_ to?)
-;     * LVL: Eric's Yumworms (ep#5?)
-;     * LVL: Free Bird
-;     * LVL: Jonah?
-;     * scorebar last digit (at 128-3) not displayed by _vputs
-;  1% * fix any bugs that come up
+;     X [34] two more jp to jr
+;     X [34] highly improved randomizer (values >127 were rare)
+;     X [36] replace 'left' at the change-control prompt
+;     X [36] ED: fixed immediate exit at level preview when using enter key
+;     X [36] bouncies drawn after placing peas (causing overwrites)
+;     X [36] FIX: skip string length bytes when running from yas
+;     X [36] ED: pointer to ending message realigned
+;     X [36] LVL: end messages fixed in affected episodes
+;100% = CURRENT
+;     * scorebar last digit (at 128-3) not displayed by _vputs :(
+;     * save last played level (in levelfile prolly)
+;     * automatically start players in multiplayer games after certain time
+;     * muliplayer bonuses/powerups (shrink, lives, stun, inverse, etc.)
+;     * levels with random pixels appearing during game
+;     * no borders (move players from one side to another)
+;     * hiding levels crashes?? (ishell 2.01 rom 1.6)
+;     * use selected player on main menu as first player in singleplayer games
+
 
 ;--- future features -----------------------------------------------------------
 
 ;
 ; * correct team winners
 ;  * level compression
-;   * ubersized bouncies ;)
+;   * ubersized bouncies (sprites)
 ;    * arrow to offscreen peas
 ;     * w00t AI
 ;      * sound
@@ -184,7 +170,7 @@ _OP1TOOP6          = $4263
  #define spprotect  ;options not changable for singleplayer modes
 ;#define intlevels  ;-internal levels
                     ;-to become invincible, define the magic word :D
-#define w00t
+
 levelhead   = 'w'
 levelhead2  = 97 ;wormy levels header = "0"
 
@@ -248,16 +234,16 @@ pos2        =   4   ;level
 grow        =   6   ;level
 died        =   8   ;game:
 score       =   9
-delay       =   11
+wdelay      =   11
 lives       =   12
 head        =   13
-                    ; 15B (wormNset)
-tail        =   15  ; |also@next level
-storepos    =   17  ; |
-reserv      =   18  ; |loop (race:lap|ctf:pea)
-left        =   19  ; |
-right       =   20  ; |
-name        =   21  ; |_
+                    ; 15B (wormNset)
+tail        =   15  ; also@next level
+storepos    =   17  ; 
+reserv      =   18  ; loop (race:lap|ctf:pea)
+wleft       =   19  ; │
+wright      =   20  ; │
+name        =   21  ; _
 
 wormsize    =   30 ;^mark^
 
@@ -271,7 +257,7 @@ wormsize    =   30 ;^mark^
 
 start:         ;turn back NOW!
   nop      ;and so it begins...
-  jp  Start
+  jp  codestart
 #ifndef id2
   ld  bc,$5242
   rst 10h
@@ -297,17 +283,17 @@ start:            ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 99% .34",0
+ .db  " v1.00.36",0
 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                ;Rkaydees' icon:
+ .db  %00000000,%00111100 ;      XX
+ .db  %00000000,%01010010 ;     XXX
+ .db  %00000000,%01100001 ;     XX
+ .db  %01100011,%10011001 ;     XX
+ .db  %10010100,%01101001 ;      XX
+ .db  %10011001,%00011001 ;      XX
+ .db  %01000010,%11000001 ; X   XX
+ .db  %00111100,%00111110 ;  XXXX
 #ifdef id2
 WormData:
  .db  1
@@ -327,14 +313,15 @@ yasexec:
   rst 10h
   ex  de,hl
   ld  a,b
+  cal _AHL_PLUS_2_PG3 ;skip past length bytes
   cal skiptitle ;title (plus size+header <- all non-0)
 ; cal skiptitle ;description
   jp  leveldataAHL-3
 yasdetect:
-  cal _AHL_PLUS_2_PG3  ;skip past length bytes
+  cal _AHL_PLUS_2_PG3 ;skip past length bytes
   cal _Get_Word_ahl
   ld  hl,levelhead+(levelhead2*256)
-  call _cphlde
+  cal _cphlde
   ret z
   scf
   ret
@@ -369,7 +356,7 @@ int_end:
 
 ;--- search levels -------------------------------------------------------------
 
-Start:
+codestart:
   cal _runindicoff
   cal _flushallmenus
 
@@ -878,30 +865,30 @@ notoselect
   jr  nz,optionMenu
 
 seloright:
-  dec a
+  dec a ;Lives
   jr  z,changelives
-  dec a
+  dec a ;Limit
   jr  z,changelimit
-  dec a
+  dec a ;Speed
   jr  z,changespeed
-  dec a
+  dec a ;Rotation
   jr  z,changeturn
-  dec a
+  dec a ;Growth
   jr  z,changegrowth
-
+        ;Back
 seloleft:
   ld  a,b
-  dec a
+  dec a ;Lives
   jr  z,bchangelives
-  dec a
+  dec a ;Limit
   jr  z,bchangelimit
-  dec a
+  dec a ;Speed
   jr  z,bchangespeed
-  dec a
+  dec a ;Rotation
   jr  z,bchangeturn
-  dec a
+  dec a ;Growth
   jr  z,bchangegrowth
-_optionMenu:
+_optionMenu: ;Back
   jr  optionMenu
 
 changelives:
@@ -1030,7 +1017,7 @@ notselect
   cp  K_EXIT
   jp  z,ExitNoStats
   cp  K_MORE
-  jp  z,Start
+  jp  z,codestart
   psh af
   cal menupos
   cal loadgamecar
@@ -1043,15 +1030,15 @@ notselect
   jr  nz,mainMenu
 
 selright:
-  or  a
+  or  a ;Mode
   jr  z,changegame
-  dec a
+  dec a ;Level
   jr  z,changelevel
-  dec a
+  dec a ;Link
   jr  z,changelink
-  dec a
+  dec a ;Worms
   jr  z,changenrworms
-; dec a
+; dec a ;worm#
 ; jr  z,changecurworm
 
 changecurworm:
@@ -1064,15 +1051,15 @@ changecurworm:
 
 selleft:
   ld  a,b
-  or  a
+  or  a ;Mode
   jr  z,bchangegame
-  dec a
+  dec a ;Level
   jr  z,bchangelevel
-  dec a
+  dec a ;Link
   jr  z,bchangelink
-  dec a
+  dec a ;Worms
   jr  z,bchangenrworms
-; dec a
+; dec a ;worm#
 ; jr  z,bchangecurworm
 
 bchangecurworm:
@@ -1172,9 +1159,9 @@ waitcustomkey:
   or  a
   jr  z,waitcustomkey
   cp  K_EXIT
-  ret z
+  ret z ;cancel
   cp  K_MORE
-  jr  z,waitcustomkey
+  jr  z,waitcustomkey ;ignore
   ld  (ix),a
   ret
 
@@ -1182,6 +1169,8 @@ changekeys:
   cal getwormname
   ld  hl,txtKleft
   cal getcustomkey ;left
+  ld  a,93
+  ld  (_penCol),a
   cal getcustomkey ;right
 ; jr  dispmenusets
 
@@ -1391,15 +1380,15 @@ continue:
   cal releasekeys
   jr  enternameloop
 
-chartable: ;("!@#$%,0" also used in _D_HL_DECI)
-  .db ".<>!"           ;down|L|R|up|-|-|-|-
+chartable:
+  .db ".<>!"           ;down|L|R|up|-|-|-|-|[enter]
   .db "w00t!"          ;(makes code look way better)
-  .db "XTOJE0",-2      ;enter|+|-|*|/|^|clear|-
-  .db " WSNID9",-3     ;(-)|3|6|9|)|tan|custom|-
-  .db "ZVRMHC8",-4     ;.|2|5|8|(|cos|prgm|del
-  .db "YUQLGB7#"       ;0|1|4|7|ee|sin|table|xvar
-  .db $D9,"-PKFA6'"    ;on|sto|,|x2|ln|log|graph|alpha
-  .db "54321*",-5,$D0  ;F5|F4|F3|F2|F1|2nd|exit|more
+  .db "XTOJE0",'w'     ;+|-|*|/|^|clear|-              w
+  .db " WSNID9",$F8    ;(-)|3|6|9|)|tan|custom|-       o
+  .db "ZVRMHC8",$A7    ;.|2|5|8|(|cos|prgm|[del]       o
+  .db "YUQLGB7#",$C2   ;0|1|4|7|ee|sin|table|xvar|[on] t
+  .db "-PKFA6'"        ;sto|,|x2|ln|log|graph|alpha
+  .db "54321*",$AE,$D0 ;F5|F4|F3|F2|F1|2nd|[exit]|more
 
 nameentered: ;d=0
   pop ix ;stringbegin
@@ -1551,7 +1540,7 @@ createwormsloop:
   ld  (hl),b ;+score+1=0
   inc hl
   ld  c,2
-  ld  (hl),c ;+delay=2
+  ld  (hl),c ;+wdelay=2
   inc hl
   ld  (hl),3 ;+lives=x
 wormbeglives =$-1
@@ -1601,11 +1590,11 @@ client:
  ;                 2 = link    = 0  + link (name1)
  ;                 3 = worm #2 = #2 + local(name2)
  ;                 4 = link    = 0  + link (name2)
-  ld  e,worm3+left&255
+  ld  e,worm3+wleft&255
   cal moveworm2 ;3=2
   ld  l,worm1+name&255
   cal sendworm
-  ld  l,worm2+left&255
+  ld  l,worm2+wleft&255
   cal linkworm ;worm2+4 over link
   pop hl ;loadgamecar
   pop de ;leveldata
@@ -1634,21 +1623,21 @@ linkerror:
 ;--- set/send worms ------------------------------------------------------------
 
 moveworm2:
-  ld  hl,worm2+left
-moveworm: ;hl=wormN+left
+  ld  hl,worm2+wleft
+moveworm: ;hl=wormN+wleft
   ld  d,worm1/256
   ld  bc,11
   ldir ;keys+name worm(de) = worm(hl)
   ret
-linkworm: ;hl=wormN+left
-  ld  (hl),0 ;worm1|2+left
+linkworm: ;hl=wormN+wleft
+  ld  (hl),0 ;worm1|2+wleft
   inc hl
   inc hl ;+name
   ld  b,9
   cal recvstuff
   ld  bc,worm3-worm1-11 ;+2
   add hl,bc ;b=0
-  ld  (hl),b ;worm3|4+left
+  ld  (hl),b ;worm3|4+wleft
   inc hl
   inc hl ;+name
   ld  b,9
@@ -1673,12 +1662,12 @@ host:
  ;                 2 = worm #1 = #1 + local(name1)
  ;                 3 = link    = 0  + link (name2)
  ;                 4 = worm #2 = #2 + local(name2)
-  ld  e,worm4+left&255
+  ld  e,worm4+wleft&255
   cal moveworm2 ;4=2
-  ld  e,worm2+left&255
-  ld  hl,worm1+left
+  ld  e,worm2+wleft&255
+  ld  hl,worm1+wleft
   cal moveworm ;2=1
-  ld  l,worm1+left&255
+  ld  l,worm1+wleft&255
   cal linkworm ;worm1+3 over link
   ld  l,worm2+name&255
   cal sendworm
@@ -1973,6 +1962,7 @@ levelhasbeensetup:
 leveldone:
   psh hl                        ; >> levelp new
   cal forceshowstats
+  cal handlethoseneatlittleballs
 
   ld  a,(gamecar)
   rla ;and _dataPmult
@@ -2028,7 +2018,7 @@ ReadyDelay:
 
 GameLoop:
   ld  bc,(worm1+pos) ;camera worm #1
-  ld  a,(worm1+left)
+  ld  a,(worm1+wleft)
   or  a ;if #1 not over link
   jr  nz,showfield
   ld  bc,(worm2+pos) ;otherwise view from #2
@@ -2095,11 +2085,7 @@ nodispupdate:
   cal tryDrawPea ;pea#2
 noctfpeas2draw:
 
-
-  ld  a,0
-nrballs =$-1
-  or  a
-  cal nz,handlethoseneatlittleballs
+  cal handlethoseneatlittleballs
 
   ld  ix,worm1
   ld  a,1
@@ -2330,10 +2316,10 @@ displayWormStats:
   psh bc
 
   psh hl
-  ld  bc,left-died
-  add hl,bc ;+left
+  ld  bc,wleft-died
+  add hl,bc ;+wleft
   xor a
-  cp  (hl)  ;left=0 = link
+  cp  (hl)  ;wleft=0 = link
   jr  nz,NoLinkIndic
   ld  a,9
   ld  (_curCol),a
@@ -2494,7 +2480,7 @@ hiscrposhl =$-2
 hiscrposa =$+1
   adc a,0 ;ahl=saveloc
   ret
-savestr: ;hiscore (00AAA) _D_HL_DECI (00000)
+savestr: ;hiscore (01ABC) _D_HL_DECI (01234)
   .db $BB,"w00t",0
 
 iswinner:
@@ -2576,10 +2562,10 @@ respawndue:
   ld  a,h ;previous
   cp  l   ;changed?
   ret z
-  ld  (ix+delay),a ;=0
+  ld  (ix+wdelay),a ;=0
   ret
 saverespawncounter:
-  ld  (ix+delay),a
+  ld  (ix+wdelay),a
   jr  inputcall
 
 chkkey: ;key=a
@@ -2614,7 +2600,7 @@ inkeys: ;use jp not call!
 turnright =$-1
   ld  l,a
 notright:
-  ld  a,(ix+right)
+  ld  a,(ix+wright)
   cal chkkey
   ret nc
   ld  a,l
@@ -2623,7 +2609,7 @@ turnleft =$-1
   ld  l,a
   ret
 inputcall:
-  ld  a,(ix+left)
+  ld  a,(ix+wleft)
   or  a
   jr  z,inlink ;input by link
   cal inkeys ;input by keys
@@ -2651,7 +2637,7 @@ HandleWorm:
   or  a
   ret nz ;live limit
 alive:
-  ld  a,(ix+delay)
+  ld  a,(ix+wdelay)
   dec a
   jp  nz,respawncheck
 
@@ -2815,8 +2801,12 @@ ResPixel:
 ;_______________________________________________________________________________
 
 handlethoseneatlittleballs:
+  ld  a,0
+nrballs =$-1
+  or  a
+  ret z ;no bouncies to handle
+  ld  b,a ;(nrballs)
   ld  hl,balls
-  ld  b,a ;a=(nrballs)
 handleballs
   psh bc
   psh hl
@@ -3046,7 +3036,7 @@ wormset2grow:
   pop hl ;<<call hitworm
   pop hl ;<<call HandleWorm
   pop hl ;<<$some other call
-  ld  (ix+delay),2
+  ld  (ix+wdelay),2
   jp  Nextlevel
 
 chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
@@ -3140,7 +3130,6 @@ mmldir5:
 
 wormdead:
   pop hl ;<<call
-WormDead:
   ld  a,2
   ld  (flashtime),a
 #ifdef w00t
@@ -3149,7 +3138,7 @@ WormDead:
   nop
  .org $+1
 #endif
-  ld  (ix+delay),rspawndelay
+  ld  (ix+wdelay),rspawndelay
 
 thislevel =$+1
   ld  hl,0
@@ -4165,7 +4154,7 @@ sendnewpeaoverlink:
   ld  a,(gamecar)
   rra ;and _datalink
   ret nc ;no link
-  ld  a,(worm1+left)
+  ld  a,(worm1+wleft)
   or  a
   jr  z,receivenewpeaoverlink
   ld  c,l ;send pea's pos
@@ -4431,7 +4420,7 @@ txtDef:    .db               "Default",0
 txtYes:    .db                   "Yes",0
 txtNo:     .db                    "No",0
 txtKleft:  .db                 ":left",0
-txtKright: .db                "/right",0
+txtKright: .db                 "right",0
 posLevsel   =  $0320
 txtLevsel: .db $CF," SELECT LEVELS ",5,0
 txtWaitn:  .db         "Waiting";"...",0
@@ -4495,15 +4484,15 @@ _datadecs   =  %00100000 ;decrease score on death=1
 _datafood   =  %01000000 ;food present=0 (6!)
 _dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
 
-         ;            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 ;    | | | |  |  |  |  |
+         ;            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 %00100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
 gamepeas    =  1
 datapeas:  .db %00100100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
@@ -4554,4 +4543,4 @@ templevels:
 
   .end
 
-.end
\ No newline at end of file
+.end