static void DumpMapEvents(StreamWriter sw, IAssetManager assets, MapDataId mapId, IMapData map) { var formatter = new EventFormatter(assets, AssetType.MapText, (ushort)mapId); sw.WriteLine(); sw.WriteLine($"Map {(int)mapId} {mapId}:"); foreach (var e in map.Events) { var chainId = map.Chains.Select((x, i) => x.FirstEvent == e ? i : (int?)null).FirstOrDefault(x => x != null); PrintEvent(sw, formatter, e, chainId); } /* * var rootNodes = new HashSet<(bool, TriggerType, int)>(); * foreach (var zone in map.Zones) * rootNodes.Add((zone.Global, zone.Trigger, zone.EventNumber)); * * var sorted = * rootNodes * .OrderByDescending(x => x.Item1) * .ThenBy(x => x.Item2) * .ThenBy(x => x.Item3) * ; * * foreach (var (global, trigger, number) in sorted) * { * var e = map.Events[number]; * sw.WriteLine($"{(global ? "Global" : "Local")} {trigger}:"); * PrintChain(sw, formatter, e, 1); * }*/ }
public static void MapEvents(IAssetManager assets, string baseDir, MapDataId mapId) { var map = assets.LoadMap2D(mapId); if (map == null) // Just handle 2D for now { return; } var formatter = new EventFormatter(assets, mapId); var rootNodes = new HashSet <(bool, MapEventZone.TriggerType, int)>(); foreach (var zone in map.Zones) { rootNodes.Add((zone.Global, zone.Trigger, zone.EventNumber)); } var sorted = rootNodes .OrderByDescending(x => x.Item1) .ThenBy(x => x.Item2) .ThenBy(x => x.Item3) ; foreach (var(global, trigger, number) in sorted) { var e = map.Events[number]; Console.WriteLine($"{(global ? "Global" : "Local")} {trigger}:"); PrintChain(formatter, e, 1); } Console.ReadLine(); }
static void PrintEvent(StreamWriter sw, EventFormatter formatter, IEventNode e, int?chainId) { if (chainId.HasValue) { sw.Write('C'); sw.Write(chainId.Value.ToString().PadRight(3)); } else { sw.Write(" "); } sw.WriteLine(formatter.GetText(e)); }
public static void EventSets(AssetManager assets, string baseDir) { using var sw = File.CreateText($@"{baseDir}\re\AllEventSets.txt"); foreach (var eventSetId in Enum.GetValues(typeof(EventSetId)).Cast <EventSetId>()) { sw.WriteLine(); sw.WriteLine($"{(int)eventSetId} {eventSetId}:"); var set = assets.LoadEventSet(eventSetId); if (set == null) { continue; } var formatter = new EventFormatter(assets, AssetType.EventText, (ushort)eventSetId); foreach (var e in set.Events) { var chainId = set.Chains.Select((x, i) => x.FirstEvent == e ? i : (int?)null).FirstOrDefault(x => x != null); PrintEvent(sw, formatter, e, chainId); } } }
static void PrintChain(StreamWriter sw, EventFormatter formatter, IEventNode e, int indent) { do { sw.Write($"{e.Id:000}"); sw.Write("".PadRight(indent * 4)); if (e is IBranchNode branch) { sw.WriteLine($"if (!{formatter.GetText(e)}) {{"); if (branch.NextIfFalse != null) { PrintChain(sw, formatter, branch.NextIfFalse, indent + 1); } sw.WriteLine("}".PadLeft(4 + indent * 4)); sw.WriteLine("else...".PadLeft(10 + indent * 4)); } else { sw.WriteLine(formatter.GetText(e)); } e = e.Next; } while (e != null); }
static void PrintChain(EventFormatter formatter, IEventNode e, int indent) { do { Console.Write($"{e.Id:000}"); Console.Write("".PadRight(indent * 4)); if (e is IBranchNode branch) { Console.WriteLine($"if (!{formatter.GetText(e)}) {{"); if (branch.NextEventWhenFalse != null) { PrintChain(formatter, branch.NextEventWhenFalse, indent + 1); } Console.WriteLine("}".PadLeft(4 + indent * 4)); Console.WriteLine("else...".PadLeft(10 + indent * 4)); } else { Console.WriteLine(formatter.GetText(e)); } e = e.NextEvent; } while (e != null); }
static void MapData(IAssetManager assets, string baseDir, AssetId[] dumpIds) { using var sw = Open(baseDir, MapInfoPath); for (int i = 100; i < 400; i++) { MapId id = MapId.From((Base.Map)i); if (dumpIds != null && !dumpIds.Contains((AssetId)id)) { continue; } IMapData map = assets.LoadMap(id); if (map == null) { continue; } sw.Write($"{i} {(Base.Map)i} {map.MapType} "); sw.Write($"{map.Width}x{map.Height} "); sw.Write($"Palette:{map.PaletteId} ({map.PaletteId.Id}) "); if (map is MapData2D map2d) { sw.Write($"FrameRate:{map2d.FrameRate} "); sw.Write($"TileSet:{map2d.TilesetId} "); sw.Write($"Flags:{map2d.Flags} "); sw.Write($"Sound?:{map2d.Sound} "); } LabyrinthData lab = null; if (map is MapData3D map3d) { sw.Write($"Flags: {map3d.Flags} "); sw.Write($"Labyrinth: {map3d.LabDataId} "); sw.Write($"Sound?:{map3d.AmbientSongId} "); lab = assets.LoadLabyrinthData(map3d.LabDataId); } sw.Write($"Song:{map.SongId} ({map.SongId.Id}) "); sw.WriteLine($"CombatBackground:{map.CombatBackgroundId} ({map.CombatBackgroundId.Id})"); for (int j = 0; j < map.Npcs.Length; j++) { var npc = map.Npcs[j]; if (npc == null) { continue; } var wp = npc.Waypoints.FirstOrDefault(); var idText = npc.Id.ToString().PadLeft(15); sw.Write($" Npc{j:D3}: {idText} ({npc.Id.Id:D3}) "); sw.Write($"X:{wp.X:D3} Y:{wp.Y:D3} "); sw.Write($"U8:{npc.Unk8} "); sw.Write($"U9:{npc.Unk9} "); sw.Write($"F{(int)npc.Flags:X2}:({npc.Flags}) "); sw.Write($"M:{npc.Movement} "); sw.Write($"S:{npc.Sound} ({(int?)npc.Sound}) "); switch (map.MapType) { case MapType.TwoD: sw.Write($"GR:{npc.SpriteOrGroup} "); break; case MapType.TwoDOutdoors: sw.Write($"KL:{npc.SpriteOrGroup} "); break; case MapType.ThreeD: if (lab != null) { if (npc.SpriteOrGroup.Id >= lab.ObjectGroups.Count) { sw.Write($"InvalidObjGroup:{npc.SpriteOrGroup.Id}"); } else { var objectData = lab.ObjectGroups[npc.SpriteOrGroup.Id]; sw.Write($"3D:{npc.SpriteOrGroup.Id}=("); bool first = true; foreach (var subObject in objectData.SubObjects) { if (subObject == null) { continue; } if (!first) { sw.Write(", "); } first = false; var def = lab.Objects[subObject.ObjectInfoNumber]; sw.Write(def.SpriteId); } sw.Write(")"); } } break; } sw.WriteLine(); if (npc.Chain != 0xffff) { sw.WriteLine($" EventChain: {npc.Chain}"); var formatter = new EventFormatter(assets.LoadString, id.ToMapText()); sw.WriteLine(formatter.FormatChain(npc.Node, 2)); } } sw.WriteLine(); } }