/// <summary> /// if placement state then this will handle the selection event /// </summary> /// <param name="node">A selected tilenode</param> private void PlacementAction(TileNode node) { // Can only place pieces on empty edge tiles if (node.type != TileNode.Type.Edge || node.tower != null || placementPiece == null) { UnhighlightPlacementTiles(); return; } // Node direction as an int int nodeDir = (node.edgeId + 3) % 6; // Invalid starting position for this piece if (nodeDir != placementPiece.Piece.direction) { UnhighlightPlacementTiles(); return; } // Validation passed, so place the piece players[turnIndex].PlacePiece(placementPiece, node); placementPiece.Placed = true; // Disable components that were used for placement purposes Destroy(placementPiece.gameObject.GetComponent <MeshCollider>()); //Destroy(placementPiece.gameObject.GetComponent<PlacementPiece>()); // Setup for the next placement placementPiece = null; UnhighlightPlacementTiles(); placementTiles.Remove(node); NextTurn(); }
/// <summary> /// Handles turns for AI players. /// </summary> private IEnumerator AITurn() { // AI delay before continuing yield return(new WaitForSeconds(AIPlayer.AIDelay)); if (state == State.Placement) { // Get a placement move PlacementMove pm = ((AIPlayer)players[turnIndex]).PlacementMove(); placementPiece = pm.PlacementPiece; // Click the placement piece placementPiece.OnMouseUpAsButton(); yield return(new WaitForSeconds(AIPlayer.AIDelay)); // Click the placement tile SelectedTile(pm.Destination); } else { // Get a weighted move WeightedMove wm = players[turnIndex].DoTurn(); // Do the turn SelectedTile(wm.piece.GetNode()); yield return(new WaitForSeconds(AIPlayer.AIDelay)); SelectedTile(wm.dest); } }
/// <summary> /// AI makes a random placement move. /// </summary> /// <returns>The placement move</returns> public PlacementMove PlacementMove() { // Map of piece placement options Dictionary <PlacementPiece, List <TileNode> > availablePlacements = new Dictionary <PlacementPiece, List <TileNode> >(); // Populate the map foreach (PlacementPiece placementPiece in PlacementPieces) { List <TileNode> availableTiles = placementPiece.GetAvailableTiles(); if (availableTiles.Count > 0) { availablePlacements.Add(placementPiece, availableTiles); } } // Get a random piece List <PlacementPiece> availablePieces = new List <PlacementPiece>(availablePlacements.Keys); PlacementPiece randomPiece = availablePieces[new System.Random().Next(0, availablePieces.Count)]; // Get a random tile List <TileNode> tiles = availablePlacements[randomPiece]; TileNode randomTile = tiles[new System.Random().Next(0, tiles.Count)]; return(new PlacementMove(randomPiece, randomTile)); }
/// Places the specified piece onto the node. /// </summary> /// <param name="node">the node to place the piece onto</param> public void PlacePiece(PlacementPiece placementPiece, TileNode node) { // Add the piece to the game AddTower(new PieceTower(this, placementPiece.Piece, node)); // Must remove the placed piece from the available placement pieces list placementPieces.Remove(placementPiece); }
void CreatePlacement() { placementPiece = new PlacementPiece(this.cost, this.tag); if (tempPlacement != null) { Destroy(tempPlacement.gameObject); } if (rangeIndicator != null) { Destroy(rangeIndicator.gameObject); } //create a piece that is shown to the user, a fake kinematic object switch (this.tag) { case "Turret": tempPlacement = Instantiate(turret) as Transform; rangeIndicator = Instantiate(range) as Transform; rangeIndicator.transform.parent = tempPlacement; break; case "Collector": tempPlacement = Instantiate(collector) as Transform; tempPlacement.GetComponentInChildren <ResourceCollector>().enabled = false; rangeIndicator = Instantiate(range) as Transform; rangeIndicator.transform.parent = tempPlacement; break; case "Wall": tempPlacement = Instantiate(wall) as Transform; if (rangeIndicator != null) { Destroy(rangeIndicator.gameObject); } break; } if (this.tag != "Wall") { rangeIndicator.renderer.enabled = false; } foreach (Transform child in tempPlacement) { if (child.GetComponent <SpriteRenderer>() != null) { child.renderer.enabled = false; child.GetComponent <SpriteRenderer>().sortingOrder -= 4; child.GetComponent <SpriteRenderer>().sortingLayerName = "UI"; } } rendererDisabled = true; }
/// <summary> /// Randomly places pieces for the players. /// </summary> private void RandomPlacement() { turnIndex = 0; // Keep placing until done while (placementTiles.Count > 0 && players[turnIndex].PlacementPieces.Count > 0) { // Get a random piece List <PlacementPiece> placementPieces = players[turnIndex].PlacementPieces; PlacementPiece randomPiece = placementPieces[new System.Random().Next(0, placementPieces.Count)]; List <TileNode> availableTiles = randomPiece.GetAvailableTiles(); // If this piece can't be placed, get one that can if (availableTiles.Count == 0) { for (int i = 0; i < placementPieces.Count; i++) { availableTiles = placementPieces[i].GetAvailableTiles(); if (availableTiles.Count > 0) { randomPiece = placementPieces[i]; break; } } } TileNode randomTile = availableTiles[new System.Random().Next(0, availableTiles.Count)]; // Place the random piece onto a random edge tile for its direction getPlayerByColour(randomPiece.Piece.colour).PlacePiece(randomPiece, randomTile); randomPiece.Placed = true; // Cleanup, can't use PlacementAction for this because we dont want to call next turn yet Destroy(randomPiece.gameObject.GetComponent <MeshCollider>()); placementTiles.Remove(randomTile); // Increment turn index turnIndex = (turnIndex + 1) % players.Length; totalTurns++; if (turnIndex == 0) { currentCycle++; } } // Setup for next turn turnIndex--; }
void CreatePlacement() { placementPiece = new PlacementPiece(this.cost, this.tag); if (tempPlacement != null) Destroy(tempPlacement.gameObject); if (rangeIndicator != null) Destroy(rangeIndicator.gameObject); //create a piece that is shown to the user, a fake kinematic object switch (this.tag) { case "Turret": tempPlacement = Instantiate(turret) as Transform; rangeIndicator = Instantiate(range) as Transform; rangeIndicator.transform.parent = tempPlacement; break; case "Collector": tempPlacement = Instantiate(collector) as Transform; tempPlacement.GetComponentInChildren<ResourceCollector>().enabled = false; rangeIndicator = Instantiate(range) as Transform; rangeIndicator.transform.parent = tempPlacement; break; case "Wall": tempPlacement = Instantiate(wall) as Transform; if (rangeIndicator != null) Destroy(rangeIndicator.gameObject); break; } if (this.tag != "Wall") { rangeIndicator.renderer.enabled = false; } foreach (Transform child in tempPlacement) { if (child.GetComponent<SpriteRenderer>() != null) { child.renderer.enabled = false; child.GetComponent<SpriteRenderer>().sortingOrder -= 4; child.GetComponent<SpriteRenderer>().sortingLayerName = "UI"; } } rendererDisabled = true; }
private void PlacePiece() { center.PlacePiece(placementPiece, this); //reset our placement piece placementPiece = new PlacementPiece(this.cost, this.tag); //remove the placment piece after it's set because now it was replaced by a real tower if (!BlorbManager.Instance.HasEnoughResources(this.cost)) { StopPlacement(); } possiblePlacements = new ArrayList(); //reinit building process center.RecalculateAllPossiblePlacements(); }
public void PlacePiece(PlacementPiece placementPiece, Placement selectedTower = null) { if (!isActive) return; //get the location of the top of the base Color color = new Color(1f, 1f, 1f); //normal color switch (placementPiece.type) { case "Placement": placementPiece.piece = placement; color = PlacementBottom.unSelectedColor; break; case "Turret": placementPiece.piece = turret; break; case "Wall": placementPiece.piece = wall; break; case "Collector": placementPiece.piece = collector; break; } //create the placement piece Transform tower = Instantiate(placementPiece.piece) as Transform; tower.tag = placementPiece.type; tower.transform.parent = basePiece; if (placementPiece.type == "Placement") { tower.GetComponent<SpriteRenderer>().color = color; tower.GetComponent<PlacementBottom>().pseudoParent = placementPiece.parent; tower.GetComponent<SpriteRenderer>().receiveShadows = false; } else { tower.GetComponent<Attachments>().cost = placementPiece.cost; } float xOffset = (placementPiece.type == "Placement" ? (placementPiece.parent.transform.localPosition.x //get offset from nearest parent + (GetPixelOffset() + placementOffset) * placementPiece.direction[0]) : placementPiece.positionToSnap.x); //or just place it exactly where there was a placement piece float yOffset = (placementPiece.type == "Placement" ? (placementPiece.parent.transform.localPosition.y + (GetPixelOffset() + placementOffset) * placementPiece.direction[1]) : placementPiece.positionToSnap.y); tower.transform.localPosition = new Vector3(xOffset, yOffset); if (placementPiece.type != "Placement") { tower.GetComponent<FixedJoint>().anchor = tower.transform.localPosition; tower.GetComponent<FixedJoint>().connectedAnchor = tower.transform.localPosition; tower.GetComponent<FixedJoint>().connectedBody = this.GetComponent<Rigidbody>(); BlorbManager.Instance.Transaction(-placementPiece.cost, tower.transform.position, selectedTower); } }
public void PlacePiece(PlacementPiece placementPiece, Placement selectedTower = null) { if (!isActive) { return; } //get the location of the top of the base Color color = new Color(1f, 1f, 1f); //normal color switch (placementPiece.type) { case "Placement": placementPiece.piece = placement; color = PlacementBottom.unSelectedColor; break; case "Turret": placementPiece.piece = turret; break; case "Wall": placementPiece.piece = wall; break; case "Collector": placementPiece.piece = collector; break; } //create the placement piece Transform tower = Instantiate(placementPiece.piece) as Transform; tower.tag = placementPiece.type; tower.transform.parent = basePiece; if (placementPiece.type == "Placement") { tower.GetComponent <SpriteRenderer>().color = color; tower.GetComponent <PlacementBottom>().pseudoParent = placementPiece.parent; tower.GetComponent <SpriteRenderer>().receiveShadows = false; } else { tower.GetComponent <Attachments>().cost = placementPiece.cost; } float xOffset = (placementPiece.type == "Placement" ? (placementPiece.parent.transform.localPosition.x //get offset from nearest parent + (GetPixelOffset() + placementOffset) * placementPiece.direction[0]) : placementPiece.positionToSnap.x); //or just place it exactly where there was a placement piece float yOffset = (placementPiece.type == "Placement" ? (placementPiece.parent.transform.localPosition.y + (GetPixelOffset() + placementOffset) * placementPiece.direction[1]) : placementPiece.positionToSnap.y); tower.transform.localPosition = new Vector3(xOffset, yOffset); if (placementPiece.type != "Placement") { tower.GetComponent <FixedJoint>().anchor = tower.transform.localPosition; tower.GetComponent <FixedJoint>().connectedAnchor = tower.transform.localPosition; tower.GetComponent <FixedJoint>().connectedBody = this.GetComponent <Rigidbody>(); BlorbManager.Instance.Transaction(-placementPiece.cost, tower.transform.position, selectedTower); } }
/// <summary> /// Constructor. /// </summary> /// <param name="placementPiece">The placement piece</param> /// <param name="destination">The destination tile node</param> public PlacementMove(PlacementPiece placementPiece, TileNode destination) { this.placementPiece = placementPiece; this.destination = destination; }