Skip to content

Commit

Permalink
Mapping merge driver: continued (#2803)
Browse files Browse the repository at this point in the history
Co-authored-by: DrSmugleaf <[email protected]>
Co-authored-by: Pieter-Jan Briers <[email protected]>
  • Loading branch information
3 people authored Feb 6, 2021
1 parent 5cbb3f1 commit 2f01d78
Show file tree
Hide file tree
Showing 14 changed files with 1,026 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
Resources/Maps/**.yml merge=mapping-merge-driver

###############################################################################
# behavior for image files
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -284,3 +284,7 @@ BuildFiles/Windows/Godot/*
# Windows image file caches
Thumbs.db
ehthumbs.db

# Merge driver stuff
Content.Tools/test/out.yml

16 changes: 16 additions & 0 deletions Content.Tools/Content.Tools.csproj
Original file line number Diff line number Diff line change
@@ -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 changes: 83 additions & 0 deletions Content.Tools/Map.cs
Original file line number Diff line number Diff line change
@@ -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 changes: 38 additions & 0 deletions Content.Tools/MappingMergeDriver.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Loading

0 comments on commit 2f01d78

Please sign in to comment.