X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/0b76ac3472287058950de72e470b8980b2246351..bf4b72fa8be434aad2c0415684c8625ae8df77a7:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 3dbe7ee..26d374f 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,50 +1,79 @@ -; Title : Wormy -; Version : 93% -; Release Date : summer 2001 -; Filename : wormy.86p (5kb) -; Author(s) : Shiar -; Email Address : shiar0@hotmail.com -; ICQ UIN : #43840958 -; 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 ----------- ;----------------------------- -; 93% = DONE +; 97% = DONE -; * internal levels -; * check levels/gametype -; * enough hiscore saves! -; * complete readme -; 1% * misc (pollish, bugs, &&&) +; 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 -; 2% * fix deaths linkplay and transmit game/level data -; 2% * make linkplay available for all gametypes (not just deathmatch) -; * CTF -; 1% * fix pea XOR problem in ctf (+dom?) -; * fix wormstop -; 1% * domination?: take control points by running over them and hold them +; 1% * fix transmit game/level data (?) +; * >Somehow do a lot of testing with 2 calcs< *sigh* ;100% = bugs fixed + levels done +; arrow to offscreen peas +; multiple peas in sp level +;>110%: sound, startpos (?) +;>120%: coop (DON'T COUNT ON IT) + ;----------------------------- ;----------------------------- -;--------- W O R M --------- +;------- W O R M Y --------- ;----------------------------- ;----------------------------- +;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 hlines ;horizontal-line routine for more speed drawing boxes +#define coolzgfx ;nice graphics for game over screen +multpeas +;#define intlevels ;internal levels ;#define readytext ;displays "prepare" before level starts ;#define invincible ;worms cannot die =) +;#define optdie ;in race games worms don't die when they run into each other #define cal call #define psh push @@ -52,13 +81,12 @@ #include "asm86.h" #include "ti86asm.inc" - -_SHRACC = $4383 -_SHLACC = $438B +_SHRACC = $4383 ;4x srl a +_SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 _divAby10 = $4DAF ;a=a/10 _HLTIMES10 = $41BF ;hl=hl*10 -_cphlde = $403C +_cphlde = $403C ;cp hl,de _clrWindow = $4A86 ;clear screen _asapvar = $D6FC ;own name (worm) _MOV4B = $429B ;4x ld (de),(hl) @@ -75,11 +103,12 @@ _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source _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 +_MM_LDIR_SET_SIZE = $524D ;_SET_MM_NUM_BYTES + _mm_ldir _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1 -_RAM_PAGE_7 = $47F3 +_RAM_PAGE_7 = $47F3 ;"""" 7 _PTEMP_END = $D29A ;end of VAT _load_ram_ahl = $462F ;ahl->page+hl -_writeb_inc_ahl = $5567 ;ld (ahl),c +_writeb_inc_ahl = $5567 ;ld (ahl++),c _jforce = $409C ;TI-OS stack restored _EXLP = $4493 ;swap (hl),(de) b times _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl @@ -97,69 +126,81 @@ worm2 = $AC1F ;-AC3B (1F) worm3 = $AC3E ;-AC59 (1F) worm4 = $AC5D ;-AC77 (1F) balls = $AC7C ;-ACFF (3x43d) -SinCosTable = $AD00 ;-AE00 (4x40) - ;free $AE01 ;-AFFF (1FF) +SinCosTable = $AD00 ;-AE00 (4*40) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AE05 (4+) (peas) +;free = $AE06 ;-AFFF (1FA) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - - ;program $D748 ;-E7FF (106D+4A) - ;free $E800 ;-EFFF (800) +;free = $BF91 ;-BFFF (6F) +;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?!? -peaspos = $AE01 +;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 namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif +lefttotalb = $AFFF ;----------------------------- ;------- program start ------- ;----------------------------- -.org _asm_exec_ram + .org %1101011101001000 -wormVhost = 093 -wormVclient = 193 - -start: - nop - jp Start - .dw 1 - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- beta 93%",0 +start: ;turn back NOW! + nop ;and so it begins... + jp Start + ld bc,$5242 + rst 10h + .dw WormIcon + ld d,a + ld c,a + ld d,d + ld c,l + ld e,c + jr nz,$+100 + ld a,c + jr nz,$+$55 + ld c,b + .dw 16713 + .db %1010010 + jr nz,$+47 + dec l + .db " 97% .13",0 WormIcon: - .db 9,2 - .db %10010110,%01101111 - .db %10110101,%01001011 - .db %01110011,%01001001 - .db %00000011,%10000000 - .db %00000001,%11100000 - .db %00111000,%11111000 - .db %01111110,%00111111 - .db %11101111,%00001111 - .db %11000011,%10000000 + .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 = 93 ;wormy levels header = "93" +levelhead2 = 95 ;wormy levels header = "95" int_handler: - ex af,af' - in a,($03) + ex af,af' + in a,($03) bit 3,a - jp z,$0039 + jp z,$0039 res 0,a out ($03),a - jp $0039 + jp $0039 int_end: Start: @@ -170,22 +211,22 @@ Start: im 1 ld a,$D4 ld h,a - ld l,0 ;ld hl,$D400 + ld l,0 ;ld hl,$D400 ld d,a - ld e,1 ;ld de,$D401 + ld e,1 ;ld de,$D401 ld b,e - ld c,l ;ld bc,$0100 - dec a ;ld a,$D3 + ld c,l ;ld bc,$0100 + dec a ;ld a,$D3 ld (hl),a ldir ld hl,int_handler ld d,a - ld e,a ;ld de,$D3D3 + ld e,a ;ld de,$D3D3 ld bc,int_end-int_handler ldir - inc a ;ld a,$D4 + inc a ;ld a,$D4 ld i,a - im 2 + im 2 ;...it *does* work ;) cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start @@ -240,24 +281,18 @@ stringfound: inc ix _searchnext: cal _RAM_PAGE_7 - jr searchnext + jr searchnext loadgametype: psh de - inc bc - inc bc cal _Get_Word_ahl ;ld de,(ahl++) psh af - ld a,d - or e - jr z,defaultlevels ld a,e ;set new level ld (bc),a inc bc ld a,d ld (bc),a - dec bc -defaultlevels: + inc bc pop af pop de ;counter dec d ;8x @@ -268,83 +303,64 @@ searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels + ld ix,templevels-6 +#else + ld ix,templevels-3 +#endif + 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 cal _clrWindow - ld hl,templevels-3 - psh hl - ld hl,$0020 + ld hl,$0320 ld (_penCol),hl ld hl,txtLevsel - cal _vputs ;"< Select levels: >" + cal _vputs ;"< SELECT LEVELS >" + ld hl,$FC00+(2*16) + ld b,16*9 + cal menuinvloop + ld hl,$FC00+(56*16) + cal hr ld hl,$0601 ;x=1 ld (_penCol),hl - pop hl dispnextlevel: - ld a,(hl) + ld de,3 + add ix,de + ld a,(ix) + ld b,a inc a ;cp 255 - jr z,_levselect - ld a,(hl) ;ade=(hl) + jr z,__levselect displevel: - inc hl - ld d,(hl) - inc hl - ld e,(hl) - inc hl - psh hl - ex de,hl ;ahl=ade=(hl) - cal _load_ram_ahl ;hl=ahl - ld b,(hl) ;b=title size - cal _vputs ld hl,_penCol ld (hl),$01 ;x=1 inc hl ld a,(hl) add a,6 ld (hl),a ;y+6 + cp 49 ;bottom of screen + jr nc,_levselect ld hl,availevels inc (hl) - pop hl + ld a,b ;(ix+0) + ld h,(ix+1) + ld l,(ix+2) ;ahl=(ix) + cal _load_ram_ahl ;hl=ahl + cal _vputs jr dispnextlevel -levup: - cal menupos - dec b ;up - ld a,b - cp -4 - jr nz,levselected - inc b ;undo - jr levselected -levdown: - cal menupos - inc b ;down - ld a,b - cp -3 -availevels =$-1 - jr nz,levselected - dec b ;back up -levselected: - jp menupos - -_levselect: - ld b,-3 ;level selected - cal menupos -levselect: - halt \ halt - psh bc - cal GET_KEY - pop bc ;GET_KEY destr. b - cp K_UP - cal z,levup - dec a ;K_DOWN - cal z,levdown - cp K_SECOND-1 - jr z,loadlevel - cp K_EXIT-1 - ret z - cp K_ENTER-1 - jr nz,levselect -; jr z,loadlevel +loadlevel1: + psh ix + pop hl + ld b,-2 + jr loadlevel -loadlevel: +readylevelfile: ;selected level at ahl +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -352,37 +368,103 @@ loadlevel: add a,e ;*3 ld e,a ld d,0 ;de=sellev*3 - ld hl,templevels-3 add hl,de ld a,(hl) ;ade=(hl) - or a ;levelfile on page 0 (=internal) - jr z,levelloaded - inc hl ld d,(hl) inc hl ld e,(hl) ex de,hl ;ahl=ade skiptitle: - ld b,a ;psh ahl + ld d,a ;psh ahl psh hl cal _GETB_AHL ;ld a,(ahl) pop hl or a - ld a,b ;pop ahl + ld a,d ;pop ahl psh af cal _INC_PTR_AHL ;ahl++ pop af ;cp 0 jr nz,skiptitle ;goto #0-terminator + ret + +levup: + cal menupos + dec b ;up + ld a,b + cp -3 + jr nz,levselect + inc b ;undo + jr levselect +levdown: + cal menupos + inc b ;down + ld a,b + cp -2 +availevels =$-1 + jr nz,levselect + dec b ;back up +levselect: + cal menupos + ld hl,$3900 + ld (_penCol),hl + pop hl + psh hl + cal readylevelfile + cal _load_ram_ahl ;hl=ahl + ld de,$FFA0 ;desc.text + xor a +levdescclearloop: + ld (de),a ;empty + inc de + cp d ;de>$FFFF (offscreen) + jr nz,levdescclearloop + cal _vputs + jr levselectmenu+1 +__levselect: +#ifdef intlevels + ld ix,templevels-6 ;reset 2 1st page +#else + ld ix,templevels-3 +#endif +_levselect: + ld b,-2 ;level selected + jr levselect +levselectmenu: + psh hl + psh bc + cal ubergetkey + pop bc ;GET_KEY destr. b + dec a ;cp K_DOWN + jr z,levdown + sub K_UP-1 + jr z,levup + pop hl + inc a ;cp K_RIGHT + jp z,levelselectmenu + cp K_ENTER-K_RIGHT + jr z,loadlevel + sub K_EXIT-K_RIGHT + jp z,ExitNoStats + inc a ;cp K_SECOND + jr nz,levselectmenu +; jr z,loadlevel + +loadlevel: + cal readylevelfile + or a ;levelfile on page 0 (=internal) + jr z,levelloaded + cal skiptitle ;skip description cal _Get_Word_ahl ld (leveldataSize),de - ld d,8 ;counter - ld bc,datalevels-2 + + ld d,9 ;counter + ld bc,datalevels cal loadgametype - ld (hilvlposa),a + ld (hilvlposa),a ;singleplayer levels ld (hilvlposhl),hl - ld d,4 + ld d,5 cal loadgametype cal _SET_ABS_SRC_ADDR ;levelsstart @@ -391,8 +473,7 @@ skiptitle: cal _SET_ABS_DEST_ADDR ;store in mem. ld hl,0 leveldataSize =$-2 - cal _SET_MM_NUM_BYTES - cal _mm_ldir + cal _MM_LDIR_SET_SIZE cal _LOAD_ABS_SRC_ADDR ;->ahl ld (hiscrposa),a @@ -412,23 +493,21 @@ levelloaded: ld hl,datasingle+3 ld b,8 + ld de,8 setdeflevels: ld (hl),1 ;def=level#1 - inc hl - inc hl - inc hl - inc hl + add hl,de ;next dnz setdeflevels ;----------------------------- ;----- build trig tables ----- ;----------------------------- - ld hl,TrigPrecalc - ld de,SinCosTable - psh de ; >> 1 - 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: @@ -437,7 +516,7 @@ MirrorSineWave: ld (de),a inc de dnz MirrorSineWave - pop hl ; << 0k + pop hl ;SinCosTable ld b,128+64 NegativeSineWave: xor a @@ -458,28 +537,54 @@ DisplayMenu: ;---draw menu--- ld hl,wtPicture ld bc,16*16 ldir - ld hl,$FC00+$160 + ld hl,$FC00+$010 ;(*,01) cal hr - ld hl,$FC00+$3E0 + ld hl,$FC00+$160 ;(*,22) cal hr - + ld hl,$FC00+$3E0 ;(*,62) + cal hr +dispmainmenu: + ld a,(Gametype) + dec a ;will be inced @changegame + cal changedgame + ld hl,changegame ;dispmenusets ;mainMenu + psh hl ;jump here after ret ld hl,txtMenu ld ix,posMenu - ld b,6 +;Mode|Level|Limit|Worms|worm #|controls +; jr dispmenucommon ;cal + +dispmenucommon_: + ld b,36*16/4 +dispmenucommon: + ld de,$FD80 ;begin pos + xor a +clroldmenuloop: + ld (de),a + inc de + ld (de),a + inc de + ld (de),a + inc de + ld (de),a + inc de + dnz clroldmenuloop + + ld b,(ix) dispmenuloop: - ld d,(ix) + ld d,(ix+1) inc ix - ld e,(ix) + ld e,(ix+1) inc ix ld (_penCol),de - cal _vputs ;Mode \ Level \ Limit \ Worms \ worm # \ controls + cal _vputs dnz dispmenuloop - - ld b,0 ;b=menu# - jr _dispmenusets ;mainMenu +; ld b,0 ;b=menu# + ret hr: ;draw horizontal line at hl ld b,16 +; jp menuinvloop ;shorter but not good for pausescreen hrloop: ld (hl),-1 inc hl @@ -488,6 +593,221 @@ hrloop: ;--- menu loop --- +dispoptionmenu: + ld hl,txtoMenu + ld ix,posoMenu +;Back|Lives|Limit|Speed|Rotation|Growth + cal dispmenucommon_ + +dispomenusets: + cal clrold + + ld hl,$1E3E + ld (_penCol),hl + cal loadgamecar + psh hl + cal cshowA0 ;lives + + ld hl,$2A3E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl \ inc hl \ inc hl + psh hl + ld a,(hl) ;(Speed) + inc a ;1..99 + jr nz,dispspeed + ld hl,txtDef + cal _vputs + jr dispspeeddone +dispspeed: + cal cshowA0 +dispspeeddone: + + ld hl,$363E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + psh hl + ld a,(hl) ;(growth) + inc a ;-1=None; 0..98->1..99 + cal cshowA0 + + ld hl,$303E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + psh hl + ld a,(hl) + cp 8 + jr nz,dispturn + ld hl,txtDef + cal _vputs + jr dispturndone +dispturn: + cal cshowA0 ;turn speed +dispturndone: + + ld hl,$243E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + ld a,(hl) ;(scorelimit) + or a + psh af + cal cshowA0 ;limit + pop af ;a==0? + jr z,optionMenu ;do not display 0 behind 'None' + ld a,'0' + cal _vputmap ;x10 + +optionMenu: + cal menupos + cal menucall + jr nz,notoselect +oselect: + cal menupos + ld a,b + or a ;1st item? + jp z,dispmainmenu ;mainMenu + jr optionMenu +notoselect + cp K_EXIT + jp z,dispmainmenu + psh af + cal menupos + cal loadgamecar + inc hl + pop af + sub K_LEFT + jr z,seloleft + dec a ;K_RIGHT + ld a,b + jr nz,optionMenu + +seloright: + dec a + jr z,changelives + dec a + jr z,changelimit + dec a + jr z,changespeed + dec a + jr z,changeturn + dec a + jr z,changegrowth + +seloleft: + ld a,b + dec a + jr z,bchangelives + dec a + jr z,bchangelimit + dec a + jr z,bchangespeed + dec a + jr z,bchangeturn + dec a + jr z,bchangegrowth +_optionMenu: + jr optionMenu + +changelives: + cal loadgamecar ;a=(hl) + inc a + cp 100 + jr nc,optionMenu ;>99 +changedlives: + ld (hl),a +_dispomenusets: + jp dispomenusets ;optionMenu +bchangelives: + cal loadgamecar + sub 1 ;dec does not set cf + jr c,optionMenu ;<0 + jr changedlives + +changelimit: + cal changelimitInit + inc a + cp 100 + jr nc,optionMenu ;>99 +changedlimit: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangelimit: + cal changelimitInit + sub 1 ;dec does not set cf + jr c,optionMenu ;<0 + jr changedlimit +changelimitInit: + cal loadgamecar + ld de,6 + add hl,de + ld a,(hl) ;(scorelimit) + ret + +changespeed: + cal changespeedInit + inc a + cp 20 + jr nc,_optionMenu ;>98 +changedspeed: + dec hl ;(Speed) + ld (hl),a + jr _dispomenusets ;optionMenu +bchangespeed: + cal changespeedInit + dec a + cp -2 +__optionMenu: ;w/ zf + jr z,_optionMenu ;<-1 + jr changedspeed +changespeedInit: + cal loadgamecar + ld de,3 + add hl,de + ld a,(hl) ;(Speed) + inc hl ;=saves 2 bytes :P + ret + +changeturn: + cal changespeedInit + inc hl ;(turnspeed) + ld a,(hl) + inc a + cp 26 + jr nc,_optionMenu ;>25 +changedturn: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangeturn: + cal changespeedInit + inc hl + ld a,(hl) + dec a + cp 3 + jr c,_optionMenu ;<3 + jr changedturn + +changegrowth: + cal changespeedInit + ld a,(hl) + inc a + cp 99 + jr nc,_optionMenu ;>98 +changedgrowth: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangegrowth: + cal changespeedInit + ld a,(hl) + dec a + cp -2 + jr z,__optionMenu ;<-1 + jr changedgrowth + +;--- + mainMenu: cal menupos cal menucall @@ -495,11 +815,24 @@ mainMenu: select: ;2nd/enter cal menupos ld a,b - sub 4 ;4th item? + dec a ;2nd item: level + jp z,dispoptionmenu + sub 3 ;5th item: wormname jp z,changeworms - dec a ;5th? + dec a ;6th: controls jp z,changekeys - jp LetsGetThisPartyOn ;1/2/3/5 + 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 @@ -508,9 +841,9 @@ notselect cal loadgamecar inc hl pop af - cp K_LEFT + sub K_LEFT jr z,selleft - cp K_RIGHT + dec a ;K_RIGHT ld a,b jr nz,mainMenu @@ -518,9 +851,9 @@ selright: or a jr z,changegame dec a - jp z,changelevel ;&&&jr?? + jr z,changelevel dec a - jr z,changelives + jr z,changelink dec a jr z,changenrworms ; dec a @@ -543,7 +876,7 @@ selleft: dec a jr z,bchangelevel dec a - jr z,bchangelives + jr z,bchangelink dec a jr z,bchangenrworms ; dec a @@ -555,72 +888,68 @@ bchangecurworm: jr nz,changedcurworm ;save >0 jr mainMenu -changenrworms: +changenrwormsInit: ld a,(Gametype) - cp 2 - jr c,mainMenu ;type 0/1 - ;hl=nrworms - ld a,(hl) - inc a - cp 5 - jr nc,mainMenu ;may not be >4 -changednrworms: - ld (hl),a -_dispmenusets: - jr dispmenusets ;mainMenu + cp 3 + ld a,(hl) ;hl=nrworms + ret bchangenrworms: - ;hl=nrworms - ld a,(hl) + cal change4spOnly + ld a,(hl) ;hl=nrworms dec a ;0-3 - jr nz,changednrworms ;save >0 + cp 2 + jr nc,changednrworms ;save >=2 _mainMenu: jr mainMenu -changegame: - ld a,0 -Gametype =$-1 - inc a -changedgame: - and 7 ;mod 8 - ld (Gametype),a - jr dispmenusets ;mainMenu -bchangegame: +change4spOnly: ld a,(Gametype) - dec a - jr changedgame + cp 3 + ret nc + pop hl ;cal + jr _mainMenu ;don't change for singleplayer + +changelink: +bchangelink: + cal change4spOnly + dec hl ;inced earlier + dec hl ;gameCar + ld a,1 ;change LS-bit (=link) + xor (hl) ;0=1; 1=0 + ld (hl),a +_dispmenusets: + jr dispmenusets ;mainMenu -changelives: - cal changelivesInit +changegame: + ld a,(Gametype) inc a - cp 100 - jr nc,_mainMenu ;&& _? -changedlives: - ld (hl),a + cal changedgame + jr z,changegame jr dispmenusets ;mainMenu -bchangelives: - cal changelivesInit +changedgame: + 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 + cp (hl) + ret +bchangegame: + ld a,(Gametype) dec a - jr z,_mainMenu - jr changedlives -changelivesInit: - cal loadgamecar ;c=(gameCar) -;a=(hl)=(Gametype+1)=(wormbeglives) - ld a,(Gametype) ;&&& - cp 3 - ld a,(hl) - ret nc ;change lives - pop hl ;restore stack - jr _mainMenu ;singleplayer (no limit) + cal changedgame + jr z,bchangegame + jr dispmenusets ;mainMenu changelevel: inc hl ;hl=loadgamecar+2 psh hl ld a,(hl) ;(curlevel) - ld hl,Gametype - ld d,0 - ld e,(hl) - ld hl,nrlevels - add hl,de + cal getnrlevels cp (hl) ;max level for sel.game pop hl jr z,_mainMenu @@ -635,13 +964,20 @@ bchangelevel: jr nz,changedlevel jr _mainMenu +getnrlevels: ;for current gametype at hl + ld hl,Gametype + ld d,0 + ld e,(hl) + ld hl,nrlevels + add hl,de + ret + getcustomkey: cal _vputs dec ix waitcustomkey: - halt \ halt psh hl - cal GET_KEY + cal ubergetkey pop hl or a jr z,waitcustomkey @@ -662,20 +998,7 @@ changekeys: ;---display current settings--- dispmenusets: - ld hl,$FD97 ;begin pos - ld de,7 ;bytes to add - ld a,35 ;nr of lines -clroldsettings: - ld c,9 ;bytes to clear -clroldsetsloop: - ld (hl),d ;=0 - inc hl - dec c - jr nz,clroldsetsloop - add hl,de - dec a - jr nz,clroldsettings - + cal clrold ld de,$183E ld (_penCol),de ld d,0 @@ -690,36 +1013,40 @@ clroldsetsloop: ld (CURtxtGame),hl ;save for g/o cal _vputs ;Singleplayer - cal loadgamecar - psh hl - ld hl,$243E - ld (_penCol),hl - cal cshowA ;liveslimit - sub '0' ;original A - ld l,a - ld a,c - and _datascore - ld a,' ' - jr z,limitok - ld a,'0' -limitok: - cal _vputmap ;x10 - ld hl,$2A3E ;worms ld (_penCol),hl - pop hl ;cal loadgamecar - inc hl + cal loadgamecar psh hl + inc hl ld a,(hl) add a,'0' cal _vputmap + ld hl,$243E + ld (_penCol),hl + rr c ;(gameCar) + ld hl,txtNo + jr nc,displink + ld hl,txtYes +displink: + cal _vputs + ld hl,$1E3E ;level ld (_penCol),hl - pop hl ;loadgamecar; hl++ - inc hl - ld a,(hl) ;(curlevel) - cal cshowA + pop hl ;loadgamecar + psh bc + ld d,0 + cal hlatlevel + ld a,(Gametype) + or a ;gamesingle + jr nz,displvlname + ld a,(Level) + cal cshowA0 + jr lvldisped +displvlname: + cal _vputs +lvldisped: + pop bc ld hl,$3032 ld (_penCol),hl @@ -730,13 +1057,13 @@ curworm =$-1 ld hl,$303E ld (_penCol),hl cal getwormname - ld hl,worm1name-18 - add hl,de + psh ix ;wormNname + pop hl ;ld hl,ix cal _vputs ld hl,$363E ;controls ld (_penCol),hl -; ld hl,txtMenu -; cal _vputs + ld hl,txtMenuR + cal _vputs jp mainMenu ;--- handle menukeys --- @@ -744,8 +1071,7 @@ curworm =$-1 menucall: psh bc menuwaitkey: - halt \ halt - cal GET_KEY + cal ubergetkey or a jr z,menuwaitkey pop bc ;GET_KEY destr. b @@ -820,62 +1146,53 @@ getwormname: ;of (curworm) ret changeworms: - cal _clrWindow - ld hl,txtEName - cal _puts ;"Enter name player " - ld a,(curworm) - add a,'0' - cal _putc - cal getwormname + psh ix + pop hl ;ld hl,ix + psh hl + ld b,8 +emptyname: + ld (hl),' ' + inc hl + dnz emptyname ld a,maxnamelength - cal entername - ld (ix),0 ;end mark - jp DisplayMenu - -entername: - ld h,1 - ld l,h ;) - ld (_curRow),hl ld (namelength),a enternameloop: + ld hl,$FF07 ;begin pos + ld a,6 ;nr of lines + cal clroldcustom + ld hl,$303E + ld (_penCol),hl + pop hl + psh hl + ld (ix),0 + cal __vputs + ld (ix),' ' ld a,'_' - cal _putc - ld hl,_curCol - dec (hl) + cal __vputmap nokeypressed: - halt - cal GET_KEY + cal ubergetkey or a jr z,nokeypressed + ld hl,namelength 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 + jr z,nameentered cp K_EXIT - ret z - - ld hl,namelength - dec (hl) - ret z + jr z,nameentered + dec (hl) ;(namelength) + jr z,nameentered ld hl,chartable ld e,a ld d,0 @@ -883,14 +1200,11 @@ continue: ld a,(hl) or a jr z,nokeypressed - ld (ix),a - cal _putc inc ix cal releasekeys jr enternameloop - chartable: .db 0,".<>!",0,0,0,0 ;down,L,R,up .db 0,"XTOJE0",0 ;enter..clear @@ -900,9 +1214,72 @@ chartable: .db $D9,"-PKFA6'" ;on..alpha .db "54321*",0,$D0 ;F5..more -;--proc +nameentered: + pop ix ;stringbegin + ld (ix+8),0 ;end mark + jp DisplayMenu + +;----------------------------- +;------- procs-n-stuff ------- +;----------------------------- + +ubergetkey: + halt ;woo hoo + halt ;save them batteries! yeah! + jp GET_KEY + +clrold: + ld hl,$FD97 ;begin pos + ld a,35 ;nr of lines +clroldcustom: + ld de,7 ;bytes to add +clroldsettings: + ld c,9 ;bytes to clear +clroldsetsloop: + ld (hl),d ;=0 + inc hl + dec c + jr nz,clroldsetsloop + add hl,de + dec a + jr nz,clroldsettings + ret + +hlatlevel: ;d must be 0 + psh hl ;loadgamecar + ld a,(Gametype) ;8bytes -> 7bytes + ld e,a + add a,a ;nc + add a,e + add a,a ;8->2bytes + add a,28+1 ;go to datalevels + ld e,a ;=de + sbc hl,de ;datalevels + cal _ldHLind ;ld hl,(hl) + pop de ;de=loadgamecar + inc de \ inc de + ld a,(de) ;(curlevel) + ld (Level),a + ld d,a ;begin level +skiplevelloop: + dec d ;levels to skip + ret z + cal skiplevel + jr skiplevelloop + ret ;hl=begin of correct level + +skiplvltitle: ;zf=singleplayer + ld a,(hl) + or a ;null-terminator + inc hl + jr nz,skiplvltitle + ret skiplevel: ;@hl - destr:ab - alter:hl + ld a,(Gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle inc hl inc hl inc hl @@ -915,8 +1292,7 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - ld a,c - cp _datasp + pop af ;cp (Gametype),0 jr z,skipworms inc b ;multiplayer lvl inc b @@ -932,18 +1308,21 @@ skipballs: skipflags: ld a,(Gametype) + cp gamerace + jr z,skiplaps cp gamectf jr nz,noflagstoskip inc hl inc hl +skiplaps: inc hl inc hl noflagstoskip: skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end inc hl inc hl @@ -953,7 +1332,7 @@ skipobjects: loadgamecar: ;in: (Gametype) -;out: Gametype+1=hl +;out: hl=dataTYPE ;build: c=(gameCar)=(hl-1) ; a=(wormbeglives)=(hl) ;destr: acdehl @@ -961,6 +1340,7 @@ loadgamecar: ld a,(Gametype) add a,a add a,a + add a,a ;8 bytes per mode ld e,a ld d,0 add hl,de @@ -980,48 +1360,47 @@ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - cal loadgamecar - ld b,a ;psh a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - ld l,b ;pop a - ld h,0 ;hl=a - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),hl ;set limit - - cal loadgamecar ;nc - psh hl - ld a,(Gametype) ;4bytes -> 3bytes - add a,a ;3->2bytes - add a,24+1 ;go to datalevels - ld e,a ;=de - sbc hl,de ;datalevels +setupworms: + ld hl,worm1set + ld de,worm1 + ld a,4 ;4x (all worms) +createwormsloop: + ex de,hl + ld bc,died ;0008 + add hl,bc +; ld b,0 + ld (hl),b ;died=0 + inc hl + ld (hl),b ;score=0 + inc hl + ld (hl),b ;score+1=0 + inc hl + ld (hl),2 ;delay=2 + inc hl + ld (hl),3 ;lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ld bc,18 + ldir ;copy 18 bytes + dec a ;loop + jr nz,createwormsloop - ld a,c ;(gameCar) - and _datascore - jr nz,scorelimitset - dec a ;ld a,$FF ;=no_limit - ld (scorelimit),a -scorelimitset: +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype + cal hlatlevel + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,0 +gameCar =$-1 + rra ;and _datalink + jr nc,_StartLevel - cal _ldHLind ;ld hl,(hl) - pop de ;de=loadgamecar - inc de \ inc de - ld a,(de) ;(curlevel) - ld (Level),a - ld d,a ;begin level -skiplevelloop: - dec d ;levels to skip - jr z,levelsskipped - cal skiplevel - jr skiplevelloop -levelsskipped: +;--------- link ------------ - psh hl ;1st level - ld a,c - and _datalink - jr z,GameOver +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow @@ -1041,73 +1420,192 @@ linkmatch: host: ld c,wormVclient cal Qsend - ld a,$18 - jr multiplayer + jr sethost client: ld hl,txtReceive cal _puts - ld a,$E6 -multiplayer: -; cal linkok - ld a,D0LD1L - out (7),a - ld (SwapPos),a - ld a,2 - ld (nrworms),a - -;----------------------------- -;--------- game over --------- -;----------------------------- - -GameOver: - cal _clrLCD - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: +setclient: + ;name/keys: wormy#1 = link = 0 + link (name1) + ; 2 = worm #1 = #1 + local(name1) + ; 3 = link = 0 + link (name2) + ; 4 = worm #2 = #2 + local(name2) + ld de,worm2+left + ld hl,worm1+left + ldi ;keys worm#2 = worm#1 + ldi ;+right + ld de,worm4+left + ldi ;keys worm#4 = worm#2 + ldi + xor a + ld (worm1+left),a ;worm 1... + ld (worm3+left),a ;and worm 3 via link + ld hl,worm1+name + ld b,9 + cal recvstuff + ld hl,worm2+name + ld b,9 + cal sendstuff + pop hl ;loadgamecar + pop de ;leveldata + psh de + psh hl ;loadgamecar + ld b,8 + cal sendstuff + ld hl,gameCar + ld b,1 + cal sendstuff + ld hl,Gametype + ld b,1 + cal sendstuff ex de,hl - ld bc,died - add hl,bc - ld (hl),0 ;died=0 - inc hl - ld (hl),0 ;score=0 - inc hl - ld (hl),0 ;score+1=0 - inc hl - ld (hl),2 ;delay=2 + ld b,168 + cal sendstuff +_StartLevel: + jr StartLevel +sendstuff: + psh de +sendstuffloop: + psh bc + ld c,(hl) inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + cal Qsend + pop bc + dnz sendstuffloop + pop de + ret +recvstuff: + psh de +recvstuffloop: + psh bc + cal Qrecv + ld (hl),c inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop - - pop hl ;begin of current level - -StartLevel: - ld de,Left - ld a,(hl) - inc a ;=255? - jp nz,nextlevel - + pop bc + dnz recvstuffloop + pop de + ret +sethost: + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld de,worm3+left + ld hl,worm2+left + ldi ;keys worm#3 = worm#2 + ldi ;+right + xor a + ld (worm2+left),a ;worm 2+4.. + ld (worm4+left),a ;..over link + ld hl,worm1+name + ld b,9 + cal sendstuff + ld hl,worm2+name + ld b,9 + cal recvstuff + pop hl ;loadgamecar + pop de ;leveldata + ld hl,templevels ;&&&&&&& + ld de,datalink + psh de + psh hl ;loadgamecar + ld b,8 + cal recvstuff + ld hl,gameCar + ld b,1 + cal recvstuff + ld hl,Gametype + ld b,1 + cal recvstuff + ex de,hl + ld b,168 + cal recvstuff + +;-------- load level --------- + +StartLevel: + pop hl ;loadgamecar + ld a,(hl) + ld (wormbeglives),a + inc hl ;nrworms + ld a,(hl) + ld (nrworms),a + inc hl ;level + inc hl + ld a,(hl) + ld (customspeed),a + inc hl + ld a,(hl) + ld (growspeed),a + inc hl + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient + 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 + +Nextlevel: + cal _clrWindow + pop hl ;begin of current level + ld a,(hl) + inc a ;=255? + jp nz,donextlevel + + psh hl ld hl,Level dec (hl) ;curlevel-- (not beyond last lvl) - psh hl cal releasekeys - cal _clrWindow pop hl ;show end msg or smtn ld bc,Exit psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: - ldi +donextlevel: + ld a,(Gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle + 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 - ldi + ld a,0 +customspeed =$-1 + inc a ;$FF=def + jr nz,setspeed + ld a,(hl) ;speed from level + inc a +setspeed: + dec a + ld (de),a ;custom speed + inc hl ld de,peagrowth ldi ld a,(hl) @@ -1157,34 +1655,41 @@ toobad_noballs: #endif ld hl,worm1 - ld a,(gameCar) - cp _datasp + pop af ;cp (Gametype),0 ld b,1 jr z,worminit ld b,4 worminit: - psh bc ; >> 1 + psh bc ;>1 ex de,hl - ldi ;d + ldi ;d ld a,SinCosTable/256 ld (de),a inc de - ldi ;y - ldi ;x + ldi ;y + ldi ;x ex de,hl - xor a - ld (hl),a ;y2 + ld (hl),a ;y2 + inc hl + ld (hl),a ;x2 inc hl - ld (hl),a ;x2 + inc hl + ld (hl),a ;growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc - pop bc ; << 0k + pop bc ;<0 dnz worminit + inc a ;ld a,1 + ld (turn10),a + inc a ;ld a,2 + ld (flashtime),a + ;-------- draw level --------- +initlevel: ld a,(de) inc de sub 128 @@ -1209,23 +1714,23 @@ setfieldy: add hl,hl add hl,hl add hl,hl - add hl,hl + add hl,hl ;32=scr.width ex de,hl ld hl,ScrBuffer psh hl ; >> 1 psh de ; >> 2 ld de,ScrBuffer+1 - ld bc,63 + ld bc,63 ;first 2 rows ld (hl),%11111111 - ldir + ldir ;draw upper border inc hl - ld (hl),%11000000 + ld (hl),%11000000 ;first left border inc hl ld b,31 ClearLine: - ld (hl),c - inc hl + ld (hl),c ;=0 + inc hl ;clear rest of line dnz ClearLine psh hl ; >> 3 @@ -1237,12 +1742,12 @@ ClearLine: rra rra ld l,a - ld h,0 + ld h,c ;0 add hl,de pop af ; << 3 and %00000111 ld b,a - ld c,0 +; ld c,0 ld a,%11000000 jr z,NoVertShift VertShift: @@ -1265,29 +1770,26 @@ NoVertShift: pop hl ; << levelp ld a,(Gametype) - cp gamectf - jr nz,noctf + cp gamerace ;or gamectf + jr c,levelhasbeensetup ld de,peaspos - ld bc,4 + ld c,2 ;ld bc,2 (2 bytes) + jr z,loadextralevelstuff ;cp gamerace + ld c,4 ;ld bc,4 (2nd flag in ctf) +loadextralevelstuff: ldir - psh hl - cal DrawAllPeas - pop hl -noctf: + ld a,1 ;draw delay + ld (drawctfpea1),a + ld (drawctfpea2),a +levelhasbeensetup: cal drawstuff -;----------------------------- +;--------- prepare ----------- +leveldone: psh hl ; >> levelp new - cal showstats - ld a,(gameCar) - and _datafood - jr z,nofood - cal NewPea -nofood: - ld bc,(worm1+pos) - cal DisplayField + cal forceshowstats #ifdef readymask ld hl,$FC70 @@ -1307,7 +1809,6 @@ maskline: dec c jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1322,47 +1823,17 @@ maskline: res 3,(iy+5) #endif - ld a,0 -gameCar =$-1 - and _datalink - jr z,initfinished ;no link + ld a,(gameCar) + bit _bitfood,a + jr nz,nofood +; ld ix,worm1 + cal NewPea xor a -SwapPos: ;$18 xx -> $E6 xx - ; jr xx -> and xx - jr sethost -setclient: - ld (worm1+left),a ;worm 1... - ld (worm3+left),a ;and worm 3 via link - cal Crecv - ld a,c - ld (worm2+name+0),a - cal Crecv - ld a,c - ld (worm2+name+1),a - cal Crecv - ld a,c - ld (worm2+name+2),a - cal Crecv - ld a,c - ld (worm2+name+3),a - cal Crecv - ld a,c - ld (worm2+name+4),a - jr initfinished -sethost: - ld (worm2+left),a ;worm 2+4.. - ld (worm4+left),a ;..over link - ld c,'T' - cal Qsend - ld c,'e' - cal Qsend - ld c,'s' - cal Qsend - ld c,'t' - cal Qsend - ld c,0 - cal Qsend -initfinished: +nofood: + rla ;bit _bitmultpeas,a + cal c,multnewpea + ld bc,(worm1+pos) + cal DisplayField ld b,startdelay ReadyDelay: @@ -1375,8 +1846,13 @@ ReadyDelay: ;----------------------------- GameLoop: - ld bc,(worm1+pos) - cal DisplayField + ld bc,(worm1+pos) ;camera worm #1 + ld a,(worm1+left) + or a ;if #1 not over link + jr nz,showfield + ld bc,(worm2+pos) ;otherwise view from #2 +showfield: + cal DisplayField ;display piece of level ld a,1 flashtime =$-1 @@ -1390,7 +1866,7 @@ screeninvertloop: ld (hl),a inc hl xor a - cp h + cp h ;end at >$FFFF jr nz,screeninvertloop noflash: @@ -1404,13 +1880,40 @@ Delay: jr nz,Delay NoDelay: + ld (handledworm),a ;reset + ld hl,turn + ld a,(hl) + inc a ;-1 + jr z,nextturnok dec (hl) + dec a ;0 (now <0) jr nz,nextturnok - ld (hl),3 ;2 +growspeed =$+1 + ld (hl),$FF nextturnok: - ld (handledworm),a ;=0 + ld a,(gameCar) + and _datatime + jr z,nodispupdate + ld hl,turn10 + dec (hl) + jr nz,nodispupdate ;just once every 10 turns + ld (hl),10 ;reset counter + cal forceshowstats ;update score +nodispupdate: + + ld a,(Gametype) + cp gamectf + jr nz,noctfpeas2draw + ld de,drawctfpea1 + ld hl,(peaspos) + cal tryDrawPea ;pea#1 + ld de,drawctfpea2 + ld hl,(peaspos+2) + cal tryDrawPea ;pea#2 +noctfpeas2draw: + ld a,0 nrballs =$-1 @@ -1428,7 +1931,7 @@ handleworms: add ix,bc pop bc ld hl,handledworm - inc (hl) ;1..nrworms + inc (hl) ;0..nrworms-1 dnz handleworms ;----------------------------- @@ -1440,94 +1943,128 @@ HandleKeys: out (1),a in a,(1) rla ;MORE? - jr c,CheckExit - ld bc,$0103 - out (c),b - halt ;pause/off - ld b,11 - out (c),b - + jr nc,disppausemenu CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop - jr Exit + jp Exit ;jr? -WormDead: -#ifdef invincible - jp stopworm -#else - ld a,2 - ld (flashtime),a - ld (ix+delay),respawndelay +;------- pause menu ------- -thislevel =$+1 - ld hl,0 - ld de,0 -handledworm =$-2 - add hl,de - add hl,de - add hl,de - ld a,(hl) - inc hl - ld (ix+heading),a - ld a,(hl) - ld (ix+pos),a - inc hl - ld a,(hl) - ld (ix+pos+1),a +disppausemenu: + ld hl,txtpMenu + ld ix,pospMenu +;Resume|Turn Off|Contrast|Exit|| + ld b,25*16/4 + cal dispmenucommon + ld hl,$FC00+$170 ;(*,23) + cal hr + ld hl,$FC00+$310 ;(*,49) + cal hr + cal menupos - inc (ix+died) - dec (ix+lives) +pauseMenu: + psh bc +pmenuwaitkey: + cal ubergetkey + or a + jr z,pmenuwaitkey + pop bc ;GET_KEY + ld d,b ;c=new b + cp K_UP + jr nz,pmenunotup + dec d +pmenunotup: + cp K_DOWN + jr nz,pmenunotdown + inc d +pmenunotdown: psh af - ld de,10 - cal DecScore + cal menupos + ld a,d ;new pos + and 3 ;0-3 + ld b,a + cal menupos pop af - ret nz ;HandleWorm done - ld a,(gameCar) - and _datalivel - ret z ;don't end game - ld a,(Gametype) - cp gametron - jr nz,anyworm ;if not Tron, quit at any worm's death - ld a,(nrworms) - ld b,a ;# of worms - ld hl,worm1+lives-(worm2-worm1) - ld de,worm2-worm1 - xor a ;check for 0 lives -checklives: - add hl,de ;next worm - cp (hl) ;lives==0? - ret nz ;any >0: don't exit - dnz checklives -anyworm: - ld a,$A7 ;exit@end of turn - ld (CheckExit),a ;set exit state - ret ;finish turn -#endif + cp K_ENTER + jr z,pselect + cp K_SECOND + jr nz,notpselect +pselect: + ld a,b + or a ;1: continue + jr z,donepausing + dec a ;2: off + jr z,turnoff + dec a ;3: contrast + jr z,pauseMenu + jr Exit ;4: exit +notpselect + cp K_EXIT + jr z,donepausing + ld hl,CONTRAST + sub K_LEFT + jr z,contrastdown + dec a ;K_RIGHT + jr nz,pauseMenu +contrastup: + inc (hl) + jr setcontrast +contrastdown: + dec (hl) +setcontrast: + ld a,(hl) + out (2),a + jr pauseMenu + +turnoff: + ld bc,$0103 + out (c),b + halt ;pause/off + ld b,11 + out (c),b + ld b,1 + jr pauseMenu + +donepausing: + cal releasekeys + jp GameLoop Exit: + cal releasekeys ld sp,0 ;pop all SpSave = $-2 ld a,D0LD1L out (7),a ;both wires low = game over signal cal _clrWindow +#ifdef coolzgfx + ld de,$FC30 ;(0,1) + ld hl,wtWormy + ld bc,16*7 + ldir + ld hl,$FC10 + ld b,16*11 + cal menuinvloop ;invert + ld hl,$FD80 + cal hr ;menuinvloop w/ b=16 + ld hl,$FCE0 + cal hr + ld hl,_curRow + ld (hl),2 +#else ld hl,txtGO cal _puts ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert inc h ;$FD80 - ld b,16 - cal menuinvloop ;
+ cal hr ;menuinvloop w/ b=16 ld hl,$FCE0 - ld b,16 - cal menuinvloop ;
-; ld l,$74 -; ld b,8 -; cal menuinvloop + cal hr ld hl,_curRow inc (hl) +#endif ld hl,txtGame CURtxtGame =$-2 cal _puts @@ -1539,25 +2076,65 @@ CURtxtGame =$-2 ld (_penCol),de ld hl,txtName cal _vputs ;Name - ld a,$4F + ld a,$3D ld (_penCol),a cal _vputs ;Died Score ld de,$0004 ld (_curRow),de +findwinner: + ld hl,(worm1+score) + ld (winnerscore),hl + ld b,3 ;(nrworms)-1 + ld hl,worm2+score +findwinnerloop: + psh hl + cal _ldHLind + ld de,(winnerscore) + ld a,h + cp d + jr c,nonewwinner ;hd + ld a,e + cp l + jr nc,nonewwinner ;l$FB) + ld hl,worm1+died +finddmwinner: + cp (hl) + jr c,nonewdmwinner + ld a,(hl) ;less deaths +nonewdmwinner: + ld de,worm2-worm1 + add hl,de + dnz finddmwinner + ld (dmwinner),a + +;---display worms--- + ld a,(nrworms) ld b,a ld hl,worm1+died displayWormStats: psh bc - psh hl + psh hl ld bc,left-died add hl,bc ;+left xor a cp (hl) ;input=0 = link jr nz,NoLinkIndic - ld a,8 + ld a,9 ld (_curCol),a ld a,$DC ;-O cal _putc @@ -1567,23 +2144,42 @@ NoLinkIndic: inc hl inc hl ;+name cal _puts - pop hl + psh hl ld a,13 ld (_curCol),a ld a,(hl) ;worm+died - cal showA + cal showA0 pop hl - psh hl + psh hl + ld a,(Gametype) + cp gamedeathm + jr nz,nodmwinner ;deathmatch? + ld a,0 ;winner's deaths +dmwinner =$-1 + cp (hl) ;equals this worm? + scf ;jr nz,notwinner + cal z,iswinner +nodmwinner: + jr c,notwinner ;no singleplayer winners + inc hl ;worm+score + cal _ldHLind ;ld hl,(hl) + ld de,0 +winnerscore =$-2 + cal _cphlde ;==highest score.. + cal z,iswinner +notwinner: ld a,16 ld (_curCol),a + pop hl + psh hl inc hl ;worm+score - cal _ldHLind ;ld hl,(hl) - cal showHL ;worm+score - + cal _ldHLind + cal showHL pop hl + ld bc,worm2-worm1 add hl,bc pop bc @@ -1608,45 +2204,55 @@ hilevelcheckdone: ld a,(gameCar) and _datasingl - - jr z,hiscorecheckdone + jr z,hiscorecheckdone ;no SP checkhiscore: cal loadhiscoreposinahl - cal _Get_Word_ahl ;de=old_hi - psh de - cal _RAM_PAGE_1 ;&& - pop de - ld hl,(worm1+score) - - ld a,h ;New - cp d ;Old - jr c,NotNewHigh ;NewOld - - ld a,e ;old - cp l ;new - jr nc,NotNewHigh ;new=Old - ex de,hl + ld de,(highsave) ;de=prev. hiscore + ld hl,(worm1+score) ;hl=worm1's score + cal _cphlde ;sub hl,de + jr c,NotNewHigh ;newOld + ld (highsave),hl ;store new hiscore + ld de,highsave+2 ;to + ld hl,worm1+name ;from + ld bc,3 ;3 chars + ldir ;store new hiname cal loadhiscoreposinahl - cal _Set_Word_ahl ;de->(ahl) - cal _RAM_PAGE_1 - -NotNewHigh: ;de=current hiscore - ld hl,$0807 - ld (_curRow),hl - ld hl,txthiscore + cal _SET_ABS_DEST_ADDR ;to ahl + xor a + ld hl,highsave + cal _SET_ABS_SRC_ADDR ;from local + ld hl,5 + cal _MM_LDIR_SET_SIZE ;save new + cal _RAM_PAGE_1 + ld hl,_curRow + dec (hl) + cal iswinner + +NotNewHigh: + ld hl,$3149 + ld (_penCol),hl + ld hl,txthiscore + cal _vputs + ld hl,$0C07 + ld (_curRow),hl + ld hl,highsave+2 cal _puts - ex de,hl ;pop + ld hl,(highsave) cal showHL hiscorecheckdone: - cal releasekeys waitkey: - halt - halt - cal GET_KEY + cal ubergetkey cp K_ENTER jp z,DisplayMenu cp K_SECOND @@ -1679,8 +2285,7 @@ ExitNoStats: ld hl,savestart cal _SET_ABS_SRC_ADDR ld hl,saveend-savestart - cal _SET_MM_NUM_BYTES - cal _mm_ldir + cal _MM_LDIR_SET_SIZE cal releasekeys res 4,(iy+9) @@ -1689,37 +2294,37 @@ ExitNoStats: jp _clrWindow loadhiscoreposinahl: - ld a,(Level) - ld b,a - - ld h,0 ;hl= - ld a,(nrlevels+1) ;# peaworm lvls - add a,a - ld l,a - + ld hl,0 ;for peaworm and singleplayer ld a,(Gametype) - dec a - ld c,a - dec a ;z=(Gametype)=2 - jr z,tronhi - ld l,h ;hl=0 -tronhi: - - xor a ;ahl=0(+x) - psh bc + or a ;Singleplayer? + jr z,hi__ + dec a ;peaworm? + jr z,hi_ + ld a,(nrlevels+1) ;skip peaworm slots if tron mode +hi_: + ld bc,(Level) + add a,c + ld b,a ;levels to skip (including 1 for singleplayer) + ld de,5 ;to add per level +addlevelposition: + add hl,de ;one word+3 bytes for name + dnz addlevelposition +hi__: + xor a ;ahl=0(+hl) ld bc,defhiscrpos hiscrposhl =$-2 add hl,bc - pop bc - adc a,0 -hiscrposa =$-1 ;ahl=saveloc - - inc c - ret z ;(Gametype)=0 -addlevelposition: - cal _AHL_PLUS_2_PG3 - dnz addlevelposition +hiscrposa =$+1 + adc a,0 ;ahl=saveloc ret +highsave: + .db 0,0,"WOR ",0 + +iswinner: + ld a,10 + ld (_curCol),a + ld a,'*' + jp _putc ;..then put * ;----------------------------- ;----------- worm ------------ @@ -1730,7 +2335,7 @@ respawncheck: jr nz,unnamedlabel cal saverespawncounter removeworm: - ld h,(ix+tail+1) + ld h,(ix+tail+1) ;& ld l,(ix+tail) ld d,(ix+head+1) ld e,(ix+head) @@ -1745,6 +2350,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -1755,6 +2362,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -1802,19 +2410,20 @@ keybit: dnz keybit ;check match (cf set) ret -turnspeed = 8 inkeys: ;use jp not call! cal chkkey jr nc,notright ld a,l - add a,turnspeed + add a,8 +turnright =$-1 ld l,a notright: ld a,(ix+right) cal chkkey ret nc ld a,l - sub turnspeed + sub 8 +turnleft =$-1 ld l,a ret inputcall: @@ -1823,8 +2432,8 @@ inputcall: jr z,inlink ;input by link cal inkeys ;input by keys ld a,(gameCar) - and _datalink - ret z ;no link + rra ;and _datalink + ret nc ;no link ld c,l ;send our keys jp Qsend inlink: @@ -1832,34 +2441,35 @@ inlink: ld l,c ret +;----------------------------- ;------- handle worm --------- +;----------------------------- HandleWorm: - ld a,(gameCar) - cpl - and _datalivel - add a,(ix+lives) + xor a + cp (ix+lives) + jr nz,alive + ld a,(wormbeglives) or a - ret z ;dead + ret nz ;live limit +alive: ld a,(ix+delay) dec a jp nz,respawncheck - ld a,(Gametype) - cp gamedeathm ;&&&sub - jr nz,nogrow - ld a,1 ;xor a - cp 0 ;a=0 + xor a + cp 0 turn =$-1 jr nz,nogrow inc (ix+grow) nogrow: - cp gametron - jr nz,notron - ld de,1 + ld a,(gameCar) + and _datatime + jr z,notimescore + ld e,1 cal IncScore -notron: +notimescore: ld l,(ix+heading) cal inputcall @@ -1872,6 +2482,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -1883,6 +2494,7 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif ;-------- move worm ---------- @@ -1942,36 +2554,46 @@ GotFour: Hitworm: ld a,(gameCar) ld h,a - and _datadie - cal z,checkhitotherworm +#ifdef optdie +; if race - originally + cal checkhitotherworm + ld a,h +#endif + and _datactfpeas ;&&bit + jr nz,chkctfpeas ld a,h and _datamultpeas ;&&bit - jr nz,multiple_peas + jp nz,chkmultpeas ld a,h and _datafood - jp z,WormDead ;no food + jp nz,WormDead ;no food ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit jp nc,WormDead +pickpea: cal DrawPea ;remove pea + cal NewPea +pickpea_: ld a,(ix+grow) add a,15 peagrowth =$-1 ld (ix+grow),a - cal NewPea + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: ld hl,Left - dec (hl) + dec (hl) ;dec left before display psh af - ld de,10 + 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 @@ -1985,15 +2607,14 @@ peagrowth =$-1 add hl,hl cal _HLTIMES10 ex de,hl - cal IncScore ;score+(40*level) + cal _IncScore ;score+(40*level) cal removeworm pop hl ; << call pop hl ; << call - pop hl ; << levelp new ld (ix+delay),2 - jp StartLevel + jp Nextlevel -chkpeahit: ;hl=peapos +chkpeahit: ;bc=ownpos;hl=peapos (destr:ad) ld a,(sprsize) inc a ld d,a @@ -2008,70 +2629,80 @@ chkpeahit: ;hl=peapos cp d ret ;c=pea -flagcaptured: - psh hl - ld de,30 - cal IncScore - pop hl -sillylabel: - cal WormDead -DrawAllPeas: - ld hl,(peaspos) - cal DrawPea - ld hl,(peaspos+2) - jp DrawPea - -multiple_peas: +chkctfpeas: ld hl,(peaspos) ;1st pea - psh hl ld a,(ix+reserv) ld e,a ;push a - and %01 - jr nz,sel_ownpea - ld hl,(peaspos+2) ;2nd pea -sel_ownpea: - cal chkpeahit - pop hl ;(peapos) 1st pea - jp c,WormDead ;stopworm ;own pea hit - - ld a,e ;peek a (that's x86 asm for pop\push ;) - and %01 + and %01 ;ourpea (0|1) jr z,sel_otherpea - ld hl,(peaspos+2) ;2nd pea + ld hl,(peaspos+2) ;2nd pea ;&&&ex de,hl? sel_otherpea: cal chkpeahit - jp c,hitflag - -;no peas hit - ld a,e - cal flagtoken - jp z,WormDead - ld b,a ;%10 - srl b ;%01 - add a,b ;%11 + jr c,hitflag +;no peas hit: + ld a,e ;peek a (that's x86asm for pop\push ;) + bit 1,a ;%10 = carrying flag? + jp z,WormDead ;if not just die + xor %11 ;drop flag ld (ix+reserv),a - cal DrawPea ;restore own flag - jr sillylabel ;inv both\die + psh af + cal WormDead + pop af ;which flag? (=and %1) + ld hl,drawctfpea1 ;restore #1 + jr z,nottheotherflag + ld hl,drawctfpea2 ;restore #2 +nottheotherflag: + ld (hl),3 ;draw delay 3 turns + ret + +drawctfpea1: .db 0 +drawctfpea2: .db 0 hitflag: ;correct pea hit ld a,e ;pop a - xor %01 ;0=1;1=0 + xor %11 ;invert flag taken + ownflag ld (ix+reserv),a - cal flagtoken + and %10 ;just returned? psh af ;safe z-flag cal DrawPea ;remove pop af - jr z,flagcaptured - jr stopworm - -flagtoken: - and %01 ;current - add a,a ;<< for cp - ld b,a ;in b - ld a,e - and %10 ;own - cp b ;same? - ret ;Z=yes: no flag taken + jr nz,Drawworm ;flag taken, continue game + psh hl + ld e,20 ;flag captured+returned + cal IncScore + pop hl + ld a,3 ;draw delay + ld (drawctfpea1),a ;redraw.. + 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_ ;----------------------------- @@ -2096,53 +2727,30 @@ ChkWorm: ret ;z checkhitlapline: - ld a,63 - sub b + ld a,(peaspos) ;63 + sub b ;x==63 jr z,nextlaphalf inc a ret nz nextlaphalf: - ld a,c - and 32 ;y>=32? - jr nz,nolap + ld a,(peaspos+1) ;yline + cp c ;ypos + ld a,1 + jr nc,checklap ;y>yline -> a=1 + xor a ;y a=0 +checklap: cp (ix+reserv) - jr z,nolap + ret z ;same as before + ld (ix+reserv),a ;1st time + ld e,a + ld a,(handledworm) + and 1 ;group 0 (1,3) or 1 (2,4) + xor e + ret z ;(group 0 and yyline) psh bc - ld de,20 - cal IncScore + ld e,20 + cal IncScore ;lap! pop bc - xor a -nolap: - ld (ix+reserv),a - ret - -checkhitotherworm: - .db $dd,$7d ;ld a,lx - cp worm2&255 - psh ix - jr nz,chkworm2 ; ret nz - ld ix,worm1 - jr chkworm -chkworm2: - ld ix,worm2 - -chkworm: - ld h,(ix+tail+1) - ld l,(ix+tail) - ld e,(ix+head) - ld d,(ix+head+1) - cal ChkWorm - pop ix - ret z ;not hit - pop bc ;call -stopworm: - ld bc,0 -previouspos =$-2 - ld de,0 - ld (ix+pos),c - ld (ix+pos+1),b - ld (ix+pos2),e - ld (ix+pos2+1),d ret ;-------- draw worm ---------- @@ -2152,14 +2760,13 @@ Drawworm: ld b,(ix+pos+1) ld a,(Gametype) - ld d,a cp gamerace cal z,checkhitlapline cal set4pixels dec c - ld a,d - cp gametron + ld a,(growspeed) + or a ;0=tron ret z ;keep tail in "Tron" ld l,(ix+head) @@ -2172,10 +2779,14 @@ Drawworm: ld (ix+head),l ld (ix+head+1),h - ld a,(ix+grow) - dec a + ld l,(ix+grow) + ld h,(ix+grow+1) + dec hl + ld a,h + or l jr z,removetail - ld (ix+grow),a + ld (ix+grow),l + ld (ix+grow+1),h ret removetail: @@ -2188,6 +2799,13 @@ removetail: cal resbit ld (ix+tail),l ld (ix+tail+1),h + psh hl + cal res4pixels + pop hl + ld c,(hl) + inc hl + ld b,(hl) + jr set4pixels res4pixels: cal ResPixel @@ -2331,18 +2949,96 @@ Seed =$+1 add a,2 ret -NewPea: - ld a,(FieldWidth) - add a,127-4 - cal randompos - ld h,a - ld a,(FieldHeight) - add a,56-4 - cal randompos - ld l,a - ld (PeaY),hl +WormDead: +#ifdef invincible + jp stopworm +#endif + ld a,2 + ld (flashtime),a + ld (ix+delay),respawndelay + +thislevel =$+1 + ld hl,0 + ld de,0 +handledworm =$-2 + add hl,de + add hl,de + add hl,de + ld a,(hl) + inc hl + ld (ix+heading),a + ld a,(hl) + ld (ix+pos),a ;y + inc hl + ld a,(hl) + ld (ix+pos+1),a ;x + xor a + ld (ix+pos2),a ;y2 + ld (ix+pos2+1),a ;x2 + + inc (ix+died) + dec (ix+lives) + psh af + ld de,10 + ld a,(Gametype) + cp gamectf ;ctf no death penalty + cal nz,DecScore + pop af + ret nz ;HandleWorm done + ld a,(wormbeglives) + or a ;0=no live limit + ret z ;don't end game + ld a,(gameCar) + and _datatime + jr z,anyworm ;quit at any worm's death + ld a,(nrworms) ;timematch: all worms must've died + ld b,a ;# of worms + ld hl,worm1+lives-(worm2-worm1) + ld de,worm2-worm1 + xor a ;check for 0 lives +checklives: + add hl,de ;next worm + cp (hl) ;lives==0? + ret nz ;any >0: don't exit + dnz checklives +anyworm: + ld a,$A7 ;exit@end of turn + ld (CheckExit),a ;set exit state + ret ;finish turn -CheckPea: +#ifdef optdie +checkhitotherworm: + .db $dd,$7d ;ld a,lx + cp worm2&255 + psh ix + jr nz,chkworm2 ; ret nz + ld ix,worm1 + jr chkworm +chkworm2: + ld ix,worm2 + +chkworm: + ld h,(ix+tail+1) + ld l,(ix+tail) + ld e,(ix+head) + ld d,(ix+head+1) + cal ChkWorm + pop ix + ret z ;not hit + pop bc ;call + +stopworm: + ld bc,0 +previouspos =$-2 + ld de,0 + ld (ix+pos),c + ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d + ret +#endif + +CheckPea: ;@hl; destr:abcde ld c,l ld a,(sprsize) ld e,a @@ -2355,27 +3051,144 @@ chkloopx: cal FindPixel and (hl) pop hl - jr nz,NewPea ;pixel found + ret nz ;nz=pixel found inc b dec d jr nz,chkloopx inc c dec e jr nz,chkloopy -;all ok; empty space + ret ;z=empty space + +tryDrawPea: ;hl=peapos;bc=dopea + ld a,(de) + or a ;0=drawn + ret z + psh de + cal CheckPea + pop de + ret nz ;unsuccesful + ex de,hl + dec (hl) ;hl=appeartime + ex de,hl ;hl=peaspos + 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 + cal randompos + ld h,a + ld a,(FieldHeight) + add a,56-4 + cal randompos + ld l,a + cal CheckPea + jr nz,NewPea + cal sendnewpeaoverlink + ld (PeaY),hl DrawPea: ;hl=(PeaY) ld b,h ld c,l ld de,0 spritepos =$-2 - jp PutSprite ;||-ed - -;----------- score ----------- +; jp PutSprite -_divHLby1000: - psh hl - ld b,3 +PutSprite: ;||@(b,c) + ;by SHIAR only ix saved + cal FindPixel + ld (beginbit),a + ld a,0 +sprsize =$-1 + ld b,a ;rows +sprloopy: + psh bc ;rows + psh hl + ld a,(de) + ld c,a + inc de + ld a,(sprsize) + ld b,a ;width +beginbit =$+1 + ld a,1 +sprloopx: + sla c ;draw? + jr nc,sprnodraw + psh af + xor (hl) + ld (hl),a + pop af +sprnodraw: + rrca ;next bit + jp nc,nextbitok + inc hl ;next byte +nextbitok: + dnz sprloopx + + pop hl + ld bc,32 ;next line + add hl,bc + pop bc + dnz sprloopy + ret + +;----------- score ----------- + +timematchscore: + ;piece of crap checking whether you've already won in timematch + ld a,(nrworms) + ld b,a ;# of worms + dec a + ret z ;singleplayer + ld hl,worm1+lives + ld de,worm2-worm1 + ld a,(handledworm) + ld c,a ;wormcounter +chktimematchover: + xor a + cp c + jr z,nneexxtt ;yourself + cp (hl) + ret nz ;someone else still alive + dec hl ;+del0ay + dec hl ;+score+1 + ld a,(hl) + cp (ix+score+1) + jr c,nneexxtt_ ;you>him + ret nz ;not highest + dec hl ;+score + ld a,(hl) + cp (ix+score) + ret nc ;you<=him + inc hl +nneexxtt_: + inc hl + inc hl +nneexxtt: + dec c + add hl,de + dnz chktimematchover + jp anyworm ;g/o + +_divHLby1000: + psh hl + ld b,3 divideagain: ;3x cal _divHLby10 dnz divideagain @@ -2383,39 +3196,55 @@ divideagain: ;3x pop hl ret -IncScore: - ld h,(ix+score+1) - ld l,(ix+score) +extralives: cal _divHLby1000 ld c,a - add hl,de + add hl,de ;increase score 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 c,showstats ;<0=0 + jr scorecommon + +IncScore: ;inc score by e + ld d,0 +_IncScore ; inc by de + ld h,(ix+score+1) + ld l,(ix+score) + ld a,(Gametype) + or a ;if singleplayer... + jr z,extralives + add hl,de ;score+=de scorecommon: ld (ix+score+1),h - ld (ix+score),l + ld (ix+score),l ;save ld de,0 scorelimit =$-2 - inc e - jr z,showstats ;de=$FF??=no limit - dec e + ld a,d + or e + jr z,showstats ;de=0=no limit cal _cphlde jp nc,Exit showstats: - ld a,(Gametype) - cp gametron - ret z -showstatsEven4tron: + ld a,(gameCar) + and _datatime + jr nz,timematchscore ;no disp for timematches + ld hl,$FC00 ;&&&only necessary in deathmatch + ld b,6*16-1 +clearstats: + ld (hl),a ;=0 + inc hl + dnz clearstats +forceshowstats: psh ix ld h,0 ld l,h @@ -2424,37 +3253,65 @@ showstatsEven4tron: ld b,a ld ix,worm1 ld a,(gameCar) - and _datanextl + and _datasingl jr nz,showstatsS showstatloop: psh bc +#ifdef longnames + ld b,3 + psh ix +shownameloop: ;1st 3 chars + ld a,(ix+name) + or a + jr z,nameshown + cal __vputmap + inc ix + dnz shownameloop +nameshown: + ld a,':' + cal _vputmap + pop ix +#else + ld a,(ix+name) + cal __vputmap + ld a,':' + cal __vputmap +#endif cal showstat ld de,worm2-worm1 - add ix,de + add ix,de ;next ld hl,_penCol ld a,(hl) - add a,10 + add a,4 ;div ld (hl),a pop bc dnz showstatloop pop ix ret -showstat: - ld a,(gameCar) - and _datascore +showstat: ;(multiplayer) + ld a,(Gametype) + cp gamedeathm jr z,showlives showscore: ld h,(ix+score+1) ld l,(ix+score) cal _D_HL_DECI - jr __vputs + jr __vputs showlives: - ld a,(Gametype) - cp gametron - jr z,showscore - ld a,(ix+lives) +showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) + cp 10 + jr c,showleastsign + ld l,a + ld h,0 + cal _divHLby10 + psh af + ld a,l + add a,'0' + cal __vputmap + pop af +showleastsign: add a,'0' __vputmap: psh ix @@ -2462,24 +3319,12 @@ __vputmap: pop ix ret -showstatsS: +showstatsS: ;(singleplayer) ld hl,txtLevel cal __vputs ld a,0 Level =$-1 - cp 10 - jr c,tilllevel9 - ld l,a - ld h,0 - cal _divHLby10 - psh af - ld a,l - add a,'0' - cal __vputmap - pop af -tilllevel9: - add a,'0' - cal __vputmap + cal showA ld a,98 ld (_penCol),a @@ -2496,7 +3341,7 @@ showleft: ld (_penCol),a ld a,0 Left =$-1 - cal cshowA + cal cshowA0 ld hl,txtLeft __vputs: @@ -2509,7 +3354,7 @@ showLevel: ld hl,txtLevel cal _puts ld a,(Level) -showA: +showA0: ;big w/ leading 0 ld l,a ld h,0 cal _divHLby10 @@ -2521,7 +3366,12 @@ showA: add a,'0' jp _putc -cshowA: +cshowA0: ;small w/ leading 0 + or a + jr nz,cshowavalue + ld hl,txtNone + jp _vputs +cshowavalue: ld l,a ld h,0 cal _divHLby10 @@ -2553,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: @@ -2824,53 +3674,12 @@ FindPixel: ;(b,c) to hl: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 ret -;--- sprite --- - -PutSprite: ;||@(b,c) - ;by SHIAR only ix saved - cal FindPixel -putspr: - ld (beginbit),a - ld a,0 -sprsize =$-1 - ld b,a ;rows -sprloopy: - psh bc ;rows - psh hl - ld a,(de) - ld c,a - inc de - ld a,(sprsize) - ld b,a ;width -beginbit =$+1 - ld a,1 -sprloopx: - sla c ;draw? - jr nc,sprnodraw - psh af - xor (hl) - ld (hl),a - pop af -sprnodraw: - rrca ;next bit - jp nc,nextbitok - inc hl ;next byte -nextbitok: - dnz sprloopx - - pop hl - ld bc,32 ;next line - add hl,bc - pop bc - dnz sprloopy - ret - ;--- objects --- drawstuff: @@ -2888,182 +3697,26 @@ drawstuff: psh hl ld l,(hl) ld h,b - - dec a ;1 = line - cal z,drawline - dec a ;2 = fatline - cal z,drawfatline - dec a ;3 = box - cal z,drawbox - dec a ;4 = circle - cal z,drawcircle - dec a ;5 = hline -#ifdef hlines - cal z,drawhline -#else - cal z,drawline -#endif - + cal drawsmtn pop hl inc hl jr drawstuff -drawbox: ;(d,e)-(h,l) - ld b,l ;Delta-y -#ifdef hlines -boxloop: - cal drawhline - inc e - dnz boxloop - ret -drawhline: ;(d,e)-(h,e) - psh bc - ld b,d - ld c,e - psh hl - cal FindPixel - ld c,a ;starting mask - ld a,h - sub b - ld b,a - inc b ;1+x2-x1 -hlineloop: - ld a,(hl) - or c - ld (hl),a - rrc c ;mask >> - jr nc,hlinenext - inc hl ;next byte -hlinenext: - dnz hlineloop - pop hl - pop bc - ret -#else - ld l,e -boxloop: - cal drawline - inc l - inc e - dnz boxloop - ret -#endif - -drawfatline: - cal drawline - inc d - inc h - cal drawline - inc e - inc l - cal drawline - dec d - dec h - jp drawline +drawsmtn: + dec a ;1 = line + jr z,drawline + dec a ;2 = fatline + jr z,drawfatline + dec a ;3 = box + jr z,drawbox +; dec a ;4 = circle +; jp z,drawcircle -;LINE (d,e)-(h,l) -;destroyes a - -drawline: ;(d,e)-(h,l) - psh bc ;destr: a - psh hl - psh de - ld a,d - cp h - jr c,lineOrdered - ex de,hl -lineOrdered: - ld b,d - ld c,e - psh hl - psh bc - cal FindPixel - pop bc - pop de -connectedLine: - psh hl - ld h,c - ld c,a - ld a,d - sub b - ld b,a - ld a,e - jr nz,LineNotPoint - cp h - jr nz,LineNotPoint - pop hl - jr DoneLine -LineNotPoint: - sub h - ld de,32 - jr nc,LinePositiveY - neg - ld de,-32 -LinePositiveY: - cp b - jr nc,SteepLine - add a,a - ld (line2sm+1),a - ld h,a - xor a - sub b - add a,a - ld (line1sm+1),a - ld a,h - sub b - pop hl -LineLoopGentle: - psh af - ld a,(hl) - or c - ld (hl),a - rrc c - jr nc,$+3 - inc hl - pop af - jp m,line2sm -line1sm: - add a,0 - add hl,de -line2sm: - add a,0 - dnz LineLoopGentle -DoneLine: - ld a,(hl) - or c - ld (hl),a - pop de - pop hl - pop bc - ret -SteepLine: - ld h,a - neg - add a,a - ld (line3sm+1),a - ld a,b - add a,a - ld (line4sm+1),a - sub h - ld b,h - pop hl -LineLoopSteep: - psh af - ld a,(hl) - or c - ld (hl),a - add hl,de - pop af - jp m,line4sm -line3sm: - add a,0 - rrc c - jr nc,$+3 - inc hl -line4sm: - add a,0 - dnz LineLoopSteep - jr DoneLine +;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 @@ -3128,65 +3781,165 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl + ret ;thats it + +drawbox: ;(d,e)-(h,l) + ld b,l ;Delta-y + ld l,e +boxloop: + cal drawline + inc l + inc e + dnz boxloop ret +drawfatline: + cal drawline + inc d + inc h + cal drawline + inc e + inc l + cal drawline + dec d + dec h +; jp drawline + +;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 + psh hl + psh de + ld a,d ;a=d=x + cp h ;h=xx + jr c,lineXincs ;if x>xx + ex de,hl ;make x + ld c,a ;c=mask (always) + ld a,h ;a=xx + sub b ;xx-x + ld b,a ;b=deltax (always>0) + ld a,l ;a=yy + jr nz,lineexists ;deltax!=0 + cp e ;yy==y + jr nz,lineexists ;deltay!=0 + pop hl ; :0 -;de==0 = timeout - cal linkok - ld a,0 ;losses so far -linklosses =$-1 - inc a ;and this is another one - ld (linklosses),a - pop de ;return from link - cp lossout ;quit if too many errors - ret c ;otherwise just continue -linkerr: - jp Exit -linkfine: - in a,(7) - and %11 - ret - -;-------------- ;---- SEND ---- -;-------------- - -Csend: - ld b,32 -csendwait: - nop - dnz csendwait - cal Qsend - jr c,Csend - ret -Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde - in a,(7) - and %11 ;both wires low = exit signal - jr z,linkerr ;error otherwise +Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde --- + nop \ nop + cal linkfine + jr z,linkerr ;both wires low = exit signal ld b,8 ;bits to send sendloop: ld de,timeout @@ -3199,8 +3952,7 @@ sendbit: sendwaitack: cal checklink ;other calc must lower other wire jr nz,sendwaitack - ld a,D0HD1H ;raise one, ok to raise other - out (7),a + cal linkok ;raise one, ok to raise other (out (7),D0HD1H) sendfinish: cal checklink cp %11 ;both raised (by other calc) @@ -3211,26 +3963,24 @@ sendfinish: ld (linklosses),a ;reset number of losses ret ;=ok -;-------------- ;---- RECV ---- -;-------------- -Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl --- +Crecv: ;--- receive 8 bits into A/C --- destr:abCde --- cal Qrecv ret nc ;return if all went ok jr Crecv ;and try again -Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde --- - in a,(7) - and %11 +Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abCde --- + cal linkfine jr z,linkerr ;both low = error, quit ld b,8 ;bits to receive recvloop: - ld de,timeout +; ld de,timeout recvwait: - cal checklink + cal linktest ;checklink cp %11 jr z,recvwait ;both high = nothing sent (yet) + ld de,timeout rra ;received bit in cf ld a,D0LD1H jr c,received ;lower white wire as well @@ -3241,14 +3991,48 @@ received: recvwaitack: cal checklink jr z,recvwaitack ;same wire will be raised again by other calc - ld a,D0HD1H - out (7),a ;raise both + cal linkok ;raise both recvfinish: dnz recvloop ;repeat for all bits xor a ;nc=no error ld (linklosses),a ;reset number of losses ret +;---- COMMON ---- + +linkok: + ld a,D0HD1H + out (7),a ;raise both wires = link ok + ret + +checklink: ;load wires in A and check for timeout + dec de ;decrease timer + ld a,d + or e + jr z,linktimeout ;timeout if de==0 +linktest: + ld a,$BF + out (1),a ;select keys + in a,(1) ;input + bit 6,a ;exit key + jp z,Exit ;break! +linkfine: + in a,(7) + and %11 + ret +linktimeout: ;de==0 + cal linkok + ld a,0 ;losses so far +linklosses =$-1 + inc a ;and this is another one + ld (linklosses),a + pop de ;return from link + cp lossout ;quit if too many errors + ret c ;otherwise just continue +linkerr: + jp Exit + +#ifdef intlevels ;----------------------------- ;---------- levels ----------- @@ -3259,93 +4043,142 @@ LevelDef: .db 0,2,63 ;start d, y, x .db 128,57 ;field width (128-255), height (57-255) .db 0 ;no additional lines, boxes - .db 255 - ret + + .db 255 ;last level + ret ;ending code LevelDefM: - .db 8,4,15,15,0,0 + .db "Empty Arena",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 8,0,18,12,5 + .db "Fast Fun :))",0 + .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 0 + .db "Two Circles",0 .db 8,5,18,12,0,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 - .db 4,40,26,20,0 - .db 4,90,40,11,0,0 + .db 4,40,26,20,0 + .db 4,90,40,11,0,0 LevelDefT: ;tron=no delay + .db "Empty Tron Level",0 .db 8,4,18,12,5 .db %1110000,%10001000,%10001000,%10001000,%1110000,0 .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64 .db 128,57 .db 0 +LevelDefR: ;race + .db "Round and Round",0 + .db 8,4,18,12,5 + .db %1110000,%10001000,%10001000,%10001000,%1110000,0 + .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125 + .db 128,57 + .db 63,27 + .db 4,63,27,10,0,0 + LevelDefC: ;ctf + .db "Default CTF",0 .db 8,4,18,12,5 .db %1110000,%10001000,%10001000,%10001000,%1110000,0 - .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64 + .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125 .db 128,57 - .db 10,10,50,50 + .db 27,8,27,116 .db 0 +#endif + ;----------------------------- ;---------- data ------------- ;----------------------------- -wdPicture = 16 -wtPicture: -.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000 -.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000 -.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000 -.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000 -.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000 -.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000 -.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011 -.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100 -.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101 -.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101 -.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011 +wtPicture: ;title +.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000 +.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000 +.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000 +.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000 +.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000 +.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000 +.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000,%00111001,%11000110,%00000011,%11000010,%00011100,%01100010,%00100001,%01101000 +.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100,%00111001,%11000110,%01111000,%00100001,%00000000,%00000001,%11000001,%01101000 +.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00011111,%10000110,%10000101,%11100001,%00000000,%00000000,%00000001,%00010000 +.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00001111,%00001110,%10010110,%00010001,%00000000,%00000000,%00000000,%11100000 +.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100,%00000000,%00001100,%01100100,%00001001,%00111111,%11111111,%11000000,%00000000 +.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001110,%00000000,%00001100,%01000000,%10000001,%01000000,%00000000,%00000000,%00000000 +.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00000110,%00000000,%00011100,%01000000,%11000001,%01100101,%01001001,%10000011,%01100011 +.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00000111,%10000000,%00111000,%01000001,%00100001,%00110101,%00010101,%01000101,%01010100 +.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 + +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 +.db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000 +.db %00100000,%00000000,%00001110,%00110010,%00011001,%10011011,%01101010,%11100000,%00110011,%01101101,%11000111,%10000001,%00011100,%00000000,%00000000,%00001100 +.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 txtMenu: .db "Mode",0 ;1st menu item .db "Level",0 ;2nd - .db "Limit",0 ;... + .db "Link",0 ;... .db "Worms",0 .db "worm #",0 - .db "controls",0 -posMenu: .dw $$2418,$231E,$2524,$1F2A,$1730,$1936 +posMenu: .db 5 + .dw $2418,$231E,$2824,$1F2A,$1730 +txtMenuR: .db "controls",0 +txtoMenu: .db "Back",0 ;1st menu item + .db "Lives",0 ;2nd + .db "Limit",0 ;... + .db "Speed",0 + .db "Rotation",0 + .db "Growth",0 +posoMenu: .db 6 + .dw $2618,$251E,$2524,$222A,$1A30,$1C36 +txtpMenu: .db "Resume",0 ;1st menu item + .db "Turn Off",0 ;2nd + .db "Contrast",$CF,5,0 ;... + .db "Exit",0 +pospMenu: .db 4 + .dw $3418,$331E,$2F24,$3A2A txtGame: .db "Singleplayer",0 txtGame1: .db "Peaworm",0 txtGame2: .db "Tron",0 txtGame3: .db "Deathmatch",0 txtGame4: .db "Foodmatch",0 -txtGame5: .db "LinkMatch",0 -txtGame6: .db "Race",0 -txtGame7: .db "CTF",0 -; .db "Domination",0 ;8 -posGame: .db 0,txtGame1-txtGame +txtGame5: .db "Multifoodmatch",0 +txtGame6: .db "Timematch",0 +txtGame7: .db "Race",0 +txtGame8: .db "CTF" ;,0 + +posGame: .db 0 + .db txtGame1-txtGame .db txtGame2-txtGame .db txtGame3-txtGame .db txtGame4-txtGame .db txtGame5-txtGame .db txtGame6-txtGame .db txtGame7-txtGame - -txtKeyleft: .db "Left",0 -txtKeyright:.db " | Right",0 -txtLevsel: .db $CF," Select levels: ",5,0 -txtEName: .db "Enter name player ",0 + .db txtGame8-txtGame + +txtNone: .db "None",0 +txtDef: .db "Default",0 +txtYes: .db "Yes",0 +txtNo: .db "No",0 +txtKeyleft: .db ":left",0 +txtKeyright:.db "/right",0 +posLevsel = $0320 +txtLevsel: .db $CF," SELECT LEVELS ",5,0 txtWaiting: .db "Waiting...",0 txtReceive: .db "Receiving..." ;,0 @@ -3363,68 +4196,91 @@ TrigPrecalc: txtLevel: .db "Level ",0 txtWorms: .db "Worms: 0",0 ;follows txtLevel txtName: .db "Name",0 -txtDied: .db "Died " ;follows txtName +txtWinner: .db "Wins " ;follows txtName +txtDied: .db "Died " ;follows txtWinner txtScore: .db "Score",0 ;follows txtDied txtLeft: .db " left",0 ;follows txtScore txthiscore:.db "HiScore:",0 +#ifdef readytext txtReady: .db "Prepare!",0 txtposReady = 7 +#endif +#ifndef coolzgfx txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0 +#endif -_datalink = %00000001 ;linkplay -_datalivel = %00000010 ;lives=0 limit -_datafoodl = %00000100 ;left=0 limit -_datanextl = %00001000 ;next level if left=0 -_datasingl = %00001000 ;singleplayer=1 - ;1=hiscore+keep_length -_datafood = %00010000 ;food present -_datadie = %01000000 ;worm dies on impact -_datascore = %10000000 ;score>=100 limit -_datamultpeas = %00100000 -_datasp = %01011110 - +#ifdef intlevels datalevels: .dw LevelDef, LevelDefM .dw LevelDefT,LevelDefM - .dw LevelDefM,LevelDefM - .dw LevelDefM,LevelDefC -nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults - -savestart: + .dw LevelDefM,LevelDefM,LevelDefM + .dw LevelDefR,LevelDefC +nrlevels: .db 2,3,1,3,3,3,3,3,1,0 ;=defaults +#else +datalevels: .dw 0,0,0,0,0,0,0,0,0 +nrlevels: .dw 0,0,0,0,0 +#endif -gamesingle = 0 -datasingle: .db %01011110,3,1,1 ;3 lives (