예제 #1
0
        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);
             * }*/
        }
예제 #2
0
파일: Dump.cs 프로젝트: mrwillbarnz/ualbion
        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();
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
                }
            }
        }
예제 #5
0
 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);
 }
예제 #6
0
파일: Dump.cs 프로젝트: mrwillbarnz/ualbion
 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);
 }
예제 #7
0
파일: DumpText.cs 프로젝트: lucorp/ualbion
        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();
            }
        }