X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/bf4b72fa8be434aad2c0415684c8625ae8df77a7..7ad6d272ed2820c7e2c8c884d1184072168d80d0:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 26d374f..ab13324 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,4 +1,4 @@ -; ÜÛÛÝ ÜÜÜÜ +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ ; ÛÛÛß ÛÛÛÛÝ ; ÛÛÛ ßÛÛÛ ÞÛÛÜ ;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ @@ -13,74 +13,87 @@ ; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ ; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ ; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ -; ßÛÛÛß ÛÛÛÛÝ ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ ; -; Version : 97% (0.97.13) -; Release Date : UUHHhhh... soon?!? -; Author(s) : Shiar -; Email Address : wormy@shiar.org -; Web Page : www.shiar.org -; Description : ruling Nibbles-like game 1-4 players -; Where to get this game : www.shiar.org (home of Wormy) -; Other games by author(s) : Nemesis beta -; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) -; Jonah Cohen (helped writing worm) -; Files : wormy.z80 (80898 bytes) 1234 - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 97% = DONE - -; 1% * misc (bugs, &&&, pollish, &&, &) -; * score >9 dispay -; * mem at worm #4 (still 12 bytes or so.. or more? or less?) -; * look at init-z in line routine again -; * LINK -; 1% * fix transmit game/level data (?) -; * >Somehow do a lot of testing with 2 calcs< *sigh* - -;100% = bugs fixed + levels done - -; arrow to offscreen peas -; multiple peas in sp level -;>110%: sound, startpos (?) -;>120%: coop (DON'T COUNT ON IT) - -;----------------------------- -;----------------------------- -;------- W O R M Y --------- -;----------------------------- -;----------------------------- +; Version : 97% (0.97.19) +; Release Date : 2002 January 9 +; Author(s) : Shiar +; Email Address : wormy@shiar.org +; Web Page : www.shiar.org +; Description : ruling Nibbles-like game 1-4 players +; Where to get this game : www.shiar.org (home of Wormy) +; Other games by author(s) : Nemesis beta +; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 +; Jonah Cohen : helped writing worm +; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca +; wormy.86p (6532) : efef32a8c541b4585087f55deb31f51d +;_______________________________________________________________________________ ;NOTES: ;* Use for LEARNING practises ONLY! -; Don't ever release altered code w/o permission! +; 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 quite some stuff, I can't guarantee +;* 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. -#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 -multpeas +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| _____ |_____/ |_____| +;_______________________________________________________________________________ -;#define intlevels ;internal levels -;#define readytext ;displays "prepare" before level starts -;#define invincible ;worms cannot die =) -;#define optdie ;in race games worms don't die when they run into each other +; 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 +; 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: Free Bird +; * LVL: Jonah? -#define cal call -#define psh push -#define dnz djnz +;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) + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #include "asm86.h" #include "ti86asm.inc" + + #define cal call + #define psh push + #define dnz djnz + _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -111,38 +124,54 @@ _load_ram_ahl = $462F ;ahl->page+hl _writeb_inc_ahl = $5567 ;ld (ahl++),c _jforce = $409C ;TI-OS stack restored _EXLP = $4493 ;swap (hl),(de) b times -_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl - -;----------------------------- -;------- data storage ------- -;----------------------------- - -;--- permanent - -ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl + + #define buffer ;use display buffer (otherwise write directly to screen) + #define readymask ;"greys" out the field before starting a level + #define coolzgfx ;nice graphics for game over screen + #define spprotect ;options not changable for singleplayer modes +;#define intlevels ;-internal levels +;#define readytext ;-displays "prepare" before level starts +;#define invincible ;-worms cannot die =) +;#define optdie ;-in race games worms dont die when they run into each other + +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- permanent --- + +ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) +worm4p = $A400 ;-A5FF (200) %101001O0 +;free = $A600 ;-A7FF (200) worm2p = $A800 ;-ABFF (400) %10101O00 -worm1 = $AC00 ;-AC1D (31d) -worm2 = $AC1F ;-AC3B (1F) -worm3 = $AC3E ;-AC59 (1F) -worm4 = $AC5D ;-AC77 (1F) -balls = $AC7C ;-ACFF (3x43d) -SinCosTable = $AD00 ;-AE00 (4*40) -turn10 = $AE01 ;-AE01 (1) (counter) -peaspos = $AE02 ;-AE05 (4+) (peas) -;free = $AE06 ;-AFFF (1FA) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1F (1F) +worm2 = $AD20 ;-AD3E (1F) +worm3 = $AD3F ;-AD5D (1F) +worm4 = $AD5E ;-AD7C (1F) +balls = $AD7D ;-AE00 (<=3x44d) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AF05 (4-260) (peas) +;free = $AF06 ;-AFFF (F9) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 +;buffer = $BC00 ;-BF90 (390) ;free = $BF91 ;-BFFF (6F) ;program = $D748 ;-EFFF (186D+4A) ;6327 -worm4p = $F000 ;-F3FF (400) %11110O00 -leveldata = $F400 ;-FA70 (<=671) - ;can you believe i actually left $269 bytes of memory unused?!? +leveldata = $F080 ;-F9FF (<=97F) +#ifndef intlevels +datalevels = $FA00 ;-FA11 (12) (>=$C000) +nrlevels = $FA12 ;-FA1B (A) (<$FA70) +#endif ;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong -; |..[------]||[]|......[-----]|[].| ;if you still understand +; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < ; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary --- namelength = $BC00 ;(1) @menu datalink = $BC00 ;(8) @init @@ -151,11 +180,16 @@ DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif -lefttotalb = $AFFF +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 -;----------------------------- -;------- program start ------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ .org %1101011101001000 @@ -178,7 +212,7 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .13",0 + .db " 97% .19",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -191,7 +225,7 @@ WormIcon: .db %00111100,%00111110 levelhead = 'w' -levelhead2 = 95 ;wormy levels header = "95" +levelhead2 = 97 ;wormy levels header = "97" int_handler: ex af,af' @@ -295,10 +329,16 @@ loadgametype: inc bc pop af pop de ;counter - dec d ;8x + dec d ;9x jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + searchcomplete: ld a,255 ld (ix),a ;end mark @@ -499,9 +539,13 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ + +;--- trig tables --- ld hl,TrigPrecalc ;I believe this ld de,SinCosTable ;is one of the few @@ -526,11 +570,15 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;---draw menu--- -DisplayMenu: ;---draw menu--- +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) @@ -591,7 +639,7 @@ hrloop: dnz hrloop ret -;--- menu loop --- +;--- options menu --- dispoptionmenu: ld hl,txtoMenu @@ -600,13 +648,18 @@ dispoptionmenu: cal dispmenucommon_ dispomenusets: +#ifdef spprotect + ld a,(gameCar) + and _datasingl + jp nz,LetsGetThisPartyOn +#endif cal clrold ld hl,$1E3E ld (_penCol),hl cal loadgamecar psh hl - cal cshowA0 ;lives + cal cshowA ;lives ld hl,$2A3E ld (_penCol),hl @@ -620,7 +673,7 @@ dispomenusets: cal _vputs jr dispspeeddone dispspeed: - cal cshowA0 + cal cshowA dispspeeddone: ld hl,$363E @@ -630,7 +683,7 @@ dispspeeddone: psh hl ld a,(hl) ;(growth) inc a ;-1=None; 0..98->1..99 - cal cshowA0 + cal cshowA ld hl,$303E ld (_penCol),hl @@ -644,7 +697,7 @@ dispspeeddone: cal _vputs jr dispturndone dispturn: - cal cshowA0 ;turn speed + cal cshowA ;turn speed dispturndone: ld hl,$243E @@ -654,7 +707,7 @@ dispturndone: ld a,(hl) ;(scorelimit) or a psh af - cal cshowA0 ;limit + cal cshowA ;limit pop af ;a==0? jr z,optionMenu ;do not display 0 behind 'None' ld a,'0' @@ -806,7 +859,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu --- mainMenu: cal menupos @@ -995,7 +1048,7 @@ changekeys: cal getcustomkey ;right ; jr dispmenusets -;---display current settings--- +;--- display current settings --- dispmenusets: cal clrold @@ -1041,7 +1094,7 @@ displink: or a ;gamesingle jr nz,displvlname ld a,(Level) - cal cshowA0 + cal cshowA00 jr lvldisped displvlname: cal _vputs @@ -1219,9 +1272,11 @@ nameentered: ld (ix+8),0 ;end mark jp DisplayMenu -;----------------------------- -;------- procs-n-stuff ------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ ubergetkey: halt ;woo hoo @@ -1248,13 +1303,10 @@ clroldsetsloop: hlatlevel: ;d must be 0 psh hl ;loadgamecar ld a,(Gametype) ;8bytes -> 7bytes - ld e,a - add a,a ;nc - add a,e - add a,a ;8->2bytes - add a,28+1 ;go to datalevels + add a,a ld e,a ;=de - sbc hl,de ;datalevels + ld hl,datalevels + add hl,de cal _ldHLind ;ld hl,(hl) pop de ;de=loadgamecar inc de \ inc de @@ -1352,9 +1404,11 @@ loadgamecar: ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit @@ -1397,7 +1451,7 @@ gameCar =$-1 rra ;and _datalink jr nc,_StartLevel -;--------- link ------------ +;--- link --- wormVhost = 095 wormVclient = 195 @@ -1504,8 +1558,8 @@ sethost: cal recvstuff pop hl ;loadgamecar pop de ;leveldata - ld hl,templevels ;&&&&&&& - ld de,datalink + ld de,linklevel ;&&&&&&& + ld hl,datalink psh de psh hl ;loadgamecar ld b,8 @@ -1520,7 +1574,7 @@ sethost: ld b,168 cal recvstuff -;-------- load level --------- +;--- load level --- StartLevel: pop hl ;loadgamecar @@ -1545,7 +1599,7 @@ StartLevel: ld h,0 ld a,(gameCar) rla - ld a,0 ;(Left)=256 + ld a,h ;(Left)=256 jr nc,setscorelimit ld a,l ld l,h @@ -1609,7 +1663,7 @@ setspeed: ld de,peagrowth ldi ld a,(hl) - ld (worm1+grow),a + ld (worm1+grow),a ;&&sh ld (worm2+grow),a ld (worm3+grow),a ld (worm4+grow),a @@ -1687,7 +1741,7 @@ worminit: inc a ;ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level --- initlevel: ld a,(de) @@ -1785,7 +1839,7 @@ levelhasbeensetup: cal drawstuff -;--------- prepare ----------- +;--- prepare --- leveldone: psh hl ; >> levelp new @@ -1824,14 +1878,11 @@ maskline: #endif ld a,(gameCar) - bit _bitfood,a - jr nz,nofood -; ld ix,worm1 - cal NewPea - xor a -nofood: rla ;bit _bitmultpeas,a - cal c,multnewpea + cal c,multnewpea ;a=0 + rla ;bit _bitfood,a + cal nc,NewPea +nofood: ld bc,(worm1+pos) cal DisplayField @@ -1841,9 +1892,11 @@ ReadyDelay: dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1934,9 +1987,11 @@ handleworms: inc (hl) ;0..nrworms-1 dnz handleworms -;----------------------------- -;---------- keys ------------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _______ __ __ _______ +; |____/ |______ \_/ |______ +; | \_ |______ | ______| +;_______________________________________________________________________________ HandleKeys: ld a,%10111111 @@ -1950,7 +2005,7 @@ CheckExit: jp c,GameLoop jp Exit ;jr? -;------- pause menu ------- +;--- pause menu --- disppausemenu: ld hl,txtpMenu @@ -2031,6 +2086,12 @@ donepausing: cal releasekeys jp GameLoop +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _ _ _______ ______ +; | ____ |_____| | | | |______ | | \ / |______ |_____/ +; |_____| | | | | | |______ _____ |_____| \/ |______ | \_ +;_______________________________________________________________________________ + Exit: cal releasekeys ld sp,0 ;pop all @@ -2120,7 +2181,7 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;---display worms--- +;--- display worms --- ld a,(nrworms) ld b,a @@ -2177,7 +2238,8 @@ notwinner: psh hl inc hl ;worm+score cal _ldHLind - cal showHL + cal _D_HL_DECI + cal _puts ;showHL pop hl ld bc,worm2-worm1 @@ -2248,7 +2310,8 @@ NotNewHigh: ld hl,highsave+2 cal _puts ld hl,(highsave) - cal showHL + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: @@ -2326,9 +2389,11 @@ iswinner: ld a,'*' jp _putc ;..then put * -;----------------------------- -;----------- worm ------------ -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ respawncheck: cp respawndelay-1 @@ -2441,9 +2506,11 @@ inlink: ld l,c ret -;----------------------------- -;------- handle worm --------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2496,7 +2563,7 @@ donediddelydone: pop hl #endif -;-------- move worm ---------- +;--- move worm --- Wormmove: psh bc ; >> pos @@ -2549,24 +2616,22 @@ GotFour: rl d jp nc,Drawworm -;--------- worm hit ---------- +;--- worm hit --- Hitworm: ld a,(gameCar) - ld h,a #ifdef optdie ; if race - originally + ld h,a cal checkhitotherworm ld a,h #endif - and _datactfpeas ;&&bit + bit _bitctfpeas,a jr nz,chkctfpeas - ld a,h - and _datamultpeas ;&&bit - jp nz,chkmultpeas - ld a,h - and _datafood - jp nz,WormDead ;no food + rla ;and _datamultpeas + jp c,chkmultpeas + rla ;and _datafood + jp c,WormDead ;no food ld hl,0 PeaY =$-2 @@ -2591,9 +2656,6 @@ wormset2grow: cal IncScore pop af jp nz,Drawworm ;continue -; ld a,(gameCar) ;(Left)>256 -; and _datafoodl -; jp z,Drawworm ld a,(Gametype) or a jp nz,Exit ;stack restored @@ -2650,14 +2712,12 @@ sel_otherpea: pop af ;which flag? (=and %1) ld hl,drawctfpea1 ;restore #1 jr z,nottheotherflag - ld hl,drawctfpea2 ;restore #2 + inc hl ;ld hl,drawctfpea2 + inc hl ;restore #2 nottheotherflag: ld (hl),3 ;draw delay 3 turns ret -drawctfpea1: .db 0 -drawctfpea2: .db 0 - hitflag: ;correct pea hit ld a,e ;pop a xor %11 ;invert flag taken + ownflag @@ -2704,8 +2764,9 @@ pickmultpea: cal DrawPea jp pickpea_ -;----------------------------- +;--- misc --- +#ifdef optdie nextotherwormbit: ld a,c sub (hl) @@ -2725,6 +2786,7 @@ ChkWorm: cal _cphlde jr nz,nextotherwormbit ret ;z +#endif checkhitlapline: ld a,(peaspos) ;63 @@ -2753,7 +2815,7 @@ checklap: pop bc ret -;-------- draw worm ---------- +;--- draw worm --- Drawworm: ld c,(ix+pos) @@ -2821,9 +2883,11 @@ ResPixel: ld (hl),a ret -;----------------------------- -;---------- ball ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ handlethoseneatlittleballs: ld hl,balls @@ -2916,9 +2980,11 @@ checkballhit: pop de ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ _______ _______ +; |_____] |_____/ | | | |______ +; | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ releasekeys: halt @@ -2979,10 +3045,9 @@ handledworm =$-2 inc (ix+died) dec (ix+lives) psh af - ld de,10 ld a,(Gametype) cp gamectf ;ctf no death penalty - cal nz,DecScore + cal nz,DecScore10 pop af ret nz ;HandleWorm done ld a,(wormbeglives) @@ -3010,23 +3075,21 @@ anyworm: checkhitotherworm: .db $dd,$7d ;ld a,lx cp worm2&255 - psh ix - jr nz,chkworm2 ; ret nz + psh ix + jr nz,chkworm2 ;ret nz ld ix,worm1 - jr chkworm + jr chkworm chkworm2: - ld ix,worm2 - + ld ix,worm2 chkworm: - ld h,(ix+tail+1) - ld l,(ix+tail) - ld e,(ix+head) - ld d,(ix+head+1) + ld h,(ix+tail+1) + ld l,(ix+tail) + ld e,(ix+head) + ld d,(ix+head+1) cal ChkWorm - pop ix + pop ix ret z ;not hit pop bc ;call - stopworm: ld bc,0 previouspos =$-2 @@ -3088,6 +3151,7 @@ multpealoop: ldi pop bc dnz multpealoop + ld a,-1 ret NewPea: @@ -3148,7 +3212,11 @@ nextbitok: dnz sprloopy ret -;----------- score ----------- +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ +; |______ | | | |_____/ |______ +; ______| |_____ |_____| | \_ |______ +;_______________________________________________________________________________ timematchscore: ;piece of crap checking whether you've already won in timematch @@ -3206,19 +3274,17 @@ extralives: inc (ix+lives) jr scorecommon -DecScore: ;&&& - ld h,(ix+score+1) - ld l,(ix+score) - or a - sbc hl,de - jr c,showstats ;<0=0 +DecScore10: + cal ldscoreinhl + ld de,-10 + add hl,de + jr nc,showstats ;<0=0 jr scorecommon IncScore: ;inc score by e ld d,0 _IncScore ; inc by de - ld h,(ix+score+1) - ld l,(ix+score) + cal ldscoreinhl ld a,(Gametype) or a ;if singleplayer... jr z,extralives @@ -3241,7 +3307,8 @@ showstats: ld hl,$FC00 ;&&&only necessary in deathmatch ld b,6*16-1 clearstats: - ld (hl),a ;=0 + ; ld (hl),a ;=0 + ;&&&&&& inc hl dnz clearstats forceshowstats: @@ -3290,19 +3357,23 @@ nameshown: ret showstat: ;(multiplayer) - ld a,(Gametype) - cp gamedeathm - jr z,showlives + ld a,(wormbeglives) + or a + jr nz,showlives showscore: - ld h,(ix+score+1) - ld l,(ix+score) + cal ldscoreinhl cal _D_HL_DECI jr __vputs showlives: ld a,(ix+lives) -showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) - cp 10 - jr c,showleastsign + jr cshowA00 + +cshowA: ;small w/ leading 0 + or a + jr nz,cshowA00 + ld hl,txtNone + jp _vputs +cshowA00: ld l,a ld h,0 cal _divHLby10 @@ -3311,7 +3382,7 @@ showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) add a,'0' cal __vputmap pop af -showleastsign: +cshowA0: add a,'0' __vputmap: psh ix @@ -3324,24 +3395,29 @@ showstatsS: ;(singleplayer) cal __vputs ld a,0 Level =$-1 - cal showA + cp 10 + psh af + cal c,cshowA0 + pop af + cal nc,cshowA00 - ld a,98 + ld a,97 ld (_penCol),a cal showscore ld a,123 ld (_penCol),a - cal showlives + ld a,(ix+lives) + cal cshowA0 ;showlives ld a,(gameCar) and _datafoodl pop ix ret z showleft: - ld a,31 + ld a,33 ld (_penCol),a ld a,0 Left =$-1 - cal cshowA0 + cal cshowA ld hl,txtLeft __vputs: @@ -3366,27 +3442,6 @@ showA0: ;big w/ leading 0 add a,'0' jp _putc -cshowA0: ;small w/ leading 0 - or a - jr nz,cshowavalue - ld hl,txtNone - jp _vputs -cshowavalue: - ld l,a - ld h,0 - cal _divHLby10 - psh af - ld a,l - add a,'0' - cal __vputmap - pop af - add a,'0' - jp __vputmap - -showHL: - cal _D_HL_DECI - jp _puts - _D_HL_DECI: ld de,savestr+4 ld b,5 @@ -3401,7 +3456,16 @@ ldhld: savestr: .db "00000",0 -;----------------------------- +ldscoreinhl: + ld h,(ix+score+1) + ld l,(ix+score) + ret + +;_______________________________________________________________________________ +; ______ _____ _______ _____ _______ __ __ +; | \ | |______ |_____] | |_____| \_/ +; |_____/ __|__ ______| | |_____ | | | +;_______________________________________________________________________________ DisplayField: ;all done by Jonah Cohen iirc. (-scrolling is scary-) ld a,c ;not the fastest routine outthere, but it does get the job done. @@ -3625,7 +3689,11 @@ ChunkRow: ld c,$37 ;scf ret -;----------- draw ------------ +;_______________________________________________________________________________ +; ______ ______ _______ _ _ _ +; | \ |_____/ |_____| | | | +; |_____/ | \_ | | |__|__| +;_______________________________________________________________________________ ;--- pixel --- @@ -3712,6 +3780,8 @@ drawsmtn: ; dec a ;4 = circle ; jp z,drawcircle +;--- circle --- + ;IMHO, one weery nice routine. Oh lemme be proud just *once*. ;Not perfect since it uses a screwy lineroutine to draw stuff ;but, just _look_ at it. Ain't it grand? Z80 at its best. @@ -3783,6 +3853,8 @@ circledraw: ;destr:de pop hl ret ;thats it +;--- box --- + drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y ld l,e @@ -3793,6 +3865,8 @@ boxloop: dnz boxloop ret +;--- fatline --- + drawfatline: cal drawline inc d @@ -3805,6 +3879,8 @@ drawfatline: dec h ; jp drawline +;--- line --- + ;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it ;himself tho.) I did make a few optimizations and commented the thing. ;A nice routine (also Bresenham), but for Wormy not perfect since really @@ -3918,7 +3994,7 @@ sendnewpeaoverlink: ld a,(gameCar) rra ;and _datalink ret nc ;no link - ld a,(ix+left) + ld a,(worm1+left) or a jr z,receivenewpeaoverlink ld c,l ;send pea's pos @@ -3927,14 +4003,16 @@ sendnewpeaoverlink: ; jr Qsend ;that's why it's here ;..and last but not least..: -;----------------------------- -;----------- link ------------ -;----------------------------- +;_______________________________________________________________________________ +; _____ __ _ _ _ / +; | | | \ | |____/ / +; |_____ __|__ | \_| | \_ . +;_______________________________________________________________________________ timeout = $8000 lossout = 20 -;---- SEND ---- +;--- send --- Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde --- nop \ nop @@ -3963,7 +4041,7 @@ sendfinish: ld (linklosses),a ;reset number of losses ret ;=ok -;---- RECV ---- +;--- recv --- Crecv: ;--- receive 8 bits into A/C --- destr:abCde --- cal Qrecv @@ -3998,7 +4076,7 @@ recvfinish: ld (linklosses),a ;reset number of losses ret -;---- COMMON ---- +;--- common --- linkok: ld a,D0HD1H @@ -4033,10 +4111,11 @@ linkerr: jp Exit #ifdef intlevels - -;----------------------------- -;---------- levels ----------- -;----------------------------- +;_______________________________________________________________________________ +; _____ __ _ _______ _______ _ _ _______ _______ +; | | \ | | | |______ \ / |______ | |______ +; __|__ | \_| | _____ |_____ |______ \/ |______ |_____ ______| +;_______________________________________________________________________________ LevelDef: .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls @@ -4096,9 +4175,11 @@ LevelDefC: ;ctf #endif -;----------------------------- -;---------- data ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ +; | \ |_____| | |_____| +; |_____/ | | | | | +;_______________________________________________________________________________ wtPicture: ;title .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000 @@ -4210,26 +4291,23 @@ txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0 #endif #ifdef intlevels -datalevels: .dw LevelDef, LevelDefM - .dw LevelDefT,LevelDefM - .dw LevelDefM,LevelDefM,LevelDefM +datalevels: .dw LevelDef, LevelDefM,LevelDefT + .dw LevelDefM,LevelDefM,LevelDefM,LevelDefM .dw LevelDefR,LevelDefC nrlevels: .db 2,3,1,3,3,3,3,3,1,0 ;=defaults -#else -datalevels: .dw 0,0,0,0,0,0,0,0,0 -nrlevels: .dw 0,0,0,0,0 #endif _datalink = %00000001 ;linkplay _datafoodl = %00000010 ;left=0 limit _datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) _datactfpeas = %00001000 ;ctf peas=1 +_bitctfpeas = 3 _datatime = %00010000 ;time incs score (timematch) -_datafood = %00100000 ;food present=0 -_bitfood = 5 +_datafood = %01000000 ;food present=0 +_bitfood = 6 _datamultpeas = %10000000 ;multiple peas=1 (no _datafood) _bitmultpeas = 7 -;reserved %01000000 ;for future use +;reserved %00100000 ;for future use savestart: ; Úgame info (see above) ; | Úlives (0=unlimited) @@ -4240,21 +4318,21 @@ savestart: ; ; | | | | | | Úturn speed (8=def) ; | | | | | | | Úscore limit (0=none) gamesingle = 0 ; | | | | | | | | -datasingle: .db %01000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives) +datasingle: .db %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives) gamepeas = 1 -datapeas: .db %01000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live) +datapeas: .db %00000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live) gametron = 2 -datatron: .db %01110100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth) +datatron: .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth) gamedeathm = 3 -datadeathm: .db %01100000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth) +datadeathm: .db %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth) gamefoodm = 4 -datafoodm: .db %01000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score) +datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score) gamemfoodm = 5 -datamfoodm: .db %11100010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)) +datamfoodm: .db %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)) gametimem = 6 -datatimem: .db %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score) +datatimem: .db %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score) gamerace = 7 -datarace: .db %01100000,0,2,1,-1,-1, 8,10 ;Race (100 score) +datarace: .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score) gamectf = 8 datactf: .db %01001000,0,4,1,-1,-1, 8,10 ;CTF (100 score) @@ -4268,7 +4346,7 @@ worm3set: .dw worm3p,worm3p .db %11111011,1,-01,K_COMMA,K_STO worm3name: .db "NIBBLER ",0 worm4set: .dw worm4p,worm4p - .db %11111011,0,-01,K_PLUS,K_ENTER + .db %11111101,0,-01,K_PLUS,K_ENTER worm4name: .db "JIM ",0 defhiscrpos: @@ -4323,9 +4401,11 @@ deflevels: #endif templevels: -;----------------------------- -;----------- end ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _ _ _______ _______ . _______ _______ +; | |_____| |_____| | ' |______ |_____| | | +; | | | | | | ______| _____ | | |_____ |_____ +;_______________________________________________________________________________ .end