Code: Select all
POKE q,1
Code: Select all
POKE q,1
To fix this bug, change the start position from (8,85) to (8,84).patters wrote: ↑Tue Jul 30, 2019 12:31 pm There is one slight edge case to my game. In order to keep the action reasonably fast I DRAW the line in increments of two pixels rather than PLOTing each point. Since the attributes are only checked every two pixels of line it's possible for the line to clip across the corner pixel of an obstacle and turn it blue without a collision. A necessary design compromise though...
How did I not see that.Einar Saukas wrote: ↑Tue Jul 30, 2019 8:17 pm To fix this bug, change the start position from (8,85) to (8,84).
Thanks!
I think it would look good to use the hash sign '#', but setting a different PAPER instead of INK.
Another idea is to use either hash sign '#' or capital 'O', setting PAPER 1 and a different INK. It will give the impression there's a faint force field around each obstacle. This way, these obstacles won't look as blocky, but the collision will always seem correct.Einar Saukas wrote: ↑Tue Jul 30, 2019 10:04 pm I think it would look good to use the hash sign '#', but setting a different PAPER instead of INK.
Code: Select all
FOR l=1 TO 20:
POKE 23693,65:
BORDER 0:
CLS :
INK 2:
PLOT 2,170:
FOR n=0 TO 1:
DRAW 247,0:
DRAW 0,n+n-164:
DRAW n+n-248,0:
DRAW 0,163:
NEXT n:
PRINT INK 3;"LEVEL ";l:
FOR n=9+(l>9) TO 12-(l>9):
PRINT AT n,31; INK 1;" ":
NEXT n:
INK RND*4+3.5:
FOR n=0 TO l*3+20:
PRINT AT RND*18+1.5,RND*26+3.5;"*":
BEEP .0001,60:
NEXT n:
INK 8:
LET y=85:
PLOT 8,y:
FOR x=5 TO 125:
LET k=4*(INKEY$<>"")-2:
LET y=y+k: POKE 23620*POINT (2*x,y),34:
DRAW 2,k:
NEXT x:
BEEP .01,20:
BEEP .01,30:
NEXT l:
DIM a$(32):
BRIGHT 0:
INK 1+5*(l=21):
FOR n=0 TO 6:
BEEP .005,20-5*n:
NEXT n:
FOR n=0 TO 10:
PRINT AT n,0; OVER 1;a$;AT 21-n,0;a$:
NEXT n:
PRINT AT 10,n; INK 7;"GAME OVER" AND l<21;"WELL DONE" AND l=21
Code: Select all
READ p,q,e,l,d$:
FOR d=0 TO 2:
POKE q,65:
BORDER 0:
CLS :
INK 2:
PLOT 2,170:
FOR n=0 TO 1:
DRAW 247,0:
DRAW 0,n+n-164:
DRAW n+n-248,0:
DRAW 0,163:
NEXT n:
PRINT INK 3;"LEVEL ";l:
FOR n=9+(l>9) TO 12-(l>9):
PRINT AT n,31; INK 1;" ";AT 20,29+d;d$( TO 2-d):
NEXT n:
INK RND*4+3.5:
FOR n=0 TO l*3+e:
PRINT AT RND*18+1.5,RND*26+3.5;"*":
NEXT n:
INK 8:
LET y=85:
PLOT 8,y:
FOR x=5 TO 125:
LET k=4*(INKEY$<>"")-2:
LET y=y+k:
POKE p*POINT (2*x,y),34:
DRAW 2,k:
NEXT x:
LET l=l+1:
BEEP .02,30:
POKE p,3+33*(l=e):
BEEP .2,-e:
NEXT d:
DIM a$(32):
INK 1+5*(l=e):
FOR n=0 TO 10:
PRINT AT n,0; OVER 1;a$;AT 21-n,0;a$:
NEXT n:
PRINT AT 10,n; INK 7;"GAME OVER" AND l<e;"WELL DONE" AND l=e:
DATA 23620,p+73,21,1,"//"
I have play tested it a lot and I think it's fine. The border lines are two pixels thick, and the stars don't really have corners to skip though if you're on a diagonal trajectory. Basically if you're going to clip the star at all you'll hit it with the subsequent pixel - mainly because of the current grid alignment (which can only change by 2 units at a time). Give it a try. I just updated the latest version btw. Had some issues with it which are now resolved, but it's been tricky to get it back under the one screen limit.
Updated again to combine the creation of the gate into the red playfield outline loop. Is there a tighter way to encode these DRAW operations I wonder...
Code: Select all
READ p,q,e,l,d$:
FOR d=0 TO 2:
POKE q,65:
BORDER 0:
CLS :
INK 2:
LET g=8*(l>9)
PLOT 2,170:
FOR n=0 TO 1:
DRAW 247,0:
DRAW 0,n-66-g:
PLOT 249-n,71+g:
DRAW 0,n-65-g:
DRAW n+n-248,0:
DRAW 0,163:
NEXT n:
PRINT INK 3;"LEVEL ";l;AT 20,29+d; INK 1;d$( TO 2-d):
INK RND*4+3.5:
FOR n=0 TO l*3+e:
PRINT AT RND*18+1.5,RND*26+3.5;"*":
NEXT n:
INK 8:
LET y=85:
PLOT 8,y:
FOR x=5 TO 125:
LET k=4*(INKEY$<>"")-2:
LET y=y+k:
POKE p*POINT (2*x,y),34:
DRAW 2,k:
NEXT x:
LET l=l+1:
BEEP .02,30:
POKE p,3+33*(l=e):
BEEP .2,-e:
NEXT d:
DIM a$(32):
INK 1+5*(l=e):
FOR n=0 TO 10:
PRINT AT n,0; OVER 1;a$;AT e-n,0;a$:
NEXT n:
PRINT AT 10,n; INK 7;"GAME OVER" AND l<e;"WELL DONE" AND l=e:
DATA 23620,p+73,21,1,"//"
Code: Select all
FOR d=0 TO 2: ... PRINT INK 3;"LEVEL ";l;AT 20,29+d; INK 1;d$( TO 2-d)
Code: Select all
FOR d=1 TO 3: ... PRINT INK 3;"LEVEL ";l;AT 20,28+d; INK 1;d$(d TO )
Code: Select all
FOR d=1 TO 3: ... PRINT INK 3;"LEVEL ";l;AT 20,28+d;d$(d TO )
Code: Select all
PRINT AT RND*18+1.5,RND*26+3.5;"*"
Code: Select all
PRINT AT RND*17+2,RND*25+4;"*"
Code: Select all
PRINT AT RND*17+2,RND*27+3;"*"
Code: Select all
POKE p*POINT (2*x,y),34
Code: Select all
POKE p*POINT (x+x,y),34
To produce exactly the same red outline, replace this:
Code: Select all
LET g=8*(l>9): PLOT 2,170: FOR n=0 TO 1: DRAW 247,0: DRAW 0,n-66-g: PLOT 249-n,71+g: DRAW 0,n-65-g: DRAW n+n-248,0: DRAW 0,163: NEXT n
Code: Select all
LET g=8*(l>9): FOR n=0 TO 1: PLOT 249-n,71+g: DRAW 0,n-65-g: DRAW n+n-248,0: DRAW 0,163: DRAW 247,0: DRAW 0,-n-65-g: NEXT n
Code: Select all
FOR n=0 TO 1: PLOT 249-n,63+l: DRAW 0,n-57-l: DRAW n+n-248,0: DRAW 0,163: DRAW 247,0: DRAW 0,-n-57-l: NEXT n
Code: Select all
READ p,q,e,l,d$: ... POKE q,65: ... DATA 23620,p+73,21,1,"//"
Code: Select all
READ p,e,l,d$: ... POKE p+73,65: ... DATA 23620,21,1,"//"
This is original code from 1996 which I had missed.Einar Saukas wrote: ↑Tue Jul 30, 2019 5:23 pmDon't use parenthesis unless really necessary. For instance, you can save 2 characters replacing...
This is a great improvement because it means the game no longer needs instructions. To cover the only remaining non-intuitive aspect, I had wondered about putting LEVEL x/20 at the top left, to make it clear that there is a goal, but in my opinion it spoils the clean presentation.Einar Saukas wrote: ↑Tue Jul 30, 2019 5:23 pmThis way, users would be able to play the game using whatever key they prefer.
I hadn't tried that but I agree, now there's a consistent design for HUD elements. I had suspected it wouldn't be obvious what the slashes referred to, but this does look better, and it's very clear.Einar Saukas wrote: ↑Wed Jul 31, 2019 7:49 pmHowever the lives indicator looks much better using INK 3
Yes this is better because star placement in that first and last column can spoil levels making success more dependent on luck than skill alone. This mitigates that effect.Einar Saukas wrote: ↑Wed Jul 31, 2019 8:10 pmIt won't work exactly the same way, since the incidence of stars in the first and last rows, also first and last columns, will be reduced by 50%. But I think it looks even better this way. It looks good to have a higher concentration of stars closer to the center of the galaxy, not as many stars near the edge...
I also spent some time coding that then I realised it results in quite significant red colour clash (more so than for the obstacles). Also I saw some collision detection issues relating to the grid alignment and only checking every 2 pixels of line progression, so this deterred me from implementing. I didn't really like that the gate has to start a fair bit wider without resorting to some scaling, which would add characters.Einar Saukas wrote: ↑Wed Jul 31, 2019 9:40 pmHowever, gameplay works much better if the gate becomes gradually narrower after each level, instead of reducing size only once at level 10. This change will also make this code a lot shorter.
Code: Select all
READ p,e,l,d$:
FOR d=1 TO 3:
POKE p+73,65:
BORDER 0:
CLS :
INK 2:
LET g=8*(l>9):
FOR n=0 TO 1:
PLOT 249-n,71+g:
DRAW 0,n-65-g:
DRAW n+n-248,0:
DRAW 0,163:
DRAW 247,0:
DRAW 0,-n-65-g:
NEXT n:
PRINT INK 3;"LEVEL ";l;AT 20,28+d;d$(d TO ):
INK RND*4+3.5:
FOR n=-e TO l*3:
PRINT AT RND*17+2,RND*25+4;"*":
BEEP .0001,60:
NEXT n:
INK 8:
LET y=85:
PLOT 8,y:
FOR x=5 TO 125:
LET k=4*(INKEY$<>"")-2:
LET y=y+k:
POKE p*POINT (x+x,y),35:
DRAW 2,k:
NEXT x:
LET l=l+1:
BEEP .01,20:
BEEP .01,30:
POKE p,3+34*(l=e):
BEEP .2,-20:
NEXT d:
DIM a$(32):
INK 1+5*(l=e):
FOR n=0 TO 10:
PRINT AT n,0; OVER 1;a$;AT e-n,0;a$:
NEXT n:
PRINT AT 10,n; INK 7;"GAME OVER" AND l<e;"WELL DONE" AND l=e:
DATA 23620,21,1,"//"
Thanks. High praise indeed
Both problems can be solved also replacing this:patters wrote: ↑Wed Jul 31, 2019 11:04 pmI also spent some time coding that then I realised it results in quite significant red colour clash (more so than for the obstacles). Also I saw some collision detection issues relating to the grid alignment and only checking every 2 pixels of line progression, so this deterred me from implementing.Einar Saukas wrote: ↑Wed Jul 31, 2019 9:40 pmHowever, gameplay works much better if the gate becomes gradually narrower after each level, instead of reducing size only once at level 10. This change will also make this code a lot shorter.
Code: Select all
FOR x=5 TO 125
Code: Select all
FOR x=5 TO 124
Again, it's non-intuitive because many players won't read the instructions, they will assume the game doesn't have an ending so they won't persevere to finish it.patters wrote: ↑Wed Jul 31, 2019 11:04 pm This is a great improvement because it means the game no longer needs instructions. To cover the only remaining non-intuitive aspect, I had wondered about putting LEVEL x/20 at the top left, to make it clear that there is a goal, but in my opinion it spoils the clean presentation.
It will make the game more accessible in the beginning, and more challenging in the end. I don't think that's a bad thing.
You are welcome!
I'm sure we can save a few more characters, so you can add a second BEEP. How much more space do you need?patters wrote: ↑Wed Jul 31, 2019 11:04 pm I have been able to reinstate the satisfying pattering sound of the obstacle placement and the level-up plink sound, which I think are actually quite catchy elements of the game. The only thing I'm not entirely happy with now is the death sound. I need it to be long enough you can see how you died before the screen is redrawn (without relying on a PAUSE), and I want it to be an irritating sound to contrast the nicer sounds. However, a single tone doesn't seem enough...
Code: Select all
READ p,e,l,d$: ... FOR n=0 TO 1: PLOT 249-n,63+l: DRAW 0,n-57-l: DRAW n+n-248,0: DRAW 0,163: DRAW 247,0: DRAW 0,-n-57-l: NEXT n: ... DATA 23620,21,1,"//"
Code: Select all
READ p,l,d$: ... FOR e=19 TO 20: PLOT 268-e,63+l: DRAW 0,e-76-l: DRAW e+e-286,0: DRAW 0,163: DRAW 247,0: DRAW 0,-e-38-l: NEXT e: ... DATA 23620,1,"//"
Code: Select all
READ p,l,d$: ... POKE p+73,65: ... PRINT ... AT 20,28+d;d$(d TO ): ... POKE p*POINT (x+x,y),35: ... POKE p,3+34*(l=e): DATA 23620,1,"//"
Code: Select all
LET l=1: ... POKE 23693,65: ... PRINT ... AT 20,28+d;"//"(d TO ): ... POKE 23620*POINT (x+x,y),35: ... POKE 23620,3+34*(l=e)
Code: Select all
LET g=INT (l/2)