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); }
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); }
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 } } }