_TITLE "Rushi Desigbned by Danny Zondervanby 2016 - Programmed by Donal L. Foster Jr. 2017"

SCREEN _NEWIMAGE(1125, 735, 256)

_PALETTECOLOR 1, _RGB32(244, 164, 96) ' Light Square
_PALETTECOLOR 2, _RGB32(94, 38, 18) '   Dark Square
_PALETTECOLOR 3, _RGB32(10, 124, 235) ' Blue Piece
_PALETTECOLOR 4, _RGB32(0, 170, 0) '    Green Piece

DEFINT A-Z

Player = 1: Opponant = 2: Move = 0

PieceInHand(1) = 1: PieceInHand(2) = 1
HandY(1) = 638: HandY(2) = 98: Piece1Y(1) = 503: Piece1Y(2) = 98
FinishCount(1) = 0: FinishCount(2) = 0


Arrow1$ = "BU15C3R8U17R8H15G15R8D17R8BU5P3,3"
Arrow2$ = "BU15C4R8U17R8H15G15R8D17R8BU5P4,4"

LINE (0, 0)-(1125, 735), 2, BF

' Draw Board
LINE (15, 15)-(856, 720), 0, BF
X = 0
FOR Z = 1 TO 5
    W = 0
    FOR Y = 1 TO 6
        IF FIX((Z + Y) / 2) = (Z + Y) / 2 THEN U = 2 ELSE U = 1
        LINE (98 + W - 67, 98 + X - 67)-(98 + W + 67, 98 + X + 67), U, BF
        IF Z = 1 THEN BoardPlayer(Z, Y) = 2: BoardRotate(Z, Y) = 1
        IF Z = 5 THEN BoardPlayer(Z, Y) = 1: BoardRotate(Z, Y) = 1
        IF Y = 1 OR Y = 6 THEN BoardPiece(Z, Y) = 1: IF Z = 1 THEN BoardRotate(Z, Y) = 3
        IF Y = 2 OR Y = 5 THEN BoardPiece(Z, Y) = 2
        IF Y = 3 OR Y = 4 THEN BoardPiece(Z, Y) = 3
        IF BoardPlayer(Z, Y) > 0 THEN X1 = 98 + W: X2 = 98 + X: X3 = BoardPlayer(Z, Y): X4 = BoardPiece(Z, Y): X5 = BoardRotate(Z, Y): GOSUB DrawPiece
        BoardX(Z, Y) = 98 + W: BoardY(Z, Y) = 98 + X
        W = W + 135
    NEXT
    X = X + 135
NEXT

COLOR 15, 2: LOCATE 2, 114: PRINT "R    U    S    H    I";

' Draw Player's Piece in Hand
X1 = 990: X2 = 98: X3 = 2: X4 = 1: X5 = 3: GOSUB DrawPiece
X1 = 990: X2 = 638: X3 = 1: X4 = 1: X5 = 1: GOSUB DrawPiece

StartGame:
' Draw Player Indicator
X1 = 923: X2 = 368: X3 = Player: X4 = 4: GOSUB DrawPiece

Piece = PieceInHand(Player): Rotation = 1

LINE (996, 306)-(1120, 430), 2, BF

' End Game if Pieces are on Back Row After 100 Moves
Winner = 0: IF Moves = 101 THEN IF C(1) = 1 AND C(2) = 1 THEN Winner = 3 ELSE IF C(1) = 1 THEN Winner = 2 ELSE IF C(2) = 1 THEN Winner = 1
IF Winner > 0 THEN GOTO Winner

' Check for Players Pieces Still on Back Row at 90 Moves
IF Moves > 89 THEN
    C(1) = 0: C(2) = 0
    FOR Z = 1 TO 6
        IF BoardPlayer(1, Z) = 2 THEN C(2) = 1
        IF BoardPlayer(5, Z) = 1 THEN C(1) = 1
    NEXT
END IF

' If Player is Still on Back Row, Display Warning.
IF C(Player) = 1 THEN
    COLOR 15, 2: LOCATE 22, 126: PRINT "W A R N I N G";
    COLOR 15, 2: LOCATE 24, 126: PRINT "Remove Pieces";
    COLOR 15, 2: LOCATE 25, 126: PRINT "From Back Row";
    COLOR 15, 2: LOCATE 45, 111: PRINT "Press <ENTER> to Continue.";

    GetENTER1: A$ = UCASE$(INKEY$): IF A$ = "" GOTO GetENTER1
    IF ASC(A$) <> 13 THEN GOTO GetENTER1
    LINE (996, 306)-(1120, 430), 2, BF
END IF

'Check For Legal Moves
CanPlay = 0
FOR Z = 1 TO 5
    FOR Y = 1 TO 6
        W1 = Z: W2 = Y: GOSUB CheckLegalMoves
    NEXT
NEXT

' No Playable Moves
IF CanPlay = 0 AND LastMove(Player) = 0 THEN
    SwapPiece = 1: X1 = 1058: X2 = 368: X4 = 5: GOSUB DrawPiece
    X1 = 990: X2 = HandY(Player): Piece = PieceInHand(Player)
    LINE (X1 - 62, X2 - 62)-(X1 + 62, X2 + 62), 15, B
    GOTO SwapPieces
ELSEIF CanPlay = 0 THEN
    GOTO CantPlay
END IF

' Remove Playable Cursors
FOR Z = 1 TO 5
    FOR Y = 1 TO 6
        IF (Z + Y) / 2 = FIX((Z + Y) / 2) THEN V = 2 ELSE V = 1
        IF Playable(Z, Y) = 1 THEN Playable(Z, Y) = 0: LINE (BoardX(Z, Y) - 62, BoardY(Z, Y) - 62)-(BoardX(Z, Y) + 62, BoardY(Z, Y) + 62), V, B
    NEXT
NEXT

' Piece in Hand is a Sigle Arrow
IF Piece = 1 THEN
    LINE (923, HandY(Player) - 62)-(1057, HandY(Player) + 62), 2, BF
    X = 0: T = 1
    FOR Z = 1 TO 2
        W = 0
        FOR Y = 1 TO 2
            X1 = 923 + W: X2 = Piece1Y(Player) + X: X3 = Player: X4 = 1: X5 = T: GOSUB DrawPiece
            A(T) = X1: B(T) = X2
            W = W + 135: T = T + 1
        NEXT
        X = X + 135
    NEXT
    COLOR 15, 2: LOCATE 45, 111: PRINT "  Choose a Piece Rotation.  ";

    GetRotationMouseInput:
    DO WHILE _MOUSEINPUT
        MouseX = _MOUSEX: MouseY = _MOUSEY: MouseLeftButton = _MOUSEBUTTON(1)

        FOR Z = 1 TO 4
            IF (MouseX > A(Z) - 63) * (MouseX < A(Z) + 63) * (MouseY > B(Z) - 63) * (MouseY < B(Z) + 63) THEN
                CanSelect = 1: LINE (A(Z) - 62, B(Z) - 62)-(A(Z) + 62, B(Z) + 62), 15, B
            ELSE
                CanSelect = 0: LINE (A(Z) - 62, B(Z) - 62)-(A(Z) + 62, B(Z) + 62), 2, B
            END IF
            IF (MouseLeftButton = -1) * (CanSelect = 1) THEN
                Rotation = Z: GOSUB ReleaseMouseButton
                LINE (A(1) - 62, B(1) - 62)-(A(4) + 62, B(4) + 62), 2, BF
                X1 = 990: X2 = HandY(Player): X3 = Player: X4 = 1: X5 = Rotation: GOSUB DrawPiece
                GOTO GetBoardInput
            END IF
        NEXT
    LOOP
    GOTO GetRotationMouseInput
ELSE X1 = 990: X2 = HandY(Player): Piece = PieceInHand(Player): Rotation = 1
END IF

GetBoardInput:
' Draw Cursor Around Piece in Hand
LINE (X1 - 62, X2 - 62)-(X1 + 62, X2 + 62), 15, B

' Draw Swap Button
X1 = 1058: X2 = 368: X4 = 5: GOSUB DrawPiece

COLOR 15, 2: LOCATE 45, 111: PRINT "  Choose a Board Location.  ";

ChooseALocationMouseInput:
DO WHILE _MOUSEINPUT
    MouseX = _MOUSEX: MouseY = _MOUSEY: MouseLeftButton = _MOUSEBUTTON(1)
    IF LastMove(Player) = 0 AND MouseLeftButton = -1 AND MouseX > 996 AND MouseX < 1120 AND MouseY > 306 AND MouseY < 430 THEN SwapPiece = 1: LastMove(Player) = 1: GOTO SwapPieces
    FOR Z = 1 TO 5
        FOR Y = 1 TO 6
            IF (MouseLeftButton = -1) * (MouseX > BoardX(Z, Y) - 67) * (MouseX < BoardX(Z, Y) + 67) * (MouseY > BoardY(Z, Y) - 67) * (MouseY < BoardY(Z, Y) + 67) THEN
                IF BoardPlayer(Z, Y) = 0 THEN Row = Z: Column = Y: LastMove(Player) = 0: GOTO EndChoice1
            END IF
        NEXT
    NEXT
LOOP
GOTO ChooseALocationMouseInput

EndChoice1:

' Check for Legal Move
W1 = Row: W2 = Column: GOSUB CheckLegalMoves
IF X = 0 GOTO ChooseALocationMouseInput

' Move Piece from Hand to Board
LINE (923, HandY(Player) - 62)-(1057, HandY(Player) + 62), 2, BF

IF (Row = 1 AND Player = 1) OR (Row = 5 AND Player = 2) THEN FinishCount(Player) = FinishCount(Player) + 1: Piece = 4

BoardPlayer(Row, Column) = Player: BoardPiece(Row, Column) = Piece: BoardRotate(Row, Column) = Rotation
X1 = BoardX(Row, Column): X2 = BoardY(Row, Column): X3 = Player: X4 = Piece: X5 = Rotation: GOSUB DrawPiece

IF X4 = 0 THEN BoardPlayer(Row, Column) = 0: BoardPiece(Row, Column) = 0: BoardRotate(Row, Column) = 0

' Check for Multiple Pieces to Put in Hand
IF X > 1 THEN
    X = 0: COLOR 15, 2: LOCATE 45, 111: PRINT "Choose Piece to Put in Hand.";
    FOR Z = 1 TO 5
        FOR Y = 1 TO 6
            IF (Z + Y) / 2 = FIX((Z + Y) / 2) THEN V = 15 ELSE V = 0
            IF Playable(Z, Y) THEN LINE (BoardX(Z, Y) - 62, BoardY(Z, Y) - 62)-(BoardX(Z, Y) + 62, BoardY(Z, Y) + 62), V, B
        NEXT
    NEXT

    ChooseAPieceInput:
    DO WHILE _MOUSEINPUT
        MouseX = _MOUSEX: MouseY = _MOUSEY: MouseLeftButton = _MOUSEBUTTON(1)
        FOR Z = 1 TO 5
            FOR Y = 1 TO 6
                IF (MouseLeftButton = -1) * (MouseX > BoardX(Z, Y) - 62) * (MouseX < BoardX(Z, Y) + 62) * (MouseY > BoardY(Z, Y) - 62) * (MouseY < BoardY(Z, Y) + 62) THEN
                    IF Playable(Z, Y) = 1 THEN Row2 = Z: Column2 = Y: GOTO EndChoice2
                END IF
            NEXT
        NEXT
    LOOP
    GOTO ChooseAPieceInput
ELSE
    FOR Z = 1 TO 5
        FOR Y = 1 TO 6
            IF Playable(Z, Y) = 1 THEN Row2 = Z: Column2 = Y: X4 = BoardPiece(Z, Y): X5 = BoardRotate(Z, Y)
        NEXT
    NEXT
END IF

EndChoice2:

' Remove Playable Cursors
FOR Z = 1 TO 5
    FOR Y = 1 TO 6
        IF (Z + Y) / 2 = FIX((Z + Y) / 2) THEN V = 2 ELSE V = 1
        IF Playable(Z, Y) = 1 THEN Playable(Z, Y) = 0: LINE (BoardX(Z, Y) - 62, BoardY(Z, Y) - 62)-(BoardX(Z, Y) + 62, BoardY(Z, Y) + 62), V, B
    NEXT
NEXT

' Move Piece from Board To Hand
IF (Row2 + Column2) / 2 = FIX((Row2 + Column2) / 2) THEN V = 2 ELSE V = 1
LINE (BoardX(Row2, Column2) - 62, BoardY(Row2, Column2) - 62)-(BoardX(Row2, Column2) + 62, BoardY(Row2, Column2) + 62), V, BF

X1 = 990: X2 = HandY(Player): X3 = Player: X4 = BoardPiece(Row2, Column2): PieceInHand(Player) = X4
IF X4 = 1 AND Player = 2 THEN X5 = 3 ELSE X5 = 1

BoardPlayer(Row2, Column2) = 0: BoardPiece(Row2, Column2) = 0: BoardRotate(Row2, Column2) = 0: GOSUB DrawPiece

' Draw Color Circles at Ends of Board
IF Row2 = 1 OR Row2 = 5 THEN
    X1 = BoardX(Row2, Column2): X2 = BoardY(Row2, Column2)
    IF (Row2 + Column2) / 2 = FIX((Row2 + Column2) / 2) THEN V = 1 ELSE V = 2
    IF Row2 = 1 THEN U = 4 ELSE U = 3
    CIRCLE (X1, X2), 15, U: PAINT (X1, X2), U: CIRCLE (X1, X2), 12, V: PAINT (X1, X2), V
END IF

SwapPieces:
IF SwapPiece = 1 THEN
    SwapPiece = 0: LINE (996, 306)-(1120, 430), 15, B

    COLOR 15, 2: LOCATE 45, 111: PRINT " Choose Piece to Swap With. ";

    ChooseSwapPieceInput:
    DO WHILE _MOUSEINPUT
        MouseX = _MOUSEX: MouseY = _MOUSEY: MouseLeftButton = _MOUSEBUTTON(1)
        FOR Z = 1 TO 5
            FOR Y = 1 TO 6
                IF (MouseLeftButton = -1) * (MouseX > BoardX(Z, Y) - 62) * (MouseX < BoardX(Z, Y) + 62) * (MouseY > BoardY(Z, Y) - 62) * (MouseY < BoardY(Z, Y) + 62) THEN
                    IF BoardPlayer(Z, Y) = Player THEN Row1 = Z: Column1 = Y: GOTO EndChoice3
                END IF
            NEXT
        NEXT
    LOOP
    GOTO ChooseSwapPieceInput

    EndChoice3:
    TempPiece = Piece: TempRotate = Rotation
    PieceInHand(Player) = BoardPiece(Row1, Column1): HandRotate(Player) = BoardRotate(Row1, Column1)
    BoardPiece(Row1, Column1) = TempPiece: BoardRotate(Row1, Column1) = TempRotate

    IF (Row1 + Column1) / 2 = FIX((Row1 + Column1) / 2) THEN V = 2 ELSE V = 1
    LINE (BoardX(Row1, Column1) - 62, BoardY(Row1, Column1) - 62)-(BoardX(Row1, Column1) + 62, BoardY(Row1, Column1) + 62), V, BF
    X1 = BoardX(Row1, Column1): X2 = BoardY(Row1, Column1): X3 = Player: X4 = BoardPiece(Row1, Column1): X5 = BoardRotate(Row1, Column1): GOSUB DrawPiece

    LINE (923, HandY(Player) - 62)-(1057, HandY(Player) + 62), 2, BF
    IF Player = 1 THEN X5 = 1 ELSE X5 = 3
    X1 = 990: X2 = HandY(Player): X3 = Player: X4 = PieceInHand(Player): GOSUB DrawPiece

    LINE (996, 306)-(1120, 430), 2, BF
END IF

' Check for Winner
IF FinishCount(Player) = 6 THEN Winner = Player: GOTO Winner

CantPlay:
IF CanPlay = 0 THEN
    COLOR 15, 2: LOCATE 45, 111: PRINT " No Playable Moves. <ENTER> ";
    GetENTER: A$ = UCASE$(INKEY$): IF A$ = "" GOTO GetENTER
    IF ASC(A$) <> 13 THEN GOTO GetENTER
END IF

Move = Move + 1: SWAP Player, Opponant: GOTO StartGame


DrawPiece:
IF X4 = 4 AND X3 = 1 THEN V = 3 ELSE IF X4 = 4 AND X3 = 2 THEN V = 4 ELSE V = 15

LINE (X1 - 47, X2 - 57)-(X1 + 47, X2 - 57), 0
LINE (X1 - 57, X2 - 47)-(X1 - 57, X2 + 47), 0
LINE (X1 - 47, X2 + 57)-(X1 + 47, X2 + 57), 0
LINE (X1 + 57, X2 - 47)-(X1 + 57, X2 + 47), 0
CIRCLE (X1 - 47, X2 - 47), 10, 0, 1.5, 3.1
CIRCLE (X1 - 47, X2 + 47), 10, 0, 3.1, 4.8
CIRCLE (X1 + 47, X2 + 47), 10, 0, 4.6, 0
CIRCLE (X1 + 47, X2 - 47), 10, 0, 0, 1.7
PAINT (X1, X2), V, 0

IF X4 = 5 THEN COLOR 0, 15: LOCATE 24, 130: PRINT "S W A P";

IF V < 15 THEN RETURN

IF X3 = 1 THEN
    IF (X4 = 1 AND X5 = 1) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA0" + Arrow1$
    IF (X4 = 1 AND X5 = 2) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA270" + Arrow1$
    IF (X4 = 1 AND X5 = 3) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA180" + Arrow1$
    IF (X4 = 1 AND X5 = 4) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA90" + Arrow1$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA315BU10" + Arrow1$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA225BU10" + Arrow1$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA135BU10" + Arrow1$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA45BU10" + Arrow1$
ELSE
    IF (X4 = 1 AND X5 = 1) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA0" + Arrow2$
    IF (X4 = 1 AND X5 = 2) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA270" + Arrow2$
    IF (X4 = 1 AND X5 = 3) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA180" + Arrow2$
    IF (X4 = 1 AND X5 = 4) OR X4 = 3 THEN PSET (X1, X2), 15: DRAW "TA90" + Arrow2$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA315BU10" + Arrow2$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA225BU10" + Arrow2$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA135BU10" + Arrow2$
    IF X4 = 2 THEN PSET (X1, X2), 15: DRAW "TA45BU10" + Arrow2$
END IF
RETURN


ReleaseMouseButton:
DO WHILE _MOUSEINPUT
    IF _MOUSEBUTTON(1) = 0 THEN RETURN
LOOP
GOTO ReleaseMouseButton


CheckLegalMoves:
X = 0
IF W1 - 1 >= 1 THEN IF BoardPlayer(W1 - 1, W2) = Player THEN IF (BoardPiece(W1 - 1, W2) = 1 AND BoardRotate(W1 - 1, W2) = 3) OR BoardPiece(W1 - 1, W2) = 3 THEN X = X + 1: Playable(W1 - 1, W2) = 1
IF W1 - 1 >= 1 AND W2 + 1 <= 6 THEN IF BoardPlayer(W1 - 1, W2 + 1) = Player THEN IF BoardPiece(W1 - 1, W2 + 1) = 2 THEN X = X + 1: Playable(W1 - 1, W2 + 1) = 1
IF W2 + 1 <= 6 THEN IF BoardPlayer(W1, W2 + 1) = Player THEN IF (BoardPiece(W1, W2 + 1) = 1 AND BoardRotate(W1, W2 + 1) = 4) OR BoardPiece(W1, W2 + 1) = 3 THEN X = X + 1: Playable(W1, W2 + 1) = 1
IF W1 + 1 <= 5 AND W2 + 1 <= 6 THEN IF BoardPlayer(W1 + 1, W2 + 1) = Player THEN IF BoardPiece(W1 + 1, W2 + 1) = 2 THEN X = X + 1: Playable(W1 + 1, W2 + 1) = 1
IF W1 + 1 <= 5 THEN IF BoardPlayer(W1 + 1, W2) = Player THEN IF (BoardPiece(W1 + 1, W2) = 1 AND BoardRotate(W1 + 1, W2) = 1) OR BoardPiece(W1 + 1, W2) = 3 THEN X = X + 1: Playable(W1 + 1, W2) = 1
IF W1 + 1 <= 5 AND W2 - 1 >= 1 THEN IF BoardPlayer(W1 + 1, W2 - 1) = Player THEN IF BoardPiece(W1 + 1, W2 - 1) = 2 THEN X = X + 1: Playable(W1 + 1, W2 - 1) = 1
IF W2 - 1 >= 1 THEN IF BoardPlayer(W1, W2 - 1) = Player THEN IF (BoardPiece(W1, W2 - 1) = 1 AND BoardRotate(W1, W2 - 1) = 2) OR BoardPiece(W1, W2 - 1) = 3 THEN X = X + 1: Playable(W1, W2 - 1) = 1
IF W1 - 1 >= 1 AND W2 - 1 >= 1 THEN IF BoardPlayer(W1 - 1, W2 - 1) = Player THEN IF BoardPiece(W1 - 1, W2 - 1) = 2 THEN X = X + 1: Playable(W1 - 1, W2 - 1) = 1
IF X > 0 THEN CanPlay = 1
RETURN


Winner:
LINE (861, 306)-(1120, 430), 2, BF

IF Winner = 3 THEN
    COLOR 15, 2: LOCATE 22, 111: PRINT "      After 100 Moves       ";
    COLOR 15, 2: LOCATE 23, 111: PRINT "Both Have Pieces in Back Row";
    COLOR 15, 2: LOCATE 25, 111: PRINT "The Game Ended in a D R A W!";
ELSE
    X1 = 923: X2 = 368: X3 = Winner: X4 = 4: GOSUB DrawPiece
    COLOR 15, 2: LOCATE 24, 126: PRINT "W I N N E R !";
END IF

COLOR 15, 2: LOCATE 45, 111: PRINT "Play Another Game?  (Y or N)";
GetYesNo: A$ = UCASE$(INKEY$): IF A$ = "" GOTO GetYesNo
IF A$ = "Y" THEN RUN
IF A$ = "N" THEN SYSTEM
GOTO GetYesNo

