visualize minefields in OG

This commit is contained in:
Chris Forbes
2010-06-10 18:08:55 +12:00
parent e60acc682a
commit 1bd7a9b590
2 changed files with 31 additions and 12 deletions

View File

@@ -341,27 +341,30 @@ namespace OpenRA.Graphics
} }
} }
public void DrawRangeCircle(Color c, int2 location, int range) public void DrawLocus(Color c, int2[] cells)
{ {
var r2 = range * range; foreach (var t in cells)
foreach (var t in world.FindTilesInCircle(location, range))
{ {
if ((location - t - new int2(-1, 0)).LengthSquared > r2) if (!cells.Contains(t + new int2(-1, 0)))
lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(0, 1)), lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(0, 1)),
c, c); c, c);
if ((location - t - new int2(1, 0)).LengthSquared > r2) if (!cells.Contains(t + new int2(1, 0)))
lineRenderer.DrawLine(Game.CellSize * (t + new int2(1, 0)), Game.CellSize * (t + new int2(1, 1)), lineRenderer.DrawLine(Game.CellSize * (t + new int2(1, 0)), Game.CellSize * (t + new int2(1, 1)),
c, c); c, c);
if ((location - t - new int2(0, -1)).LengthSquared > r2) if (!cells.Contains(t + new int2(0, -1)))
lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1, 0)), lineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1, 0)),
c, c); c, c);
if ((location - t - new int2(0, 1)).LengthSquared > r2) if (!cells.Contains(t + new int2(0, 1)))
lineRenderer.DrawLine(Game.CellSize * (t + new int2(0, 1)), Game.CellSize * (t + new int2(1, 1)), lineRenderer.DrawLine(Game.CellSize * (t + new int2(0, 1)), Game.CellSize * (t + new int2(1, 1)),
c, c); c, c);
} }
} }
public void DrawRangeCircle(Color c, int2 location, int range)
{
DrawLocus(c, world.FindTilesInCircle(location, range).ToArray());
}
public void DrawRangeCircle(Actor selectedUnit) public void DrawRangeCircle(Actor selectedUnit)
{ {
if (selectedUnit.Owner == world.LocalPlayer) if (selectedUnit.Owner == world.LocalPlayer)

View File

@@ -23,13 +23,14 @@ using OpenRA.Mods.RA.Activities;
using OpenRA.Traits; using OpenRA.Traits;
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using System.Drawing;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
class MinelayerInfo : TraitInfo<Minelayer> class MinelayerInfo : TraitInfo<Minelayer>
{ {
public readonly string Mine = "minv"; public readonly string Mine = "minv";
public readonly int MinefieldDepth = 2; public readonly float MinefieldDepth = 1.5f;
public readonly string[] RearmBuildings = { "fix" }; public readonly string[] RearmBuildings = { "fix" };
} }
@@ -72,7 +73,7 @@ namespace OpenRA.Mods.RA
} }
} }
static IEnumerable<int2> GetMinefieldCells(int2 start, int2 end, int depth) static IEnumerable<int2> GetMinefieldCells(int2 start, int2 end, float depth)
{ {
var mins = int2.Min(start, end); var mins = int2.Min(start, end);
var maxs = int2.Max(start, end); var maxs = int2.Max(start, end);
@@ -100,6 +101,12 @@ namespace OpenRA.Mods.RA
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi) public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{ {
if (mi.Button == MouseButton.Left)
{
Game.controller.CancelInputMode();
yield break;
}
var underCursor = world.FindUnitsAtMouse(mi.Location) var underCursor = world.FindUnitsAtMouse(mi.Location)
.Where(a => a.Info.Traits.Contains<SelectableInfo>()) .Where(a => a.Info.Traits.Contains<SelectableInfo>())
.OrderByDescending(a => a.Info.Traits.Get<SelectableInfo>().Priority) .OrderByDescending(a => a.Info.Traits.Get<SelectableInfo>().Priority)
@@ -115,9 +122,18 @@ namespace OpenRA.Mods.RA
Game.controller.CancelInputMode(); Game.controller.CancelInputMode();
} }
public void Render(World world) { } int2 lastMousePos;
public void Render(World world)
{
var ml = minelayer.traits.Get<Minelayer>();
var movement = minelayer.traits.Get<IMovement>();
var minefield = GetMinefieldCells(ml.minefieldStart, lastMousePos, minelayer.Info.Traits.Get<MinelayerInfo>().MinefieldDepth)
.Where(p => movement.CanEnterCell(p)).ToArray();
public string GetCursor(World world, int2 xy, MouseInput mi) { return "ability"; } /* todo */ Game.world.WorldRenderer.DrawLocus(Color.Cyan, minefield);
}
public string GetCursor(World world, int2 xy, MouseInput mi) { lastMousePos = xy; return "ability"; } /* todo */
} }
} }
} }