X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/ce8523d87fee545d546465ed795c2dd6f5dc63c2..9ed28d246aef107b01273e08b6594598a4e12fcb:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 8af33c2..0ff73a0 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,6 +1,6 @@ ; Title : Wormy -; Version : 95% (0.95.B09) -; Release Date : OOHHhhh... soon?!? +; Version : 96% (0.96.C21) +; Release Date : UUHHhhh... soon?!? ; Filename : wormy.86p (5kb) ; Author(s) : Shiar ; Email Address : wormy@shiar.org @@ -15,25 +15,19 @@ ;----------- TO-DO ----------- ;----------------------------- -; 95% = DONE +; 96% = DONE -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] +; * complete readme ; 1% * misc (pollish, bugs, &&&) -; 1% * long length save (level#6) -; * mem at worm #4 +; * mem at worm #4 (still 12 bytes or so.....) +; * fix line proc (+large circles) ; * 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 ;100% = bugs fixed + levels done -; MAYBE: sound -; NO: coop +;>110%: sound, startpos +;>120%: coop (DON'T COUNT ON IT) ;----------------------------- ;----------------------------- @@ -45,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 @@ -55,7 +50,6 @@ #include "asm86.h" #include "ti86asm.inc" - _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -102,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---| ; |..[------]||[]|......[-----]|[].| @@ -131,21 +125,30 @@ DispBuffer = $FC70 ;------- program start ------- ;----------------------------- -.org _asm_exec_ram - -wormVhost = 095 -wormVclient = 195 + .org %1101011101001000 start: nop jp Start - .db 1 - nop + 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 @@ -193,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 @@ -270,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 @@ -313,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 @@ -375,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 @@ -505,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 @@ -516,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 @@ -532,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 --- @@ -540,7 +559,7 @@ dispoptionmenu: ld hl,txtoMenu ld ix,posoMenu ;Back|Lives|Limit|Speed|Rotation|Growth - cal dispmenucommon + cal dispmenucommon_ dispomenusets: cal clrold @@ -1244,10 +1263,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: @@ -1293,8 +1315,35 @@ 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 @@ -1305,6 +1354,9 @@ gameCar =$-1 ;--------- link ------------ +wormVhost = 095 +wormVclient = 195 + linkmatch: cal _clrWindow ld c,wormVhost @@ -1348,14 +1400,20 @@ 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 jr StartLevel sendstuff: @@ -1398,16 +1456,22 @@ 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 --------- @@ -1436,32 +1500,6 @@ StartLevel: 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 @@ -1564,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 @@ -1828,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 @@ -2218,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 @@ -2228,6 +2288,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2347,6 +2408,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2358,6 +2420,7 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif ;-------- move worm ---------- @@ -2438,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) @@ -2580,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: @@ -2637,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: @@ -2653,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 @@ -2796,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) @@ -2832,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 @@ -2926,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) @@ -3566,103 +3683,118 @@ 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 ; :