X-Git-Url: http://git.shiar.net/wormy.git/blobdiff_plain/0e077b916a6dd54a2d1140fdcfea5c783e4961cd..6d64bb2aa29809c9c24fb5ee036766440b62bf4a:/wormy.z80?ds=sidebyside diff --git a/wormy.z80 b/wormy.z80 index 447f511..bd08056 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,192 +1,368 @@ -; Title : Wormy -; Version : 93% -; Release Date : summer 2001 -; Filename : wormy.86p (5kb) -; Author(s) : Shiar -; Email Address : shiar0@hotmail.com -; ICQ UIN : #43840958 -; Web Page : www.shiar.org -; Description : ruling Nibbles-like game 1-4 players -; Where to get this game : www.shiar.org (home of Wormy) -; Other games by author(s) : Nemesis beta -; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) -; Jonah Cohen (helped writing worm) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 93% = DONE - -; * internal levels -; * check levels/gametype -; * enough hiscore saves! -; * complete readme -; 1% * misc (pollish, bugs, &&&) -; * LINK -; 2% * fix deaths linkplay and transmit game/level data -; 2% * make linkplay available for all gametypes (not just deathmatch) -; * CTF -; 1% * fix pea XOR problem in ctf (+dom?) -; * fix wormstop -; 1% * domination?: take control points by running over them and hold them - -;100% = bugs fixed + levels done - -;----------------------------- -;----------------------------- -;--------- W O R M --------- -;----------------------------- -;----------------------------- - -#define buffer ;use display buffer (otherwise write directly to screen) -#define readymask ;"grays" out the field before starting a level -;#define hlines ;horizontal-line routine for more speed drawing boxes - -;#define readytext ;displays "prepare" before level starts -;#define invincible ;worms cannot die =) - -#define cal call -#define psh push -#define dnz djnz +;___ââââ________________________________________________________ââââ____________ +; ââââ âââââ +; âââ ââââ ââââ +;âââ âââââ ââââââââ âââââ ââââ ââââ âââ âââââ +;âââ âââââââ âââââââââââ âââââââ âââââââââââââ ââ âââ âââ +;ââ âââ âââ âââââ ââââ ââââ âââ âââ ââââ âââ âââ ââââ âââ +;ââ ââ ââ ââ â âââ ââââ âââ ââââââ âââ âââ âââ ââ +;ââ ââ ââ ââ ââ âââ âââ âââ ââââ âââ âââ âââ ââââ ââ +;ââ âââ âââ ââ ââ ââ âââ âââââââ âââ ââ âââââââ ââ +;ââ âââ âââ âââ ââ ââ ââ ââ âââ âââ âââ âââââ âââ +;âââ âââ âââ âââ ââ ââ âââ ââ ââââ ââââ âââ âââ +;âââ âââââ âââ âââ âââ âââ ââ ââââââââ âââ âââ +; âââ âââ âââ âââ âââ âââ âââ ââââââ âââ âââ +; ââââ âââââââ ââââ âââ âââ ââââ âââ âââââ ââââ +; ââââââââ ââââââââ âââââââââ âââ âââ âââââââââââââââ +; âââââ âââââ âââââââ ââ âââ âââââââââââ +;_______________________________________________________________________________ +; +; 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, 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) : ed15e942a99b40e5a584c597cb13df46 +; wormy.z80 (100k) : 977109a7d25f3227fe817edbcc36ad9a +; wormy.86g (8914) : fbff7c36687c1e7e3113c29069021718 +;_______________________________________________________________________________ + +;--- 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 + +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| ____ |_____/ |_____| +;_______________________________________________________________________________ + +; 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! +; +; * 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) + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #include "asm86.h" #include "ti86asm.inc" -_SHRACC = $4383 -_SHLACC = $438B + #define cal call + #define psh push + #define dnz djnz + +_SHRACC = $4383 ;4x srl a +_SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 _divAby10 = $4DAF ;a=a/10 _HLTIMES10 = $41BF ;hl=hl*10 -_cphlde = $403C +_cphlde = $403C ;cp hl,de _clrWindow = $4A86 ;clear screen _asapvar = $D6FC ;own name (worm) _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 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl _mm_ldir = $52ED ;24bit ldir +_MM_LDIR_SET_SIZE = $524D ;_SET_MM_NUM_BYTES + _mm_ldir _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1 -_RAM_PAGE_7 = $47F3 +_RAM_PAGE_7 = $47F3 ;"""" 7 _PTEMP_END = $D29A ;end of VAT _load_ram_ahl = $462F ;ahl->page+hl -_writeb_inc_ahl = $5567 ;ld (ahl),c +_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 - -;----------------------------- -;------- data storage ------- -;----------------------------- - -;--- permanent - -ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl +_OP1TOOP6 = $4263 + + #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 + ;-to become invincible, define the magic word :D + +levelhead = 'w' +levelhead2 = 97 ;wormy levels header = "0" + +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- permanent ----------------------------------------------------------------- + +ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) +worm4p = $A400 ;-A5FF (200) %101001O0 +;free = $A600 ;-A7FF (200) worm2p = $A800 ;-ABFF (400) %10101O00 -worm1 = $AC00 ;-AC1D (31d) -worm2 = $AC1F ;-AC3B (1F) -worm3 = $AC3E ;-AC59 (1F) -worm4 = $AC5D ;-AC77 (1F) -balls = $AC7C ;-ACFF (3x43d) -SinCosTable = $AD00 ;-AE00 (4x40) - ;free $AE01 ;-AFFF (1FF) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1E (1E) +worm2 = $AD1F ;-AD3C (1E) +worm3 = $AD3D ;-AD5A (1E) +worm4 = $AD5B ;-AD78 (1E) +balls = $AD79 ;-AE00 (<=3x2D) (bb<=45) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AF05 (4-104) (peas) +;free = $AF06 ;-AFFF (F9) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - - ;program $D748 ;-E7FF (106D+4A) - ;free $E800 ;-EFFF (800) -worm4p = $F000 ;-F3FF (400) %11110O00 -leveldata = $F400 ;-FA70 (<=671) +;buffer = $BC00 ;-BF90 (390) +;free = $BF91 ;-BFFF (6F) +;program = $D748 ;-EFFF (186D+4A) ;6327 +leveldata = $F080 ;-F9FF (<=97F) +#ifndef intlevels +datalevels = $FA00 ;-FA11 (12) (>=$C000) +nrlevels = $FA12 ;-FA1B (A) (<$FA70) +defspr = $F078 ;-F07F (8) +#endif -peaspos = $AE01 +;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong +; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < +; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary ----------------------------------------------------------------- namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif - -;----------------------------- -;------- program start ------- -;----------------------------- - -.org _asm_exec_ram - -wormVhost = 093 -wormVclient = 193 - -start: +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 + +;--- layout -------------------------------------------------------------------- + +;(wormN) offs: set: +heading = 0 ;level* +pos = 2 ;level* +pos2 = 4 ;level +grow = 6 ;level +died = 8 ;game: +score = 9 +wdelay = 11 +lives = 12 +head = 13 + ; â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^ + +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ + + .org %1101011101001000 + +start: ;turn back NOW! + nop ;and so it begins... + jp codestart +#ifndef id2 + ld bc,$5242 + rst 10h + .dw WormIcon +#else + ld (bc),a nop - jp Start - .dw 1 - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- alpha 93%",0 + ld d,h + rst 10h + .dw WormIcon + .dw WormData +#endif + 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 " v1.00.36",0 WormIcon: - .db 9,2 - .db %10010110,%01101111 - .db %10110101,%01001011 - .db %01110011,%01001001 - .db %00000011,%10000000 - .db %00000001,%11100000 - .db %00111000,%11111000 - .db %01111110,%00111111 - .db %11101111,%00001111 - .db %11000011,%10000000 - -levelhead = 'w' -levelhead2 = 93 ;wormy levels header = "93" + .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' - 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: - 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 - cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -202,11 +378,8 @@ searchloop: jr z,stringfound searchnext: pop hl - dec hl ;5x - dec hl - dec hl - dec hl - dec hl + ld de,-5 + add hl,de ld b,(hl) ;name size inc b skipname: @@ -229,122 +402,98 @@ 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 + jr searchnext loadgametype: psh de - inc bc - inc bc cal _Get_Word_ahl ;ld de,(ahl++) psh af - ld a,d - or e - jr z,defaultlevels ld a,e ;set new level ld (bc),a inc bc ld a,d ld (bc),a - dec bc -defaultlevels: + inc bc pop af pop de ;counter - dec d ;8x + dec d ;9x jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels + ld ix,templevels-6 +#else + ld ix,templevels-3 +#endif + cp (ix+3) ;1st=255 + jp z,ExitNoStats ;->no lvls + cp (ix+6) ;2nd=255 + jr z,loadlevel1 ;->1 lvl +levelselectmenu: ;load next page + psh ix ;offset + ld a,-2 + ld (availevels),a cal _clrWindow - ld hl,templevels-3 - psh hl - ld hl,$0020 + ld hl,$0320 ld (_penCol),hl ld hl,txtLevsel - cal _vputs ;"< Select levels: >" - ld hl,$0601 ;x=1 + cal _vputs ;"< SELECT LEVELS >" + ld hl,$FC00+(2*16) + ld b,16*9 + cal menuinvloop + ld hl,$FC00+$380 ;(*,56) + cal hr + ld hl,$0C01 ;x=1 ld (_penCol),hl - pop hl dispnextlevel: - ld a,(hl) - inc a ;cp 255 - jr z,_levselect - ld a,(hl) ;ade=(hl) -displevel: - inc hl - ld d,(hl) - inc hl - ld e,(hl) - inc hl - psh hl - ex de,hl ;ahl=ade=(hl) + ld de,3 + add ix,de ;goto next + ld a,(ix) + ld h,(ix+1) + ld l,(ix+2) cal _load_ram_ahl ;hl=ahl - ld b,(hl) ;b=title size cal _vputs + ld hl,availevels + inc (hl) + ld a,(ix+3) ;next + inc a ;cp 255 + jr z,__levselect ld hl,_penCol ld (hl),$01 ;x=1 inc hl ld a,(hl) add a,6 ld (hl),a ;y+6 - ld hl,availevels - inc (hl) - pop hl + cp 49 ;bottom of screen + jr nc,_levselect jr dispnextlevel -levup: - cal menupos - dec b ;up - ld a,b - cp -4 - jr nz,levselected - inc b ;undo - jr levselected -levdown: - cal menupos - inc b ;down - ld a,b - cp -3 -availevels =$-1 - jr nz,levselected - dec b ;back up -levselected: - jp menupos - -_levselect: - ld b,-3 ;level selected - cal menupos -levselect: - halt \ halt - psh bc - cal GET_KEY - pop bc ;GET_KEY destr. b - cp K_UP - cal z,levup - dec a ;K_DOWN - cal z,levdown - cp K_SECOND-1 - jr z,loadlevel - cp K_EXIT-1 - ret z - cp K_ENTER-1 - jr nz,levselect -; jr z,loadlevel +loadlevel1: + psh ix + pop hl + ld b,-2 + jr loadlevel -loadlevel: +readylevelfile: ;selected level at ahl +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -352,37 +501,105 @@ loadlevel: add a,e ;*3 ld e,a ld d,0 ;de=sellev*3 - ld hl,templevels-3 add hl,de ld a,(hl) ;ade=(hl) - or a ;levelfile on page 0 (=internal) - jr z,levelloaded - inc hl ld d,(hl) inc hl ld e,(hl) ex de,hl ;ahl=ade skiptitle: - ld b,a ;psh ahl + ld d,a ;psh ahl psh hl cal _GETB_AHL ;ld a,(ahl) pop hl or a - ld a,b ;pop ahl + ld a,d ;pop ahl psh af cal _INC_PTR_AHL ;ahl++ pop af ;cp 0 jr nz,skiptitle ;goto #0-terminator + ret + +levup: + cal menupos + dec b ;up + ld a,b + cp -3 + jr nz,levselect + inc b ;undo + jr levselect +levdown: + cal menupos + inc b ;down + ld a,b + cp -2 +availevels =$-1 + jr nz,levselect + dec b ;back up +levselect: + cal menupos + ld hl,$3900 + ld (_penCol),hl + pop hl + psh hl + cal readylevelfile + cal _load_ram_ahl ;hl=ahl + ld de,$FFA0 ;desc.text + xor a +levdescclearloop: + ld (de),a ;empty + inc de + cp d ;de>$FFFF (offscreen) + jr nz,levdescclearloop + cal _vputs + jr levselectmenuloop+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 +levselectmenuloop: + psh hl + psh bc + cal ubergetkey + pop bc ;GET_KEY destr. b + dec a ;cp K_DOWN + jr z,levdown + sub K_UP-1 + jr z,levup + pop hl + inc a ;cp K_RIGHT + jp z,levelselectmenu + cp K_ENTER-K_RIGHT + jr z,loadlevel + sub K_EXIT-K_RIGHT + jp z,ExitNoStats + inc a ;cp K_SECOND + jr nz,levselectmenuloop +; jr z,loadlevel +loadlevel: + cal readylevelfile +#ifdef intlevels + or a ;levelfile on page 0 (=internal) + jr z,levelloaded +#endif + cal skiptitle ;skip description +leveldataAHL: cal _Get_Word_ahl ld (leveldataSize),de - ld d,8 ;counter - ld bc,datalevels-2 + + ld d,9 ;counter + ld bc,datalevels cal loadgametype - ld (hilvlposa),a + ld (hilvlposa),a ;singleplayer levels ld (hilvlposhl),hl - ld d,4 + ld d,5 cal loadgametype cal _SET_ABS_SRC_ADDR ;levelsstart @@ -391,8 +608,7 @@ skiptitle: cal _SET_ABS_DEST_ADDR ;store in mem. ld hl,0 leveldataSize =$-2 - cal _SET_MM_NUM_BYTES - cal _mm_ldir + cal _MM_LDIR_SET_SIZE cal _LOAD_ABS_SRC_ADDR ;->ahl ld (hiscrposa),a @@ -406,29 +622,55 @@ 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 ld hl,datasingle+3 ld b,8 + ld de,8 setdeflevels: ld (hl),1 ;def=level#1 - inc hl - inc hl - inc hl - inc hl + add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;--- trig tables --------------------------------------------------------------- - ld hl,TrigPrecalc - ld de,SinCosTable - psh de ; >> 1 - ld bc,65 - ldir + ld hl,trigtable ;I believe this + ld de,SinCosTable ;is one of the few + psh de ;pieces of original + ld bc,65 ;Peaworm code still + ldir ;left intact.. dec hl ld b,63 MirrorSineWave: @@ -437,7 +679,7 @@ MirrorSineWave: ld (de),a inc de dnz MirrorSineWave - pop hl ; << 0k + pop hl ;SinCosTable ld b,128+64 NegativeSineWave: xor a @@ -447,167 +689,447 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;--- draw menu ----------------------------------------------------------------- -DisplayMenu: ;---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 + ld hl,$FC00+$160 ;(*,22) + cal hr + ld hl,$FC00+$3E0 ;(*,62) + cal hr +dispmainmenu: + ld a,(gametype) + dec a ;will be inced @changegame + cal changedgame + ld hl,changegame ;dispmenusets ;mainMenu + psh hl ;jump here after ret ld hl,txtMenu ld ix,posMenu - ld b,6 +;Mode|Level|Link|Worms|worm #|controls +; jr dispmenucommon ;cal + +dispmenucommon_: + ld b,36*16/4 +dispmenucommon: + ld de,$FD80 ;begin pos + xor a +clroldmenuloop: + ld c,4 + ld (de),a + inc de + dec c + jr nz,clroldmenuloop+2 + dnz clroldmenuloop + + 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 ;Mode \ Level \ Limit \ Worms \ worm # \ controls + cal _vputs dnz dispmenuloop +; ld b,0 ;b=menu# + ret - ld b,0 ;b=menu# - jr _dispmenusets ;mainMenu +hr: ;draw horizontal line at hl + ld b,16 +; jp menuinvloop ;shorter but not good for pausescreen +hrloop: + ld (hl),-1 + inc hl + dnz hrloop + ret -;--- menu loop --- +;--- options menu -------------------------------------------------------------- -mainMenu: +dispoptionmenu: + ld hl,txtoMenu + ld ix,posoMenu +;Back|Lives|Limit|Speed|Rotation|Growth + cal dispmenucommon_ + +dispomenusets: +#ifdef spprotect + ld a,(gamecar) + and _datasingl + jp nz,LetsGetThisPartyOn ;SP -> start game +#endif + cal clrold + + ld hl,$1E3E + ld (_penCol),hl + cal loadgamecar + psh hl + cal cshowA ;lives + + ld hl,$2A3E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl \ inc hl \ inc hl + psh hl + ld a,(hl) ;(Speed) + inc a ;1..99 + jr nz,dispspeed + ld hl,txtDef + cal _vputs + jr dispspeeddone +dispspeed: + cal cshowA +dispspeeddone: + + ld hl,$363E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + psh hl + ld a,(hl) ;(growth) + inc a ;-1=None; 0..98->1..99 + cal cshowA + + ld hl,$303E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + psh hl + ld a,(hl) + cp 8 + jr nz,dispturn + ld hl,txtDef + cal _vputs + jr dispturndone +dispturn: + cal cshowA ;turn speed +dispturndone: + + ld hl,$243E + ld (_penCol),hl + pop hl ;loadgamecar + inc hl + ld a,(hl) ;(scorelimit) + or a + psh af + cal cshowA ;limit + pop af ;a==0? + jr z,optionMenu ;do not display 0 behind 'None' + ld a,c ;(gamecar) + rla ;and _dataPmult + jr nz,optionMenu ;in multifood limit == #peas + ld a,'0' + cal _vputmap ;x10 + +optionMenu: cal menupos cal menucall - jr nz,notselect -select: ;2nd/enter + jr nz,notoselect +oselect: cal menupos ld a,b - sub 4 ;4th item? - jp z,changeworms - dec a ;5th? - jp z,changekeys - jp LetsGetThisPartyOn ;1/2/3/5 -notselect + or a ;1st item? + jp z,dispmainmenu ;mainMenu + jr optionMenu +notoselect cp K_EXIT - jp z,ExitNoStats + jp z,dispmainmenu psh af cal menupos cal loadgamecar inc hl pop af - cp K_LEFT - jr z,selleft - cp K_RIGHT + sub K_LEFT + jr z,seloleft + dec a ;K_RIGHT ld a,b - jr nz,mainMenu + jr nz,optionMenu -selright: - or a - jr z,changegame - dec a - jp z,changelevel ;&&&jr?? - dec a +seloright: + dec a ;Lives jr z,changelives - dec a - jr z,changenrworms -; dec a -; jr z,changecurworm + dec a ;Limit + jr z,changelimit + dec a ;Speed + jr z,changespeed + dec a ;Rotation + jr z,changeturn + dec a ;Growth + jr z,changegrowth + ;Back +seloleft: + ld a,b + dec a ;Lives + jr z,bchangelives + dec a ;Limit + jr z,bchangelimit + dec a ;Speed + jr z,bchangespeed + dec a ;Rotation + jr z,bchangeturn + dec a ;Growth + jr z,bchangegrowth +_optionMenu: ;Back + jr optionMenu -changecurworm: -; hl=nrworms - ld a,(curworm) - cp (hl) - jr nc,mainMenu ;may not become >(nrworms) +changelives: + cal loadgamecar ;a=(hl) inc a -changedcurworm: - ld (curworm),a - jr _dispmenusets ;mainMenu + cp 100 + jr nc,optionMenu ;>99 +changedlives: + ld (hl),a +_dispomenusets: + jp dispomenusets ;optionMenu +bchangelives: + cal loadgamecar + sub 1 ;dec does not set cf + jr c,optionMenu ;<0 + jr changedlives -selleft: - ld a,b - or a - jr z,bchangegame +changelimit: + cal changelimitInit + inc a + cp 100 + jr nc,optionMenu ;>99 +changedlimit: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangelimit: + cal changelimitInit + sub 1 ;dec does not set cf + jr c,optionMenu ;<0 + jr changedlimit +changelimitInit: + cal loadgamecar + ld de,6 + add hl,de + ld a,(hl) ;(scorelimit) + ret + +changespeed: + cal changespeedInit + inc a + cp 20 + jr nc,_optionMenu ;>98 +changedspeed: + dec hl ;(Speed) + ld (hl),a + jr _dispomenusets ;optionMenu +bchangespeed: + cal changespeedInit dec a - jr z,bchangelevel + cp -2 +__optionMenu: ;w/ zf + jr z,_optionMenu ;<-1 + jr changedspeed +changespeedInit: + cal loadgamecar + ld de,3 + add hl,de + ld a,(hl) ;(Speed) + inc hl ;=saves 2 bytes :P + ret + +changeturn: + cal changespeedInit + inc hl ;(turnspeed) + ld a,(hl) + inc a + cp 26 + jr nc,_optionMenu ;>25 +changedturn: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangeturn: + cal changespeedInit + inc hl + ld a,(hl) dec a - jr z,bchangelives + cp 3 + jr c,_optionMenu ;<3 + jr changedturn + +changegrowth: + cal changespeedInit + ld a,(hl) + inc a + cp 99 + jr nc,_optionMenu ;>98 +changedgrowth: + ld (hl),a + jr _dispomenusets ;optionMenu +bchangegrowth: + cal changespeedInit + ld a,(hl) dec a + cp -2 + jr z,__optionMenu ;<-1 + jr changedgrowth + +;--- main menu ----------------------------------------------------------------- + +mainMenu: + cal menupos + cal menucall + jr nz,notselect +select: ;2nd/enter + cal menupos + ld a,b + dec a ;2nd item: level + jp z,dispoptionmenu + sub 3 ;5th item: wormname + jp z,changeworms + dec a ;6th: controls + jp z,changekeys + jp LetsGetThisPartyOn ;otherwise + +changenrworms: + cal change4spOnly + ld a,(hl) ;hl=nrworms + inc a + cp 7 + jr nc,mainMenu ;may not be >4+2 +changednrworms: + ld (hl),a + jr _dispmenusets ;mainMenu + +notselect + cp K_EXIT + jp z,ExitNoStats + cp K_MORE + jp z,codestart + psh af + cal menupos + cal loadgamecar + inc hl + pop af + sub K_LEFT + jr z,selleft + dec a ;K_RIGHT + ld a,b + jr nz,mainMenu + +selright: + or a ;Mode + jr z,changegame + dec a ;Level + jr z,changelevel + dec a ;Link + jr z,changelink + dec a ;Worms + jr z,changenrworms +; dec a ;worm# +; jr z,changecurworm + +changecurworm: + ld hl,curworm + ld a,(hl) + cp 4 + jr nc,mainMenu ;may not become >4 + inc (hl) + jr _dispmenusets ;mainMenu + +selleft: + ld a,b + or a ;Mode + jr z,bchangegame + dec a ;Level + jr z,bchangelevel + dec a ;Link + jr z,bchangelink + dec a ;Worms jr z,bchangenrworms -; dec a +; dec a ;worm# ; jr z,bchangecurworm bchangecurworm: - ld a,(curworm) - dec a ;0-3 - jr nz,changedcurworm ;save >0 + ld hl,curworm + ld a,(hl) + dec (hl) ;0-3 + jr nz,_dispmenusets ;save >0 + inc (hl) +_mainMenu: jr mainMenu -changenrworms: - ld a,(Gametype) +bchangenrworms: + cal change4spOnly + ld a,(hl) ;hl=nrworms + dec a ;0-(3+2) cp 2 - jr c,mainMenu ;type 0/1 - ;hl=nrworms - ld a,(hl) - inc a - cp 5 - jr nc,mainMenu ;may not be >4 -changednrworms: + jr nc,changednrworms ;save >=2 + jr _mainMenu + +change4spOnly: + ld a,(gametype) + cp 3 + ret nc + pop hl ;cal + jr _mainMenu ;don't change for singleplayer + +changelink: +bchangelink: + cal change4spOnly + dec hl ;inced earlier + dec hl ;gamecar + ld a,1 ;change LS-bit (=link) + xor (hl) ;0=1; 1=0 ld (hl),a _dispmenusets: jr dispmenusets ;mainMenu -bchangenrworms: - ;hl=nrworms - ld a,(hl) - dec a ;0-3 - jr nz,changednrworms ;save >0 -_mainMenu: - jr mainMenu changegame: - ld a,0 -Gametype =$-1 + ld a,(gametype) inc a -changedgame: - and 7 ;mod 8 - ld (Gametype),a + cal changedgame + jr z,changegame jr dispmenusets ;mainMenu +changedgame: + cp 9 + jr c,changedgameok + sub 255-8 ;-1 -> 8 + jr nc,changedgameok + xor a ;9 -> 0 +changedgameok: + ld (gametype),a + cal getnrlevels + xor a + cp (hl) + ret bchangegame: - ld a,(Gametype) + ld a,(gametype) dec a - jr changedgame - -changelives: - cal changelivesInit - inc a - cp 100 - jr nc,_mainMenu ;&& _? -changedlives: - ld (hl),a + cal changedgame + jr z,bchangegame jr dispmenusets ;mainMenu -bchangelives: - cal changelivesInit - dec a - jr z,_mainMenu - jr changedlives -changelivesInit: - cal loadgamecar ;c=(gameCar) -;a=(hl)=(Gametype+1)=(wormbeglives) - ld a,(Gametype) ;&&& - cp 3 - ld a,(hl) - ret nc ;change lives - pop hl ;restore stack - jr _mainMenu ;singleplayer (no limit) changelevel: inc hl ;hl=loadgamecar+2 psh hl ld a,(hl) ;(curlevel) - ld hl,Gametype - ld d,0 - ld e,(hl) - ld hl,nrlevels - add hl,de + cal getnrlevels cp (hl) ;max level for sel.game pop hl jr z,_mainMenu @@ -622,91 +1144,89 @@ bchangelevel: jr nz,changedlevel jr _mainMenu +getnrlevels: ;for current gametype at hl + ld hl,gametype + ld d,0 + ld e,(hl) + ld hl,nrlevels + add hl,de + ret + getcustomkey: cal _vputs dec ix waitcustomkey: - halt \ halt psh hl - cal GET_KEY + cal ubergetkey pop hl 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 changekeys: cal getwormname - ld hl,txtKeyleft + 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 hl,$FD97 ;begin pos - ld de,7 ;bytes to add - ld a,35 ;nr of lines -clroldsettings: - ld c,9 ;bytes to clear -clroldsetsloop: - ld (hl),d ;=0 - inc hl - dec c - jr nz,clroldsetsloop - add hl,de - dec a - jr nz,clroldsettings - ld de,$183E ld (_penCol),de - ld d,0 - ld a,(Gametype) - ld e,a - ld hl,posGame - add hl,de ;hl=posGame+(Gametype) - ld a,(hl) ;str.offset - ld e,a ;^d=0^ - ld hl,txtGame - add hl,de ;txtGameX - ld (CURtxtGame),hl ;save for g/o - cal _vputs ;Singleplayer - - cal loadgamecar - psh hl - ld hl,$243E - ld (_penCol),hl - cal cshowA ;liveslimit - sub '0' ;original A - ld l,a - ld a,c - and _datascore - ld a,' ' - jr z,limitok - ld a,'0' -limitok: - cal _vputmap ;x10 + cal clrold + cal loadtxtgame + cal _vputs ;Singleplayer or smtn ld hl,$2A3E ;worms ld (_penCol),hl - pop hl ;cal loadgamecar - inc hl + cal loadgamecar psh hl + inc hl ld a,(hl) + dec a ;0-5 + and 3 ;0-3 + inc a ;1-4 add a,'0' cal _vputmap + ld a,(hl) + cp 5 + ld hl,txtteamed + cal nc,_vputs + + ld hl,$243E + ld (_penCol),hl + rr c ;(gamecar) + ld hl,txtNo + jr nc,displink + ld hl,txtYes +displink: + cal _vputs ld hl,$1E3E ;level ld (_penCol),hl - pop hl ;loadgamecar; hl++ - inc hl - ld a,(hl) ;(curlevel) - cal cshowA + pop hl ;loadgamecar + psh bc + ld d,0 + cal hlatlevel + ld a,(gametype) + or a ;gamesingle + jr nz,displvlname + ld a,(Level) + cal cshowA00 + jr lvldisped +displvlname: + cal _vputs +lvldisped: + pop bc ld hl,$3032 ld (_penCol),hl @@ -717,22 +1237,21 @@ curworm =$-1 ld hl,$303E ld (_penCol),hl cal getwormname - ld hl,worm1name-18 - add hl,de + psh ix ;wormNname + pop hl ;ld hl,ix cal _vputs ld hl,$363E ;controls ld (_penCol),hl -; ld hl,txtMenu -; cal _vputs + ld hl,txtMenuR + cal _vputs jp mainMenu -;--- handle menukeys --- +;--- handle menukeys ----------------------------------------------------------- menucall: psh bc menuwaitkey: - halt \ halt - cal GET_KEY + cal ubergetkey or a jr z,menuwaitkey pop bc ;GET_KEY destr. b @@ -788,112 +1307,161 @@ menunewok: ld b,a jr menupos -;--- change name --- -; of worm#(curworm) +;--- change name --------------------------------------------------------------- getwormname: ;of (curworm) ld a,(curworm) - add a,a ;2x ld e,a + add a,a ;2x add a,a ;4x add a,a ;8x add a,a ;16x - add a,e ;18x + sub e ;15x ld e,a ld d,0 ;de=a - ld ix,worm1name-18 + ld ix,worm1name-15 add ix,de ret changeworms: - cal _clrWindow - ld hl,txtEName - cal _puts ;"Enter name player " - ld a,(curworm) - add a,'0' - cal _putc - cal getwormname - ld a,maxnamelength - cal entername - ld (ix),0 ;end mark - jp DisplayMenu - -entername: - ld h,1 - ld l,h ;) - ld (_curRow),hl + psh ix + pop hl ;ld hl,ix + psh hl + ld b,8 +emptyname: + ld (hl),' ' + inc hl + dnz emptyname + ld a,maxnamesize ld (namelength),a enternameloop: + ld hl,$FF07 ;begin pos + ld a,6 ;nr of lines + cal clroldcustom + ld hl,$303E + ld (_penCol),hl + pop hl + psh hl + ld (ix),a ;clroldcustom -> a=0 + cal __vputs ld a,'_' - cal _putc - ld hl,_curCol - dec (hl) + cal __vputmap nokeypressed: - halt - cal GET_KEY + cal ubergetkey or a jr z,nokeypressed + ld hl,namelength cp K_DEL jr nz,continue backspace: - ld hl,namelength ld a,(hl) - cp maxnamelength + cp maxnamesize jr nc,nokeypressed inc (hl) - dec ix - ld a,' ' - ld (ix),a - cal _putc - ld hl,_curCol - dec (hl) - dec (hl) jr enternameloop continue: + ld d,0 cp K_ENTER - ret z + jr z,nameentered cp K_EXIT - ret z - - ld hl,namelength - dec (hl) - ret z + jr z,nameentered - ld hl,chartable - ld e,a - ld d,0 + dec (hl) ;(namelength) + jr z,nameentered + ld hl,chartable-1 + ld e,a ;d=0 add hl,de ld a,(hl) or a jr z,nokeypressed - ld (ix),a - cal _putc inc ix cal releasekeys jr enternameloop - chartable: - .db 0,".<>!",0,0,0,0 ;down,L,R,up - .db 0,"XTOJE0",0 ;enter..clear - .db " WSNID9",0 ;(-)..custom - .db "ZVRMHC8",0 ;dot..del - .db "YUQLGB7#" ;0..xvar - .db $D9,"-PKFA6'" ;on..alpha - .db "54321*",0,$D0 ;F5..more + .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),d ;end mark + jp DisplayMenu -;--proc +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ -skiplevel: ;@hl - destr:ab - alter:hl - inc hl +ubergetkey: + halt ;woo hoo + halt ;save them batteries! yeah! + jp GET_KEY + +clrold: ;destr:acdehl (acd=0) + ld hl,$FD97 ;begin pos + ld a,35 ;nr of lines +clroldcustom: + ld de,7 ;bytes to add +clroldsettings: + ld c,9 ;bytes to clear +clroldsetsloop: + ld (hl),d ;=0 inc hl + dec c + jr nz,clroldsetsloop + add hl,de + dec a + jr nz,clroldsettings + ret + +hlatlevel: ;d must be 0 + psh hl ;loadgamecar + ld a,(gametype) + add a,a + ld e,a ;=de + ld hl,datalevels + add hl,de ;+2*mode + cal _ldHLind ;ld hl,(hl) + ex (sp),hl ;hl=loadgamecar + ld e,2 ;=de + add hl,de + ld a,(hl) ;(curlevel) + ld (Level),a + ld c,a ;begin level + pop hl ;@level1 +skiplevelloop: + dec c ;levels to skip + ret z + cal skiplevel + jr skiplevelloop + ret ;hl=begin of correct level + +skiplvltitle: ;zf=singleplayer + ld a,(hl) + or a ;null-terminator inc hl - inc hl ;skip 4 + jr nz,skiplvltitle + ret + +skiplevel: ;@hl; de=2 - destr:ab - alter:hl + ld a,(gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle + add hl,de + add hl,de ;skip 4 ld b,(hl) ;spritesize inc b skipsprite: @@ -902,209 +1470,326 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - ld a,c - cp _datasp - jr z,skipworms + pop af ;cp (gametype),0 + jr z,skipstuff inc b ;multiplayer lvl inc b inc b ;skip other 3 worms (9 bytes) -skipworms: - ld a,b - add a,a - add a,b - ld b,a ;3x(balls+2) -skipballs: - inc hl - dnz skipballs - -skipflags: - ld a,(Gametype) - cp gamectf - jr nz,noflagstoskip - inc hl - inc hl - inc hl - inc hl -noflagstoskip: - +skipstuff: + add hl,de + inc hl ;3x(balls+2) + dnz skipstuff + sub gamerace ;a=(gametype) + jr z,skiplaps + dec a ;gamectf + jr nz,skipobjects + add hl,de +skiplaps: + add hl,de skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end - inc hl - inc hl - inc hl - inc hl + add hl,de + add hl,de jr skipobjects loadgamecar: -;in: (Gametype) -;out: Gametype+1=hl -;build: c=(gameCar)=(hl-1) +;in: (gametype) +;out: hl=dataTYPE +;build: c=(gamecar)=(hl-1) ; a=(wormbeglives)=(hl) ;destr: acdehl ld hl,datasingle - ld a,(Gametype) + ld a,(gametype) add a,a add a,a + add a,a ;8 bytes per mode ld e,a ld d,0 add hl,de ld a,(hl) - ld (gameCar),a + ld (gamecar),a ld c,a inc hl ld a,(hl) ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - cal loadgamecar - ld b,a ;psh a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - ld l,b ;pop a - ld h,0 ;hl=a - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),hl ;set limit - - cal loadgamecar ;nc - psh hl - ld a,(Gametype) ;4bytes -> 3bytes - add a,a ;3->2bytes - add a,24+1 ;go to datalevels - ld e,a ;=de - sbc hl,de ;datalevels +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 c,2 + ld (hl),c ;+wdelay=2 + inc hl + ld (hl),3 ;+lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ldir ;+head=+tail (2) + dec hl + dec hl + ld c,wormsize-tail ;=bc + ldir ;copy 15 bytes + dec a ;loop + jr nz,createwormsloop - ld a,c ;(gameCar) - and _datascore - jr nz,scorelimitset - dec a ;ld a,$FF ;=no_limit - ld (scorelimit),a -scorelimitset: +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype + cal hlatlevel + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,(gamecar) + rra ;and _datalink + jr nc,_StartLevel - cal _ldHLind ;ld hl,(hl) - pop de ;de=loadgamecar - inc de \ inc de - ld a,(de) ;(curlevel) - ld (Level),a - ld d,a ;begin level -skiplevelloop: - dec d ;levels to skip - jr z,levelsskipped - cal skiplevel - jr skiplevelloop -levelsskipped: +;--- link ---------------------------------------------------------------------- - psh hl ;1st level - ld a,c - and _datalink - jr z,GameOver +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow ld c,wormVhost cal Qsend - ld hl,txtWaiting + ld hl,txtWaitn cal _puts cal Crecv ld a,c cp wormVclient - jr z,client - cp wormVhost - jr nz,linkiniterror -host: - ld c,wormVclient - cal Qsend - ld a,$18 - jr multiplayer + jr nz,host -linkiniterror: - pop hl - jp DisplayMenu +;--- client -------------------------------------------------------------------- client: - ld hl,txtReceive - cal _puts - ld a,$E6 -multiplayer: - ld (SwapPos),a - ld a,2 - ld (nrworms),a +; ld hl,txtReceiv +; cal _puts ;shouldnt be necessary since this part always seems to work afaik + + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld e,worm3+wleft&255 + cal moveworm2 ;3=2 + ld l,worm1+name&255 + cal sendworm + ld l,worm2+wleft&255 + cal linkworm ;worm2+4 over link + pop hl ;loadgamecar + pop de ;leveldata + ld de,linklevel + ld hl,datalink + psh de + psh hl ;loadgamecar + ld b,8 + cal recvstuff ;game setup + ld hl,gametype ;+gamecar + ld b,2 + cal recvstuff ;transmit game + ex de,hl + ld b,168 + cal recvstuff ;level + ld d,b + cal loadtxtgame ;set CURtxtGame -;----------------------------- -;--------- game over --------- -;----------------------------- +_StartLevel: + jr StartLevel -GameOver: - ld a,%11000000 - out (7),a ;link normal - cal _clrLCD - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: - ex de,hl - ld bc,died - add hl,bc - ld (hl),0 ;died=0 +linkerror: + pop hl ;error + jp DisplayMenu ;return to menu + +;--- set/send worms ------------------------------------------------------------ + +moveworm2: + 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+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+wleft inc hl - ld (hl),0 ;score=0 + inc hl ;+name + ld b,9 + jp recvstuff +sendworm: ;hl=wormN+name + ld b,9 + cal sendstuff + ld bc,worm3-worm1-9 + add hl,bc ;worm(N+2)+name + ld b,9 + jp sendstuff + +;--- host ---------------------------------------------------------------------- + +host: + cp wormVhost + jr nz,linkerror + ld c,wormVclient + cal Qsend + + ;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 e,worm4+wleft&255 + cal moveworm2 ;4=2 + ld e,worm2+wleft&255 + ld hl,worm1+wleft + cal moveworm ;2=1 + ld l,worm1+wleft&255 + cal linkworm ;worm1+3 over link + ld l,worm2+name&255 + cal sendworm + pop hl ;loadgamecar + pop de ;leveldata + psh de + psh hl ;loadgamecar + ld b,8 + cal sendstuff ;setup + ld hl,gametype ;+gamecar + ld b,2 + cal sendstuff ;game + ex de,hl + ld b,168 + cal sendstuff ;level + +;--- load level ---------------------------------------------------------------- + +StartLevel: + pop hl ;loadgamecar + ld a,(hl) + ld (wormbeglives),a + inc hl ;nrworms + ld b,$11 ;=ignore (ld) + ld a,(hl) + cp 5 + jr c,teamset + sub 2 + ld b,$CD ;=continue (call) +teamset: + ld (nrworms),a + ld a,b + ld (doteam),a ;do team score (CD) or not (11) + inc hl ;level inc hl - ld (hl),0 ;score+1=0 + ld a,(hl) + ld (customspeed),a inc hl - ld (hl),2 ;delay=2 + ld a,(hl) + ld (growspeed),a + ld (turn),a inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop + ld l,(hl) + ld h,0 + ld a,(gamecar) + rla ;and _dataPmult + ld a,h ;(Left)=256 + jr nc,setscorelimit + ld a,l + ld l,h +setscorelimit: + ld (customleft),a + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl +Nextlevel: + cal _clrWindow pop hl ;begin of current level - -StartLevel: - ld de,Left ld a,(hl) inc a ;=255? - jp nz,nextlevel + jp nz,donextlevel + psh hl ld hl,Level dec (hl) ;curlevel-- (not beyond last lvl) - psh hl cal releasekeys - cal _clrWindow pop hl ;show end msg or smtn ld bc,Exit psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: - ldi +donextlevel: + ld de,gametype + ld a,(de) + or a ;gamesingle + psh af + 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 ;actual #peas + jr setnrpeas +;--!sp-- +customnrpeas: + cal skiplvltitle + ld a,0 +customleft =$-1 + +setnrpeas: + ld (Left),a + inc a + ld (lefttotal),a + inc hl ld de,Speed - ldi + ld a,0 +customspeed =$-1 + inc a ;$FF=def + jr nz,setspeed + ld a,(hl) ;speed from level + inc a +setspeed: + dec a + ld (de),a ;custom speed + inc hl ld de,peagrowth ldi - ld a,(hl) - ld (worm1+grow),a - 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 @@ -1117,10 +1802,14 @@ nextlevel: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defspritesz +#ifndef intlevels + ld a,42 ;always overwritten +#else + ld a,defsprsz +#endif defsprsize =$-1 defsprite =$+1 - ld de,defspriteimg + ld de,defspr setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -1145,34 +1834,43 @@ toobad_noballs: #endif ld hl,worm1 - ld a,(gameCar) - cp _datasp + pop af ;cp (gametype),0 ld b,1 jr z,worminit ld b,4 worminit: - psh bc ; >> 1 + 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 inc hl - ld (hl),a ;x2 + ld a,(growsize) + ld (hl),a ;+growL + inc hl + xor a + ld (hl),a ;+growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc - pop bc ; << 0k + pop bc ;<0 dnz worminit -;-------- draw level --------- + inc a ;ld a,1 + ld (turn10),a + ld (flashtime),a + +;--- draw level ---------------------------------------------------------------- +initlevel: ld a,(de) inc de sub 128 @@ -1191,29 +1889,23 @@ 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 + cal ldhl32a ex de,hl ld hl,ScrBuffer psh hl ; >> 1 psh de ; >> 2 ld de,ScrBuffer+1 - ld bc,63 + ld bc,63 ;first 2 rows ld (hl),%11111111 - ldir + ldir ;draw upper border inc hl - ld (hl),%11000000 + ld (hl),%11000000 ;first left border inc hl ld b,31 ClearLine: - ld (hl),c - inc hl + ld (hl),c ;=0 + inc hl ;clear rest of line dnz ClearLine psh hl ; >> 3 @@ -1225,12 +1917,12 @@ ClearLine: rra rra ld l,a - ld h,0 + ld h,c ;0 add hl,de pop af ; << 3 and %00000111 ld b,a - ld c,0 +; ld c,0 ld a,%11000000 jr z,NoVertShift VertShift: @@ -1252,50 +1944,55 @@ NoVertShift: pop hl ; << levelp - ld a,(Gametype) - cp gamectf - jr nz,noctf + ld a,(gametype) + cp gamerace ;or gamectf + jr c,levelhasbeensetup ld de,peaspos - ld bc,4 + ld c,2 ;ld bc,2 (2 bytes) + jr z,loadextralevelstuff ;cp gamerace + ld c,4 ;ld bc,4 (2nd flag in ctf) +loadextralevelstuff: ldir - psh hl - cal DrawAllPeas - pop hl -noctf: + ld a,1 ;draw delay + ld (drawctfpea1),a + ld (drawctfpea2),a +levelhasbeensetup: cal drawstuff -;----------------------------- +;--- prepare ------------------------------------------------------------------- +leveldone: psh hl ; >> levelp new - cal showstats - ld a,(gameCar) - and _datafood - jr z,nofood - cal NewPea + 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 ld hl,$FDE0 ld de,$FDE1 @@ -1310,35 +2007,26 @@ maskline: res 3,(iy+5) #endif - ld a,0 -gameCar =$-1 - and _datalink - jr z,initfinished ;no link - xor a - ld (Speed),a ;max.speed -SwapPos: ;$18 xx -> $E6 xx - ; jr xx -> and xx - jr sethost -setclient: - ld (worm1+left),a ;worm 1 via link - jr initfinished -sethost: - ld (worm2+left),a ;worm 2 via link -initfinished: - ld b,startdelay ReadyDelay: halt dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: - ld bc,(worm1+pos) - cal DisplayField + ld bc,(worm1+pos) ;camera worm #1 + ld a,(worm1+wleft) + or a ;if #1 not over link + jr nz,showfield + ld bc,(worm2+pos) ;otherwise view from #2 +showfield: + cal DisplayField ;display piece of level ld a,1 flashtime =$-1 @@ -1352,7 +2040,7 @@ screeninvertloop: ld (hl),a inc hl xor a - cp h + cp h ;end at >$FFFF jr nz,screeninvertloop noflash: @@ -1366,12 +2054,41 @@ Delay: jr nz,Delay NoDelay: - ld (handledworm),a ;=0 + ld (handledworm),a ;reset - ld a,0 -nrballs =$-1 - or a - cal nz,handlethoseneatlittleballs + ld hl,turn + ld a,(hl) + inc a ;-1 + jr z,nextturnok + dec (hl) + dec a ;>=0 + jr nz,nextturnok +growspeed =$+1 + ld (hl),$FF ;reset +nextturnok: + + ld a,(gamecar) + and _datatime + jr z,nodispupdate + ld hl,turn10 + dec (hl) + jr nz,nodispupdate ;just once every 10 turns + ld (hl),10 ;reset counter + cal forceshowstats ;update score +nodispupdate: + + ld a,(gametype) + cp gamectf + jr nz,noctfpeas2draw + ld de,drawctfpea1 + ld hl,(peaspos) + cal tryDrawPea ;pea#1 + ld de,drawctfpea2 + ld hl,(peaspos+2) + cal tryDrawPea ;pea#2 +noctfpeas2draw: + + cal handlethoseneatlittleballs ld ix,worm1 ld a,1 @@ -1384,92 +2101,148 @@ handleworms: add ix,bc pop bc ld hl,handledworm - inc (hl) ;1..nrworms + inc (hl) ;0..nrworms-1 dnz handleworms -;----------------------------- -;---------- keys ------------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _______ __ __ _______ +; |____/ |______ \_/ |______ +; | \_ |______ | ______| +;_______________________________________________________________________________ HandleKeys: ld a,%10111111 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 -WormDead: -#ifdef invincible - jp stopworm -#else - 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 - inc hl - ld a,(hl) - ld (ix+pos+1),a +;--- pause menu ---------------------------------------------------------------- + +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 - cal 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,(gameCar) - and _datalivel - ret z - 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 ld sp,0 ;pop all SpSave = $-2 - ld a,D0HD1H - out (7),a + ld a,D0LD1L + out (7),a ;both wires low = game over signal cal _clrWindow +#ifdef coolzgfx + ld de,$FC30 ;(0,1) + ld hl,wtWormy + ld bc,16*7 + ldir + ld hl,$FC10 + ld b,16*11 + cal menuinvloop ;invert + ld hl,$FC00+$180 + cal hr ;menuinvloop w/ b=16 + ld hl,$FC00+$E0 + cal hr + ld hl,_curRow + ld (hl),2 +#else ld hl,txtGO cal _puts ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert - inc h ;$FD80 - ld b,16 - cal menuinvloop ;