Author: Sol Guber
Language: ACTION!
Compiler/Interpreter: ACTION!
Published: Analog #32 (07/ 85)
Color the shapes#
; COLOR THE SHAPES
;
; by Rebecca Guber and Sol Guber
MODULE
BYTE ARRAY
R(100),USED(60),PLAYER(20),B(90),
CLS=704,A(10),GAR(60),
INTER=[72 169 0 141 10 212 141 27
208 104 64],
TX=[0 252 0 4],TY=[248 0 8 0],
TEST=[246 255 10 1],
COLORS=[8 122 88 28 132 248 190
14 190],
STAR=[0 0 0 0 24 126 60 60 126 24
0 0 0 0]
CARD SC1,YP1,YP,Y1
BYTE CFLAG,COL,PLAYNUM,COUNT,DX,DY,
OLDX,OLDY,X,Y,TURN,QUIT
PROC SETUP()
CARD Z
Z=PEEKC(560)
POKE(Z+166,143)
POKEC(512,INTER)
POKE(54286,192)
POKE(87,10)
POKE(623,160)
FOR Z=0 TO 8 DO
CLS(Z)=PEEK(COLORS+Z)
OD
RETURN
PROC BLOCK(BYTE I)
BYTE J
FOR J=152 TO 157 DO
PLOT (I,J)
DRAWTO(I+5,J)
OD
RETURN
PROC NEWDIR(BYTE A,B)
DX=0
DY=0
IF LOCATE(A+1,B)>0 THEN
DX=1
ELSEIF LOCATE(A-1,B)>0 THEN
DX=-1
ELSEIF LOCATE(A,B-1)>0 THEN
DY=-1
ELSE
DY=1
FI
RETURN
BYTE FUNC LINE(BYTE A,B)
BYTE Z,J
Z=LOCATE(A+1,B)
J=LOCATE(A-1,B)
Z==+J
J=LOCATE(A,B+1)
Z==+J
J=LOCATE(A,B-1)
Z==+J
IF Z>6 THEN
RETURN(Z)
FI
NEWDIR(A,B)
RETURN(1)
PROC REMOVE(BYTE A,B)
DO
PLOT(A,B)
A==+DX
B==+DY
UNTIL LINE(A,B)<>1
OD
RETURN
PROC GRID()
BYTE I,X,Y,Z,XOLD,YOLD,Y1
COLOR=6
I=2
WHILE I<157 DO
PLOT(3,I)
DRAWTO(74,I)
I==+16
OD
I=3
WHILE I<79 DO
PLOT(I,2)
DRAWTO(I,145)
I==+8
OD
FOR I=2 TO 5 DO
COLOR=I
BLOCK((I-2)*10+5)
OD
COLOR=6
PLOT(45,153)
DRAWTO(50,153)
DRAWTO(50,157)
DRAWTO(45,157)
DRAWTO(45,153)
PLOT(51,158)
COLOR=0
FOR I=1 TO 40 DO
DO
X=RAND(8)*8+7
Y=RAND(16)*8+10
Y1=Y-10
IF Y1/8=(Y1/16)*2 THEN
X==+4
FI
UNTIL LOCATE(X,Y)<>0
OD
XOLD=X
YOLD=Y
IF Y1/8=(Y1/16)*2 THEN
DX=0
DY=-1
REMOVE(X,Y)
DX=0
DY=1
REMOVE(XOLD,YOLD)
ELSE
DY=0
DX=-1
REMOVE(X,Y)
DY=0
DX=1
REMOVE(XOLD,YOLD)
FI
OD
RETURN
PROC TITLE()
BYTE X,Y,C,K1,K2
CARD SC,J
SC1=PEEKC(88)
GRAPHICS(19)
SC=PEEKC(560)
FOR J=7 TO 9 DO
POKE(SC+J,7)
OD
POKE(87,2)
COLOR=0
PLOT(0,1)
PRINTDE(6,"COLOR THE SHAPES")
PRINTDE(6," by rebecca guber")
PRINTDE(6," AND SOL GUBER")
POKE(87,3)
FOR J=1 TO 1000 DO
FOR K2=1 TO 500 DO
OD
X=RAND(39)
Y=RAND(12)+8
C=RAND(255)
SOUND(0,C,8,8)
COLOR=RAND(4)
PLOT(X,Y)
OD
SOUND(0,0,0,0)
RETURN
BYTE FUNC NEWSPOT(BYTE J,COUNT)
BYTE K,Y1,X1,Z,K1
R(J)==+128
Y1=((J-1)/10)*16+10
X1=((J-1) MOD 10)*8+7
FOR K=0 TO 3 DO
Z=LOCATE(X1+TX(K),Y1+TY(K))
K1=J+TEST(K)
IF Z=0 AND R(K1)=0 THEN
R(K1)=COUNT
RETURN(K1)
FI
OD
RETURN(0)
BYTE FUNC OLDSPOT(BYTE J,COUNT)
BYTE K,K1
R(J)==-128
K=3
WHILE K<>255 DO
K1=J+TEST(K)
IF K1>0 AND K1<100 THEN
IF R(K1)>128 THEN
R(K1)==-128
RETURN(K1)
FI
FI
K==-1
OD
RETURN(0)
PROC FIND(BYTE J,COUNT)
BYTE K,K1
R(J)=COUNT
DO
K=NEWSPOT(J,COUNT)
IF K=0 THEN
K1=OLDSPOT(J,COUNT)
J=K1
ELSE
J=K
FI
UNTIL J=0
OD
RETURN
PROC SEARCH()
BYTE J,COUNT,K,K1
ZERO(R,100)
COUNT=1
FOR J=1 TO 89 DO
IF R(J)=0 AND J MOD 10<>0 THEN
FIND(J,COUNT)
COUNT==+1
FI
OD
FOR J=1 TO 89 DO
IF R(J)>128 THEN
R(J)==-128
FI
OD
RETURN
; PMG.ACT FROM THE ACTION! TOOLKIT
INCLUDE "D1:PMG.ACT"
BYTE FUNC SIZE(BYTE K)
BYTE J
FOR J=K+1 TO K+9 DO
IF R(J)=COUNT THEN
RETURN(1)
FI
OD
RETURN(0)
PROC CHECK_BOARD()
BYTE J,K
COUNT=1
FOR J=1 TO 99 DO
IF J MOD 10 <>0 THEN
WHILE R(J)<COUNT AND J<100 DO
J==+1
OD
GAR(COUNT)=J/10
K=(J/10)*10+10
WHILE SIZE(K)=1 DO
K==+10
OD
GAR(COUNT)==+(K-10)
COUNT==+1
FI
OD
COUNT==-1
RETURN
PROC SHIFT(BYTE X1)
BYTE Z,Z1
IF X1=140 THEN
QUIT=1
RETURN
FI
Z=(X1-60)/20+1
COL=Z+1
Z1=PEEK(705+Z)-6
POKE(705,Z1)
RETURN
PROC BEEP()
CARD Q
SOUND(0,220,10,10)
FOR Q=1 TO 25000 DO
OD
SOUND(0,0,0,0)
RETURN
BYTE FUNC PICK_COLOR()
BYTE S,TR,J,X1
CARD I1
FOR I1=OLDY TO 173 DO
PMMOVE(1,X,I1)
OD
OLDY=173
PRINTE("PLEASE PICK A COLOR")
X1=60
PMHPOS(1)=60
IF CFLAG=1 THEN
DO
J=PEEK(624)
IF J>5 THEN
J=(J/50)*20+60
PMHPOS(1)=J
FI
IF PEEK(636)=0 OR
PEEK(637)=0 THEN
BEEP()
SHIFT(J)
RETURN(1)
FI
OD
FI
DO
DO
S=STICK(0)
TR=STRIG(0)
IF TR=0 THEN
BEEP()
SHIFT(X1)
RETURN(1)
FI
UNTIL S<>15
OD
IF S=7 THEN
X1==+20
IF X1=160 THEN
X1=60
FI
FI
IF S=11 THEN
X1==-20
IF X1=40 THEN
X1=140
FI
FI
PMHPOS(1)=X1
FOR I1=1 TO 6000 DO
OD
OD
RETURN(1)
BYTE FUNC GOOD_COLOR(BYTE SPOT,COL)
BYTE TOP,BOT,BLOCK,I
BLOCK=R(SPOT)
TOP=GAR(BLOCK)
BOT=(TOP MOD 10)*10
TOP=(TOP/10)*10
WHILE BOT<TOP+9 DO
IF R(BOT)=BLOCK THEN
FOR I=0 TO 3 DO
IF B(BOT+TEST(I))=COL THEN
RETURN(0)
FI
OD
FI
BOT==+1
OD
RETURN(1)
PROC FILLER(BYTE J)
BYTE X,Y,K,L,L1
L1=6
IF R(J)=R(J+1) THEN
L1==+1
FI
L=14
IF R(J)=R(J+10) THEN
L==+1
FI
X=(J/10)*16+3
Y=(J MOD 10)*8-4
FOR K=X TO X+L DO
PLOT(Y,K)
DRAWTO(Y+L1,K)
OD
RETURN
PROC FILL_IN(BYTE SPOT)
BYTE N,TOP,BOT,J
N=R(SPOT)
TOP=GAR(N)
BOT=TOP MOD 10
TOP=(TOP/10)*10
USED(N)=1
FOR J=BOT TO TOP+9 DO
IF R(J)=N THEN
B(J)=COLOR
FILLER(J)
FI
OD
RETURN
PROC INIT()
BYTE K,J,M,N,C
ZERO(PLAYER,20)
ZERO(B,99)
ZERO(USED,60)
PUT(125)
PRINTE("1 OR 2 PLAYERS?")
PLAYNUM=INPUTB()
PRINTE("WHAT IS YOUR NAME?")
INPUTS(A)
FOR K=1 TO A(0) DO
PLAYER(K)=A(K)
OD
IF PLAYNUM=2 THEN
PRINTE("NAME OF 2ND PLAYER?")
INPUTS(A)
FOR K=1 TO A(0) DO
PLAYER(K+10)=A(K)
OD
FI
PUT(125)
PRINT("USE A KOALA PAD (Y/N)?")
CFLAG=0
INPUTS(A)
IF A(1)='Y THEN
CFLAG=1
FI
PRINTE("FILL SOME SHAPES IN?")
INPUTS(A)
IF A(1)<>'Y THEN
RETURN
FI
PUT(125)
PRINTE("HOW MANY SHAPES, UP TO 5?")
J=INPUTB()
J==MOD 6
FOR K=1 TO J DO
DO
M=RAND(COUNT-1)+1
UNTIL USED(M)=0
OD
N=M
DO
N==+1
UNTIL R(N)=M
OD
DO
C=RAND(4)+2
UNTIL GOOD_COLOR(N,C)=1
OD
COLOR=C
FILL_IN(N)
USED(M)=1
OD
RETURN
BYTE FUNC SGN(BYTE I,J)
IF I=J THEN
RETURN(0)
ELSEIF I>J THEN
RETURN(-1)
FI
RETURN(1)
PROC MOVE()
BYTE Q,DEL
CARD K
IF OLDX<>X THEN
Q=OLDX
DEL=SGN(OLDX,X)
WHILE Q<>X DO
PMMOVE(1,Q,OLDY)
Q==+DEL
OD
OLDX=X
FOR K=1 TO 2000 DO
OD
FI
IF OLDY<>Y THEN
Q=OLDY
DEL=SGN(OLDY,Y)
WHILE Q<>Y DO
PMMOVE(1,X,Q)
Q==+DEL
OD
OLDY=Y
FI
RETURN
BYTE FUNC TRIGGER()
IF CFLAG=1 THEN
IF PEEK(636)=0 OR PEEK(637)=0 THEN
RETURN(0)
FI
ELSE
IF STRIG(0)=0 THEN
RETURN(0)
FI
FI
RETURN(1)
BYTE FUNC ABS(BYTE A,B)
IF A>B THEN
RETURN(A-B)
FI
RETURN(B-A)
BYTE FUNC JOYSTICK()
BYTE P,X1
IF CFLAG=1 THEN
X1=PEEK(624)
Y1=PEEK(625)
IF X1<5 OR Y1<5 THEN
RETURN(0)
FI
X1=56+(X1/28)*16
Y1=36+(Y1/28)*16
IF ABS(X1,OLDX)<5 THEN
RETURN(0)
ELSEIF ABS(Y1,OLDY)<5 THEN
RETURN(0)
FI
X=X1
Y=Y1
RETURN(1)
FI
P=STICK(0)
IF P=15 THEN
RETURN(0)
FI
IF P=11 AND OLDX>60 THEN
X=OLDX-16
RETURN(1)
ELSEIF P=7 AND OLDX<180 THEN
X=OLDX+16
RETURN(1)
ELSEIF P=14 AND OLDY>51 THEN
Y=OLDY-16
RETURN(1)
ELSEIF P=13 AND OLDY<152 THEN
Y=OLDY+16
RETURN(1)
FI
RETURN(0)
BYTE FUNC COMPLETE()
BYTE J
FOR J=1 TO COUNT-1 DO
IF USED(J)=0 THEN
RETURN(0)
FI
OD
RETURN(1)
PROC NAME()
BYTE J
PUT(125)
FOR J=TURN*10+1 TO TURN*10+10 DO
PUT(PLAYER(J))
IF PLAYER(J+1)=0 THEN
EXIT
FI
OD
PRINTE("'S TURN")
RETURN
PROC COLOR_IN(BYTE SPOT)
BYTE K
CARD K1
IF B(SPOT)<>0 THEN
DO
UNTIL PICK_COLOR()<>0
OD
MOVE()
IF QUIT=1 THEN
RETURN
FI
X=OLDX
Y=OLDY
MOVE()
RETURN
FI
IF GOOD_COLOR(SPOT,COL)=0 THEN
BEEP()
PRINT("YOU CANNOT USE THAT")
PRINTE(" COLOR THERE")
BEEP()
RETURN
FI
COLOR=COL
FILL_IN(SPOT)
IF PLAYNUM=2 THEN
TURN==! 1
FI
NAME()
FOR K1=1 TO 2000 DO
OD
RETURN
PROC SHAPES()
BYTE A,SPOT,J
DO
TITLE()
GRAPHICS(8)
QUIT=0
PMGRAPHICS(1)
SETUP()
POKE(705,22)
POKE(623,160)
PMCLEAR(1)
MAKEPM(STAR,14,1,2,156,126)
X=56
Y=36
OLDX=0
OLDY=0
MOVE()
COLOR=3
COL=3
GRID()
TURN=0
SEARCH()
CHECK_BOARD()
INIT()
NAME()
DO
IF TRIGGER()=0 THEN
COLOR_IN(SPOT)
FI
IF JOYSTICK()=1 THEN
MOVE()
FI
SPOT=(X-38)/16+10*(Y-36)/16
UNTIL COMPLETE()=1 OR QUIT=1
OD
IF COMPLETE()=1 THEN
FOR J=TURN*10+1 TO TURN*10+10 DO
PUT(PLAYER(J))
IF PLAYER(J+1)=0 THEN
EXIT
FI
OD
PRINTE(" IS THE WINNER")
FI
PRINTE("PLAY AGAIN?")
A=INPUTB()
UNTIL A='N
OD
RETURN