X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/b262dccc8af53cee36ce4ea836a5a9d9ecc91e10..e10286b262c2acafc73f909a0c20e0915774f0d2:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index edb7056..e3150cd 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,57 +1,119 @@ -; Title : Wormy -; Version : 95% -; Release Date : summer 2001 -; Filename : wormy.86p (5kb) -; 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) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 95% = DONE - -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] -; 1% * misc (pollish, bugs, &&&) -; * LINK -; * fix first packet loss -; 1% * transmit game/level data -; 1% * 1/3 worms over link -;;;1% * get g/o signal (l&l) working -;;;1% * send new peas' positions - +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ +; ÛÛÛß ÛÛÛÛÝ +; ÛÛÛ ßÛÛÛ ÞÛÛÜ +;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ +;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ +;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ +;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ +;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ +;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ +;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ +; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ +; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ +; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ +; +; Version : 97% (0.97.115A) +; Release Date : 2002 January 15 +; Author(s) : Shiar +; Email Address : wormy@shiar.org +; Web Page : www.shiar.org +; Description : perfect Nibbles game with free movement, nine +; game modes, for 1-4 players +; Where to get this game : www.shiar.org +; Other games by author(s) : Nemesis beta +; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 +; Jonah Cohen : helped writing worm +; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca +; wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d +;_______________________________________________________________________________ + +;--- notes --- + +; * Use for LEARNING practises ONLY! +; Don't _ever_ release altered code w/o permission! +; Please notify me of using code, and give me credits! +; * 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 & labeled 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). +; * Also read wormy.txt please, thank you +; * Don't scroll down if you get scared easily. + +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| ____ |_____/ |_____| +;_______________________________________________________________________________ + +; 97% = DONE +; X [15] lives >9 dispay +; X [15] sp modes not configurable +; X [16] LVL: episode #2: 10 sp levels +; X [17] lives stats for every liveslimited game (also !dm) +; X [18] LINK: fix transmit game/level data +; X [19] datalevels+nrlevels not in program if !intlevels +; X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?) +; X [19] alter level editor to use new address and set level id #97 +; X [19A] team score! +; X [19A] autogrowth doesn't always work -> init (turn) +; X [111] ED: disabled objects counted causing CRASH when writing hiscore! +; X [111] LINK: init+multiple pea transmit seems to work.. +; X [111] LINK: host/client swapped (host now sends level config) +; X [111] LINK: optimize transmit (most initcode same for client+host) +; X [113] menu limit in multifm not x10 +; X [113] wormhit procedure seperate (called now) +; X [114] LINK: peas sent again :P +; X [114] internal level check and sprite storage removed +; X [115] layout data stuff at bottom +; X [115] ED: init place bar fixed +; X [115] ED: keys also usable together with mouse +; X [115] ED: improved version handling +; X [115] LINK: receive message not needed anymore afaik +; X [115A] $D8 used for spacing at g/o screen. i rule B) +; X [115A] exit at g/o goes back to menu +; X [115A] more in menu lets you reselect the levelfile +; X [115A] LINK: fixed waiting mode (minor display problem) +; * word-value display storage in chartable hole?? +; 1% * misc (bugs, &&&, pollish, &&, &) +; * look at init-z in line routine again +; * rare pea|wall overwrite <- apply stopworm fix? +; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* +; * LINK: called "Linkmatch" at g/o +; * LINK: minimize sent data (Gametype for example) +; * LVL: episode #3: at least 5 lvls for each mp mode +; * LVL: episode #4: 10 sp levels, including multipeas +; 1% * LVL: episode #5: ... +; * LVL: Wormage +; * LVL: Free Bird +; * LVL: Jonah? +; ;100% = bugs fixed + levels done - -;----------------------------- -;----------------------------- -;--------- W O R M --------- -;----------------------------- -;----------------------------- - -#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 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 -#define dnz djnz +; * correct team winners +; * arrow to offscreen peas +;110% * sound +; * startpos +;120% * coop (DON'T COUNT ON IT) +; * pause in linkplay + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #include "asm86.h" #include "ti86asm.inc" + #define cal call + #define psh push + #define dnz djnz + _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -82,87 +144,119 @@ _load_ram_ahl = $462F ;ahl->page+hl _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 - -;----------------------------- -;------- data storage ------- -;----------------------------- - -;--- permanent - -ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl + + #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 spprotect ;options not changable for singleplayer modes +;#define intlevels ;-internal levels +;#define readytext ;-displays "prepare" before level starts +;#define invincible ;-worms cannot die =) +;#define optdie ;-in race games worms dont die when they run into each other + +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- permanent --- + +ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) +worm4p = $A400 ;-A5FF (200) %101001O0 +;free = $A600 ;-A7FF (200) worm2p = $A800 ;-ABFF (400) %10101O00 -worm1 = $AC00 ;-AC1D (31d) -worm2 = $AC1F ;-AC3B (1F) -worm3 = $AC3E ;-AC59 (1F) -worm4 = $AC5D ;-AC77 (1F) -balls = $AC7C ;-ACFF (3x43d) -SinCosTable = $AD00 ;-AE00 (4*40) - ;free $AE01 ;-AFFF (1FF) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1F (1F) +worm2 = $AD20 ;-AD3E (1F) +worm3 = $AD3F ;-AD5D (1F) +worm4 = $AD5E ;-AD7C (1F) +balls = $AD7D ;-AE00 (<=3x44d) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AF05 (4-260) (peas) +;free = $AF06 ;-AFFF (F9) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - ;program $D748 ;-EFFF (186D+4A) -worm4p = $F000 ;-F3FF (400) %11110O00 -leveldata = $F400 ;-FA70 (<=671) - -turn10 = $AE01 ; (1) (counter) -peaspos = $AE02 ;-AE05 (4) (peas) +;buffer = $BC00 ;-BF90 (390) +;free = $BF91 ;-BFFF (6F) +;program = $D748 ;-EFFF (186D+4A) ;6327 +leveldata = $F080 ;-F9FF (<=97F) +#ifndef intlevels +datalevels = $FA00 ;-FA11 (12) (>=$C000) +nrlevels = $FA12 ;-FA1B (A) (<$FA70) +defspr = $F078 ;-F07F (8) +defsprsz = 0 +#endif -;MEM|8---9---A---B---C---D---E---F---| -; |..[------]||[]|......[-----]|[].| -; | SCREEN 2* 13 PRGM 4LV | +;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong +; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < +; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary --- namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif - -;----------------------------- -;------- program start ------- -;----------------------------- - -.org _asm_exec_ram - -wormVhost = 093 -wormVclient = 193 - -start: - nop - jp Start - .db 1 - nop - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- beta 95%",0 +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 + +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ + + .org %1101011101001000 + +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% .115A",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 + .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 = 95 ;wormy levels header = "95" +levelhead2 = 97 ;wormy levels header = "97" 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: @@ -188,8 +282,9 @@ Start: ldir inc a ;ld a,$D4 ld i,a - im 2 + im 2 ;...it *does* work ;) +restart: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -243,7 +338,7 @@ stringfound: inc ix _searchnext: cal _RAM_PAGE_7 - jr searchnext + jr searchnext loadgametype: psh de @@ -257,16 +352,30 @@ loadgametype: inc bc pop af pop de ;counter - dec d ;8x + dec d ;9x jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels ld ix,templevels-6 -levelselectmenu: +#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 @@ -278,12 +387,14 @@ levelselectmenu: ld hl,$FC00+(2*16) ld b,16*9 cal menuinvloop - ld hl,$FC00+(56*16) + ld hl,$FC00+$380 ;(*,56) cal hr ld hl,$0601 ;x=1 ld (_penCol),hl dispnextlevel: - ld a,(ix+3) + ld de,3 + add ix,de + ld a,(ix) ld b,a inc a ;cp 255 jr z,__levselect @@ -296,8 +407,6 @@ displevel: ld (hl),a ;y+6 cp 49 ;bottom of screen jr nc,_levselect - ld de,3 - add ix,de ld hl,availevels inc (hl) ld a,b ;(ix+0) @@ -307,8 +416,14 @@ displevel: cal _vputs jr dispnextlevel +loadlevel1: + psh ix + pop hl + ld b,-2 + jr loadlevel + readylevelfile: ;selected level at ahl -; ld hl,templevels-3 +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -370,7 +485,11 @@ 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 @@ -396,19 +515,21 @@ levselectmenu: loadlevel: cal readylevelfile +#ifdef intlevels or a ;levelfile on page 0 (=internal) jr z,levelloaded +#endif cal skiptitle ;skip description cal _Get_Word_ahl ld (leveldataSize),de - ld d,8 ;counter + ld d,9 ;counter ld bc,datalevels cal loadgametype ld (hilvlposa),a ;singleplayer levels ld (hilvlposhl),hl - ld d,4 + ld d,5 cal loadgametype cal _SET_ABS_SRC_ADDR ;levelsstart @@ -443,15 +564,19 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ - ld hl,TrigPrecalc - ld de,SinCosTable - psh de - ld bc,65 - ldir +;--- trig tables --- + + ld hl,trigtable ;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: @@ -470,11 +595,15 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;---draw menu--- -DisplayMenu: ;---draw menu--- +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) @@ -488,21 +617,20 @@ DisplayMenu: ;---draw menu--- ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: - ld hl,Gametype - ld a,(hl) + ld a,(Gametype) dec a ;will be inced @changegame - and 7 - ld (hl),a + cal changedgame ld hl,changegame ;dispmenusets ;mainMenu psh hl ;jump here after ret ld hl,txtMenu ld ix,posMenu -;Mode|Level|Limit|Worms|worm #|controls +;Mode|Level|Link|Worms|worm #|controls ; jr dispmenucommon ;cal +dispmenucommon_: + ld b,36*16/4 dispmenucommon: ld de,$FD80 ;begin pos - ld b,36*16/3 xor a clroldmenuloop: ld (de),a @@ -511,13 +639,15 @@ clroldmenuloop: inc de ld (de),a inc de + ld (de),a + inc de dnz clroldmenuloop - ld b,6 + 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 @@ -527,24 +657,34 @@ dispmenuloop: hr: ;draw horizontal line at hl ld b,16 - jp menuinvloop +; jp menuinvloop ;shorter but not good for pausescreen +hrloop: + ld (hl),-1 + inc hl + dnz hrloop + ret -;--- menu loop --- +;--- options menu --- dispoptionmenu: ld hl,txtoMenu ld ix,posoMenu ;Back|Lives|Limit|Speed|Rotation|Growth - cal dispmenucommon + cal dispmenucommon_ dispomenusets: +#ifdef spprotect + ld a,(gameCar) + and _datasingl + jp nz,LetsGetThisPartyOn +#endif cal clrold ld hl,$1E3E ld (_penCol),hl cal loadgamecar psh hl - cal cshowA0 ;lives + cal cshowA ;lives ld hl,$2A3E ld (_penCol),hl @@ -558,7 +698,7 @@ dispomenusets: cal _vputs jr dispspeeddone dispspeed: - cal cshowA0 + cal cshowA dispspeeddone: ld hl,$363E @@ -568,7 +708,7 @@ dispspeeddone: psh hl ld a,(hl) ;(growth) inc a ;-1=None; 0..98->1..99 - cal cshowA0 + cal cshowA ld hl,$303E ld (_penCol),hl @@ -582,7 +722,7 @@ dispspeeddone: cal _vputs jr dispturndone dispturn: - cal cshowA0 ;turn speed + cal cshowA ;turn speed dispturndone: ld hl,$243E @@ -592,9 +732,12 @@ dispturndone: ld a,(hl) ;(scorelimit) or a psh af - cal cshowA0 ;limit + cal cshowA ;limit pop af ;a==0? jr z,optionMenu ;do not display 0 behind 'None' + ld a,c ;(gameCar) + rla ;and _dataPmult + jr nz,optionMenu ;in multifood limit == #peas ld a,'0' cal _vputmap ;x10 @@ -744,7 +887,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu --- mainMenu: cal menupos @@ -760,9 +903,22 @@ select: ;2nd/enter dec a ;6th: controls jp z,changekeys jp LetsGetThisPartyOn ;otherwise + +changenrworms: + cal change4spOnly + ld a,(hl) ;hl=nrworms + inc a + cp 7 + jr nc,mainMenu ;may not be >4+2 +changednrworms: + ld (hl),a + jr _dispmenusets ;mainMenu + notselect cp K_EXIT jp z,ExitNoStats + cp K_MORE + jp z,restart psh af cal menupos cal loadgamecar @@ -787,13 +943,11 @@ selright: ; jr z,changecurworm changecurworm: -; hl=nrworms - ld a,(curworm) - cp (hl) - jr nc,mainMenu ;may not become >(nrworms) - inc a -changedcurworm: - ld (curworm),a + ld hl,curworm + ld a,(hl) + cp 4 + jr nc,mainMenu ;may not become >4 + inc (hl) jr _dispmenusets ;mainMenu selleft: @@ -810,33 +964,21 @@ selleft: ; jr z,bchangecurworm bchangecurworm: - ld a,(curworm) - dec a ;0-3 - jr nz,changedcurworm ;save >0 + ld hl,curworm + ld a,(hl) + dec (hl) ;0-3 + jr nz,_dispmenusets ;save >0 + inc (hl) +_mainMenu: jr mainMenu -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 -changenrwormsInit: - ld a,(Gametype) - cp 3 - ld a,(hl) ;hl=nrworms - ret bchangenrworms: cal change4spOnly ld a,(hl) ;hl=nrworms - dec a ;0-3 + dec a ;0-(3+2) cp 2 jr nc,changednrworms ;save >=2 -_mainMenu: - jr mainMenu + jr _mainMenu change4spOnly: ld a,(Gametype) @@ -863,7 +1005,12 @@ changegame: jr z,changegame jr dispmenusets ;mainMenu changedgame: - and 7 ;mod 8 + 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 @@ -921,12 +1068,12 @@ waitcustomkey: changekeys: cal getwormname - ld hl,txtKeyleft + ld hl,txtKleft cal getcustomkey ;left cal getcustomkey ;right ; jr dispmenusets -;---display current settings--- +;--- display current settings --- dispmenusets: cal clrold @@ -950,8 +1097,15 @@ dispmenusets: psh hl inc hl ld a,(hl) + dec a ;0-5 + and 3 ;0-3 + inc a ;1-4 add a,'0' cal _vputmap + ld a,(hl) + cp 5 + ld hl,txtteamed + cal nc,_vputs ld hl,$243E ld (_penCol),hl @@ -972,7 +1126,7 @@ displink: or a ;gamesingle jr nz,displvlname ld a,(Level) - cal cshowA0 + cal cshowA00 jr lvldisped displvlname: cal _vputs @@ -1086,7 +1240,7 @@ emptyname: ld (hl),' ' inc hl dnz emptyname - ld a,maxnamelength + ld a,maxnamesize ld (namelength),a enternameloop: ld hl,$FF07 ;begin pos @@ -1111,7 +1265,7 @@ nokeypressed: jr nz,continue backspace: ld a,(hl) - cp maxnamelength + cp maxnamesize jr nc,nokeypressed inc (hl) dec ix @@ -1136,21 +1290,27 @@ continue: cal releasekeys jr enternameloop +savestr: + .db "00000" ;,0 ;&&&somehow put in chartable's 5-byte hole chartable: - .db 0,".<>!",0,0,0,0 ;down,L,R,up - .db 0,"XTOJE0",0 ;enter..clear - .db " WSNID9",0 ;(-)..custom - .db "ZVRMHC8",0 ;dot..del - .db "YUQLGB7#" ;0..xvar - .db $D9,"-PKFA6'" ;on..alpha - .db "54321*",0,$D0 ;F5..more + .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|- + .db -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|- + .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|- + .db "ZVRMHC8",-1 ;.|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*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more nameentered: pop ix ;stringbegin ld (ix+8),0 ;end mark jp DisplayMenu -;--proc +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ ubergetkey: halt ;woo hoo @@ -1177,13 +1337,10 @@ clroldsetsloop: 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,24+1 ;go to datalevels + add a,a ld e,a ;=de - sbc hl,de ;datalevels + ld hl,datalevels + add hl,de cal _ldHLind ;ld hl,(hl) pop de ;de=loadgamecar inc de \ inc de @@ -1237,18 +1394,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 @@ -1278,110 +1438,226 @@ loadgamecar: ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - cal loadgamecar - psh hl - ld (wormbeglives),a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - inc hl ;level +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 a,(hl) - ld (customspeed),a + ld (hl),b ;score=0 inc hl - ld a,(hl) - ld (growspeed),a + ld (hl),b ;score+1=0 inc hl - ld a,(hl) - ld (turnleft),a - ld (turnright),a ;more efficient + ld (hl),2 ;delay=2 inc hl - ld l,(hl) - ld h,0 - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),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 - pop hl ;loadgamecar +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype cal hlatlevel - - psh hl ;1st level - ld a,(gameCar) + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,0 +gameCar =$-1 rra ;and _datalink - jr nc,GameOver + jr nc,_StartLevel + +;--- link --- + +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow ld c,wormVhost cal Qsend - ld hl,txtWaiting + ld hl,txtWaitn cal _puts cal Crecv ld a,c cp wormVclient - jr z,client - cp wormVhost - jr z,host + jr nz,host + +;--- client --- + +client: +; ld hl,txtReceiv +; cal _puts ;shouldnt be necessary since this part always seems to work afaik + + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld e,worm3+left&255 + cal moveworm2 ;3=2 + ld l,worm1+name&255 + cal sendworm + ld l,worm2+left&255 + cal linkworm ;worm2+4 over link + pop hl ;loadgamecar + pop de ;leveldata + ld de,linklevel + ld hl,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 + +_StartLevel: + jr StartLevel + +linkerror: pop hl ;error jp DisplayMenu ;return to menu +;--- set/send worms --- + +moveworm2: + ld hl,worm2+left +moveworm: ;hl=wormN+left + ld d,worm1/256 + ld bc,11 + ldir ;keys+name worm(de) = worm(hl) + ret +linkworm: ;hl=wormN+left + ld (hl),0 ;worm1|2+left + inc hl + inc hl ;+name + ld b,9 + cal recvstuff + ld bc,worm3-worm1-11 ;+2 + add hl,bc ;b=0 + ld (hl),b ;worm3|4+left + inc hl + inc hl ;+name + ld b,9 + jp recvstuff +sendworm: ;hl=wormN+name + ld b,9 + cal sendstuff + ld bc,worm3-worm1-9 + add hl,bc ;worm(N+2)+name + ld b,9 + jp sendstuff + +;--- host --- + host: + cp wormVhost + jr nz,linkerror ld c,wormVclient cal Qsend - ld a,$18 - jr multiplayer -client: - ld hl,txtReceive - cal _puts - ld a,$E6 -multiplayer: - ld (SwapPos),a -; ld a,2 -; ld (nrworms),a -;----------------------------- -;--------- game over --------- -;----------------------------- - -GameOver: - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: + ;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 e,worm4+left&255 + cal moveworm2 ;4=2 + ld e,worm2+left&255 + ld hl,worm1+left + cal moveworm ;2=1 + ld l,worm1+left&255 + cal linkworm ;worm1+3 over link + ld l,worm2+name&255 + cal sendworm + 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 ;8 - add hl,bc -; ld b,0 - ld (hl),b ;died=0 - inc hl - ld (hl),b ;score=0 + ld b,168 + cal sendstuff + +;--- load level --- + +StartLevel: + pop hl ;loadgamecar + ld a,(hl) + ld (wormbeglives),a + inc hl ;nrworms + ld b,$11 ;=ignore (ld) + ld a,(hl) + cp 5 + jr c,teamset + sub 2 + ld b,$CD ;=continue (call) +teamset: + ld (nrworms),a + ld a,b + ld (doteam),a ;do team score (CD) or not (11) + inc hl ;level inc hl - ld (hl),b ;score+1=0 + ld a,(hl) + ld (customspeed),a inc hl - ld (hl),2 ;delay=2 + ld a,(hl) + ld (growspeed),a + ld (turn),a inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop + ld l,(hl) + ld h,0 + ld a,(gameCar) + rla + ld a,h ;(Left)=256 + jr nc,setscorelimit + ld a,l + ld l,h +setscorelimit: + ld (customleft),a + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl -StartLevel: +Nextlevel: cal _clrWindow pop hl ;begin of current level ld a,(hl) inc a ;=255? - jp nz,nextlevel + jp nz,donextlevel psh hl ld hl,Level @@ -1393,13 +1669,30 @@ StartLevel: psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: +donextlevel: ld a,(Gametype) or a ;gamesingle psh af cal nz,skiplvltitle - ld de,Left - ldi + 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 ld a,0 customspeed =$-1 @@ -1414,7 +1707,7 @@ setspeed: ld de,peagrowth ldi ld a,(hl) - ld (worm1+grow),a + ld (worm1+grow),a ;&&sh ld (worm2+grow),a ld (worm3+grow),a ld (worm4+grow),a @@ -1432,10 +1725,10 @@ setspeed: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defspritesz + ld a,defsprsz defsprsize =$-1 defsprite =$+1 - ld de,defspriteimg + ld de,defspr setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -1478,8 +1771,11 @@ worminit: ld (hl),a ;y2 inc hl ld (hl),a ;x2 + inc hl + inc hl + ld (hl),a ;growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc pop bc ;<0 dnz worminit @@ -1489,8 +1785,9 @@ worminit: inc a ;ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level --- +initlevel: ld a,(de) inc de sub 128 @@ -1586,8 +1883,9 @@ levelhasbeensetup: cal drawstuff -;----------------------------- +;--- prepare --- +leveldone: psh hl ; >> levelp new cal forceshowstats @@ -1609,7 +1907,6 @@ maskline: dec c jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1624,59 +1921,11 @@ maskline: res 3,(iy+5) #endif - ld a,0 -gameCar =$-1 - rra ;and _datalink - jr nc,initfinished ;no link - 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 - ld hl,worm1+name - ld b,9 - cal recvstuff - ld hl,worm2+name - ld b,9 - cal sendstuff - jr initfinished -sendstuff: - psh bc - ld c,(hl) - inc hl - psh hl - cal Qsend - pop hl - pop bc - dnz sendstuff - ret -recvstuff: - psh bc - psh hl - cal Qrecv - pop hl - ld (hl),c - inc hl - pop bc - dnz recvstuff - ret -sethost: - 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 -initfinished: ld a,(gameCar) - and _datafood - jr z,nofood - ld ix,worm1 - cal NewPea + rla ;bit __bitPmult,a + cal c,multnewpea ;a=0 + rla ;bit __bitfood,a + cal nc,NewPea nofood: ld bc,(worm1+pos) cal DisplayField @@ -1687,9 +1936,11 @@ ReadyDelay: dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1733,10 +1984,10 @@ NoDelay: inc a ;-1 jr z,nextturnok dec (hl) - dec a ;0 (now <0) + dec a ;>=0 jr nz,nextturnok growspeed =$+1 - ld (hl),$FF + ld (hl),$FF ;reset nextturnok: ld a,(gameCar) @@ -1780,85 +2031,110 @@ handleworms: inc (hl) ;0..nrworms-1 dnz handleworms -;----------------------------- -;---------- keys ------------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _______ __ __ _______ +; |____/ |______ \_/ |______ +; | \_ |______ | ______| +;_______________________________________________________________________________ HandleKeys: ld a,%10111111 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 ;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 +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 - ld a,(Gametype) - cp gamectf ;ctf no death penalty - cal nz,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,(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 -#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 @@ -1875,9 +2151,9 @@ SpSave = $-2 ld hl,$FC10 ld b,16*11 cal menuinvloop ;invert - ld hl,$FD80 + ld hl,$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow ld (hl),2 @@ -1887,9 +2163,9 @@ SpSave = $-2 ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert - inc h ;$FD80 + inc h ;$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow inc (hl) @@ -1905,12 +2181,14 @@ CURtxtGame =$-2 ld (_penCol),de ld hl,txtName cal _vputs ;Name - ld a,$3D + ld a,$3C ld (_penCol),a cal _vputs ;Died Score ld de,$0004 ld (_curRow),de +;--- who won? --- + findwinner: ld hl,(worm1+score) ld (winnerscore),hl @@ -1949,7 +2227,17 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;---display worms--- +;--- display worms --- + +;x123456789012345678901 +;>>>>>> GAME OVER <<<<< +;2Multiplayer +;3Level 01 +;4 Died Score: +;5NameName 03 00070 +;6Worm#02 @ 05 00120 +;7Worm#03 15 00030 +;8Snaky @ 00 04820 ld a,(nrworms) ld b,a @@ -1961,7 +2249,7 @@ displayWormStats: ld bc,left-died add hl,bc ;+left xor a - cp (hl) ;input=0 = link + cp (hl) ;left=0 = link jr nz,NoLinkIndic ld a,9 ld (_curCol),a @@ -2006,7 +2294,8 @@ notwinner: psh hl inc hl ;worm+score cal _ldHLind - cal showHL + cal _D_HL_DECI + cal _puts ;showHL pop hl ld bc,worm2-worm1 @@ -2077,50 +2366,22 @@ NotNewHigh: ld hl,highsave+2 cal _puts ld hl,(highsave) - cal showHL + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: + ld hl,DisplayMenu + psh hl ;main menu +waitkeyloop: cal ubergetkey cp K_ENTER - jp z,DisplayMenu + ret z cp K_SECOND - jp z,DisplayMenu + ret z cp K_EXIT - jr nz,waitkey - -;x123456789012345678901 -;>>>>>> GAME OVER <<<<< -;2Multiplayer -;3Level 01 -;4 Died Score: -;5NameName 03 00070 -;6Worm#02 @ 05 00120 -;7Worm#03 15 00030 -;8Snaky @ 00 04820 - -ExitNoStats: - cal linkok - ld hl,_asapvar - rst 20h ;_ABS_MOV10TOOP1 - rst 10h ;_FINDSYM - ld hl,savestart-_asm_exec_ram+4 - xor a - add hl,de - adc a,b ;ahl=bde+4 - cal _SET_ABS_DEST_ADDR - - xor a - ld hl,savestart - cal _SET_ABS_SRC_ADDR - ld hl,saveend-savestart - cal _MM_LDIR_SET_SIZE - - cal releasekeys - res 4,(iy+9) - set 2,(iy+13) - im 1 ;remove keyfix - jp _clrWindow + jr nz,waitkeyloop + ret loadhiscoreposinahl: ld hl,0 ;for peaworm and singleplayer @@ -2147,7 +2408,7 @@ hiscrposa =$+1 adc a,0 ;ahl=saveloc ret highsave: - .db 0,0,"WOR ",0 + .db 0,0,"SHI ",0 iswinner: ld a,10 @@ -2155,16 +2416,43 @@ iswinner: ld a,'*' jp _putc ;..then put * -;----------------------------- -;----------- worm ------------ -;----------------------------- +;--- quit --- + +ExitNoStats: + cal linkok + ld hl,_asapvar + rst 20h ;_ABS_MOV10TOOP1 + rst 10h ;_FINDSYM + ld hl,savestart-_asm_exec_ram+4 + xor a + add hl,de + adc a,b ;ahl=bde+4 + cal _SET_ABS_DEST_ADDR + + xor a + ld hl,savestart + cal _SET_ABS_SRC_ADDR + ld hl,saveend-savestart + cal _MM_LDIR_SET_SIZE + + cal releasekeys + res 4,(iy+9) + set 2,(iy+13) + im 1 ;remove keyfix + jp _clrWindow + +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ respawncheck: - cp respawndelay-1 + cp rspawndelay-1 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) @@ -2179,6 +2467,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -2189,6 +2479,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2267,7 +2558,11 @@ inlink: ld l,c ret -;------- handle worm --------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2306,6 +2601,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2317,11 +2613,12 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif -;-------- move worm ---------- +;--- move worm --- Wormmove: - psh bc ; >> pos + psh bc ;pos ld a,(hl) add a,a add a,d @@ -2347,13 +2644,13 @@ notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos - ld (ix+pos2),e - ld (ix+pos2+1),d ld (ix+pos),c ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d ;-check- - pop hl ; << pos (old) + pop hl ;pos (old) ld a,h sub b and 1 @@ -2369,222 +2666,23 @@ notmoveY: ;bc=newpos GotFour: cal chk4pixels rl d - jp nc,Drawworm + cal c,hitworm -;--------- worm hit ---------- +;--- draw worm --- -Hitworm: - ld a,(gameCar) - ld h,a -#ifdef optdie - and _datadie - cal z,checkhitotherworm - ld a,h -#endif - and _datamultpeas ;&&bit - jr nz,chkctfpeas - ld a,h - and _datafood - jp z,WormDead ;no food +Drawworm: + ld c,(ix+pos) + ld b,(ix+pos+1) - ld hl,0 -PeaY =$-2 -PeaX =$-1 - cal chkpeahit - jp nc,WormDead - cal DrawPea ;remove pea - ld a,(ix+grow) - add a,15 -peagrowth =$-1 - ld (ix+grow),a - cal NewPea - ld hl,Left - dec (hl) - psh af - ld e,10 - cal IncScore - pop af - jp nz,Drawworm ;continue - ld a,(gameCar) - and _datafoodl - jp z,Drawworm ld a,(Gametype) - or a - jp nz,Exit ;stack restored - - ld hl,Level - ld a,(hl) - inc (hl) - ld l,a ;hl=Level - ld h,0 - add hl,hl - add hl,hl - cal _HLTIMES10 - ex de,hl - cal _IncScore ;score+(40*level) - cal removeworm - pop hl ; << call - pop hl ; << call - ld (ix+delay),2 - jp StartLevel + cp gamerace + cal z,checkhitlapline -chkpeahit: ;bc=ownpos;hl=peapos (destr:ad) - ld a,(sprsize) - inc a - ld d,a - ld a,b - sub h - inc a - cp d ;=(sprsize)+1 - ret nc ;nc=no pea - ld a,c - sub l - inc a - cp d - ret ;c=pea - -chkctfpeas: - ld hl,(peaspos) ;1st pea - ld a,(ix+reserv) - ld e,a ;push a - and %01 ;ourpea (0|1) - jr z,sel_otherpea - ld hl,(peaspos+2) ;2nd pea ;&&&ex de,hl? -sel_otherpea: - cal chkpeahit - 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 - 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 %11 ;invert flag taken + ownflag - ld (ix+reserv),a - and %10 ;just returned? - psh af ;safe z-flag - cal DrawPea ;remove - pop af - 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 - -;----------------------------- - -nextotherwormbit: - ld a,c - sub (hl) - inc hl - inc a - cp 4 - jr nc,nothit1 ;no - ld a,b - sub (hl) - inc a - cp 4 - ret c ;nz ;yes -nothit1: - inc hl - cal resbit -ChkWorm: - cal _cphlde - jr nz,nextotherwormbit - ret ;z - -checkhitlapline: - ld a,(peaspos) ;63 - sub b ;x==63 - jr z,nextlaphalf - inc a - ret nz -nextlaphalf: - 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) - 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 e,20 - cal IncScore ;lap! - pop bc - ret - -#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 -#endif -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 ---------- - -Drawworm: - ld c,(ix+pos) - ld b,(ix+pos+1) - - ld a,(Gametype) - cp gamerace - cal z,checkhitlapline - - cal set4pixels - dec c - ld a,(growspeed) - or a ;0=tron - ret z ;keep tail in "Tron" + cal set4pixels + dec c + ld a,(growspeed) + or a ;0=tron + ret z ;keep tail in "Tron" ld l,(ix+head) ld h,(ix+head+1) @@ -2596,10 +2694,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: @@ -2612,6 +2714,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 @@ -2627,9 +2736,11 @@ ResPixel: ld (hl),a ret -;----------------------------- -;---------- ball ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ handlethoseneatlittleballs: ld hl,balls @@ -2722,9 +2833,217 @@ checkballhit: pop de ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ __ __ _ _ _____ _______ +; | | | | | |_____/ | | | \_/ |_____| | | +; |__|__| |_____| | \_ | | | | _____ | | __|__ | +;_______________________________________________________________________________ + +hitworm: + ld a,(gameCar) +#ifdef optdie +; if race - originally + ld h,a + cal checkhitotherworm + ld a,h +#endif + bit __bitPctf,a + jr nz,chkctfpeas + rla ;and _dataPmult + jp c,chkmultpeas + rla ;and _datafood + jp c,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 + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: + ld hl,Left + dec (hl) ;dec left before display + psh af + ld e,10 + cal IncScore + pop af + jp nz,Drawworm ;continue + ld a,(Gametype) + or a + jp nz,Exit ;stack restored + + ld hl,Level + ld a,(hl) + inc (hl) + ld l,a ;hl=Level + ld h,0 + add hl,hl + add hl,hl + cal _HLTIMES10 + ex de,hl + cal _IncScore ;score+(40*level) + cal removeworm + pop hl ;<<$some call + pop hl ;<yline -> a=1 + xor a ;y a=0 +checklap: + cp (ix+reserv) + 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 e,20 + cal IncScore ;lap! + pop bc + ret + +;_______________________________________________________________________________ +; _____ ______ _____ _______ _______ +; |_____] |_____/ | | | |______ +; | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ releasekeys: halt @@ -2755,6 +3074,94 @@ Seed =$+1 add a,2 ret +wormdead: + pop hl ;<0: don't exit + dnz checklives +anyworm: + ld a,$A7 ;exit@end of turn + ld (CheckExit),a ;set exit state + ret ;finish turn + +#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) @@ -2791,22 +3198,21 @@ tryDrawPea: ;hl=peapos;bc=dopea jr z,DrawPea ret -sendnewpeaoverlink: - ld a,(gameCar) - rra ;and _datalink - ret nc ;no link - ld a,(ix+left) - or a - jr z,receivenewpeaoverlink - ld c,l ;send pea's pos - cal Qsend - ld c,h - jp Qsend ;&&&possible jr -receivenewpeaoverlink: - cal Qrecv ;Crecv - ld l,c - cal Qrecv ;Crecv - ld h,c +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 + ld a,-1 ret NewPea: @@ -2825,6 +3231,7 @@ NewPea: DrawPea: ;hl=(PeaY) ld b,h ld c,l +drawpea_: ld de,0 spritepos =$-2 ; jp PutSprite @@ -2867,9 +3274,56 @@ nextbitok: dnz sprloopy ret -;----------- score ----------- +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ +; |______ | | | |_____/ |______ +; ______| |_____ |_____| | \_ |______ +;_______________________________________________________________________________ + +addteamscore: + ld a,(handledworm) + cp 2 + ld de,worm3-worm1 + jr c,bla + ld de,worm1-worm3 +bla: + psh ix + add ix,de + ex de,hl + cal ldscoreinhl + pop ix + add hl,de + ret + +_divHLby1000: + psh hl + ld b,3 +divideagain: ;3x + cal _divHLby10 + dnz divideagain + ld a,l ;a=hl/1000 + pop hl + ret + +DecScore10: + cal ldscoreinhl + ld de,-10 + add hl,de + jr nc,showstats ;<0=0 + jr scorecommon + +extralives: + cal _divHLby1000 + ld c,a + add hl,de ;increase score + cal _divHLby1000 + cp c + jr z,scorecommon ;hl/1000 not increased + inc (ix+lives) + jr scorecommon -timematchscore: ;piece of crap checking whether you've already won in timematch +timematchscore: + ;piece of crap checking whether you've already won in timematch ld a,(nrworms) ld b,a ;# of worms dec a @@ -2884,7 +3338,7 @@ chktimematchover: jr z,nneexxtt ;yourself cp (hl) ret nz ;someone else still alive - dec hl ;+delay + dec hl ;+del0ay dec hl ;+score+1 ld a,(hl) cp (ix+score+1) @@ -2904,39 +3358,10 @@ nneexxtt: dnz chktimematchover jp anyworm ;g/o -_divHLby1000: - psh hl - ld b,3 -divideagain: ;3x - cal _divHLby10 - dnz divideagain - ld a,l ;a=hl/1000 - pop hl - ret - -extralives: - cal _divHLby1000 - ld c,a - 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) + cal ldscoreinhl ld a,(Gametype) or a ;if singleplayer... jr z,extralives @@ -2944,6 +3369,8 @@ _IncScore ; inc by de scorecommon: ld (ix+score+1),h ld (ix+score),l ;save +doteam: + cal addteamscore ;cal=CD | ld de,*=11 ld de,0 scorelimit =$-2 ld a,d @@ -2959,7 +3386,8 @@ showstats: ld hl,$FC00 ;&&&only necessary in deathmatch ld b,6*16-1 clearstats: - ld (hl),a ;=0 + ; ld (hl),a ;=0 + ;&&&&&& inc hl dnz clearstats forceshowstats: @@ -3008,19 +3436,23 @@ nameshown: ret showstat: ;(multiplayer) - ld a,(Gametype) - cp gamedeathm - jr z,showlives + ld a,(wormbeglives) + or a + jr nz,showlives showscore: - ld h,(ix+score+1) - ld l,(ix+score) + cal ldscoreinhl cal _D_HL_DECI jr __vputs showlives: ld a,(ix+lives) -showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) - cp 10 - jr c,showleastsign + jr cshowA00 + +cshowA: ;small w/ leading 0 + or a ;destr. ahl + jr nz,cshowA00 + ld hl,txtNone + jp _vputs +cshowA00: ld l,a ld h,0 cal _divHLby10 @@ -3029,7 +3461,7 @@ showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) add a,'0' cal __vputmap pop af -showleastsign: +cshowA0: add a,'0' __vputmap: psh ix @@ -3042,24 +3474,29 @@ showstatsS: ;(singleplayer) cal __vputs ld a,0 Level =$-1 - cal showA + cp 10 + psh af + cal c,cshowA0 + pop af + cal nc,cshowA00 - ld a,98 + ld a,97 ld (_penCol),a cal showscore ld a,123 ld (_penCol),a - cal showlives + ld a,(ix+lives) + cal cshowA0 ;showlives ld a,(gameCar) and _datafoodl pop ix ret z showleft: - ld a,31 + ld a,33 ld (_penCol),a ld a,0 Left =$-1 - cal cshowA0 + cal cshowA ld hl,txtLeft __vputs: @@ -3084,46 +3521,32 @@ showA0: ;big w/ leading 0 add a,'0' jp _putc -cshowA0: ;small w/ leading 0 - or a - jr nz,cshowavalue - ld hl,txtNone - jp _vputs -cshowavalue: - ld l,a - ld h,0 - cal _divHLby10 - psh af - ld a,l - add a,'0' - cal __vputmap - pop af - add a,'0' - jp __vputmap - -showHL: - cal _D_HL_DECI - jp _puts - _D_HL_DECI: - ld de,savestr+4 + ld de,savestr+5 ld b,5 ldhld: cal _divHLby10 add a,'0' - ld (de),a dec de + ld (de),a dnz ldhld - ld hl,savestr + ex de,hl ;ld hl,savestr + ret + +ldscoreinhl: + ld h,(ix+score+1) + ld l,(ix+score) ret -savestr: - .db "00000",0 -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _______ _____ _______ __ __ +; | \ | |______ |_____] | |_____| \_/ +; |_____/ __|__ ______| | |_____ | | | +;_______________________________________________________________________________ -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: @@ -3343,7 +3766,11 @@ ChunkRow: ld c,$37 ;scf ret -;----------- draw ------------ +;_______________________________________________________________________________ +; ______ ______ _______ _ _ _ +; | \ |_____/ |_____| | | | +; |_____/ | \_ | | |__|__| +;_______________________________________________________________________________ ;--- pixel --- @@ -3392,7 +3819,7 @@ 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 @@ -3430,6 +3857,14 @@ drawsmtn: ; dec a ;4 = circle ; jp z,drawcircle +;--- circle --- + +;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 ld a,h @@ -3493,7 +3928,9 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl - ret + ret ;thats it + +;--- box --- drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3505,6 +3942,8 @@ boxloop: dnz boxloop ret +;--- fatline --- + drawfatline: cal drawline inc d @@ -3517,159 +3956,170 @@ drawfatline: dec h ; jp drawline -;LINE (d,e)-(h,l) -;destroyes a +;--- line --- + +;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 - cp h - jr c,lineOrdered - ex de,hl -lineOrdered: + 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 +;--- multiple bytes --- + +sendstuff: + psh de +sendstuffloop: + psh bc + ld c,(hl) + inc hl + cal Qsend + pop bc + dnz sendstuffloop + pop de + ret +recvstuff: + psh de +recvstuffloop: + psh bc + cal Qrecv + ld (hl),c + inc hl + pop bc + dnz recvstuffloop + pop de ret -;---- SEND ---- +;--- foo --- -Csend: - ld b,32 -csendwait: - nop - dnz csendwait - cal Qsend - jr c,Csend +receivenewpeaoverlink: + cal Qrecv ;Crecv + ld l,c + cal Qrecv ;Crecv + ld h,c ret +sendnewpeaoverlink: + ld a,(gameCar) + rra ;and _datalink + ret nc ;no link + ld a,(worm1+left) + or a + jr z,receivenewpeaoverlink + ld c,l ;send pea's pos + cal Qsend + ld c,h +; jr Qsend ;that's why it's here -Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde +;--- send --- + +Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde --- nop \ nop - in a,(7) - and %11 ;both wires low = exit signal - jr z,linkerr ;error otherwise + cal linkfine + jr z,linkerr ;both wires low = exit signal ld b,8 ;bits to send sendloop: ld de,timeout @@ -3693,24 +4143,24 @@ sendfinish: ld (linklosses),a ;reset number of losses ret ;=ok -;---- RECV ---- +;--- 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 @@ -3728,10 +4178,46 @@ recvfinish: 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 -;----------------------------- -;---------- levels ----------- -;----------------------------- +#ifdef intlevels +;_______________________________________________________________________________ +; _____ __ _ _______ _______ _ _ _______ _______ +; | | \ | | | |______ \ / |______ | |______ +; __|__ | \_| | _____ |_____ |______ \/ |______ |_____ ______| +;_______________________________________________________________________________ LevelDef: .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls @@ -3744,13 +4230,13 @@ LevelDef: LevelDefM: .db "Empty Arena",0 - .db 8,4,15,15,0,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 "Fast Fun :))",0 - .db 8,0,18,12,5 + .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 @@ -3789,11 +4275,17 @@ LevelDefC: ;ctf .db 27,8,27,116 .db 0 -;----------------------------- -;---------- data ------------- -;----------------------------- +#endif + +;_______________________________________________________________________________ +; ______ _______ _______ _______ +; | \ |_____| | |_____| +; |_____/ | | | | | +;_______________________________________________________________________________ -wtPicture: +;--- graphics --- + +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 @@ -3811,7 +4303,7 @@ wtPicture: .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: +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 @@ -3822,116 +4314,141 @@ wtWormy: ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000 -txtMenu: .db "Mode",0 ;1st menu item - .db "Level",0 ;2nd - .db "Link",0 ;... - .db "Worms",0 - .db "worm #",0 - .db 0 -posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936 -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: .dw $2618,$251E,$2524,$222A,$1A30,$1C36 -txtGame: .db "Singleplayer",0 -txtGame1: .db "Peaworm",0 -txtGame2: .db "Tron",0 -txtGame3: .db "Deathmatch",0 -txtGame4: .db "Foodmatch",0 -txtGame5: .db "Timematch",0 -txtGame6: .db "Race",0 -txtGame7: .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 +#ifndef coolzgfx +txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0 +#endif + +;--- menus --- + +txtMenu: .db "Mode",0 ;1st menu item + .db "Level",0 ;2nd + .db "Link",0 ;... + .db "Worms",0 + .db "worm #",0 +posMenu: .db 5 + .dw $2418,$231E,$2824,$1F2A,$1730 +txtteamed: .db " vs 2",0 +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 + +;--- text --- + +txtGame: .db "Singleplayer",0 +txtGame1: .db "Peaworm",0 +txtGame2: .db "Tron",0 +txtGame3: .db "Deathmatch",0 +txtGame4: .db "Foodmatch",0 +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 + .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 - -TrigPrecalc: -.db 0, 3, 6, 9, 12, 15, 18, 21 -.db 24, 27, 30, 33, 36, 39, 42, 45 -.db 48, 51, 54, 57, 59, 62, 65, 67 -.db 70, 73, 75, 78, 80, 82, 85, 87 -.db 89, 91, 94, 96, 98,100,102,103 -.db 105,107,108,110,112,113,114,116 -.db 117,118,119,120,121,122,123,123 -.db 124,125,125,126,126,126,126,126 -.db 127 +txtKleft: .db ":left",0 +txtKright: .db "/right",0 +posLevsel = $0320 +txtLevsel: .db $CF," SELECT LEVELS ",5,0 +txtWaitn: .db "Waiting" ;"...",0 +txtReceiv: .db "...",0 +#ifdef readytext +txtReady: .db "Prepare!",0 +txtposReady = 7 +#endif txtLevel: .db "Level ",0 txtWorms: .db "Worms: 0",0 ;follows txtLevel txtName: .db "Name",0 -txtWinner: .db "Wins " ;follows txtName -txtDied: .db "Died " ;follows txtWinner +txtWinner: .db "Wins",$D8 ;follows txtName +txtDied: .db "Died",$D8 ;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 +txthiscore:.db "HiScore:" ;,0 + +;--- foo --- + +trigtable: .db 0, 3, 6, 9, 12, 15, 18, 21 + .db 24, 27, 30, 33, 36, 39, 42, 45 + .db 48, 51, 54, 57, 59, 62, 65, 67 + .db 70, 73, 75, 78, 80, 82, 85, 87 + .db 89, 91, 94, 96, 98,100,102,103 + .db 105,107,108,110,112,113,114,116 + .db 117,118,119,120,121,122,123,123 + .db 124,125,125,126,126,126,126,126,127 + +#ifdef intlevels +datalevels:.dw LevelDef, LevelDefM,LevelDefT + .dw LevelDefM,LevelDefM,LevelDefM,LevelDefM + .dw LevelDefR,LevelDefC +nrlevels: .db 2,3,1,3,3,3,3,3,1,0 ;=defaults +defhiscrpos: + .db 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI" +#else +defhiscrpos = 0 #endif -datalevels: .dw LevelDef, LevelDefM - .dw LevelDefT,LevelDefM - .dw LevelDefM,LevelDefM - .dw LevelDefR,LevelDefC -nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults - -_datalink = %0000001 ;linkplay -_datafoodl = %0000010 ;left=0 limit -_datasingl = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) -_datamultpeas = %0001000 ;multiple peas=1 -_datatime = %0010000 ;time incs score (timematch) -_datafood = %0100000 ;food present -_datadie = %1000000 ;worm dies on impact -;reserved %10000000 ;for future use - -savestart: ; Úgame info (see above) - ; | Úlives (0=unlimited) - ; | | Únrworms (can be altered by user) - ; | | | Úlevel (reset to 1 at startup) - ; | | | | Úspeed/delay (-1=def) - ; | | | | | Úgrow speed (-1=none; 0=continuous) - ; | | | | | | Úturn speed (8=def) - ; | | | | | | | Úscore limit (0=none) -gamesingle = 0 ;used | | | | | | | | -datasingle: .db %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives) -gamepeas = 1 -datapeas: .db %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live) -gametron = 2 -datatron: .db %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth) -gamedeathm = 3 ;used -datadeathm: .db %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth) -gamefoodm = 4 -datafoodm: .db %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score) -gametimem = 5 -datatimem: .db %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score) -gamerace = 6 ;used -datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision) -gamectf = 7 ;used -datactf: .db %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score) +;--- game settings --- + +_datalink = %00000001 ;linkplay (1!) +_datafoodl = %00000010 ;left=0 limit +_datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) &&1? +_dataPctf = %00001000 ;ctf peas=1 +__bitPctf = 3 +_datatime = %00010000 ;time incs score (timematch) +;reserved %00100000 ;for future use +_datafood = %01000000 ;food present=0 (6!) +_dataPmult = %10000000 ;multiple peas=1 (no _datafood) (7!) + +savestart: ; Úgame info (see above) + ; | Úlives (0=unlimited) + ; | | Únrworms (can be altered by user) + ; | | | Úlevel (reset to 1 at startup) + ; | | | | Úspeed/delay (-1=def) + ; | | | | | Úgrow speed (-1=none; 0=continuous) + ; | | | | | | Úturn speed (8=def) + ; | | | | | | | Úscore limit (0=none) +gamesingle = 0 ; | | | | | | | | +datasingle:.db %00000110,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) +gametron = 2 +datatron: .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth) +gamedeathm = 3 +datadeathm:.db %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth) +gamefoodm = 4 +datafoodm: .db %00000000,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) +gametimem = 6 +datatimem: .db %01010000,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 +datactf: .db %01001000,0,6,1,-1,-1, 8,10 ;CTF (100 score) worm1set: .dw worm1p,worm1p .db %11110111,1,-01,K_RIGHT,K_LEFT @@ -3943,92 +4460,56 @@ worm3set: .dw worm3p,worm3p .db %11111011,1,-01,K_COMMA,K_STO worm3name: .db "NIBBLER ",0 worm4set: .dw worm4p,worm4p - .db %11111011,0,-01,K_PLUS,K_ENTER + .db %11111101,0,-01,K_PLUS,K_ENTER worm4name: .db "JIM ",0 -defhiscrpos: - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - -Gametype: .db 0 ;last gamemode +Gametype: .db 0 ;last gamemode saveend: - ;set: -heading = 0 ;level* -pos = 2 ;level* -pos2 = 4 ;level -grow = 6 ;level -died = 8 ;game -score = 9 ;game -delay = 11 ;game - ;19B @game -lives = 12 -head = 13 ;4B (head=tail) -tail = 15 ;also@next level -storepos = 17 -reserv = 18 ;loop (race:lap|ctf:pea) -input = 19 -left = 20 -right = 21 -name = 22 -wormsize = 31 - -startdelay = 30 -respawndelay = 30 -maxnamelength = 8+1 - -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db " wormy@shiar.org",0 - -defspritesz = 4 -defspriteimg: .db %01100000 - .db %11110000 - .db %11110000 - .db %01100000 - -deflevels: - .db "Internal Levels",0 - .db "by SHIAR -- still t" - .db "o be added...." ;,0 - - .db 0,deflevels/256,deflevels&255 + ;set: +heading = 0 ;level* +pos = 2 ;level* +pos2 = 4 ;level +grow = 6 ;level +died = 8 ;game +score = 9 ;game +delay = 11 ;game + ;19B @game +lives = 12 +head = 13 ;4B (head=tail) +tail = 15 ;also@next level +storepos = 17 +reserv = 18 ;loop (race:lap|ctf:pea) +input = 19 ;---currently unused afaik--- +left = 20 +right = 21 +name = 22 +wormsize = 31 + +startdelay = 30 +rspawndelay = 30 +maxnamesize = 8+1 + +#ifdef intlevels +defsprsz = 4 +defspr: .db %01100000 + .db %11110000 + .db %11110000 + .db %01100000 + +deflevels: .db "Internal Levels",0 + .db "by Shiar" ;,0 + + .db 0,deflevels/256,deflevels&255 +#endif templevels: -;----------------------------- -;----------- end ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _ _ _______ _______ . _______ _______ +; | |_____| |_____| | ' |______ |_____| | | +; | | | | | | ______| _____ | | |_____ |_____ +;_______________________________________________________________________________ .end