https://bunsen.itch.io/5-tides-at-the-p ... er-by-fued
edit:post needs images!!

Game is joystick controlled (left). Your goal is to collect the purple oysters as fast you can before the tide kicks in.
There are 5 tides, go for the highest score. Your player can jump with a button press, keep it for when it is REALLY needed

The game has in-action music, I did a sort of music player to rock a fast note every loop, seems to work fine.
I will bring that and the main player/collision system to another post later.
Here is the non-10liner source code with comments. Since it was done in a bit of a hurry, the comments are mixed in english and portuguese

Code: Select all
'Cinco Marés na Praia da Ostra Purpura - 10 liner contest
'--------------------------------------------------------
GOSUB co :'Constants
bo:
'---VARIABLES
DIM d(30) WITH 159:z=0 :'30 characters line yellow, Tide height
t=0:u=0 :'Time variable for loops -SYS
pf=128:pp=1108:pl=pp:pt=0:pj=0 :'Player state, frame, Pos, Last pos, queda, jump
o=0:s=0:w=0:'n=0 :'Joy jx/jy, Oyster flag, score, wave, n TEM CHAO?
x=0:y=0:v=0 :'M.cursor, M.speed, M.on/off
'---TITLE
EMPTYTILE=c:CLS :'Clear screen blue
WHILE t<512:POKE 1024+t,a:POKE 1055+t,a:t=t+32:WEND :'Borda
DO
FOR t=0 TO 29:POKE 1025+t+z,d(t):NEXT:z=z+32 :'Draw yellow line and advance
IF z=96 THEN GOSUB dn :'At sea level: add top dune
IF z=128 THEN :'Draw title, score, player, PAUSE
POKE 1108,a:WAIT 999 MS :'fim da picada!
PRINT @161,"5 TIDES AT PURPLE OYSTER BEACH"
IF h>0 THEN PRINT @225,"HS:";h;" LS:";l
WHILE FIRE(0)=0 :'FIRE TO START GAME
GOSUB m :'Play MUSIC
WEND
x=32:y=0 :'Choose next MUSIC Suaveee
ENDIF
'---GENERATOR
wa:
IF z>127 THEN :'WATER DOWN
u=RND(26) :'Choose a position in a line
IF PEEK(994+z+u)=b AND z>=160 THEN :'Check if oyster can pop in, lower than 2nd base
POKE 994+z+u,f :'GENERATE OYSTER
ENDIF
FOR t=0 TO 4 :'FILL SAND 2 to 5 blocks
d(u+t)=e :'Add SAND
IF t=1 OR t=3 THEN
EXIT IF RND(5)=0
ENDIF
NEXT:BOOM 300 :'WAIT Sound of water down
ENDIF
IF z=480 THEN
FILL d WITH 255 :'Fill the beach with sand
FOR t=0 TO 9 :'Fill floor with oysters
u=RND(30)
IF PEEK (993+z+u)=b THEN POKE 993+z+u,f :'GENERATE OYSTER
NEXT
ENDIF
IF z=512 THEN:t=0:u=0:EXIT:ENDIF :'START GAME reset variables
LOOP
PRINT@31,w+1: :'DISPLAY WAVE COUNT
'----------------------------------------------------------------------------------------LOOP
DO
'---PLAYER---JOYSTICK CATCH/PREPARE
jx=JOYX(0):jy=JOYY(0):jx=jx/20:jy=(jy/20)*32
'---PLAYER---DEATH SEQUENCE WATER TOUCH (local que se encontra)
IF PEEK(pp+32)=c THEN :'If lower block WATER make DEATH SEQUENCE
POKE pp,b:FOR t=129 TO 175:POKE pp+32,t:BELL 35,30:NEXT
GOSUB sc :'DEAL SCORE
GOTO bo :'Return to BOOT
ENDIF
'---PLAYER---COLLISION TO SAND WITH JOYSTICK (local que quer se MOVER)
IF PEEK(pp+jx+jy)<>b THEN :'Not moving into yellow air? Só move yellow air
IF PEEK(pp+jy)=b OR PEEK(pp+jy)=f THEN :'Up or down free/oyster?
jx=0 :'Kill motions (keep diagonals)
ELSE
IF PEEK(pp+jx)=b OR PEEK(pp+jx)=f THEN :'Left or right free/oyster?
jy=0 :'Kill motions (keep diagonals)
ELSE
jx=0:jy=0 :'Kill all motions
ENDIF
ENDIF
ENDIF
'---PLAYER---COLLISION AREIA DA METADE PRA BAIXO / GRAVITY (local que se encontra)
IF PEEK(pp-1)<>e AND PEEK(pp+1)<>e THEN :'CAINDO: No side dune walls?
IF PEEK(pp+31)<>e AND PEEK(pp+33)<>e THEN :'CAINDO: Not even side under?
IF PEEK(pp+32)=b OR PEEK(pp+32)=f THEN :'CAINDO: yellow or oyster?
jy=32:pt=2 :'Apply GRAVITY / Set LAND
ENDIF
ENDIF
ENDIF
'---PLAYER---BLOCK SMALL JUMP UP (local que se encontra)
IF jy<0 THEN :'If joy up
IF PEEK(pp-1)<>e AND PEEK(pp+1)<>e THEN jy=0 :'Zera joy Y se nao for laranja laterais
ENDIF
'---PLAYER---JUMP (local que se encontra)(dune eater)
IF FIRE(0)=-1 AND pj=0 AND pt=0 THEN :'Button pressed, only if no pj pt bm
GOSUB nc:IF n=1 THEN
pj=1 :'Se tem areia da metade pra baixo > JUMP
pf=156
BELL 30,50:BELL 50,50:BELL 30,50:BELL 50,50 :'SOUND
ENDIF
ENDIF
IF pj>=1 THEN :'JUMP procedure
INC pj
IF pj<4 THEN:jx=0:jy=0:ENDIF
IF pj=4 THEN:BELL 30,50:BELL 60,50:BELL 30,50:BELL 60,50:ENDIF :'SOUND
IF pj>3 THEN:jy=-32:pf=128:ENDIF
IF pj>6 THEN jy=0
If pj>9 THEN:pj=0:pt=0:ENDIF :'end jump reset fall timer
IF PEEK(pp+jx)=e THEN jx=0 :'Control hor top dune jump eater CHECK JOY INTENTION
ENDIF
IF pp+jy<1024 THEN jy=0 :'Kill player if jump out of screen
'---PLAYER---CAINDO PARA LANDING - DETECTING (local que se encontra)
IF pt>0 THEN :'Esta caindo
GOSUB nc:IF n=1 THEN
DEC pt :'Se tem areia da metade pra baixo > LAND
IF pt=1 THEN
BELL 50,50:BELL 45,50:BELL 40,50:BELL 35,50:pf=156:jx=0:jy=0 :'SOUND
ENDIF
IF pt=0 THEN pf=128
ENDIF
ENDIF
'---PLAYER---DETECT OYSTER COLLECT (local que vai se MOVER)
IF PEEK(pp+jx+jy)=f THEN:o=1:s=s+1:PRINT @0,s:ENDIF :'SCORE DISPLAY
IF o>=1 THEN :'COLLECT OYSTER, sound and player flash
BELL 20,100:BELL 30,100:BELL 40,100
BELL 50,100:BELL 60,100
o=0
ENDIF
'---PLAYER---APPLY MOTION AND DRAW PLAYER
pl=pp
pp=pp+jx+jy
IF pp<>pl THEN POKE pl,b :'DRAW PLAYER bkg
POKE pp,pf :'DRAW PLAYER
'---WAVES
INC t
IF t>=100-w*20 THEN :'WAVE FLOW based on wave 75
IF t=100-w*20 THEN:u=1534:x=48:y=0:ENDIF :'Position first wave
u=u-2 :'Move wave left
IF u=1504 THEN:GOSUB cl:u=1468:ENDIF :'CLEAN WAVE Left over/set uprestart
IF u=1440 THEN:GOSUB cl:u=1404:ENDIF
IF u=1376 THEN:GOSUB cl:u=1340:ENDIF
IF u=1312 THEN:GOSUB cl:u=1276:ENDIF
IF u=1248 THEN:GOSUB cl:u=1212:ENDIF :'SOUND
IF u=1184 THEN :'WAVE OVER
GOSUB cl
x=32:y=0 :'Choose next MUSIC Suaveee
z=128:INC w:GOSUB dn :'RESET wave height, increase wave count
IF w=5 THEN: :'GAME WON
x=64:y=0 :'Choose next MUSIC Suaveee
WHILE x<97
GOSUB m
WEND
GOSUB sc :'DEAL SCORE
GOTO bo :'Return to BOOT
ENDIF
GOTO wa :'goto Wave generator
ENDIF
POKE u,207:POKE u+1,207:POKE u+2,c :'WAVE DRAW
POKE u-32,207:POKE u-31,207:POKE u-30,c
IF u<>1532 AND u<>1468 AND u<>1404 AND u<>1340 AND u<>1276 AND u<>1212 THEN
POKE u+3,c:POKE u-29,c :'Other tail
ENDIF
ENDIF
GOSUB m :'Play MUSIC
LOOP
'---SUBS
co: :'SUB CONSTANTS
l=-1:h=0 :'Last score/high score
a=128:b=159:c=175:e=255:f=239 :'Cores preto,amarelo,azul,laranja,purpura
DIM m(96)=#{6,6,0,6,0,6,6,0,5,1,2,3,6,2,3,2,_
5,1,2,3,6,1,7,1,5,7,7,7,6,3,2,1,_
1,1,0,5,0,1,1,0,0,0,0,0,0,0,0,0,_
3,3,3,3,6,4,4,4,4,4,5,4,6,4,4,4,_
5,0,6,6,0,5,0,1,2,4,3,0,0,0,5,6,_
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
RETURN
m: :'SUB MUSIC
IF y=0 THEN :'INSTRUMENTS
IF m(x)=0 THEN WAIT 75 MS :'Silence !!! SEMPRE TEM AJUSTAR POR CONTA DA MSK
IF m(x)>0 AND m(x)<5 THEN :'BASS 4 notes
BELL 14+m(x)*2,500
ENDIF
IF m(x)=5 THEN :'Drums Low
BELL 40,100:BELL 35,100:BELL 30,100
BELL 25,100:BELL 20,100
ENDIF
IF m(x)=6 THEN :'Drums High
BELL 15,100:BELL 45,100:BELL 15,100
BELL 40,100:BELL 12,100
ENDIF
IF m(x)=7 THEN :'Bass RND Solo
BELL 14+RND(16),500
ENDIF
'---MUSIC BLOCK AUTO LIMITS
INC x :'Note Advancer
IF x=32 THEN x=16 :'Title
IF x=48 THEN x=32 :'Low tide
IF x=64 THEN x=48 :'Rising tide
IF x>79 THEN y=1 :'Victory (Kill music)
ELSE
WAIT 75 MS :' NEW HOLDER IF NO NOTE PLAYING !!!!!
ENDIF
'---MUSIC SPEED CTRL
IF z<129 THEN :'Intervalo de nota TITLE SDFASDFASDFADFASDFADS APAAAGA
INC y:IF y>1 THEN y=0
ENDIF
IF z>128 THEN :'Intervalo de nota MARE BAIXA """"""""""512
INC y:IF y>1 THEN y=0
ENDIF
RETURN
cl: :'SUB WAVE CORRECT
POKE u-31,c:POKE u-30,c:POKE u-29,c:POKE u+1,c:POKE u+2,c:POKE u+3,c:RETURN
dn: :'SUB MAIN DUNA FILL
GOSUB fi:d(18)=e:d(19)=e:d(20)=e:d(21)=e:RETURN
fi: :'SUB EMPTY FILLER
FILL d WITH 159:RETURN
sc: :'SUB SCORE
GOSUB fi:WAIT 999 MS:IF s>h THEN h=s:l=s:WAIT FIRE:RETURN
nc: :'SUB TEM CHAO?
n=0:IF PEEK(pp+32)=e OR PEEK(pp+1)=e OR PEEK(pp-1)=e OR PEEK(pp+33)=e OR PEEK(pp+31)=e THEN n=1:RETURN