5 Tides at Purple Oyster Beach (TRS-80 Color)

For those who want to participate in the contest, help and be helped!
Per chi vuole partecipare al contest, aiutare e farsi aiutare!
Pour ceux qui veulent participer au concours, aidez et soyez aidés !
Post Reply
User avatar
ericomont
Posts: 33
Joined: Sun Oct 08, 2023 11:31 am

5 Tides at Purple Oyster Beach (TRS-80 Color)

Post by ericomont »

Here is my entry on the WILD category.
https://bunsen.itch.io/5-tides-at-the-p ... er-by-fued

edit:post needs images!!
Image

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 :D

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
Last edited by ericomont on Thu Apr 10, 2025 11:46 am, edited 1 time in total.
User avatar
Giovani_Gualdi
Posts: 7
Joined: Wed Mar 05, 2025 6:34 pm

Re: 5 Tides at Purple Oyster Beach (TRS-80 Color)

Post by Giovani_Gualdi »

Bravissimo Érico!! Thanks for sharing the code, I always learn a lot from these.
Post Reply