예제 #1
0
    /// <summary>
    /// Uses the Teleport ability to instantly move a piece a few spaces away.
    /// </summary>
    public void UseTeleport( Piece p, Tile t, Info info )
    {
        //Change the tile references
        p.currentTile.currentPiece = null;
        p.currentTile = t;
        t.currentPiece = p;

        //Clear board
        info.ResetBoardColor ( );

        //Mark that it is no longer the beginning of a turn
        info.beginningOfTurn = false;
        info.DisableAbilityButtons ( );

        //Animate teleport
        Sequence s = DOTween.Sequence ( )
            .Append ( p.sprite.DOFade ( 0, ANIMATE_TIME ) )
            .AppendCallback ( () =>
            {
                //Move piece
                p.Move ( t.transform.position );
            } )
            .Append ( p.sprite.DOFade ( 1, ANIMATE_TIME ) )
            .OnComplete ( () =>
            {
                //End turn
                info.EndTurn ( );
            } );
    }
예제 #2
0
    /// <summary>
    /// Uses the Nonagression Pact by marking two pieces that cannot interact with one another.
    /// </summary>
    public void UseNonagressionPact( Tile t1, Tile t2, Info info )
    {
        //Add each piece as each other's nonagression partner
        t1.currentPiece.nonagressionPartners.Add ( t2.currentPiece.color );
        t2.currentPiece.nonagressionPartners.Add ( t1.currentPiece.color );

        //Animate nonaggression pact
        Sequence s = DOTween.Sequence ( )
            .Append ( t1.currentPiece.sprite.DOColor ( new Color32 ( 150, 50, 255, 255 ), ANIMATE_TIME ).SetLoops ( 2, LoopType.Yoyo ) )
            .Insert ( 0, t2.currentPiece.sprite.DOColor ( new Color32 ( 150, 50, 255, 255 ), ANIMATE_TIME ).SetLoops ( 2, LoopType.Yoyo ) )
            .OnComplete ( () =>
            {
                //Deactivate ability
                info.abilityInUse.IsActive = false;
                info.DisableAbility ( info.abilityInUse.ID, info.currentPlayer );

                //Enable abilities use buttons
                info.EnableAbilityButtons ( );

                //Reset ability selection list
                info.abilityTileSelection.Clear ( );

                //Reset board
                info.ResetBoardColor ( );

                //Highlight pieces
                info.HighlightCurrentPlayerPieces ( );
            } );
    }
예제 #3
0
    /// <summary>
    /// Uses the Mad Hatter ability by swapping two pieces.
    /// </summary>
    public void UseMadHatter( Tile t1, Tile t2, Info info )
    {
        //Store temporary value
        Piece temp = t1.currentPiece;

        //Swap pieces
        t1.currentPiece.currentTile = t2;
        t2.currentPiece.currentTile = t1;
        t1.currentPiece = t2.currentPiece;
        t2.currentPiece = temp;

        //Bring pieces to front
        t1.currentPiece.sprite.sortingOrder = 2;
        t2.currentPiece.sprite.sortingOrder = 2;

        //Animate mad hatter
        Sequence s = DOTween.Sequence ( )
            .Append ( t1.currentPiece.transform.DOMove ( t1.transform.position, ANIMATE_TIME ) )
            .Insert ( 0, t2.currentPiece.transform.DOMove ( t2.transform.position, ANIMATE_TIME ) )
            .OnComplete ( () =>
            {
                //Deactivate ability
                info.abilityInUse.IsActive = false;
                info.DisableAbility ( info.abilityInUse.ID, info.currentPlayer );

                //Enable abilities use buttons
                info.EnableAbilityButtons ( );

                //Reset ability selection list
                info.abilityTileSelection.Clear ( );

                //Reset board
                info.ResetBoardColor ( );

                //Highlight pieces
                info.HighlightCurrentPlayerPieces ( );
            } );
    }
예제 #4
0
    /// <summary>
    /// Uses the Grim Reaper ability by moving the player's Grim Reaper piece to its new tile.
    /// </summary> 
    public void UseGrimReaper( Piece p, Tile t, Info info )
    {
        //Store piece color
        Color c = p.sprite.color;

        //Animate grim reaper
        Sequence s = DOTween.Sequence ( )
            .Append ( p.currentTile.sprite.DOColor ( Color.black, ANIMATE_TIME ).SetLoops ( 2, LoopType.Yoyo ) )
            .Insert ( 0, p.sprite.DOColor ( Color.black, ANIMATE_TIME ) )
            .Insert ( ANIMATE_TIME, p.sprite.DOFade ( 0, 0 ) )
            .AppendCallback ( () =>
            {
                //Move the player's Grim Reaper piece
                p.currentTile.currentPiece = null;
                p.currentTile = t;
                t.currentPiece = p;
                p.Move ( t.transform.position );
            } )
            .Append ( t.sprite.DOColor ( Color.black, ANIMATE_TIME ).SetLoops ( 2, LoopType.Yoyo ) )
            .Insert ( ANIMATE_TIME * 3, p.sprite.DOFade ( 1, 0 ) )
            .Insert ( ANIMATE_TIME * 3, p.sprite.DOColor ( c, ANIMATE_TIME ) )
            .OnComplete ( () =>
            {
                //Reset grim reaper tile
                info.grimReaperTile = null;

                //Hide prompt
                info.currentPlayer.prompt.gameObject.SetActive ( false );

                //Store temporary save data
                info.TempSave ( );

                //Reset board
                info.ResetBoardColor ( );

                //Highlight pieces
                info.HighlightCurrentPlayerPieces ( );
            } );
    }
예제 #5
0
    /// <summary>
    /// Uses the Catapult ability.
    /// </summary>
    public void UseCatapult( Piece p, Tile t, Info info )
    {
        //Store the two tiles being jumped
        Tile mid1 = null;
        Tile mid2 = null;
        for ( int i = 0; i < t.neighbors.Length; i++ )
        {
            //Find middle tiles
            if ( p.currentTile.neighbors [ i ] != null && p.currentTile.neighbors [ i ].neighbors [ i ] != null && p.currentTile.neighbors [ i ].neighbors [ i ].neighbors [ i ] != null && p.currentTile.neighbors [ i ].neighbors [ i ].neighbors [ i ] == t )
            {
                mid1 = p.currentTile.neighbors [ i ];
                mid2 = p.currentTile.neighbors [ i ].neighbors [ i ];
                break;
            }
        }

        //Mark that it is no longer the beginning of a turn
        info.beginningOfTurn = false;
        info.DisableAbilityButtons ( );

        //Check if piece is friendly on the first tile
        if ( mid1.state == TileState.PotentialCapture )
            mid1.CapturePiece ( mid1 );

        //Check if piece is friendly on the second tile
        if ( mid2.state == TileState.PotentialCapture )
            mid2.CapturePiece ( mid2 );

        //Clear board
        info.ResetBoardColor ( );
        info.BringPieceToFront ( p );

        //Animate catapult
        Sequence s = DOTween.Sequence ( )
            .Append ( p.transform.DOMove ( t.transform.position, ANIMATE_TIME * 2 ) )
            .Insert ( 0, p.transform.DOScale ( 4, ANIMATE_TIME ).SetLoops ( 2, LoopType.Yoyo ) )
            .OnComplete ( () =>
            {
                //Update tile references
                p.currentTile.currentPiece = null;
                p.currentTile = t;
                t.currentPiece = p;

                //End turn
                info.EndTurn ( );
            } );
    }
예제 #6
0
    /// <summary>
    /// Uses the Torus ability to allow the piece's movement to wrap around the board.
    /// </summary>
    public void UseTorus( Piece p, Tile t, Info info )
    {
        //Set previous tile
        p.prevTile = p.currentTile;

        //Movement information
        float xMove;
        float yMove;
        float reentry = 1.5f;
        float delay = 0.1f;
        bool isTorusJump = t.isTorusJump;
        Sequence s = DOTween.Sequence ( );

        //Mark that it is no longer the beginning of a turn
        info.beginningOfTurn = false;
        info.DisableAbilityButtons ( );

        //Clear board
        info.ResetBoardColor ( );
        info.BringPieceToFront ( p );

        //Check tile position
        if ( p.currentTile.transform.position.x != t.transform.position.x )
        {
            //Mark that the movement is forward
            xMove = 1.3f;
            yMove = 0.75f;
        }
        else
        {
            //Mark that the movement is strictly side to side
            xMove = 0;
            yMove = 1.5f;
        }

        //Check if the move is a jump
        if ( isTorusJump )
        {
            //Find middle tile
            Tile mid = null;
            bool isTorusFirst = false;
            for ( int i = 0; i < t.neighbors.Length; i++ )
            {
                //Check for selected tile
                if ( p.currentTile.neighbors [ i ] != null && p.currentTile.neighbors [ i ].torusNeighbors [ i ] != null && p.currentTile.neighbors [ i ].torusNeighbors [ i ] == t )
                {
                    //Store middle tile
                    mid = p.currentTile.neighbors [ i ];
                    isTorusFirst = false;
                    break;
                }
                else if ( p.currentTile.torusNeighbors [ i ] != null && p.currentTile.torusNeighbors [ i ].neighbors [ i ] != null && p.currentTile.torusNeighbors [ i ].neighbors [ i ] == t )
                {
                    //Store middle tile
                    mid = p.currentTile.torusNeighbors [ i ];
                    isTorusFirst = true;
                    break;
                }
            }

            //Check if torus is first
            if ( isTorusFirst )
            {
                //Determine starting tile position
                if ( p.currentTile.transform.position.y < 0 )
                    yMove *= -1;
                else
                    reentry *= -1;
                if ( p.currentTile.transform.position.x > t.transform.position.x )
                    xMove *= -1;

                //Animate torus
                s.Append ( p.transform.DOMove ( new Vector3 ( p.transform.position.x + xMove, p.transform.position.y + yMove, p.transform.position.y ), ANIMATE_TIME ) )
                    .Insert ( 0, p.sprite.DOFade ( 0, ANIMATE_TIME ) )
                    .Append ( p.transform.DOMove ( new Vector3 ( mid.transform.position.x, mid.transform.position.y + reentry, mid.transform.position.z ), 0 ) )
                    .AppendCallback ( () =>
                    {
                        //Check for capture
                        if ( mid.currentPiece.owner == info.opponent )
                            mid.CapturePiece ( mid );
                    } )
                    .AppendInterval ( delay );

                //Check middle tile position
                if ( mid.transform.position.x != t.transform.position.x )
                    s.Append ( p.transform.DOMove ( mid.transform.position, ANIMATE_TIME ) );
                else
                    s.Append ( p.transform.DOMove ( t.transform.position, ANIMATE_TIME * 2 ) );

                //Finish torus animation
                s.Insert ( ANIMATE_TIME + delay, p.sprite.DOFade ( 1, ANIMATE_TIME ) )
                    .Append ( p.transform.DOMove ( t.transform.position, ANIMATE_TIME ) );
            }
            else
            {
                //Determine middle tile position
                if ( mid.transform.position.y < 0 )
                    yMove *= -1;
                else
                    reentry *= -1;
                if ( mid.transform.position.x > t.transform.position.x )
                    xMove *= -1;

                //Check for capture
                if ( mid.currentPiece.owner == info.opponent )
                    mid.CapturePiece ( mid );

                //Animate torus
                s.Append ( p.transform.DOMove ( new Vector3 ( mid.transform.position.x + xMove, mid.transform.position.y + yMove, mid.transform.position.z ), ANIMATE_TIME * 2 ) )
                    .Insert ( ANIMATE_TIME, p.sprite.DOFade ( 0, ANIMATE_TIME ) )
                    .Append ( p.transform.DOMove ( new Vector3 ( t.transform.position.x, t.transform.position.y + reentry, t.transform.position.z ), 0 ) )
                    .AppendInterval ( delay )
                    .Append ( p.transform.DOMove ( t.transform.position, ANIMATE_TIME ) )
                    .Insert ( ( ANIMATE_TIME * 2 ) + delay, p.sprite.DOFade ( 1, ANIMATE_TIME ) );
            }
        }
        else
        {
            //Determine starting tile position
            if ( p.currentTile.transform.position.y < 0 )
                yMove *= -1;
            else
                reentry *= -1;
            if ( p.currentTile.transform.position.x > t.transform.position.x )
                xMove *= -1;

            //Animate torus
            s.Append ( p.transform.DOMove ( new Vector3 ( p.transform.position.x + xMove, p.transform.position.y + yMove, p.transform.position.z ), ANIMATE_TIME ) )
                .Insert ( 0, p.sprite.DOFade ( 0, ANIMATE_TIME ) )
                .Append ( p.transform.DOMove ( new Vector3 ( t.transform.position.x, t.transform.position.y + reentry, t.transform.position.z ), 0 ) )
                .AppendInterval ( delay )
                .Append ( p.transform.DOMove ( t.transform.position, ANIMATE_TIME ) )
                .Insert ( ANIMATE_TIME + delay, p.sprite.DOFade ( 1, ANIMATE_TIME ) );
        }

        //Update tile references and check for additional movement at the end of the animation
        s.OnComplete ( () =>
            {
                //Change the tile references
                p.currentTile.currentPiece = null;
                p.currentTile = t;
                t.currentPiece = p;

                //Check follow up
                if ( isTorusJump )
                    t.SelectPiece ( );
                else
                    info.EndTurn ( );
            } );
    }