Use SHA1 for map uids
This commit is contained in:
@@ -395,8 +395,9 @@ namespace MapConverter
|
|||||||
public void Save(string filepath)
|
public void Save(string filepath)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(filepath);
|
Directory.CreateDirectory(filepath);
|
||||||
|
|
||||||
|
Map.Package = new Folder(filepath);
|
||||||
SavePreviewImage(Path.Combine(filepath,"preview.png"));
|
SavePreviewImage(Path.Combine(filepath,"preview.png"));
|
||||||
Map.UpdateUid();
|
|
||||||
Map.Save(filepath);
|
Map.Save(filepath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace OpenRA.FileFormats
|
namespace OpenRA.FileFormats
|
||||||
{
|
{
|
||||||
@@ -30,7 +31,7 @@ namespace OpenRA.FileFormats
|
|||||||
{
|
{
|
||||||
public IFolder Package;
|
public IFolder Package;
|
||||||
public string Uid;
|
public string Uid;
|
||||||
|
|
||||||
// Yaml map data
|
// Yaml map data
|
||||||
public int MapFormat = 1;
|
public int MapFormat = 1;
|
||||||
public string Title;
|
public string Title;
|
||||||
@@ -64,7 +65,7 @@ namespace OpenRA.FileFormats
|
|||||||
public IEnumerable<int2> SpawnPoints {get {return Waypoints.Select(kv => kv.Value);}}
|
public IEnumerable<int2> SpawnPoints {get {return Waypoints.Select(kv => kv.Value);}}
|
||||||
|
|
||||||
static List<string> SimpleFields = new List<string>() {
|
static List<string> SimpleFields = new List<string>() {
|
||||||
"Uid", "MapFormat", "Title", "Description", "Author", "PlayerCount", "Tileset", "MapSize", "TopLeft", "BottomRight"
|
"MapFormat", "Title", "Description", "Author", "PlayerCount", "Tileset", "MapSize", "TopLeft", "BottomRight"
|
||||||
};
|
};
|
||||||
|
|
||||||
public Map() {}
|
public Map() {}
|
||||||
@@ -83,9 +84,7 @@ namespace OpenRA.FileFormats
|
|||||||
string[] loc = wp.Value.Value.Split(',');
|
string[] loc = wp.Value.Value.Split(',');
|
||||||
Waypoints.Add(wp.Key, new int2(int.Parse(loc[0]),int.Parse(loc[1])));
|
Waypoints.Add(wp.Key, new int2(int.Parse(loc[0]),int.Parse(loc[1])));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Players
|
|
||||||
|
|
||||||
// Actors
|
// Actors
|
||||||
foreach (var kv in yaml["Actors"].Nodes)
|
foreach (var kv in yaml["Actors"].Nodes)
|
||||||
{
|
{
|
||||||
@@ -106,17 +105,10 @@ namespace OpenRA.FileFormats
|
|||||||
// Rules
|
// Rules
|
||||||
Rules = yaml["Rules"].Nodes;
|
Rules = yaml["Rules"].Nodes;
|
||||||
|
|
||||||
|
LoadUid();
|
||||||
LoadBinaryData();
|
LoadBinaryData();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateUid()
|
|
||||||
{
|
|
||||||
// TODO: Do this properly.
|
|
||||||
// Use a hash of the important data
|
|
||||||
Random foo = new Random();
|
|
||||||
Uid = foo.Next().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Save(string filepath)
|
public void Save(string filepath)
|
||||||
{
|
{
|
||||||
Dictionary<string, MiniYaml> root = new Dictionary<string, MiniYaml>();
|
Dictionary<string, MiniYaml> root = new Dictionary<string, MiniYaml>();
|
||||||
@@ -126,14 +118,15 @@ namespace OpenRA.FileFormats
|
|||||||
FieldInfo f = this.GetType().GetField(field);
|
FieldInfo f = this.GetType().GetField(field);
|
||||||
if (f.GetValue(this) == null) continue;
|
if (f.GetValue(this) == null) continue;
|
||||||
root.Add(field,new MiniYaml(FieldSaver.FormatValue(this,f),null));
|
root.Add(field,new MiniYaml(FieldSaver.FormatValue(this,f),null));
|
||||||
}
|
}
|
||||||
|
|
||||||
root.Add("Actors",MiniYaml.FromDictionary<string,ActorReference>(Actors));
|
root.Add("Actors",MiniYaml.FromDictionary<string,ActorReference>(Actors));
|
||||||
root.Add("Waypoints",MiniYaml.FromDictionary<string,int2>(Waypoints));
|
root.Add("Waypoints",MiniYaml.FromDictionary<string,int2>(Waypoints));
|
||||||
root.Add("Smudges",MiniYaml.FromList<SmudgeReference>(Smudges));
|
root.Add("Smudges",MiniYaml.FromList<SmudgeReference>(Smudges));
|
||||||
// TODO: Players
|
|
||||||
root.Add("Rules",new MiniYaml(null,Rules));
|
root.Add("Rules",new MiniYaml(null,Rules));
|
||||||
SaveBinaryData(Path.Combine(filepath,"map.bin"));
|
SaveBinaryData(Path.Combine(filepath,"map.bin"));
|
||||||
root.WriteToFile(Path.Combine(filepath,"map.yaml"));
|
root.WriteToFile(Path.Combine(filepath,"map.yaml"));
|
||||||
|
SaveUid(Path.Combine(filepath,"map.uid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static byte ReadByte( Stream s )
|
static byte ReadByte( Stream s )
|
||||||
@@ -216,6 +209,34 @@ namespace OpenRA.FileFormats
|
|||||||
File.Move(filepath+".tmp",filepath);
|
File.Move(filepath+".tmp",filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LoadUid()
|
||||||
|
{
|
||||||
|
StreamReader uidStream = new StreamReader(Package.GetContent("map.uid"));
|
||||||
|
Uid = uidStream.ReadLine();
|
||||||
|
uidStream.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveUid(string filename)
|
||||||
|
{
|
||||||
|
// UID is calculated by taking an SHA1 of the yaml and binary data
|
||||||
|
// Read the relevant data into a buffer
|
||||||
|
var yamlStream = Package.GetContent("map.yaml");
|
||||||
|
var binaryStream = Package.GetContent("map.bin");
|
||||||
|
var data = new byte[yamlStream.Length+binaryStream.Length];
|
||||||
|
|
||||||
|
yamlStream.Read(data,0,(int)yamlStream.Length);
|
||||||
|
binaryStream.Read(data,(int)yamlStream.Length,(int)binaryStream.Length);
|
||||||
|
|
||||||
|
// Take the SHA1
|
||||||
|
using (var csp = SHA1.Create())
|
||||||
|
Uid = new string(csp.ComputeHash(data).SelectMany(a => a.ToString("x2")).ToArray());
|
||||||
|
|
||||||
|
// Save to file
|
||||||
|
StreamWriter file = new System.IO.StreamWriter(filename);
|
||||||
|
file.WriteLine(Uid);
|
||||||
|
file.Close();
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsInMap(int2 xy)
|
public bool IsInMap(int2 xy)
|
||||||
{
|
{
|
||||||
return IsInMap(xy.X,xy.Y);
|
return IsInMap(xy.X,xy.Y);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace OpenRA.FileFormats
|
namespace OpenRA.FileFormats
|
||||||
@@ -43,7 +44,7 @@ namespace OpenRA.FileFormats
|
|||||||
public Lazy<Bitmap> Preview;
|
public Lazy<Bitmap> Preview;
|
||||||
|
|
||||||
static List<string> Fields = new List<string>() {
|
static List<string> Fields = new List<string>() {
|
||||||
"Uid", "Title", "Description", "Author", "PlayerCount", "Tileset", "TopLeft", "BottomRight"
|
"Title", "Description", "Author", "PlayerCount", "Tileset", "TopLeft", "BottomRight"
|
||||||
};
|
};
|
||||||
|
|
||||||
public MapStub() {}
|
public MapStub() {}
|
||||||
@@ -57,6 +58,10 @@ namespace OpenRA.FileFormats
|
|||||||
Preview = Lazy.New(
|
Preview = Lazy.New(
|
||||||
() => {return new Bitmap(Package.GetContent("preview.png"));}
|
() => {return new Bitmap(Package.GetContent("preview.png"));}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
StreamReader uidStream = new StreamReader(Package.GetContent("map.uid"));
|
||||||
|
Uid = uidStream.ReadLine();
|
||||||
|
uidStream.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Rectangle PreviewBounds(Rectangle container)
|
public Rectangle PreviewBounds(Rectangle container)
|
||||||
|
|||||||
1
mods/cnc/maps/scm01ea/map.uid
Normal file
1
mods/cnc/maps/scm01ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
a00d9720b29238ced3e3a442f0d6b99901f2fc02
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 97516324
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: GREEN ACRES
|
Title: GREEN ACRES
|
||||||
|
|||||||
1
mods/cnc/maps/scm02ea/map.uid
Normal file
1
mods/cnc/maps/scm02ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0694d1ad31535697679194fc0beca8d57ead5a1c
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 119926504
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: Sand Trap
|
Title: Sand Trap
|
||||||
|
|||||||
1
mods/cnc/maps/scm03ea/map.uid
Normal file
1
mods/cnc/maps/scm03ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e1a198be05a4fe4487e5441f60259693dcf7a00f
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 708244922
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: Lost Arena
|
Title: Lost Arena
|
||||||
|
|||||||
@@ -52,4 +52,4 @@ Voices:
|
|||||||
Terrain:
|
Terrain:
|
||||||
mods/cnc/terrain.yaml
|
mods/cnc/terrain.yaml
|
||||||
|
|
||||||
ShellmapUid:119926504
|
ShellmapUid:a00d9720b29238ced3e3a442f0d6b99901f2fc02
|
||||||
|
|||||||
1
mods/ra/maps/scm01ea/map.uid
Normal file
1
mods/ra/maps/scm01ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
d2d0811ce6cd64e836317039547ce777b5a199d3
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 45646351
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: Coastal Influence (4-6)
|
Title: Coastal Influence (4-6)
|
||||||
|
|||||||
1
mods/ra/maps/scm02ea/map.uid
Normal file
1
mods/ra/maps/scm02ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
b3e0dbb967bc20a3e7da64e7383d2d90094684f0
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 1134734410
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: Middle Mayhem (2)
|
Title: Middle Mayhem (2)
|
||||||
|
|||||||
1
mods/ra/maps/scm03ea/map.uid
Normal file
1
mods/ra/maps/scm03ea/map.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
580c39f9606d773ea8daa2bf9603aa9687736be1
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
Uid: 846202401
|
|
||||||
|
|
||||||
MapFormat: 1
|
MapFormat: 1
|
||||||
|
|
||||||
Title: Equal Opportunity (2)
|
Title: Equal Opportunity (2)
|
||||||
|
|||||||
@@ -50,4 +50,4 @@ Voices:
|
|||||||
Terrain:
|
Terrain:
|
||||||
mods/ra/terrain.yaml
|
mods/ra/terrain.yaml
|
||||||
|
|
||||||
ShellmapUid:1134734410
|
ShellmapUid:d2d0811ce6cd64e836317039547ce777b5a199d3
|
||||||
|
|||||||
Reference in New Issue
Block a user