Exemplo n.º 1
0
    public void TransitionTo(GridPoint target, GridPoint pointToMoveThrough, HexagonBase next)
    {
        if (isTransitioning)
        {
            return;
        }

        Vector3 t = hexField.SpacePoint(target);
        Vector3 g = hexField.SpacePoint(gridPoint);
        Vector3 m = hexField.SpacePoint(pointToMoveThrough);

        if ((t - g).sqrMagnitude > hexField.gridSize * hexField.gridSize * 2.9f || (m - g).sqrMagnitude > hexField.gridSize * hexField.gridSize * 2.9f)
        {
            throw new ArgumentException("Target or moveThrough point not adjacent to hexagon");
        }
        if (Vector3.Cross(t - g, m - g).y < 0)
        {
            rotateClockwise();
            rotateClockwise();
        }
        else
        {
            rotateCounterClockwise();
            rotateCounterClockwise();
        }
        isTransitioning = true;
        rotationPoint   = (t * 2.0f + g * 2.0f - m) / 3.0f;
        gridPoint       = target;
        hexToRotateNext = next;
    }
Exemplo n.º 2
0
    bool checkElectrified()
    {
        GridPoint g = hexHandler.closestGridPoint(new Vector2(gameObject.transform.position.x, gameObject.transform.position.z));

        if (hexHandler.inRange(g))
        {
            HexagonBase nearestHex = hexHandler.getHexagon(g);
            if (nearestHex.isHexagonPowered() && inLethalRange(nearestHex))
            {
                return(true);
            }
            else
            {
                foreach (GridPoint gP in nearestHex.gridPoint.AdjacentPoints())
                {
                    if (hexHandler.inRange(gP))
                    {
                        HexagonBase hB = hexHandler.getHexagon(gP);
                        if (hB.isHexagonPowered() && inLethalRange(hB))
                        {
                            return(true);
                        }
                    }
                }
            }
        }
        return(false);
    }
Exemplo n.º 3
0
    bool inLethalRange(HexagonBase hB)
    {
        float x1 = hB.gameObject.transform.position.x;
        float y1 = hB.gameObject.transform.position.z;
        float x2 = gameObject.transform.position.x;
        float y2 = gameObject.transform.position.z;

        if ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) < LETHAL_RANGE * LETHAL_RANGE)
        {
            return(true);
        }
        return(false);
    }
Exemplo n.º 4
0
    public void removeHexagon(GridPoint g)
    {
        HexagonBase hb = getHexagon(g);

        if (hb != null)
        {
            hb.gameObject.SetActive(false);
        }
        grid [g.u + 50] [g.v + 50]           = ((GameObject)Instantiate(hexagonDummy, SpacePoint(g), Quaternion.identity)).GetComponent <HexagonDummy> ();
        grid [g.u + 50] [g.v + 50].gridPoint = g;
        grid [g.u + 50] [g.v + 50].hexField  = this;
        GridPoint[] neis = g.AdjacentPointsCircular();
        for (int i = 1; i <= 6; ++i)
        {
            if ((!inRange(neis [i])) || (!inRange(neis [i - 1])) || (!inRange(neis [i + 1])))
            {
                HexagonBase newHex = ((GameObject)Instantiate(hexagon, SpacePoint(g), Quaternion.identity)).GetComponent <HexagonPower> ();
                grid [g.u + 50] [g.v + 50].gameObject.SetActive(false);
                grid [g.u + 50] [g.v + 50] = newHex;
                newHex.transform.SetParent(map.transform);
                newHex.hexField  = this;
                newHex.gridPoint = g;
                break;
            }
            if (getHexagon(neis [i]) is HexagonDummy)
            {
                getHexagon(neis [i]).gameObject.SetActive(false);
                GridPoint gpToRotate = neis [i - 1];
                if (neis [i - 1].RawPlainPoint().SqrMagnitude() < neis [i + 1].RawPlainPoint().SqrMagnitude())
                {
                    gpToRotate = neis [i + 1];
                }
                HexagonBase hexToRotate = getHexagon(gpToRotate);
                if (hexToRotate is HexagonPower && (!((HexagonPower)hexToRotate).isRotating()))
                {
                    if (!hexToRotate.gridPoint.Equals(gpToRotate))
                    {
                        throw new MissingComponentException("Hexagon is not at its grid point " + gpToRotate.ToString() + " but instead at " + hexToRotate.gridPoint);
                    }
                    HexagonBase hd = ((GameObject)Instantiate(hexagonDummyTrans, SpacePoint(gpToRotate), Quaternion.identity)).GetComponent <HexagonBase> ();
                    hd.gridPoint = gpToRotate;
                    hd.hexField  = this;
                    ((HexagonPower)hexToRotate).TransitionTo(neis [i], g, hd);
                    grid [neis [i].u + 50] [neis [i].v + 50]     = hexToRotate;
                    grid [gpToRotate.u + 50] [gpToRotate.v + 50] = hd;
                    break;
                }
            }
        }
    }
Exemplo n.º 5
0
    void electrify()
    {
        GridPoint nearestGridPoint = hexHandler.closestGridPoint(new Vector2(gameObject.transform.position.x, gameObject.transform.position.z));

        List <Wire> hitWires = new List <Wire>();

        HexagonBase nexHexBase = hexHandler.getHexagon(nearestGridPoint);

        if (nexHexBase is HexagonPower)           //ha vmi megrázza, akkor a egközelebbi hatszög biztosan hatótávon belül van
        {
            foreach (Wire w in ((HexagonPower)nexHexBase).wires)
            {
                if (w != null)
                {
                    if (w.powered)
                    {
                        hitWires.Add(w);
                    }
                }
            }
        }

        foreach (GridPoint gPoint in nearestGridPoint.AdjacentPoints())
        {
            HexagonBase hexBase = hexHandler.getHexagon(gPoint);
            if (hexBase is HexagonPower)
            {
                HexagonPower hex = (HexagonPower)hexBase;
                if (inLethalRange(hexBase))
                {
                    foreach (Wire w in hex.wires)
                    {
                        if (w != null)
                        {
                            if (w.powered)
                            {
                                hitWires.Add(w);
                            }
                        }
                    }
                }
            }
        }

        int killerWireIndex = Random.Range(0, hitWires.Count);

        hitWires [killerWireIndex].Kill();
        gameObject.GetComponent <ZombieScript> ().Die();
    }
Exemplo n.º 6
0
    void rotateRandom()
    {
        int       randomX         = Random.Range(-3, 4);
        int       randomY         = Random.Range(-3, 4);
        int       direction       = Random.Range(0, 2);
        GridPoint targetGridPoint = new GridPoint(randomX, randomY);

        if (hexField.inRange(targetGridPoint))
        {
            HexagonBase targetHex = hexField.getHexagon(targetGridPoint);
            if (direction == 0)
            {
                targetHex.rotateClockwise();
            }
            else
            {
                targetHex.rotateCounterClockwise();
            }
        }
    }
Exemplo n.º 7
0
    void hoverWireRecursion(GridPoint currentGridPoint, int powerEntryPoint)
    {
        GridPoint nextGridPoint = currentGridPoint.AdjacentPointsCircular() [powerEntryPoint + 3];

        if (inRange(nextGridPoint))
        {
            HexagonBase hexBase = getHexagon(nextGridPoint);
            if (hexBase is HexagonPower)
            {
                HexagonPower nextHexPower = (HexagonPower)hexBase;
                Wire         activeWire   = nextHexPower.getWireAtEntryPoint(powerEntryPoint);
                if ((activeWire != null) && !nextHexPower.isRotating() && !activeWire.hover)
                {
                    activeWire.setHover(true);
                    int nextPowerEntryPoint = nextHexPower.otherEndpointOfWire(powerEntryPoint);
                    hoverWires.Add(activeWire);
                    hoverWireRecursion(nextGridPoint, (nextPowerEntryPoint + 3) % 6);
                }
            }
        }
    }
Exemplo n.º 8
0
    void emitPowerRecursion(GridPoint currentGridPoint, int powerEntryPoint)
    {
        GridPoint nextGridPoint = currentGridPoint.AdjacentPointsCircular() [powerEntryPoint + 3];

        if (hexField.inRange(nextGridPoint))
        {
            HexagonBase hexBase = hexField.getHexagon(nextGridPoint);
            if (hexBase is HexagonPower)
            {
                HexagonPower nextHexPower = (HexagonPower)hexBase;
                Wire         activeWire   = nextHexPower.getWireAtEntryPoint(powerEntryPoint);
                if ((activeWire != null) && !nextHexPower.isRotating())
                {
                    activeWire.setPowered(true);
                    int nextPowerEntryPoint = nextHexPower.otherEndpointOfWire(powerEntryPoint);
                    poweredWires.Add(activeWire);
                    emitPowerRecursion(nextGridPoint, ((nextPowerEntryPoint + 9) % 6));
                }
            }
        }
    }
Exemplo n.º 9
0
    void Awake()
    {
        hexagon                = globalPrefabs.getPrefab("Hexagon");
        hexagonCore            = globalPrefabs.getPrefab("HexCore");
        hexagonDummy           = globalPrefabs.getPrefab("HexDummy");
        hexagonDummyTrans      = globalPrefabs.getPrefab("HexDummyInTransition");
        hexagonDefaultMaterial = globalPrefabs.getMaterial("HexagonDefaultMaterial");
        hexagonHoverMaterial   = globalPrefabs.getMaterial("HexagonHoverMaterial");
        clickableMask          = LayerMask.GetMask("Clickable");

        map      = new GameObject();
        map.name = "Map";
        map.transform.SetParent(this.transform);

        grid = new HexagonBase[101][];
        for (int i = -50; i < 50; ++i)
        {
            grid [i + 50] = new HexagonBase[101];
            for (int j = -50; j < 50; ++j)
            {
                if ((i != 0) || (j != 0))
                {
                    GridPoint gp = new GridPoint(i, j);
                    if (inRange(gp))
                    {
                        grid [i + 50] [j + 50] = ((GameObject)Instantiate(hexagon, SpacePoint(gp), Quaternion.identity)).GetComponent <HexagonBase> ();
                        grid [i + 50] [j + 50].transform.SetParent(map.transform);
                        grid [i + 50] [j + 50].hexField  = this;
                        grid [i + 50] [j + 50].gridPoint = gp;
                    }
                }
            }
        }
        GridPoint origin = new GridPoint(0, 0);

        grid [50] [50] = ((GameObject)Instantiate(hexagonCore, SpacePoint(origin), Quaternion.identity)).GetComponent <HexCoreScript> ();
        grid [50] [50].transform.SetParent(map.transform);
        grid [50] [50].gridPoint = origin;
    }
Exemplo n.º 10
0
    // Update is called once per frame
    void Update()
    {
        Vector2    mousexy = Input.mousePosition;
        Ray        camRay  = GetComponentInChildren <Camera>().ScreenPointToRay(mousexy);
        RaycastHit floorHit;
        Vector2    mousepos = new Vector2();

        foreach (Wire w in hoverWires)
        {
            w.setHover(false);
        }
        hoverWires.Clear();
        if (Physics.Raycast(camRay, out floorHit, camRayLength, clickableMask))
        {
            mousepos.x = floorHit.point.x;
            mousepos.y = floorHit.point.z;
            if (inRange(closestGridPoint(mousepos)))
            {
                actDot = closestGridPoint(mousepos);
                HexagonBase actHexagon = getHexagon(actDot);

                float scrollWheel = Input.GetAxis("Mouse ScrollWheel");
                if (scrollWheel < 0)
                {
                    actHexagon.rotateClockwise();
                }
                else if (scrollWheel > 0)
                {
                    actHexagon.rotateCounterClockwise();
                }

                if (actHexagon is HexagonPower)
                {
                    HexagonPower hex      = (HexagonPower)actHexagon;
                    Vector3      deltaVec = floorHit.point - SpacePoint(actDot);
                    int          selectedWireEnd;
                    if (Vector3.Cross(deltaVec, Vector3.forward).y < 0)
                    {
                        //right half
                        if (Vector3.Cross(deltaVec, corner34).y < 0)
                        {
                            //2&3
                            if (Vector3.Cross(deltaVec, corner45).y < 0)
                            {
                                selectedWireEnd = 2;
                            }
                            else
                            {
                                selectedWireEnd = 3;
                            }
                        }
                        else
                        {
                            selectedWireEnd = 4;
                        }
                    }
                    else
                    {
                        if (Vector3.Cross(deltaVec, corner34).y < 0)
                        {
                            selectedWireEnd = 1;
                        }
                        else if (Vector3.Cross(deltaVec, corner45).y < 0)
                        {
                            selectedWireEnd = 0;
                        }
                        else
                        {
                            selectedWireEnd = 5;
                        }
                    }
                    //selectedWireEnd = Mathf.FloorToInt (
                    //	                     13.0f - Mathf.Atan2 (-0.5f * deltaVec.x + sqrt3p2 * deltaVec.z, -sqrt3p2 * deltaVec.x - 0.5f * deltaVec.z) * 3.0f / Mathf.PI) % 6;
                    Wire currentWire = hex.getWireAtEntryPoint(selectedWireEnd);
                    if (currentWire)
                    {
                        currentWire.setHover(true);
                        hoverWires.Add(currentWire);
                    }
                    hoverWireRecursion(actDot, (selectedWireEnd + 3) % 6);
                    int opposite = hex.otherEndpointOfWire(selectedWireEnd);
                    hoverWireRecursion(actDot, (opposite + 3) % 6);
                }

                if (Input.GetMouseButtonDown(0))
                {
                    leftClickHappened = true;
                }
                if (Input.GetMouseButtonDown(1))
                {
                    rightClickHappened = true;
                }

                if (leftClickHappened && (actHexagon is HexagonPower || actHexagon is HexCoreScript))
                {
                    actHexagon.rotateCounterClockwise();
                    leftClickHappened = false;
                }

                if (rightClickHappened && (actHexagon is HexagonPower || actHexagon is HexCoreScript))
                {
                    actHexagon.rotateClockwise();
                    rightClickHappened = false;
                }
            }
        }
    }