/// <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 ( ); } ); }
/// <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 ( ); } ); }
/// <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 ( ); } ); }
/// <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 ( ); } ); }
/// <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 ( ); } ); }
/// <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 ( ); } ); }