X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/8f37ce5d3f4fb337115fbe7bd092fbc5b66b0085..ffc09c3d6a3bbfa0ab06d1d0223762a8b7165d5d:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 24250e5..0aba3e5 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,60 +1,185 @@ -; 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) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 93% = DONE - -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] -; 1% * misc (pollish, bugs, &&&) -; * LINK -; 0% * fix first packet loss -; 1% * transmit game/level data -; 1% * get g/o signal (l&l) working -; 2% * send new peas' positions -; * CTF -; 1% * fix pea XOR problem in ctf -; 1% * fix wormstop in race - -;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 hlines ;horizontal-line routine for more speed drawing boxes - ;^^(doesn't work properly)^^ -;#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 +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ +; ÛÛÛß ÛÛÛÛÝ +; ÛÛÛ ßÛÛÛ ÞÛÛÜ +;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ +;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ +;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ +;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ +;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ +;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ +;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ +; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ +; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ +; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ +; +; Version : 98% (0.98.227) +; Release Date : 2002 February 27 +; 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, many levels and editor +; Where to get this game : wormy.shiar.org +; Other games by author(s) : Nemesis beta +; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 +; Jonah Cohen : helped writing worm +; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca +; wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d +;_______________________________________________________________________________ + +;--- notes --------------------------------------------------------------------- + +; * Game README is wormy.txt +; * Use for LEARNING practises ONLY! +; * Don't _ever_ release altered code w/o permission! +; * Give me credits when you use any of this stuff +; * I'm not responsible for any damage this might cause, yada yada... +; * Although I've commented & labeled quite some stuff, due to +; crazy optimizations and weird coding, it may be harder to +; understand than the average blob of code. This is probably _not_ +; the best source to learn z80 from. w00t the Shyer Way (tm). +; * Email me. If you've got suggestions, tell me. +; * Don't scroll down if you get scared easily. + +;--- index --------------------------------------------------------------------- + +;-* TO_DO +; | future features +;--* #INCLUDE +;---* STORAGE +; | permanent +; | temporary +; | layout +;----* PROG_START +; | search levels +;-----* LEV_SELECT +;------* MORE_INIT +; | trig tables +;-------* MAIN_MENU +; | draw menu +; | options menu +; | main menu +; | display current settings +; | handle menukeys +; | change name +;--------* MISC_PROCS +;---------* START_GAME +; | link +; | client +; | set/send worms +; | host +; | load game +; | draw level +; | prepare +;----------* GAME_LOOP +;-----------* KEYS +; | pause menu +;------------* GAME_OVER +; | who won? +; | display worms +; | quit +;-------------* WORM_STUFF +;--------------* WORM_ALIVE +; | move worm +; | draw worm +;---------------* BOUNCYBALL +;----------------* WORMY_HIT +; | multifood +; | ctf +; | main +; | foodmatch|SP +; | take pea +; | misc +;-----------------* PROCS +;------------------* SCORE +;-------------------* DISPLAY +;--------------------* DRAW +; | pixel +; | findpixel +; | objects +; | circle +; | box +; | fatline +; | line +;---------------------* LINK! +; | multiple bytes +; | foo +; | send +; | recv +; | common +;----------------------* INT_LEVELS +;-----------------------* DATA +; | graphics +; | menus +; | text +; | foo +; | game settings +;------------------------* THAT'S_ALL + +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| ____ |_____/ |_____| +;_______________________________________________________________________________ + +; 98% = CURRENT +; X [119] ED: new 53 file format with support for 128 objects instead of 32 +; X [119] LVL: episode #4: 10 hard sp levels (ordered XO-XO-XO-X) +; X [120] fixed greymask (and it now ands instead of ors) +; X [120] fixed growth set after death +; X [121] fixed linkplay (couldn't turn it on anymore..) +; X [121] LVL: Wormage + Wormage ][ (2x 10 sp levels) +; X [121] pea randomizer doesn't give x>128 +; X [121] mixed single-/multipea singleplayer levels (re)set correctly +; X [126] circles left|above 0,0 drawn correctly now! +; X [126] fixed multiple pages of levelfiles +; X [29] optimized a few more bytes (less empty bytes so prettier binary ;) +; X [225] ED: ctf/race level copy/move fix +; X [225] LVL: episode #1: 5 ctf+5 race; episode #3 removed (all in #1 now) +; X [225] add v2 id (yas2) +; X [227] redundant calls removed or moved +; X [227] fixed: ctf score increased by taking _any_ pea +; X [227] no more points in race for dieing on the second half +; X [227] no score decrease for dieing in race (no longer needed, see above) +; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* +; * LVL: episode #5: 10 easy sp levels (do i _have_ to?) +; * LVL: Eric's Yumworms (ep#5?) +; * LVL: Free Bird +; * LVL: Jonah? +; * scorebar last digit (at 128-3) not displayed by _vputs +; 1% * fix any bugs that come up + +;--- future features ----------------------------------------------------------- + +;just a maybe-list; NO guarantees! +; +; * correct team winners +; * level compression +; * ubersized bouncies ;) +; * arrow to offscreen peas +; * w00t AI +; * sound +; * startpos +; * pause in linkplay +; * coop (DON'T COUNT ON IT) + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #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 @@ -67,11 +192,11 @@ _MOV4B = $429B ;4x ld (de),(hl) _MOV5B = $4297 ;5x ld (de),(hl) _mov9b = $4283 ;9x ld (de),(hl) _ldHLind = $4010 ;ld hl,(hl) -_swapt_ = $45F3 ;ex_ahl_bde +_swapt_ = $45F3 ;ex ahl,bde (doesn't work?) _Get_Word_ahl = $521D ;ld de,(ahl) _Set_Word_ahl = $5221 ;ld (ahl),de -_INC_PTR_AHL = $4637 ;ahl=ahl+1 -_AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2 +_INC_PTR_AHL = $4637 ;inc ahl +_AHL_PLUS_2_PG3 = $4C3F ;add ahl,2 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl @@ -85,111 +210,203 @@ _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 +_OP1TOOP6 = $4263 + + #define id2 ;yas2 level identifier - this'll add (65) bytes + #define buffer ;use display buffer, otherwise write directly to screen (11) + #define readymask ;"greys" out the field before starting a level (20) +;#define readytext ;-displays "prepare" before level starts (42) + #define coolzgfx ;nice graphics for game over screen (98) + #define spprotect ;options not changable for singleplayer modes +;#define intlevels ;-internal levels + ;-to become invincible, define the magic word :D + +levelhead = 'w' +levelhead2 = 97 ;wormy levels header = "0" + +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- 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 (4x40) - ;free $AE01 ;-AFFF (1FF) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1E (1E) +worm2 = $AD1F ;-AD3C (1E) +worm3 = $AD3D ;-AD5A (1E) +worm4 = $AD5B ;-AD78 (1E) +balls = $AD79 ;-AE00 (<=3x2D) (bb<=45) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AF05 (4-104) (peas) +;free = $AF06 ;-AFFF (F9) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - - ;program $D748 ;-E7FF (106D+4A) - ;free $E800 ;-EFFF (800) -worm4p = $F000 ;-F3FF (400) %11110O00 -leveldata = $F400 ;-FA70 (<=671) +;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) +#endif -turn10 = $AE01 -peaspos = $AE02 +;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: +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 + +;--- layout -------------------------------------------------------------------- + +;(wormN) offs: set: +heading = 0 ;level* +pos = 2 ;level* +pos2 = 4 ;level +grow = 6 ;level +died = 8 ;game: +score = 9 +delay = 11 +lives = 12 +head = 13 + ; Ú15B (wormNset) +tail = 15 ; |also@next level +storepos = 17 ; | +reserv = 18 ; |loop (race:lap|ctf:pea) +left = 19 ; | +right = 20 ; | +name = 21 ; |_ + +wormsize = 30 ;^mark^ + +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ + + .org %1101011101001000 + +start: ;turn back NOW! + nop ;and so it begins... + jp Start +#ifndef id2 + ld bc,$5242 + rst 10h + .dw WormIcon +#else + ld (bc),a nop - jp Start - .dw 1 - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- beta 93%",0 + ld d,h + rst 10h + .dw WormIcon + .dw WormData +#endif + 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 " 98% .227",0 WormIcon: - .db 8,2 - .db %00110000,%00111100 - .db %01110000,%00111110 - .db %11100000,%00000111 - .db %11000011,%11000011 - .db %11000111,%11100011 - .db %11101110,%01100111 - .db %01111100,%01111110 - .db %00111000,%00111100 - -levelhead = 'w' -levelhead2 = 94 ;wormy levels header = "93" + .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 +#ifdef id2 +WormData: + .db 1 + .dw wormlevel +wormlevel: + .db 4 ;priority + .db 12 ;string + .db "wor" ;description + .dw yasexec ;execution routine + .dw yascomment-yasdetect + .dw yasdetect-$-1 ;detection routine + .dw yasicon-yascomment + .dw yascomment-$-1 ;comment routine + .dw yasdataend-yasicon + .dw yasicon-$-1 ;icon routine +yasexec: + rst 10h + ex de,hl + ld a,b + cal skiptitle ;title (plus size+header <- all non-0) +; cal skiptitle ;description + jp leveldataAHL-3 +yasdetect: + cal _AHL_PLUS_2_PG3 ;skip past length bytes + cal _Get_Word_ahl + ld hl,levelhead+(levelhead2*256) + call _cphlde + ret z + scf + ret +yascomment: + inc hl + inc hl ;skip header + ret +yasicon: + ld hl,$F400+levelicon-yasicon + ld bc,6+(256*1) + or a + ret +levelicon: + .db %00011100 ;..XXX... ...XXX.. + .db %00011110 ;.X...X.. ...XXXX. + .db %00000011 ;.X..X... ......XX + .db %10000001 ;X..X..XX X......X + .db %01011011 ;X..X..XX .X.XX.XX + .db %01101110 ;X...XXX. .XX.XXX. +yasdataend: +#endif 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: - ld (SpSave),sp - cal _runindicoff - cal _flushallmenus - - im 1 - ld a,$D4 - ld h,a - ld l,0 ;ld hl,$D400 - ld d,a - ld e,1 ;ld de,$D401 - ld b,e - 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 bc,int_end-int_handler - ldir - inc a ;ld a,$D4 - ld i,a - im 2 +;--- search levels ------------------------------------------------------------- +Start: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -205,11 +422,8 @@ searchloop: jr z,stringfound searchnext: pop hl - dec hl ;5x - dec hl - dec hl - dec hl - dec hl + ld de,-5 + add hl,de ld b,(hl) ;name size inc b skipname: @@ -232,122 +446,98 @@ stringfound: cp e jr nz,_searchnext ;not worm ld a,levelhead2 - cp d + cp d ;=0 jr nz,_searchnext - inc ix ;save level's ahl - ld a,h - ld (ix),a - inc ix - ld a,l - ld (ix),a - inc ix + ld (ix+1),h ;save level's ahl + ld (ix+2),l + ld de,3 ;&&&d=0 + add ix,de _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 + dec d ;9x jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + 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: >" - ld hl,$0601 ;x=1 + cal _vputs ;"< SELECT LEVELS >" + ld hl,$FC00+(2*16) + ld b,16*9 + cal menuinvloop + ld hl,$FC00+$380 ;(*,56) + cal hr + ld hl,$0C01 ;x=1 ld (_penCol),hl - pop hl dispnextlevel: - ld a,(hl) - inc a ;cp 255 - jr z,_levselect - ld a,(hl) ;ade=(hl) -displevel: - inc hl - ld d,(hl) - inc hl - ld e,(hl) - inc hl - psh hl - ex de,hl ;ahl=ade=(hl) + ld de,3 + add ix,de ;goto next + ld a,(ix) + ld h,(ix+1) + ld l,(ix+2) cal _load_ram_ahl ;hl=ahl - ld b,(hl) ;b=title size cal _vputs + ld hl,availevels + inc (hl) + ld a,(ix+3) ;next + inc a ;cp 255 + jr z,__levselect ld hl,_penCol ld (hl),$01 ;x=1 inc hl ld a,(hl) add a,6 ld (hl),a ;y+6 - ld hl,availevels - inc (hl) - pop hl + cp 49 ;bottom of screen + jr nc,_levselect 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 - jp z,ExitNoStats - 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 @@ -355,37 +545,105 @@ 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 levselectmenuloop+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 +levselectmenuloop: + 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,levselectmenuloop +; jr z,loadlevel +loadlevel: + cal readylevelfile +#ifdef intlevels + or a ;levelfile on page 0 (=internal) + jr z,levelloaded +#endif + cal skiptitle ;skip description +leveldataAHL: 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 @@ -408,6 +666,36 @@ leveldataSize =$-2 levelloaded: cal _RAM_PAGE_1 +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ + + ld (SpSave),sp + cal _runindicoff + cal _flushallmenus + + im 1 + ld a,$D4 + ld h,a + ld l,0 ;ld hl,$D400 + ld d,a + ld e,1 ;ld de,$D401 + ld b,e + 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 bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 ;...it *does* work ;) + res 2,(iy+13) ;appAutoScroll ld a,r ld (Seed),a @@ -420,15 +708,13 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;--- trig tables --------------------------------------------------------------- - ld hl,TrigPrecalc - ld de,SinCosTable - psh de ; >> 1 - ld bc,65 - ldir + 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: @@ -437,7 +723,7 @@ MirrorSineWave: ld (de),a inc de dnz MirrorSineWave - pop hl ; << 0k + pop hl ;SinCosTable ld b,128+64 NegativeSineWave: xor a @@ -447,47 +733,67 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;--- draw menu ----------------------------------------------------------------- -DisplayMenu: ;---draw menu--- +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) ld hl,wtPicture - ld bc,16*16 + ld a,3 +optimize__w00t: ;may look like crap, but actually saves 3 bytes! + ldi + ld bc,6 + ex de,hl + add hl,bc + ex de,hl ;add de,6 + ld c,16-7 ;=bc + ldir + dec a + jr nz,optimize__w00t + ld c,13*16 ;=bc ldir - ld hl,$FC00+$160 + ld hl,$FC00+$010 ;(*,01) + cal hr + ld hl,$FC00+$160 ;(*,22) cal hr - ld hl,$FC00+$3E0 + ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: - ld hl,dispmenusets ;mainMenu + 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 -;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 c,4 ld (de),a inc de - ld (de),a - inc de - ld (de),a - inc de + dec c + jr nz,clroldmenuloop+2 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 @@ -497,17 +803,27 @@ 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 ;SP -> start game +#endif cal clrold ld hl,$1E3E @@ -565,6 +881,9 @@ dispturndone: 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 @@ -586,9 +905,9 @@ notoselect cal loadgamecar inc hl pop af - cp K_LEFT + sub K_LEFT jr z,seloleft - cp K_RIGHT + dec a ;K_RIGHT ld a,b jr nz,optionMenu @@ -657,7 +976,7 @@ changelimitInit: changespeed: cal changespeedInit inc a - cp 99 + cp 20 jr nc,_optionMenu ;>98 changedspeed: dec hl ;(Speed) @@ -714,7 +1033,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu ----------------------------------------------------------------- mainMenu: cal menupos @@ -730,17 +1049,30 @@ 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,Start psh af cal menupos 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 @@ -757,13 +1089,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: @@ -780,37 +1110,24 @@ 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 -_dispmenusets: - 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) + ld a,(gametype) cp 3 ret nc pop hl ;cal @@ -820,34 +1137,43 @@ changelink: bchangelink: cal change4spOnly dec hl ;inced earlier - dec hl ;gameCar + dec hl ;gamecar ld a,1 ;change LS-bit (=link) xor (hl) ;0=1; 1=0 ld (hl),a +_dispmenusets: jr dispmenusets ;mainMenu changegame: - ld a,0 -Gametype =$-1 + ld a,(gametype) inc a -changedgame: - and 7 ;mod 8 - ld (Gametype),a + cal changedgame + jr z,changegame jr dispmenusets ;mainMenu +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) + ld a,(gametype) dec a - jr changedgame + 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 @@ -862,13 +1188,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 @@ -881,41 +1214,39 @@ 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 ld de,$183E ld (_penCol),de - ld d,0 - ld a,(Gametype) - ld e,a - ld hl,posGame - add hl,de ;hl=posGame+(Gametype) - ld a,(hl) ;str.offset - ld e,a ;^d=0^ - ld hl,txtGame - add hl,de ;txtGameX - ld (CURtxtGame),hl ;save for g/o - cal _vputs ;Singleplayer + cal clrold + cal loadtxtgame + cal _vputs ;Singleplayer or smtn ld hl,$2A3E ;worms ld (_penCol),hl cal loadgamecar - inc hl 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 - rr c ;(gameCar) + rr c ;(gamecar) ld hl,txtNo jr nc,displink ld hl,txtYes @@ -924,10 +1255,20 @@ displink: 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 cshowA00 + jr lvldisped +displvlname: + cal _vputs +lvldisped: + pop bc ld hl,$3032 ld (_penCol),hl @@ -947,13 +1288,12 @@ curworm =$-1 cal _vputs jp mainMenu -;--- handle menukeys --- +;--- handle menukeys ----------------------------------------------------------- menucall: psh bc menuwaitkey: - halt \ halt - cal GET_KEY + cal ubergetkey or a jr z,menuwaitkey pop bc ;GET_KEY destr. b @@ -1009,21 +1349,20 @@ menunewok: ld b,a jr menupos -;--- change name --- -; of worm#(curworm) +;--- change name --------------------------------------------------------------- getwormname: ;of (curworm) ld a,(curworm) - add a,a ;2x ld e,a + add a,a ;2x add a,a ;4x add a,a ;8x add a,a ;16x - add a,e ;18x + sub e ;15x ld e,a ld d,0 ;de=a - ld ix,worm1name-18 + ld ix,worm1name-15 add ix,de ret @@ -1037,7 +1376,7 @@ emptyname: ld (hl),' ' inc hl dnz emptyname - ld a,maxnamelength + ld a,maxnamesize ld (namelength),a enternameloop: ld hl,$FF07 ;begin pos @@ -1047,14 +1386,12 @@ enternameloop: ld (_penCol),hl pop hl psh hl - ld (ix),0 + ld (ix),a ;clroldcustom -> a=0 cal __vputs - ld (ix),' ' ld a,'_' cal __vputmap nokeypressed: - halt - cal GET_KEY + cal ubergetkey or a jr z,nokeypressed @@ -1063,12 +1400,13 @@ nokeypressed: jr nz,continue backspace: ld a,(hl) - cp maxnamelength + cp maxnamesize jr nc,nokeypressed inc (hl) dec ix jr enternameloop continue: + ld d,0 cp K_ENTER jr z,nameentered cp K_EXIT @@ -1076,9 +1414,8 @@ continue: dec (hl) ;(namelength) jr z,nameentered - ld hl,chartable - ld e,a - ld d,0 + ld hl,chartable-1 + ld e,a ;d=0 add hl,de ld a,(hl) or a @@ -1088,23 +1425,33 @@ continue: cal releasekeys jr enternameloop -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 - -nameentered: +chartable: ;("!@#$%,0" also used in _D_HL_DECI) + .db ".<>!" ;down|L|R|up|-|-|-|- + .db "w00t!" ;(makes code look way better) + .db "XTOJE0",-2 ;enter|+|-|*|/|^|clear|- + .db " WSNID9",-3 ;(-)|3|6|9|)|tan|custom|- + .db "ZVRMHC8",-4 ;.|2|5|8|(|cos|prgm|del + .db "YUQLGB7#" ;0|1|4|7|ee|sin|table|xvar + .db $D9,"-PKFA6'" ;on|sto|,|x2|ln|log|graph|alpha + .db "54321*",-5,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more + +nameentered: ;d=0 pop ix ;stringbegin - ld (ix+8),0 ;end mark + ld (ix+8),d ;end mark jp DisplayMenu -;--proc +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ -clrold: +ubergetkey: + halt ;woo hoo + halt ;save them batteries! yeah! + jp GET_KEY + +clrold: ;destr:acdehl (acd=0) ld hl,$FD97 ;begin pos ld a,35 ;nr of lines clroldcustom: @@ -1121,11 +1468,42 @@ clroldsetsloop: jr nz,clroldsettings ret -skiplevel: ;@hl - destr:ab - alter:hl - inc hl - inc hl +hlatlevel: ;d must be 0 + psh hl ;loadgamecar + ld a,(gametype) + add a,a + ld e,a ;=de + ld hl,datalevels + add hl,de ;+2*mode + cal _ldHLind ;ld hl,(hl) + ex (sp),hl ;hl=loadgamecar + ld e,2 ;=de + add hl,de + ld a,(hl) ;(curlevel) + ld (Level),a + ld c,a ;begin level + pop hl ;@level1 +skiplevelloop: + dec c ;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 - inc hl ;skip 4 + jr nz,skiplvltitle + ret + +skiplevel: ;@hl; de=2 - destr:ab - alter:hl + ld a,(gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle + add hl,de + add hl,de ;skip 4 ld b,(hl) ;spritesize inc b skipsprite: @@ -1134,50 +1512,39 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - ld a,(Gametype) - cp gamesingle - jr z,skipworms + pop af ;cp (gametype),0 + jr z,skipstuff inc b ;multiplayer lvl inc b inc b ;skip other 3 worms (9 bytes) -skipworms: - ld a,b - add a,a - add a,b - ld b,a ;3x(balls+2) -skipballs: - inc hl - dnz skipballs - -skipflags: - ld a,(Gametype) - cp gamectf - jr nz,noflagstoskip - inc hl - inc hl - inc hl - inc hl -noflagstoskip: - +skipstuff: + add hl,de + inc hl ;3x(balls+2) + dnz skipstuff + sub gamerace ;a=(gametype) + jr z,skiplaps + dec a ;gamectf + jr nz,skipobjects + add hl,de +skiplaps: + add hl,de skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end - inc hl - inc hl - inc hl - inc hl + add hl,de + add hl,de jr skipobjects loadgamecar: -;in: (Gametype) +;in: (gametype) ;out: hl=dataTYPE -;build: c=(gameCar)=(hl-1) +;build: c=(gamecar)=(hl-1) ; a=(wormbeglives)=(hl) ;destr: acdehl ld hl,datasingle - ld a,(Gametype) + ld a,(gametype) add a,a add a,a add a,a ;8 bytes per mode @@ -1185,142 +1552,232 @@ loadgamecar: ld d,0 add hl,de ld a,(hl) - ld (gameCar),a + ld (gamecar),a ld c,a inc hl ld a,(hl) 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 c,2 + ld (hl),c ;+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 + ldir ;+head=+tail (2) + dec hl + dec hl + ld c,wormsize-tail ;=bc + ldir ;copy 15 bytes + dec a ;loop + jr nz,createwormsloop - pop hl ;loadgamecar - psh hl - 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 - ld e,a ;=de - sbc hl,de ;datalevels +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype + cal hlatlevel + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,(gamecar) + 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,(gameCar) - rra ;and _datalink - jr nc,GameOver +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 ;game setup + ld hl,gametype ;+gamecar + ld b,2 + cal recvstuff ;transmit game + ex de,hl + ld b,168 + cal recvstuff ;level + ld d,b + cal loadtxtgame ;set CURtxtGame + +_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: -; cal linkok -; ld a,D0LD1L -; out (7),a - 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 ;setup + ld hl,gametype ;+gamecar + ld b,2 + cal sendstuff ;game ex de,hl - ld bc,died - add hl,bc - ld b,0 - ld (hl),b ;died=0 - inc hl - ld (hl),b ;score=0 + ld b,168 + cal sendstuff ;level + +;--- 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 ;and _dataPmult + 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 de,Left ld a,(hl) inc a ;=255? - jp nz,nextlevel + jp nz,donextlevel psh hl ld hl,Level @@ -1332,26 +1789,49 @@ StartLevel: psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: - ldi +donextlevel: + ld de,gametype + ld a,(de) + or a ;gamesingle + psh af + jr nz,customnrpeas +;--sp-- + inc de + ld a,(de) ;gamecar + rla ;prepare a + rlc (hl) ;bit 7 of (hl)... + rra ;...to bit 7 of (gamecar) + rrc (hl) ;restore (hl) + ld (de),a + ld a,(hl) + and 127 ;actual #peas + jr setnrpeas +;--!sp-- +customnrpeas: + cal skiplvltitle + ld a,0 +customleft =$-1 + +setnrpeas: + ld (Left),a + inc a + ld (lefttotal),a + inc hl + ld de,Speed ld a,0 customspeed =$-1 inc a ;$FF=def - jr z,defspeed + jr nz,setspeed + ld a,(hl) ;speed from level + inc a +setspeed: dec a - ld (hl),a ;store new speed -defspeed: - ld de,Speed - ldi + ld (de),a ;custom speed + inc hl ld de,peagrowth ldi - ld a,(hl) - ld (worm1+grow),a - ld (worm2+grow),a - ld (worm3+grow),a - ld (worm4+grow),a - ld (beginsize),a - inc hl + ld de,growsize + ldi ld a,(hl) inc hl @@ -1364,10 +1844,14 @@ defspeed: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defspritesz +#ifndef intlevels + ld a,42 ;always overwritten +#else + ld a,defsprsz +#endif defsprsize =$-1 defsprite =$+1 - ld de,defspriteimg + ld de,defspr setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -1392,38 +1876,43 @@ toobad_noballs: #endif ld hl,worm1 - ld a,(Gametype) - cp gamesingle + pop af ;cp (gametype),0 ld b,1 jr z,worminit ld b,4 worminit: 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 a,(growsize) + ld (hl),a ;+growL inc hl - ld (hl),a ;x2 + xor a + ld (hl),a ;+growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc pop bc ;<0 dnz worminit inc a ;ld a,1 ld (turn10),a - ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level ---------------------------------------------------------------- +initlevel: ld a,(de) inc de sub 128 @@ -1442,29 +1931,23 @@ setfieldy: psh de ; >> levelp ld a,l ;pop sub 5 - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl ;32=scr.width + cal ldhl32a 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 @@ -1476,12 +1959,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: @@ -1503,50 +1986,54 @@ NoVertShift: pop hl ; << levelp - ld a,(Gametype) - cp gamectf - jr nz,noctf + ld a,(gametype) + 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 forceshowstats - ld a,(gameCar) - and _datafood - jr z,nofood - cal NewPea + + ld a,(gamecar) + rla ;and _dataPmult + cal c,multnewpea ;a=0 + rla ;and _datafood + cal nc,NewPea nofood: ld bc,(worm1+pos) cal DisplayField #ifdef readymask ld hl,$FC70 - ld d,%10101010 - ld c,56 + ld de,57*256+%10101010 maskloop: - ld a,d - xor %11111111 - ld d,a + ld a,e + cpl + ld e,a ld b,$10 maskline: ld a,(hl) - or d + and e ld (hl),a inc hl dnz maskline - dec c + dec d jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1561,57 +2048,17 @@ 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 - cal Qrecv - ld a,c - ld (worm2+name+0),a - cal Qrecv - ld a,c - ld (worm2+name+1),a - cal Qrecv - ld a,c - ld (worm2+name+2),a - cal Qrecv - ld a,c - ld (worm2+name+3),a - cal Qrecv - 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: - ld b,startdelay ReadyDelay: halt dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1655,13 +2102,13 @@ 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) + ld a,(gamecar) and _datatime jr z,nodispupdate ld hl,turn10 @@ -1671,6 +2118,17 @@ nextturnok: 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 @@ -1688,86 +2146,113 @@ handleworms: add ix,bc pop bc ld hl,handledworm - inc (hl) ;1..nrworms + 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 -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 - 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,(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) ;livematch: 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 @@ -1776,20 +2261,33 @@ 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,$FC00+$180 + cal hr ;menuinvloop w/ b=16 + ld hl,$FC00+$E0 + 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 + inc h ;$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr -; ld l,$74 -; ld b,8 -; cal menuinvloop ld hl,_curRow inc (hl) +#endif ld hl,txtGame CURtxtGame =$-2 cal _puts @@ -1801,12 +2299,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 @@ -1845,7 +2345,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 @@ -1857,7 +2367,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 @@ -1875,20 +2385,18 @@ NoLinkIndic: ld a,13 ld (_curCol),a ld a,(hl) ;worm+died - cal showA + cal showA0 pop hl psh hl - ld a,10 - ld (_curCol),a - ld a,(Gametype) + ld a,(gametype) cp gamedeathm jr nz,nodmwinner ;deathmatch? ld a,0 ;winner's deaths dmwinner =$-1 cp (hl) ;equals this worm? - jr nz,notwinner - jr iswinner + scf ;jr nz,notwinner + cal z,iswinner nodmwinner: jr c,notwinner ;no singleplayer winners inc hl ;worm+score @@ -1896,10 +2404,7 @@ nodmwinner: ld de,0 winnerscore =$-2 cal _cphlde ;==highest score.. - jr nz,notwinner -iswinner: - ld a,'*' - cal _putc ;..then put * + cal z,iswinner notwinner: ld a,16 ld (_curCol),a @@ -1907,7 +2412,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 @@ -1915,7 +2421,8 @@ notwinner: pop bc dnz displayWormStats - ld a,(Gametype) + ld de,gametype + ld a,(de) or a ;singleplayer (0) only jr nz,hilevelcheckdone checkhilevel: @@ -1932,38 +2439,41 @@ hilvlposhl =$-2 ;save external cal _writeb_inc_ahl ;ld (ahl),c hilevelcheckdone: - ld a,(gameCar) + inc de + ld a,(de) ;gamecar and _datasingl jr z,hiscorecheckdone ;no SP checkhiscore: - cal loadhiscoreposinahl + cal loadhiscoreposinahl ;cf=0 (and) cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile) +;-wild insertation- xor a - ld hl,highsave + ;Be Root to fix a Unix problem + ld hl,savestr + ;ReBoot to fix a Windows problem cal _SET_ABS_DEST_ADDR ;to local - ld hl,5 ;5 bytes - cal _MM_LDIR_SET_SIZE ;get old score+name - cal _RAM_PAGE_1 - - ld de,(highsave) ;de=prev. hiscore + ;W00t W00t to fix an assembly problem + cal mmldir5 ;get old score+name + ld de,(savestr) ;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 +newhigh: ;New>Old + ld (savestr),hl ;store new hiscore + ld de,savestr+2 ;to ld hl,worm1+name ;from ld bc,3 ;3 chars ldir ;store new hiname - cal loadhiscoreposinahl + cal loadhiscoreposinahl ;cf=0 (jr c) cal _SET_ABS_DEST_ADDR ;to ahl xor a - ld hl,highsave + ld hl,savestr cal _SET_ABS_SRC_ADDR ;from local - ld hl,5 - cal _MM_LDIR_SET_SIZE ;save new - cal _RAM_PAGE_1 + cal mmldir5 ;save new score+name + ld hl,_curRow + dec (hl) + cal iswinner NotNewHigh: ld hl,$3149 @@ -1972,32 +2482,62 @@ NotNewHigh: cal _vputs ld hl,$0C07 ld (_curRow),hl - ld hl,highsave+2 + ld hl,savestr+2 cal _puts - ld hl,(highsave) - cal showHL + ld hl,_curCol + inc (hl) + ld hl,(savestr) + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: - halt - halt - cal GET_KEY + 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 + jr nz,waitkeyloop + ret -;x123456789012345678901 -;>>>>>> GAME OVER <<<<< -;2Multiplayer -;3Level 01 -;4 Died Score: -;5NameName 03 00070 -;6Worm#02 @ 05 00120 -;7Worm#03 15 00030 -;8Snaky @ 00 04820 +loadhiscoreposinahl: + sbc hl,hl ;cf=0 + ld a,(gametype) + 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 +hiscrposa =$+1 + adc a,0 ;ahl=saveloc + ret +savestr: ;hiscore (00AAA) _D_HL_DECI (00000) + .db $BB,"w00t",0 + +iswinner: + ld a,10 + ld (_curCol),a + ld a,'*' + jp _putc ;..then put * + +;--- quit ---------------------------------------------------------------------- ExitNoStats: cal linkok @@ -2022,45 +2562,14 @@ ExitNoStats: im 1 ;remove keyfix jp _clrWindow -loadhiscoreposinahl: - ld h,0 - ld a,(Gametype) - cp 2 - ld l,h ;hl=0 for peaworm and singleplayer - jr nz,hi_ - ld a,(nrlevels+1) - ld l,a ;skip peaworm slots for tron mode -hi_: - add hl,hl ;one WORD per hiscore - or a ;Singleplayer? - ld b,0 ;offset 0 for SP - jr z,hi__ - ld a,(Level) - ld b,a ;levels to skip (including 1 for singleplayer) -addlevelposition: - inc hl - inc hl ;add one word per level - inc hl - inc hl - inc hl ;plus 3 bytes for name - dnz addlevelposition -hi__: - xor a ;ahl=0(+hl) - ld bc,defhiscrpos -hiscrposhl =$-2 - add hl,bc -hiscrposa =$+1 - adc a,0 ;ahl=saveloc - ret -highsave: - .db 0,0,"WOR ",0 - -;----------------------------- -;----------- worm ------------ -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ respawncheck: - cp respawndelay-1 + cp rspawndelay-1 jr nz,unnamedlabel cal saverespawncounter removeworm: @@ -2070,30 +2579,25 @@ removeworm: ld e,(ix+head) jr DoesWormTailEqualsWormHead ;chk4 size=0 removewormloop: - ld c,(hl) - inc hl - ld b,(hl) - inc hl - cal resbit - psh hl - cal res4pixels - pop hl + cal removetailbit inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde - jr nz,removewormloop + jr nz,removewormloop ;head=tail/size=0 - ld a,(gameCar) + ld a,(gamecar) and _datasingl - jr nz,safewormsizedone + jr nz,savetailpos + ld (ix+grow+1),a ;=0 ld a,0 -beginsize =$-1 +growsize =$-1 ld (ix+grow),a -safewormsizedone: - ;de=ix+head - ld (ix+tail+1),d - ld (ix+tail),e ;head=tail/size=0 +savetailpos: + ld (ix+tail+1),h + ld (ix+tail),l ret unnamedlabel: @@ -2157,7 +2661,7 @@ inputcall: or a jr z,inlink ;input by link cal inkeys ;input by keys - ld a,(gameCar) + ld a,(gamecar) rra ;and _datalink ret nc ;no link ld c,l ;send our keys @@ -2167,7 +2671,11 @@ inlink: ld l,c ret -;------- handle worm --------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2188,10 +2696,10 @@ turn =$-1 inc (ix+grow) nogrow: - ld a,(gameCar) + ld a,(gamecar) and _datatime jr z,notimescore - ld de,1 + ld e,1 cal IncScore notimescore: @@ -2206,22 +2714,10 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) - psh hl - ld hl,previouspos - ld (hl),c - inc hl - ld (hl),b - inc hl - inc hl - ld (hl),e - inc hl - ld (hl),d - pop hl - -;-------- move worm ---------- +;--- move worm ----------------------------------------------------------------- -Wormmove: - psh bc ; >> pos +wormmove: + psh bc ;pos ld a,(hl) add a,a add a,d @@ -2249,281 +2745,88 @@ notnegY: notmoveY: ;bc=newpos ld (ix+pos2),e ld (ix+pos2+1),d - ld (ix+pos),c - ld (ix+pos+1),b ;-check- - pop hl ; << pos (old) + pop hl ;pos (old) ld a,h - sub b - and 1 + sub b ;Xold-Xnew + and 1 ;abs ld h,a ld a,l sub c - and 1 - add a,h - ld d,4 + and 1 ;|Yold-Ynew| + add a,h ;pixels moved |Dx|+|Dy| + ld d,4 ;same pos = 4of4 bytes drawn jr z,GotFour - xor 3 - ld d,a + xor 3 ;1 pixel = 2of4 blank; 2 pixels = 3of4 blank + ld d,a ;#pixels that should be drawn GotFour: - cal chk4pixels - rl d - jp nc,Drawworm + cal chk4pixels ;d-=pixels at b,c + rl d ;<0 meaning there were >d pixels + cal c,hitworm ;so that wasn't us -;--------- worm hit ---------- +;--- draw worm ----------------------------------------------------------------- -Hitworm: - ld a,(gameCar) - ld h,a -#ifdef optdie - and _datadie - cal z,checkhitotherworm +drawworm: + ld (ix+pos),c + ld (ix+pos+1),b + + 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" + + ld l,(ix+head) + ld h,(ix+head+1) + ld (hl),c + inc hl + ld (hl),b + inc hl + ;(resbit) ld a,h -#endif - and _datamultpeas ;&&bit - jr nz,multiple_peas + and (ix+storepos) + ld h,a + ld (ix+head),l + ld (ix+head+1),h + + ld l,(ix+grow) + ld h,(ix+grow+1) + dec hl ld a,h - and _datafood - jp z,WormDead ;no food + or l + jr z,removetail + ld (ix+grow),l + ld (ix+grow+1),h + ret - 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 de,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 +removetail: + ld l,(ix+tail) + ld h,(ix+tail+1) + cal removetailbit + cal savetailpos ;ld (ix+tail),hl + ld c,(hl) + inc hl + ld b,(hl) + jr set4pixels ;redraw new last bit - 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 - -chkpeahit: ;hl=peapos - 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 - -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: - 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 - jr z,sel_otherpea - ld hl,(peaspos+2) ;2nd pea -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 - ld (ix+reserv),a - cal DrawPea ;restore own flag - jr sillylabel ;inv both\die - -hitflag: ;correct pea hit - ld a,e ;pop a - xor %01 ;0=1;1=0 - ld (ix+reserv),a - cal flagtoken - 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 - -;----------------------------- - -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,63 - sub b - jr z,nextlaphalf - inc a - ret nz -nextlaphalf: - ld a,c - and 32 ;y>=32? - jr nz,nolap - cp (ix+reserv) - jr z,nolap - psh bc - ld de,20 - cal IncScore - pop bc - xor a -nolap: - ld (ix+reserv),a - 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" - - ld l,(ix+head) - ld h,(ix+head+1) - ld (hl),c - inc hl - ld (hl),b - inc hl - cal resbit - ld (ix+head),l - ld (ix+head+1),h - - ld a,(ix+grow) - dec a - jr z,removetail - ld (ix+grow),a - ret - -removetail: - ld l,(ix+tail) - ld h,(ix+tail+1) - ld c,(hl) - inc hl - ld b,(hl) - inc hl - cal resbit - ld (ix+tail),l - ld (ix+tail+1),h +removetailbit: + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ;(resbit) + ld a,h + and (ix+storepos) + ld h,a + psh hl + cal res4pixels ;rm last bit + pop hl + ret res4pixels: cal ResPixel @@ -2539,9 +2842,11 @@ ResPixel: ld (hl),a ret -;----------------------------- -;---------- ball ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ handlethoseneatlittleballs: ld hl,balls @@ -2634,25 +2939,209 @@ checkballhit: pop de ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ __ __ _ _ _____ _______ +; | | | | | |_____/ | | | \_/ |_____| | | +; |__|__| |_____| | \_ | | | | _____ | | __|__ | +;_______________________________________________________________________________ -releasekeys: - halt +;--- multifood ----------------------------------------------------------------- + +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 + jr _wormdead +pickmultpea: + ld a,247 + ld (de),a + dec de + ld (de),a + jp pickedpea + +;--- ctf ----------------------------------------------------------------------- + +chkctfpeas: ;ctf + 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 +sel_otherpea: + cal chkpeahit + jr c,hitflag +;no peas hit: + ld a,e ;peek a (that's x86asm for pop\push ;) + bit 1,a ;%1O = carrying flag? + jr z,_wormdead ;if not just die + and %1 ;which flag? + ld hl,drawctfpea1 ;restore #1 + jr nz,nottheotherflag + inc hl ;ld hl,drawctfpea2 + inc hl ;restore #2 +nottheotherflag: + ld (hl),3 ;draw delay 3 turns +_wormdead: + jp wormdead + +hitflag: ;correct pea hit + ld a,e ;pop a + xor %11 ;invert flag taken + ownflag + ld (ix+reserv),a + and %10 ;just returned? + psh bc ;safe position + psh af ;safe z-flag + cal DrawPea ;remove + pop af + pop bc + ret nz ;flag taken: continue game ;drawworm + ld e,20 ;flag captured+returned + psh bc + cal IncScore + pop bc + ld a,3 ;draw delay + ld (drawctfpea1),a ;redraw.. + ld (drawctfpea2),a ;..both flags + ret ;drawworm + +;--- main ---------------------------------------------------------------------- + +hitworm: + ld a,(gamecar) + bit __bitPctf,a + jr nz,chkctfpeas + rla ;and _dataPmult + jr c,chkmultpeas + rla ;and _datafood + jr c,_wormdead ;no food + +;--- foodmatch|SP -------------------------------------------------------------- + + ld hl,0 +PeaY =$-2 +PeaX =$-1 + cal chkpeahit + jp nc,wormdead + +;--- take pea ------------------------------------------------------------------ + + psh hl + cal NewPea + pop hl +pickedpea: + cal DrawPea ;remove pea + ld a,(ix+grow) ;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 + ld c,(ix+pos) ;same position + ld b,(ix+pos+1) ;we'll just leave pos2 - doubt anybody will care|notice.. + ret nz ;(Left)>0 ;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 ;<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: ;---------->promise me you'll never let go... + halt ;-------------------->i won't let go.... ld a,%10000000 ;all key-masks out (1),a - in a,(1) + in a,(1) ;--------------->i'll never let go..... inc a ;cp %11111111 (no keys pressed) jr nz,releasekeys ;keep waitin cal GET_KEY ;clear buffer - ret - -resbit: - ld a,h - and (ix+storepos) - ld h,a - ret + ret ;--------------------->*die* (we are VICTORIOUS! muha) randompos: ld b,a @@ -2661,24 +3150,105 @@ Random: ;(2..b+2) Seed =$+1 add a,0 ld (Seed),a - and %01111110 cp b jr nc,Random 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 +ldhl32a: ld l,a - ld (PeaY),hl + ld h,0 ;=hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl ;32=scr.width + ret ;ld hl,32*a + +mmldir5: + ld hl,5 ;=ahl + cal _MM_LDIR_SET_SIZE + jp _RAM_PAGE_1 + +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 -CheckPea: +loadtxtgame: ;in:d=0; out:hl=txtGame+(gametype); destr:ade + ld a,(gametype) + ld e,a + ld hl,posGame + add hl,de ;hl=posGame+(gametype) + ld a,(hl) ;str.offset + ld e,a ;^d=0^ + ld hl,txtGame + add hl,de ;txtGameX + ld (CURtxtGame),hl ;save for g/o + ret + +CheckPea: ;@hl; destr:abcde ld c,l ld a,(sprsize) ld e,a @@ -2691,23 +3261,125 @@ 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 + ld a,-1 + 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 +drawpea_: ld de,0 spritepos =$-2 - jp PutSprite ;||-ed +; jp PutSprite + +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 ----------- +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 @@ -2719,26 +3391,72 @@ divideagain: ;3x pop hl ret -IncScore: - ld h,(ix+score+1) - ld l,(ix+score) +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 + 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 + +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 + +IncScore: ;inc score by e + ld d,0 +_IncScore ; inc by de + cal ldscoreinhl + 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 +doteam: + cal addteamscore ;cal=CD | ld de,*=11 ld de,0 scorelimit =$-2 ld a,d @@ -2748,23 +3466,24 @@ scorelimit =$-2 jp nc,Exit showstats: - ld a,(gameCar) + ld a,(gamecar) and _datatime - ret nz ;no disp for timematches + jr nz,timematchscore ;no disp for timematches forceshowstats: psh ix - ld h,0 - ld l,h + and a + sbc hl,hl ;hl=0 ld (_penCol),hl ld a,(nrworms) ld b,a ld ix,worm1 - ld a,(gameCar) + ld a,(gamecar) and _datasingl jr nz,showstatsS showstatloop: - psh bc +#ifdef gamenames #ifdef longnames + psh bc ld b,3 psh ix shownameloop: ;1st 3 chars @@ -2778,35 +3497,56 @@ nameshown: ld a,':' cal _vputmap pop ix + pop bc #else ld a,(ix+name) cal __vputmap ld a,':' cal __vputmap #endif - cal showstat +#endif + ld a,(wormbeglives) + or a + cal nz,showlives ;lives when initlives>0 + ld a,' ' + cal __vputmap ;small div + ld a,(gametype) + cp gamedeathm + cal nz,showscore ;score in !dm + ld a,$D8 + cal __vputmap ;div + ld de,worm2-worm1 add ix,de ;next - ld hl,_penCol - ld a,(hl) - add a,4 ;div - ld (hl),a - pop bc dnz showstatloop pop ix ret -showstat: ;(multiplayer) - ld a,(Gametype) - cp gamedeathm - jr z,showlives showscore: - ld h,(ix+score+1) - ld l,(ix+score) + cal ldscoreinhl + psh bc cal _D_HL_DECI + pop bc jr __vputs + +cshowA: ;small w/ leading 0; 0='none' + or a ;destr. ahl + jr nz,cshowA00 + ld hl,txtNone + jp _vputs + showlives: ld a,(ix+lives) +cshowA00: ;small w/ leading 0 + ld l,a + ld h,0 + cal _divHLby10 + psh af + ld a,l + add a,'0' + cal __vputmap + pop af +cshowA0: add a,'0' __vputmap: psh ix @@ -2820,31 +3560,24 @@ showstatsS: ;(singleplayer) 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 + cal c,cshowA0 pop af -tilllevel9: - add a,'0' - cal __vputmap + cal nc,cshowA00 - ld a,98 + ld a,97 ld (_penCol),a cal showscore ld a,123 ld (_penCol),a - cal showlives - ld a,(gameCar) + 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 @@ -2861,7 +3594,7 @@ showLevel: ld hl,txtLevel cal _puts ld a,(Level) -showA: +showA0: ;big w/ leading 0 ld l,a ld h,0 cal _divHLby10 @@ -2873,46 +3606,32 @@ showA: add a,'0' jp _putc -cshowA: - 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: @@ -2921,13 +3640,7 @@ FieldHeight =$-1 jr c,NotMaxYScroll ld a,(FieldHeight) NotMaxYScroll: - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl + cal ldhl32a psh bc ; >> 1 psh de ; >> 2 ld de,ScrBuffer @@ -3132,11 +3845,15 @@ ChunkRow: ld c,$37 ;scf ret -;----------- draw ------------ +;_______________________________________________________________________________ +; ______ ______ _______ _ _ _ +; | \ |_____/ |_____| | | | +; |_____/ | \_ | | |__|__| +;_______________________________________________________________________________ -;--- pixel --- +;--- pixel --------------------------------------------------------------------- -chk4pixels: ;&& +chk4pixels: cal CheckPixel inc b cal CheckPixel @@ -3153,274 +3870,77 @@ CheckPixel: ;at bc in d dec d ret -;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes) -;(b,c) to hl:a; "destroyes" ahl +;--- findpixel ----------------------------------------------------------------- +;Based on Snake86's findpixel +;160-262 cycles; 31 bytes FindPixel: ;(b,c) to hl:a + psh bc ld h,0 - ld l,c ;hl=y + ld l,c ;hl=y add hl,hl add hl,hl - ld a,b ;a=x + ld a,b ;a=x rra add hl,hl rra add hl,hl - add hl,hl ;hl=32*y - rra ;a=x/8 + add hl,hl ;hl=32y + rra ;a=x/8 or l ld l,a - ld a,b + ld a,b ;x and 7 - cpl - rlca - rlca - rlca - ld (FP_Bit),a - xor a -FP_Bit =$+1 - set 0,a - - psh de ;&&& - 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: - ld a,(hl) - inc hl - or a ;0 = - ret z ;no more - - ld d,(hl) - inc hl - ld e,(hl) - inc hl - ld b,(hl) - inc hl - 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 - - 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 + inc a 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 + ld a,1 +pixelloop: + rrca + dnz pixelloop + ld bc,ScrBuffer + add hl,bc + pop bc ;destr:none ret -#endif - -drawfatline: - cal drawline - inc d - inc h - cal drawline - inc e - inc l - cal drawline - dec d - dec h - jp drawline -;LINE (d,e)-(h,l) -;destroyes a +;--- objects ------------------------------------------------------------------- -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 +drawstuff: 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 + or a ;0 = + ret z ;no more + + ld d,(hl) + inc hl + ld e,(hl) + inc hl + ld b,(hl) + inc hl + psh hl + ld l,(hl) + ld h,b + cal drawsmtn 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 + jr drawstuff + +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 + +;--- 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 @@ -3471,6 +3991,8 @@ circledraw: ;destr:de psh hl ld a,h ;hl=x,y sub b ;bc=xx,yy + jr nc,$+3 ;x x=0 ld d,a ;d=x-xx add hl,bc ;h=x+xx; l=y+yy ld e,l ;e=y+yy @@ -3478,6 +4000,8 @@ circledraw: ;destr:de ld a,l sub c ;a=y again sub c + jr nc,$+3 ;y y=0 ld l,a ;l=y-yy ld e,l ;e=l=y-yy cal drawline ;(h-b,l-c)-(h+b,l-c) @@ -3485,60 +4009,200 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl + ret ;thats it + +;--- box ----------------------------------------------------------------------- + +drawbox: ;(d,e)-(h,l) + ld b,l ;Delta-y + ld l,e +boxloop: + cal drawline + inc l + inc e + dnz boxloop ret +;--- fatline ------------------------------------------------------------------- -;----------------------------- -;----------- link ------------ -;----------------------------- +drawfatline: + cal drawline + inc d + inc h + cal drawline + inc e + inc l + cal drawline + dec d + dec h +; jp drawline -linkok: - ld a,D0HD1H - out (7),a ;raise both wires = link ok +;--- 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 ;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 + +;--- send ---------------------------------------------------------------------- -Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde +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 @@ -3551,8 +4215,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) @@ -3563,26 +4226,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 @@ -3593,260 +4254,327 @@ 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 -;----------------------------- -;---------- levels ----------- -;----------------------------- +#ifdef intlevels +;_______________________________________________________________________________ +; _____ __ _ _______ _______ _ _ _______ _______ +; | | \ | | | |______ \ / |______ | |______ +; __|__ | \_| | _____ |_____ |______ \/ |______ |_____ ______| +;_______________________________________________________________________________ LevelDef: .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls .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 -;----------------------------- -;---------- 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 - -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,txtGame1-txtGame - .db txtGame2-txtGame - .db txtGame3-txtGame - .db txtGame4-txtGame - .db txtGame5-txtGame - .db txtGame6-txtGame - .db txtGame7-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 -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 - -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 -txtScore: .db "Score",0 ;follows txtDied -txtLeft: .db " left",0 ;follows txtScore -txthiscore:.db "HiScore:",0 -txtReady: .db "Prepare!",0 -txtposReady = 7 +#endif + +;_______________________________________________________________________________ +; ______ _______ _______ _______ +; | \ |_____| | |_____| +; |_____/ | | | | | +;_______________________________________________________________________________ + +;--- graphics ------------------------------------------------------------------ + +wtPicture: ;title +; %00000000,%00000000,%00000000,%00000000,%00000000,%00000000, +.db %00011110, %00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000 +.db %00111110, %00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000 +.db %01110000, %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 + +#ifdef coolzgfx +wtWormy: ;g/o +.db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000 +.db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000 +.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 +#else txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0 +#endif -datalevels: .dw LevelDef, LevelDefM - .dw LevelDefT,LevelDefM - .dw LevelDefM,LevelDefM - .dw LevelDefM,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 %1000001,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, 9 ;CTF (90 score) - -worm1set: .dw worm1p,worm1p - .db %11110111,%00,-01,K_RIGHT,K_LEFT -worm1name: .db "WORMY ",0 -worm2set: .dw worm2p,worm2p - .db %11111011,%11,-01,K_F2,K_F1 -worm2name: .db "VIPER ",0 -worm3set: .dw worm3p,worm3p - .db %11111011,%00,-01,K_COMMA,K_STO -worm3name: .db "NIBBLER ",0 -worm4set: .dw worm4p,worm4p - .db %11111011,%00,-01,K_PLUS,K_ENTER -worm4name: .db "JIM ",0 +;--- 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 ;4th tail +txtMenuR: .db "controls",0 ;6th + +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 +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",$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 + +;--- foo ----------------------------------------------------------------------- + +trigtable: .db 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45 + .db 48, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 80, 82, 85, 87 + .db 89, 91, 94, 96, 98,100,102,103,105,107,108,110,112,113,114,116 + .db 117,118,119,120,121,122,123,123,124,125,125,126,126,126,126,126 + .db 127 + +#ifdef intlevels +datalevels:.dw LevelDef,LevelDefM,LevelDefT,LevelDefM,LevelDefM + .dw LevelDefM,LevelDefM,LevelDefR,LevelDefC +nrlevels: .db 2,3,1,3,3,3,3,3,1,0 defhiscrpos: - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - .db 0,0,"SHI" - -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 " shiar0@hotmail.com",0 - -defspritesz = 4 -defspriteimg: .db %01100000 - .db %11110000 - .db %11110000 - .db %01100000 - -deflevels: - .db "Internal Levels" ;,0 - - .db 0,deflevels/256,deflevels&255 + .db 0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI" +#else +defhiscrpos = -42 +#endif + +;--- game settings ------------------------------------------------------------- + +savestart:;--- + +worm1set: .dw worm1p + .db %11110111,1,K_RIGHT,K_LEFT +worm1name: .db "WORMY ",0 ;15 bytes +worm2set: .dw worm2p + .db %11111011,0,K_F2,K_F1 +worm2name: .db "VIPER ",0 +worm3set: .dw worm3p + .db %11111011,1,K_COMMA,K_STO +worm3name: .db "NIBBLER ",0 +worm4set: .dw worm4p + .db %11111101,0,K_PLUS,K_ENTER +worm4name: .db "JIM ",0 + +_datalink = %00000001 ;linkplay (1!) +_datafoodl = %00000010 ;left=0 limit +_datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) +_dataPctf = %00001000 ;ctf peas=1 +__bitPctf = 3 +_datatime = %00010000 ;time incs score (timematch) +_datadecs = %00100000 ;decrease score on death=1 +_datafood = %01000000 ;food present=0 (6!) +_dataPmult = %10000000 ;multiple peas=1 (no _datafood) (7!) + + ; Úgame info (see above) + ; | Úlives (0=unlimited) + ; | | Únrworms (can be altered by user) + ; | | | Úlevel (reset to 1 at startup) + ; | | | | Úspeed/delay (-1=def) + ; | | | | | Úgrow speed (-1=none; 0=continuous) + ; | | | | | | Úturn speed (8=def) + ; | | | | | | | Úscore limit (0=none) +gamesingle = 0 ; | | | | | | | | +datasingle:.db %00100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives) +gamepeas = 1 +datapeas: .db %00100100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth) +gametron = 2 +datatron: .db %01110100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth) +gamedeathm = 3 +datadeathm:.db %01100000,3,2,1,-1,42, 8, 0 ;Deathmatch (3 lives, 50 growth) +gamefoodm = 4 +datafoodm: .db %00100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score) +gamemfoodm = 5 +datamfoodm:.db %11100010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas) +gametimem = 6 +datatimem: .db %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth) +gamerace = 7 +datarace: .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score) +gamectf = 8 +datactf: .db %01001000,0,6,1,-1,-1, 8,10 ;CTF (100 score) + +gametype: .db 0 ;last gamemode +gamecar: ;made before needed (not saved) + +saveend:;--- + +startdelay = 42 +rspawndelay = 31 +maxnamesize = 8+1 + +#ifdef intlevels + .db $42 ;gamecar +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