From: Mischa Poslawsky Date: Tue, 15 Jan 2002 22:47:02 +0000 (+0100) Subject: wormy 0.97.115 X-Git-Url: http://git.shiar.nl/wormy.git/commitdiff_plain/61a9cc74b83fcbc7593fe8b89d27a6daa42c1c6a wormy 0.97.115 --- diff --git a/wormy.txt b/wormy.txt index 1d5c319..35f5029 100644 --- a/wormy.txt +++ b/wormy.txt @@ -139,5 +139,6 @@ Version: 0.96.C24 (released end 2001) John Nesler - more betatesting Many More - betatesters too much.. - to list + Aaron Curtis - doesn't fit in layout yet :( ______________________________________________________________________________ =----------------------------------------------------------------------------= \ No newline at end of file diff --git a/wormy.z80 b/wormy.z80 index ab13324..e3150cd 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -16,36 +16,39 @@ ; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß ;_______________________________________________________________________________ ; -; Version : 97% (0.97.19) -; Release Date : 2002 January 9 +; Version : 97% (0.97.115A) +; Release Date : 2002 January 15 ; 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 +; Where to get this game : www.shiar.org ; Other games by author(s) : Nemesis beta ; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 ; Jonah Cohen : helped writing worm ; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca -; wormy.86p (6532) : efef32a8c541b4585087f55deb31f51d +; wormy.86p (6512) : 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 --- + +; * Use for LEARNING practises ONLY! +; Don't _ever_ release altered code w/o permission! +; Please notify me of using code, and give me credits! +; * Code was originally by Scabby (Matthew Shepcar), +; a few lines by Jonah Cohen, +; and everything else by me - Shiar (Mischa Poslawsky). +; * Although I've commented & labeled quite some stuff, I can't guarantee +; everybody will understand it. This is probably not the best source +; to learn z80 from. w00t the Shyer Way (tm). +; * Also read wormy.txt please, thank you +; * Don't scroll down if you get scared easily. ;_______________________________________________________________________________ -; _______ _____ ______ _____ -; | | | | \ | | -; | |_____| _____ |_____/ |_____| +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| ____ |_____/ |_____| ;_______________________________________________________________________________ ; 97% = DONE @@ -57,29 +60,46 @@ ; X [19] datalevels+nrlevels not in program if !intlevels ; X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?) ; X [19] alter level editor to use new address and set level id #97 +; X [19A] team score! +; X [19A] autogrowth doesn't always work -> init (turn) +; X [111] ED: disabled objects counted causing CRASH when writing hiscore! +; X [111] LINK: init+multiple pea transmit seems to work.. +; X [111] LINK: host/client swapped (host now sends level config) +; X [111] LINK: optimize transmit (most initcode same for client+host) +; X [113] menu limit in multifm not x10 +; X [113] wormhit procedure seperate (called now) +; X [114] LINK: peas sent again :P +; X [114] internal level check and sprite storage removed +; X [115] layout data stuff at bottom +; X [115] ED: init place bar fixed +; X [115] ED: keys also usable together with mouse +; X [115] ED: improved version handling +; X [115] LINK: receive message not needed anymore afaik +; X [115A] $D8 used for spacing at g/o screen. i rule B) +; X [115A] exit at g/o goes back to menu +; X [115A] more in menu lets you reselect the levelfile +; X [115A] LINK: fixed waiting mode (minor display problem) +; * word-value display storage in chartable hole?? ; 1% * misc (bugs, &&&, pollish, &&, &) -; * 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 +; * rare pea|wall overwrite <- apply stopworm fix? ; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* ; * LINK: called "Linkmatch" at g/o +; * LINK: minimize sent data (Gametype for example) ; * LVL: episode #3: at least 5 lvls for each mp mode ; * LVL: episode #4: 10 sp levels, including multipeas ; 1% * LVL: episode #5: ... ; * LVL: Wormage ; * LVL: Free Bird ; * LVL: Jonah? - +; ;100% = bugs fixed + levels done -;> * switchable scoredecrease on death? -; * wall at pickup position fix +; * correct team winners ; * arrow to offscreen peas ;110% * sound ; * startpos ;120% * coop (DON'T COUNT ON IT) +; * pause in linkplay ;_______________________________________________________________________________ ; _/_/_____ __ _ _______ _ _ ______ _______ @@ -165,6 +185,8 @@ leveldata = $F080 ;-F9FF (<=97F) #ifndef intlevels datalevels = $FA00 ;-FA11 (12) (>=$C000) nrlevels = $FA12 ;-FA1B (A) (<$FA70) +defspr = $F078 ;-F07F (8) +defsprsz = 0 #endif ;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong @@ -212,7 +234,7 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .19",0 + .db " 97% .115A",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -262,6 +284,7 @@ Start: ld i,a im 2 ;...it *does* work ;) +restart: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -364,7 +387,7 @@ 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 (_penCol),hl @@ -492,8 +515,10 @@ levselectmenu: loadlevel: cal readylevelfile +#ifdef intlevels or a ;levelfile on page 0 (=internal) jr z,levelloaded +#endif cal skiptitle ;skip description cal _Get_Word_ahl @@ -547,7 +572,7 @@ setdeflevels: ;--- 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 @@ -599,7 +624,7 @@ dispmainmenu: 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_: @@ -710,6 +735,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 @@ -880,8 +908,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 +917,8 @@ changednrworms: notselect cp K_EXIT jp z,ExitNoStats + cp K_MORE + jp z,restart psh af cal menupos cal loadgamecar @@ -913,13 +943,11 @@ selright: ; jr z,changecurworm changecurworm: -; hl=nrworms - ld a,(curworm) - cp (hl) - jr nc,mainMenu ;may not become >(nrworms) - inc a -changedcurworm: - ld (curworm),a + ld hl,curworm + ld a,(hl) + cp 4 + jr nc,mainMenu ;may not become >4 + inc (hl) jr _dispmenusets ;mainMenu selleft: @@ -936,24 +964,21 @@ selleft: ; jr z,bchangecurworm bchangecurworm: - ld a,(curworm) - dec a ;0-3 - jr nz,changedcurworm ;save >0 + ld hl,curworm + ld a,(hl) + dec (hl) ;0-3 + jr nz,_dispmenusets ;save >0 + inc (hl) +_mainMenu: jr mainMenu -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) @@ -1043,7 +1068,7 @@ waitcustomkey: changekeys: cal getwormname - ld hl,txtKeyleft + ld hl,txtKleft cal getcustomkey ;left cal getcustomkey ;right ; jr dispmenusets @@ -1072,8 +1097,15 @@ dispmenusets: psh hl inc hl ld a,(hl) + dec a ;0-5 + and 3 ;0-3 + inc a ;1-4 add a,'0' cal _vputmap + ld a,(hl) + cp 5 + ld hl,txtteamed + cal nc,_vputs ld hl,$243E ld (_penCol),hl @@ -1208,7 +1240,7 @@ emptyname: ld (hl),' ' inc hl dnz emptyname - ld a,maxnamelength + ld a,maxnamesize ld (namelength),a enternameloop: ld hl,$FF07 ;begin pos @@ -1233,7 +1265,7 @@ nokeypressed: jr nz,continue backspace: ld a,(hl) - cp maxnamelength + cp maxnamesize jr nc,nokeypressed inc (hl) dec ix @@ -1258,14 +1290,16 @@ continue: cal releasekeys jr enternameloop +savestr: + .db "00000" ;,0 ;&&&somehow put in chartable's 5-byte hole chartable: - .db 0,".<>!",0,0,0,0 ;down,L,R,up - .db 0,"XTOJE0",0 ;enter..clear - .db " WSNID9",0 ;(-)..custom - .db "ZVRMHC8",0 ;dot..del - .db "YUQLGB7#" ;0..xvar - .db $D9,"-PKFA6'" ;on..alpha - .db "54321*",0,$D0 ;F5..more + .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|- + .db -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|- + .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|- + .db "ZVRMHC8",-1 ;.|2|5|8|(|cos|prgm|del + .db "YUQLGB7#" ;0|1|4|7|ee|sin|table|xvar + .db $D9,"-PKFA6'" ;on|sto|,|x2|ln|log|graph|alpha + .db "54321*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more nameentered: pop ix ;stringbegin @@ -1460,119 +1494,120 @@ 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 - pop hl ;error - jp DisplayMenu ;return to menu + jr nz,host + +;--- client --- -host: - 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 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 +; 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 sendstuff + ld b,8 ;&&&&&&& + cal recvstuff ld hl,gameCar ld b,1 - cal sendstuff + cal recvstuff ld hl,Gametype ld b,1 - cal sendstuff + cal recvstuff ex de,hl ld b,168 - cal sendstuff + cal recvstuff + _StartLevel: jr StartLevel -sendstuff: - psh de -sendstuffloop: - psh bc - ld c,(hl) - inc hl - cal Qsend - pop bc - dnz sendstuffloop - pop de + +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 -recvstuff: - psh de -recvstuffloop: - psh bc - cal Qrecv - ld (hl),c +linkworm: ;hl=wormN+left + ld (hl),0 ;worm1|2+left 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 + 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 hl,worm2+name + ld bc,worm3-worm1-9 + add hl,bc ;worm(N+2)+name ld b,9 - cal recvstuff + jp sendstuff + +;--- host --- + +host: + cp wormVhost + jr nz,linkerror + ld c,wormVclient + cal Qsend + + ;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 - ld de,linklevel ;&&&&&&& - ld hl,datalink psh de psh hl ;loadgamecar ld b,8 - cal recvstuff + cal sendstuff ld hl,gameCar ld b,1 - cal recvstuff + cal sendstuff ld hl,Gametype ld b,1 - cal recvstuff + cal sendstuff ex de,hl ld b,168 - cal recvstuff + cal sendstuff ;--- load level --- @@ -1581,8 +1616,16 @@ StartLevel: 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) @@ -1590,6 +1633,7 @@ StartLevel: inc hl ld a,(hl) ld (growspeed),a + ld (turn),a inc hl ld a,(hl) ld (turnleft),a @@ -1681,10 +1725,10 @@ setspeed: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defspritesz + ld a,defsprsz defsprsize =$-1 defsprite =$+1 - ld de,defspriteimg + ld de,defspr setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -1878,9 +1922,9 @@ maskline: #endif ld a,(gameCar) - rla ;bit _bitmultpeas,a + rla ;bit __bitPmult,a cal c,multnewpea ;a=0 - rla ;bit _bitfood,a + rla ;bit __bitfood,a cal nc,NewPea nofood: ld bc,(worm1+pos) @@ -1940,10 +1984,10 @@ NoDelay: inc a ;-1 jr z,nextturnok dec (hl) - dec a ;0 (now <0) + dec a ;>=0 jr nz,nextturnok growspeed =$+1 - ld (hl),$FF + ld (hl),$FF ;reset nextturnok: ld a,(gameCar) @@ -2107,9 +2151,9 @@ SpSave = $-2 ld hl,$FC10 ld b,16*11 cal menuinvloop ;invert - ld hl,$FD80 + ld hl,$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow ld (hl),2 @@ -2119,9 +2163,9 @@ SpSave = $-2 ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert - inc h ;$FD80 + inc h ;$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow inc (hl) @@ -2137,12 +2181,14 @@ CURtxtGame =$-2 ld (_penCol),de ld hl,txtName cal _vputs ;Name - ld a,$3D + ld a,$3C ld (_penCol),a cal _vputs ;Died Score ld de,$0004 ld (_curRow),de +;--- who won? --- + findwinner: ld hl,(worm1+score) ld (winnerscore),hl @@ -2183,6 +2229,16 @@ nonewdmwinner: ;--- 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 ld hl,worm1+died @@ -2193,7 +2249,7 @@ displayWormStats: ld bc,left-died add hl,bc ;+left xor a - cp (hl) ;input=0 = link + cp (hl) ;left=0 = link jr nz,NoLinkIndic ld a,9 ld (_curCol),a @@ -2315,46 +2371,17 @@ NotNewHigh: 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 @@ -2381,7 +2408,7 @@ hiscrposa =$+1 adc a,0 ;ahl=saveloc ret highsave: - .db 0,0,"WOR ",0 + .db 0,0,"SHI ",0 iswinner: ld a,10 @@ -2389,6 +2416,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,7 +2448,7 @@ iswinner: ;_______________________________________________________________________________ respawncheck: - cp respawndelay-1 + cp rspawndelay-1 jr nz,unnamedlabel cal saverespawncounter removeworm: @@ -2566,7 +2618,7 @@ donediddelydone: ;--- move worm --- Wormmove: - psh bc ; >> pos + psh bc ;pos ld a,(hl) add a,a add a,d @@ -2592,13 +2644,13 @@ notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos - ld (ix+pos2),e - ld (ix+pos2+1),d ld (ix+pos),c ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d ;-check- - pop hl ; << pos (old) + pop hl ;pos (old) ld a,h sub b and 1 @@ -2614,216 +2666,17 @@ notmoveY: ;bc=newpos GotFour: cal chk4pixels rl d - jp nc,Drawworm + cal c,hitworm -;--- 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 +Drawworm: + ld c,(ix+pos) + ld b,(ix+pos+1) - 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) - - ld a,(Gametype) - cp gamerace - cal z,checkhitlapline + cp gamerace + cal z,checkhitlapline cal set4pixels dec c @@ -2980,6 +2833,212 @@ checkballhit: pop de ret +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ __ __ _ _ _____ _______ +; | | | | | |_____/ | | | \_/ |_____| | | +; |__|__| |_____| | \_ | | | | _____ | | __|__ | +;_______________________________________________________________________________ + +hitworm: + ld a,(gameCar) +#ifdef optdie +; if race - originally + ld h,a + cal checkhitotherworm + ld a,h +#endif + bit __bitPctf,a + jr nz,chkctfpeas + rla ;and _dataPmult + jp c,chkmultpeas + rla ;and _datafood + jp c,wormdead ;no food + + ld hl,0 +PeaY =$-2 +PeaX =$-1 + cal chkpeahit + jp nc,wormdead +pickpea: + cal DrawPea ;remove pea + cal NewPea +pickpea_: + ld a,(ix+grow) + add a,15 +peagrowth =$-1 + ld (ix+grow),a + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: + ld hl,Left + dec (hl) ;dec left before display + psh af + ld e,10 + cal IncScore + pop af + jp nz,Drawworm ;continue + ld a,(Gametype) + or a + jp nz,Exit ;stack restored + + ld hl,Level + ld a,(hl) + inc (hl) + ld l,a ;hl=Level + ld h,0 + add hl,hl + add hl,hl + cal _HLTIMES10 + ex de,hl + cal _IncScore ;score+(40*level) + cal removeworm + pop hl ;<<$some call + pop hl ;<yline -> a=1 + xor a ;y a=0 +checklap: + cp (ix+reserv) + ret z ;same as before + ld (ix+reserv),a ;1st time + ld e,a + ld a,(handledworm) + and 1 ;group 0 (1,3) or 1 (2,4) + xor e + ret z ;(group 0 and yyline) + psh bc + ld e,20 + cal IncScore ;lap! + pop bc + ret + ;_______________________________________________________________________________ ; _____ ______ _____ _______ _______ ; |_____] |_____/ | | | |______ @@ -3015,13 +3074,15 @@ Seed =$+1 add a,2 ret +wormdead: + pop hl ;<