X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/8804e9541b51585f5f9bb062568e34965a0a52e8..b7c19e0307594e398fe80f38ebdc974127f551c3:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 18efe0c..bd08056 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,49 +1,81 @@ -;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ -; ÛÛÛß ÛÛÛÛÝ -; ÛÛÛ ßÛÛÛ ÞÛÛÜ -;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ -;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ -;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ -;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ -;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ -;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ -;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ -;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ -;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ -; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ -; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ -; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ -; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;___▄███________________________________________________________▄▄▄▄____________ +; ███▀ ████▌ +; ███ ▀███ ▐██▄ +;▐██ ▄███▄ ▄▄████▄▄ ▄████ ▄██▄ ▄██▄ ▐██ █████ +;██▌ ███████ ▄██████████ ███████ ████████████▄ ██ ███ ███ +;██ ██▀ ▀██ ▐██▀▀ ▀███ ███▀ ██▌ ██▀ ████ ▀██ ██▌ ▐██▌ ▐██ +;██ ██ ██ ██ ▄ ██▌ ▐██▌ ▐██ ██████ ██▌ ███ ███ ██ +;██ ██ ██ ██ ██ ▐██ ███ ██▌ ███▀ ▐██ ▀██ ███ ▐███ ██ +;██ ██▌ ▐██ ██ ██ ██ ██▌ ██▌▐██▌ ██▌ ██ ██████▀ ██ +;██ ▐██ ██▌ ▐██ ██ ██ ██ ██ ▐██ ██▌ ██▌ ▀███▀ ▐██ +;██▌ ██▄ ▄██ ██▌ ██ ██ ██▌ ██ ▐██▌ ▐██▌ ██▌ ██▌ +;▐██ █████ ▐██ ██▌ ▐██ ██▌ ██ ▀██▄▄██▀ ███ ▐██ +; ███ ███ ██▌ ▐██ ██▌ ███ ██▌ ▀████▀ ▐██ ███ +; ███▄ ▄█████▄ ▄███ ██▌ ███ ▐██▌ ██▌ ███▄▄ ▄███ +; ███████▀ ▀███████ ▐██▄▄███▌ ███ ▐██ ██████████████▌ +; ▀███▀ ▀██▀▀ ▀█████▀ ██ ██▌ ▀█████████▀ ;_______________________________________________________________________________ ; -; Version : 97% (0.97.116) -; Release Date : 2002 January 16 +; Version : 100% (1.00.36) +; Release Date : 2002 March 6 ; Author(s) : Shiar ; Email Address : wormy@shiar.org ; Web Page : www.shiar.org -; Description : perfect Nibbles game with free movement, nine -; game modes, for 1-4 players -; Where to get this game : www.shiar.org +; 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.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca -; wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d +; Files : wormy.txt (9283) : ed15e942a99b40e5a584c597cb13df46 +; wormy.z80 (100k) : 977109a7d25f3227fe817edbcc36ad9a +; wormy.86g (8914) : fbff7c36687c1e7e3113c29069021718 ;_______________________________________________________________________________ -;--- notes --- - -; * Use for LEARNING practises ONLY! -; Don't _ever_ release altered code w/o permission! -; Please notify me of using code, and give me credits! -; * 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). -; * Also read wormy.txt please, thank you -; * Don't scroll down if you get scared easily. +;--- 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 +; * 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 +; understand than the average blob of code. This is probably _not_ +; the best source to learn z80 from. w00t the Shyer Way (tm). +; * Email me. If you've got suggestions|patches|questions: tell me. +; * Don't scroll down if you get scared easily. + +;--- index --------------------------------------------------------------------- + +; * TO_DO : future features +; * #INCLUDE +; * STORAGE : permanent; temporary; layout +; * PROG_START : search levels +; * LEV_SELECT +; * MORE_INIT : trig tables +; * MAIN_MENU : draw menu; options menu; main menu; display +; current settings; handle menukeys; change name +; * MISC_PROCS +; * START_GAME : link; client; set/send worms; host; load game; +; draw level; prepare +; * GAME_LOOP +; * KEYS : pause menu +; * GAME_OVER : who won?; display worms; quit +; * WORM_STUFF +; * WORM_ALIVE : move worm; draw worm +; * BOUNCYBALL +; * WORMY_HIT : multifood; ctf; main; foodmatch|SP; take pea; +; misc +; * PROCS +; * SCORE +; * DISPLAY +; * DRAW : pixel; findpixel; objects; circle; box; +; fatline; line +; * LINK! : multiple bytes; foo; send; recv; common +; * INT_LEVELS +; * DATA : graphics; menus; text; foo; game settings +; * THAT'S_ALL ;_______________________________________________________________________________ ; _______ _____ ______ _____ @@ -51,60 +83,41 @@ ; | |_____| ____ |_____/ |_____| ;_______________________________________________________________________________ -; 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 -; X [19A] team score! -; X [19A] autogrowth doesn't always work -> init (turn) -; X [111] ED: disabled objects counted causing CRASH when writing hiscore! -; X [111] LINK: init+multiple pea transmit seems to work.. -; X [111] LINK: host/client swapped (host now sends level config) -; X [111] LINK: optimize transmit (most initcode same for client+host) -; X [113] menu limit in multifm not x10 -; X [113] wormhit procedure seperate (called now) -; X [114] LINK: peas sent again :P -; X [114] internal level check and sprite storage removed -; X [115] layout data stuff at bottom -; X [115] ED: init place bar fixed -; X [115] ED: keys also usable together with mouse -; X [115] ED: improved version handling -; X [115] LINK: receive message not needed anymore afaik -; X [115A] $D8 used for spacing at g/o screen. i rule B) -; X [115A] exit at g/o goes back to menu -; X [115A] more in menu lets you reselect the levelfile -; X [115A] LINK: fixed waiting mode (minor display problem) -; X [116] incs at skiplevels effectively replaced by add (-4 bytes) -; X [116] another 2 bytes shaved off -; X [116] LINK: received gamemode now displayed correctly at g/o -; X [116] gamecar right after gametype saves about 20 bytes -; X [116] LINK: minimize sent data -; X [116] remove +input in worm storage -; X [116] head position init uses same data as tail (-4 bytes) -; * word-value display storage in chartable hole?? -; 1% * misc (bugs, &&&, pollish, &&, &) -; * look at init-z in line routine again -; * rare pea|wall overwrite <- apply stopworm fix? -; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* -; * 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? +; 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] 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 ----------------------------------------------------------- + +;just a maybe-list; NO guarantees! ; -;100% = bugs fixed + levels done -; * correct team winners -; * arrow to offscreen peas -;110% * sound -; * startpos -;120% * coop (DON'T COUNT ON IT) -; * pause in linkplay +; * correct team winners +; * level compression +; * ubersized bouncies (sprites) +; * arrow to offscreen peas +; * w00t AI +; * sound +; * startpos +; * pause in linkplay +; * coop (DON'T COUNT ON IT) ;_______________________________________________________________________________ ; _/_/_____ __ _ _______ _ _ ______ _______ @@ -131,11 +144,11 @@ _MOV4B = $429B ;4x ld (de),(hl) _MOV5B = $4297 ;5x ld (de),(hl) _mov9b = $4283 ;9x ld (de),(hl) _ldHLind = $4010 ;ld hl,(hl) -_swapt_ = $45F3 ;ex_ahl_bde +_swapt_ = $45F3 ;ex ahl,bde (doesn't work?) _Get_Word_ahl = $521D ;ld de,(ahl) _Set_Word_ahl = $5221 ;ld (ahl),de -_INC_PTR_AHL = $4637 ;ahl=ahl+1 -_AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2 +_INC_PTR_AHL = $4637 ;inc ahl +_AHL_PLUS_2_PG3 = $4C3F ;add ahl,2 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl @@ -150,15 +163,19 @@ _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 +_OP1TOOP6 = $4263 - #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 id2 ;yas2 level identifier - this'll add (65) bytes + #define buffer ;use display buffer, otherwise write directly to screen (11) + #define readymask ;"greys" out the field before starting a level (20) +;#define readytext ;-displays "prepare" before level starts (42) + #define coolzgfx ;nice graphics for game over screen (98) #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 + ;-to become invincible, define the magic word :D + +levelhead = 'w' +levelhead2 = 97 ;wormy levels header = "0" ;_______________________________________________________________________________ ; _______ _______ _____ ______ _______ ______ _______ @@ -166,7 +183,7 @@ _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl ; ______| | |_____| | \_ | | |_____| |______ ;_______________________________________________________________________________ -;--- permanent --- +;--- permanent ----------------------------------------------------------------- ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) worm4p = $A400 ;-A5FF (200) %101001O0 @@ -179,7 +196,7 @@ worm3 = $AD3D ;-AD5A (1E) worm4 = $AD5B ;-AD78 (1E) balls = $AD79 ;-AE00 (<=3x2D) (bb<=45) turn10 = $AE01 ;-AE01 (1) (counter) -peaspos = $AE02 ;-AF05 (4-260) (peas) +peaspos = $AE02 ;-AF05 (4-104) (peas) ;free = $AF06 ;-AFFF (F9) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 @@ -197,7 +214,7 @@ defspr = $F078 ;-F07F (8) ; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < ; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary --- +;--- temporary ----------------------------------------------------------------- namelength = $BC00 ;(1) @menu datalink = $BC00 ;(8) @init @@ -211,25 +228,25 @@ lefttotalb = $BF91 ;(1) @game drawctfpea1 = peaspos+4 drawctfpea2 = peaspos+6 -;--- layout --- +;--- layout -------------------------------------------------------------------- -;(wormN) set: +;(wormN) offs: set: heading = 0 ;level* pos = 2 ;level* 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^ @@ -243,10 +260,19 @@ wormsize = 30 ;^mark^ start: ;turn back NOW! nop ;and so it begins... - jp Start + jp codestart +#ifndef id2 ld bc,$5242 rst 10h .dw WormIcon +#else + ld (bc),a + nop + ld d,h + rst 10h + .dw WormIcon + .dw WormData +#endif ld d,a ld c,a ld d,d @@ -260,20 +286,66 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .116",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 - -levelhead = 'w' -levelhead2 = 97 ;wormy levels header = "97" + .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 + .dw wormlevel +wormlevel: + .db 4 ;priority + .db 12 ;string + .db "wor" ;description + .dw yasexec ;execution routine + .dw yascomment-yasdetect + .dw yasdetect-$-1 ;detection routine + .dw yasicon-yascomment + .dw yascomment-$-1 ;comment routine + .dw yasdataend-yasicon + .dw yasicon-$-1 ;icon routine +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 _Get_Word_ahl + ld hl,levelhead+(levelhead2*256) + cal _cphlde + ret z + scf + ret +yascomment: + inc hl + inc hl ;skip header + ret +yasicon: + ld hl,$F400+levelicon-yasicon + ld bc,6+(256*1) + or a + ret +levelicon: + .db %00011100 ;..XXX... ...XXX.. + .db %00011110 ;.X...X.. ...XXXX. + .db %00000011 ;.X..X... ......XX + .db %10000001 ;X..X..XX X......X + .db %01011011 ;X..X..XX .X.XX.XX + .db %01101110 ;X...XXX. .XX.XXX. +yasdataend: +#endif int_handler: ex af,af' @@ -285,32 +357,12 @@ int_handler: jp $0039 int_end: -Start: - ld (SpSave),sp +;--- search levels ------------------------------------------------------------- + +codestart: cal _runindicoff cal _flushallmenus - im 1 - ld a,$D4 - ld h,a - ld l,0 ;ld hl,$D400 - ld d,a - ld e,1 ;ld de,$D401 - ld b,e - ld c,l ;ld bc,$0100 - dec a ;ld a,$D3 - ld (hl),a - ldir - ld hl,int_handler - ld d,a - ld e,a ;ld de,$D3D3 - ld bc,int_end-int_handler - ldir - inc a ;ld a,$D4 - ld i,a - im 2 ;...it *does* work ;) - -restart: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -350,15 +402,12 @@ stringfound: cp e jr nz,_searchnext ;not worm ld a,levelhead2 - cp d + cp d ;=0 jr nz,_searchnext - inc ix ;save level's ahl - ld a,h - ld (ix),a - inc ix - ld a,l - ld (ix),a - inc ix + ld (ix+1),h ;save level's ahl + ld (ix+2),l + ld de,3 ;&&&d=0 + add ix,de _searchnext: cal _RAM_PAGE_7 jr searchnext @@ -412,16 +461,21 @@ levelselectmenu: ;load next page cal menuinvloop ld hl,$FC00+$380 ;(*,56) cal hr - ld hl,$0601 ;x=1 + ld hl,$0C01 ;x=1 ld (_penCol),hl dispnextlevel: ld de,3 - add ix,de + add ix,de ;goto next ld a,(ix) - ld b,a + ld h,(ix+1) + ld l,(ix+2) + cal _load_ram_ahl ;hl=ahl + cal _vputs + ld hl,availevels + inc (hl) + ld a,(ix+3) ;next inc a ;cp 255 jr z,__levselect -displevel: ld hl,_penCol ld (hl),$01 ;x=1 inc hl @@ -430,13 +484,6 @@ displevel: ld (hl),a ;y+6 cp 49 ;bottom of screen jr nc,_levselect - ld hl,availevels - inc (hl) - ld a,b ;(ix+0) - ld h,(ix+1) - ld l,(ix+2) ;ahl=(ix) - cal _load_ram_ahl ;hl=ahl - cal _vputs jr dispnextlevel loadlevel1: @@ -506,7 +553,7 @@ levdescclearloop: cp d ;de>$FFFF (offscreen) jr nz,levdescclearloop cal _vputs - jr levselectmenu+1 + jr levselectmenuloop+1 __levselect: #ifdef intlevels ld ix,templevels-6 ;reset 2 1st page @@ -516,7 +563,7 @@ __levselect: _levselect: ld b,-2 ;level selected jr levselect -levselectmenu: +levselectmenuloop: psh hl psh bc cal ubergetkey @@ -533,7 +580,7 @@ levselectmenu: sub K_EXIT-K_RIGHT jp z,ExitNoStats inc a ;cp K_SECOND - jr nz,levselectmenu + jr nz,levselectmenuloop ; jr z,loadlevel loadlevel: @@ -543,7 +590,7 @@ loadlevel: jr z,levelloaded #endif cal skiptitle ;skip description - +leveldataAHL: cal _Get_Word_ahl ld (leveldataSize),de @@ -575,6 +622,36 @@ leveldataSize =$-2 levelloaded: cal _RAM_PAGE_1 +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ + +; cal _runindicoff ;this is after level selection (run from yas1 or restart) +; cal _flushallmenus ;so this stuff should already be done earlier or by yas + ld (SpSave),sp + + im 1 + ld a,$D4 + ld h,a + ld l,0 ;ld hl,$D400 + ld d,a + ld e,1 ;ld de,$D401 + ld b,e + ld c,l ;ld bc,$0100 + dec a ;ld a,$D3 + ld (hl),a + ldir + ld hl,int_handler + ld d,a + ld e,a ;ld de,$D3D3 + ld bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 ;...it *does* work ;) + res 2,(iy+13) ;appAutoScroll ld a,r ld (Seed),a @@ -587,13 +664,7 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;_______________________________________________________________________________ -; _______ _____ ______ _______ _____ __ _ _____ _______ -; | | | | | |_____/ |______ | | \ | | | -; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | -;_______________________________________________________________________________ - -;--- trig tables --- +;--- trig tables --------------------------------------------------------------- ld hl,trigtable ;I believe this ld de,SinCosTable ;is one of the few @@ -624,14 +695,25 @@ NegativeSineWave: ; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| ;_______________________________________________________________________________ -;---draw menu--- +;--- draw menu ----------------------------------------------------------------- DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) ld hl,wtPicture - ld bc,16*16 + ld a,3 +optimize__w00t: ;may look like crap, but actually saves 3 bytes! + ldi + ld bc,6 + ex de,hl + add hl,bc + ex de,hl ;add de,6 + ld c,16-7 ;=bc + ldir + dec a + jr nz,optimize__w00t + ld c,13*16 ;=bc ldir ld hl,$FC00+$010 ;(*,01) cal hr @@ -656,14 +738,11 @@ dispmenucommon: ld de,$FD80 ;begin pos xor a clroldmenuloop: + ld c,4 ld (de),a inc de - ld (de),a - inc de - ld (de),a - inc de - ld (de),a - inc de + dec c + jr nz,clroldmenuloop+2 dnz clroldmenuloop ld b,(ix) @@ -687,7 +766,7 @@ hrloop: dnz hrloop ret -;--- options menu --- +;--- options menu -------------------------------------------------------------- dispoptionmenu: ld hl,txtoMenu @@ -699,7 +778,7 @@ dispomenusets: #ifdef spprotect ld a,(gamecar) and _datasingl - jp nz,LetsGetThisPartyOn + jp nz,LetsGetThisPartyOn ;SP -> start game #endif cal clrold @@ -789,30 +868,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: @@ -910,7 +989,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- main menu --- +;--- main menu ----------------------------------------------------------------- mainMenu: cal menupos @@ -941,7 +1020,7 @@ notselect cp K_EXIT jp z,ExitNoStats cp K_MORE - jp z,restart + jp z,codestart psh af cal menupos cal loadgamecar @@ -954,15 +1033,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: @@ -975,15 +1054,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: @@ -1083,9 +1162,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 @@ -1093,10 +1172,12 @@ changekeys: cal getwormname ld hl,txtKleft cal getcustomkey ;left + ld a,93 + ld (_penCol),a cal getcustomkey ;right ; jr dispmenusets -;--- display current settings --- +;--- display current settings -------------------------------------------------- dispmenusets: ld de,$183E @@ -1165,7 +1246,7 @@ curworm =$-1 cal _vputs jp mainMenu -;--- handle menukeys --- +;--- handle menukeys ----------------------------------------------------------- menucall: psh bc @@ -1226,8 +1307,7 @@ menunewok: ld b,a jr menupos -;--- change name --- -; of worm#(curworm) +;--- change name --------------------------------------------------------------- getwormname: ;of (curworm) ld a,(curworm) @@ -1264,9 +1344,8 @@ enternameloop: ld (_penCol),hl pop hl psh hl - ld (ix),0 + ld (ix),a ;clroldcustom -> a=0 cal __vputs - ld (ix),' ' ld a,'_' cal __vputmap nokeypressed: @@ -1285,6 +1364,7 @@ backspace: dec ix jr enternameloop continue: + ld d,0 cp K_ENTER jr z,nameentered cp K_EXIT @@ -1292,9 +1372,8 @@ continue: dec (hl) ;(namelength) jr z,nameentered - ld hl,chartable - ld e,a - ld d,0 + ld hl,chartable-1 + ld e,a ;d=0 add hl,de ld a,(hl) or a @@ -1304,20 +1383,19 @@ continue: cal releasekeys jr enternameloop -savestr: - .db "00000" ;,0 ;&&&somehow put in chartable's 5-byte hole chartable: - .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|- - .db -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|- - .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|- - .db "ZVRMHC8",-1 ;.|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*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more - -nameentered: + .db ".<>!" ;down|L|R|up|-|-|-|-|[enter] + .db "w00t!" ;(makes code look way better) + .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 - ld (ix+8),0 ;end mark + ld (ix+8),d ;end mark jp DisplayMenu ;_______________________________________________________________________________ @@ -1465,7 +1543,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 @@ -1489,7 +1567,7 @@ OhMyGodItsALabel: ;pj34r my coding skillz rra ;and _datalink jr nc,_StartLevel -;--- link --- +;--- link ---------------------------------------------------------------------- wormVhost = 095 wormVclient = 195 @@ -1505,7 +1583,7 @@ linkmatch: cp wormVclient jr nz,host -;--- client --- +;--- client -------------------------------------------------------------------- client: ; ld hl,txtReceiv @@ -1515,11 +1593,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 @@ -1545,24 +1623,24 @@ linkerror: pop hl ;error jp DisplayMenu ;return to menu -;--- set/send worms --- +;--- 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 @@ -1575,7 +1653,7 @@ sendworm: ;hl=wormN+name ld b,9 jp sendstuff -;--- host --- +;--- host ---------------------------------------------------------------------- host: cp wormVhost @@ -1587,12 +1665,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 @@ -1609,7 +1687,7 @@ host: ld b,168 cal sendstuff ;level -;--- load level --- +;--- load level ---------------------------------------------------------------- StartLevel: pop hl ;loadgamecar @@ -1642,7 +1720,7 @@ teamset: ld l,(hl) ld h,0 ld a,(gamecar) - rla + rla ;and _dataPmult ld a,h ;(Left)=256 jr nc,setscorelimit ld a,l @@ -1670,29 +1748,32 @@ Nextlevel: inc hl ;location of ending-code jp (hl) ;go there ("call") donextlevel: - ld bc,gametype - ld a,(bc) + ld de,gametype + ld a,(de) or a ;gamesingle psh af - cal nz,skiplvltitle + jr nz,customnrpeas +;--sp-- + inc de + ld a,(de) ;gamecar + rla ;prepare a + rlc (hl) ;bit 7 of (hl)... + rra ;...to bit 7 of (gamecar) + rrc (hl) ;restore (hl) + ld (de),a ld a,(hl) - and 127 - jr nz,setleft -customleft =$+1 + and 127 ;actual #peas + jr setnrpeas +;--!sp-- +customnrpeas: + cal skiplvltitle ld a,0 -setleft: +customleft =$-1 + +setnrpeas: ld (Left),a inc a ld (lefttotal),a - dec a - xor (hl) ;bit (hl),7 - inc 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 @@ -1707,13 +1788,8 @@ setspeed: inc hl ld de,peagrowth ldi - ld a,(hl) - ld (worm1+grow),a ;&&sh - ld (worm2+grow),a - ld (worm3+grow),a - ld (worm4+grow),a - ld (beginsize),a - inc hl + ld de,growsize + ldi ld a,(hl) inc hl @@ -1765,20 +1841,23 @@ toobad_noballs: worminit: psh bc ;>1 ex de,hl - ldi ;d + ldi ;+d ld a,SinCosTable/256 ld (de),a inc de - ldi ;y - ldi ;x + ldi ;+y + ldi ;+x ex de,hl xor a - ld (hl),a ;y2 + ld (hl),a ;+y2 inc hl - ld (hl),a ;x2 + ld (hl),a ;+x2 inc hl + ld a,(growsize) + ld (hl),a ;+growL inc hl - ld (hl),a ;growH=0 + xor a + ld (hl),a ;+growH=0 ld bc,(worm2-worm1)-7 add hl,bc @@ -1787,10 +1866,9 @@ worminit: inc a ;ld a,1 ld (turn10),a - inc a ;ld a,2 ld (flashtime),a -;--- draw level --- +;--- draw level ---------------------------------------------------------------- initlevel: ld a,(de) @@ -1811,13 +1889,7 @@ setfieldy: psh de ; >> levelp ld a,l ;pop sub 5 - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl ;32=scr.width + cal ldhl32a ex de,hl ld hl,ScrBuffer @@ -1888,28 +1960,37 @@ levelhasbeensetup: cal drawstuff -;--- prepare --- +;--- prepare ------------------------------------------------------------------- leveldone: psh hl ; >> levelp new cal forceshowstats + cal handlethoseneatlittleballs + + ld a,(gamecar) + rla ;and _dataPmult + cal c,multnewpea ;a=0 + rla ;and _datafood + cal nc,NewPea +nofood: + ld bc,(worm1+pos) + cal DisplayField #ifdef readymask ld hl,$FC70 - ld d,%10101010 - ld c,56 + ld de,57*256+%10101010 maskloop: - ld a,d - xor %11111111 - ld d,a + ld a,e + cpl + ld e,a ld b,$10 maskline: ld a,(hl) - or d + and e ld (hl),a inc hl dnz maskline - dec c + dec d jr nz,maskloop #endif #ifdef readytext @@ -1926,15 +2007,6 @@ maskline: res 3,(iy+5) #endif - ld a,(gamecar) - rla ;bit __bitPmult,a - cal c,multnewpea ;a=0 - rla ;bit __bitfood,a - cal nc,NewPea -nofood: - ld bc,(worm1+pos) - cal DisplayField - ld b,startdelay ReadyDelay: halt @@ -1949,7 +2021,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 @@ -2016,11 +2088,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 @@ -2052,9 +2120,9 @@ CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop - jp Exit ;jr? + jr Exit -;--- pause menu --- +;--- pause menu ---------------------------------------------------------------- disppausemenu: ld hl,txtpMenu @@ -2192,7 +2260,7 @@ CURtxtGame =$-2 ld de,$0004 ld (_curRow),de -;--- who won? --- +;--- who won? ------------------------------------------------------------------ findwinner: ld hl,(worm1+score) @@ -2232,7 +2300,7 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;--- display worms --- +;--- display worms ------------------------------------------------------------- ;x123456789012345678901 ;>>>>>> GAME OVER <<<<< @@ -2251,10 +2319,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 @@ -2331,34 +2399,33 @@ hilevelcheckdone: and _datasingl jr z,hiscorecheckdone ;no SP checkhiscore: - cal loadhiscoreposinahl + cal loadhiscoreposinahl ;cf=0 (and) cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile) +;-wild insertation- xor a - ld hl,highsave + ;Be Root to fix a Unix problem + ld hl,savestr + ;ReBoot to fix a Windows problem cal _SET_ABS_DEST_ADDR ;to local - ld hl,5 ;5 bytes - cal _MM_LDIR_SET_SIZE ;get old score+name - cal _RAM_PAGE_1 - - ld de,(highsave) ;de=prev. hiscore + ;W00t W00t to fix an assembly problem + cal mmldir5 ;get old score+name + ld de,(savestr) ;de=prev. hiscore ld hl,(worm1+score) ;hl=worm1's score cal _cphlde ;sub hl,de jr c,NotNewHigh ;newOld - ld (highsave),hl ;store new hiscore - ld de,highsave+2 ;to +newhigh: ;New>Old + ld (savestr),hl ;store new hiscore + ld de,savestr+2 ;to ld hl,worm1+name ;from ld bc,3 ;3 chars ldir ;store new hiname - cal loadhiscoreposinahl + cal loadhiscoreposinahl ;cf=0 (jr c) cal _SET_ABS_DEST_ADDR ;to ahl xor a - ld hl,highsave + ld hl,savestr cal _SET_ABS_SRC_ADDR ;from local - ld hl,5 - cal _MM_LDIR_SET_SIZE ;save new - cal _RAM_PAGE_1 + cal mmldir5 ;save new score+name ld hl,_curRow dec (hl) cal iswinner @@ -2370,9 +2437,11 @@ NotNewHigh: cal _vputs ld hl,$0C07 ld (_curRow),hl - ld hl,highsave+2 + ld hl,savestr+2 cal _puts - ld hl,(highsave) + ld hl,_curCol + inc (hl) + ld hl,(savestr) cal _D_HL_DECI cal _puts ;showHL hiscorecheckdone: @@ -2391,7 +2460,7 @@ waitkeyloop: ret loadhiscoreposinahl: - ld hl,0 ;for peaworm and singleplayer + sbc hl,hl ;cf=0 ld a,(gametype) or a ;Singleplayer? jr z,hi__ @@ -2414,8 +2483,8 @@ hiscrposhl =$-2 hiscrposa =$+1 adc a,0 ;ahl=saveloc ret -highsave: - .db 0,0,"SHI ",0 +savestr: ;hiscore (01ABC) _D_HL_DECI (01234) + .db $BB,"w00t",0 iswinner: ld a,10 @@ -2423,7 +2492,7 @@ iswinner: ld a,'*' jp _putc ;..then put * -;--- quit --- +;--- quit ---------------------------------------------------------------------- ExitNoStats: cal linkok @@ -2459,39 +2528,31 @@ 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) jr DoesWormTailEqualsWormHead ;chk4 size=0 removewormloop: - ld c,(hl) - inc hl - ld b,(hl) - inc hl - cal resbit - psh hl - cal res4pixels - pop hl + cal removetailbit inc (ix+grow) jr nz,DoesWormTailEqualsWormHead inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde - jr nz,removewormloop + jr nz,removewormloop ;head=tail/size=0 ld a,(gamecar) and _datasingl - jr nz,safewormsizedone + jr nz,savetailpos + ld (ix+grow+1),a ;=0 ld a,0 -beginsize =$-1 +growsize =$-1 ld (ix+grow),a - ld (ix+grow+1),0 ;high -safewormsizedone: - ;de=ix+head - ld (ix+tail+1),d - ld (ix+tail),e ;head=tail/size=0 +savetailpos: + ld (ix+tail+1),h + ld (ix+tail),l ret unnamedlabel: @@ -2504,10 +2565,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 @@ -2542,7 +2603,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 @@ -2551,7 +2612,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 @@ -2579,7 +2640,7 @@ HandleWorm: or a ret nz ;live limit alive: - ld a,(ix+delay) + ld a,(ix+wdelay) dec a jp nz,respawncheck @@ -2608,23 +2669,9 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) -#ifdef optdie - psh hl - ld hl,previouspos - ld (hl),c - inc hl - ld (hl),b - inc hl - inc hl - ld (hl),e - inc hl - ld (hl),d - pop hl -#endif +;--- move worm ----------------------------------------------------------------- -;--- move worm --- - -Wormmove: +wormmove: psh bc ;pos ld a,(hl) add a,a @@ -2651,35 +2698,33 @@ notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos - ld (ix+pos),c - ld (ix+pos+1),b ld (ix+pos2),e ld (ix+pos2+1),d ;-check- pop hl ;pos (old) ld a,h - sub b - and 1 + sub b ;Xold-Xnew + and 1 ;abs ld h,a ld a,l sub c - and 1 - add a,h - ld d,4 + and 1 ;|Yold-Ynew| + add a,h ;pixels moved |Dx|+|Dy| + ld d,4 ;same pos = 4of4 bytes drawn jr z,GotFour - xor 3 - ld d,a + xor 3 ;1 pixel = 2of4 blank; 2 pixels = 3of4 blank + ld d,a ;#pixels that should be drawn GotFour: - cal chk4pixels - rl d - cal c,hitworm + cal chk4pixels ;d-=pixels at b,c + rl d ;<0 meaning there were >d pixels + cal c,hitworm ;so that wasn't us -;--- draw worm --- +;--- draw worm ----------------------------------------------------------------- -Drawworm: - ld c,(ix+pos) - ld b,(ix+pos+1) +drawworm: + ld (ix+pos),c + ld (ix+pos+1),b ld a,(gametype) cp gamerace @@ -2697,7 +2742,10 @@ Drawworm: inc hl ld (hl),b inc hl - cal resbit + ;(resbit) + ld a,h + and (ix+storepos) + ld h,a ld (ix+head),l ld (ix+head+1),h @@ -2714,20 +2762,26 @@ Drawworm: removetail: ld l,(ix+tail) ld h,(ix+tail+1) + cal removetailbit + cal savetailpos ;ld (ix+tail),hl ld c,(hl) inc hl ld b,(hl) - inc hl - cal resbit - ld (ix+tail),l - ld (ix+tail+1),h - psh hl - cal res4pixels - pop hl + jr set4pixels ;redraw new last bit + +removetailbit: ld c,(hl) inc hl ld b,(hl) - jr set4pixels + inc hl + ;(resbit) + ld a,h + and (ix+storepos) + ld h,a + psh hl + cal res4pixels ;rm last bit + pop hl + ret res4pixels: cal ResPixel @@ -2750,8 +2804,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 @@ -2846,29 +2904,108 @@ checkballhit: ; |__|__| |_____| | \_ | | | | _____ | | __|__ | ;_______________________________________________________________________________ +;--- multifood ----------------------------------------------------------------- + +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 + jr _wormdead +pickmultpea: + ld a,247 + ld (de),a + dec de + ld (de),a + jp pickedpea + +;--- ctf ----------------------------------------------------------------------- + +chkctfpeas: ;ctf + ld hl,(peaspos) ;1st pea + ld a,(ix+reserv) + ld e,a ;push a + and %01 ;ourpea (0|1) + jr z,sel_otherpea + ld hl,(peaspos+2) ;2nd pea +sel_otherpea: + cal chkpeahit + jr c,hitflag +;no peas hit: + ld a,e ;peek a (that's x86asm for pop\push ;) + bit 1,a ;%1O = carrying flag? + jr z,_wormdead ;if not just die + and %1 ;which flag? + ld hl,drawctfpea1 ;restore #1 + jr nz,nottheotherflag + inc hl ;ld hl,drawctfpea2 + inc hl ;restore #2 +nottheotherflag: + ld (hl),3 ;draw delay 3 turns +_wormdead: + jp wormdead + +hitflag: ;correct pea hit + ld a,e ;pop a + xor %11 ;invert flag taken + ownflag + ld (ix+reserv),a + and %10 ;just returned? + psh bc ;safe position + psh af ;safe z-flag + cal DrawPea ;remove + pop af + pop bc + ret nz ;flag taken: continue game ;drawworm + ld e,20 ;flag captured+returned + psh bc + cal IncScore + pop bc + ld a,3 ;draw delay + ld (drawctfpea1),a ;redraw.. + ld (drawctfpea2),a ;..both flags + ret ;drawworm + +;--- main ---------------------------------------------------------------------- + hitworm: -#ifdef optdie -; if race - originally - cal checkhitotherworm -#endif ld a,(gamecar) bit __bitPctf,a jr nz,chkctfpeas rla ;and _dataPmult - jp c,chkmultpeas + jr c,chkmultpeas rla ;and _datafood - jp c,wormdead ;no food + jr c,_wormdead ;no food + +;--- foodmatch|SP -------------------------------------------------------------- ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit jp nc,wormdead -pickpea: - cal DrawPea ;remove pea + +;--- take pea ------------------------------------------------------------------ + + psh hl cal NewPea -pickpea_: - ld a,(ix+grow) + pop hl +pickedpea: + cal DrawPea ;remove pea + ld a,(ix+grow) ;grow add a,15 peagrowth =$-1 ld (ix+grow),a @@ -2876,12 +3013,14 @@ peagrowth =$-1 inc (ix+grow+1) wormset2grow: ld hl,Left - dec (hl) ;dec left before display + dec (hl) ;dec left _before_ display psh af ld e,10 cal IncScore pop af - jp nz,Drawworm ;continue + ld c,(ix+pos) ;same position + ld b,(ix+pos+1) ;we'll just leave pos2 - doubt anybody will care|notice.. + ret nz ;(Left)>0 ;drawworm ld a,(gametype) or a jp nz,Exit ;stack restored @@ -2897,10 +3036,10 @@ wormset2grow: ex de,hl cal _IncScore ;score+(40*level) cal removeworm - pop hl ;<<$some call - pop hl ;<promise me you'll never let go... + halt ;-------------------->i won't let go.... ld a,%10000000 ;all key-masks out (1),a - in a,(1) + in a,(1) ;--------------->i'll never let go..... inc a ;cp %11111111 (no keys pressed) jr nz,releasekeys ;keep waitin cal GET_KEY ;clear buffer - ret - -resbit: - ld a,h - and (ix+storepos) - ld h,a - ret + ret ;--------------------->*die* (we are VICTORIOUS! muha) randompos: ld b,a Random: ;(2..b+2) - ld a,r + ld a,r ;0..127 + scf ;not just even values: + rla ;6543210C Seed =$+1 add a,0 ld (Seed),a - and %01111110 cp b jr nc,Random add a,2 ret +ldhl32a: + ld l,a + ld h,0 ;=hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl ;32=scr.width + ret ;ld hl,32*a + +mmldir5: + ld hl,5 ;=ahl + cal _MM_LDIR_SET_SIZE + jp _RAM_PAGE_1 + wormdead: pop hl ;<0 + ld a,' ' + cal __vputmap ;small div + ld a,(gametype) + cp gamedeathm + cal nz,showscore ;score in !dm + ld a,$D8 + cal __vputmap ;div + ld de,worm2-worm1 add ix,de ;next - ld hl,_penCol - ld a,(hl) - add a,4 ;div - ld (hl),a - pop bc dnz showstatloop pop ix ret -showstat: ;(multiplayer) - ld a,(wormbeglives) - or a - jr nz,showlives showscore: cal ldscoreinhl + psh bc cal _D_HL_DECI + pop bc jr __vputs -showlives: - ld a,(ix+lives) - jr cshowA00 -cshowA: ;small w/ leading 0 +cshowA: ;small w/ leading 0; 0='none' or a ;destr. ahl jr nz,cshowA00 ld hl,txtNone jp _vputs -cshowA00: + +showlives: + ld a,(ix+lives) +cshowA00: ;small w/ leading 0 ld l,a ld h,0 cal _divHLby10 @@ -3572,13 +3608,7 @@ FieldHeight =$-1 jr c,NotMaxYScroll ld a,(FieldHeight) NotMaxYScroll: - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl + cal ldhl32a psh bc ; >> 1 psh de ; >> 2 ld de,ScrBuffer @@ -3789,9 +3819,9 @@ ChunkRow: ; |_____/ | \_ | | |__|__| ;_______________________________________________________________________________ -;--- pixel --- +;--- pixel --------------------------------------------------------------------- -chk4pixels: ;&& +chk4pixels: cal CheckPixel inc b cal CheckPixel @@ -3808,41 +3838,39 @@ CheckPixel: ;at bc in d dec d ret -;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes) -;(b,c) to hl:a; "destroyes" ahl +;--- findpixel ----------------------------------------------------------------- +;Based on Snake86's findpixel +;160-262 cycles; 31 bytes FindPixel: ;(b,c) to hl:a + psh bc ld h,0 - ld l,c ;hl=y + ld l,c ;hl=y add hl,hl add hl,hl - ld a,b ;a=x + ld a,b ;a=x rra add hl,hl rra add hl,hl - add hl,hl ;hl=32*y - rra ;a=x/8 + add hl,hl ;hl=32y + rra ;a=x/8 or l ld l,a - ld a,b + ld a,b ;x and 7 - cpl - rlca - rlca - rlca - ld (FP_Bit),a - xor a -FP_Bit =$+1 - set 0,a - - psh de ;&&& C`MON! THIS IS UGLY! *hit myself* - ld de,ScrBuffer - add hl,de - pop de + inc a + ld b,a + ld a,1 +pixelloop: + rrca + dnz pixelloop + ld bc,ScrBuffer + add hl,bc + pop bc ;destr:none ret -;--- objects --- +;--- objects ------------------------------------------------------------------- drawstuff: ld a,(hl) @@ -3874,7 +3902,7 @@ drawsmtn: ; dec a ;4 = circle ; jp z,drawcircle -;--- circle --- +;--- circle -------------------------------------------------------------------- ;IMHO, one weery nice routine. Oh lemme be proud just *once*. ;Not perfect since it uses a screwy lineroutine to draw stuff @@ -3931,6 +3959,8 @@ circledraw: ;destr:de psh hl ld a,h ;hl=x,y sub b ;bc=xx,yy + jr nc,$+3 ;x x=0 ld d,a ;d=x-xx add hl,bc ;h=x+xx; l=y+yy ld e,l ;e=y+yy @@ -3938,6 +3968,8 @@ circledraw: ;destr:de ld a,l sub c ;a=y again sub c + jr nc,$+3 ;y y=0 ld l,a ;l=y-yy ld e,l ;e=l=y-yy cal drawline ;(h-b,l-c)-(h+b,l-c) @@ -3947,7 +3979,7 @@ circledraw: ;destr:de pop hl ret ;thats it -;--- box --- +;--- box ----------------------------------------------------------------------- drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3959,7 +3991,7 @@ boxloop: dnz boxloop ret -;--- fatline --- +;--- fatline ------------------------------------------------------------------- drawfatline: cal drawline @@ -3973,7 +4005,7 @@ drawfatline: dec h ; jp drawline -;--- line --- +;--- 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. @@ -4023,7 +4055,7 @@ lineYincs: ;lets assume y incs as well pop hl ; :