X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/7ad6d272ed2820c7e2c8c884d1184072168d80d0..1876a18ca8df681bd7285c823abd0b031c468406:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index ab13324..7473d01 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -16,70 +16,158 @@ ; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß ;_______________________________________________________________________________ ; -; Version : 97% (0.97.19) -; Release Date : 2002 January 9 +; Version : 99% (0.99.34) +; Release Date : 2002 March 4 ; Author(s) : Shiar ; Email Address : wormy@shiar.org ; Web Page : www.shiar.org -; Description : ruling Nibbles-like game 1-4 players -; Where to get this game : www.shiar.org (home of Wormy) +; 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 (6532) : efef32a8c541b4585087f55deb31f51d +; Files : wormy.txt (9283) : 12345678901234567890123456789012 +; wormy.z80 (100k) : 515ad14b922572bdc8a96e780b8b24ca +; wormy.86g (12k) : efef32a8c541b4585087f55deb31f51d ;_______________________________________________________________________________ -;NOTES: -;* Use for LEARNING practises ONLY! -; Don't _ever_ release altered code w/o permission! -;* Code was originally by Scabby (Matthew Shepcar), -; a few lines by Jonah Cohen, -; and everything else by me - Shiar (Mischa Poslawsky). -;* Although I've commented & labeled quite some stuff, I can't guarantee -; everybody will understand it. This is probably not the best source -; to learn z80 from. w00t the Shyer Way (tm). -;* Also read wormy.txt please, thank you -;* Don't scroll down if you get scared easily. +;--- 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 ;_______________________________________________________________________________ -; _______ _____ ______ _____ -; | | | | \ | | -; | |_____| _____ |_____/ |_____| +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| ____ |_____/ |_____| ;_______________________________________________________________________________ -; 97% = DONE -; X [15] lives >9 dispay -; X [15] sp modes not configurable -; X [16] LVL: episode #2: 10 sp levels -; X [17] lives stats for every liveslimited game (also !dm) -; X [18] LINK: fix transmit game/level data -; X [19] datalevels+nrlevels not in program if !intlevels -; X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?) -; X [19] alter level editor to use new address and set level id #97 -; 1% * misc (bugs, &&&, pollish, &&, &) -; * menu s/limit/peas in multifm -; * autogrowth doesn't always work -; * look at init-z in line routine again -; * team score! -; * random pixel still occurs -; * LINK: optimize transmit +; 98% = CURRENT +; X [119] ED: new 53 file format with support for 128 objects instead of 32 +; X [119] LVL: episode #4: 10 hard sp levels (ordered XO-XO-XO-X) +; X [120] fixed greymask (and it now ands instead of ors) +; X [120] fixed growth set after death +; X [121] fixed linkplay (couldn't turn it on anymore..) +; X [121] LVL: Wormage + Wormage ][ (2x 10 sp levels) +; X [121] pea randomizer doesn't give x>128 +; X [121] mixed single-/multipea singleplayer levels (re)set correctly +; X [126] circles left|above 0,0 drawn correctly now! +; X [126] fixed multiple pages of levelfiles +; X [29] optimized a few more bytes (less empty bytes so prettier binary ;) +; X [225] ED: ctf/race level copy/move fix +; X [225] LVL: episode #1: 5 ctf+5 race; episode #3 removed (all in #1 now) +; X [225] add v2 id (yas2) +; X [227] redundant calls removed or moved +; X [227] fixed: ctf score increased by taking _any_ pea +; X [227] no more points in race for dieing on the second half +; X [227] no score decrease for dieing in race (no longer needed, see above) +; 99% = CURRENT ; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* -; * LINK: called "Linkmatch" at g/o -; * LVL: episode #3: at least 5 lvls for each mp mode -; * LVL: episode #4: 10 sp levels, including multipeas -; 1% * LVL: episode #5: ... -; * LVL: Wormage +; * LVL: 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 -;100% = bugs fixed + levels done -;> * switchable scoredecrease on death? -; * wall at pickup position fix -; * arrow to offscreen peas -;110% * sound -; * startpos -;120% * coop (DON'T COUNT ON IT) +;--- 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) ;_______________________________________________________________________________ ; _/_/_____ __ _ _______ _ _ ______ _______ @@ -106,11 +194,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 @@ -125,15 +213,19 @@ _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 +_OP1TOOP6 = $4263 - #define buffer ;use display buffer (otherwise write directly to screen) - #define readymask ;"greys" out the field before starting a level - #define coolzgfx ;nice graphics for game over screen + #define id2 ;yas2 level identifier - this'll add (65) bytes + #define buffer ;use display buffer, otherwise write directly to screen (11) + #define readymask ;"greys" out the field before starting a level (20) +;#define readytext ;-displays "prepare" before level starts (42) + #define coolzgfx ;nice graphics for game over screen (98) #define spprotect ;options not changable for singleplayer modes ;#define intlevels ;-internal levels -;#define readytext ;-displays "prepare" before level starts -;#define invincible ;-worms cannot die =) -;#define optdie ;-in race games worms dont die when they run into each other + ;-to become invincible, define the magic word :D + +levelhead = 'w' +levelhead2 = 97 ;wormy levels header = "0" ;_______________________________________________________________________________ ; _______ _______ _____ ______ _______ ______ _______ @@ -141,20 +233,20 @@ _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl ; ______| | |_____| | \_ | | |_____| |______ ;_______________________________________________________________________________ -;--- permanent --- +;--- permanent ----------------------------------------------------------------- ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) worm4p = $A400 ;-A5FF (200) %101001O0 ;free = $A600 ;-A7FF (200) worm2p = $A800 ;-ABFF (400) %10101O00 SinCosTable = $AC00 ;-AD00 (4*40) -worm1 = $AD01 ;-AD1F (1F) -worm2 = $AD20 ;-AD3E (1F) -worm3 = $AD3F ;-AD5D (1F) -worm4 = $AD5E ;-AD7C (1F) -balls = $AD7D ;-AE00 (<=3x44d) -turn10 = $AE01 ;-AE01 (1) (counter) -peaspos = $AE02 ;-AF05 (4-260) (peas) +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 @@ -165,13 +257,14 @@ leveldata = $F080 ;-F9FF (<=97F) #ifndef intlevels datalevels = $FA00 ;-FA11 (12) (>=$C000) nrlevels = $FA12 ;-FA1B (A) (<$FA70) +defspr = $F078 ;-F07F (8) #endif ;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 @@ -185,6 +278,28 @@ 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^ + ;_______________________________________________________________________________ ; _____ ______ _____ ______ _______ _______ _______ ______ _______ ; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | @@ -196,9 +311,18 @@ drawctfpea2 = peaspos+6 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 + ld d,h + rst 10h + .dw WormIcon + .dw WormData +#endif ld d,a ld c,a ld d,d @@ -212,7 +336,7 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .19",0 + .db " 99% .34",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -223,9 +347,54 @@ WormIcon: .db %10011001,%00011001 .db %01000010,%11000001 .db %00111100,%00111110 - -levelhead = 'w' -levelhead2 = 97 ;wormy levels header = "97" +#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' @@ -237,31 +406,12 @@ int_handler: jp $0039 int_end: +;--- search levels ------------------------------------------------------------- + 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 ;...it *does* work ;) - cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -277,11 +427,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: @@ -304,15 +451,12 @@ 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 @@ -364,18 +508,23 @@ levelselectmenu: ;load next page ld hl,$FC00+(2*16) ld b,16*9 cal menuinvloop - ld hl,$FC00+(56*16) + ld hl,$FC00+$380 ;(*,56) cal hr - ld hl,$0601 ;x=1 + ld hl,$0C01 ;x=1 ld (_penCol),hl dispnextlevel: ld de,3 - add ix,de + add ix,de ;goto next ld a,(ix) - ld b,a + ld h,(ix+1) + ld l,(ix+2) + cal _load_ram_ahl ;hl=ahl + cal _vputs + ld hl,availevels + inc (hl) + ld a,(ix+3) ;next inc a ;cp 255 jr z,__levselect -displevel: ld hl,_penCol ld (hl),$01 ;x=1 inc hl @@ -384,13 +533,6 @@ displevel: ld (hl),a ;y+6 cp 49 ;bottom of screen jr nc,_levselect - ld hl,availevels - inc (hl) - ld a,b ;(ix+0) - ld h,(ix+1) - ld l,(ix+2) ;ahl=(ix) - cal _load_ram_ahl ;hl=ahl - cal _vputs jr dispnextlevel loadlevel1: @@ -460,7 +602,7 @@ levdescclearloop: cp d ;de>$FFFF (offscreen) jr nz,levdescclearloop cal _vputs - jr levselectmenu+1 + jr levselectmenuloop+1 __levselect: #ifdef intlevels ld ix,templevels-6 ;reset 2 1st page @@ -470,7 +612,7 @@ __levselect: _levselect: ld b,-2 ;level selected jr levselect -levselectmenu: +levselectmenuloop: psh hl psh bc cal ubergetkey @@ -487,15 +629,17 @@ levselectmenu: sub K_EXIT-K_RIGHT jp z,ExitNoStats inc a ;cp K_SECOND - jr nz,levselectmenu + 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 @@ -527,6 +671,36 @@ leveldataSize =$-2 levelloaded: cal _RAM_PAGE_1 +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ + +; cal _runindicoff ;this is after level selection (run from yas1 or restart) +; cal _flushallmenus ;so this stuff should already be done earlier or by yas + ld (SpSave),sp + + 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 @@ -539,15 +713,9 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;_______________________________________________________________________________ -; _______ _____ ______ _______ _____ __ _ _____ _______ -; | | | | | |_____/ |______ | | \ | | | -; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | -;_______________________________________________________________________________ - -;--- trig tables --- +;--- trig tables --------------------------------------------------------------- - ld hl,TrigPrecalc ;I believe this + 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 @@ -576,14 +744,25 @@ NegativeSineWave: ; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| ;_______________________________________________________________________________ -;---draw menu--- +;--- 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+$010 ;(*,01) cal hr @@ -592,14 +771,14 @@ DisplayMenu: ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: - ld a,(Gametype) + 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_: @@ -608,14 +787,11 @@ dispmenucommon: ld de,$FD80 ;begin pos xor a clroldmenuloop: + ld c,4 ld (de),a inc de - 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,(ix) @@ -639,7 +815,7 @@ hrloop: dnz hrloop ret -;--- options menu --- +;--- options menu -------------------------------------------------------------- dispoptionmenu: ld hl,txtoMenu @@ -649,9 +825,9 @@ dispoptionmenu: dispomenusets: #ifdef spprotect - ld a,(gameCar) + ld a,(gamecar) and _datasingl - jp nz,LetsGetThisPartyOn + jp nz,LetsGetThisPartyOn ;SP -> start game #endif cal clrold @@ -710,6 +886,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 @@ -859,7 +1038,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- main menu --- +;--- main menu ----------------------------------------------------------------- mainMenu: cal menupos @@ -880,8 +1059,8 @@ changenrworms: cal change4spOnly ld a,(hl) ;hl=nrworms inc a - cp 5 - jr nc,mainMenu ;may not be >4 + cp 7 + jr nc,mainMenu ;may not be >4+2 changednrworms: ld (hl),a jr _dispmenusets ;mainMenu @@ -889,6 +1068,8 @@ changednrworms: notselect cp K_EXIT jp z,ExitNoStats + cp K_MORE + jp z,Start psh af cal menupos cal loadgamecar @@ -913,13 +1094,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: @@ -936,27 +1115,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 -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 @@ -966,7 +1142,7 @@ 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 @@ -974,7 +1150,7 @@ _dispmenusets: jr dispmenusets ;mainMenu changegame: - ld a,(Gametype) + ld a,(gametype) inc a cal changedgame jr z,changegame @@ -986,13 +1162,13 @@ changedgame: jr nc,changedgameok xor a ;9 -> 0 changedgameok: - ld (Gametype),a + ld (gametype),a cal getnrlevels xor a cp (hl) ret bchangegame: - ld a,(Gametype) + ld a,(gametype) dec a cal changedgame jr z,bchangegame @@ -1018,7 +1194,7 @@ bchangelevel: jr _mainMenu getnrlevels: ;for current gametype at hl - ld hl,Gametype + ld hl,gametype ld d,0 ld e,(hl) ld hl,nrlevels @@ -1043,28 +1219,19 @@ 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 @@ -1072,12 +1239,19 @@ dispmenusets: psh hl inc hl ld a,(hl) + dec a ;0-5 + and 3 ;0-3 + inc a ;1-4 add a,'0' cal _vputmap + ld a,(hl) + cp 5 + ld hl,txtteamed + cal nc,_vputs ld hl,$243E ld (_penCol),hl - rr c ;(gameCar) + rr c ;(gamecar) ld hl,txtNo jr nc,displink ld hl,txtYes @@ -1090,7 +1264,7 @@ displink: psh bc ld d,0 cal hlatlevel - ld a,(Gametype) + ld a,(gametype) or a ;gamesingle jr nz,displvlname ld a,(Level) @@ -1119,7 +1293,7 @@ curworm =$-1 cal _vputs jp mainMenu -;--- handle menukeys --- +;--- handle menukeys ----------------------------------------------------------- menucall: psh bc @@ -1180,21 +1354,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 @@ -1208,7 +1381,7 @@ emptyname: ld (hl),' ' inc hl dnz emptyname - ld a,maxnamelength + ld a,maxnamesize ld (namelength),a enternameloop: ld hl,$FF07 ;begin pos @@ -1218,9 +1391,8 @@ 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: @@ -1233,12 +1405,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 @@ -1246,9 +1419,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 @@ -1258,18 +1430,19 @@ 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 ;_______________________________________________________________________________ @@ -1283,7 +1456,7 @@ ubergetkey: halt ;save them batteries! yeah! jp GET_KEY -clrold: +clrold: ;destr:acdehl (acd=0) ld hl,$FD97 ;begin pos ld a,35 ;nr of lines clroldcustom: @@ -1302,19 +1475,21 @@ clroldsetsloop: hlatlevel: ;d must be 0 psh hl ;loadgamecar - ld a,(Gametype) ;8bytes -> 7bytes + ld a,(gametype) add a,a ld e,a ;=de ld hl,datalevels - add hl,de + add hl,de ;+2*mode cal _ldHLind ;ld hl,(hl) - pop de ;de=loadgamecar - inc de \ inc de - ld a,(de) ;(curlevel) + ex (sp),hl ;hl=loadgamecar + ld e,2 ;=de + add hl,de + ld a,(hl) ;(curlevel) ld (Level),a - ld d,a ;begin level + ld c,a ;begin level + pop hl ;@level1 skiplevelloop: - dec d ;levels to skip + dec c ;levels to skip ret z cal skiplevel jr skiplevelloop @@ -1327,15 +1502,13 @@ skiplvltitle: ;zf=singleplayer jr nz,skiplvltitle ret -skiplevel: ;@hl - destr:ab - alter:hl - ld a,(Gametype) +skiplevel: ;@hl; de=2 - destr:ab - alter:hl + ld a,(gametype) or a ;gamesingle psh af cal nz,skiplvltitle - inc hl - inc hl - inc hl - inc hl ;skip 4 + add hl,de + add hl,de ;skip 4 ld b,(hl) ;spritesize inc b skipsprite: @@ -1344,52 +1517,39 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - pop af ;cp (Gametype),0 - 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 gamerace +skipstuff: + add hl,de + inc hl ;3x(balls+2) + dnz skipstuff + sub gamerace ;a=(gametype) jr z,skiplaps - cp gamectf - jr nz,noflagstoskip - inc hl - inc hl + dec a ;gamectf + jr nz,skipobjects + add hl,de skiplaps: - inc hl - inc hl -noflagstoskip: - + add hl,de skipobjects: 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 @@ -1397,7 +1557,7 @@ loadgamecar: ld d,0 add hl,de ld a,(hl) - ld (gameCar),a + ld (gamecar),a ld c,a inc hl ld a,(hl) @@ -1423,35 +1583,38 @@ createwormsloop: ld bc,died ;0008 add hl,bc ; ld b,0 - ld (hl),b ;died=0 + ld (hl),b ;+died=0 inc hl - ld (hl),b ;score=0 + ld (hl),b ;+score=0 inc hl - ld (hl),b ;score+1=0 + ld (hl),b ;+score+1=0 inc hl - ld (hl),2 ;delay=2 + ld c,2 + ld (hl),c ;+delay=2 inc hl - ld (hl),3 ;lives=x + ld (hl),3 ;+lives=x wormbeglives =$-1 inc hl ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes + ldir ;+head=+tail (2) + dec hl + dec hl + ld c,wormsize-tail ;=bc + ldir ;copy 15 bytes dec a ;loop jr nz,createwormsloop -OhMyGodItsALabel: ;pj34r my coding skillz +OhMyGodItsALabel: ;pj34r my coding skillz cal loadgamecar psh hl ;datatype cal hlatlevel ex (sp),hl ;pop \ psh leveldata psh hl ;psh loadgamecar - ld a,0 -gameCar =$-1 + ld a,(gamecar) rra ;and _datalink jr nc,_StartLevel -;--- link --- +;--- link ---------------------------------------------------------------------- wormVhost = 095 wormVclient = 195 @@ -1460,136 +1623,142 @@ 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 - jr sethost -client: - ld hl,txtReceive - cal _puts -setclient: + ;name/keys: wormy#1 = link = 0 + link (name1) ; 2 = worm #1 = #1 + local(name1) ; 3 = link = 0 + link (name2) ; 4 = worm #2 = #2 + local(name2) - ld de,worm2+left + ld e,worm4+left&255 + cal moveworm2 ;4=2 + ld e,worm2+left&255 ld hl,worm1+left - ldi ;keys worm#2 = worm#1 - ldi ;+right - ld de,worm4+left - ldi ;keys worm#4 = worm#2 - ldi - xor a - ld (worm1+left),a ;worm 1... - ld (worm3+left),a ;and worm 3 via link - ld hl,worm1+name - ld b,9 - cal recvstuff - ld hl,worm2+name - ld b,9 - cal sendstuff + cal moveworm ;2=1 + ld l,worm1+left&255 + cal linkworm ;worm1+3 over link + ld l,worm2+name&255 + cal sendworm pop hl ;loadgamecar pop de ;leveldata psh de psh hl ;loadgamecar ld b,8 - cal sendstuff - ld hl,gameCar - ld b,1 - cal sendstuff - ld hl,Gametype - ld b,1 - cal sendstuff + cal sendstuff ;setup + ld hl,gametype ;+gamecar + ld b,2 + cal sendstuff ;game ex de,hl ld b,168 - cal sendstuff -_StartLevel: - jr StartLevel -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 -sethost: - ;name/keys: wormy#1 = worm #1 = ok - ; 2 = link = 0 + link (name1) - ; 3 = worm #2 = #2 + local(name2) - ; 4 = link = 0 + link (name2) - ld de,worm3+left - ld hl,worm2+left - ldi ;keys worm#3 = worm#2 - ldi ;+right - xor a - ld (worm2+left),a ;worm 2+4.. - ld (worm4+left),a ;..over link - ld hl,worm1+name - ld b,9 - cal sendstuff - ld hl,worm2+name - ld b,9 - cal recvstuff - pop hl ;loadgamecar - pop de ;leveldata - ld de,linklevel ;&&&&&&& - ld hl,datalink - psh de - psh hl ;loadgamecar - ld b,8 - cal recvstuff - ld hl,gameCar - ld b,1 - cal recvstuff - ld hl,Gametype - ld b,1 - cal recvstuff - ex de,hl - ld b,168 - cal recvstuff - -;--- load level --- - -StartLevel: - pop hl ;loadgamecar - ld a,(hl) - ld (wormbeglives),a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - inc hl ;level + 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 a,(hl) ld (customspeed),a inc hl ld a,(hl) ld (growspeed),a + ld (turn),a inc hl ld a,(hl) ld (turnleft),a @@ -1597,8 +1766,8 @@ StartLevel: inc hl ld l,(hl) ld h,0 - ld a,(gameCar) - rla + ld a,(gamecar) + rla ;and _dataPmult ld a,h ;(Left)=256 jr nc,setscorelimit ld a,l @@ -1626,28 +1795,32 @@ Nextlevel: inc hl ;location of ending-code jp (hl) ;go there ("call") donextlevel: - ld a,(Gametype) + ld de,gametype + ld a,(de) or a ;gamesingle psh af - cal nz,skiplvltitle + 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 - jr nz,setleft -customleft =$+1 + and 127 ;actual #peas + jr setnrpeas +;--!sp-- +customnrpeas: + cal skiplvltitle ld a,0 -setleft: +customleft =$-1 + +setnrpeas: ld (Left),a inc a ld (lefttotal),a - dec a - xor (hl) ;bit (hl),7 - ld bc,gameCar - ld a,(bc) - jr z,leftloaded - or 128+32 -leftloaded: - ld (bc),a - inc de inc hl ld de,Speed ld a,0 @@ -1662,13 +1835,8 @@ setspeed: inc hl ld de,peagrowth ldi - ld a,(hl) - ld (worm1+grow),a ;&&sh - 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 @@ -1681,10 +1849,14 @@ setspeed: 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 @@ -1709,27 +1881,30 @@ toobad_noballs: #endif ld hl,worm1 - pop af ;cp (Gametype),0 + 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 + ld (hl),a ;+x2 inc hl + ld a,(growsize) + ld (hl),a ;+growL inc hl - ld (hl),a ;growH=0 + xor a + ld (hl),a ;+growH=0 ld bc,(worm2-worm1)-7 add hl,bc @@ -1738,10 +1913,9 @@ worminit: inc a ;ld a,1 ld (turn10),a - inc a ;ld a,2 ld (flashtime),a -;--- draw level --- +;--- draw level ---------------------------------------------------------------- initlevel: ld a,(de) @@ -1762,13 +1936,7 @@ 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 @@ -1823,7 +1991,7 @@ NoVertShift: pop hl ; << levelp - ld a,(Gametype) + ld a,(gametype) cp gamerace ;or gamectf jr c,levelhasbeensetup ld de,peaspos @@ -1839,28 +2007,36 @@ levelhasbeensetup: cal drawstuff -;--- prepare --- +;--- prepare ------------------------------------------------------------------- leveldone: psh hl ; >> levelp new cal forceshowstats + 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 @@ -1877,15 +2053,6 @@ maskline: res 3,(iy+5) #endif - ld a,(gameCar) - rla ;bit _bitmultpeas,a - cal c,multnewpea ;a=0 - rla ;bit _bitfood,a - cal nc,NewPea -nofood: - ld bc,(worm1+pos) - cal DisplayField - ld b,startdelay ReadyDelay: halt @@ -1940,13 +2107,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 @@ -1956,7 +2123,7 @@ nextturnok: cal forceshowstats ;update score nodispupdate: - ld a,(Gametype) + ld a,(gametype) cp gamectf jr nz,noctfpeas2draw ld de,drawctfpea1 @@ -2003,9 +2170,9 @@ CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop - jp Exit ;jr? + jr Exit -;--- pause menu --- +;--- pause menu ---------------------------------------------------------------- disppausemenu: ld hl,txtpMenu @@ -2107,9 +2274,9 @@ SpSave = $-2 ld hl,$FC10 ld b,16*11 cal menuinvloop ;invert - ld hl,$FD80 + ld hl,$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow ld (hl),2 @@ -2119,9 +2286,9 @@ SpSave = $-2 ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert - inc h ;$FD80 + inc h ;$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow inc (hl) @@ -2137,12 +2304,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 @@ -2181,7 +2350,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 @@ -2193,7 +2372,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 @@ -2215,7 +2394,7 @@ NoLinkIndic: pop hl psh hl - ld a,(Gametype) + ld a,(gametype) cp gamedeathm jr nz,nodmwinner ;deathmatch? ld a,0 ;winner's deaths @@ -2247,7 +2426,8 @@ notwinner: pop bc dnz displayWormStats - ld a,(Gametype) + ld de,gametype + ld a,(de) or a ;singleplayer (0) only jr nz,hilevelcheckdone checkhilevel: @@ -2264,38 +2444,38 @@ 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 @@ -2307,58 +2487,31 @@ NotNewHigh: cal _vputs ld hl,$0C07 ld (_curRow),hl - ld hl,highsave+2 + ld hl,savestr+2 cal _puts - ld hl,(highsave) + ld hl,_curCol + inc (hl) + ld hl,(savestr) cal _D_HL_DECI cal _puts ;showHL hiscorecheckdone: waitkey: + ld hl,DisplayMenu + psh hl ;main menu +waitkeyloop: cal ubergetkey cp K_ENTER - jp z,DisplayMenu + ret z cp K_SECOND - jp z,DisplayMenu + ret z cp K_EXIT - jr nz,waitkey - -;x123456789012345678901 -;>>>>>> GAME OVER <<<<< -;2Multiplayer -;3Level 01 -;4 Died Score: -;5NameName 03 00070 -;6Worm#02 @ 05 00120 -;7Worm#03 15 00030 -;8Snaky @ 00 04820 - -ExitNoStats: - cal linkok - ld hl,_asapvar - rst 20h ;_ABS_MOV10TOOP1 - rst 10h ;_FINDSYM - ld hl,savestart-_asm_exec_ram+4 - xor a - add hl,de - adc a,b ;ahl=bde+4 - cal _SET_ABS_DEST_ADDR - - xor a - ld hl,savestart - cal _SET_ABS_SRC_ADDR - ld hl,saveend-savestart - cal _MM_LDIR_SET_SIZE - - cal releasekeys - res 4,(iy+9) - set 2,(iy+13) - im 1 ;remove keyfix - jp _clrWindow + jr nz,waitkeyloop + ret loadhiscoreposinahl: - ld hl,0 ;for peaworm and singleplayer - ld a,(Gametype) + sbc hl,hl ;cf=0 + ld a,(gametype) or a ;Singleplayer? jr z,hi__ dec a ;peaworm? @@ -2380,8 +2533,8 @@ hiscrposhl =$-2 hiscrposa =$+1 adc a,0 ;ahl=saveloc ret -highsave: - .db 0,0,"WOR ",0 +savestr: ;hiscore (00AAA) _D_HL_DECI (00000) + .db $BB,"w00t",0 iswinner: ld a,10 @@ -2389,6 +2542,31 @@ iswinner: ld a,'*' jp _putc ;..then put * +;--- quit ---------------------------------------------------------------------- + +ExitNoStats: + cal linkok + ld hl,_asapvar + rst 20h ;_ABS_MOV10TOOP1 + rst 10h ;_FINDSYM + ld hl,savestart-_asm_exec_ram+4 + xor a + add hl,de + adc a,b ;ahl=bde+4 + cal _SET_ABS_DEST_ADDR + + xor a + ld hl,savestart + cal _SET_ABS_SRC_ADDR + ld hl,saveend-savestart + cal _MM_LDIR_SET_SIZE + + cal releasekeys + res 4,(iy+9) + set 2,(iy+13) + im 1 ;remove keyfix + jp _clrWindow + ;_______________________________________________________________________________ ; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ ; | | | | | |_____/ | | | |______ | | | |______ |______ @@ -2396,43 +2574,35 @@ iswinner: ;_______________________________________________________________________________ respawncheck: - cp respawndelay-1 + cp rspawndelay-1 jr nz,unnamedlabel cal saverespawncounter removeworm: - ld h,(ix+tail+1) ;& + ld h,(ix+tail+1) ld l,(ix+tail) ld d,(ix+head+1) ld e,(ix+head) 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 - ld (ix+grow+1),0 ;high -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: @@ -2496,7 +2666,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 @@ -2531,7 +2701,7 @@ turn =$-1 inc (ix+grow) nogrow: - ld a,(gameCar) + ld a,(gamecar) and _datatime jr z,notimescore ld e,1 @@ -2549,24 +2719,10 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) -#ifdef optdie - 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 -#endif - -;--- move worm --- +;--- move worm ----------------------------------------------------------------- -Wormmove: - psh bc ; >> pos +wormmove: + psh bc ;pos ld a,(hl) add a,a add a,d @@ -2594,234 +2750,33 @@ 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) -#ifdef optdie -; if race - originally - ld h,a - cal checkhitotherworm - ld a,h -#endif - bit _bitctfpeas,a - jr nz,chkctfpeas - rla ;and _datamultpeas - jp c,chkmultpeas - rla ;and _datafood - jp c,WormDead ;no food - - ld hl,0 -PeaY =$-2 -PeaX =$-1 - cal chkpeahit - jp nc,WormDead -pickpea: - cal DrawPea ;remove pea - cal NewPea -pickpea_: - ld a,(ix+grow) - add a,15 -peagrowth =$-1 - ld (ix+grow),a - jr nc,wormset2grow - inc (ix+grow+1) -wormset2grow: - ld hl,Left - dec (hl) ;dec left before display - psh af - ld e,10 - cal IncScore - pop af - jp nz,Drawworm ;continue - ld a,(Gametype) - or a - jp nz,Exit ;stack restored - - ld hl,Level - ld a,(hl) - inc (hl) - ld l,a ;hl=Level - ld h,0 - add hl,hl - add hl,hl - cal _HLTIMES10 - ex de,hl - cal _IncScore ;score+(40*level) - cal removeworm - pop hl ; << call - pop hl ; << call - ld (ix+delay),2 - jp Nextlevel - -chkpeahit: ;bc=ownpos;hl=peapos (destr:ad) - ld a,(sprsize) - inc a - ld d,a - ld a,b - sub h - inc a - cp d ;=(sprsize)+1 - ret nc ;nc=no pea - ld a,c - sub l - inc a - cp d - ret ;c=pea - -chkctfpeas: - ld hl,(peaspos) ;1st pea - ld a,(ix+reserv) - ld e,a ;push a - and %01 ;ourpea (0|1) - jr z,sel_otherpea - ld hl,(peaspos+2) ;2nd pea ;&&&ex de,hl? -sel_otherpea: - cal chkpeahit - jr c,hitflag -;no peas hit: - ld a,e ;peek a (that's x86asm for pop\push ;) - bit 1,a ;%10 = carrying flag? - jp z,WormDead ;if not just die - xor %11 ;drop flag - ld (ix+reserv),a - psh af - cal WormDead - pop af ;which flag? (=and %1) - ld hl,drawctfpea1 ;restore #1 - jr z,nottheotherflag - inc hl ;ld hl,drawctfpea2 - inc hl ;restore #2 -nottheotherflag: - ld (hl),3 ;draw delay 3 turns - ret - -hitflag: ;correct pea hit - ld a,e ;pop a - xor %11 ;invert flag taken + ownflag - ld (ix+reserv),a - and %10 ;just returned? - psh af ;safe z-flag - cal DrawPea ;remove - pop af - jr nz,Drawworm ;flag taken, continue game - psh hl - ld e,20 ;flag captured+returned - cal IncScore - pop hl - ld a,3 ;draw delay - ld (drawctfpea1),a ;redraw.. - ld (drawctfpea2),a ;..both flags - jr Drawworm - -chkmultpeas: - ld de,peaspos-1 - ld hl,lefttotalb -lefttotal =$+1 - ld (hl),0 -chkmultpealoop: - ex de,hl - inc hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - psh de - cal chkpeahit - pop de - jr c,pickmultpea - ld hl,lefttotalb - dec (hl) - jr nz,chkmultpealoop - jp WormDead -pickmultpea: - ld a,247 - ld (de),a - dec de - ld (de),a - cal DrawPea - jp pickpea_ - -;--- misc --- - -#ifdef optdie -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 -#endif - -checkhitlapline: - ld a,(peaspos) ;63 - sub b ;x==63 - jr z,nextlaphalf - inc a - ret nz -nextlaphalf: - ld a,(peaspos+1) ;yline - cp c ;ypos - ld a,1 - jr nc,checklap ;y>yline -> a=1 - xor a ;y a=0 -checklap: - cp (ix+reserv) - ret z ;same as before - ld (ix+reserv),a ;1st time - ld e,a - ld a,(handledworm) - and 1 ;group 0 (1,3) or 1 (2,4) - xor e - ret z ;(group 0 and yyline) - psh bc - ld e,20 - cal IncScore ;lap! - pop bc - ret - -;--- draw worm --- - -Drawworm: - ld c,(ix+pos) - ld b,(ix+pos+1) +drawworm: + ld (ix+pos),c + ld (ix+pos+1),b - ld a,(Gametype) + ld a,(gametype) cp gamerace cal z,checkhitlapline @@ -2837,7 +2792,10 @@ Drawworm: inc hl ld (hl),b inc hl - cal resbit + ;(resbit) + ld a,h + and (ix+storepos) + ld h,a ld (ix+head),l ld (ix+head+1),h @@ -2854,20 +2812,26 @@ Drawworm: 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) - inc hl - cal resbit - ld (ix+tail),l - ld (ix+tail+1),h - psh hl - cal res4pixels - pop hl + jr set4pixels ;redraw new last bit + +removetailbit: ld c,(hl) inc hl ld b,(hl) - jr set4pixels + 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 @@ -2971,13 +2935,201 @@ letsmovetheotherway: ld (hl),a ret -checkballhit: - psh de - ld d,0 - cal chk4pixels - xor a +checkballhit: + psh de + ld d,0 + cal chk4pixels + xor a + cp d + pop de + ret + +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ __ __ _ _ _____ _______ +; | | | | | |_____/ | | | \_/ |_____| | | +; |__|__| |_____| | \_ | | | | _____ | | __|__ | +;_______________________________________________________________________________ + +;--- 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 ;_______________________________________________________________________________ @@ -2986,21 +3138,15 @@ checkballhit: ; | | \_ |_____| |_____ ______| ;_______________________________________________________________________________ -releasekeys: - halt +releasekeys: ;---------->promise me you'll never let go... + halt ;-------------------->i won't let go.... ld a,%10000000 ;all key-masks out (1),a - in a,(1) + in a,(1) ;--------------->i'll never let go..... inc a ;cp %11111111 (no keys pressed) jr nz,releasekeys ;keep waitin cal GET_KEY ;clear buffer - ret - -resbit: - ld a,h - and (ix+storepos) - ld h,a - ret + ret ;--------------------->*die* (we are VICTORIOUS! muha) randompos: ld b,a @@ -3009,19 +3155,38 @@ Random: ;(2..b+2) Seed =$+1 add a,0 ld (Seed),a - and %01111110 cp b jr nc,Random add a,2 ret +ldhl32a: + ld l,a + 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 + 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,(wormbeglives) - or a - jr nz,showlives showscore: cal ldscoreinhl + psh bc cal _D_HL_DECI + pop bc jr __vputs -showlives: - ld a,(ix+lives) - jr cshowA00 -cshowA: ;small w/ leading 0 - or a +cshowA: ;small w/ leading 0; 0='none' + or a ;destr. ahl jr nz,cshowA00 ld hl,txtNone jp _vputs -cshowA00: + +showlives: + ld a,(ix+lives) +cshowA00: ;small w/ leading 0 ld l,a ld h,0 cal _divHLby10 @@ -3408,7 +3577,7 @@ Level =$-1 ld (_penCol),a ld a,(ix+lives) cal cshowA0 ;showlives - ld a,(gameCar) + ld a,(gamecar) and _datafoodl pop ix ret z @@ -3443,18 +3612,16 @@ showA0: ;big w/ leading 0 jp _putc _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 -savestr: - .db "00000",0 ldscoreinhl: ld h,(ix+score+1) @@ -3478,13 +3645,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 @@ -3695,9 +3856,9 @@ ChunkRow: ; |_____/ | \_ | | |__|__| ;_______________________________________________________________________________ -;--- pixel --- +;--- pixel --------------------------------------------------------------------- -chk4pixels: ;&& +chk4pixels: cal CheckPixel inc b cal CheckPixel @@ -3714,41 +3875,39 @@ 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 ;&&& C`MON! THIS IS UGLY! *hit myself* - ld de,ScrBuffer - add hl,de - pop de + inc a + ld b,a + ld a,1 +pixelloop: + rrca + dnz pixelloop + ld bc,ScrBuffer + add hl,bc + pop bc ;destr:none ret -;--- objects --- +;--- objects ------------------------------------------------------------------- drawstuff: ld a,(hl) @@ -3780,7 +3939,7 @@ drawsmtn: ; dec a ;4 = circle ; jp z,drawcircle -;--- circle --- +;--- circle -------------------------------------------------------------------- ;IMHO, one weery nice routine. Oh lemme be proud just *once*. ;Not perfect since it uses a screwy lineroutine to draw stuff @@ -3837,6 +3996,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 @@ -3844,6 +4005,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) @@ -3853,7 +4016,7 @@ circledraw: ;destr:de pop hl ret ;thats it -;--- box --- +;--- box ----------------------------------------------------------------------- drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3865,7 +4028,7 @@ boxloop: dnz boxloop ret -;--- fatline --- +;--- fatline ------------------------------------------------------------------- drawfatline: cal drawline @@ -3879,7 +4042,7 @@ drawfatline: dec h ; jp drawline -;--- line --- +;--- 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. @@ -3929,7 +4092,7 @@ lineYincs: ;lets assume y incs as well pop hl ; :