Move TileSize definition to terrain info.

This commit is contained in:
Paul Chote
2025-03-29 19:15:56 +00:00
committed by Gustas Kažukauskas
parent 0f7b24a8c0
commit 25188e849e
24 changed files with 48 additions and 45 deletions

View File

@@ -201,6 +201,19 @@ namespace OpenRA
using (new PerfTimer("NewWorld")) using (new PerfTimer("NewWorld"))
{ {
ModData.PrepareMap(map); ModData.PrepareMap(map);
// The depth buffer needs to be initialized with enough range to cover:
// - the height of the screen
// - the z-offset of tiles from MaxTerrainHeight below the bottom of the screen (pushed into view)
// - additional z-offset from actors on top of MaxTerrainHeight terrain
// - a small margin so that tiles rendered partially above the top edge of the screen aren't pushed behind the clip plane
// We need an offset of mapGrid.MaximumTerrainHeight * mapGrid.TileSize.Height / 2 to cover the terrain height
// and choose to use mapGrid.MaximumTerrainHeight * mapGrid.TileSize.Height / 4 for each of the actor and top-edge cases
var margin = 0;
if (map.Grid.EnableDepthBuffer)
margin = map.Rules.TerrainInfo.TileSize.Height * map.Grid.MaximumTerrainHeight;
Renderer.SetDepthMargin(margin);
OrderManager.World = new World(map, ModData, OrderManager, type); OrderManager.World = new World(map, ModData, OrderManager, type);
} }
@@ -497,9 +510,6 @@ namespace OpenRA
using (new PerfTimer("LoadMaps")) using (new PerfTimer("LoadMaps"))
ModData.MapCache.LoadMaps(); ModData.MapCache.LoadMaps();
var grid = ModData.Manifest.Contains<MapGrid>() ? ModData.Manifest.Get<MapGrid>() : null;
Renderer.InitializeDepthBuffer(grid);
Cursor?.Dispose(); Cursor?.Dispose();
Cursor = new CursorManager(ModData.CursorProvider, ModData.Manifest.CursorSheetSize); Cursor = new CursorManager(ModData.CursorProvider, ModData.Manifest.CursorSheetSize);

View File

@@ -146,7 +146,7 @@ namespace OpenRA.Graphics
public Viewport(WorldRenderer wr, Map map) public Viewport(WorldRenderer wr, Map map)
{ {
worldRenderer = wr; worldRenderer = wr;
var grid = Game.ModData.Manifest.Get<MapGrid>(); tileSize = map.Rules.TerrainInfo.TileSize;
viewportSizes = Game.ModData.Manifest.Get<WorldViewportSizes>(); viewportSizes = Game.ModData.Manifest.Get<WorldViewportSizes>();
graphicSettings = Game.Settings.Graphics; graphicSettings = Game.Settings.Graphics;
defaultScale = viewportSizes.DefaultScale; defaultScale = viewportSizes.DefaultScale;
@@ -155,8 +155,8 @@ namespace OpenRA.Graphics
if (wr.World.Type == WorldType.Editor) if (wr.World.Type == WorldType.Editor)
{ {
// The full map is visible in the editor // The full map is visible in the editor
var width = map.MapSize.X * grid.TileSize.Width; var width = map.MapSize.X * tileSize.Width;
var height = map.MapSize.Y * grid.TileSize.Height; var height = map.MapSize.Y * tileSize.Height;
if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric) if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric)
height /= 2; height /= 2;
@@ -171,8 +171,6 @@ namespace OpenRA.Graphics
CenterLocation = (tl + br) / 2; CenterLocation = (tl + br) / 2;
} }
tileSize = grid.TileSize;
UpdateViewportZooms(); UpdateViewportZooms();
} }

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Graphics
internal WorldRenderer(ModData modData, World world) internal WorldRenderer(ModData modData, World world)
{ {
World = world; World = world;
TileSize = World.Map.Grid.TileSize; TileSize = World.Map.Rules.TerrainInfo.TileSize;
TileScale = World.Map.Grid.TileScale; TileScale = World.Map.Grid.TileScale;
Viewport = new Viewport(this, world.Map); Viewport = new Viewport(this, world.Map);

View File

@@ -12,7 +12,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA namespace OpenRA
@@ -106,7 +105,6 @@ namespace OpenRA
public class MapGrid : IGlobalModData public class MapGrid : IGlobalModData
{ {
public readonly MapGridType Type = MapGridType.Rectangular; public readonly MapGridType Type = MapGridType.Rectangular;
public readonly Size TileSize = new(24, 24);
public readonly byte MaximumTerrainHeight = 0; public readonly byte MaximumTerrainHeight = 0;
public readonly SubCell DefaultSubCell = (SubCell)byte.MaxValue; public readonly SubCell DefaultSubCell = (SubCell)byte.MaxValue;

View File

@@ -25,6 +25,7 @@ namespace OpenRA
public interface ITerrainInfo public interface ITerrainInfo
{ {
string Id { get; } string Id { get; }
Size TileSize { get; }
TerrainTypeInfo[] TerrainTypes { get; } TerrainTypeInfo[] TerrainTypes { get; }
TerrainTileInfo GetTerrainInfo(TerrainTile r); TerrainTileInfo GetTerrainInfo(TerrainTile r);
bool TryGetTerrainInfo(TerrainTile r, out TerrainTileInfo info); bool TryGetTerrainInfo(TerrainTile r, out TerrainTileInfo info);

View File

@@ -155,16 +155,9 @@ namespace OpenRA
}; };
} }
public void InitializeDepthBuffer(MapGrid mapGrid) public void SetDepthMargin(float depthMargin)
{ {
// The depth buffer needs to be initialized with enough range to cover: this.depthMargin = depthMargin;
// - the height of the screen
// - the z-offset of tiles from MaxTerrainHeight below the bottom of the screen (pushed into view)
// - additional z-offset from actors on top of MaxTerrainHeight terrain
// - a small margin so that tiles rendered partially above the top edge of the screen aren't pushed behind the clip plane
// We need an offset of mapGrid.MaximumTerrainHeight * mapGrid.TileSize.Height / 2 to cover the terrain height
// and choose to use mapGrid.MaximumTerrainHeight * mapGrid.TileSize.Height / 4 for each of the actor and top-edge cases
depthMargin = mapGrid == null || !mapGrid.EnableDepthBuffer ? 0 : mapGrid.TileSize.Height * mapGrid.MaximumTerrainHeight;
} }
void BeginFrame() void BeginFrame()

View File

@@ -63,7 +63,7 @@ namespace OpenRA.Traits
public ScreenMap(World world, ScreenMapInfo info) public ScreenMap(World world, ScreenMapInfo info)
{ {
var size = world.Map.Grid.TileSize; var size = world.Map.Rules.TerrainInfo.TileSize;
var width = world.Map.MapSize.X * size.Width; var width = world.Map.MapSize.X * size.Width;
var height = world.Map.MapSize.Y * size.Height; var height = world.Map.MapSize.Y * size.Height;

View File

@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Cnc.Graphics
{ {
var map = wr.World.Map; var map = wr.World.Map;
var groundPos = model.Pos - new WVec(0, 0, map.DistanceAboveTerrain(model.Pos).Length); var groundPos = model.Pos - new WVec(0, 0, map.DistanceAboveTerrain(model.Pos).Length);
var groundZ = (float)map.Grid.TileSize.Height * (groundPos.Z - model.Pos.Z) / map.Grid.TileScale; var groundZ = (float)map.Rules.TerrainInfo.TileSize.Height * (groundPos.Z - model.Pos.Z) / map.Grid.TileScale;
var pxOrigin = wr.Screen3DPosition(model.Pos); var pxOrigin = wr.Screen3DPosition(model.Pos);
// HACK: We don't have enough texture channels to pass the depth data to the shader // HACK: We don't have enough texture channels to pass the depth data to the shader
@@ -152,7 +152,7 @@ namespace OpenRA.Mods.Cnc.Graphics
// sloped towards the camera. Offset it by another half cell to avoid clipping. // sloped towards the camera. Offset it by another half cell to avoid clipping.
var cell = map.CellContaining(model.Pos); var cell = map.CellContaining(model.Pos);
if (map.Ramp.Contains(cell) && map.Ramp[cell] == 7) if (map.Ramp.Contains(cell) && map.Ramp[cell] == 7)
pxOrigin += new float3(0, 0, 0.5f * map.Grid.TileSize.Height); pxOrigin += new float3(0, 0, 0.5f * map.Rules.TerrainInfo.TileSize.Height);
var shadowOrigin = pxOrigin - groundZ * new float2(renderProxy.ShadowDirection, 1); var shadowOrigin = pxOrigin - groundZ * new float2(renderProxy.ShadowDirection, 1);
@@ -179,7 +179,7 @@ namespace OpenRA.Mods.Cnc.Graphics
public void RenderDebugGeometry(WorldRenderer wr) public void RenderDebugGeometry(WorldRenderer wr)
{ {
var groundPos = model.Pos - new WVec(0, 0, wr.World.Map.DistanceAboveTerrain(model.Pos).Length); var groundPos = model.Pos - new WVec(0, 0, wr.World.Map.DistanceAboveTerrain(model.Pos).Length);
var groundZ = wr.World.Map.Grid.TileSize.Height * (groundPos.Z - model.Pos.Z) / 1024f; var groundZ = wr.World.Map.Rules.TerrainInfo.TileSize.Height * (groundPos.Z - model.Pos.Z) / 1024f;
var pxOrigin = wr.Screen3DPosition(model.Pos); var pxOrigin = wr.Screen3DPosition(model.Pos);
var shadowOrigin = pxOrigin - groundZ * new float2(renderProxy.ShadowDirection, 1); var shadowOrigin = pxOrigin - groundZ * new float2(renderProxy.ShadowDirection, 1);

View File

@@ -13,6 +13,7 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.Mods.Common.FileFormats; using OpenRA.Mods.Common.FileFormats;
using OpenRA.Primitives;
namespace OpenRA.Mods.Cnc.UtilityCommands namespace OpenRA.Mods.Cnc.UtilityCommands
{ {
@@ -26,16 +27,14 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
string IUtilityCommand.Name => "--sequence-import"; string IUtilityCommand.Name => "--sequence-import";
IniFile file; IniFile file;
MapGrid grid; Size tileSize;
[Desc("FILENAME", "Convert ART.INI to the OpenRA sequence definition format.")] [Desc("FILENAME", "Convert ART.INI to the OpenRA sequence definition format.")]
void IUtilityCommand.Run(Utility utility, string[] args) void IUtilityCommand.Run(Utility utility, string[] args)
{ {
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = utility.ModData; Game.ModData = utility.ModData;
tileSize = Game.ModData.DefaultTerrainInfo.Values.First().TileSize;
grid = Game.ModData.Manifest.Get<MapGrid>();
file = new IniFile(File.Open(args[1], FileMode.Open)); file = new IniFile(File.Open(args[1], FileMode.Open));
foreach (var section in file.Sections) foreach (var section in file.Sections)
@@ -65,8 +64,8 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
var x = Exts.ParseInt32Invariant(size[0]); var x = Exts.ParseInt32Invariant(size[0]);
var y = Exts.ParseInt32Invariant(size[1]); var y = Exts.ParseInt32Invariant(size[1]);
var xOffset = (x - y) * grid.TileSize.Width / 4; var xOffset = (x - y) * tileSize.Width / 4;
var yOffset = (x + y) * grid.TileSize.Height / 4; var yOffset = (x + y) * tileSize.Height / 4;
Console.WriteLine("\t\tOffset: {0},{1}", -xOffset, -yOffset); Console.WriteLine("\t\tOffset: {0},{1}", -xOffset, -yOffset);
} }
} }

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
var file = new IniFile(File.Open(args[1], FileMode.Open)); var file = new IniFile(File.Open(args[1], FileMode.Open));
var extension = args[2]; var extension = args[2];
var tileSize = utility.ModData.Manifest.Get<MapGrid>().TileSize; var tileSize = utility.ModData.DefaultTerrainInfo.Values.First().TileSize;
var templateIndex = 0; var templateIndex = 0;

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System; using System;
using System.Linq;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Primitives; using OpenRA.Primitives;
using OpenRA.Server; using OpenRA.Server;
@@ -31,7 +32,8 @@ namespace OpenRA.Mods.Common.Lint
static void Run(Action<string> emitError, Ruleset rules, ModData modData) static void Run(Action<string> emitError, Ruleset rules, ModData modData)
{ {
// As the map has not been created we need to get MapGrid info directly from manifest. // As the map has not been created we need to get MapGrid info directly from manifest.
var grid = modData.Manifest.Get<MapGrid>(); var tileSize = modData.DefaultTerrainInfo.Values.First().TileSize;
var tileScale = modData.Manifest.Get<MapGrid>().TileScale;
foreach (var actorInfo in rules.Actors) foreach (var actorInfo in rules.Actors)
{ {
// Catch TypeDictionary errors. // Catch TypeDictionary errors.
@@ -41,10 +43,10 @@ namespace OpenRA.Mods.Common.Lint
if (interactable == null) if (interactable == null)
continue; continue;
if (HasInvalidBounds(interactable.Bounds, grid.TileSize, grid.TileScale)) if (HasInvalidBounds(interactable.Bounds, tileSize, tileScale))
emitError($"{actorInfo.Key}.{interactable.GetType().Name}.{nameof(interactable.Bounds)} are empty or negative."); emitError($"{actorInfo.Key}.{interactable.GetType().Name}.{nameof(interactable.Bounds)} are empty or negative.");
if (HasInvalidBounds(interactable.DecorationBounds, grid.TileSize, grid.TileScale)) if (HasInvalidBounds(interactable.DecorationBounds, tileSize, tileScale))
emitError($"{actorInfo.Key}.{interactable.GetType().Name}.{nameof(interactable.DecorationBounds)} are empty or negative."); emitError($"{actorInfo.Key}.{interactable.GetType().Name}.{nameof(interactable.DecorationBounds)} are empty or negative.");
} }
catch (InvalidOperationException e) catch (InvalidOperationException e)

View File

@@ -70,6 +70,7 @@ namespace OpenRA.Mods.Common.Terrain
{ {
public readonly string Name; public readonly string Name;
public readonly string Id; public readonly string Id;
public readonly Size TileSize = new(24, 24);
public readonly int SheetSize = 512; public readonly int SheetSize = 512;
public readonly Color[] HeightDebugColors = [Color.Red]; public readonly Color[] HeightDebugColors = [Color.Red];
public readonly string[] EditorTemplateOrder; public readonly string[] EditorTemplateOrder;
@@ -176,6 +177,7 @@ namespace OpenRA.Mods.Common.Terrain
} }
string ITerrainInfo.Id => Id; string ITerrainInfo.Id => Id;
Size ITerrainInfo.TileSize => TileSize;
TerrainTypeInfo[] ITerrainInfo.TerrainTypes => TerrainInfo; TerrainTypeInfo[] ITerrainInfo.TerrainTypes => TerrainInfo;
TerrainTileInfo ITerrainInfo.GetTerrainInfo(TerrainTile r) { return GetTileInfo(r); } TerrainTileInfo ITerrainInfo.GetTerrainInfo(TerrainTile r) { return GetTileInfo(r); }
bool ITerrainInfo.TryGetTerrainInfo(TerrainTile r, out TerrainTileInfo info) { return TryGetTileInfo(r, out info); } bool ITerrainInfo.TryGetTerrainInfo(TerrainTile r, out TerrainTileInfo info) { return TryGetTileInfo(r, out info); }

View File

@@ -81,10 +81,10 @@ namespace OpenRA.Mods.Common.Traits
cellOffset = new int2(world.Map.AllCells.Min(c => c.X), world.Map.AllCells.Min((c) => c.Y)); cellOffset = new int2(world.Map.AllCells.Min(c => c.X), world.Map.AllCells.Min((c) => c.Y));
var cellOffsetMax = new int2(world.Map.AllCells.Max(c => c.X), world.Map.AllCells.Max((c) => c.Y)); var cellOffsetMax = new int2(world.Map.AllCells.Max(c => c.X), world.Map.AllCells.Max((c) => c.Y));
var mapCellSize = cellOffsetMax - cellOffset; var mapCellSize = cellOffsetMax - cellOffset;
var ts = world.Map.Rules.TerrainInfo.TileSize;
cellMap = new SpatiallyPartitioned<EditorActorPreview>( cellMap = new SpatiallyPartitioned<EditorActorPreview>(
mapCellSize.X, mapCellSize.Y, Exts.IntegerDivisionRoundingAwayFromZero(Info.BinSize, world.Map.Grid.TileSize.Width)); mapCellSize.X, mapCellSize.Y, Exts.IntegerDivisionRoundingAwayFromZero(Info.BinSize, ts.Width));
var ts = world.Map.Grid.TileSize;
var width = world.Map.MapSize.X * ts.Width; var width = world.Map.MapSize.X * ts.Width;
var height = world.Map.MapSize.Y * ts.Height; var height = world.Map.MapSize.Y * ts.Height;
screenMap = new SpatiallyPartitioned<EditorActorPreview>(width, height, Info.BinSize); screenMap = new SpatiallyPartitioned<EditorActorPreview>(width, height, Info.BinSize);

View File

@@ -143,7 +143,7 @@ namespace OpenRA.Mods.Common.Traits
if (info.ViewportHeight.HasValue) if (info.ViewportHeight.HasValue)
{ {
// WPos to world pixels // WPos to world pixels
var height = info.ViewportHeight.Value.Length * w.Map.Grid.TileSize.Height / w.Map.Grid.TileScale; var height = info.ViewportHeight.Value.Length * w.Map.Rules.TerrainInfo.TileSize.Height / w.Map.Grid.TileScale;
wr.Viewport.OverrideDefaultHeight(height); wr.Viewport.OverrideDefaultHeight(height);
} }
} }

View File

@@ -133,7 +133,7 @@ namespace OpenRA.Mods.Common.Traits
Rectangle ITiledTerrainRenderer.TemplateBounds(TerrainTemplateInfo template) Rectangle ITiledTerrainRenderer.TemplateBounds(TerrainTemplateInfo template)
{ {
Rectangle? templateRect = null; Rectangle? templateRect = null;
var tileSize = map.Grid.TileSize; var tileSize = map.Rules.TerrainInfo.TileSize;
var i = 0; var i = 0;
for (var y = 0; y < template.Size.Y; y++) for (var y = 0; y < template.Size.Y; y++)
@@ -162,7 +162,7 @@ namespace OpenRA.Mods.Common.Traits
if (t is not DefaultTerrainTemplateInfo template) if (t is not DefaultTerrainTemplateInfo template)
yield break; yield break;
var ts = map.Grid.TileSize; var ts = map.Rules.TerrainInfo.TileSize;
var gridType = map.Grid.Type; var gridType = map.Grid.Type;
var i = 0; var i = 0;

View File

@@ -10,6 +10,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace OpenRA.Mods.Common.UpdateRules.Rules namespace OpenRA.Mods.Common.UpdateRules.Rules
{ {
@@ -27,7 +28,7 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules
public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNodeBuilder actorNode) public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNodeBuilder actorNode)
{ {
var grid = modData.Manifest.Get<MapGrid>(); var grid = modData.Manifest.Get<MapGrid>();
var tileSize = grid.TileSize; var tileSize = modData.DefaultTerrainInfo.Values.First().TileSize;
var tileScale = grid.TileScale; var tileScale = grid.TileScale;
foreach (var trait in traits) foreach (var trait in traits)

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Widgets
this.worldRenderer = worldRenderer; this.worldRenderer = worldRenderer;
viewportSizes = modData.Manifest.Get<WorldViewportSizes>(); viewportSizes = modData.Manifest.Get<WorldViewportSizes>();
resourceRenderers = world.WorldActor.TraitsImplementing<IResourceRenderer>().ToArray(); resourceRenderers = world.WorldActor.TraitsImplementing<IResourceRenderer>().ToArray();
tileSize = world.Map.Grid.TileSize; tileSize = world.Map.Rules.TerrainInfo.TileSize;
IdealPreviewSize = new Size( IdealPreviewSize = new Size(
(int)(viewportSizes.DefaultScale * tileSize.Width), (int)(viewportSizes.DefaultScale * tileSize.Width),
(int)(viewportSizes.DefaultScale * tileSize.Height)); (int)(viewportSizes.DefaultScale * tileSize.Height));

View File

@@ -232,7 +232,6 @@ Missions:
cnc|missions.yaml cnc|missions.yaml
MapGrid: MapGrid:
TileSize: 24,24
Type: Rectangular Type: Rectangular
DefaultOrderGenerator: UnitOrderGenerator DefaultOrderGenerator: UnitOrderGenerator

View File

@@ -66,7 +66,6 @@ TileSets:
d2k|tilesets/arrakis.yaml d2k|tilesets/arrakis.yaml
MapGrid: MapGrid:
TileSize: 32,32
Type: Rectangular Type: Rectangular
Cursors: Cursors:

View File

@@ -1,6 +1,7 @@
General: General:
Name: Arrakis Name: Arrakis
Id: ARRAKIS Id: ARRAKIS
TileSize: 32, 32
SheetSize: 1024 SheetSize: 1024
EditorTemplateOrder: Basic, Dune, Sand-Detail, Rock-Detail, Ice-Detail, Rock-Sand-Smooth, Sand-Sand-Cliff, Sand-Rock-Cliff, Sand-Ice-Cliff, Rock-Rock-Cliff, Rock-Sand-Cliff, Cliff-Type-Changer, Cliff-Ends, Sand-Platform, Bridge, Rotten-Base, Dead-Worm, Unidentified EditorTemplateOrder: Basic, Dune, Sand-Detail, Rock-Detail, Ice-Detail, Rock-Sand-Smooth, Sand-Sand-Cliff, Sand-Rock-Cliff, Sand-Ice-Cliff, Rock-Rock-Cliff, Rock-Sand-Cliff, Cliff-Type-Changer, Cliff-Ends, Sand-Platform, Bridge, Rotten-Base, Dead-Worm, Unidentified
IgnoreTileSpriteOffsets: True IgnoreTileSpriteOffsets: True

View File

@@ -261,7 +261,6 @@ Missions:
ra|missions.yaml ra|missions.yaml
MapGrid: MapGrid:
TileSize: 24,24
Type: Rectangular Type: Rectangular
DefaultOrderGenerator: UnitOrderGenerator DefaultOrderGenerator: UnitOrderGenerator

View File

@@ -103,7 +103,6 @@ TileSets:
ts|tilesets/snow.yaml ts|tilesets/snow.yaml
MapGrid: MapGrid:
TileSize: 48,24
EnableDepthBuffer: True EnableDepthBuffer: True
Type: RectangularIsometric Type: RectangularIsometric
MaximumTerrainHeight: 16 MaximumTerrainHeight: 16

View File

@@ -1,6 +1,7 @@
General: General:
Name: Snow Name: Snow
Id: SNOW Id: SNOW
TileSize: 48, 24
HeightDebugColors: 00000080, 00004480, 00008880, 0000CC80, 0000FF80, 4400CC80, 88008880, CC004480, FF110080, FF550080, FF990080, FFDD0080, DDFF0080, 99FF0080, 55FF0080, 11FF0080 HeightDebugColors: 00000080, 00004480, 00008880, 0000CC80, 0000FF80, 4400CC80, 88008880, CC004480, FF110080, FF550080, FF990080, FFDD0080, DDFF0080, 99FF0080, 55FF0080, 11FF0080
EditorTemplateOrder: Bendy Dirt Roads, Blank, Bridges, Civilian Buildings, Clear, Clear/Rough LAT, Cliff Pieces, Cliff Set, Cliff/Water pieces, Dead Oil Tanker, Destroyable Cliffs, Dirt Road Junctions, Dirt Road Slopes, DirtTrackTunnel Floor, DirtTunnel Floor, Grey/Clear LAT, House, Ice 01, Ice 02, Ice 03, Ice Flow, Ice Ramps, Ice shore, Misc Buildings, Monorail Slopes, Paved Road Ends, Paved Road Slopes, Paved Roads, Pavement, Pavement (Use for LAT), Pavement/Clear LAT, Ramp edge fixup, Rough ground, Rough lat, Ruins, Shore Pieces, Slope Set Pieces, Straight Dirt Roads, TrackTunnel Floor, TrainBridges, Tunnel Side, Tunnels, Water, Water slopes, Waterfalls, Waterfalls-B, Waterfalls-C, Waterfalls-D EditorTemplateOrder: Bendy Dirt Roads, Blank, Bridges, Civilian Buildings, Clear, Clear/Rough LAT, Cliff Pieces, Cliff Set, Cliff/Water pieces, Dead Oil Tanker, Destroyable Cliffs, Dirt Road Junctions, Dirt Road Slopes, DirtTrackTunnel Floor, DirtTunnel Floor, Grey/Clear LAT, House, Ice 01, Ice 02, Ice 03, Ice Flow, Ice Ramps, Ice shore, Misc Buildings, Monorail Slopes, Paved Road Ends, Paved Road Slopes, Paved Roads, Pavement, Pavement (Use for LAT), Pavement/Clear LAT, Ramp edge fixup, Rough ground, Rough lat, Ruins, Shore Pieces, Slope Set Pieces, Straight Dirt Roads, TrackTunnel Floor, TrainBridges, Tunnel Side, Tunnels, Water, Water slopes, Waterfalls, Waterfalls-B, Waterfalls-C, Waterfalls-D
SheetSize: 2048 SheetSize: 2048

View File

@@ -1,6 +1,7 @@
General: General:
Name: Temperate Name: Temperate
Id: TEMPERATE Id: TEMPERATE
TileSize: 48, 24
HeightDebugColors: 00000080, 00004480, 00008880, 0000CC80, 0000FF80, 4400CC80, 88008880, CC004480, FF110080, FF550080, FF990080, FFDD0080, DDFF0080, 99FF0080, 55FF0080, 11FF0080 HeightDebugColors: 00000080, 00004480, 00008880, 0000CC80, 0000FF80, 4400CC80, 88008880, CC004480, FF110080, FF550080, FF990080, FFDD0080, DDFF0080, 99FF0080, 55FF0080, 11FF0080
EditorTemplateOrder: Misc Buildings, Clear, Cliff Pieces, Ice Flow, House, Blank, Ice Ramps, Cliff Set, Civilian Buildings, Shore Pieces, Rough LAT tile, Clear/Rough LAT, Cliff/Water pieces, Bendy Dirt Roads, Dirt Road Junctions, Straight Dirt Roads, Bridges, Paved Roads, Water, Dirt Road Slopes, Slope Set Pieces, Dead Oil Tanker, Ruins, Waterfalls, Ground 01, Ground 02, Sand, Sand/Clear LAT, Rough ground, Paved Road Ends, TrainBridges, Pavement, Pavement/Clear LAT, Paved road bits, Green, Green/Clear LAT, Ramp edge fixup, Water slopes, Pavement (Use for LAT), Paved Road Slopes, Monorail Slopes, Waterfalls-B, Waterfalls-C, Waterfalls-D, Tunnel Floor, Tunnel Side, TrackTunnel Floor, Destroyable Cliffs, Water Caves, Scrin Wreckage, DirtTrackTunnel Floor, DirtTunnel Floor, Crystal LAT tile, Clear Crystal LAT, Swampy, Swampy LAT, Blue Mold, Blue Mold LAT, Crystal Cliff, Kodiak Crash EditorTemplateOrder: Misc Buildings, Clear, Cliff Pieces, Ice Flow, House, Blank, Ice Ramps, Cliff Set, Civilian Buildings, Shore Pieces, Rough LAT tile, Clear/Rough LAT, Cliff/Water pieces, Bendy Dirt Roads, Dirt Road Junctions, Straight Dirt Roads, Bridges, Paved Roads, Water, Dirt Road Slopes, Slope Set Pieces, Dead Oil Tanker, Ruins, Waterfalls, Ground 01, Ground 02, Sand, Sand/Clear LAT, Rough ground, Paved Road Ends, TrainBridges, Pavement, Pavement/Clear LAT, Paved road bits, Green, Green/Clear LAT, Ramp edge fixup, Water slopes, Pavement (Use for LAT), Paved Road Slopes, Monorail Slopes, Waterfalls-B, Waterfalls-C, Waterfalls-D, Tunnel Floor, Tunnel Side, TrackTunnel Floor, Destroyable Cliffs, Water Caves, Scrin Wreckage, DirtTrackTunnel Floor, DirtTunnel Floor, Crystal LAT tile, Clear Crystal LAT, Swampy, Swampy LAT, Blue Mold, Blue Mold LAT, Crystal Cliff, Kodiak Crash
SheetSize: 2048 SheetSize: 2048