Пример #1
0
    public override IEnumerable <Tile> GetTargets()
    {
        var movement       = unit.movement.current;
        var freeMovement   = movement - usedMovement;
        var energyMovement = GetPaidMovement(movement, unit.energy.current);
        var maxCost        = freeMovement + energyMovement;
        var res            = Pathing.GetCostField(unit.tile, maxCost: maxCost, pather: Pathers.For(rangeMode), costCalculator: CostCalculators.For(rangeMode)).tiles.Keys;

        return(res);
    }
Пример #2
0
 public PathConfirmAbilityTargeter(Unit unit, TargetAbility ability, float maxCost, Action <Targeter> onComplete, Action <Targeter> onCancel = null) : base(unit, ability, onComplete, onCancel)
 {
     pather ??= Pathers.For(ability.rangeMode);
     cc ??= CostCalculators.For(ability.rangeMode);
     field = Pathing.GetCostField(unit.tile, maxCost: maxCost, pather: pather, costCalculator: cc);
 }
Пример #3
0
    protected virtual void OnSceneGUI()
    {
        if (!grid)
        {
            return;
        }

        var ray = HandleUtility.GUIPointToWorldRay(UnityEngine.Event.current.mousePosition);

        t.hoverHex = grid.RaycastHex(ray);

        var mousePos = Vector2.zero;

        if (new Plane(Vector3.up, Vector3.zero).Raycast(ray, out float enter))
        {
            mousePos = (ray.origin + ray.direction * enter).xz();
        }

        t.hover = grid.GetTile(t.hoverHex);
        t.main  = grid.GetTile(t.mainHex);

        UnityEngine.Event e = UnityEngine.Event.current;
        if (e.type == EventType.MouseDown && e.button == 0)
        {
            t.mainHex = t.hoverHex;
            e.Use();
        }

        var distance = Hex.Distance(t.hoverHex, t.mainHex);

        DrawHex(t.mainHex, ChangeAlpha(Color.red, 0.25f));
        DrawHex(t.hoverHex, ChangeAlpha(Color.yellow, 0.25f));


        if (t.draw is GridTester.Draw.Line or GridTester.Draw.SmartLine)
        {
            foreach (var tile in t.draw == GridTester.Draw.Line ? grid.Line(t.mainHex, t.hoverHex) : grid.SmartLine(t.mainHex, t.hoverHex))
            {
                DrawTile(tile, lightBlue);
            }
            foreach (var pair in Hex.Line(t.mainHex, t.hoverHex))
            {
                var fractHex  = pair.Item2;
                var ws        = Layout.HexToPoint(fractHex);
                var spherePos = new Vector3(ws.x, 0, ws.y);
                Handles.SphereHandleCap(0, spherePos, Quaternion.identity, 0.25f, EventType.Repaint);
            }
        }
        if (t.draw == GridTester.Draw.Radius)
        {
            foreach (var tile in grid.Radius(t.mainHex, distance))
            {
                DrawTile(tile, lightBlue);
            }
        }
        if (t.draw == GridTester.Draw.Ring)
        {
            foreach (var tile in grid.Ring(t.mainHex, distance))
            {
                DrawTile(tile, lightBlue);
            }
        }
        if (t.draw == GridTester.Draw.Spiral)
        {
            var i     = 0;
            var total = 3 * Mathf.Pow(distance + 1, 2) - 3 * (distance + 1) + 1;
            foreach (var tile in grid.Spiral(t.mainHex, distance))
            {
                var color = Color.Lerp(Color.green, Color.red, i++ / total);
                DrawTile(tile, color);
            }
        }

        if (t.draw == GridTester.Draw.Nearest)
        {
            var nearest = grid.NearestTile(mousePos);
            if (nearest)
            {
                DrawTile(nearest, lightBlue);
            }
        }
        if (t.draw == GridTester.Draw.NearestSpiralSearch)
        {
            var nearest = grid.NearestTileSpiralSearch(mousePos, 10);
            if (nearest)
            {
                DrawTile(nearest, lightBlue);
            }
        }

        if (t.draw == GridTester.Draw.CostField && t.main != null)
        {
            var result = Pathing.GetCostField(t.main);
            foreach (var kv in result.tiles)
            {
                DrawTile(kv.Key, Color.Lerp(Color.green, Color.red, kv.Value.cost / 15f));
            }
        }
        if (t.draw == GridTester.Draw.DistanceField && t.main != null)
        {
            var result = Pathing.GetDistanceField(t.main);
            foreach (var kv in result.tiles)
            {
                DrawTile(kv.Key, Color.Lerp(Color.green, Color.red, kv.Value.cost / 15f));
            }
        }

        if (t.draw == GridTester.Draw.Flood && t.main != null)
        {
            foreach (var tile in grid.Flood(t.main))
            {
                DrawTile(tile, lightBlue);
            }
        }
        if (t.draw == GridTester.Draw.Areas)
        {
            var areas = grid.GetAreas();
            foreach (var area in areas)
            {
                var r     = new System.Random(area.Value);
                var color = new Color(r.Next(64, 256) / 256f, r.Next(64, 256) / 256f, r.Next(64, 256) / 256f);
                DrawTile(area.Key, color);
            }
        }
        if (t.draw == GridTester.Draw.Vision)
        {
            foreach (var tile in grid.Vision(t.mainHex, distance))
            {
                DrawTile(tile, lightBlue);
            }
        }

        if (t.draw == GridTester.Draw.CheapestPath && t.main != null && t.hover != null)
        {
            Pathing.CheapestPath(t.main, t.hover, out var result);
            foreach (var kv in result.tiles)
            {
                DrawTile(kv.Key, Color.Lerp(Color.green, Color.red, kv.Value.cost / 15f));
            }
            foreach (var segment in result.path)
            {
                DrawTile(segment, Color.blue);
            }
        }
        if (t.draw == GridTester.Draw.ShortestPath && t.main != null && t.hover != null)
        {
            Pathing.ShortestPath(t.main, t.hover, out var result);
            foreach (var kv in result.tiles)
            {
                DrawTile(kv.Key, Color.Lerp(Color.green, Color.red, kv.Value.cost / 15f));
            }
            foreach (var segment in result.path)
            {
                DrawTile(segment, Color.blue);
            }
        }
        if (t.draw == GridTester.Draw.FirstPath && t.main != null && t.hover != null)
        {
            Pathing.FirstPath(t.main, t.hover, out var result);
            foreach (var kv in result.tiles)
            {
                DrawTile(kv.Key, Color.Lerp(Color.green, Color.red, kv.Value.cost / 15f));
            }
            foreach (var segment in result.path)
            {
                DrawTile(segment, Color.blue);
            }
        }


        if (t.paint)
        {
            if (t.paintTile == null)
            {
                Game.grid.DestroyTile(t.mainHex);

#if UNITY_EDITOR
                foreach (Transform child in Game.game.transform)
                {
                    SceneVisibilityManager.instance.DisablePicking(child.gameObject, false);
                }
#endif
            }
            else if (!t.main || t.main.source != t.paintTile)
            {
                t.main = Game.grid.ReplaceTile(t.mainHex, t.paintTile);

#if UNITY_EDITOR
                foreach (Transform child in Game.game.transform)
                {
                    SceneVisibilityManager.instance.DisablePicking(child.gameObject, false);
                }
#endif
            }
        }
    }