Allow resource placement outside the map cordon.
This commit is contained in:
@@ -65,10 +65,11 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
var underCursor = editorLayer.PreviewsAt(worldRenderer.Viewport.ViewToWorldPx(mi.Location))
|
||||
.FirstOrDefault();
|
||||
|
||||
var mapResources = world.Map.MapResources.Value;
|
||||
ResourceType type;
|
||||
if (underCursor != null)
|
||||
editorWidget.SetTooltip(underCursor.Tooltip);
|
||||
else if (world.Map.Contains(cell) && resources.TryGetValue(world.Map.MapResources.Value[cell].Type, out type))
|
||||
else if (mapResources.Contains(cell) && resources.TryGetValue(mapResources[cell].Type, out type))
|
||||
editorWidget.SetTooltip(type.Info.Name);
|
||||
else
|
||||
editorWidget.SetTooltip(null);
|
||||
@@ -84,8 +85,8 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
if (underCursor != null)
|
||||
editorLayer.Remove(underCursor);
|
||||
|
||||
if (world.Map.MapResources.Value[cell].Type != 0)
|
||||
world.Map.MapResources.Value[cell] = new ResourceTile();
|
||||
if (mapResources.Contains(cell) && mapResources[cell].Type != 0)
|
||||
mapResources[cell] = new ResourceTile();
|
||||
}
|
||||
else if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down)
|
||||
{
|
||||
|
||||
@@ -82,7 +82,8 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
public bool AllowResourceAt(CPos cell)
|
||||
{
|
||||
if (!world.Map.Contains(cell))
|
||||
var mapResources = world.Map.MapResources.Value;
|
||||
if (!mapResources.Contains(cell))
|
||||
return false;
|
||||
|
||||
var tile = world.Map.MapTiles.Value[cell];
|
||||
@@ -92,7 +93,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
var terrainType = world.TileSet.TerrainInfo[tileInfo.TerrainType];
|
||||
|
||||
if (world.Map.MapResources.Value[cell].Type == ResourceType.ResourceType)
|
||||
if (mapResources[cell].Type == ResourceType.ResourceType)
|
||||
return false;
|
||||
|
||||
if (!ResourceType.AllowedTerrainTypes.Contains(terrainType.Type))
|
||||
|
||||
@@ -86,11 +86,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
// so we must also touch all the neighbouring tiles
|
||||
Dirty.Add(cell);
|
||||
foreach (var d in CVec.Directions)
|
||||
{
|
||||
var c = cell + d;
|
||||
if (Map.Contains(c))
|
||||
Dirty.Add(c);
|
||||
}
|
||||
Dirty.Add(cell + d);
|
||||
}
|
||||
|
||||
protected virtual string ChooseRandomVariant(ResourceType t)
|
||||
@@ -103,10 +99,16 @@ namespace OpenRA.Mods.Common.Traits
|
||||
// Set density based on the number of neighboring resources
|
||||
var adjacent = 0;
|
||||
var type = Tiles[c].Type;
|
||||
var resources = Map.MapResources.Value;
|
||||
for (var u = -1; u < 2; u++)
|
||||
{
|
||||
for (var v = -1; v < 2; v++)
|
||||
if (Map.MapResources.Value[c + new CVec(u, v)].Type == type.Info.ResourceType)
|
||||
{
|
||||
var cell = c + new CVec(u, v);
|
||||
if (resources.Contains(cell) && resources[cell].Type == type.Info.ResourceType)
|
||||
adjacent++;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.Max(int2.Lerp(0, type.Info.MaxDensity, adjacent, 9), 1);
|
||||
}
|
||||
@@ -139,7 +141,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
return;
|
||||
|
||||
foreach (var c in Dirty)
|
||||
Tiles[c] = UpdateDirtyTile(c);
|
||||
if (Tiles.Contains(c))
|
||||
Tiles[c] = UpdateDirtyTile(c);
|
||||
|
||||
Dirty.Clear();
|
||||
|
||||
|
||||
@@ -50,9 +50,14 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
var sum = 0;
|
||||
for (var u = -1; u < 2; u++)
|
||||
{
|
||||
for (var v = -1; v < 2; v++)
|
||||
if (content[cell + new CVec(u, v)].Type == t)
|
||||
{
|
||||
var c = cell + new CVec(u, v);
|
||||
if (content.Contains(c) && content[c].Type == t)
|
||||
++sum;
|
||||
}
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
@@ -65,31 +65,36 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
return D2kResourceLayer.Variants.Keys.Random(Game.CosmeticRandom);
|
||||
}
|
||||
|
||||
bool CellContains(CPos c, ResourceType t)
|
||||
{
|
||||
return Tiles.Contains(c) && Tiles[c].Type == t;
|
||||
}
|
||||
|
||||
ClearSides FindClearSides(ResourceType t, CPos p)
|
||||
{
|
||||
var ret = ClearSides.None;
|
||||
if (Tiles[p + new CVec(0, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(0, -1), t))
|
||||
ret |= ClearSides.Top | ClearSides.TopLeft | ClearSides.TopRight;
|
||||
|
||||
if (Tiles[p + new CVec(-1, 0)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, 0), t))
|
||||
ret |= ClearSides.Left | ClearSides.TopLeft | ClearSides.BottomLeft;
|
||||
|
||||
if (Tiles[p + new CVec(1, 0)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, 0), t))
|
||||
ret |= ClearSides.Right | ClearSides.TopRight | ClearSides.BottomRight;
|
||||
|
||||
if (Tiles[p + new CVec(0, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(0, 1), t))
|
||||
ret |= ClearSides.Bottom | ClearSides.BottomLeft | ClearSides.BottomRight;
|
||||
|
||||
if (Tiles[p + new CVec(-1, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, -1), t))
|
||||
ret |= ClearSides.TopLeft;
|
||||
|
||||
if (Tiles[p + new CVec(1, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, -1), t))
|
||||
ret |= ClearSides.TopRight;
|
||||
|
||||
if (Tiles[p + new CVec(-1, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, 1), t))
|
||||
ret |= ClearSides.BottomLeft;
|
||||
|
||||
if (Tiles[p + new CVec(1, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, 1), t))
|
||||
ret |= ClearSides.BottomRight;
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -96,31 +96,36 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
{ ClearSides.Bottom | ClearSides.TopLeft | ClearSides.BottomLeft | ClearSides.BottomRight, 49 },
|
||||
};
|
||||
|
||||
bool CellContains(CPos c, ResourceType t)
|
||||
{
|
||||
return render.Contains(c) && render[c].Type == t;
|
||||
}
|
||||
|
||||
ClearSides FindClearSides(ResourceType t, CPos p)
|
||||
{
|
||||
var ret = ClearSides.None;
|
||||
if (render[p + new CVec(0, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(0, -1), t))
|
||||
ret |= ClearSides.Top | ClearSides.TopLeft | ClearSides.TopRight;
|
||||
|
||||
if (render[p + new CVec(-1, 0)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, 0), t))
|
||||
ret |= ClearSides.Left | ClearSides.TopLeft | ClearSides.BottomLeft;
|
||||
|
||||
if (render[p + new CVec(1, 0)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, 0), t))
|
||||
ret |= ClearSides.Right | ClearSides.TopRight | ClearSides.BottomRight;
|
||||
|
||||
if (render[p + new CVec(0, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(0, 1), t))
|
||||
ret |= ClearSides.Bottom | ClearSides.BottomLeft | ClearSides.BottomRight;
|
||||
|
||||
if (render[p + new CVec(-1, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, -1), t))
|
||||
ret |= ClearSides.TopLeft;
|
||||
|
||||
if (render[p + new CVec(1, -1)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, -1), t))
|
||||
ret |= ClearSides.TopRight;
|
||||
|
||||
if (render[p + new CVec(-1, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(-1, 1), t))
|
||||
ret |= ClearSides.BottomLeft;
|
||||
|
||||
if (render[p + new CVec(1, 1)].Type != t)
|
||||
if (!CellContains(p + new CVec(1, 1), t))
|
||||
ret |= ClearSides.BottomRight;
|
||||
|
||||
return ret;
|
||||
@@ -128,6 +133,9 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
|
||||
void UpdateRenderedTileInner(CPos p)
|
||||
{
|
||||
if (!render.Contains(p))
|
||||
return;
|
||||
|
||||
var t = render[p];
|
||||
if (t.Density > 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user