Mapping merge driver: continued (#2803)
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -34,6 +34,7 @@
|
|||||||
#*.modelproj merge=binary
|
#*.modelproj merge=binary
|
||||||
#*.sqlproj merge=binary
|
#*.sqlproj merge=binary
|
||||||
#*.wwaproj merge=binary
|
#*.wwaproj merge=binary
|
||||||
|
Resources/Maps/**.yml merge=mapping-merge-driver
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# behavior for image files
|
# behavior for image files
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -284,3 +284,7 @@ BuildFiles/Windows/Godot/*
|
|||||||
# Windows image file caches
|
# Windows image file caches
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Merge driver stuff
|
||||||
|
Content.Tools/test/out.yml
|
||||||
|
|
||||||
|
|||||||
16
Content.Tools/Content.Tools.csproj
Normal file
16
Content.Tools/Content.Tools.csproj
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="YamlDotNet" Version="9.1.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\RobustToolbox\Robust.Shared\Robust.Shared.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
83
Content.Tools/Map.cs
Normal file
83
Content.Tools/Map.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using YamlDotNet.Core;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
using YamlDotNet.RepresentationModel;
|
||||||
|
|
||||||
|
namespace Content.Tools
|
||||||
|
{
|
||||||
|
public class Map
|
||||||
|
{
|
||||||
|
public Map(string path)
|
||||||
|
{
|
||||||
|
Path = path;
|
||||||
|
|
||||||
|
using var reader = new StreamReader(path);
|
||||||
|
var stream = new YamlStream();
|
||||||
|
|
||||||
|
stream.Load(reader);
|
||||||
|
|
||||||
|
Root = stream.Documents[0].RootNode;
|
||||||
|
TilemapNode = (YamlMappingNode) Root["tilemap"];
|
||||||
|
GridsNode = (YamlSequenceNode) Root["grids"];
|
||||||
|
_entitiesNode = (YamlSequenceNode) Root["entities"];
|
||||||
|
|
||||||
|
foreach (var entity in _entitiesNode)
|
||||||
|
{
|
||||||
|
var uid = uint.Parse(entity["uid"].AsString());
|
||||||
|
if (uid >= NextAvailableEntityId)
|
||||||
|
NextAvailableEntityId = uid + 1;
|
||||||
|
Entities[uid] = (YamlMappingNode) entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Core
|
||||||
|
|
||||||
|
public string Path { get; }
|
||||||
|
|
||||||
|
public YamlNode Root { get; }
|
||||||
|
|
||||||
|
// Useful
|
||||||
|
|
||||||
|
public YamlMappingNode TilemapNode { get; }
|
||||||
|
|
||||||
|
public YamlSequenceNode GridsNode { get; }
|
||||||
|
|
||||||
|
// Entities lookup
|
||||||
|
|
||||||
|
private YamlSequenceNode _entitiesNode { get; }
|
||||||
|
|
||||||
|
public Dictionary<uint, YamlMappingNode> Entities { get; } = new Dictionary<uint, YamlMappingNode>();
|
||||||
|
|
||||||
|
public uint MaxId => Entities.Max(entry => entry.Key);
|
||||||
|
|
||||||
|
public uint NextAvailableEntityId { get; set; }
|
||||||
|
|
||||||
|
// ----
|
||||||
|
|
||||||
|
public void Save(string fileName)
|
||||||
|
{
|
||||||
|
// Update entities node
|
||||||
|
_entitiesNode.Children.Clear();
|
||||||
|
foreach (var kvp in Entities)
|
||||||
|
_entitiesNode.Add(kvp.Value);
|
||||||
|
|
||||||
|
using var writer = new StreamWriter(fileName);
|
||||||
|
var document = new YamlDocument(Root);
|
||||||
|
var stream = new YamlStream(document);
|
||||||
|
var emitter = new Emitter(writer);
|
||||||
|
var fixer = new TypeTagPreserver(emitter);
|
||||||
|
|
||||||
|
stream.Save(fixer, false);
|
||||||
|
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
Save(Path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
38
Content.Tools/MappingMergeDriver.cs
Normal file
38
Content.Tools/MappingMergeDriver.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using YamlDotNet.Core;
|
||||||
|
using YamlDotNet.RepresentationModel;
|
||||||
|
|
||||||
|
namespace Content.Tools
|
||||||
|
{
|
||||||
|
internal static class MappingMergeDriver
|
||||||
|
{
|
||||||
|
/// %A: Our file
|
||||||
|
/// %O: Origin (common, base) file
|
||||||
|
/// %B: Other file
|
||||||
|
/// %P: Actual filename of the resulting file
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var ours = new Map(args[0]);
|
||||||
|
var based = new Map(args[1]); // On what?
|
||||||
|
var other = new Map(args[2]);
|
||||||
|
|
||||||
|
if ((ours.GridsNode.Children.Count != 1) || (based.GridsNode.Children.Count != 1) || (other.GridsNode.Children.Count != 1))
|
||||||
|
{
|
||||||
|
Console.WriteLine("one or more files had an amount of grids not equal to 1");
|
||||||
|
Environment.Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(new Merger(ours, based, other).Merge()))
|
||||||
|
{
|
||||||
|
Console.WriteLine("unable to merge!");
|
||||||
|
Environment.Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ours.Save();
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
356
Content.Tools/Merger.cs
Normal file
356
Content.Tools/Merger.cs
Normal file
@@ -0,0 +1,356 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using YamlDotNet.Core;
|
||||||
|
using YamlDotNet.RepresentationModel;
|
||||||
|
|
||||||
|
namespace Content.Tools
|
||||||
|
{
|
||||||
|
public class Merger
|
||||||
|
{
|
||||||
|
public Map MapOurs { get; }
|
||||||
|
public Map MapBased { get; }
|
||||||
|
public Map MapOther { get; }
|
||||||
|
|
||||||
|
public Dictionary<uint, uint> TileMapFromOtherToOurs { get; } = new Dictionary<uint, uint>();
|
||||||
|
public Dictionary<uint, uint> TileMapFromBasedToOurs { get; } = new Dictionary<uint, uint>();
|
||||||
|
public Dictionary<uint, uint> EntityMapFromOtherToOurs { get; } = new Dictionary<uint, uint>();
|
||||||
|
public List<uint> EntityListDirectMerge { get; } = new List<uint>();
|
||||||
|
|
||||||
|
private const int ExpectedChunkSize = 16 * 16 * 4;
|
||||||
|
|
||||||
|
public Merger(Map ours, Map based, Map other)
|
||||||
|
{
|
||||||
|
MapOurs = ours;
|
||||||
|
MapBased = based;
|
||||||
|
MapOther = other;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Merge()
|
||||||
|
{
|
||||||
|
PlanTileMapping(TileMapFromOtherToOurs, MapOther);
|
||||||
|
PlanTileMapping(TileMapFromBasedToOurs, MapBased);
|
||||||
|
MergeTiles();
|
||||||
|
PlanEntityMapping();
|
||||||
|
return MergeEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Tiles --
|
||||||
|
|
||||||
|
public void PlanTileMapping(Dictionary<uint, uint> relativeOtherToOurs, Map relativeOther)
|
||||||
|
{
|
||||||
|
var mapping = new Dictionary<string, uint>();
|
||||||
|
uint nextAvailable = 0;
|
||||||
|
foreach (var kvp in MapOurs.TilemapNode)
|
||||||
|
{
|
||||||
|
var k = uint.Parse(kvp.Key.ToString());
|
||||||
|
var v = kvp.Value.ToString();
|
||||||
|
mapping[v] = k;
|
||||||
|
if (k >= nextAvailable)
|
||||||
|
nextAvailable = k + 1;
|
||||||
|
}
|
||||||
|
foreach (var kvp in relativeOther.TilemapNode)
|
||||||
|
{
|
||||||
|
var k = uint.Parse(kvp.Key.ToString());
|
||||||
|
var v = kvp.Value.ToString();
|
||||||
|
if (mapping.ContainsKey(v))
|
||||||
|
{
|
||||||
|
relativeOtherToOurs[k] = mapping[v];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MapOurs.TilemapNode.Add(nextAvailable.ToString(CultureInfo.InvariantCulture), v);
|
||||||
|
relativeOtherToOurs[k] = nextAvailable++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MergeTiles()
|
||||||
|
{
|
||||||
|
var a = MapOurs.GridsNode.Children[0];
|
||||||
|
var b = MapBased.GridsNode.Children[0];
|
||||||
|
var c = MapOther.GridsNode.Children[0];
|
||||||
|
var aChunks = a["chunks"];
|
||||||
|
var bChunks = b["chunks"];
|
||||||
|
var cChunks = c["chunks"];
|
||||||
|
MergeTileChunks((YamlSequenceNode) aChunks, (YamlSequenceNode) bChunks, (YamlSequenceNode) cChunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MergeTileChunks(YamlSequenceNode aChunks, YamlSequenceNode bChunks, YamlSequenceNode cChunks)
|
||||||
|
{
|
||||||
|
var aMap = ConvertTileChunks(aChunks);
|
||||||
|
var bMap = ConvertTileChunks(bChunks);
|
||||||
|
var cMap = ConvertTileChunks(cChunks);
|
||||||
|
|
||||||
|
var xMap = new HashSet<string>();
|
||||||
|
foreach (var kvp in aMap)
|
||||||
|
xMap.Add(kvp.Key);
|
||||||
|
// don't include b because that would mess with chunk deletion
|
||||||
|
foreach (var kvp in cMap)
|
||||||
|
xMap.Add(kvp.Key);
|
||||||
|
|
||||||
|
foreach (var ind in xMap)
|
||||||
|
{
|
||||||
|
using var a = new MemoryStream(GetChunkBytes(aMap, ind));
|
||||||
|
using var b = new MemoryStream(GetChunkBytes(bMap, ind));
|
||||||
|
using var c = new MemoryStream(GetChunkBytes(cMap, ind));
|
||||||
|
using var aR = new BinaryReader(a);
|
||||||
|
using var bR = new BinaryReader(b);
|
||||||
|
using var cR = new BinaryReader(c);
|
||||||
|
|
||||||
|
var outB = new byte[ExpectedChunkSize];
|
||||||
|
|
||||||
|
{
|
||||||
|
using (var outS = new MemoryStream(outB))
|
||||||
|
using (var outW = new BinaryWriter(outS))
|
||||||
|
|
||||||
|
for (var i = 0; i < ExpectedChunkSize; i += 4)
|
||||||
|
{
|
||||||
|
var aI = aR.ReadUInt32();
|
||||||
|
var bI = MapTileId(bR.ReadUInt32(), TileMapFromBasedToOurs);
|
||||||
|
var cI = MapTileId(cR.ReadUInt32(), TileMapFromOtherToOurs);
|
||||||
|
// cI needs translation.
|
||||||
|
|
||||||
|
uint result = aI;
|
||||||
|
if (aI == bI)
|
||||||
|
{
|
||||||
|
// If aI == bI then aI did not change anything, so cI always wins
|
||||||
|
result = cI;
|
||||||
|
}
|
||||||
|
else if (bI != cI)
|
||||||
|
{
|
||||||
|
// If bI != cI then cI definitely changed something (conflict, but overrides aI)
|
||||||
|
result = cI;
|
||||||
|
Console.WriteLine("WARNING: Tile (" + ind + ")[" + i + "] was changed by both branches.");
|
||||||
|
}
|
||||||
|
outW.Write(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actually output chunk
|
||||||
|
if (!aMap.ContainsKey(ind))
|
||||||
|
{
|
||||||
|
var res = new YamlMappingNode();
|
||||||
|
res.Children["ind"] = ind;
|
||||||
|
aMap[ind] = res;
|
||||||
|
}
|
||||||
|
aMap[ind].Children["tiles"] = Convert.ToBase64String(outB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint MapTileId(uint src, Dictionary<uint, uint> mapping)
|
||||||
|
{
|
||||||
|
return (src & 0xFFFF0000) | mapping[src & 0xFFFF];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, YamlMappingNode> ConvertTileChunks(YamlSequenceNode chunks)
|
||||||
|
{
|
||||||
|
var map = new Dictionary<string, YamlMappingNode>();
|
||||||
|
foreach (var chunk in chunks)
|
||||||
|
map[chunk["ind"].ToString()] = (YamlMappingNode) chunk;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] GetChunkBytes(Dictionary<string, YamlMappingNode> chunks, string ind)
|
||||||
|
{
|
||||||
|
if (!chunks.ContainsKey(ind))
|
||||||
|
return new byte[ExpectedChunkSize];
|
||||||
|
return Convert.FromBase64String(chunks[ind]["tiles"].ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Entities --
|
||||||
|
|
||||||
|
public void PlanEntityMapping()
|
||||||
|
{
|
||||||
|
// Ok, so here's how it works:
|
||||||
|
// 1. Entities that do not exist in "based" are additions.
|
||||||
|
// 2. Entities that exist in "based" but do not exist in the one map or the other are removals.
|
||||||
|
|
||||||
|
// Find modifications and deletions
|
||||||
|
foreach (var kvp in MapBased.Entities)
|
||||||
|
{
|
||||||
|
var deletedByOurs = !MapOurs.Entities.ContainsKey(kvp.Key);
|
||||||
|
var deletedByOther = !MapOther.Entities.ContainsKey(kvp.Key);
|
||||||
|
if (deletedByOther && !deletedByOurs)
|
||||||
|
{
|
||||||
|
// Delete
|
||||||
|
MapOurs.Entities.Remove(kvp.Key);
|
||||||
|
}
|
||||||
|
else if (!(deletedByOurs || deletedByOther))
|
||||||
|
{
|
||||||
|
// Modify
|
||||||
|
EntityMapFromOtherToOurs[kvp.Key] = kvp.Key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find additions
|
||||||
|
foreach (var kvp in MapOther.Entities)
|
||||||
|
{
|
||||||
|
if (!MapBased.Entities.ContainsKey(kvp.Key))
|
||||||
|
{
|
||||||
|
// New
|
||||||
|
var newId = MapOurs.NextAvailableEntityId++;
|
||||||
|
EntityMapFromOtherToOurs[kvp.Key] = newId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MergeEntities()
|
||||||
|
{
|
||||||
|
bool success = true;
|
||||||
|
foreach (var kvp in EntityMapFromOtherToOurs)
|
||||||
|
{
|
||||||
|
// For debug use.
|
||||||
|
// Console.WriteLine("Entity C/" + kvp.Key + " -> A/" + kvp.Value);
|
||||||
|
YamlMappingNode oursEnt;
|
||||||
|
if (MapOurs.Entities.ContainsKey(kvp.Value))
|
||||||
|
{
|
||||||
|
oursEnt = MapOurs.Entities[kvp.Value];
|
||||||
|
if (!MapBased.Entities.TryGetValue(kvp.Value, out var basedEnt))
|
||||||
|
{
|
||||||
|
basedEnt = oursEnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!MergeEntityNodes(oursEnt, basedEnt, MapOther.Entities[kvp.Key]))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Unable to successfully merge entity C/" + kvp.Key);
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
oursEnt = (YamlMappingNode) YamlTools.CopyYamlNodes(MapOther.Entities[kvp.Key]);
|
||||||
|
if (!MapEntity(oursEnt)) {
|
||||||
|
Console.WriteLine("Unable to successfully import entity C/" + kvp.Key);
|
||||||
|
success = false;
|
||||||
|
} else {
|
||||||
|
MapOurs.Entities[kvp.Value] = oursEnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oursEnt.Children["uid"] = kvp.Value.ToString(CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MergeEntityNodes(YamlMappingNode ours, YamlMappingNode based, YamlMappingNode other)
|
||||||
|
{
|
||||||
|
// Copy to intermediate
|
||||||
|
var otherMapped = (YamlMappingNode) YamlTools.CopyYamlNodes(other);
|
||||||
|
if (!MapEntity(otherMapped))
|
||||||
|
return false;
|
||||||
|
// Merge stuff that isn't components
|
||||||
|
var path = "Entity" + (other["uid"].ToString());
|
||||||
|
YamlTools.MergeYamlMappings(ours, based, otherMapped, path, new string[] {"components"});
|
||||||
|
// Components are special
|
||||||
|
var ourComponents = new Dictionary<string, YamlMappingNode>();
|
||||||
|
var basedComponents = new Dictionary<string, YamlMappingNode>();
|
||||||
|
var ourComponentsNode = (YamlSequenceNode) ours["components"];
|
||||||
|
var basedComponentsNode = (YamlSequenceNode) based["components"];
|
||||||
|
var otherComponentsNode = (YamlSequenceNode) otherMapped["components"];
|
||||||
|
foreach (var component in ourComponentsNode)
|
||||||
|
{
|
||||||
|
var name = component["type"].ToString();
|
||||||
|
ourComponents[name] = (YamlMappingNode) component;
|
||||||
|
}
|
||||||
|
foreach (var component in basedComponentsNode)
|
||||||
|
{
|
||||||
|
var name = component["type"].ToString();
|
||||||
|
basedComponents[name] = (YamlMappingNode) component;
|
||||||
|
}
|
||||||
|
foreach (var otherComponent in otherComponentsNode)
|
||||||
|
{
|
||||||
|
var name = otherComponent["type"].ToString();
|
||||||
|
if (ourComponents.ContainsKey(name))
|
||||||
|
{
|
||||||
|
var ourComponent = ourComponents[name];
|
||||||
|
if (!basedComponents.TryGetValue(name, out var basedComponent))
|
||||||
|
basedComponent = new YamlMappingNode();
|
||||||
|
|
||||||
|
YamlTools.MergeYamlNodes(ourComponent, basedComponent, otherComponent, path + "/components/" + name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ourComponentsNode.Add(otherComponent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MapEntity(YamlMappingNode other)
|
||||||
|
{
|
||||||
|
var path = "Entity" + (other["uid"].ToString());
|
||||||
|
if (other.Children.ContainsKey("components"))
|
||||||
|
{
|
||||||
|
var components = (YamlSequenceNode) other["components"];
|
||||||
|
foreach (var component in components)
|
||||||
|
{
|
||||||
|
var type = component["type"].ToString();
|
||||||
|
if (type == "Transform")
|
||||||
|
{
|
||||||
|
if (!MapEntityProperty((YamlMappingNode) component, "parent", path))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (type == "ContainerContainer")
|
||||||
|
{
|
||||||
|
MapEntityRecursiveAndBadly(component, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MapEntityProperty(YamlMappingNode node, string property, string path)
|
||||||
|
{
|
||||||
|
if (node.Children.ContainsKey(property)) {
|
||||||
|
var prop = node[property];
|
||||||
|
if (prop is YamlScalarNode)
|
||||||
|
return MapEntityProperty((YamlScalarNode) prop, path + "/" + property);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MapEntityProperty(YamlScalarNode node, string path)
|
||||||
|
{
|
||||||
|
if (uint.TryParse(node.ToString(), out var uid))
|
||||||
|
{
|
||||||
|
if (EntityMapFromOtherToOurs.ContainsKey(uid))
|
||||||
|
{
|
||||||
|
node.Value = EntityMapFromOtherToOurs[uid].ToString(CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error finding UID in MapEntityRecursiveAndBadly {path}. To fix this, the merge driver needs to be improved.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MapEntityRecursiveAndBadly(YamlNode node, string path)
|
||||||
|
{
|
||||||
|
switch (node)
|
||||||
|
{
|
||||||
|
case YamlSequenceNode subSequence:
|
||||||
|
var idx = 0;
|
||||||
|
foreach (var val in subSequence)
|
||||||
|
if (!MapEntityRecursiveAndBadly(val, path + "/" + (idx++)))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
case YamlMappingNode subMapping:
|
||||||
|
foreach (var kvp in subMapping)
|
||||||
|
if (!MapEntityRecursiveAndBadly(kvp.Key, path))
|
||||||
|
return false;
|
||||||
|
foreach (var kvp in subMapping)
|
||||||
|
if (!MapEntityRecursiveAndBadly(kvp.Value, path + "/" + kvp.Key.ToString()))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
case YamlScalarNode subScalar:
|
||||||
|
return MapEntityProperty(subScalar, path);
|
||||||
|
default:
|
||||||
|
throw new ArgumentException($"Unrecognized YAML node type: {node.GetType()} at {path}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
Content.Tools/TypeTagPreserver.cs
Normal file
25
Content.Tools/TypeTagPreserver.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using YamlDotNet.Core;
|
||||||
|
using YamlDotNet.Core.Events;
|
||||||
|
|
||||||
|
namespace Content.Tools
|
||||||
|
{
|
||||||
|
public class TypeTagPreserver : IEmitter
|
||||||
|
{
|
||||||
|
public TypeTagPreserver(IEmitter emitter)
|
||||||
|
{
|
||||||
|
Emitter = emitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEmitter Emitter { get; }
|
||||||
|
|
||||||
|
public void Emit(ParsingEvent @event)
|
||||||
|
{
|
||||||
|
if (@event is MappingStart mapping)
|
||||||
|
{
|
||||||
|
@event = new MappingStart(mapping.Anchor, mapping.Tag, false, mapping.Style, mapping.Start, mapping.End);
|
||||||
|
}
|
||||||
|
|
||||||
|
Emitter.Emit(@event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
199
Content.Tools/YamlTools.cs
Normal file
199
Content.Tools/YamlTools.cs
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using YamlDotNet.Core;
|
||||||
|
using YamlDotNet.RepresentationModel;
|
||||||
|
|
||||||
|
namespace Content.Tools
|
||||||
|
{
|
||||||
|
public static class YamlTools
|
||||||
|
{
|
||||||
|
public static YamlNode CopyYamlNodes(YamlNode other)
|
||||||
|
{
|
||||||
|
switch (other)
|
||||||
|
{
|
||||||
|
case YamlSequenceNode subSequence:
|
||||||
|
YamlSequenceNode tmp1 = new YamlSequenceNode();
|
||||||
|
MergeYamlSequences((YamlSequenceNode) tmp1, new YamlSequenceNode(), (YamlSequenceNode) other, "");
|
||||||
|
return tmp1;
|
||||||
|
case YamlMappingNode subMapping:
|
||||||
|
YamlMappingNode tmp2 = new YamlMappingNode();
|
||||||
|
MergeYamlMappings((YamlMappingNode) tmp2, new YamlMappingNode(), (YamlMappingNode) other, "", new string[] {});
|
||||||
|
return tmp2;
|
||||||
|
case YamlScalarNode subScalar:
|
||||||
|
YamlScalarNode tmp3 = new YamlScalarNode();
|
||||||
|
CopyYamlScalar(tmp3, subScalar);
|
||||||
|
return tmp3;
|
||||||
|
default:
|
||||||
|
throw new ArgumentException($"Unrecognized YAML node type for copy: {other.GetType()}", nameof(other));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool TriTypeMatch(YamlNode ours, YamlNode based, YamlNode other)
|
||||||
|
{
|
||||||
|
var refType = other.GetType();
|
||||||
|
if (refType != based.GetType())
|
||||||
|
return false;
|
||||||
|
if (refType != ours.GetType())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MergeYamlNodes(YamlNode ours, YamlNode based, YamlNode other, string path)
|
||||||
|
{
|
||||||
|
if (!TriTypeMatch(ours, based, other))
|
||||||
|
throw new ArgumentException($"Node type mismatch at {path}");
|
||||||
|
switch (other)
|
||||||
|
{
|
||||||
|
case YamlSequenceNode subSequence:
|
||||||
|
MergeYamlSequences((YamlSequenceNode) ours, (YamlSequenceNode) based, (YamlSequenceNode) other, path);
|
||||||
|
break;
|
||||||
|
case YamlMappingNode subMapping:
|
||||||
|
MergeYamlMappings((YamlMappingNode) ours, (YamlMappingNode) based, (YamlMappingNode) other, path, new string[] {});
|
||||||
|
break;
|
||||||
|
case YamlScalarNode subScalar:
|
||||||
|
// Console.WriteLine(path + " - " + ours + " || " + based + " || " + other);
|
||||||
|
var scalarA = (YamlScalarNode) ours;
|
||||||
|
var scalarB = (YamlScalarNode) based;
|
||||||
|
var scalarC = (YamlScalarNode) other;
|
||||||
|
var aeb = (scalarA.Value == scalarB.Value);
|
||||||
|
var cneb = (scalarC.Value != scalarB.Value);
|
||||||
|
if (aeb || cneb)
|
||||||
|
CopyYamlScalar(scalarA, scalarC);
|
||||||
|
// Console.WriteLine(path + " . " + ours + " || " + based + " || " + other);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentException($"Unrecognized YAML node type at {path}: {other.GetType()}", nameof(other));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MergeYamlSequences(YamlSequenceNode ours, YamlSequenceNode based, YamlSequenceNode other, string path)
|
||||||
|
{
|
||||||
|
if ((ours.Children.Count == based.Children.Count) && (other.Children.Count == ours.Children.Count))
|
||||||
|
{
|
||||||
|
// this is terrible and doesn't do proper rearrange detection
|
||||||
|
// but it looks as if vectors might be arrays
|
||||||
|
// so rearrange detection might break more stuff...
|
||||||
|
// nope, they aren't, but still good to have
|
||||||
|
for (var i = 0; i < ours.Children.Count; i++)
|
||||||
|
MergeYamlNodes(ours.Children[i], based.Children[i], other.Children[i], path + "/" + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// for now, just copy other -> ours
|
||||||
|
// I am aware this is terrible
|
||||||
|
ours.Children.Clear();
|
||||||
|
foreach (var c in other.Children)
|
||||||
|
ours.Add(CopyYamlNodes(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MergeYamlMappings(YamlMappingNode ours, YamlMappingNode based, YamlMappingNode other, string path, string[] ignoreThese)
|
||||||
|
{
|
||||||
|
// Deletions/modifications
|
||||||
|
foreach (var kvp in based)
|
||||||
|
{
|
||||||
|
if (ignoreThese.Contains(kvp.Key.ToString()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var localPath = path + "/" + kvp.Key.ToString();
|
||||||
|
var deletedByOurs = !ours.Children.ContainsKey(kvp.Key);
|
||||||
|
var deletedByOther = !other.Children.ContainsKey(kvp.Key);
|
||||||
|
if (deletedByOther && (!deletedByOurs))
|
||||||
|
{
|
||||||
|
// Delete
|
||||||
|
ours.Children.Remove(kvp.Key);
|
||||||
|
}
|
||||||
|
else if (!(deletedByOurs || deletedByOther))
|
||||||
|
{
|
||||||
|
// Modify
|
||||||
|
var a = ours[kvp.Key];
|
||||||
|
var b = kvp.Value; // based[kvp.Key]
|
||||||
|
var c = other[kvp.Key];
|
||||||
|
if (!TriTypeMatch(a, b, c))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Warning: Type mismatch (defaulting to value C) at " + localPath);
|
||||||
|
ours.Children[kvp.Key] = CopyYamlNodes(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MergeYamlNodes(a, b, c, localPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Additions
|
||||||
|
foreach (var kvp in other)
|
||||||
|
{
|
||||||
|
if (ignoreThese.Contains(kvp.Key.ToString()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var localPath = path + "/" + kvp.Key.ToString();
|
||||||
|
if (!based.Children.ContainsKey(kvp.Key))
|
||||||
|
{
|
||||||
|
if (ours.Children.ContainsKey(kvp.Key))
|
||||||
|
{
|
||||||
|
// Both sides added the same key. Try to merge.
|
||||||
|
var a = ours[kvp.Key];
|
||||||
|
var b = based[kvp.Key];
|
||||||
|
var c = kvp.Value; // other[kvp.Key]
|
||||||
|
if (!TriTypeMatch(a, b, c))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Warning: Type mismatch (defaulting to value C) at " + localPath);
|
||||||
|
ours.Children[kvp.Key] = CopyYamlNodes(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MergeYamlNodes(a, b, c, localPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Well that was easy
|
||||||
|
ours.Children[kvp.Key] = CopyYamlNodes(kvp.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: This is a heuristic ONLY! And is also not used at the moment because sequence matching isn't in place.
|
||||||
|
// It could also be massively improved.
|
||||||
|
public static float YamlNodesHeuristic(YamlNode a, YamlNode b)
|
||||||
|
{
|
||||||
|
if (a.GetType() != b.GetType())
|
||||||
|
return 0.0f;
|
||||||
|
switch (a)
|
||||||
|
{
|
||||||
|
case YamlSequenceNode x:
|
||||||
|
return YamlSequencesHeuristic((YamlSequenceNode) a, (YamlSequenceNode) b);
|
||||||
|
case YamlMappingNode y:
|
||||||
|
return YamlMappingsHeuristic((YamlMappingNode) a, (YamlMappingNode) b);
|
||||||
|
case YamlScalarNode z:
|
||||||
|
return (((YamlScalarNode) a).Value == ((YamlScalarNode) b).Value) ? 1.0f : 0.0f;
|
||||||
|
default:
|
||||||
|
throw new ArgumentException($"Unrecognized YAML node type: {a.GetType()}", nameof(a));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float YamlSequencesHeuristic(YamlSequenceNode a, YamlSequenceNode b)
|
||||||
|
{
|
||||||
|
if (a.Children.Count != b.Children.Count)
|
||||||
|
return 0.0f;
|
||||||
|
if (a.Children.Count == 0)
|
||||||
|
return 1.0f;
|
||||||
|
var total = 0.0f;
|
||||||
|
for (var i = 0; i < a.Children.Count; i++)
|
||||||
|
total += YamlNodesHeuristic(a.Children[i], b.Children[i]);
|
||||||
|
return total / a.Children.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float YamlMappingsHeuristic(YamlMappingNode a, YamlMappingNode b)
|
||||||
|
{
|
||||||
|
return (a == b) ? 1.0f : 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CopyYamlScalar(YamlScalarNode dst, YamlScalarNode src)
|
||||||
|
{
|
||||||
|
dst.Value = src.Value;
|
||||||
|
dst.Style = src.Style;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
95
Content.Tools/test/0A.yml
Normal file
95
Content.Tools/test/0A.yml
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
meta:
|
||||||
|
format: 2
|
||||||
|
name: DemoStation
|
||||||
|
author: Space-Wizards
|
||||||
|
postmapinit: false
|
||||||
|
tilemap:
|
||||||
|
0: space
|
||||||
|
7: floor_dark
|
||||||
|
8: floor_elevator_shaft
|
||||||
|
9: floor_freezer
|
||||||
|
10: floor_gold
|
||||||
|
11: floor_green_circuit
|
||||||
|
12: floor_hydro
|
||||||
|
13: floor_lino
|
||||||
|
14: floor_mono
|
||||||
|
15: floor_reinforced
|
||||||
|
16: floor_rock_vault
|
||||||
|
17: floor_showroom
|
||||||
|
18: floor_snow
|
||||||
|
19: floor_steel
|
||||||
|
20: floor_steel_dirty
|
||||||
|
21: floor_techmaint
|
||||||
|
22: floor_white
|
||||||
|
23: floor_wood
|
||||||
|
24: lattice
|
||||||
|
25: plating
|
||||||
|
26: underplating
|
||||||
|
grids:
|
||||||
|
- settings:
|
||||||
|
chunksize: 16
|
||||||
|
tilesize: 1
|
||||||
|
snapsize: 1
|
||||||
|
chunks:
|
||||||
|
- ind: "-2,-2"
|
||||||
|
comment: "Ew in A | FQ in B | Fg in C | Fg in Out - SHOULD CAUSE CONFLICT WARNING"
|
||||||
|
tiles: EwAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAaAAAAGgAAABMAAAATAAAAEwAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAaAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAVAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAGgAAABMAAAATAAAAEwAAABUAAAAZAAAAFQAAABUAAAAVAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGQAAABUAAAAaAAAAFQAAAA==
|
||||||
|
- ind: "-1,-1"
|
||||||
|
tiles: EwAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAWAAAAFgAAABYAAAAWAAAAEwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAAaAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAGgAAABMAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAZAAAAFQAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAAA==
|
||||||
|
- ind: "-1,0"
|
||||||
|
tiles: EwAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAWAAAAFgAAABYAAAAWAAAAEwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAAaAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAGgAAABMAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAZAAAAFQAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAAA==
|
||||||
|
- ind: "0,0"
|
||||||
|
tiles: FwAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAaAAAAGgAAABMAAAATAAAAEwAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAaAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAVAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAGgAAABMAAAATAAAAEwAAABUAAAAZAAAAFQAAABUAAAAVAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGQAAABUAAAAaAAAAFQAAAA==
|
||||||
|
entities:
|
||||||
|
- uid: 0
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 855
|
||||||
|
pos: -5.5,-1.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- type: ContainerContainer
|
||||||
|
typeChange:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
example:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 3
|
||||||
|
- 855
|
||||||
|
- "contributionA"
|
||||||
|
- uid: 1
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
pos: -15.5,-14.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- uid: 2
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 1
|
||||||
|
pos: -15.5,-14.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- type: ThereShouldBeTwoOfTheseInOutputOfMergeTestAAA
|
||||||
|
- uid: 3
|
||||||
|
type: AnnoyingPlaceholderOnPurpose
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
type: Transform
|
||||||
|
- uid: 855
|
||||||
|
components:
|
||||||
|
- name: Saltern Station
|
||||||
|
type: MetaData
|
||||||
|
- parent: null
|
||||||
|
type: Transform
|
||||||
|
- index: 0
|
||||||
|
type: MapGrid
|
||||||
|
- shapes:
|
||||||
|
- !type:PhysShapeGrid
|
||||||
|
grid: 0
|
||||||
|
type: Physics
|
||||||
|
|
||||||
86
Content.Tools/test/0B.yml
Normal file
86
Content.Tools/test/0B.yml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
meta:
|
||||||
|
format: 2
|
||||||
|
name: DemoStation
|
||||||
|
author: Space-Wizards
|
||||||
|
postmapinit: false
|
||||||
|
tilemap:
|
||||||
|
0: space
|
||||||
|
7: floor_dark
|
||||||
|
8: floor_elevator_shaft
|
||||||
|
9: floor_freezer
|
||||||
|
10: floor_gold
|
||||||
|
11: floor_green_circuit
|
||||||
|
12: floor_hydro
|
||||||
|
13: floor_lino
|
||||||
|
14: floor_mono
|
||||||
|
15: floor_reinforced
|
||||||
|
16: floor_rock_vault
|
||||||
|
17: floor_showroom
|
||||||
|
18: floor_snow
|
||||||
|
19: floor_steel
|
||||||
|
20: floor_steel_dirty
|
||||||
|
21: floor_techmaint
|
||||||
|
22: floor_white
|
||||||
|
23: floor_wood
|
||||||
|
24: lattice
|
||||||
|
25: plating
|
||||||
|
26: underplating
|
||||||
|
grids:
|
||||||
|
- settings:
|
||||||
|
chunksize: 16
|
||||||
|
tilesize: 1
|
||||||
|
snapsize: 1
|
||||||
|
chunks:
|
||||||
|
- ind: "-2,-2"
|
||||||
|
comment: "Ew in A | FQ in B | Fg in C | Fg in Out - SHOULD CAUSE CONFLICT WARNING"
|
||||||
|
tiles: FQAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAaAAAAGgAAABMAAAATAAAAEwAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAaAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAVAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAGgAAABMAAAATAAAAEwAAABUAAAAZAAAAFQAAABUAAAAVAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGQAAABUAAAAaAAAAFQAAAA==
|
||||||
|
- ind: "-1,-1"
|
||||||
|
tiles: FQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAVAAAAFQAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAGgAAABUAAAAaAAAAGgAAABoAAAAZAAAAFQAAABUAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABUAAAAVAAAAFQAAABUAAAAaAAAAGQAAABUAAAAVAAAAGgAAABYAAAAWAAAAFgAAABoAAAAaAAAAGgAAABUAAAAVAAAAFQAAABUAAAAVAAAAGgAAABkAAAAVAAAAFQAAABoAAAAaAAAAFgAAABoAAAAaAAAAGQAAABkAAAAVAAAAFQAAABUAAAAVAAAAFQAAABoAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAFQAAABUAAAAaAAAAGQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABoAAAAaAAAAGgAAABUAAAAaAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAZAAAAFQAAAA0AAAANAAAADQAAAA0AAAANAAAAGgAAABUAAAAVAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAANAAAADQAAAA0AAAANAAAADQAAABoAAAAVAAAAFQAAABkAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAADQAAAA0AAAANAAAADQAAAA0AAAAaAAAAGgAAABoAAAAZAAAAEwAAAAkAAAAJAAAACQAAAAkAAAAJAAAAGgAAAA0AAAANAAAADQAAAA0AAAANAAAAFwAAABcAAAAXAAAAGgAAABoAAAAJAAAACQAAAAkAAAAJAAAACQAAABoAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAaAAAAGgAAABMAAAAaAAAAGgAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAGgAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAAA==
|
||||||
|
- ind: "-1,0"
|
||||||
|
tiles: EwAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAWAAAAFgAAABYAAAAWAAAAEwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAAaAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAGgAAABMAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAZAAAAFQAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAAA==
|
||||||
|
- ind: "0,-1"
|
||||||
|
tiles: FgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFgAAABYAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABoAAAAWAAAAFgAAABYAAAAWAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAWAAAAGgAAABoAAAAaAAAAFgAAABYAAAAWAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAZAAAAFQAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABYAAAAaAAAAGgAAABYAAAAWAAAAGgAAABoAAAAWAAAAFgAAABoAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAXAAAAGgAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFwAAABoAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABoAAAAaAAAAFgAAABcAAAATAAAAEwAAABMAAAATAAAAEwAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAXAAAAEwAAABMAAAATAAAAEwAAABMAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFwAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABoAAAAWAAAAFgAAAA==
|
||||||
|
- ind: "0,0"
|
||||||
|
tiles: FwAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAaAAAAGgAAABMAAAATAAAAEwAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAaAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAVAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAGgAAABMAAAATAAAAEwAAABUAAAAZAAAAFQAAABUAAAAVAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGQAAABUAAAAaAAAAFQAAAA==
|
||||||
|
entities:
|
||||||
|
- uid: 0
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 855
|
||||||
|
pos: -15.5,-11.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- type: ContainerContainer
|
||||||
|
typeChange:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
example:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
- 3
|
||||||
|
- 855
|
||||||
|
- uid: 1
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
pos: -15.5,-14.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- uid: 3
|
||||||
|
type: AnnoyingPlaceholderOnPurpose
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
type: Transform
|
||||||
|
- uid: 855
|
||||||
|
components:
|
||||||
|
- name: Saltern Station
|
||||||
|
type: MetaData
|
||||||
|
- parent: null
|
||||||
|
type: Transform
|
||||||
|
- index: 0
|
||||||
|
type: MapGrid
|
||||||
|
- shapes:
|
||||||
|
- !type:PhysShapeGrid
|
||||||
|
grid: 0
|
||||||
|
type: Physics
|
||||||
|
|
||||||
105
Content.Tools/test/0C.yml
Normal file
105
Content.Tools/test/0C.yml
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
meta:
|
||||||
|
format: 2
|
||||||
|
name: DemoStation
|
||||||
|
author: Space-Wizards
|
||||||
|
postmapinit: false
|
||||||
|
tilemap:
|
||||||
|
0: space
|
||||||
|
1: floor_asteroid_coarse_sand0
|
||||||
|
2: floor_asteroid_coarse_sand1
|
||||||
|
3: floor_asteroid_coarse_sand2
|
||||||
|
4: floor_asteroid_coarse_sand_dug
|
||||||
|
5: floor_asteroid_sand
|
||||||
|
6: floor_asteroid_tile
|
||||||
|
7: floor_dark
|
||||||
|
8: floor_elevator_shaft
|
||||||
|
9: floor_freezer
|
||||||
|
10: floor_gold
|
||||||
|
11: floor_green_circuit
|
||||||
|
12: floor_hydro
|
||||||
|
13: floor_lino
|
||||||
|
14: floor_mono
|
||||||
|
15: floor_reinforced
|
||||||
|
16: floor_rock_vault
|
||||||
|
17: floor_showroom
|
||||||
|
18: floor_snow
|
||||||
|
19: floor_steel
|
||||||
|
20: floor_steel_dirty
|
||||||
|
21: floor_techmaint
|
||||||
|
22: floor_white
|
||||||
|
23: floor_wood
|
||||||
|
24: lattice
|
||||||
|
25: plating
|
||||||
|
26: underplating
|
||||||
|
grids:
|
||||||
|
- settings:
|
||||||
|
chunksize: 16
|
||||||
|
tilesize: 1
|
||||||
|
snapsize: 1
|
||||||
|
chunks:
|
||||||
|
- ind: "-2,-2"
|
||||||
|
comment: "Ew in A | FQ in B | Fg in C | Fg in Out - SHOULD CAUSE CONFLICT WARNING"
|
||||||
|
tiles: FgAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAaAAAAGgAAABMAAAATAAAAEwAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAaAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAVAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAGgAAABMAAAATAAAAEwAAABUAAAAZAAAAFQAAABUAAAAVAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGQAAABUAAAAaAAAAFQAAAA==
|
||||||
|
- ind: "-1,-1"
|
||||||
|
tiles: FQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAVAAAAFQAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAGgAAABUAAAAaAAAAGgAAABoAAAAZAAAAFQAAABUAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABUAAAAVAAAAFQAAABUAAAAaAAAAGQAAABUAAAAVAAAAGgAAABYAAAAWAAAAFgAAABoAAAAaAAAAGgAAABUAAAAVAAAAFQAAABUAAAAVAAAAGgAAABkAAAAVAAAAFQAAABoAAAAaAAAAFgAAABoAAAAaAAAAGQAAABkAAAAVAAAAFQAAABUAAAAVAAAAFQAAABoAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAFQAAABUAAAAaAAAAGQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABoAAAAaAAAAGgAAABUAAAAaAAAAGgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAZAAAAFQAAAA0AAAANAAAADQAAAA0AAAANAAAAGgAAABUAAAAVAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAANAAAADQAAAA0AAAANAAAADQAAABoAAAAVAAAAFQAAABkAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAADQAAAA0AAAANAAAADQAAAA0AAAAaAAAAGgAAABoAAAAZAAAAEwAAAAkAAAAJAAAACQAAAAkAAAAJAAAAGgAAAA0AAAANAAAADQAAAA0AAAANAAAAFwAAABcAAAAXAAAAGgAAABoAAAAJAAAACQAAAAkAAAAJAAAACQAAABoAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAaAAAAGgAAABMAAAAaAAAAGgAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAGgAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAAA==
|
||||||
|
- ind: "-1,0"
|
||||||
|
tiles: EwAAABYAAAAWAAAAFgAAABYAAAATAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABoAAAAWAAAAFgAAABYAAAAWAAAAEwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAAaAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAGgAAABMAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABoAAAATAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAEwAAABoAAAAaAAAAEwAAABMAAAAaAAAAGgAAABMAAAAaAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAZAAAAFQAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAEwAAABMAAAATAAAAEwAAABoAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAaAAAAGgAAAA==
|
||||||
|
- ind: "0,-1"
|
||||||
|
tiles: FgAAABMAAAATAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAATAAAAEwAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFgAAABYAAAAaAAAAEwAAABMAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABoAAAAWAAAAFgAAABYAAAAWAAAAGgAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABoAAAAWAAAAGgAAABoAAAAaAAAAFgAAABYAAAAWAAAAGgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAZAAAAGgAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGQAAABoAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABkAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAZAAAAFQAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABoAAAATAAAAEwAAABMAAAAaAAAAGgAAABYAAAAaAAAAGgAAABYAAAAWAAAAGgAAABoAAAAWAAAAFgAAABoAAAAaAAAAEwAAABMAAAATAAAAGgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAXAAAAGgAAABMAAAATAAAAEwAAABoAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFwAAABoAAAATAAAAEwAAABMAAAAaAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABoAAAAaAAAAFgAAABcAAAATAAAAEwAAABMAAAATAAAAEwAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAaAAAAFgAAABYAAAAXAAAAEwAAABMAAAATAAAAEwAAABMAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGgAAABYAAAAWAAAAFwAAABMAAAATAAAAEwAAABMAAAATAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABoAAAAWAAAAFgAAAA==
|
||||||
|
entities:
|
||||||
|
- uid: 0
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 855
|
||||||
|
pos: -15.5,-11.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- type: ContainerContainer
|
||||||
|
typeChange:
|
||||||
|
something: true
|
||||||
|
example:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
- 855
|
||||||
|
- "contributionC"
|
||||||
|
- uid: 1
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
pos: -5.5,-4.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- uid: 2
|
||||||
|
type: FakeTestDummy
|
||||||
|
components:
|
||||||
|
- parent: 1
|
||||||
|
pos: -15.5,-14.5
|
||||||
|
rot: -1.5707963267948966 rad
|
||||||
|
type: Transform
|
||||||
|
- type: ThereShouldBeTwoOfTheseInOutputOfMergeTestBBB
|
||||||
|
- uid: 3
|
||||||
|
type: AnnoyingPlaceholderOnPurpose
|
||||||
|
components:
|
||||||
|
- parent: 0
|
||||||
|
type: Transform
|
||||||
|
- uid: 4
|
||||||
|
type: ThisShouldHaveParentChangedToFollowUID
|
||||||
|
components:
|
||||||
|
- parent: 2
|
||||||
|
type: Transform
|
||||||
|
- uid: 855
|
||||||
|
components:
|
||||||
|
- name: Saltern Station
|
||||||
|
type: MetaData
|
||||||
|
- parent: null
|
||||||
|
type: Transform
|
||||||
|
- index: 0
|
||||||
|
type: MapGrid
|
||||||
|
- shapes:
|
||||||
|
- !type:PhysShapeGrid
|
||||||
|
grid: 0
|
||||||
|
type: Physics
|
||||||
|
|
||||||
3
Content.Tools/test/run.sh
Executable file
3
Content.Tools/test/run.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cp 0A.yml out.yml
|
||||||
|
../bin/Debug/net5.0/Content.Tools out.yml 0B.yml 0C.yml
|
||||||
@@ -89,6 +89,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlX", "RobustToolbox\Xaml
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlX.Runtime", "RobustToolbox\XamlX\src\XamlX.Runtime\XamlX.Runtime.csproj", "{440426C1-8DCA-43F6-967F-94439B8DAF47}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlX.Runtime", "RobustToolbox\XamlX\src\XamlX.Runtime\XamlX.Runtime.csproj", "{440426C1-8DCA-43F6-967F-94439B8DAF47}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Content.Tools", "Content.Tools\Content.Tools.csproj", "{75AB8F8D-9E56-4B12-85E3-E03A852B31CC}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -193,6 +195,10 @@ Global
|
|||||||
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Release|Any CPU.Build.0 = Release|Any CPU
|
{440426C1-8DCA-43F6-967F-94439B8DAF47}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{75AB8F8D-9E56-4B12-85E3-E03A852B31CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{75AB8F8D-9E56-4B12-85E3-E03A852B31CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{75AB8F8D-9E56-4B12-85E3-E03A852B31CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{75AB8F8D-9E56-4B12-85E3-E03A852B31CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
9
Tools/mapping-merge-driver.sh
Executable file
9
Tools/mapping-merge-driver.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Add this to .git/config:
|
||||||
|
# [merge "mapping-merge-driver"]
|
||||||
|
# name = Merge driver for maps
|
||||||
|
# driver = Tools/mapping-merge-driver.sh %A %O %B
|
||||||
|
|
||||||
|
dotnet run --project ./Content.Tools "$@"
|
||||||
|
|
||||||
Reference in New Issue
Block a user