X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/6276668ed583e87bfdb5273abaaabd1f0426b730..3d225e408bf05bd9c50959bda8ffd2eeef19e5fe:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 899e22e..576ac70 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,43 +1,40 @@ -;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ -; ÛÛÛß ÛÛÛÛÝ -; ÛÛÛ ßÛÛÛ ÞÛÛÜ -;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ -;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ -;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ -;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ -;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ -;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ -;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ -;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ -;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ -; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ -; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ -; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ -; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;___▄███________________________________________________________▄▄▄▄____________ +; ███▀ ████▌ +; ███ ▀███ ▐██▄ +;▐██ ▄███▄ ▄▄████▄▄ ▄████ ▄██▄ ▄██▄ ▐██ █████ +;██▌ ███████ ▄██████████ ███████ ████████████▄ ██ ███ ███ +;██ ██▀ ▀██ ▐██▀▀ ▀███ ███▀ ██▌ ██▀ ████ ▀██ ██▌ ▐██▌ ▐██ +;██ ██ ██ ██ ▄ ██▌ ▐██▌ ▐██ ██████ ██▌ ███ ███ ██ +;██ ██ ██ ██ ██ ▐██ ███ ██▌ ███▀ ▐██ ▀██ ███ ▐███ ██ +;██ ██▌ ▐██ ██ ██ ██ ██▌ ██▌▐██▌ ██▌ ██ ██████▀ ██ +;██ ▐██ ██▌ ▐██ ██ ██ ██ ██ ▐██ ██▌ ██▌ ▀███▀ ▐██ +;██▌ ██▄ ▄██ ██▌ ██ ██ ██▌ ██ ▐██▌ ▐██▌ ██▌ ██▌ +;▐██ █████ ▐██ ██▌ ▐██ ██▌ ██ ▀██▄▄██▀ ███ ▐██ +; ███ ███ ██▌ ▐██ ██▌ ███ ██▌ ▀████▀ ▐██ ███ +; ███▄ ▄█████▄ ▄███ ██▌ ███ ▐██▌ ██▌ ███▄▄ ▄███ +; ███████▀ ▀███████ ▐██▄▄███▌ ███ ▐██ ██████████████▌ +; ▀███▀ ▀██▀▀ ▀█████▀ ██ ██▌ ▀█████████▀ ;_______________________________________________________________________________ ; -; Version : 99% (0.99.34) -; Release Date : 2002 March 4 +; Version : 100% (1.00.36) +; Release Date : 2002 March 6 ; Author(s) : Shiar ; Email Address : wormy@shiar.org -; Web Page : www.shiar.org +; Web Page : http://shiar.nl +; License: : GNU General Public License version 3 ; Description : perfect Nibbles game with free movement, nine game ; modes, for 1-4 players, many levels and editor -; Where to get this game : wormy.shiar.org ; Other games by author(s) : Nemesis beta ; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 ; Jonah Cohen : helped writing worm -; Files : wormy.txt (9283) : 12345678901234567890123456789012 -; wormy.z80 (100k) : 515ad14b922572bdc8a96e780b8b24ca -; wormy.86g (8867) : efef32a8c541b4585087f55deb31f51d ;_______________________________________________________________________________ ;--- notes --------------------------------------------------------------------- ; * Game README is wormy.txt -; * Use for LEARNING practises ONLY! -; * Don't _ever_ release altered code w/o permission! -; * Give me credits when you use any of this stuff +; * All code under the GPL version 3 +; * You may alter and redistribute (parts of) this code +; but only under the same license; credits would be appreciated ; * I'm not responsible for any damage this might cause, yada yada... ; * Although I've commented & labeled quite some stuff, due to ; crazy optimizations and weird coding, it may be harder to @@ -83,38 +80,27 @@ ; | |_____| ____ |_____/ |_____| ;_______________________________________________________________________________ -; 98% = PREVIOUS -; X [119] ED: new 53 file format with support for 128 objects instead of 32 -; X [119] LVL: episode #4: 10 hard sp levels (ordered XO-XO-XO-X) -; X [120] fixed greymask (and it now ands instead of ors) -; X [120] fixed growth set after death -; X [121] fixed linkplay (couldn't turn it on anymore..) -; X [121] LVL: Wormage + Wormage ][ (2x 10 sp levels) -; X [121] pea randomizer doesn't give x>128 -; X [121] mixed single-/multipea singleplayer levels (re)set correctly -; X [126] circles left|above 0,0 drawn correctly now! -; X [126] fixed multiple pages of levelfiles -; X [29] optimized a few more bytes (less empty bytes so prettier binary ;) -; X [225] ED: ctf/race level copy/move fix -; X [225] LVL: episode #1: 5 ctf+5 race; episode #3 removed (all in #1 now) -; X [225] add v2 id (yas2) -; X [227] redundant calls removed or moved -; X [227] fixed: ctf score increased by taking _any_ pea -; X [227] no more points in race for dieing on the second half -; X [227] no score decrease for dieing in race (no longer needed, see above) -; 99% = CURRENT -; X [34] two more jp to jr +; 99% = PREVIOUS ; X [34] freeze when no space left to place pea (break after 10k tries) ; X [34] wow another bit of code 'reniced' (easter egg or something :) -; X [34] highly improved randomizer (now _really_ with values >127) -; * replace 'left' at the change-control prompt (maybe!!!) -; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* -; * LVL: episode #5: 10 easy sp levels (do i _have_ to?) -; * LVL: Eric's Yumworms (ep#5?) -; * LVL: Free Bird -; * LVL: Jonah? -; * scorebar last digit (at 128-3) not displayed by _vputs -; 1% * fix any bugs that come up +; X [34] two more jp to jr +; X [34] highly improved randomizer (values >127 were rare) +; X [36] replace 'left' at the change-control prompt +; X [36] ED: fixed immediate exit at level preview when using enter key +; X [36] bouncies drawn after placing peas (causing overwrites) +; X [36] FIX: skip string length bytes when running from yas +; X [36] ED: pointer to ending message realigned +; X [36] LVL: end messages fixed in affected episodes +;100% = CURRENT +; * scorebar last digit (at 128-3) not displayed by _vputs :( +; * save last played level (in levelfile prolly) +; * automatically start players in multiplayer games after certain time +; * muliplayer bonuses/powerups (shrink, lives, stun, inverse, etc.) +; * levels with random pixels appearing during game +; * no borders (move players from one side to another) +; * hiding levels crashes?? (ishell 2.01 rom 1.6) +; * use selected player on main menu as first player in singleplayer games + ;--- future features ----------------------------------------------------------- @@ -122,7 +108,7 @@ ; ; * correct team winners ; * level compression -; * ubersized bouncies ;) +; * ubersized bouncies (sprites) ; * arrow to offscreen peas ; * w00t AI ; * sound @@ -184,7 +170,7 @@ _OP1TOOP6 = $4263 #define spprotect ;options not changable for singleplayer modes ;#define intlevels ;-internal levels ;-to become invincible, define the magic word :D -#define w00t + levelhead = 'w' levelhead2 = 97 ;wormy levels header = "0" @@ -248,16 +234,16 @@ pos2 = 4 ;level grow = 6 ;level died = 8 ;game: score = 9 -delay = 11 +wdelay = 11 lives = 12 head = 13 - ; Ú15B (wormNset) -tail = 15 ; |also@next level -storepos = 17 ; | -reserv = 18 ; |loop (race:lap|ctf:pea) -left = 19 ; | -right = 20 ; | -name = 21 ; |_ + ; ┌15B (wormNset) +tail = 15 ; │also@next level +storepos = 17 ; │ +reserv = 18 ; │loop (race:lap|ctf:pea) +wleft = 19 ; │ +wright = 20 ; │ +name = 21 ; │_ wormsize = 30 ;^mark^ @@ -271,7 +257,7 @@ wormsize = 30 ;^mark^ start: ;turn back NOW! nop ;and so it begins... - jp Start + jp codestart #ifndef id2 ld bc,$5242 rst 10h @@ -297,17 +283,17 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 99% .34",0 + .db " v1.00.36",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 ;Rkaydees' icon: + .db %00000000,%00111100 ; XX + .db %00000000,%01010010 ; XXX + .db %00000000,%01100001 ; XX + .db %01100011,%10011001 ; XX + .db %10010100,%01101001 ; XX + .db %10011001,%00011001 ; XX + .db %01000010,%11000001 ; X XX + .db %00111100,%00111110 ; XXXX #ifdef id2 WormData: .db 1 @@ -327,14 +313,15 @@ yasexec: rst 10h ex de,hl ld a,b + cal _AHL_PLUS_2_PG3 ;skip past length bytes cal skiptitle ;title (plus size+header <- all non-0) ; cal skiptitle ;description jp leveldataAHL-3 yasdetect: - cal _AHL_PLUS_2_PG3 ;skip past length bytes + cal _AHL_PLUS_2_PG3 ;skip past length bytes cal _Get_Word_ahl ld hl,levelhead+(levelhead2*256) - call _cphlde + cal _cphlde ret z scf ret @@ -369,7 +356,7 @@ int_end: ;--- search levels ------------------------------------------------------------- -Start: +codestart: cal _runindicoff cal _flushallmenus @@ -878,30 +865,30 @@ notoselect jr nz,optionMenu seloright: - dec a + dec a ;Lives jr z,changelives - dec a + dec a ;Limit jr z,changelimit - dec a + dec a ;Speed jr z,changespeed - dec a + dec a ;Rotation jr z,changeturn - dec a + dec a ;Growth jr z,changegrowth - + ;Back seloleft: ld a,b - dec a + dec a ;Lives jr z,bchangelives - dec a + dec a ;Limit jr z,bchangelimit - dec a + dec a ;Speed jr z,bchangespeed - dec a + dec a ;Rotation jr z,bchangeturn - dec a + dec a ;Growth jr z,bchangegrowth -_optionMenu: +_optionMenu: ;Back jr optionMenu changelives: @@ -1030,7 +1017,7 @@ notselect cp K_EXIT jp z,ExitNoStats cp K_MORE - jp z,Start + jp z,codestart psh af cal menupos cal loadgamecar @@ -1043,15 +1030,15 @@ notselect jr nz,mainMenu selright: - or a + or a ;Mode jr z,changegame - dec a + dec a ;Level jr z,changelevel - dec a + dec a ;Link jr z,changelink - dec a + dec a ;Worms jr z,changenrworms -; dec a +; dec a ;worm# ; jr z,changecurworm changecurworm: @@ -1064,15 +1051,15 @@ changecurworm: selleft: ld a,b - or a + or a ;Mode jr z,bchangegame - dec a + dec a ;Level jr z,bchangelevel - dec a + dec a ;Link jr z,bchangelink - dec a + dec a ;Worms jr z,bchangenrworms -; dec a +; dec a ;worm# ; jr z,bchangecurworm bchangecurworm: @@ -1172,9 +1159,9 @@ waitcustomkey: or a jr z,waitcustomkey cp K_EXIT - ret z + ret z ;cancel cp K_MORE - jr z,waitcustomkey + jr z,waitcustomkey ;ignore ld (ix),a ret @@ -1182,6 +1169,8 @@ changekeys: cal getwormname ld hl,txtKleft cal getcustomkey ;left + ld a,93 + ld (_penCol),a cal getcustomkey ;right ; jr dispmenusets @@ -1391,15 +1380,15 @@ continue: cal releasekeys jr enternameloop -chartable: ;("!@#$%,0" also used in _D_HL_DECI) - .db ".<>!" ;down|L|R|up|-|-|-|- +chartable: + .db ".<>!" ;down|L|R|up|-|-|-|-|[enter] .db "w00t!" ;(makes code look way better) - .db "XTOJE0",-2 ;enter|+|-|*|/|^|clear|- - .db " WSNID9",-3 ;(-)|3|6|9|)|tan|custom|- - .db "ZVRMHC8",-4 ;.|2|5|8|(|cos|prgm|del - .db "YUQLGB7#" ;0|1|4|7|ee|sin|table|xvar - .db $D9,"-PKFA6'" ;on|sto|,|x2|ln|log|graph|alpha - .db "54321*",-5,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more + .db "XTOJE0",'w' ;+|-|*|/|^|clear|- w + .db " WSNID9",$F8 ;(-)|3|6|9|)|tan|custom|- o + .db "ZVRMHC8",$A7 ;.|2|5|8|(|cos|prgm|[del] o + .db "YUQLGB7#",$C2 ;0|1|4|7|ee|sin|table|xvar|[on] t + .db "-PKFA6'" ;sto|,|x2|ln|log|graph|alpha + .db "54321*",$AE,$D0 ;F5|F4|F3|F2|F1|2nd|[exit]|more nameentered: ;d=0 pop ix ;stringbegin @@ -1551,7 +1540,7 @@ createwormsloop: ld (hl),b ;+score+1=0 inc hl ld c,2 - ld (hl),c ;+delay=2 + ld (hl),c ;+wdelay=2 inc hl ld (hl),3 ;+lives=x wormbeglives =$-1 @@ -1601,11 +1590,11 @@ client: ; 2 = link = 0 + link (name1) ; 3 = worm #2 = #2 + local(name2) ; 4 = link = 0 + link (name2) - ld e,worm3+left&255 + ld e,worm3+wleft&255 cal moveworm2 ;3=2 ld l,worm1+name&255 cal sendworm - ld l,worm2+left&255 + ld l,worm2+wleft&255 cal linkworm ;worm2+4 over link pop hl ;loadgamecar pop de ;leveldata @@ -1634,21 +1623,21 @@ linkerror: ;--- set/send worms ------------------------------------------------------------ moveworm2: - ld hl,worm2+left -moveworm: ;hl=wormN+left + ld hl,worm2+wleft +moveworm: ;hl=wormN+wleft ld d,worm1/256 ld bc,11 ldir ;keys+name worm(de) = worm(hl) ret -linkworm: ;hl=wormN+left - ld (hl),0 ;worm1|2+left +linkworm: ;hl=wormN+wleft + ld (hl),0 ;worm1|2+wleft inc hl inc hl ;+name ld b,9 cal recvstuff ld bc,worm3-worm1-11 ;+2 add hl,bc ;b=0 - ld (hl),b ;worm3|4+left + ld (hl),b ;worm3|4+wleft inc hl inc hl ;+name ld b,9 @@ -1673,12 +1662,12 @@ host: ; 2 = worm #1 = #1 + local(name1) ; 3 = link = 0 + link (name2) ; 4 = worm #2 = #2 + local(name2) - ld e,worm4+left&255 + ld e,worm4+wleft&255 cal moveworm2 ;4=2 - ld e,worm2+left&255 - ld hl,worm1+left + ld e,worm2+wleft&255 + ld hl,worm1+wleft cal moveworm ;2=1 - ld l,worm1+left&255 + ld l,worm1+wleft&255 cal linkworm ;worm1+3 over link ld l,worm2+name&255 cal sendworm @@ -1973,6 +1962,7 @@ levelhasbeensetup: leveldone: psh hl ; >> levelp new cal forceshowstats + cal handlethoseneatlittleballs ld a,(gamecar) rla ;and _dataPmult @@ -2028,7 +2018,7 @@ ReadyDelay: GameLoop: ld bc,(worm1+pos) ;camera worm #1 - ld a,(worm1+left) + ld a,(worm1+wleft) or a ;if #1 not over link jr nz,showfield ld bc,(worm2+pos) ;otherwise view from #2 @@ -2095,11 +2085,7 @@ nodispupdate: cal tryDrawPea ;pea#2 noctfpeas2draw: - - ld a,0 -nrballs =$-1 - or a - cal nz,handlethoseneatlittleballs + cal handlethoseneatlittleballs ld ix,worm1 ld a,1 @@ -2330,10 +2316,10 @@ displayWormStats: psh bc psh hl - ld bc,left-died - add hl,bc ;+left + ld bc,wleft-died + add hl,bc ;+wleft xor a - cp (hl) ;left=0 = link + cp (hl) ;wleft=0 = link jr nz,NoLinkIndic ld a,9 ld (_curCol),a @@ -2494,7 +2480,7 @@ hiscrposhl =$-2 hiscrposa =$+1 adc a,0 ;ahl=saveloc ret -savestr: ;hiscore (00AAA) _D_HL_DECI (00000) +savestr: ;hiscore (01ABC) _D_HL_DECI (01234) .db $BB,"w00t",0 iswinner: @@ -2576,10 +2562,10 @@ respawndue: ld a,h ;previous cp l ;changed? ret z - ld (ix+delay),a ;=0 + ld (ix+wdelay),a ;=0 ret saverespawncounter: - ld (ix+delay),a + ld (ix+wdelay),a jr inputcall chkkey: ;key=a @@ -2614,7 +2600,7 @@ inkeys: ;use jp not call! turnright =$-1 ld l,a notright: - ld a,(ix+right) + ld a,(ix+wright) cal chkkey ret nc ld a,l @@ -2623,7 +2609,7 @@ turnleft =$-1 ld l,a ret inputcall: - ld a,(ix+left) + ld a,(ix+wleft) or a jr z,inlink ;input by link cal inkeys ;input by keys @@ -2651,7 +2637,7 @@ HandleWorm: or a ret nz ;live limit alive: - ld a,(ix+delay) + ld a,(ix+wdelay) dec a jp nz,respawncheck @@ -2815,8 +2801,12 @@ ResPixel: ;_______________________________________________________________________________ handlethoseneatlittleballs: + ld a,0 +nrballs =$-1 + or a + ret z ;no bouncies to handle + ld b,a ;(nrballs) ld hl,balls - ld b,a ;a=(nrballs) handleballs psh bc psh hl @@ -3046,7 +3036,7 @@ wormset2grow: pop hl ;<