private static void DumpObjectTableForSaveDir(string saveDir) { // Objects are only stored in maps var mapList = MapListParser.Parse(Tig.FS); var loader = new MapMobileLoader(Tig.FS); using var mapMobileIndex = new StreamWriter("map_mobiles.txt"); foreach (var mapListEntry in mapList) { var mapName = mapListEntry.Value.name; var mapDataDir = $"maps/{mapName}"; var mapSaveDir = Path.Join(saveDir, "maps", mapName); loader.Load(mapDataDir, mapSaveDir); mapMobileIndex.WriteLine("-----------------------------------------------------------------"); mapMobileIndex.WriteLine(mapName); mapMobileIndex.WriteLine("-----------------------------------------------------------------"); foreach (var mobile in loader.Mobiles) { mapMobileIndex.WriteLine(mobile.id + " " + mobile); } } }
private static void Convert(string toeeDir, string outputDir) { Directory.CreateDirectory(outputDir); using var fs = TroikaVfs.CreateFromInstallationDir(toeeDir); // Loads the map list var maps = MapListParser.Parse(fs); var entries = fs.ReadMesFile("rules/townmap_ui_placed_flag_locations.mes"); var mapCount = int.Parse(entries[1]); for (var mapIndex = 0; mapIndex < mapCount; mapIndex++) { var mapKey = 100 * (mapIndex + 1); var mapId = int.Parse(entries[mapKey]); // See MapSystem.GetDataDir var mapDataDir = Path.Join(outputDir, $"maps/{maps[mapId].name}"); Directory.CreateDirectory(mapDataDir); using var stream = new FileStream($"{mapDataDir}/map_markers.json", FileMode.Create); var options = new JsonWriterOptions { Indented = true }; using var writer = new Utf8JsonWriter(stream, options); writer.WriteStartObject(); writer.WriteString("$schema", "https://schemas.opentemple.de/townMapMarkers.json"); writer.WritePropertyName("markers"); writer.WriteStartArray(); var markerCount = int.Parse(entries[mapKey + 1]); for (var markerIndex = 0; markerIndex < markerCount; markerIndex++) { var markerKey = mapKey + 20 + markerIndex; var locationParts = entries[markerKey].Split(","); var x = int.Parse(locationParts[0].Trim()); var y = int.Parse(locationParts[1].Trim()); // Interestingly, ToEE applied a hard coded offset x -= 4; y -= 8; writer.WriteStartObject(); writer.WriteNumber("id", markerIndex); writer.WriteBoolean("initiallyVisible", false); // For the text, we reference the translation file // It however uses a different numbering scheme since ToEE itself will read it sequentially // rather than by key, but our translation system must reference it by key. var translationKey = markerKey - 110; writer.WriteString("text", $"#{{townmap_markers:{translationKey}}}"); writer.WriteNumber("x", x); writer.WriteNumber("y", y); writer.WriteEndObject(); } writer.WriteEndArray(); // markers writer.WriteEndObject(); } }
public static void ConvertAllMaps(string toeeDir) { using var game = HeadlessGame.Start(new HeadlessGameOptions(toeeDir)); var mapList = MapListParser.Parse(Tig.FS); foreach (var(mapId, mapEntry) in mapList) { Console.WriteLine($"Converting {mapId} ({mapEntry.name})"); ConvertMap(mapEntry); } }
public static void ConvertMap(string toeeDir, int mapId) { using var game = HeadlessGame.Start(new HeadlessGameOptions(toeeDir)); var mapList = MapListParser.Parse(Tig.FS); if (!mapList.TryGetValue(mapId, out var mapEntry)) { Console.WriteLine("Unknown map: " + mapId); return; } ConvertMap(mapEntry); }