X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/9c15dcbc79a8671b0e7cae2db0761afba1ea9ce5..9ed28d246aef107b01273e08b6594598a4e12fcb:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 34e5d0b..0ff73a0 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,10 +1,9 @@ ; Title : Wormy -; Version : 95% -; Release Date : summer 2001 +; Version : 96% (0.96.C21) +; Release Date : UUHHhhh... soon?!? ; Filename : wormy.86p (5kb) ; Author(s) : Shiar -; Email Address : shiar0@hotmail.com -; ICQ UIN : #43840958 +; 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) @@ -16,24 +15,23 @@ ;----------- TO-DO ----------- ;----------------------------- -; 95% = DONE +; 96% = DONE -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] +; * complete readme ; 1% * misc (pollish, bugs, &&&) +; * mem at worm #4 (still 12 bytes or so.....) +; * fix line proc (+large circles) ; * LINK -; * fix first packet loss -; 1% * transmit game/level data -;;;1% * get g/o signal (l&l) working -; 2% * send new peas' positions +; 1% * fix transmit game/level data ;100% = bugs fixed + levels done +;>110%: sound, startpos +;>120%: coop (DON'T COUNT ON IT) + ;----------------------------- ;----------------------------- -;--------- W O R M --------- +;------- W O R M Y --------- ;----------------------------- ;----------------------------- @@ -41,6 +39,7 @@ #define readymask ;"greys" out the field before starting a level #define coolzgfx ;nice graphics for game over screen +;#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 @@ -48,11 +47,9 @@ #define cal call #define psh push #define dnz djnz -;#define halt nop #include "asm86.h" #include "ti86asm.inc" - _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -99,16 +96,16 @@ 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) worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) - -turn10 = $AE01 ; (1) (counter) -peaspos = $AE02 ;-AE05 (4) (peas) + ;can you believe i actually left $269 bytes of memory unused?!? ;MEM|8---9---A---B---C---D---E---F---| ; |..[------]||[]|......[-----]|[].| @@ -117,6 +114,7 @@ peaspos = $AE02 ;-AE05 (4) (peas) ;--- temporary namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else @@ -127,20 +125,30 @@ DispBuffer = $FC70 ;------- program start ------- ;----------------------------- -.org _asm_exec_ram - -wormVhost = 093 -wormVclient = 193 + .org %1101011101001000 start: nop - jp Start - .dw 1 + jp Start + ld bc,42 + .org $-1 ;3y3 M 1337! .dw WormTxt .dw WormIcon - WormTxt: - .db "WORMY by SHIAR -- beta 95%",0 + 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 " 96% C21",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -156,13 +164,13 @@ levelhead = 'w' levelhead2 = 95 ;wormy levels header = "95" int_handler: - ex af,af' - in a,($03) + ex af,af' + in a,($03) bit 3,a - jp z,$0039 + jp z,$0039 res 0,a out ($03),a - jp $0039 + jp $0039 int_end: Start: @@ -188,7 +196,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 @@ -265,7 +273,11 @@ searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels ld ix,templevels-6 +#else + ld ix,templevels-3 +#endif levelselectmenu: psh ix ;offset ld a,-2 @@ -276,9 +288,8 @@ levelselectmenu: ld hl,txtLevsel cal _vputs ;"< SELECT LEVELS >" ld hl,$FC00+(2*16) - cal hr - ld hl,$FC00+(10*16) - cal hr + ld b,16*9 + cal menuinvloop ld hl,$FC00+(56*16) cal hr ld hl,$0601 ;x=1 @@ -309,7 +320,7 @@ displevel: jr dispnextlevel 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 @@ -371,7 +382,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 @@ -380,18 +395,18 @@ levselectmenu: psh bc cal ubergetkey pop bc ;GET_KEY destr. b - cp K_UP - jr z,levup - dec a ;K_DOWN + dec a ;cp K_DOWN jr z,levdown - cp K_SECOND-1 - jr z,loadlevel + sub K_UP-1 + jr z,levup pop hl - cp K_RIGHT-1 + inc a ;cp K_RIGHT jp z,levelselectmenu - cp K_EXIT-1 + cp K_ENTER-K_RIGHT + jr z,loadlevel + sub K_EXIT-K_RIGHT jp z,ExitNoStats - cp K_ENTER-1 + inc a ;cp K_SECOND jr nz,levselectmenu ; jr z,loadlevel @@ -501,9 +516,10 @@ dispmainmenu: ;Mode|Level|Limit|Worms|worm #|controls ; jr dispmenucommon ;cal +dispmenucommon_: + ld b,36*16/4 dispmenucommon: ld de,$FD80 ;begin pos - ld b,36*16/3 xor a clroldmenuloop: ld (de),a @@ -512,13 +528,15 @@ clroldmenuloop: inc de ld (de),a inc de + ld (de),a + inc de dnz clroldmenuloop - ld b,6 + ld b,(ix) dispmenuloop: - ld d,(ix) + ld d,(ix+1) inc ix - ld e,(ix) + ld e,(ix+1) inc ix ld (_penCol),de cal _vputs @@ -528,7 +546,12 @@ dispmenuloop: hr: ;draw horizontal line at hl ld b,16 - jp menuinvloop +; jp menuinvloop ;shorter but not good for pausescreen +hrloop: + ld (hl),-1 + inc hl + dnz hrloop + ret ;--- menu loop --- @@ -536,7 +559,7 @@ dispoptionmenu: ld hl,txtoMenu ld ix,posoMenu ;Back|Lives|Limit|Speed|Rotation|Growth - cal dispmenucommon + cal dispmenucommon_ dispomenusets: cal clrold @@ -1151,7 +1174,9 @@ nameentered: ld (ix+8),0 ;end mark jp DisplayMenu -;--proc +;----------------------------- +;------- procs-n-stuff ------- +;----------------------------- ubergetkey: halt ;woo hoo @@ -1238,18 +1263,21 @@ 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: skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end inc hl inc hl @@ -1287,36 +1315,47 @@ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - cal loadgamecar - psh hl - ld (wormbeglives),a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - inc hl ;level +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 a,(hl) - ld (customspeed),a + ld (hl),b ;score=0 inc hl - ld a,(hl) - ld (growspeed),a + ld (hl),b ;score+1=0 inc hl - ld a,(hl) - ld (turnleft),a - ld (turnright),a ;more efficient + ld (hl),2 ;delay=2 inc hl - ld l,(hl) - ld h,0 - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),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 - pop hl ;loadgamecar +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype cal hlatlevel - - psh hl ;1st level - ld a,(gameCar) + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,0 +gameCar =$-1 rra ;and _datalink - jr nc,GameOver + jp nc,StartLevel ;&&&jr + +;--------- link ------------ + +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow @@ -1336,53 +1375,137 @@ linkmatch: host: ld c,wormVclient cal Qsend - ld a,$18 - jr multiplayer + jr sethost client: ld hl,txtReceive cal _puts - ld a,$E6 -multiplayer: - ld (SwapPos),a -; ld a,2 -; ld (nrworms),a - -;----------------------------- -;--------- game over --------- -;----------------------------- - -GameOver: - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: +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 + pop hl ;loadgamecar + pop de ;leveldata + psh de + psh hl ;loadgamecar + ld b,8 + cal sendstuff + ld hl,gameCar + ld b,1 + cal sendstuff + ld hl,Gametype + ld b,1 + cal sendstuff ex de,hl - ld bc,died ;8 - add hl,bc -; ld b,0 - ld (hl),b ;died=0 + ld b,168 + cal sendstuff + jr StartLevel +sendstuff: + psh de +sendstuffloop: + psh bc + ld c,(hl) inc hl - ld (hl),b ;score=0 + cal Qsend + pop bc + dnz sendstuffloop + pop de + ret +recvstuff: + psh de +recvstuffloop: + psh bc + cal Qrecv + ld (hl),c inc hl - ld (hl),b ;score+1=0 + pop bc + dnz recvstuffloop + pop de + ret +sethost: + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld de,worm3+left + ld hl,worm2+left + ldi ;keys worm#3 = worm#2 + ldi ;+right + xor a + ld (worm2+left),a ;worm 2+4.. + ld (worm4+left),a ;..over link + ld hl,worm1+name + ld b,9 + cal sendstuff + ld hl,worm2+name + ld b,9 + cal recvstuff + pop hl ;loadgamecar + pop de ;leveldata + ld hl,templevels ;&&&&&&& + ld de,datalink + psh de + psh hl ;loadgamecar + ld b,8 + cal recvstuff + ld hl,gameCar + ld b,1 + cal recvstuff + ld hl,Gametype + ld b,1 + cal recvstuff + ex de,hl + ld b,168 + cal recvstuff + +;-------- load level --------- + +StartLevel: + pop hl ;loadgamecar + ld a,(hl) + ld (wormbeglives),a + inc hl ;nrworms + ld a,(hl) + ld (nrworms),a + inc hl ;level inc hl - ld (hl),2 ;delay=2 + ld a,(hl) + ld (customspeed),a inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + ld a,(hl) + ld (growspeed),a inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient + inc hl + ld l,(hl) + ld h,0 + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl -StartLevel: +Nextlevel: cal _clrWindow pop hl ;begin of current level ld a,(hl) inc a ;=255? - jp nz,nextlevel + jp nz,donextlevel psh hl ld hl,Level @@ -1394,7 +1517,7 @@ StartLevel: psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: +donextlevel: ld a,(Gametype) or a ;gamesingle psh af @@ -1479,8 +1602,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 @@ -1492,6 +1618,7 @@ worminit: ;-------- draw level --------- +initlevel: ld a,(de) inc de sub 128 @@ -1587,8 +1714,9 @@ levelhasbeensetup: cal drawstuff -;----------------------------- +;--------- prepare ----------- +leveldone: psh hl ; >> levelp new cal forceshowstats @@ -1610,7 +1738,6 @@ maskline: dec c jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1625,54 +1752,6 @@ maskline: res 3,(iy+5) #endif - ld a,0 -gameCar =$-1 - rra ;and _datalink - jr nc,initfinished ;no link - xor a -SwapPos: ;$18 xx -> $E6 xx - ; jr xx -> and xx - jr sethost -setclient: - 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 - jr initfinished -sendstuff: - psh bc - ld c,(hl) - inc hl - psh hl - cal Qsend - pop hl - pop bc - dnz sendstuff - ret -recvstuff: - psh bc - psh hl - cal Qrecv - pop hl - ld (hl),c - inc hl - pop bc - dnz recvstuff - ret -sethost: - ld (worm2+left),a ;worm 2+4.. - ld (worm4+left),a ;..over link - ld hl,worm1+name - ld b,9 - cal sendstuff - ld hl,worm2+name - ld b,9 - cal recvstuff -initfinished: ld a,(gameCar) and _datafood jr z,nofood @@ -1790,76 +1869,93 @@ HandleKeys: out (1),a in a,(1) rla ;MORE? - jr c,CheckExit - ld bc,$0103 - out (c),b - halt ;pause/off - ld b,11 - out (c),b - + jr nc,disppausemenu CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop - jr Exit + jp Exit ;jr? -WormDead: -#ifdef invincible - jp stopworm -#else - ld a,2 - ld (flashtime),a - ld (ix+delay),respawndelay +;------- pause menu ------- -thislevel =$+1 - ld hl,0 - ld de,0 -handledworm =$-2 - add hl,de - add hl,de - add hl,de - ld a,(hl) - inc hl - ld (ix+heading),a - ld a,(hl) - ld (ix+pos),a ;y - inc hl - ld a,(hl) - ld (ix+pos+1),a ;x - xor a - ld (ix+pos2),a ;y2 - ld (ix+pos2+1),a ;x2 +disppausemenu: + ld hl,txtpMenu + ld ix,pospMenu +;Resume|Turn Off|Contrast|Exit|| + ld b,25*16/4 + cal dispmenucommon + ld hl,$FC00+$170 ;(*,23) + cal hr + ld hl,$FC00+$310 ;(*,49) + cal hr + cal menupos - inc (ix+died) - dec (ix+lives) +pauseMenu: + psh bc +pmenuwaitkey: + cal ubergetkey + or a + jr z,pmenuwaitkey + pop bc ;GET_KEY + ld d,b ;c=new b + cp K_UP + jr nz,pmenunotup + dec d +pmenunotup: + cp K_DOWN + jr nz,pmenunotdown + inc d +pmenunotdown: psh af - ld de,10 - ld a,(Gametype) - cp gamectf ;ctf no death penalty - cal nz,DecScore + cal menupos + ld a,d ;new pos + and 3 ;0-3 + ld b,a + cal menupos pop af - ret nz ;HandleWorm done - ld a,(wormbeglives) - or a ;0=no live limit - ret z ;don't end game - ld a,(gameCar) - and _datatime - jr z,anyworm ;quit at any worm's death - ld a,(nrworms) ;timematch: all worms must've died - ld b,a ;# of worms - ld hl,worm1+lives-(worm2-worm1) - ld de,worm2-worm1 - xor a ;check for 0 lives -checklives: - add hl,de ;next worm - cp (hl) ;lives==0? - ret nz ;any >0: don't exit - dnz checklives -anyworm: - ld a,$A7 ;exit@end of turn - ld (CheckExit),a ;set exit state - ret ;finish turn -#endif + cp K_ENTER + jr z,pselect + cp K_SECOND + jr nz,notpselect +pselect: + ld a,b + or a ;1: continue + jr z,donepausing + dec a ;2: off + jr z,turnoff + dec a ;3: contrast + jr z,pauseMenu + jr Exit ;4: exit +notpselect + cp K_EXIT + jr z,donepausing + ld hl,CONTRAST + sub K_LEFT + jr z,contrastdown + dec a ;K_RIGHT + jr nz,pauseMenu +contrastup: + inc (hl) + jr setcontrast +contrastdown: + dec (hl) +setcontrast: + ld a,(hl) + out (2),a + jr pauseMenu + +turnoff: + ld bc,$0103 + out (c),b + halt ;pause/off + ld b,11 + out (c),b + ld b,1 + jr pauseMenu + +donepausing: + cal releasekeys + jp GameLoop Exit: cal releasekeys @@ -2165,7 +2261,7 @@ 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) @@ -2180,6 +2276,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -2190,6 +2288,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2268,7 +2367,9 @@ inlink: ld l,c ret +;----------------------------- ;------- handle worm --------- +;----------------------------- HandleWorm: xor a @@ -2307,6 +2408,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2318,6 +2420,7 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif ;-------- move worm ---------- @@ -2398,6 +2501,9 @@ PeaX =$-1 add a,15 peagrowth =$-1 ld (ix+grow),a + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: cal NewPea ld hl,Left dec (hl) @@ -2427,7 +2533,7 @@ peagrowth =$-1 pop hl ; << call pop hl ; << call ld (ix+delay),2 - jp StartLevel + jp Nextlevel chkpeahit: ;bc=ownpos;hl=peapos (destr:ad) ld a,(sprsize) @@ -2540,37 +2646,6 @@ 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 ---------- Drawworm: @@ -2597,10 +2672,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: @@ -2613,6 +2692,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 @@ -2756,6 +2842,95 @@ Seed =$+1 add a,2 ret +WormDead: +#ifdef invincible + jp stopworm +#endif + ld a,2 + ld (flashtime),a + ld (ix+delay),respawndelay + +thislevel =$+1 + ld hl,0 + ld de,0 +handledworm =$-2 + add hl,de + add hl,de + add hl,de + ld a,(hl) + inc hl + ld (ix+heading),a + ld a,(hl) + ld (ix+pos),a ;y + inc hl + ld a,(hl) + ld (ix+pos+1),a ;x + xor a + ld (ix+pos2),a ;y2 + ld (ix+pos2+1),a ;x2 + + inc (ix+died) + dec (ix+lives) + psh af + ld de,10 + ld a,(Gametype) + cp gamectf ;ctf no death penalty + cal nz,DecScore + pop af + ret nz ;HandleWorm done + ld a,(wormbeglives) + or a ;0=no live limit + ret z ;don't end game + ld a,(gameCar) + and _datatime + jr z,anyworm ;quit at any worm's death + ld a,(nrworms) ;timematch: all worms must've died + ld b,a ;# of worms + ld hl,worm1+lives-(worm2-worm1) + ld de,worm2-worm1 + xor a ;check for 0 lives +checklives: + add hl,de ;next worm + cp (hl) ;lives==0? + ret nz ;any >0: don't exit + dnz checklives +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 ld c,l ld a,(sprsize) @@ -2792,24 +2967,6 @@ 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 - ret - NewPea: ld a,(FieldWidth) add a,127-4 @@ -2870,9 +3027,12 @@ nextbitok: ;----------- score ----------- -timematchscore: ;piece of crap checking whether you've already won in timematch +timematchscore: + ;piece of crap checking whether you've already won in timematch ld a,(nrworms) ld b,a ;# of worms + dec a + ret z ;singleplayer ld hl,worm1+lives ld de,worm2-worm1 ld a,(handledworm) @@ -2883,7 +3043,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) @@ -3523,152 +3683,132 @@ 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 ; :0 -;de==0 = timeout - cal linkok - ld a,0 ;losses so far -linklosses =$-1 - inc a ;and this is another one - ld (linklosses),a - pop de ;return from link - cp lossout ;quit if too many errors - ret c ;otherwise just continue -linkerr: - jp Exit -linkfine: - in a,(7) - and %11 - ret - ;---- SEND ---- -Csend: - ld b,32 -csendwait: - nop - dnz csendwait - cal Qsend - jr c,Csend - ret - -Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde +Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde --- nop \ nop - in a,(7) - and %11 ;both wires low = exit signal - jr z,linkerr ;error otherwise + cal linkfine + jr z,linkerr ;both wires low = exit signal ld b,8 ;bits to send sendloop: ld de,timeout @@ -3694,22 +3834,22 @@ sendfinish: ;---- RECV ---- -Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl --- +Crecv: ;--- receive 8 bits into A/C --- destr:abCde --- cal Qrecv ret nc ;return if all went ok jr Crecv ;and try again -Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde --- - in a,(7) - and %11 +Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abCde --- + cal linkfine jr z,linkerr ;both low = error, quit ld b,8 ;bits to receive recvloop: - ld de,timeout +; ld de,timeout recvwait: - cal checklink + cal linktest ;checklink cp %11 jr z,recvwait ;both high = nothing sent (yet) + ld de,timeout rra ;received bit in cf ld a,D0LD1H jr c,received ;lower white wire as well @@ -3727,6 +3867,41 @@ recvfinish: ld (linklosses),a ;reset number of losses ret +;---- COMMON ---- + +linkok: + ld a,D0HD1H + out (7),a ;raise both wires = link ok + ret + +checklink: ;load wires in A and check for timeout + dec de ;decrease timer + ld a,d + or e + jr z,linktimeout ;timeout if de==0 +linktest: + ld a,$BF + out (1),a ;select keys + in a,(1) ;input + bit 6,a ;exit key + jp z,Exit ;break! +linkfine: + in a,(7) + and %11 + ret +linktimeout: ;de==0 + cal linkok + ld a,0 ;losses so far +linklosses =$-1 + inc a ;and this is another one + ld (linklosses),a + pop de ;return from link + cp lossout ;quit if too many errors + ret c ;otherwise just continue +linkerr: + jp Exit + +#ifdef intlevels ;----------------------------- ;---------- levels ----------- @@ -3788,11 +3963,13 @@ LevelDefC: ;ctf .db 27,8,27,116 .db 0 +#endif + ;----------------------------- ;---------- data ------------- ;----------------------------- -wtPicture: +wtPicture: ;title .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000 @@ -3810,7 +3987,7 @@ wtPicture: .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011 -wtWormy: +wtWormy: ;g/o .db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000 .db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000 .db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000 @@ -3826,8 +4003,8 @@ txtMenu: .db "Mode",0 ;1st menu item .db "Link",0 ;... .db "Worms",0 .db "worm #",0 - .db 0 -posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936 +posMenu: .db 5 + .dw $2418,$231E,$2824,$1F2A,$1730 txtMenuR: .db "controls",0 txtoMenu: .db "Back",0 ;1st menu item .db "Lives",0 ;2nd @@ -3835,7 +4012,14 @@ txtoMenu: .db "Back",0 ;1st menu item .db "Speed",0 .db "Rotation",0 .db "Growth",0 -posoMenu: .dw $2618,$251E,$2524,$222A,$1A30,$1C36 +posoMenu: .db 6 + .dw $2618,$251E,$2524,$222A,$1A30,$1C36 +txtpMenu: .db "Resume",0 ;1st menu item + .db "Turn Off",0 ;2nd + .db "Contrast",$CF,5,0 ;... + .db "Exit",0 +pospMenu: .db 4 + .dw $3418,$331E,$2F24,$3A2A txtGame: .db "Singleplayer",0 txtGame1: .db "Peaworm",0 txtGame2: .db "Tron",0 @@ -3892,11 +4076,16 @@ txtposReady = 7 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 .dw LevelDefR,LevelDefC -nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults +nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults +#else +datalevels: .dw 0,0,0,0,0,0,0,0 +nrlevels: .dw 0,0,0,0 +#endif _datalink = %0000001 ;linkplay _datafoodl = %0000010 ;left=0 limit @@ -3946,11 +4135,13 @@ worm4set: .dw worm4p,worm4p worm4name: .db "JIM ",0 defhiscrpos: +#ifdef intlevels .db 0,0,"SHI" .db 0,0,"SHI" .db 0,0,"SHI" .db 0,0,"SHI" .db 0,0,"SHI" +#endif Gametype: .db 0 ;last gamemode @@ -3970,7 +4161,7 @@ head = 13 ;4B (head=tail) tail = 15 ;also@next level storepos = 17 reserv = 18 ;loop (race:lap|ctf:pea) -input = 19 +input = 19 ;---currently unused afaik--- left = 20 right = 21 name = 22 @@ -3980,49 +4171,19 @@ startdelay = 30 respawndelay = 30 maxnamelength = 8+1 -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db " wormy@shiar.org",0 - defspritesz = 4 defspriteimg: .db %01100000 .db %11110000 .db %11110000 .db %01100000 +#ifdef intlevels deflevels: .db "Internal Levels",0 - .db "by SHIAR -- still t" - .db "o be added...." ;,0 + .db "by Shiar" ;,0 .db 0,deflevels/256,deflevels&255 +#endif templevels: ;-----------------------------