DEFINT A-Z

COMMON SHARED Length, LengthOfInput, PatternDelay!

DECLARE SUB ChangeColor (Colour, Red, Green, Blue)

DECLARE SUB Delay (Interval!)

DECLARE SUB FadeOut ()

DECLARE SUB Intro ()

DECLARE SUB Fade ()

DECLARE SUB PlaySeqence ()

DECLARE SUB PlayButton (Button$)

DECLARE SUB GetSeqence ()

DECLARE SUB PressButton (Button$)

DECLARE SUB CheckOnMouse (x, y, Button)

DECLARE SUB CheckOnButtons (x, y, Button)

DECLARE SUB DefineColors ()

DECLARE SUB PlaceScreen ()

DECLARE SUB SetupMouse ()

DIM SHARED Mouse(9)

DIM SHARED Sequence(1000) AS STRING * 1

DIM SHARED UserInput(1000) AS STRING * 1

DEF Fndistance (x1, y1, x2, y2)

 Side1 = (x1 / 2) - x2

 Side2 = y1 - y2

 Fndistance = ABS(SQR(Side1 ^ 2 + Side2 ^ 2))

END DEF

SCREEN 13

CLS

RANDOMIZE TIMER

PatternDelay! = 1.3

Intro

DefineColors

PlaceScreen

GetSeqence

SetupMouse

PlaySeqence

StartInput:

DO UNTIL LengthOfInput = Length

 CheckOnMouse x, y, Button

 CheckOnButtons x, y, Button

LOOP

FOR i = 1 TO Length

 IF UserInput(i) <> Sequence(i) THEN Fade

NEXT i

Length = Length + 1

LengthOfInput = 0

IF Length < 8 THEN PatternDelay! = PatternDelay! - .1

IF Length < 19 THEN PatternDelay! = PatternDelay! - .05

IF Length = 1000 THEN END

SLEEP 1

PlaySeqence

GOTO StartInput



DATA "F L A S H   B A C K"

DATA "B Y   J E F F   E L M O R E"

DATA "G E T   R E A D Y"

DATA &HB8,&H00,&H00

DATA &H55

DATA &H8B,&HEC

DATA &HCD,&H33

DATA &H92

DATA &H8B,&H5E,&H06

DATA &H89,&H07

DATA &H5D

DATA &HCA,&H02,&H00



SUB ChangeColor (Colour, Red, Green, Blue)

OUT &H3C8, Colour

OUT &H3C9, Red

OUT &H3C9, Green

OUT &H3C9, Blue

END SUB



SUB CheckOnButtons (x, y, Button)

IF Button = 1 THEN

 IF Fndistance(x, y, 100, 50) < 40 THEN PressButton "R"

 IF Fndistance(x, y, 220, 50) < 40 THEN PressButton "B"

 IF Fndistance(x, y, 100, 140) < 40 THEN PressButton "G"

 IF Fndistance(x, y, 220, 140) < 40 THEN PressButton "Y"

 IF Fndistance(x, y, 163, 91) < 28 THEN Fade

END IF

END SUB



SUB CheckOnMouse (x, y, Button)

POKE VARPTR(Mouse(4)), &H92

CALL absolute(y, VARPTR(Mouse(0)))

POKE VARPTR(Mouse(4)), &H91

CALL absolute(x, VARPTR(Mouse(0)))

POKE VARPTR(Mouse(4)), &H93

CALL absolute(Button, VARPTR(Mouse(0)))



END SUB



SUB DefineColors

FOR i = 16 TO 65

ChangeColor i, i - 15, 0, 0

NEXT i

FOR i = 66 TO 116

ChangeColor i, 0, 0, i - 66

NEXT i

FOR i = 117 TO 167

ChangeColor i, 0, i - 177, 0

NEXT i

FOR i = 168 TO 218

ChangeColor i, i - 168, i - 168, 0

NEXT i

FOR i = 220 TO 243

ChangeColor i, 0, 0, i - 220

NEXT i

END SUB



SUB Delay (Interval!)

Newtime! = TIMER + Interval!

DO

LOOP UNTIL TIMER > Newtime!

END SUB



SUB Fade

FadeOut

POKE VARPTR(Mouse(0)) + 1, 2

CALL absolute(c, VARPTR(Mouse(0)))

DEF SEG

CLS

ChangeColor 1, 0, 0, 0

COLOR 1

LOCATE 5, 12

PRINT "You have just lost"

LOCATE 6, 10

PRINT "You made it to Level"; Length - 3

SELECT CASE Length

 CASE IS < 8

  LOCATE 7, 6

  PRINT "Which would make you a Beginner"

 CASE IS < 18

  LOCATE 7, 7

  PRINT "Which would make you a Player"

 CASE IS < 25

  LOCATE 7, 6

  PRINT "Which would make you an Expert"

 CASE IS > 25

  LOCATE 7, 6

  PRINT "Which would make you a Master"

END SELECT

FOR i = 0 TO 63

 ChangeColor 1, 0, 0, i

 Delay .01

NEXT i

COLOR 0

END

END SUB



SUB FadeOut

FOR p = 1 TO 32

FOR i = 2 TO 250

 OUT &H3C7, i

 Red = INP(&H3C9)

 Green = INP(&H3C9)

 Blue = INP(&H3C9)

 IF Red < 2 THEN Red = 2

 IF Green < 2 THEN Green = 2

 IF Blue < 2 THEN Blue = 2

 ChangeColor i, Red - 2, Green - 2, Blue - 2

 

NEXT i

NEXT p



END SUB



SUB GetSeqence

FOR i = 1 TO 1000

 Colour = INT(RND * 4)

 SELECT CASE Colour

  CASE 0

   Sequence(i) = "R"

  CASE 1

   Sequence(i) = "B"

  CASE 2

   Sequence(i) = "G"

  CASE 3

   Sequence(i) = "Y"

 END SELECT

NEXT i

Length = 3

END SUB



SUB Intro

COLOR 17

FOR m = 1 TO 3

READ message$

LOCATE 8, (40 - LEN(message$)) / 2

PRINT message$

FOR i = 0 TO 63

 ChangeColor 17, i, 0, i

 Delay .01

NEXT i

FOR i = 63 TO 0 STEP -1

 ChangeColor 17, i, 0, i

 Delay .01

NEXT i

CLS

NEXT m

END SUB



SUB PlaceScreen

Red = 16 + 45

Blue = 66 + 45

Green = 117 + 45

Yellow = 168 + 45

FOR i = 1 TO 45

 Radius = Radius + 1

 Red = Red - 1

 Blue = Blue - 1

 Green = Green - 1

 Yellow = Yellow - 1

 CIRCLE (100, 50), Radius, Red

 CIRCLE (220, 50), Radius, Blue

 CIRCLE (100, 140), Radius, Green

 CIRCLE (220, 140), Radius, Yellow

 CIRCLE (101, 50), Radius, Red

 CIRCLE (221, 50), Radius, Blue

 CIRCLE (101, 140), Radius, Green

 CIRCLE (221, 140), Radius, Yellow

NEXT i

FOR i = 10 TO 23

 CIRCLE (163, 91), i, 210 + i

 CIRCLE (164, 91), i, 210 + i

NEXT i

LOCATE 12, 20

COLOR 243

PRINT "END"

END SUB



SUB PlayButton (Button$)

PLAY "mbl12"

SELECT CASE (Button$)

 CASE "R"

  FOR i = 16 TO 60

   ChangeColor i, i, 0, 0

  NEXT i

  PLAY "o1e"

 CASE "B"

  FOR i = 61 TO 111

   ChangeColor i, 0, 0, i - 66 + 15

  NEXT i

  PLAY "o1g"

 CASE "G"

  FOR i = 112 TO 162

   ChangeColor i, 0, i - 117 + 15, 0

  NEXT i

  PLAY "o1b"

 CASE "Y"

  FOR i = 163 TO 213

   ChangeColor i, i - 168 + 15, i - 168 + 15, 0

  NEXT i

  PLAY "o1d"

END SELECT

Delay PatternDelay! / 2

DefineColors

Delay PatternDelay! / 2

END SUB



SUB PlaySeqence

POKE VARPTR(Mouse(0)) + 1, 2

CALL absolute(c, VARPTR(Mouse(0)))

FOR i = 1 TO Length

 PlayButton Sequence(i)

NEXT i

POKE VARPTR(Mouse(0)) + 1, 1

CALL absolute(c, VARPTR(Mouse(0)))

POKE VARPTR(Mouse(0)) + 1, 3

CALL absolute(c, VARPTR(Mouse(0)))

END SUB



SUB PressButton (Button$)

IF LengthOfInput = Length THEN EXIT SUB

LengthOfInput = LengthOfInput + 1

SELECT CASE (Button$)

 CASE "R"

  UserInput(LengthOfInput) = "R"

  FOR i = 16 TO 60

   ChangeColor i, i, 0, 0

  NEXT i

  PLAY "o1e"

 CASE "B"

  UserInput(LengthOfInput) = "B"

  FOR i = 61 TO 111

   ChangeColor i, 0, 0, i - 66 + 15

  NEXT i

  PLAY "o1g"

 CASE "G"

  UserInput(LengthOfInput) = "G"

  FOR i = 112 TO 162

   ChangeColor i, 0, i - 117 + 15, 0

  NEXT i

  PLAY "o1b"

 CASE "Y"

  UserInput(LengthOfInput) = "Y"

  FOR i = 163 TO 213

   ChangeColor i, i - 168 + 15, i - 168 + 15, 0

  NEXT i

  PLAY "o1d"

END SELECT

POKE VARPTR(Mouse(0)) + 1, 2

CALL absolute(c, VARPTR(Mouse(0)))

Delay .2

POKE VARPTR(Mouse(0)) + 1, 1

CALL absolute(c, VARPTR(Mouse(0)))

POKE VARPTR(Mouse(0)) + 1, 3

CALL absolute(c, VARPTR(Mouse(0)))

DefineColors

END SUB



SUB SetupMouse

DEF SEG = VARSEG(Mouse(0))

FOR i = 0 TO 17

 READ r

 POKE VARPTR(Mouse(0)) + i, r

NEXT i

FOR i = 1 TO 3

 SELECT CASE i

  CASE 1

   act = 0

  CASE 2

   act = 1

  CASE 3

   act = 3

 END SELECT

 POKE VARPTR(Mouse(0)) + 1, act

 CALL absolute(c, VARPTR(Mouse(0)))

NEXT i



END SUB