todo update
[wormy.git] / wormy.z80
index 7473d013ec01d4fc09369a84f27737e66ceab965..754b085679741688d83b8774dc65634b44b90573 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -16,8 +16,8 @@
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
-; 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
@@ -27,9 +27,9 @@
 ; 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  (12k) : efef32a8c541b4585087f55deb31f51d
+; Files                    : wormy.txt (9283) : ed15e942a99b40e5a584c597cb13df46
+;                            wormy.z80 (100k) : 977109a7d25f3227fe817edbcc36ad9a
+;                            wormy.86g (8914) : fbff7c36687c1e7e3113c29069021718
 ;_______________________________________________________________________________
 
 ;--- notes ---------------------------------------------------------------------
 ;         crazy optimizations and weird coding, it may be harder to
 ;          understand than the average blob of code. This is probably _not_
 ;           the best source to learn z80 from. w00t the Shyer Way (tm).
-;          * Email me. If you've got suggestions, tell me.
+;          * Email me. If you've got suggestions|patches|questions: tell me.
 ;           * Don't scroll down if you get scared easily.
 
 ;--- index ---------------------------------------------------------------------
 
-;-* TO_DO
-; | future features
-;--* #INCLUDE
-;---* STORAGE
-;   | permanent
-;   | temporary
-;   | layout
-;----* PROG_START
-;    | search levels
-;-----* LEV_SELECT
-;------* MORE_INIT
-;      | trig tables
-;-------* MAIN_MENU
-;       | draw menu
-;       | options menu
-;       | main menu
-;       | display current settings
-;       | handle menukeys
-;       | change name
-;--------* MISC_PROCS
-;---------* START_GAME
-;         | link
-;         | client
-;         | set/send worms
-;         | host
-;         | load game
-;         | draw level
-;         | prepare
-;----------* GAME_LOOP
-;-----------* KEYS
-;           | pause menu
-;------------* GAME_OVER
-;            | who won?
-;            | display worms
-;            | quit
-;-------------* WORM_STUFF
-;--------------* WORM_ALIVE
-;              | move worm
-;              | draw worm
-;---------------* BOUNCYBALL
-;----------------* WORMY_HIT
-;                | multifood
-;                | ctf
-;                | main
-;                | foodmatch|SP
-;                | take pea
-;                | misc
-;-----------------* PROCS
-;------------------* SCORE
-;-------------------* DISPLAY
-;--------------------* DRAW
-;                    | pixel
-;                    | findpixel
-;                    | objects
-;                    | circle
-;                    | box
-;                    | fatline
-;                    | line
-;---------------------* LINK!
-;                     | multiple bytes
-;                     | foo
-;                     | send
-;                     | recv
-;                     | common
-;----------------------* INT_LEVELS
-;-----------------------* DATA
-;                       | graphics
-;                       | menus
-;                       | text
-;                       | foo
-;                       | game settings
-;------------------------* THAT'S_ALL
+; * TO_DO                       :                                future features
+;  * #INCLUDE
+;   * STORAGE                   :                   permanent; temporary; layout
+;    * PROG_START               :                                  search levels
+;     * LEV_SELECT
+;      * MORE_INIT              :                                    trig tables
+;       * MAIN_MENU             :    draw menu; options menu; main menu; display
+;                                 current settings; handle menukeys; change name
+;        * MISC_PROCS
+;         * START_GAME          : link; client; set/send worms; host; load game;
+;                                                            draw level; prepare
+;          * GAME_LOOP
+;           * KEYS              :                                     pause menu
+;            * GAME_OVER        :                  who won?; display worms; quit
+;             * WORM_STUFF
+;              * WORM_ALIVE     :                           move worm; draw worm
+;               * BOUNCYBALL
+;                * WORMY_HIT    :  multifood; ctf; main; foodmatch|SP; take pea;
+;                                                                           misc
+;                 * PROCS
+;                  * SCORE
+;                   * DISPLAY
+;                    * DRAW     :        pixel; findpixel; objects; circle; box;
+;                                                                  fatline; line
+;                     * LINK!   :        multiple bytes; foo; send; recv; common
+;                      * INT_LEVELS
+;                       * DATA  :      graphics; menus; text; foo; game settings
+;                        * THAT'S_ALL
 
 ;_______________________________________________________________________________
 ; _______  _____       ______   _____
 ;    |    |_____| ____ |_____/ |_____|
 ;_______________________________________________________________________________
 
-; 98% = CURRENT
-;     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
-;  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
+; 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] 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
@@ -336,17 +286,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
@@ -366,11 +316,12 @@ 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
@@ -917,30 +868,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:
@@ -1082,15 +1033,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:
@@ -1103,15 +1054,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:
@@ -1211,9 +1162,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
 
@@ -1221,6 +1172,8 @@ changekeys:
   cal getwormname
   ld  hl,txtKleft
   cal getcustomkey ;left
+  ld  a,93
+  ld  (_penCol),a
   cal getcustomkey ;right
 ; jr  dispmenusets
 
@@ -1430,15 +1383,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
@@ -2012,6 +1965,7 @@ levelhasbeensetup:
 leveldone:
   psh hl                        ; >> levelp new
   cal forceshowstats
+  cal handlethoseneatlittleballs
 
   ld  a,(gamecar)
   rla ;and _dataPmult
@@ -2134,11 +2088,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
@@ -2533,7 +2483,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:
@@ -2854,8 +2804,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
@@ -3151,7 +3105,9 @@ releasekeys: ;---------->promise me you'll never let go...
 randompos:
   ld  b,a
 Random: ;(2..b+2)
-  ld  a,r
+  ld  a,r ;0..127
+  scf ;not just even values:
+  rla ;6543210C
 Seed =$+1
   add a,0
   ld  (Seed),a
@@ -3307,16 +3263,24 @@ multpealoop:
   ret
 
 NewPea:
+  ld  de,$293A ;counter :)
+newpealoop:
+  dec de
+  ld  a,d
+  or  e
+  jp  z,Exit ;break after 10554 tries to prevent freeze when field filled
   ld  a,(FieldWidth)
-  add a,127-4
+  add a,126
   cal randompos
   ld  h,a
   ld  a,(FieldHeight)
-  add a,56-4
+  add a,55
   cal randompos
   ld  l,a
+  psh de
   cal CheckPea
-  jr  nz,NewPea
+  pop de ;counter
+  jr  nz,newpealoop
   cal sendnewpeaoverlink
   ld  (PeaY),hl
 DrawPea: ;hl=(PeaY)
@@ -4283,7 +4247,7 @@ linktest:
   out (1),a            ;select keys
   in  a,(1)            ;input
   bit 6,a              ;exit key
-  jp  z,Exit           ;break!
+  jr  z,linkerr                ;break!
 linkfine:
   in  a,(7)
   and %11
@@ -4460,7 +4424,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