wormy 0.98.227
[wormy.git] / wormy.z80
index 7e1367304d19046ea3b6e1c6cfa0d6fe05ccb008..0aba3e5c163e710a33901241408092ec0724e774 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -16,8 +16,8 @@
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
-; Version                  :                                      98% (0.98.226)
-; Release Date             :                                    2002 February 26
+; Version                  :                                      98% (0.98.227)
+; Release Date             :                                    2002 February 27
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
 ; Web Page                 :                                       www.shiar.org
 ;     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)
 ;  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?)
 ;
 ; * correct team winners
 ;  * level compression
-;   * arrow to offscreen peas
-;    * sound
-;     * startpos
-;      * pause in linkplay
-;       * coop (DON'T COUNT ON IT)
+;   * ubersized bouncies ;)
+;    * arrow to offscreen peas
+;     * w00t AI
+;      * sound
+;       * startpos
+;        * pause in linkplay
+;         * coop (DON'T COUNT ON IT)
 
 ;_______________________________________________________________________________
 ;  _/_/_____ __   _ _______        _     _ ______  _______
@@ -207,17 +213,17 @@ _EXLP              = $4493 ;swap (hl),(de) b times
 _GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
 _OP1TOOP6          = $4263
 
- #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 id2        ;yas2 level identifier - this'll add (65) bytes
+ #define buffer     ;use display buffer, otherwise write directly to screen (11)
+ #define readymask  ;"greys" out the field before starting a level (20)
+;#define readytext  ;-displays "prepare" before level starts (42)
+ #define coolzgfx   ;nice graphics for game over screen (98)
  #define spprotect  ;options not changable for singleplayer modes
 ;#define intlevels  ;-internal levels
-;#define readytext  ;-displays "prepare" before level starts
- #define id2        ;yas2 level identifier (adds 65 bytes)
                     ;-to become invincible, define the magic word :D
 
-levelhead  = 'w'
-levelhead2 = 97 ;wormy levels header = "0"
+levelhead   = 'w'
+levelhead2  = 97 ;wormy levels header = "0"
 
 ;_______________________________________________________________________________
 ; _______ _______  _____   ______ _______  ______ _______
@@ -272,7 +278,7 @@ drawctfpea2 = peaspos+6
 
 ;--- layout --------------------------------------------------------------------
 
-;(wormN)             set:
+;(wormN)      offs:  set:
 heading     =   0   ;level*
 pos         =   2   ;level*
 pos2        =   4   ;level
@@ -303,17 +309,17 @@ wormsize    =   30 ;^mark^
 start:         ;turn back NOW!
   nop      ;and so it begins...
   jp  Start
-#ifdef id2
+#ifndef id2
+  ld  bc,$5242
+  rst 10h
+ .dw  WormIcon
+#else
   ld  (bc),a
   nop
   ld  d,h
   rst 10h
  .dw  WormIcon
  .dw  WormData
-#else
-  ld  bc,$5242
-  rst 10h
- .dw  WormIcon
 #endif
   ld  d,a
   ld  c,a
@@ -328,7 +334,7 @@ start:              ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 98% .225",0
+ .db  " 98% .227",0
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
@@ -2159,7 +2165,7 @@ CheckExit:
   rla  ;=$17 (c=EXIT-key)
       ;or$A7 (c=0)
   jp  c,GameLoop
-  jp  Exit ;jr?
+  jr  Exit
 
 ;--- pause menu ----------------------------------------------------------------
 
@@ -2781,7 +2787,10 @@ drawworm:
   inc hl
   ld  (hl),b
   inc hl
-  cal resbit
+  ;(resbit)
+  ld  a,h
+  and (ix+storepos)
+  ld  h,a
   ld  (ix+head),l
   ld  (ix+head+1),h
 
@@ -2810,7 +2819,10 @@ removetailbit:
   inc hl
   ld  b,(hl)
   inc hl
-  cal resbit
+  ;(resbit)
+  ld  a,h
+  and (ix+storepos)
+  ld  h,a
   psh hl
   cal res4pixels ;rm last bit
   pop hl
@@ -2976,12 +2988,11 @@ sel_otherpea:
   jr  c,hitflag
 ;no peas hit:
   ld  a,e ;peek a (that's x86asm for pop\push ;)
-  bit 1,a ;%10 = carrying flag?
+  bit 1,a ;%1O = carrying flag?
   jr  z,_wormdead ;if not just die
-  xor %11 ;drop flag
-  ld  (ix+reserv),a
+  and %1 ;which flag?
   ld  hl,drawctfpea1 ;restore #1
-  jr  z,nottheotherflag ;which flag? (=and %1)
+  jr  nz,nottheotherflag
   inc hl ;ld hl,drawctfpea2
   inc hl ;restore #2
 nottheotherflag:
@@ -2994,14 +3005,16 @@ hitflag: ;correct pea hit
   xor %11 ;invert flag taken + ownflag
   ld  (ix+reserv),a
   and %10 ;just returned?
-  psh af ;safe z-flag
   psh bc ;safe position
+  psh af ;safe z-flag
   cal DrawPea ;remove
-  ld  e,20 ;flag captured+returned
-  cal z,IncScore
-  pop bc
   pop af
+  pop bc
   ret nz ;flag taken: continue game ;drawworm
+  ld  e,20 ;flag captured+returned
+  psh bc
+  cal IncScore
+  pop bc
   ld  a,3 ;draw delay
   ld  (drawctfpea1),a ;redraw..
   ld  (drawctfpea2),a ;..both flags
@@ -3024,7 +3037,7 @@ hitworm:
 PeaY =$-2
 PeaX =$-1
   cal chkpeahit
-  jr  nc,_wormdead
+  jp  nc,wormdead
 
 ;--- take pea ------------------------------------------------------------------
 
@@ -3088,12 +3101,12 @@ chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
 ;--- misc ----------------------------------------------------------------------
 
 checkhitlapline:
-  ld  a,(peaspos) ;63
+  ld  a,(peaspos) ;63 usually
   sub b ;x==63
   jr  z,nextlaphalf
-  inc a
-  ret nz
-nextlaphalf:
+  inc a ;(more checkin' since wormies just have those _huge_ heads ;)
+  ret nz ;x!=62
+nextlaphalf: ;x==62|63; a=0
   ld  a,(peaspos+1) ;yline
   cp  c ;ypos
   ld  a,1
@@ -3120,21 +3133,15 @@ checklap:
 ; |       |    \_ |_____| |_____  ______|
 ;_______________________________________________________________________________
 
-releasekeys:
-  halt
+releasekeys: ;---------->promise me you'll never let go...
+  halt ;-------------------->i won't let go....
   ld  a,%10000000    ;all key-masks
   out (1),a
-  in  a,(1)
+  in  a,(1) ;--------------->i'll never let go.....
   inc a              ;cp %11111111 (no keys pressed)
   jr  nz,releasekeys ;keep waitin
   cal GET_KEY        ;clear buffer
-  ret
-
-resbit:
-  ld  a,h
-  and (ix+storepos)
-  ld  h,a
-  ret
+  ret ;--------------------->*die* (we are VICTORIOUS! muha)
 
 randompos:
   ld  b,a
@@ -3195,11 +3202,16 @@ handledworm =$-2
   ld  (ix+pos2),a ;y2
   ld  (ix+pos2+1),a ;x2
 
+  ld  a,(handledworm) ;who are we? (1-4)
+  cpl ;invert (just bit 0 actually)
+  and 1 ;group 1 (1,3) or 0 (2,4)
+  ld  (ix+reserv),a ;reset halflap|flags to starting settings
+
   inc (ix+died)
   dec (ix+lives)
   psh af
-  ld  a,(gametype)
-  cp  gamectf ;ctf no death penalty
+  ld  a,(gamecar)
+  and _datadecs ;ctf and race no death penalty
   cal nz,DecScore10
   pop af
   ret nz ;HandleWorm done
@@ -4375,6 +4387,7 @@ wtPicture: ;title
 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
 
+#ifdef coolzgfx
 wtWormy: ;g/o
 .db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
 .db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
@@ -4383,10 +4396,8 @@ wtWormy: ;g/o
 .db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
 .db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
 .db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
-
 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
-
-#ifndef coolzgfx
+#else
 txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #endif
 
@@ -4504,7 +4515,7 @@ _datasingl  =  %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
 _dataPctf   =  %00001000 ;ctf peas=1
 __bitPctf   =  3
 _datatime   =  %00010000 ;time incs score (timematch)
-;reserved      %00100000 ;for future use
+_datadecs   =  %00100000 ;decrease score on death=1
 _datafood   =  %01000000 ;food present=0 (6!)
 _dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
 
@@ -4517,19 +4528,19 @@ _dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
                ;      | | | |  |  |  �turn speed (8=def)
                 ;     | | | |  |  |  |  �score limit (0=none)
 gamesingle  =  0 ;    | | | |  |  |  |  |
-datasingle:.db %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+datasingle:.db %00100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
 gamepeas    =  1
-datapeas:  .db %00000100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
+datapeas:  .db %00100100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
 gametron    =  2
-datatron:  .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+datatron:  .db %01110100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
 gamedeathm  =  3
-datadeathm:.db %01000000,3,2,1,-1,42, 8, 0 ;Deathmatch (3 lives, 50 growth)
+datadeathm:.db %01100000,3,2,1,-1,42, 8, 0 ;Deathmatch (3 lives, 50 growth)
 gamefoodm   =  4
-datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+datafoodm: .db %00100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
 gamemfoodm  =  5
-datamfoodm:.db %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
+datamfoodm:.db %11100010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
 gametimem   =  6
-datatimem: .db %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
+datatimem: .db %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
 gamerace    =  7
 datarace:  .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
 gamectf     =  8