void unitSelectedRightClick(RaycastHit hit, unitScript unit)
    {
        clickableTile tile = hit.collider.gameObject.GetComponent <clickableTile>();

        if (tile)
        {
            GridItem tilePos = tile.GetComponent <GridItem>();
            GridItem pos     = selected.GetComponent <GridItem>();

            if (!unit.hasMoved())
            {
                //draw path only if not in attack mode
                Vector2[] path = pathFinder.drawPath(tilePos.getPos(), !attackMode);


                if (path != null)
                {
                    if (!attackMode && !unit.hasMoved())
                    {
                        map.UnHilightMap();
                        //map.toggleHighlight(false, Color.white, pos.getX(), pos.getY(), unit.getSpeed());
                        unit.setPath(path);
                        pathFinder.setPathfinding(false);
                    }
                }
            }
            if (attackMode && unit.getCurrentWeapon().type == WeaponType.shield)
            {
                activateShield(unit, tilePos);
            }
        }
        //If not tile may be unit
        unitScript clickedUnit = hit.collider.gameObject.GetComponent <unitScript>();

        // if is enemy unit
        if (attackMode && !unit.hasAttacked() && clickedUnit && clickedUnit.getOwner() != 0)
        {
            Attack(unit, clickedUnit);
        }
    }
Beispiel #2
0
    public void toggleHighlight(bool highlight, Color color, int x, int y, int size)
    {
        Dictionary <Vector2, Vector2> cameFrom          = new Dictionary <Vector2, Vector2>();
        Dictionary <Vector2, int>     distanceFromStart = new Dictionary <Vector2, int>();
        Queue   frontier = new Queue();
        Vector2 start    = new Vector2(x, y);

        cameFrom[start]          = new Vector2(-1, -1);
        distanceFromStart[start] = 0;
        frontier.Enqueue(start);

        while (frontier.Count > 0)
        {
            Vector2       current     = (Vector2)frontier.Dequeue();
            clickableTile currentTile = tileVisual[Mathf.FloorToInt(current.x), Mathf.FloorToInt(current.y)].GetComponent <clickableTile>();

            if (highlight)
            {
                currentTile.HighLight(color);
            }
            else
            {
                currentTile.unHilight();
            }

            foreach (Vector2 neibour in getNeibour(current))
            {
                if (cameFrom.ContainsKey(neibour) == false && distanceFromStart[current] + 1 <= size)
                {
                    cameFrom[neibour]          = current;
                    distanceFromStart[neibour] = distanceFromStart[current] + 1;
                    frontier.Enqueue(neibour);
                }
            }
        }
    }
Beispiel #3
0
    void GenerateMapVisuals()
    {
        tileVisual    = new GameObject[xSize, ySize];
        objectVisuals = new Dictionary <Vector2, GameObject>();
        modiferVisual = new Dictionary <Vector2, GameObject>();
        spawnVisual   = new Dictionary <Vector2, GameObject>();
        for (int x = 0; x < xSize; x++)
        {
            for (int y = 0; y < ySize; y++)
            {
                float yPos = tileTypes[tiles[x, y]].height * 5.0f;

                tileVisual[x, y] = createTile(x, y, 0, yPos);
                clickableTile tile = tileVisual[x, y].GetComponent <clickableTile>();
                tile.updateValues(tileTypes[tiles[x, y]]);

                if (objects.ContainsKey(new Vector2(x, y)))
                {
                    //print("ADD OBJECT AT " + x + "," + y);
                    int objectIndex = objects[new Vector2(x, y)][0];
                    int rotation    = objects[new Vector2(x, y)][1];
                    setObject(x, y, rotation, objectIndex);
                }
                if (modifers.ContainsKey(new Vector2(x, y)))
                {
                    int index = modifers[new Vector2(x, y)];
                    setModifer(x, y, index);
                }
                if (spawnData.ContainsKey(new Vector2(x, y)))
                {
                    int spawnIndex = spawnData[new Vector2(x, y)];
                    setSpawner(x, y, spawnIndex);
                }
            }
        }
    }
    void mouseOver()
    {
        //Mouse over tile while unit selected
        if (selected)
        {
            unitScript unit = selected.GetComponent <unitScript>();
            if (unit != null && unit.getOwner() == 0)
            {
                RaycastHit hit;
                var        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                if (Physics.Raycast(ray, out hit, Mathf.Infinity, (1 << 8)))
                {
                    clickableTile tile = hit.collider.gameObject.GetComponent <clickableTile>();

                    if (tile && !unit.hasMoved() && !attackMode)
                    {
                        GridItem tilePos = tile.GetComponent <GridItem>();
                        //print(tilePos);
                        if (pathFinder != null)
                        {
                            pathFinder.drawPath(tilePos.getPos());
                        }
                        else
                        {
                            print("pathfinder dead");
                        }
                    }

                    unitScript enemyUnit = hit.collider.GetComponent <unitScript>();

                    if (enemyUnit && attackMode == true && enemyUnit.getOwner() != 0)
                    {
                        GridItem playerPos = unit.GetComponent <GridItem>();
                        GridItem enemyPos  = hit.collider.GetComponent <GridItem>();

                        MeleeWeapon currentMeleeWeapon = null;
                        if (unit.getCurrentWeapon().type == WeaponType.melee)
                        {
                            currentMeleeWeapon = (MeleeWeapon)unit.getCurrentWeapon();


                            bool withinMeleeRange = currentMeleeWeapon != null && Vector2.Distance(enemyPos.getPos(), playerPos.getPos()) <= currentMeleeWeapon.range;
                            if (withinMeleeRange || currentMeleeWeapon == null)
                            {
                                GUIController cont = gui.GetComponent <GUIController>();

                                cont.setCombatPanelVisibility(true, unit, enemyUnit, meleeChanceToHit(unit, enemyUnit));
                            }
                        }
                        else if (unit.getCurrentWeapon().type == WeaponType.ranged)
                        {
                            if (canSee(unit, enemyUnit))
                            {
                                rangeRenderer.enabled = true;
                                updateRangefinder(unit, enemyUnit.GetComponent <GridItem>());
                                GUIController cont     = gui.GetComponent <GUIController>();
                                float         distance = Vector2.Distance(unit.GetComponent <GridItem>().getPos(), enemyUnit.GetComponent <GridItem>().getPos());

                                cont.setCombatPanelVisibility(true, unit, enemyUnit, rangedChanceToHit(unit, enemyUnit));
                                cont.loadRangedData(isShielded(unit, enemyUnit), getBaseHitChance(unit), getRangePenalty(unit, distance), getCoverPenalty(unit, enemyUnit, distance));
                            }
                            else if (rangeRenderer.enabled == true)
                            {
                                rangeRenderer.enabled = false;
                            }
                        }
                    }
                    else
                    {
                        GUIController cont = gui.GetComponent <GUIController>();

                        cont.setCombatPanelVisibility(false);
                        rangeRenderer.enabled = false;
                    }
                }
            }
        }

        //We also want to set the enemyStatPanel

        RaycastHit result;
        Ray        line = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(line, out result, Mathf.Infinity, (1 << 8)))
        {
            //set selected to hit
            GameObject enemy = result.collider.gameObject;

            //Select new unit
            if (enemy)
            {
                var        guiCont = gui.GetComponent <GUIController>();
                unitScript unit    = enemy.GetComponent <unitScript>();

                if (unit != null && unit.getOwner() == 1)
                {
                    guiCont.setCharacterPanelVisibility(true, unit, false);
                }
                else
                {
                    guiCont.setCharacterPanelVisibility(false, null, false);
                }
            }
        }
    }