From: Mischa Poslawsky Date: Sat, 31 Mar 2001 11:17:46 +0000 (+0200) Subject: wormy 0.93.1331: overhaul levelset selection X-Git-Url: http://git.shiar.nl/wormy.git/commitdiff_plain/0e077b916a6dd54a2d1140fdcfea5c783e4961cd?hp=8aa829049fcbeef7cca5d0c8fa61ad5312e3c245 wormy 0.93.1331: overhaul levelset selection - minor input-related changes - horizontal line objects - faster if compiled with horizontal line routine (circles too) - improve episode select screen (list options vertically) --- diff --git a/wormy.z80 b/wormy.z80 index e76ab01..447f511 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -41,6 +41,7 @@ #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 =) @@ -81,6 +82,7 @@ _load_ram_ahl = $462F ;ahl->page+hl _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 ------- @@ -187,7 +189,7 @@ Start: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start - ld bc,templevels + ld ix,templevels searchloop: ld de,(_PTEMP_END+1) ;VAT end or a ;nc @@ -199,20 +201,17 @@ searchloop: cp $0C ;string jr z,stringfound searchnext: - cal _RAM_PAGE_7 pop hl dec hl ;5x dec hl dec hl dec hl dec hl - psh bc ld b,(hl) ;name size inc b skipname: dec hl dnz skipname - pop bc jr searchloop stringfound: @@ -225,23 +224,23 @@ stringfound: ex de,hl ;ld ahl,(hl) cal _AHL_PLUS_2_PG3 ;string id cal _Get_Word_ahl ;ld de,(ahl) - cal _RAM_PAGE_1 - ld (bc),a + ld (ix),a ld a,levelhead cp e - jr nz,searchnext ;not worm + jr nz,_searchnext ;not worm ld a,levelhead2 cp d - jr nz,searchnext - - inc bc - ld a,h - ld (bc),a - inc bc - ld a,l - ld (bc),a - inc bc - jr searchnext + 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 +_searchnext: + cal _RAM_PAGE_7 + jr searchnext loadgametype: psh de @@ -266,70 +265,115 @@ defaultlevels: ret searchcomplete: - cal _RAM_PAGE_1 ld a,255 - ld (bc),a ;end mark + ld (ix),a ;end mark + + cal _clrWindow ld hl,templevels-3 -dispnextlevel: - cal _RAM_PAGE_1 psh hl - cal _clrWindow - ld a,2 - ld (_curRow),a + ld hl,$0020 + ld (_penCol),hl ld hl,txtLevsel - cal _puts ;"< Select levels: >" - ld hl,$0004 - ld (_curRow),hl + cal _vputs ;"< Select levels: >" + ld hl,$0601 ;x=1 + ld (_penCol),hl pop hl +dispnextlevel: ld a,(hl) - cp 255 ;&& - jr nz,displevel - ld hl,templevels-3 - 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 ;ade=(hl) - psh hl ;HL - ld c,a - ld h,d - ld l,e ;cde=ahl=(hl) + inc hl + psh hl + ex de,hl ;ahl=ade=(hl) cal _load_ram_ahl ;hl=ahl ld b,(hl) ;b=title size - psh bc - cal _putps ;destr=abchl - pop bc ;cde=hl - pop hl ;HL + cal _vputs + 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 + 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 - psh hl - psh de + halt \ halt psh bc cal GET_KEY - pop bc - pop de - pop hl - cp K_RIGHT - jr z,dispnextlevel - sub K_SECOND + 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 - dec a ;K_EXIT + cp K_EXIT-1 ret z - cp K_ENTER-K_EXIT+256 + cp K_ENTER-1 jr nz,levselect +; jr z,loadlevel loadlevel: - ld a,c + ld a,b + add a,3 ;sellev+3 (#0==-3) + ld e,a + add a,a ;*2 + 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 - ex de,hl ;ahl=cde - inc b ;b=titlesize+1 + inc hl + ld d,(hl) + inc hl + ld e,(hl) + ex de,hl ;ahl=ade skiptitle: - cal _INC_PTR_AHL - dnz skiptitle + ld b,a ;psh ahl + psh hl + cal _GETB_AHL ;ld a,(ahl) + pop hl + or a + ld a,b ;pop ahl + psh af + cal _INC_PTR_AHL ;ahl++ + pop af ;cp 0 + jr nz,skiptitle ;goto #0-terminator cal _Get_Word_ahl ld (leveldataSize),de @@ -366,6 +410,16 @@ levelloaded: ld a,r ld (Seed),a + ld hl,datasingle+3 + ld b,8 +setdeflevels: + ld (hl),1 ;def=level#1 + inc hl + inc hl + inc hl + inc hl + dnz setdeflevels + ;----------------------------- ;----- build trig tables ----- ;----------------------------- @@ -417,7 +471,7 @@ dispmenuloop: dnz dispmenuloop ld b,0 ;b=menu# - jr setgame ;> dispmenusets > mainMenu + jr _dispmenusets ;mainMenu ;--- menu loop --- @@ -467,7 +521,7 @@ changecurworm: inc a changedcurworm: ld (curworm),a - jp dispmenusets ;mainMenu + jr _dispmenusets ;mainMenu selleft: ld a,b @@ -499,6 +553,7 @@ changenrworms: jr nc,mainMenu ;may not be >4 changednrworms: ld (hl),a +_dispmenusets: jr dispmenusets ;mainMenu bchangenrworms: ;hl=nrworms @@ -515,9 +570,6 @@ Gametype =$-1 changedgame: and 7 ;mod 8 ld (Gametype),a -setgame: - ld a,1 - ld (curlevel),a ;reset level# jr dispmenusets ;mainMenu bchangegame: ld a,(Gametype) @@ -548,22 +600,24 @@ changelivesInit: 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 - ld d,(hl) ;max level for sel.game -curlevel =$+1 - ld a,1 - cp d + cp (hl) ;max level for sel.game + pop hl jr z,_mainMenu inc a changedlevel: - ld (curlevel),a + ld (hl),a jr dispmenusets ;mainMenu bchangelevel: - ld a,(curlevel) + inc hl + ld a,(hl) ;(curlevel) dec a jr nz,changedlevel jr _mainMenu @@ -623,11 +677,6 @@ clroldsetsloop: ld (CURtxtGame),hl ;save for g/o cal _vputs ;Singleplayer - ld hl,$1E3E ;level - ld (_penCol),hl - ld a,(curlevel) - cal cshowA - cal loadgamecar psh hl ld hl,$243E @@ -647,10 +696,18 @@ limitok: ld (_penCol),hl pop hl ;cal loadgamecar inc hl + psh hl ld a,(hl) add a,'0' cal _vputmap + ld hl,$1E3E ;level + ld (_penCol),hl + pop hl ;loadgamecar; hl++ + inc hl + ld a,(hl) ;(curlevel) + cal cshowA + ld hl,$3032 ld (_penCol),hl ld a,1 @@ -889,9 +946,8 @@ loadgamecar: ;destr: acdehl ld hl,datasingle ld a,(Gametype) - ld e,a add a,a - add a,e + add a,a ld e,a ld d,0 add hl,de @@ -922,7 +978,9 @@ LetsGetThisPartyOn: ld (scorelimit),hl ;set limit cal loadgamecar ;nc - ld a,(Gametype) ;3bytes -> 2bytes + 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 @@ -935,7 +993,9 @@ LetsGetThisPartyOn: scorelimitset: cal _ldHLind ;ld hl,(hl) - ld a,(curlevel) + pop de ;de=loadgamecar + inc de \ inc de + ld a,(de) ;(curlevel) ld (Level),a ld d,a ;begin level skiplevelloop: @@ -1021,6 +1081,8 @@ StartLevel: inc a ;=255? jp nz,nextlevel + ld hl,Level + dec (hl) ;curlevel-- (not beyond last lvl) psh hl cal releasekeys cal _clrWindow @@ -1114,13 +1176,21 @@ worminit: ld a,(de) inc de sub 128 + jr nc,setfieldx + xor a ;fieldx<128 +setfieldx: ld (FieldWidth),a ld a,(de) inc de + ld l,a sub 57 + jr nc,setfieldy + xor a ;fieldy<57 +setfieldy: ld (FieldHeight),a - add a,57-5 psh de ; >> levelp + ld a,l ;pop + sub 5 ld l,a ld h,0 add hl,hl @@ -1469,7 +1539,7 @@ checkhilevel: ld a,(Level) cp (hl) jr c,hilevelcheckdone - ld (hl),a ;save local + ld (hl),a ;save local ld c,a ld a,0 hilvlposa =$-1 @@ -2760,7 +2830,13 @@ drawstuff: dec a ;3 = box cal z,drawbox dec a ;4 = circle - cal z,circle + cal z,drawcircle + dec a ;5 = hline +#ifdef hlines + cal z,drawhline +#else + cal z,drawline +#endif pop hl inc hl @@ -2768,6 +2844,36 @@ drawstuff: drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y +#ifdef hlines +boxloop: + cal drawhline + inc e + dnz boxloop + ret +drawhline: ;(d,e)-(h,e) + psh bc + ld b,d + ld c,e + psh hl + cal FindPixel + ld c,a ;starting mask + ld a,h + sub b + ld b,a + inc b ;1+x2-x1 +hlineloop: + ld a,(hl) + or c + ld (hl),a + rrc c ;mask >> + jr nc,hlinenext + inc hl ;next byte +hlinenext: + dnz hlineloop + pop hl + pop bc + ret +#else ld l,e boxloop: cal drawline @@ -2775,6 +2881,7 @@ boxloop: inc e dnz boxloop ret +#endif drawfatline: cal drawline @@ -2791,8 +2898,8 @@ drawfatline: ;LINE (d,e)-(h,l) ;destroyes a -drawline: - psh bc +drawline: ;(d,e)-(h,l) + psh bc ;destr: a psh hl psh de ld a,d @@ -2892,10 +2999,7 @@ line4sm: dnz LineLoopSteep jr DoneLine -;CIRCLE (d,e),h -;destroyes ? - -circle: ;de=x,y; h=z +drawcircle: ;(d,e),h ;de=x,y; h=z ld c,h ;c=yy=z ld a,h neg @@ -2969,6 +3073,10 @@ circledraw: ;destr:de ;every other link game out there. However, these are commented :) losses: .dw 0 Csend: + ld b,32 +csendwait: + nop + dnz csendwait cal Qsend jr c,Csend ret @@ -3027,7 +3135,7 @@ receiveloop: waitreceive: call linktimer in a,(7) - and %00000011 + and %11 cp 3 ;if bits 0 and 1 set, both wires are high jr z,waitreceive ;wait for one of the wires to go low rra ;check red wire status @@ -3041,7 +3149,7 @@ selected2: waitreceive2: call linktimer in a,(7) - and %00000011 + and %11 jr z,waitreceive2 ;wait for the wire we didn't lower to go high again (the other will remain low) ld a,%11000000 ;$c0 out (7),a ;raise both wires since the other calc will have given the ok sign @@ -3328,7 +3436,7 @@ _datascore = %10000000 ;score>=100 limit _datamultpeas = %00100000 _datasp = %01011110 -datalevels: .dw LevelDef, LevelDefT +datalevels: .dw LevelDef, LevelDefM .dw LevelDefT,LevelDefM .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefC @@ -3337,36 +3445,36 @@ nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults savestart: gamesingle = 0 -datasingle: .db %01011110,3,1 ;3 lives (