/// <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 Caboose ability by moving each piece in the caboose forward. /// </summary> public void UseCaboose( CabooseList l, Info info ) { //Store animation Sequence s = DOTween.Sequence ( ); //Move each piece in the caboose for ( int i = l.list.Count - 1; i > -1; i-- ) { //Store destination Tile t = l.list [ i ]; Tile d = l.list [ i ].neighbors [ l.direction ]; //Update tile and piece references t.currentPiece.currentTile = d; d.currentPiece = t.currentPiece; t.currentPiece = null; //Move the piece s.Insert ( 0, d.currentPiece.transform.DOMove ( d.transform.position, ANIMATE_TIME ) ); } //End turn s.OnComplete ( () => { //Clear caboose info info.cabooseList.Clear ( ); info.selectedCaboose = null; info.multiCabooseTile = false; //End turn info.EndTurn ( ); } ); }
/// <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 ( ); } ); }