From: Mischa Poslawsky Date: Sat, 19 Jan 2002 23:49:32 +0000 (+0100) Subject: wormy 0.98.118 X-Git-Url: http://git.shiar.nl/wormy.git/commitdiff_plain/8f60bb28bd8e341e88dfc15ae3db93991f753cf5 wormy 0.98.118 --- diff --git a/wormy.z80 b/wormy.z80 index 18efe0c..785cea9 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -16,8 +16,8 @@ ; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß ;_______________________________________________________________________________ ; -; Version : 97% (0.97.116) -; Release Date : 2002 January 16 +; Version : 98% (0.98.118) +; Release Date : 2002 January 18 ; Author(s) : Shiar ; Email Address : wormy@shiar.org ; Web Page : www.shiar.org @@ -31,19 +31,94 @@ ; wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d ;_______________________________________________________________________________ -;--- notes --- - -; * Use for LEARNING practises ONLY! -; Don't _ever_ release altered code w/o permission! -; Please notify me of using code, and give me credits! -; * Code was originally by Scabby (Matthew Shepcar), -; a few lines by Jonah Cohen, -; and everything else by me - Shiar (Mischa Poslawsky). -; * Although I've commented & labeled quite some stuff, I can't guarantee -; everybody will understand it. This is probably not the best source -; to learn z80 from. w00t the Shyer Way (tm). -; * Also read wormy.txt please, thank you -; * Don't scroll down if you get scared easily. +;--- 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 stuff inhere +; * 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 ;_______________________________________________________________________________ ; _______ _____ ______ _____ @@ -51,7 +126,7 @@ ; | |_____| ____ |_____/ |_____| ;_______________________________________________________________________________ -; 97% = DONE +; 97% = PREVIOUS ; X [15] lives >9 dispay ; X [15] sp modes not configurable ; X [16] LVL: episode #2: 10 sp levels @@ -86,25 +161,47 @@ ; X [116] LINK: minimize sent data ; X [116] remove +input in worm storage ; X [116] head position init uses same data as tail (-4 bytes) -; * word-value display storage in chartable hole?? -; 1% * misc (bugs, &&&, pollish, &&, &) -; * look at init-z in line routine again -; * rare pea|wall overwrite <- apply stopworm fix? +; X [116] fix bug at no levels (115A intro) +; X [117] saved 6 bytes by hardcoding some empty bytes in title graphics +; X [117] two pieces of duplicate code removed +; X [117] combined temporary storage for _D_HL_DECI and temp hiscore +; X [117] more repetitious code shortened +; X [117] wrong stack handling in checkpea, and unnecessary bloat +; X [117] stopworm after eating pea (pea|wall overwrite fixed!) +; X [117] old code removed from hitworm +; X [117] replace jps by jrs (moved code around a bit) +; X [117] scorebar doesn't diplay 1st wormname char anymore +; X [117] scorebar can display both lives and score when appropriate +; X [118] look at init-z in line routine again -> fixed steepline init-z +; X [118] snake86 findpixel (saves 1 byte) +; X [118] removed flash at new level start +; X [118] begin growth set in normal worm init loop +; X [118] bad code and potentially bad code reviewed and optimized +; X [118] final sourcecode layout ((sub)captions, index, indents, etc) +; 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) ; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* -; * LVL: episode #3: at least 5 lvls for each mp mode -; * LVL: episode #4: 10 sp levels, including multipeas -; 1% * LVL: episode #5: ... +; * LVL: episode #1: add 2-3 circle- and line levels. +; * LVL: episode #3: 6x5 multiplayer levels +; * LVL: episode #5: 10 easy sp levels (do i _have_ to?) +; * LVL: Eric? (ep#5?) ; * LVL: Wormage ; * LVL: Free Bird ; * LVL: Jonah? +; 1% * fix any bugs that come up + +;--- future features ----------------------------------------------------------- + +;just a maybe-list; NO guarantees! ; -;100% = bugs fixed + levels done -; * correct team winners -; * arrow to offscreen peas -;110% * sound +; * correct team winners +; * level compression +; * arrow to offscreen peas +; * sound ; * startpos -;120% * coop (DON'T COUNT ON IT) -; * pause in linkplay +; * pause in linkplay +; * coop (DON'T COUNT ON IT) ;_______________________________________________________________________________ ; _/_/_____ __ _ _______ _ _ ______ _______ @@ -158,7 +255,6 @@ _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl ;#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 ;_______________________________________________________________________________ ; _______ _______ _____ ______ _______ ______ _______ @@ -166,7 +262,7 @@ _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl ; ______| | |_____| | \_ | | |_____| |______ ;_______________________________________________________________________________ -;--- permanent --- +;--- permanent ----------------------------------------------------------------- ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) worm4p = $A400 ;-A5FF (200) %101001O0 @@ -197,7 +293,7 @@ defspr = $F078 ;-F07F (8) ; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < ; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary --- +;--- temporary ----------------------------------------------------------------- namelength = $BC00 ;(1) @menu datalink = $BC00 ;(8) @init @@ -211,7 +307,7 @@ lefttotalb = $BF91 ;(1) @game drawctfpea1 = peaspos+4 drawctfpea2 = peaspos+6 -;--- layout --- +;--- layout -------------------------------------------------------------------- ;(wormN) set: heading = 0 ;level* @@ -260,7 +356,7 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .116",0 + .db " 98% .118",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -310,6 +406,8 @@ Start: ld i,a im 2 ;...it *does* work ;) +;--- search levels ------------------------------------------------------------- + restart: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start @@ -593,7 +691,7 @@ setdeflevels: ; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | ;_______________________________________________________________________________ -;--- trig tables --- +;--- trig tables --------------------------------------------------------------- ld hl,trigtable ;I believe this ld de,SinCosTable ;is one of the few @@ -624,14 +722,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 @@ -656,14 +765,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) @@ -687,7 +793,7 @@ hrloop: dnz hrloop ret -;--- options menu --- +;--- options menu -------------------------------------------------------------- dispoptionmenu: ld hl,txtoMenu @@ -698,8 +804,8 @@ dispoptionmenu: dispomenusets: #ifdef spprotect ld a,(gamecar) - and _datasingl - jp nz,LetsGetThisPartyOn + rra ;and _datasingl + jp nc,LetsGetThisPartyOn ;SP -> start game #endif cal clrold @@ -910,7 +1016,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- main menu --- +;--- main menu ----------------------------------------------------------------- mainMenu: cal menupos @@ -1096,7 +1202,7 @@ changekeys: cal getcustomkey ;right ; jr dispmenusets -;--- display current settings --- +;--- display current settings -------------------------------------------------- dispmenusets: ld de,$183E @@ -1165,7 +1271,7 @@ curworm =$-1 cal _vputs jp mainMenu -;--- handle menukeys --- +;--- handle menukeys ----------------------------------------------------------- menucall: psh bc @@ -1226,8 +1332,7 @@ menunewok: ld b,a jr menupos -;--- change name --- -; of worm#(curworm) +;--- change name --------------------------------------------------------------- getwormname: ;of (curworm) ld a,(curworm) @@ -1292,7 +1397,7 @@ continue: dec (hl) ;(namelength) jr z,nameentered - ld hl,chartable + ld hl,chartable-1 ld e,a ld d,0 add hl,de @@ -1304,16 +1409,15 @@ 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 -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|- - .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|- - .db "ZVRMHC8",-1 ;.|2|5|8|(|cos|prgm|del +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*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more + .db "54321*",-5,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more nameentered: pop ix ;stringbegin @@ -1486,10 +1590,10 @@ OhMyGodItsALabel: ;pj34r my coding skillz ex (sp),hl ;pop \ psh leveldata psh hl ;psh loadgamecar ld a,(gamecar) - rra ;and _datalink - jr nc,_StartLevel + and _datalink + jr z,_StartLevel -;--- link --- +;--- link ---------------------------------------------------------------------- wormVhost = 095 wormVclient = 195 @@ -1505,7 +1609,7 @@ linkmatch: cp wormVclient jr nz,host -;--- client --- +;--- client -------------------------------------------------------------------- client: ; ld hl,txtReceiv @@ -1545,7 +1649,7 @@ linkerror: pop hl ;error jp DisplayMenu ;return to menu -;--- set/send worms --- +;--- set/send worms ------------------------------------------------------------ moveworm2: ld hl,worm2+left @@ -1575,7 +1679,7 @@ sendworm: ;hl=wormN+name ld b,9 jp sendstuff -;--- host --- +;--- host ---------------------------------------------------------------------- host: cp wormVhost @@ -1609,7 +1713,7 @@ host: ld b,168 cal sendstuff ;level -;--- load level --- +;--- load level ---------------------------------------------------------------- StartLevel: pop hl ;loadgamecar @@ -1707,13 +1811,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 @@ -1765,20 +1864,23 @@ toobad_noballs: 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 @@ -1787,10 +1889,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) @@ -1811,13 +1912,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 @@ -1888,7 +1983,7 @@ levelhasbeensetup: cal drawstuff -;--- prepare --- +;--- prepare ------------------------------------------------------------------- leveldone: psh hl ; >> levelp new @@ -2054,7 +2149,7 @@ CheckExit: jp c,GameLoop jp Exit ;jr? -;--- pause menu --- +;--- pause menu ---------------------------------------------------------------- disppausemenu: ld hl,txtpMenu @@ -2192,7 +2287,7 @@ CURtxtGame =$-2 ld de,$0004 ld (_curRow),de -;--- who won? --- +;--- who won? ------------------------------------------------------------------ findwinner: ld hl,(worm1+score) @@ -2232,7 +2327,7 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;--- display worms --- +;--- display worms ------------------------------------------------------------- ;x123456789012345678901 ;>>>>>> GAME OVER <<<<< @@ -2328,37 +2423,36 @@ hilevelcheckdone: inc de ld a,(de) ;gamecar - and _datasingl - jr z,hiscorecheckdone ;no SP + rra ;and _datasingl + jr c,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 @@ -2370,9 +2464,11 @@ 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: @@ -2391,7 +2487,7 @@ waitkeyloop: ret loadhiscoreposinahl: - ld hl,0 ;for peaworm and singleplayer + sbc hl,hl ;cf=0 ld a,(gametype) or a ;Singleplayer? jr z,hi__ @@ -2414,8 +2510,8 @@ hiscrposhl =$-2 hiscrposa =$+1 adc a,0 ;ahl=saveloc ret -highsave: - .db 0,0,"SHI ",0 +savestr: ;hiscore (00AAA) _D_HL_DECI (00000) + .db $BB,"w00t",0 iswinner: ld a,10 @@ -2423,7 +2519,7 @@ iswinner: ld a,'*' jp _putc ;..then put * -;--- quit --- +;--- quit ---------------------------------------------------------------------- ExitNoStats: cal linkok @@ -2459,39 +2555,31 @@ respawncheck: jr nz,unnamedlabel cal saverespawncounter removeworm: - ld h,(ix+tail+1) ;& + ld h,(ix+tail+1) ld l,(ix+tail) ld d,(ix+head+1) ld e,(ix+head) 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) - and _datasingl - jr nz,safewormsizedone + rra ;and _datasingl + jr nc,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: @@ -2556,8 +2644,8 @@ inputcall: jr z,inlink ;input by link cal inkeys ;input by keys ld a,(gamecar) - rra ;and _datalink - ret nc ;no link + and _datalink + ret z ;no link ld c,l ;send our keys jp Qsend inlink: @@ -2608,23 +2696,9 @@ 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: +wormmove: psh bc ;pos ld a,(hl) add a,a @@ -2651,35 +2725,33 @@ notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos - ld (ix+pos),c - ld (ix+pos+1),b ld (ix+pos2),e ld (ix+pos2+1),d ;-check- 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 - cal c,hitworm + cal chk4pixels ;d-=pixels at b,c + rl d ;<0 meaning there were >d pixels + cal c,hitworm ;so that wasn't us -;--- draw worm --- +;--- 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) cp gamerace @@ -2714,20 +2786,23 @@ 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) + jr set4pixels ;redraw new last bit + +removetailbit: 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 + cal res4pixels ;rm last bit pop hl - ld c,(hl) - inc hl - ld b,(hl) - jr set4pixels + ret res4pixels: cal ResPixel @@ -2846,29 +2921,107 @@ checkballhit: ; |__|__| |_____| | \_ | | | | _____ | | __|__ | ;_______________________________________________________________________________ +;--- 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 ;%10 = carrying flag? + jr z,_wormdead ;if not just die + xor %11 ;drop flag + ld (ix+reserv),a + ld hl,drawctfpea1 ;restore #1 + jr z,nottheotherflag ;which flag? (=and %1) + 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 af ;safe z-flag + psh bc ;safe position + cal DrawPea ;remove + ld e,20 ;flag captured+returned + cal z,IncScore + pop bc + pop af + ret nz ;flag taken: continue game ;drawworm + ld a,3 ;draw delay + ld (drawctfpea1),a ;redraw.. + ld (drawctfpea2),a ;..both flags + ret ;drawworm + +;--- main ---------------------------------------------------------------------- + hitworm: -#ifdef optdie -; if race - originally - cal checkhitotherworm -#endif ld a,(gamecar) bit __bitPctf,a jr nz,chkctfpeas rla ;and _dataPmult - jp c,chkmultpeas + jr c,chkmultpeas rla ;and _datafood - jp c,wormdead ;no food + jr c,_wormdead ;no food + +;--- foodmatch|SP -------------------------------------------------------------- ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit - jp nc,wormdead -pickpea: - cal DrawPea ;remove pea + jr nc,_wormdead + +;--- take pea ------------------------------------------------------------------ + + psh hl cal NewPea -pickpea_: - ld a,(ix+grow) + pop hl +pickedpea: + cal DrawPea ;remove pea + ld a,(ix+grow) ;grow add a,15 peagrowth =$-1 ld (ix+grow),a @@ -2876,12 +3029,14 @@ peagrowth =$-1 inc (ix+grow+1) wormset2grow: ld hl,Left - dec (hl) ;dec left before display + dec (hl) ;dec left _before_ display psh af ld e,10 cal IncScore pop af - jp nz,Drawworm ;continue + 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 @@ -2897,9 +3052,9 @@ wormset2grow: ex de,hl cal _IncScore ;score+(40*level) cal removeworm - pop hl ;<<$some call - 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 +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 @@ -3572,13 +3614,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 @@ -3789,9 +3825,9 @@ ChunkRow: ; |_____/ | \_ | | |__|__| ;_______________________________________________________________________________ -;--- pixel --- +;--- pixel --------------------------------------------------------------------- -chk4pixels: ;&& +chk4pixels: cal CheckPixel inc b cal CheckPixel @@ -3808,41 +3844,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) @@ -3874,7 +3908,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 @@ -3947,7 +3981,7 @@ circledraw: ;destr:de pop hl ret ;thats it -;--- box --- +;--- box ----------------------------------------------------------------------- drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3959,7 +3993,7 @@ boxloop: dnz boxloop ret -;--- fatline --- +;--- fatline ------------------------------------------------------------------- drawfatline: cal drawline @@ -3973,7 +4007,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. @@ -4023,7 +4057,7 @@ lineYincs: ;lets assume y incs as well pop hl ; :