Skip to content

Commit

Permalink
Improve Export and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
OndrejNepozitek committed Dec 14, 2023
1 parent cfb2c62 commit 8a8f3db
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 65 deletions.
29 changes: 17 additions & 12 deletions Editor/Import/ImportRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void Run(string exportPath)
Directory.CreateDirectory(roomTemplatesFolder);

var tile = AssetDatabase.LoadAssetAtPath<Tile>($"Assets\\Edgar\\Examples\\Grid2D\\Example1\\Tiles\\example1_79.asset");

// TODO: handle duplicate names
foreach (var roomTemplateDto in exportDto.RoomTemplates)
{
Expand Down Expand Up @@ -162,25 +162,30 @@ private void SaveRoomTemplateAsPrefab(RoomTemplateDto roomTemplateDto, string fo
other.SetTile(position, _outlineTile);
}

var doors = roomTemplate.GetComponent<DoorsGrid2D>();
var doorsDto = roomTemplateDto.Doors;
doors.DoorsList = doorsDto.DoorsList;
doors.SelectedMode = doorsDto.SelectedMode;
doors.HybridDoorModeData = doorsDto.HybridDoorModeData;
doors.ManualDoorModeData = doorsDto.ManualDoorModeData;
doors.SimpleDoorModeData = doorsDto.SimpleDoorModeData;

var roomTemplateComponent = roomTemplate.GetComponent<RoomTemplateSettingsGrid2D>();
roomTemplateComponent.RepeatMode = roomTemplateDto.RepeatMode;



var prefabPath = Path.Combine(folder, $"{roomTemplateDto.Name}.prefab");
PrefabUtility.SaveAsPrefabAsset(roomTemplate, AssetDatabase.GenerateUniqueAssetPath(prefabPath));
PrefabUtility.SaveAsPrefabAsset(roomTemplate, prefabPath);

// Remove game object from scene
Object.DestroyImmediate(roomTemplate);

// For some reason, the nested doors data are not saved the first time
var loadedAgain = PrefabUtility.LoadPrefabContents(prefabPath);
var doors = loadedAgain.GetComponent<DoorsGrid2D>();
var doorsDto = roomTemplateDto.Doors;
doors.SelectedMode = doorsDto.SelectedMode;
doors.HybridDoorModeData = doorsDto.HybridDoorModeData;
doors.ManualDoorModeData = doorsDto.ManualDoorModeData;
doors.SimpleDoorModeData = doorsDto.SimpleDoorModeData;
PrefabUtility.SaveAsPrefabAsset(loadedAgain, prefabPath);

// Remove game object from scene
Object.DestroyImmediate(loadedAgain);
}


[MenuItem("Edgar debug/Import")]
public static void SyncBuildScenes()
{
Expand Down
3 changes: 2 additions & 1 deletion Runtime/Grid2D/Common/Export/ExportModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public class ExportDto
{
public LevelGraphDto LevelGraph;
public List<RoomTemplateDto> RoomTemplates;
public RepeatModeOverride RepeatModeOverride;
public int MinimumRoomDistance = 1;
}

[Serializable]
Expand Down Expand Up @@ -43,7 +45,6 @@ public class RoomTemplateDto
[Serializable]
public class DoorsDto
{
public List<DoorGrid2D> DoorsList = new List<DoorGrid2D>();
public DoorsGrid2D.DoorMode SelectedMode;
public HybridDoorModeDataGrid2D HybridDoorModeData;
public ManualDoorModeDataGrid2D ManualDoorModeData;
Expand Down
2 changes: 2 additions & 0 deletions Runtime/Grid2D/Common/Export/ExportPostProcessing.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System.Linq;
using UnityEngine;

namespace Edgar.Unity.Export
{
#if OndrejNepozitekEdgar
// This post-processing class is used to debug exported levels.
[AddComponentMenu("Edgar/Grid2D/Export post-processing (you should not see this)")]
public class ExportPostProcessing : DungeonGeneratorPostProcessingComponentGrid2D
{
public override void Run(DungeonGeneratorLevelGrid2D level)
Expand Down
104 changes: 55 additions & 49 deletions Runtime/Grid2D/Common/Export/ExportRunner.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Edgar.GraphBasedGenerator.Grid2D;
using Edgar.Legacy.Utils;
Expand All @@ -14,53 +12,32 @@ public class ExportRunner
private readonly Dictionary<GameObject, string> _roomTemplateToIdMapping = new Dictionary<GameObject, string>();
private LevelDescriptionGrid2D _levelDescription;

public string ExportToJson(LevelDescriptionGrid2D levelDescription)
public string ExportToJson(LevelDescriptionGrid2D levelDescription, int minimumRoomDistance, RepeatModeOverride repeatModeOverride)
{
_levelDescription = levelDescription;
var exportDto = GetExportDto(levelDescription);

var exportDto = GetExportDto();
exportDto.MinimumRoomDistance = minimumRoomDistance;
exportDto.RepeatModeOverride = repeatModeOverride;

var jsonString = JsonUtility.ToJson(exportDto, true);

return jsonString;
}

private string GetRoomId(RoomBase room)
private ExportDto GetExportDto()
{
if (_roomToIdMapping.TryGetValue(room, out var id))
{
return id;
}

id = GetUniqueIdentifier(room.GetDisplayName(), _roomToIdMapping.Values);
_roomToIdMapping[room] = id;

return id;
}

private string GetRoomTemplateId(GameObject roomTemplate)
{
if (_roomTemplateToIdMapping.TryGetValue(roomTemplate, out var id))
{
return id;
}

id = GetUniqueIdentifier(roomTemplate.name, _roomToIdMapping.Values);
_roomTemplateToIdMapping[roomTemplate] = id;

return id;
}

private ExportDto GetExportDto(LevelDescriptionGrid2D levelDescription)
{
var roomTemplates = levelDescription.GetPrefabToRoomTemplateMapping();
var roomTemplates = _levelDescription.GetPrefabToRoomTemplateMapping();
var roomTemplateGameObjects = roomTemplates.Keys.ToList();

return new ExportDto()
{
RoomTemplates = roomTemplateGameObjects.Select(MapToDto).ToList(),
LevelGraph = MapToLevelGraphDto(levelDescription.GetLevelDescription()),
LevelGraph = MapToLevelGraphDto(_levelDescription.GetLevelDescription()),
};
}

// Get the set of room templates that is shared by the highest number of rooms
private List<RoomTemplateGrid2D> GetDefaultRoomTemplates(LevelDescriptionGrid2D<RoomBase> levelDescription, bool isCorridor)
{
var rooms = levelDescription.GetGraph().Vertices.ToList();
Expand Down Expand Up @@ -98,20 +75,6 @@ private List<RoomTemplateGrid2D> GetDefaultRoomTemplates(LevelDescriptionGrid2D<
return sorted[0].Key;
}

private string GetUniqueIdentifier(string originalName, IReadOnlyCollection<string> usedIds)
{
var identifier = originalName;
var attemptCounter = 0;

while (usedIds.Contains(identifier))
{
attemptCounter++;
identifier = $"{originalName} {attemptCounter}";
}

return identifier;
}

private LevelGraphDto MapToLevelGraphDto(LevelDescriptionGrid2D<RoomBase> levelDescription)
{
var defaultRoomTemplates = GetDefaultRoomTemplates(levelDescription, false);
Expand Down Expand Up @@ -174,7 +137,11 @@ private RoomTemplateDto MapToDto(GameObject roomTemplate)
var tilemaps = RoomTemplateUtilsGrid2D.GetTilemaps(roomTemplate);
var outlineTilemaps = RoomTemplateUtilsGrid2D.GetTilemapsForOutline(tilemaps);
var tiles = RoomTemplateLoaderGrid2D.GetUsedTiles(tilemaps).ToList();
var outlinePolygon = new Polygon2D(RoomTemplateLoaderGrid2D.GetPolygonFromTilemaps(outlineTilemaps));
var outlineHandler = roomTemplate.GetComponent<IRoomTemplateOutlineHandlerGrid2D>();
var outlinePolygon = outlineHandler != null
? outlineHandler.GetRoomTemplateOutline()
: new Polygon2D(RoomTemplateLoaderGrid2D.GetPolygonFromTilemaps(outlineTilemaps));

var outlineTiles = outlinePolygon.GetOutlinePoints().Select(x => new Vector3Int(x.x, x.y,0)).ToList();

return new RoomTemplateDto()
Expand All @@ -185,13 +152,52 @@ private RoomTemplateDto MapToDto(GameObject roomTemplate)
OutlineTiles = outlineTiles,
Doors = new DoorsDto()
{
DoorsList = doorsComponent.DoorsList,
SelectedMode = doorsComponent.SelectedMode,
HybridDoorModeData = doorsComponent.HybridDoorModeData,
ManualDoorModeData = doorsComponent.ManualDoorModeData,
SimpleDoorModeData = doorsComponent.SimpleDoorModeData,
}
};
}

private string GetRoomId(RoomBase room)
{
if (_roomToIdMapping.TryGetValue(room, out var id))
{
return id;
}

id = GetUniqueIdentifier(room.GetDisplayName(), _roomToIdMapping.Values);
_roomToIdMapping[room] = id;

return id;
}

private string GetRoomTemplateId(GameObject roomTemplate)
{
if (_roomTemplateToIdMapping.TryGetValue(roomTemplate, out var id))
{
return id;
}

id = GetUniqueIdentifier(roomTemplate.name, _roomToIdMapping.Values);
_roomTemplateToIdMapping[roomTemplate] = id;

return id;
}

private static string GetUniqueIdentifier(string originalName, IReadOnlyCollection<string> usedIds)
{
var identifier = originalName;
var attemptCounter = 0;

while (usedIds.Contains(identifier))
{
attemptCounter++;
identifier = $"{originalName} {attemptCounter}";
}

return identifier;
}
}
}
6 changes: 3 additions & 3 deletions Runtime/Grid2D/DungeonGenerator/DungeonGeneratorBaseGrid2D.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ protected virtual DungeonGeneratorPayloadGrid2D InitializePayload()
};
}

public void ExportLevelDescription()
public void ExportLevelDescription(bool useTmpFolder = false)
{
var payload = InitializePayload();
var inputSetup = GetInputTask();
Expand All @@ -133,7 +133,7 @@ public void ExportLevelDescription()

PipelineRunner.Run(pipelineItems, payload);

var directoryName = "EdgarExport";
var directoryName = $"EdgarExport{(useTmpFolder ? "_tmp" : "")}";
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
Expand All @@ -153,7 +153,7 @@ private void ExportUnityLevelDescription(LevelDescriptionGrid2D levelDescription
try
{
var exportRunner = new ExportRunner();
var json = exportRunner.ExportToJson(levelDescription);
var json = exportRunner.ExportToJson(levelDescription, GeneratorConfig.MinimumRoomDistance, GeneratorConfig.RepeatModeOverride);
File.WriteAllText(path, json);
Debug.Log($"Level description (Unity) exported to {path}");
}
Expand Down
1 change: 1 addition & 0 deletions Tests/Runtime/Examples/Example1Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public IEnumerator BasicTest()
Assert.IsTrue(levelInfo.RoomInstances.Count(x => !x.IsCorridor) == levelGraph.Rooms.Count);

dungeonGenerator.Generate();
dungeonGenerator.ExportLevelDescription(true);
yield return null;

var levelInfoNew = generatedLevelGameObject.GetComponent<LevelInfoGrid2D>();
Expand Down
2 changes: 2 additions & 0 deletions Tests/Runtime/Examples/Example2Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public IEnumerator BasicTest()
Assert.IsTrue(levelInfo.RoomInstances.Count(x => !x.IsCorridor) == levelGraph.Rooms.Count);

dungeonGenerator.Generate();
dungeonGenerator.ExportLevelDescription(true);
yield return null;

var levelInfoNew = generatedLevelGameObject.GetComponent<LevelInfoGrid2D>();
Expand Down Expand Up @@ -63,6 +64,7 @@ public IEnumerator DifferentLevelGraphs()

dungeonGenerator.FixedLevelGraphConfig.LevelGraph = levelGraph;
dungeonGenerator.Generate();
dungeonGenerator.ExportLevelDescription(true);
yield return null;
}

Expand Down

0 comments on commit 8a8f3db

Please sign in to comment.