Ejemplo n.º 1
0
    /// <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();
    }
Ejemplo n.º 2
0
    /// <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);
        }
    }
Ejemplo n.º 3
0
    /// <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));
    }
Ejemplo n.º 4
0
    /// 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);
    }
Ejemplo n.º 5
0
    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;
    }
Ejemplo n.º 6
0
    /// <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--;
    }
Ejemplo n.º 7
0
    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;
    }
Ejemplo n.º 8
0
    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();
    }
Ejemplo n.º 9
0
    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();
    }
Ejemplo n.º 10
0
    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);
        }
    }
Ejemplo n.º 11
0
    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);
        }
    }
Ejemplo n.º 12
0
 /// <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;
 }