diff --git a/GraalGmapGenerator/Gmap.cs b/GraalGmapGenerator/Gmap.cs
index de8216e..5ba4b42 100644
--- a/GraalGmapGenerator/Gmap.cs
+++ b/GraalGmapGenerator/Gmap.cs
@@ -2,28 +2,32 @@
{
public class Gmap
{
- public string Name { get; set; }
+ public string Name { get; }
- public int Width { get; set; }
+ public int Width { get; }
public int Height { get; set; }
- public bool NoAutomapping { get; set; }
+ public bool NoAutomapping { get; }
- public bool LoadFullMap { get; set; }
+ public bool LoadFullMap { get; }
+
+ public bool AddLevelLinks { get; }
public Gmap(
string name,
int width,
int height,
bool noAutomapping = false,
- bool loadFullMap = false)
+ bool loadFullMap = false,
+ bool addLevelLinks = false)
{
Name = name;
Width = width;
Height = height;
NoAutomapping = noAutomapping;
LoadFullMap = loadFullMap;
+ AddLevelLinks = addLevelLinks;
}
}
}
diff --git a/GraalGmapGenerator/GmapBuilder.cs b/GraalGmapGenerator/GmapBuilder.cs
index 3eee5ed..78ef256 100644
--- a/GraalGmapGenerator/GmapBuilder.cs
+++ b/GraalGmapGenerator/GmapBuilder.cs
@@ -7,6 +7,7 @@
private int _height;
private bool _noAutomapping;
private bool _loadFullMap;
+ private bool _addLevelLinks;
public GmapBuilder SetName(string name)
{
@@ -34,12 +35,24 @@
return this;
}
+ public GmapBuilder AddLevelLinks(bool value)
+ {
+ _addLevelLinks = value;
+ return this;
+ }
+
///
/// Builds the gmap
///
public Gmap Build()
{
- return new Gmap(_name, _width, _height, _noAutomapping, _loadFullMap);
+ return new Gmap(
+ _name,
+ _width,
+ _height,
+ _noAutomapping,
+ _loadFullMap,
+ _addLevelLinks);
}
}
}
diff --git a/GraalGmapGenerator/GmapContent.cs b/GraalGmapGenerator/GmapContent.cs
new file mode 100644
index 0000000..7e83a88
--- /dev/null
+++ b/GraalGmapGenerator/GmapContent.cs
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+
+namespace GraalGmapGenerator
+{
+ public class GmapContent
+ {
+ public string Content { get; }
+ public IEnumerable Levels { get; }
+
+ public GmapContent(string content, IEnumerable levels)
+ {
+ Content = content;
+ Levels = levels;
+ }
+ }
+}
\ No newline at end of file
diff --git a/GraalGmapGenerator/GmapContentGenerator.cs b/GraalGmapGenerator/GmapContentGenerator.cs
index ac3e9bd..9bb9be4 100644
--- a/GraalGmapGenerator/GmapContentGenerator.cs
+++ b/GraalGmapGenerator/GmapContentGenerator.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.Linq;
using System.Text;
using GraalGmapGenerator.Enums;
@@ -18,9 +17,10 @@ namespace GraalGmapGenerator
/// Returns the gmap file contents
///
///
- public string Generate(Gmap gmap)
+ public GmapContent Generate(Gmap gmap)
{
var stringBuilder = new StringBuilder();
+ (string Content, IEnumerable Levels) data = GenerateLevelNamesList(gmap);
stringBuilder.AppendLine("GRMAP001");
stringBuilder.AppendLine($"WIDTH {gmap.Width}");
@@ -33,16 +33,34 @@ namespace GraalGmapGenerator
stringBuilder.AppendLine("LOADFULLMAP");
stringBuilder.AppendLine("LEVELNAMES");
+ stringBuilder.AppendLine(data.Content);
+ stringBuilder.Append("LEVELNAMESEND");
- List levelNames = GetLevelNames(gmap).ToList();
- for (var i = 0; i < levelNames.Count; i++)
+ string content = stringBuilder.ToString();
+
+ return new GmapContent(content, data.Levels);
+ }
+
+ private (string content, IEnumerable levelNames) GenerateLevelNamesList(Gmap gmap)
+ {
+ // TODO: Split this method up - it's doing too much. But I want to be able to generate
+ // the level names and also create a new instance of Level for each level within a single
+ // loop, rather than having a loop for each.
+
+ var stringBuilder = new StringBuilder();
+ var levels = new List();
+ int gmapArea = gmap.Width * gmap.Height;
+
+ for (int i = 0; i < gmapArea; i++)
{
// Start a new line once the current line has hit the width of the gmap
if (i > 0 && i % gmap.Width == 0)
stringBuilder.AppendLine();
- var levelName = GetLevelName(i, gmap.Name, _levelType);
- stringBuilder.Append($"\"{levelName}\"");
+ var level = new Level(gmap, i, _levelType);
+ levels.Add(level);
+
+ stringBuilder.Append($"\"{level.FileName}\"");
// Only append a comma if its NOT the end of the row
if (i % gmap.Width < (gmap.Width - 1))
@@ -51,37 +69,7 @@ namespace GraalGmapGenerator
}
}
- stringBuilder.AppendLine();
- stringBuilder.Append("LEVELNAMESEND");
-
- return stringBuilder.ToString();
- }
-
- public IEnumerable GetLevelNames(Gmap gmap)
- {
- for (int i = 0; i < (gmap.Width * gmap.Height); i++)
- {
- yield return GetLevelName(i, gmap.Name, _levelType);
- }
- }
-
- private string GetLevelName(int index, string name, LevelType levelType)
- {
- string extension;
-
- switch (levelType)
- {
- default:
- case LevelType.Nw:
- extension = ".nw";
- break;
-
- case LevelType.Graal:
- extension = ".graal";
- break;
- }
-
- return $"{name}_{index}{extension}";
+ return (stringBuilder.ToString(), levels);
}
}
}
diff --git a/GraalGmapGenerator/GmapWriter.cs b/GraalGmapGenerator/GmapWriter.cs
index 8ab6c28..6f851bc 100644
--- a/GraalGmapGenerator/GmapWriter.cs
+++ b/GraalGmapGenerator/GmapWriter.cs
@@ -1,4 +1,3 @@
-using System.Collections.Generic;
using System.IO;
using GraalGmapGenerator.Enums;
@@ -16,15 +15,14 @@ namespace GraalGmapGenerator
}
var gmapContentGen = new GmapContentGenerator(LevelType.Nw);
+ GmapContent gmapContent = gmapContentGen.Generate(gmap);
- IEnumerable levelNames = gmapContentGen.GetLevelNames(gmap);
- foreach (string levelName in levelNames)
+ foreach (Level level in gmapContent.Levels)
{
- File.Copy(TemplateFile, $"{destinationPath}/{levelName}");
+ File.Copy(TemplateFile, $"{destinationPath}/{level.FileName}");
}
- string gmapContent = gmapContentGen.Generate(gmap);
- File.AppendAllText($"{destinationPath}/{gmap.Name}.gmap", gmapContent);
+ File.AppendAllText($"{destinationPath}/{gmap.Name}.gmap", gmapContent.Content);
}
}
}
\ No newline at end of file
diff --git a/GraalGmapGenerator/Level.cs b/GraalGmapGenerator/Level.cs
new file mode 100644
index 0000000..4154cf7
--- /dev/null
+++ b/GraalGmapGenerator/Level.cs
@@ -0,0 +1,34 @@
+using System;
+using GraalGmapGenerator.Enums;
+
+namespace GraalGmapGenerator
+{
+ public class Level
+ {
+ public string FileName { get; }
+ public int Index { get; }
+ public LevelType LevelType { get; }
+
+ public Level(Gmap gmap, int index, LevelType levelType)
+ {
+ FileName = $"{gmap.Name}_{index}{GetFileExtensionForLevelType(levelType)}";
+ Index = index;
+ LevelType = levelType;
+ }
+
+ private string GetFileExtensionForLevelType(LevelType levelType)
+ {
+ switch (levelType)
+ {
+ default:
+ throw new NotImplementedException($"{levelType} has not been implemented.");
+
+ case LevelType.Nw:
+ return ".nw";
+
+ case LevelType.Graal:
+ return ".graal";
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/GraalGmapGenerator/Program.cs b/GraalGmapGenerator/Program.cs
index 8215ff3..3e1ffc7 100644
--- a/GraalGmapGenerator/Program.cs
+++ b/GraalGmapGenerator/Program.cs
@@ -1,4 +1,5 @@
using System;
+using System.IO;
namespace GraalGmapGenerator
{
@@ -118,6 +119,7 @@ namespace GraalGmapGenerator
if (saveDirectory == "")
{
+ saveDirectory = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gmaps", gmapName);
}
Console.WriteLine("Generating gmap...");
diff --git a/GraalGmapGeneratorTests/Fake/GmapFake.cs b/GraalGmapGeneratorTests/Fake/GmapFake.cs
new file mode 100644
index 0000000..ffcdcaa
--- /dev/null
+++ b/GraalGmapGeneratorTests/Fake/GmapFake.cs
@@ -0,0 +1,58 @@
+using GraalGmapGenerator;
+
+namespace GraalGmapGeneratorTests.Fake
+{
+ internal static class GmapFake
+ {
+ private const string DefaultName = "Test gmap";
+ private const int DefaultWidth = 8;
+ private const int DefaultHeight = 10;
+ private const bool DefaultNoAutomapping = false;
+ private const bool DefaultLoadFullMap = false;
+ private const bool DefaultAddLevelLinks = false;
+
+ internal static Gmap Get()
+ {
+ return new Gmap(
+ DefaultName,
+ DefaultWidth,
+ DefaultHeight,
+ noAutomapping: DefaultNoAutomapping,
+ loadFullMap: DefaultLoadFullMap,
+ addLevelLinks: DefaultAddLevelLinks);
+ }
+
+ internal static Gmap GetWithAutomappingTrue()
+ {
+ return new Gmap(
+ DefaultName,
+ DefaultWidth,
+ DefaultHeight,
+ noAutomapping: true,
+ loadFullMap: DefaultLoadFullMap,
+ addLevelLinks: DefaultAddLevelLinks);
+ }
+
+ internal static Gmap GetWithLoadFullMapTrue()
+ {
+ return new Gmap(
+ DefaultName,
+ DefaultWidth,
+ DefaultHeight,
+ noAutomapping: DefaultNoAutomapping,
+ loadFullMap: true,
+ addLevelLinks: DefaultAddLevelLinks);
+ }
+
+ internal static Gmap GetWithAddLevelLinksTrue()
+ {
+ return new Gmap(
+ DefaultName,
+ DefaultWidth,
+ DefaultHeight,
+ noAutomapping: DefaultNoAutomapping,
+ loadFullMap: DefaultLoadFullMap,
+ addLevelLinks: true);
+ }
+ }
+}
\ No newline at end of file
diff --git a/GraalGmapGeneratorTests/GmapContentGeneratorTests.cs b/GraalGmapGeneratorTests/GmapContentGeneratorTests.cs
index d823f27..a28f12b 100644
--- a/GraalGmapGeneratorTests/GmapContentGeneratorTests.cs
+++ b/GraalGmapGeneratorTests/GmapContentGeneratorTests.cs
@@ -1,5 +1,6 @@
using GraalGmapGenerator;
using GraalGmapGenerator.Enums;
+using GraalGmapGeneratorTests.Fake;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
@@ -12,29 +13,24 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_SavesCorrectDimensions()
{
- var expectedWidth = 5;
- var expectedHeight = 6;
-
- var gmap = GetTestGmap();
- gmap.Width = expectedWidth;
- gmap.Height = expectedHeight;
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = result.Split("\n\r".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
+ string result = generator.Generate(gmap).Content;
+ string[] lines = result.Split("\n\r".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
- Assert.AreEqual($"WIDTH {expectedWidth}", lines[1]);
- Assert.AreEqual($"HEIGHT {expectedHeight}", lines[2]);
+ Assert.AreEqual($"WIDTH {gmap.Width}", lines[1]);
+ Assert.AreEqual($"HEIGHT {gmap.Height}", lines[2]);
}
[Test]
public void Generate_SavesHeader()
{
- var gmap = GetTestGmap();
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = SplitContentByLines(result);
+ string result = generator.Generate(gmap).Content;
+ List lines = SplitContentByLines(result);
Assert.AreEqual("GRMAP001", lines[0]);
}
@@ -42,12 +38,11 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_SaveNoAutomappingLine_WhenNoAutomappingIsTrue()
{
- var gmap = GetTestGmap();
- gmap.NoAutomapping = true;
+ Gmap gmap = GmapFake.GetWithAutomappingTrue();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = SplitContentByLines(result);
+ string result = generator.Generate(gmap).Content;
+ List lines = SplitContentByLines(result);
Assert.IsTrue(lines.Contains("NOAUTOMAPPING"));
}
@@ -55,12 +50,11 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_DoesntSaveNoAutomappingLine_WhenNoAutomappingIsFalse()
{
- var gmap = GetTestGmap();
- gmap.NoAutomapping = false;
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = SplitContentByLines(result);
+ string result = generator.Generate(gmap).Content;
+ List lines = SplitContentByLines(result);
Assert.IsFalse(lines.Contains("NOAUTOMAPPING"));
}
@@ -68,12 +62,11 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_SaveLoadFullMapLine_WhenLoadFullMapIsTrue()
{
- var gmap = GetTestGmap();
- gmap.LoadFullMap = true;
+ Gmap gmap = GmapFake.GetWithLoadFullMapTrue();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = SplitContentByLines(result);
+ string result = generator.Generate(gmap).Content;
+ List lines = SplitContentByLines(result);
Assert.IsTrue(lines.Contains("LOADFULLMAP"));
}
@@ -81,12 +74,11 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_DoesntSaveLoadFullMapLine_WhenLoadFullMapIsFalse()
{
- var gmap = GetTestGmap();
- gmap.LoadFullMap = false;
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
- var lines = SplitContentByLines(result);
+ string result = generator.Generate(gmap).Content;
+ List lines = SplitContentByLines(result);
Assert.IsFalse(lines.Contains("LOADFULLMAP"));
}
@@ -96,13 +88,13 @@ namespace GraalGmapGeneratorTests
[TestCase(LevelType.Graal, ".graal")]
public void Generate_SavesValidLevels_ForLevelType(LevelType levelType, string expectedFileExtension)
{
- var gmap = GetTestGmap();
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(levelType);
- var content = generator.Generate(gmap);
+ string content = generator.Generate(gmap).Content;
- var levelNames = GetLevelNamesFromContent(content);
- var isAllCorrectFileExtension = levelNames.All(levelName => levelName.EndsWith(expectedFileExtension));
+ IEnumerable levelNames = GetLevelNamesFromContent(content);
+ bool isAllCorrectFileExtension = levelNames.All(levelName => levelName.EndsWith(expectedFileExtension));
Assert.IsTrue(isAllCorrectFileExtension);
}
@@ -110,9 +102,9 @@ namespace GraalGmapGeneratorTests
[Test]
public void Generate_DoesSaveLevelNamesTags()
{
- var gmap = GetTestGmap();
+ Gmap gmap = GmapFake.Get();
var generator = new GmapContentGenerator(LevelType.Graal);
- var result = generator.Generate(gmap);
+ string result = generator.Generate(gmap).Content;
Assert.IsTrue(result.Contains("LEVELNAMES", System.StringComparison.Ordinal));
Assert.IsTrue(result.Contains("LEVELNAMESEND", System.StringComparison.Ordinal));
@@ -124,11 +116,6 @@ namespace GraalGmapGeneratorTests
return levelNamePattern.Matches(content).Select(x => x.Groups[1].Value);
}
- private Gmap GetTestGmap()
- {
- return new Gmap("My test gmap", 10, 11, true, true);
- }
-
private List SplitContentByLines(string content)
{
return content.Split("\n\r".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries).ToList();