X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/26fb52490a2e38fde7ebf17e201773c254ba9929..61ed48a60982d4c4760121ed2cb880e9c54b4c5e:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 22fc918..22131ff 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,61 +1,86 @@ -; Title : Wormy -; Version : 96% (0.96.C14) -; Release Date : UUHHhhh... soon?!? -; Filename : wormy.86p (5kb) -; 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) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 96% = DONE - -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] -; 1% * misc (pollish, bugs, &&&) -; 1% * long length save (level#6) -; * mem at worm #4 +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ +; ÛÛÛß ÛÛÛÛÝ +; ÛÛÛ ßÛÛÛ ÞÛÛÜ +;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ +;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ +;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ +;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ +;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ +;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ +;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ +; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ +; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ +; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ +; +; Version : 97% (0.97.15) +; 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) +; 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! +;* 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). +;* Don't scroll down if you get scared easily. + +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| _____ |_____/ |_____| +;_______________________________________________________________________________ + +; 97% = DONE + +; 2% * misc (bugs, &&&, pollish, &&, &) +; X score >9 dispay [15] +; * mem at worm #4 (still 12 bytes or so.. or more? or less?) +; * look at init-z in line routine again +; X sp modes not configurable [15] +; * team score +; * random pixel still occurs +; * levels: Wormage | Jonah? | 2 | 3 | 4 ; * LINK -; 1% * transmit game/level data -; Xfirst packet loss?? or vti onlyXXXXX -; X1/3 worms over linkXXXX -; Xsend new peas' positionsXXXXX +; 1% * fix transmit game/level data (?) +; * >Somehow do a lot of testing with 2 calcs< *sigh* ;100% = bugs fixed + levels done -; MAYBE: sound -; NO: coop +; * arrow to offscreen peas +; * multiple peas in sp level +;>110%: sound, startpos (?) +;>120%: coop (DON'T COUNT ON IT) -;----------------------------- -;----------------------------- -;------- W O R M Y --------- -;----------------------------- -;----------------------------- - -#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 readytext ;displays "prepare" before level starts -;#define invincible ;worms cannot die =) -;#define optdie ;in race games worms don't die when they run into each other - -#define cal call -#define psh push -#define dnz djnz +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #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 @@ -86,13 +111,24 @@ _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 +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl -;----------------------------- -;------- data storage ------- -;----------------------------- + #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 +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- permanent --- ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) worm2p = $A800 ;-ABFF (400) %10101O00 @@ -102,22 +138,22 @@ worm3 = $AC3E ;-AC59 (1F) worm4 = $AC5D ;-AC77 (1F) balls = $AC7C ;-ACFF (3x43d) SinCosTable = $AD00 ;-AE00 (4*40) - ;free $AE01 ;-AFFF (1FF) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AE05 (4+) (peas) +;free = $AE06 ;-AFFF (1FA) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - ;program $D748 ;-EFFF (186D+4A) +;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?!? -turn10 = $AE01 ; (1) (counter) -peaspos = $AE02 ;-AE05 (4) (peas) - -;MEM|8---9---A---B---C---D---E---F---| -; |..[------]||[]|......[-----]|[].| -; | SCREEN 2* 13 PRGM 4LV | +;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong +; |..[------]||[]|......[-----]|[].| ;if you still understand +; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary --- namelength = $BC00 ;(1) @menu datalink = $BC00 ;(8) @init @@ -126,36 +162,48 @@ DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif +lefttotalb = $AFFF +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 -;----------------------------- -;------- program start ------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ -.org _asm_exec_ram + .org %1101011101001000 -wormVhost = 095 -wormVclient = 195 - -start: - nop +start: ;turn back NOW! + nop ;and so it begins... jp Start - .db 1 - nop - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- 96% C14",0 + ld bc,$5242 + rst 10h + .dw WormIcon + ld d,a + ld c,a + ld d,d + ld c,l + ld e,c + jr nz,$+100 + ld a,c + jr nz,$+$55 + ld c,b + .dw 16713 + .db %1010010 + jr nz,$+47 + dec l + .db " 97% .15",0 WormIcon: - .db 8,2 - .db %00000000,%00111100 - .db %00000000,%01010010 - .db %00000000,%01100001 - .db %01100011,%10011001 - .db %10010100,%01101001 - .db %10011001,%00011001 - .db %01000010,%11000001 - .db %00111100,%00111110 + .db 8,2 + .db %00000000,%00111100 + .db %00000000,%01010010 + .db %00000000,%01100001 + .db %01100011,%10011001 + .db %10010100,%01101001 + .db %10011001,%00011001 + .db %01000010,%11000001 + .db %00111100,%00111110 levelhead = 'w' levelhead2 = 95 ;wormy levels header = "95" @@ -193,7 +241,7 @@ Start: ldir inc a ;ld a,$D4 ld i,a - im 2 + im 2 ;...it *does* work ;) cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start @@ -248,7 +296,7 @@ stringfound: inc ix _searchnext: cal _RAM_PAGE_7 - jr searchnext + jr searchnext loadgametype: psh de @@ -266,12 +314,26 @@ loadgametype: jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels ld ix,templevels-6 -levelselectmenu: +#else + ld ix,templevels-3 +#endif + cp (ix+3) ;1st=255 + jp z,ExitNoStats ;->no lvls + cp (ix+6) ;2nd=255 + jr z,loadlevel1 ;->1 lvl +levelselectmenu: ;load next page psh ix ;offset ld a,-2 ld (availevels),a @@ -288,7 +350,9 @@ levelselectmenu: ld hl,$0601 ;x=1 ld (_penCol),hl dispnextlevel: - ld a,(ix+3) + ld de,3 + add ix,de + ld a,(ix) ld b,a inc a ;cp 255 jr z,__levselect @@ -301,8 +365,6 @@ displevel: ld (hl),a ;y+6 cp 49 ;bottom of screen jr nc,_levselect - ld de,3 - add ix,de ld hl,availevels inc (hl) ld a,b ;(ix+0) @@ -312,8 +374,14 @@ displevel: cal _vputs jr dispnextlevel +loadlevel1: + psh ix + pop hl + ld b,-2 + jr loadlevel + readylevelfile: ;selected level at ahl -; ld hl,templevels-3 +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -375,7 +443,11 @@ levdescclearloop: cal _vputs jr levselectmenu+1 __levselect: +#ifdef intlevels ld ix,templevels-6 ;reset 2 1st page +#else + ld ix,templevels-3 +#endif _levselect: ld b,-2 ;level selected jr levselect @@ -408,12 +480,12 @@ loadlevel: cal _Get_Word_ahl ld (leveldataSize),de - ld d,8 ;counter + ld d,9 ;counter ld bc,datalevels cal loadgametype ld (hilvlposa),a ;singleplayer levels ld (hilvlposhl),hl - ld d,4 + ld d,5 cal loadgametype cal _SET_ABS_SRC_ADDR ;levelsstart @@ -448,15 +520,19 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ - ld hl,TrigPrecalc - ld de,SinCosTable - psh de - ld bc,65 - ldir +;--- trig tables --- + + ld hl,TrigPrecalc ;I believe this + ld de,SinCosTable ;is one of the few + psh de ;pieces of original + ld bc,65 ;Peaworm code still + ldir ;left intact.. dec hl ld b,63 MirrorSineWave: @@ -475,11 +551,15 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;---draw menu--- -DisplayMenu: ;---draw menu--- +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) @@ -493,11 +573,9 @@ DisplayMenu: ;---draw menu--- ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: - ld hl,Gametype - ld a,(hl) + ld a,(Gametype) dec a ;will be inced @changegame - and 7 - ld (hl),a + cal changedgame ld hl,changegame ;dispmenusets ;mainMenu psh hl ;jump here after ret ld hl,txtMenu @@ -533,19 +611,16 @@ dispmenuloop: ; ld b,0 ;b=menu# ret -;hr: ;draw horizontal line at hl -; ld b,16 -; jp menuinvloop - -hr: +hr: ;draw horizontal line at hl ld b,16 +; jp menuinvloop ;shorter but not good for pausescreen hrloop: ld (hl),-1 inc hl dnz hrloop ret -;--- menu loop --- +;--- options menu --- dispoptionmenu: ld hl,txtoMenu @@ -554,13 +629,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 @@ -574,7 +654,7 @@ dispomenusets: cal _vputs jr dispspeeddone dispspeed: - cal cshowA0 + cal cshowA dispspeeddone: ld hl,$363E @@ -584,7 +664,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 @@ -598,7 +678,7 @@ dispspeeddone: cal _vputs jr dispturndone dispturn: - cal cshowA0 ;turn speed + cal cshowA ;turn speed dispturndone: ld hl,$243E @@ -608,7 +688,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' @@ -760,7 +840,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu --- mainMenu: cal menupos @@ -776,6 +856,17 @@ select: ;2nd/enter dec a ;6th: controls jp z,changekeys jp LetsGetThisPartyOn ;otherwise + +changenrworms: + cal change4spOnly + ld a,(hl) ;hl=nrworms + inc a + cp 5 + jr nc,mainMenu ;may not be >4 +changednrworms: + ld (hl),a + jr _dispmenusets ;mainMenu + notselect cp K_EXIT jp z,ExitNoStats @@ -831,15 +922,6 @@ bchangecurworm: jr nz,changedcurworm ;save >0 jr mainMenu -changenrworms: - cal change4spOnly - ld a,(hl) ;hl=nrworms - inc a - cp 5 - jr nc,mainMenu ;may not be >4 -changednrworms: - ld (hl),a - jr _dispmenusets ;mainMenu changenrwormsInit: ld a,(Gametype) cp 3 @@ -879,7 +961,12 @@ changegame: jr z,changegame jr dispmenusets ;mainMenu changedgame: - and 7 ;mod 8 + cp 9 + jr c,changedgameok + sub 255-8 ;-1 -> 8 + jr nc,changedgameok + xor a ;9 -> 0 +changedgameok: ld (Gametype),a cal getnrlevels xor a @@ -942,7 +1029,7 @@ changekeys: cal getcustomkey ;right ; jr dispmenusets -;---display current settings--- +;--- display current settings --- dispmenusets: cal clrold @@ -988,7 +1075,7 @@ displink: or a ;gamesingle jr nz,displvlname ld a,(Level) - cal cshowA0 + cal cshowA00 jr lvldisped displvlname: cal _vputs @@ -1166,9 +1253,11 @@ nameentered: ld (ix+8),0 ;end mark jp DisplayMenu -;----------------------------- -;------- procs-n-stuff ------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ ubergetkey: halt ;woo hoo @@ -1199,7 +1288,7 @@ hlatlevel: ;d must be 0 add a,a ;nc add a,e add a,a ;8->2bytes - add a,24+1 ;go to datalevels + add a,28+1 ;go to datalevels ld e,a ;=de sbc hl,de ;datalevels cal _ldHLind ;ld hl,(hl) @@ -1255,10 +1344,13 @@ skipballs: skipflags: ld a,(Gametype) + cp gamerace + jr z,skiplaps cp gamectf jr nz,noflagstoskip inc hl inc hl +skiplaps: inc hl inc hl noflagstoskip: @@ -1296,25 +1388,57 @@ loadgamecar: ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state +setupworms: + ld hl,worm1set + ld de,worm1 + ld a,4 ;4x (all worms) +createwormsloop: + ex de,hl + ld bc,died ;0008 + add hl,bc +; ld b,0 + ld (hl),b ;died=0 + inc hl + ld (hl),b ;score=0 + inc hl + ld (hl),b ;score+1=0 + inc hl + ld (hl),2 ;delay=2 + inc hl + ld (hl),3 ;lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ld bc,18 + ldir ;copy 18 bytes + dec a ;loop + jr nz,createwormsloop + +OhMyGodItsALabel: ;pj34r my coding skillz cal loadgamecar - psh hl + psh hl ;datatype cal hlatlevel ex (sp),hl ;pop \ psh leveldata psh hl ;psh loadgamecar ld a,0 gameCar =$-1 rra ;and _datalink - jp nc,StartLevel ;&&&jr + jr nc,_StartLevel -;--------- link ------------ +;--- link --- + +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow @@ -1359,15 +1483,22 @@ setclient: ld hl,worm2+name ld b,9 cal sendstuff - pop hl - pop de + pop hl ;loadgamecar + pop de ;leveldata psh de - psh hl - ld b,168 + psh hl ;loadgamecar + ld b,8 + cal sendstuff + ld hl,gameCar + ld b,1 + cal sendstuff + ld hl,Gametype + ld b,1 cal sendstuff ex de,hl - ld b,8 + ld b,168 cal sendstuff +_StartLevel: jr StartLevel sendstuff: psh de @@ -1409,19 +1540,25 @@ sethost: ld hl,worm2+name ld b,9 cal recvstuff - pop hl - pop de - ld hl,templevels + pop hl ;loadgamecar + pop de ;leveldata + ld hl,templevels ;&&&&&&& ld de,datalink psh de - psh hl - ld b,168 + 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,8 + ld b,168 cal recvstuff -;-------- load level --------- +;--- load level --- StartLevel: pop hl ;loadgamecar @@ -1444,35 +1581,17 @@ StartLevel: inc hl ld l,(hl) ld h,0 + ld a,(gameCar) + rla + ld a,h ;(Left)=256 + jr nc,setscorelimit + ld a,l + ld l,h +setscorelimit: + ld (customleft),a cal _HLTIMES10 ;hl=10*(hl) ld (scorelimit),hl -setupworms: - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: - ex de,hl - ld bc,died ;8 - add hl,bc -; ld b,0 - ld (hl),b ;died=0 - inc hl - ld (hl),b ;score=0 - inc hl - ld (hl),b ;score+1=0 - inc hl - ld (hl),2 ;delay=2 - inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 - inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop - Nextlevel: cal _clrWindow pop hl ;begin of current level @@ -1495,8 +1614,25 @@ donextlevel: or a ;gamesingle psh af cal nz,skiplvltitle - ld de,Left - ldi + ld a,(hl) + and 127 + jr nz,setleft +customleft =$+1 + ld a,0 +setleft: + 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 customspeed =$-1 @@ -1575,8 +1711,11 @@ worminit: ld (hl),a ;y2 inc hl ld (hl),a ;x2 + inc hl + inc hl + ld (hl),a ;growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc pop bc ;<0 dnz worminit @@ -1586,7 +1725,7 @@ worminit: inc a ;ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level --- initlevel: ld a,(de) @@ -1684,7 +1823,7 @@ levelhasbeensetup: cal drawstuff -;--------- prepare ----------- +;--- prepare --- leveldone: psh hl ; >> levelp new @@ -1723,10 +1862,10 @@ maskline: #endif ld a,(gameCar) - and _datafood - jr z,nofood - ld ix,worm1 - cal NewPea + rla ;bit _bitmultpeas,a + cal c,multnewpea ;a=0 + rla ;bit _bitfood,a + cal nc,NewPea nofood: ld bc,(worm1+pos) cal DisplayField @@ -1737,9 +1876,11 @@ ReadyDelay: dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1830,9 +1971,11 @@ handleworms: inc (hl) ;0..nrworms-1 dnz handleworms -;----------------------------- -;---------- keys ------------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _______ __ __ _______ +; |____/ |______ \_/ |______ +; | \_ |______ | ______| +;_______________________________________________________________________________ HandleKeys: ld a,%10111111 @@ -1846,7 +1989,7 @@ CheckExit: jp c,GameLoop jp Exit ;jr? -;------- pause menu ------- +;--- pause menu --- disppausemenu: ld hl,txtpMenu @@ -1927,6 +2070,12 @@ donepausing: cal releasekeys jp GameLoop +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _ _ _______ ______ +; | ____ |_____| | | | |______ | | \ / |______ |_____/ +; |_____| | | | | | |______ _____ |_____| \/ |______ | \_ +;_______________________________________________________________________________ + Exit: cal releasekeys ld sp,0 ;pop all @@ -2016,7 +2165,7 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;---display worms--- +;--- display worms --- ld a,(nrworms) ld b,a @@ -2073,7 +2222,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 @@ -2144,7 +2294,8 @@ NotNewHigh: ld hl,highsave+2 cal _puts ld hl,(highsave) - cal showHL + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: @@ -2222,9 +2373,11 @@ iswinner: ld a,'*' jp _putc ;..then put * -;----------------------------- -;----------- worm ------------ -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ respawncheck: cp respawndelay-1 @@ -2246,6 +2399,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -2256,6 +2411,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2334,9 +2490,11 @@ inlink: ld l,c ret -;----------------------------- -;------- handle worm --------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2375,6 +2533,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2386,8 +2545,9 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif -;-------- move worm ---------- +;--- move worm --- Wormmove: psh bc ; >> pos @@ -2440,43 +2600,46 @@ GotFour: rl d jp nc,Drawworm -;--------- worm hit ---------- +;--- worm hit --- Hitworm: ld a,(gameCar) - ld h,a #ifdef optdie - and _datadie - cal z,checkhitotherworm +; if race - originally + ld h,a + cal checkhitotherworm ld a,h #endif - and _datamultpeas ;&&bit + bit _bitctfpeas,a jr nz,chkctfpeas - ld a,h - and _datafood - jp z,WormDead ;no food + 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 - cal NewPea + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: ld hl,Left - dec (hl) + dec (hl) ;dec left before display psh af ld e,10 cal IncScore pop af jp nz,Drawworm ;continue - ld a,(gameCar) - and _datafoodl - jp z,Drawworm ld a,(Gametype) or a jp nz,Exit ;stack restored @@ -2533,14 +2696,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 @@ -2559,8 +2720,37 @@ hitflag: ;correct pea hit 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) @@ -2580,6 +2770,7 @@ ChkWorm: cal _cphlde jr nz,nextotherwormbit ret ;z +#endif checkhitlapline: ld a,(peaspos) ;63 @@ -2608,38 +2799,7 @@ checklap: pop bc ret -#ifdef optdie -checkhitotherworm: - .db $dd,$7d ;ld a,lx - cp worm2&255 - psh ix - jr nz,chkworm2 ; ret nz - ld ix,worm1 - jr chkworm -chkworm2: - ld ix,worm2 - -chkworm: - ld h,(ix+tail+1) - ld l,(ix+tail) - ld e,(ix+head) - ld d,(ix+head+1) - cal ChkWorm - pop ix - ret z ;not hit - pop bc ;call -#endif -stopworm: - ld bc,0 -previouspos =$-2 - ld de,0 - ld (ix+pos),c - ld (ix+pos+1),b - ld (ix+pos2),e - ld (ix+pos2+1),d - ret - -;-------- draw worm ---------- +;--- draw worm --- Drawworm: ld c,(ix+pos) @@ -2665,10 +2825,14 @@ Drawworm: ld (ix+head),l ld (ix+head+1),h - ld a,(ix+grow) - dec a + ld l,(ix+grow) + ld h,(ix+grow+1) + dec hl + ld a,h + or l jr z,removetail - ld (ix+grow),a + ld (ix+grow),l + ld (ix+grow+1),h ret removetail: @@ -2681,6 +2845,13 @@ removetail: cal resbit ld (ix+tail),l ld (ix+tail+1),h + psh hl + cal res4pixels + pop hl + ld c,(hl) + inc hl + ld b,(hl) + jr set4pixels res4pixels: cal ResPixel @@ -2696,9 +2867,11 @@ ResPixel: ld (hl),a ret -;----------------------------- -;---------- ball ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ handlethoseneatlittleballs: ld hl,balls @@ -2791,9 +2964,11 @@ checkballhit: pop de ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ _______ _______ +; |_____] |_____/ | | | |______ +; | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ releasekeys: halt @@ -2827,7 +3002,7 @@ Seed =$+1 WormDead: #ifdef invincible jp stopworm -#else +#endif ld a,2 ld (flashtime),a ld (ix+delay),respawndelay @@ -2854,10 +3029,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) @@ -2880,6 +3054,35 @@ anyworm: ld a,$A7 ;exit@end of turn ld (CheckExit),a ;set exit state ret ;finish turn + +#ifdef optdie +checkhitotherworm: + .db $dd,$7d ;ld a,lx + cp worm2&255 + psh ix + jr nz,chkworm2 ;ret nz + ld ix,worm1 + jr chkworm +chkworm2: + ld ix,worm2 +chkworm: + ld h,(ix+tail+1) + ld l,(ix+tail) + ld e,(ix+head) + ld d,(ix+head+1) + cal ChkWorm + pop ix + ret z ;not hit + pop bc ;call +stopworm: + ld bc,0 +previouspos =$-2 + ld de,0 + ld (ix+pos),c + ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d + ret #endif CheckPea: ;@hl; destr:abcde @@ -2918,22 +3121,21 @@ tryDrawPea: ;hl=peapos;bc=dopea jr z,DrawPea ret -sendnewpeaoverlink: - ld a,(gameCar) - rra ;and _datalink - ret nc ;no link - ld a,(ix+left) - or a - jr z,receivenewpeaoverlink - ld c,l ;send pea's pos - cal Qsend - ld c,h - jp Qsend ;&&&possible jr -receivenewpeaoverlink: - cal Qrecv ;Crecv - ld l,c - cal Qrecv ;Crecv - ld h,c +multnewpea: + ld de,peaspos + ld a,(Left) + ld b,a +multpealoop: + psh bc + psh de + cal NewPea + pop de + ld hl,PeaY + ldi + ldi + pop bc + dnz multpealoop + ld a,-1 ret NewPea: @@ -2994,7 +3196,11 @@ nextbitok: dnz sprloopy ret -;----------- score ----------- +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ +; |______ | | | |_____/ |______ +; ______| |_____ |_____| | \_ |______ +;_______________________________________________________________________________ timematchscore: ;piece of crap checking whether you've already won in timematch @@ -3012,7 +3218,7 @@ chktimematchover: jr z,nneexxtt ;yourself cp (hl) ret nz ;someone else still alive - dec hl ;+delay + dec hl ;+del0ay dec hl ;+score+1 ld a,(hl) cp (ix+score+1) @@ -3052,19 +3258,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 @@ -3087,7 +3291,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: @@ -3140,15 +3345,19 @@ showstat: ;(multiplayer) cp gamedeathm jr z,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 @@ -3157,7 +3366,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 @@ -3170,24 +3379,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: @@ -3212,27 +3426,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 @@ -3247,11 +3440,20 @@ ldhld: savestr: .db "00000",0 -;----------------------------- +ldscoreinhl: + ld h,(ix+score+1) + ld l,(ix+score) + ret -DisplayField: - ld a,c - sub 29 +;_______________________________________________________________________________ +; ______ _____ _______ _____ _______ __ __ +; | \ | |______ |_____] | |_____| \_/ +; |_____/ __|__ ______| | |_____ | | | +;_______________________________________________________________________________ + +DisplayField: ;all done by Jonah Cohen iirc. (-scrolling is scary-) + ld a,c ;not the fastest routine outthere, but it does get the job done. + sub 29 ;if something doesn't work, I probably _did_ alter it ;) jr nc,NotMinYScroll xor a NotMinYScroll: @@ -3471,7 +3673,11 @@ ChunkRow: ld c,$37 ;scf ret -;----------- draw ------------ +;_______________________________________________________________________________ +; ______ ______ _______ _ _ _ +; | \ |_____/ |_____| | | | +; |_____/ | \_ | | |__|__| +;_______________________________________________________________________________ ;--- pixel --- @@ -3520,7 +3726,7 @@ FindPixel: ;(b,c) to hl:a FP_Bit =$+1 set 0,a - psh de ;&&& + psh de ;&&& C`MON! THIS IS UGLY! *hit myself* ld de,ScrBuffer add hl,de pop de @@ -3558,6 +3764,14 @@ 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. +;Nice comments, also. So here we go: Shiar's Circle Routine: +;(using the Bresenham method) + drawcircle: ;(d,e),h ;de=x,y; h=z ld c,h ;c=yy=z ld a,h @@ -3621,7 +3835,9 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl - ret + ret ;thats it + +;--- box --- drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3633,6 +3849,8 @@ boxloop: dnz boxloop ret +;--- fatline --- + drawfatline: cal drawline inc d @@ -3645,151 +3863,140 @@ drawfatline: dec h ; jp drawline -;LINE (d,e)-(h,l) -;destroyes a +;--- line --- + +;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it +;himself tho.) I did make a few optimizations and commented the thing. +;A nice routine (also Bresenham), but for Wormy not perfect since really +;large lines (>128 pixels in length or something) won't be flawless. drawline: ;(d,e)-(h,l) psh bc ;destr: a psh hl psh de - ld a,d - cp h - jr c,lineOrdered - ex de,hl -lineOrdered: + ld a,d ;a=d=x + cp h ;h=xx + jr c,lineXincs ;if x>xx + ex de,hl ;make x + ld c,a ;c=mask (always) + ld a,h ;a=xx + sub b ;xx-x + ld b,a ;b=deltax (always>0) + ld a,l ;a=yy + jr nz,lineexists ;deltax!=0 + cp e ;yy==y + jr nz,lineexists ;deltay!=0 + pop hl ; :