Example #1
0
        public static LabyrinthData Serdes(LabyrinthData d, ISerializer s)
        {
            d ??= new LabyrinthData();
            s.Begin();
            PerfTracker.StartupEvent("Start loading labyrinth data");
            // s.ByteArray("UnknownBlock6C", () => sheet.UnknownBlock6C, x => sheet.UnknownBlock6C = x, 14);

            d.WallHeight           = s.UInt16(nameof(d.WallHeight), d.WallHeight);                                                    // 0
            d.CameraHeight         = s.UInt16(nameof(d.CameraHeight), d.CameraHeight);                                                // 2
            d.Unk4                 = s.UInt16(nameof(d.Unk4), d.Unk4);                                                                // 4
            d.BackgroundId         = s.TransformEnumU16(nameof(BackgroundId), d.BackgroundId, Tweak <DungeonBackgroundId> .Instance); // 6
            d.BackgroundYPosition  = s.UInt16(nameof(d.BackgroundYPosition), d.BackgroundYPosition);                                  // 8
            d.FogDistance          = s.UInt16(nameof(d.FogDistance), d.FogDistance);                                                  // A
            d.FogRed               = s.UInt16(nameof(d.FogRed), d.FogRed);                                                            // C
            d.FogGreen             = s.UInt16(nameof(d.FogGreen), d.FogGreen);                                                        // E
            d.FogBlue              = s.UInt16(nameof(d.FogBlue), d.FogBlue);                                                          // 10
            d.Unk12                = s.UInt8(nameof(d.Unk12), d.Unk12);                                                               // 12
            d.Unk13                = s.UInt8(nameof(d.Unk13), d.Unk13);                                                               // 13
            d.BackgroundColour     = s.UInt8(nameof(d.BackgroundColour), d.BackgroundColour);                                         // 14
            d.Unk15                = s.UInt8(nameof(d.Unk15), d.Unk15);                                                               // 15
            d.FogMode              = s.UInt16(nameof(d.FogMode), d.FogMode);                                                          // 16
            d.MaxLight             = s.UInt16(nameof(d.MaxLight), d.MaxLight);                                                        // 18
            d.WallWidth            = s.UInt16(nameof(d.WallWidth), d.WallWidth);                                                      // 1A
            d.BackgroundTileAmount = s.UInt16(nameof(d.BackgroundTileAmount), d.BackgroundTileAmount);                                // 1C
            d.MaxVisibleTiles      = s.UInt16(nameof(d.MaxVisibleTiles), d.MaxVisibleTiles);                                          // 1E
            d.Unk20                = s.UInt16(nameof(d.Unk20), d.Unk20);                                                              // 20
            d.Lighting             = s.UInt16(nameof(d.Lighting), d.Lighting);                                                        // 22
            d.Unk24                = s.UInt16(nameof(d.Unk24), d.Unk24);                                                              // 24
            s.Check();

            ushort objectGroupCount = s.UInt16("ObjectGroupCount", (ushort)d.ObjectGroups.Count); // 26

            s.List(nameof(d.ObjectGroups), d.ObjectGroups, objectGroupCount, ObjectGroup.Serdes);
            s.Check();

            var floorAndCeilingCount = s.UInt16("FloorAndCeilingCount", (ushort)d.FloorAndCeilings.Count); // 28 + objectGroupCount * 42

            s.List(nameof(d.FloorAndCeilings), d.FloorAndCeilings, floorAndCeilingCount, FloorAndCeiling.Serdes);
            s.Check();

            ushort objectCount = s.UInt16("ObjectCount", (ushort)d.Objects.Count); // 2A + objectGroupCount * 42 + floorAndCeilingCount * A

            s.List(nameof(d.Objects), d.Objects, objectCount, Object.Serdes);
            s.Check();

            // Populate objectIds on subobjects to improve debugging experience
            foreach (var so in d.ObjectGroups.SelectMany(x => x.SubObjects))
            {
                if (so.ObjectInfoNumber >= d.Objects.Count)
                {
                    continue;
                }
                so.ObjectId = d.Objects[so.ObjectInfoNumber].TextureNumber;
            }

            ushort wallCount = s.UInt16("WallCount", (ushort)d.Walls.Count);

            s.List(nameof(d.Walls), d.Walls, wallCount, Wall.Serdes);
            s.Check();
            PerfTracker.StartupEvent("Finish loading labyrinth data");
            s.End();
            return(d);
        }
Example #2
0
        public static void Serialize(LabyrinthData d, ISerializer s, long length)
        {
            PerfTracker.StartupEvent("Start loading labyrinth data");
            var start = s.Offset;

            // s.ByteArray("UnknownBlock6C", () => sheet.UnknownBlock6C, x => sheet.UnknownBlock6C = x, 14);

            s.Dynamic(d, nameof(d.WallHeight));           // 0
            s.Dynamic(d, nameof(d.CameraHeight));         // 2
            s.Dynamic(d, nameof(d.Unk4));                 // 4

            s.UInt16(nameof(d.BackgroundId),
                     () => FormatUtil.Untweak((ushort?)d.BackgroundId),
                     x => d.BackgroundId = (DungeonBackgroundId?)FormatUtil.Tweak(x)); // 6

            s.Dynamic(d, nameof(d.BackgroundYPosition));                               // 8
            s.Dynamic(d, nameof(d.FogDistance));                                       // A
            s.Dynamic(d, nameof(d.FogRed));                                            // C
            s.Dynamic(d, nameof(d.FogGreen));                                          // E
            s.Dynamic(d, nameof(d.FogBlue));                                           // 10
            s.Dynamic(d, nameof(d.Unk12));                                             // 12
            s.Dynamic(d, nameof(d.Unk13));                                             // 13
            s.Dynamic(d, nameof(d.BackgroundColour));                                  // 14
            s.Dynamic(d, nameof(d.Unk15));                                             // 15
            s.Dynamic(d, nameof(d.FogMode));                                           // 16
            s.Dynamic(d, nameof(d.MaxLight));                                          // 18
            s.Dynamic(d, nameof(d.WallWidth));                                         // 1A
            s.Dynamic(d, nameof(d.BackgroundTileAmount));                              // 1C
            s.Dynamic(d, nameof(d.MaxVisibleTiles));                                   // 1E
            s.Dynamic(d, nameof(d.Unk20));                                             // 20
            s.Dynamic(d, nameof(d.Lighting));                                          // 22
            s.Dynamic(d, nameof(d.Unk24));                                             // 24
            s.Check();

            Debug.Assert(s.Offset - start <= length);

            ushort objectGroupCount = (ushort)d.ObjectGroups.Count; // 26

            s.UInt16("ObjectGroupCount", () => (ushort)d.ObjectGroups.Count, x => objectGroupCount = x);
            s.List(d.ObjectGroups, objectGroupCount, ObjectGroup.Serialize, () => new ObjectGroup());
            Debug.Assert(s.Offset - start <= length);

            var floorAndCeilingCount = (ushort)d.FloorAndCeilings.Count; // 28 + objectGroupCount * 42

            s.UInt16("FloorAndCeilingCount", () => floorAndCeilingCount, x => floorAndCeilingCount = x);
            s.List(d.FloorAndCeilings, floorAndCeilingCount, FloorAndCeiling.Serialize, () => new FloorAndCeiling());
            Debug.Assert(s.Offset - start <= length);

            ushort objectCount = (ushort)d.Objects.Count; // 2A + objectGroupCount * 42 + floorAndCeilingCount * A

            s.UInt16("ObjectCount", () => objectCount, x => objectCount = x);
            s.List(d.Objects, objectCount, Object.Serialize, () => new Object());
            Debug.Assert(s.Offset - start <= length);

            // Populate objectIds on subobjects to improve debugging experience
            foreach (var so in d.ObjectGroups.SelectMany(x => x.SubObjects))
            {
                if (so.ObjectInfoNumber >= d.Objects.Count)
                {
                    continue;
                }
                so.ObjectId = d.Objects[so.ObjectInfoNumber].TextureNumber;
            }

            ushort wallCount = (ushort)d.Walls.Count;

            s.UInt16("WallCount", () => wallCount, x => wallCount = x);
            s.List(d.Walls, wallCount, Wall.Serialize, () => new Wall());
            Debug.Assert(s.Offset - start <= length);
            PerfTracker.StartupEvent("Finish loading labyrinth data");
        }
Example #3
0
 public void Dispose()
 {
     PerfTracker.StartupEvent($"Finish asset test {_testNum}");
 }
Example #4
0
        static void Main(string[] args)
        {
            //TransformTests();
            _startupOnly  = args.Contains("--startuponly");
            _useRenderDoc = args.Contains("--renderdoc") || args.Contains("-rd");
            if (args.Contains("-gl") || args.Contains("--opengl"))
            {
                _backend = GraphicsBackend.OpenGL;
            }
            if (args.Contains("-gles") || args.Contains("--opengles"))
            {
                _backend = GraphicsBackend.OpenGLES;
            }
            if (args.Contains("-vk") || args.Contains("--vulkan"))
            {
                _backend = GraphicsBackend.Vulkan;
            }
            if (args.Contains("-metal") || args.Contains("--metal"))
            {
                _backend = GraphicsBackend.Metal;
            }
            if (args.Contains("-d3d") || args.Contains("--direct3d"))
            {
                _backend = GraphicsBackend.Direct3D11;
            }

            PerfTracker.StartupEvent("Entered main");
            //GraphTests();
            //return;
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // Required for code page 850 support in .NET Core
            PerfTracker.StartupEvent("Registered encodings");

            /*
             * Console.WriteLine("Entry point reached. Press enter to continue");
             * Console.ReadLine(); //*/

            var baseDir = FormatUtil.FindBasePath();

            if (baseDir == null)
            {
                throw new InvalidOperationException("No base directory could be found.");
            }

            PerfTracker.StartupEvent($"Found base directory {baseDir}");

            var logger   = new ConsoleLogger();
            var settings = new Settings {
                BasePath = baseDir
            };

            PerfTracker.StartupEvent("Registering asset manager");
            using var assets = new AssetManager();
            using var global = new EventExchange("Global", logger);
            Global           = global;

            Global
            // Need to register settings first, as the AssetConfigLocator relies on it.
            .Register <ISettings>(settings)
            .Register <IEngineSettings>(settings)
            .Register <IAssetManager>(assets)
            ;
            PerfTracker.StartupEvent("Registered asset manager");

            // Dump.CoreSprites(assets, baseDir);
            // Dump.CharacterSheets(assets);
            // Dump.Chests(assets);
            // Dump.ItemData(assets, baseDir);
            // Dump.MapEvents(assets, baseDir, MapDataId.Toronto2DGesamtkarteSpielbeginn);
            //return;

            RunGame(Global, baseDir);
        }
Example #5
0
        static void RunGame(EventExchange global, string baseDir)
        {
            PerfTracker.StartupEvent("Creating engine");
            using var engine = new Engine(_backend, _useRenderDoc)
                               .AddRenderer(new SpriteRenderer())
                               .AddRenderer(new ExtrudedTileMapRenderer())
                               .AddRenderer(new FullScreenQuad())
                               .AddRenderer(new DebugGuiRenderer())
                               .AddRenderer(new ScreenDuplicator())
            ;

            global
            .Register <IShaderCache>(new ShaderCache(
                                         Path.Combine(baseDir, "Core", "Visual"),
                                         Path.Combine(baseDir, "data", "ShaderCache")))
            .Attach(engine);

            var backgroundThreadInitTask = Task.Run(() =>
            {
                PerfTracker.StartupEvent("Creating main components");
                global
                .Register <IInputManager>(new InputManager()
                                          .RegisterInputMode(InputMode.ContextMenu, new ContextMenuInputMode())
                                          .RegisterInputMode(InputMode.World2D, new World2DInputMode())
                                          .RegisterMouseMode(MouseMode.DebugPick, new DebugPickMouseMode())
                                          .RegisterMouseMode(MouseMode.Exclusive, new ExclusiveMouseMode())
                                          .RegisterMouseMode(MouseMode.MouseLook, new MouseLookMouseMode())
                                          .RegisterMouseMode(MouseMode.Normal, new NormalMouseMode())
                                          )
                .Register <ILayoutManager>(new LayoutManager())
                .Register <IMapManager>(new MapManager())
                .Register <IPaletteManager>(new PaletteManager())
                .Register <ISceneManager>(new SceneManager()
                                          .AddScene(new AutomapScene())
                                          .AddScene(new FlatScene())
                                          .AddScene(new DungeonScene())
                                          .AddScene(new MenuScene())
                                          .AddScene(new InventoryScene())
                                          )
                .Register <IClock>(new GameClock())
                .Register <ISpriteResolver>(new SpriteResolver())
                .Register <IGameState>(new GameState())
                .Register <ITextManager>(new TextManager())
                .Register <ITextureManager>(new TextureManager())
                .Attach(new CursorManager())
                .Attach(new DebugMapInspector())
                .Attach(new InputBinder(InputConfig.Load(baseDir)))
                .Attach(new InputModeStack())
                .Attach(new MouseModeStack())
                .Attach(new SceneStack())
                .Attach(new StatusBar())
                ;

                PerfTracker.StartupEvent("Creating scene-specific components");
                var inventoryConfig = InventoryConfig.Load(baseDir);
                global.Resolve <ISceneManager>().GetExchange(SceneId.Inventory)
                .Attach(new InventoryScreen(inventoryConfig))
                ;

                var menuBackground = new ScreenSpaceSprite <PictureId>(
                    PictureId.MenuBackground8,
                    new Vector2(-1.0f, 1.0f),
                    new Vector2(2.0f, -2.0f));

                global.Resolve <ISceneManager>().GetExchange(SceneId.MainMenu)
                .Attach(new MainMenu())
                .Attach(menuBackground)
                ;

                PerfTracker.StartupEvent("Starting new game");
                //global.Raise(new LoadMapEvent(MapDataId.Jirinaar3D), null); /*

                /*
                 * global.Raise(new LoadMapEvent(MapDataId.AltesFormergebäude), null); /*
                 * global.Raise(new LoadMapEvent(MapDataId.HausDesJägerclans), null); //*/
                /*
                 * global.Raise(new SetSceneEvent(SceneId.Inventory), null);
                 * //*/

                //global.Raise(new SetSceneEvent((int)SceneId.MainMenu), null);
                global.Raise(new NewGameEvent(), null);
                ReflectionHelper.ClearTypeCache();
            });

            engine.Initialise();
            backgroundThreadInitTask.Wait();

            PerfTracker.StartupEvent("Running game");
            if (_startupOnly)
            {
                global.Raise(new QuitEvent(), null);
            }

            engine.Run();
        }
Example #6
0
        static void RegisterComponents(EventExchange global, IContainer services, string baseDir, CommandLineOptions commandLine)
        {
            PerfTracker.StartupEvent("Creating main components");
            var factory = global.Resolve <ICoreFactory>();

            global
            .Register <ICommonColors>(new CommonColors(factory))
            ;

            if (commandLine.AudioMode == AudioMode.InProcess)
            {
                services.Add(new AudioManager(false));
            }

            services
            .Add(new GameState())
            .Add(new GameClock())
            .Add(new IdleClock())
            .Add(new SlowClock())
            .Add(new DeviceObjectManager())
            .Add(new SpriteManager())
            .Add(new TextureManager())
            .Add(new VideoManager())
            .Add(new EventChainManager())
            .Add(new Querier())
            .Add(new MapManager())
            .Add(new CollisionManager())
            .Add(new SceneStack())
            .Add(new SceneManager()
                 .AddScene((Scene) new EmptyScene()
                           .Add(new StatusBar())
                           .Add(new PaletteManager()))

                 .AddScene((Scene) new AutomapScene()
                           .Add(new StatusBar())
                           .Add(new PaletteManager()))

                 .AddScene((Scene) new FlatScene()
                           .Add(new StatusBar())
                           .Add(new ConversationManager())
                           .Add(new PaletteManager())
                           .Add(new ClockWidget())
                           .Add(new MonsterEye()))

                 .AddScene((Scene) new DungeonScene()
                           .Add(new StatusBar())
                           .Add(new ConversationManager())
                           .Add(new PaletteManager())
                           .Add(new ClockWidget())
                           .Add(new Compass())
                           .Add(new MonsterEye()))

                 .AddScene((Scene) new MenuScene()
                           .Add(new StatusBar())
                           .Add(new PaletteManager())
                           .Add(new MainMenu())
                           .Add(new Sprite(
                                    (SpriteId)Base.Picture.MenuBackground8,
                                    new Vector3(-1.0f, 1.0f, 0),
                                    DrawLayer.Interface,
                                    SpriteKeyFlags.NoTransform,
                                    SpriteFlags.LeftAligned)
            {
                Size = new Vector2(2.0f, -2.0f)
            }))

                 .AddScene((Scene) new InventoryScene()
                           .Add(new StatusBar())
                           .Add(new ConversationManager())
                           .Add(new PaletteManager())
                           .Add(new InventoryInspector()))

                 .AddScene((Scene) new EditorScene()
                           .Add(new RawAssetManager())
                           .Add(new PaletteManager())
                           .Add(new EditorAssetManager())
                           .Add(new EditorUi()))
                 )

            .Add(new TextFormatter())
            .Add(new TextManager())
            .Add(new LayoutManager())
            .Add(new DialogManager())
            .Add(new InventoryScreenManager())
            .Add(new DebugMapInspector(services)
                 .AddBehaviour(new SpriteInstanceDataDebugBehaviour())
                 .AddBehaviour(new FormatTextEventBehaviour())
                 .AddBehaviour(new QueryEventDebugBehaviour()))
            .Add(new ContextMenu())
            .Add(new CursorManager())
            .Add(new InputManager()
                 .RegisterInputMode(InputMode.ContextMenu, new ContextMenuInputMode())
                 .RegisterInputMode(InputMode.World2D, new World2DInputMode())
                 .RegisterMouseMode(MouseMode.DebugPick, new DebugPickMouseMode())
                 .RegisterMouseMode(MouseMode.MouseLook, new MouseLookMouseMode())
                 .RegisterMouseMode(MouseMode.Normal, new NormalMouseMode())
                 .RegisterMouseMode(MouseMode.RightButtonHeld, new RightButtonHeldMouseMode())
                 .RegisterMouseMode(MouseMode.ContextMenu, new ContextMenuMouseMode()))
            .Add(new SelectionManager())
            .Add(new InputBinder(() => InputConfig.Load(baseDir)))
            .Add(new ItemTransitionManager())
            ;
        }
Example #7
0
        public static void RunGame(IEngine engine, EventExchange global, IContainer services, string baseDir, CommandLineOptions commandLine)
        {
#pragma warning disable CA2000 // Dispose objects before losing scopes
            services
            .Add(new ShaderCache(Path.Combine(baseDir, "data", "ShaderCache"))
                 .AddShaderPath(Path.Combine(baseDir, "src", "Core", "Visual", "Shaders"))    // TODO: Pull from mod config
                 .AddShaderPath(Path.Combine(baseDir, "src", "Game", "Visual", "Shaders")))
            .Add(engine);
#pragma warning restore CA2000 // Dispose objects before losing scopes

            RegisterComponents(global, services, baseDir, commandLine);

            if (commandLine.DebugMenus && engine is VeldridEngine ve)
            {
                services.Add(new DebugMenus(ve));
            }

            if (commandLine.StartupOnly)
            {
                global.Raise(new QuitEvent(), null);
            }

            PerfTracker.StartupEvent("Running game");
            global.Raise(new SetSceneEvent(SceneId.Empty), null);
            switch (commandLine.GameMode)
            {
            case GameMode.MainMenu:
                global.Raise(new SetSceneEvent(SceneId.MainMenu), null);
                break;

            case GameMode.NewGame:
                global.Raise(new NewGameEvent(Base.Map.TorontoBegin, 30, 75), null);
                break;

            case GameMode.LoadGame:
                global.Raise(new LoadGameEvent(ushort.Parse(commandLine.GameModeArgument, CultureInfo.InvariantCulture)), null);
                break;

            case GameMode.LoadMap:
                global.Raise(new NewGameEvent((Base.Map) int.Parse(commandLine.GameModeArgument, CultureInfo.InvariantCulture), 40, 40), null);
                break;

            case GameMode.Inventory:
                global.Raise(new SetSceneEvent(SceneId.Inventory), null);
                break;

            default:
                throw new ArgumentOutOfRangeException($"Unexpected game mode \"{commandLine.GameMode}\"");
            }

            if (commandLine.Commands != null)
            {
                foreach (var command in commandLine.Commands)
                {
                    global.Raise(Event.Parse(command), null);
                }
            }

            engine.Run();
            // TODO: Ensure all sprite leases returned etc to weed out memory leaks
        }
Example #8
0
        static void Main(string[] args)
        {
            PerfTracker.StartupEvent("Entered main");
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // Required for code page 850 support in .NET Core
            PerfTracker.StartupEvent("Registered encodings");

            var commandLine = new CommandLineOptions(args);

            if (commandLine.Mode == ExecutionMode.Exit)
            {
                return;
            }

            var baseDir = FormatUtil.FindBasePath();

            if (baseDir == null)
            {
                throw new InvalidOperationException("No base directory could be found.");
            }

            PerfTracker.StartupEvent($"Found base directory {baseDir}");
            PerfTracker.StartupEvent("Registering asset manager");
            var factory = new VeldridCoreFactory();

            using var locatorRegistry = new AssetLocatorRegistry()
                                        .AddAssetLocator(new StandardAssetLocator())
                                        .AddAssetLocator(new AssetConfigLocator())
                                        .AddAssetLocator(new CoreSpriteLocator())
                                        .AddAssetLocator(new MetaFontLocator(factory))
                                        .AddAssetLocator(new NewStringLocator())
                                        .AddAssetLocator(new SoundBankLocator())
                                        .AddAssetLocator(new SavedGameLocator())
                                        .AddAssetPostProcessor(new AlbionSpritePostProcessor())
                                        .AddAssetPostProcessor(new ImageSharpPostProcessor())
                                        .AddAssetPostProcessor(new InterlacedBitmapPostProcessor())
                                        .AddAssetPostProcessor(new InventoryPostProcessor())
            ;

            var assets   = new AssetManager();
            var services = new Container("Services",
                                         new StdioConsoleLogger(),
                                         new ClipboardManager(),
                                         new ImGuiConsoleLogger(),
                                         Settings.Load(baseDir), // Need to register settings first, as the AssetConfigLocator relies on it.
                                         locatorRegistry,
                                         assets);

            using var exchange = new EventExchange(new LogExchange())
                                 .Register <ICoreFactory>(factory)
                                 .Attach(services);

            Engine.GlobalExchange = exchange;

            PerfTracker.StartupEvent("Registered asset manager");
            PerfTracker.StartupEvent($"Running as {commandLine.Mode}");

            switch (commandLine.Mode)
            {
            case ExecutionMode.Game:
            case ExecutionMode.GameWithSlavedAudio:
                Albion.RunGame(exchange, services, baseDir, commandLine);
                break;

            case ExecutionMode.AudioSlave:
                exchange.Attach(new AudioManager(true));
                break;

            case ExecutionMode.Editor: break;     // TODO

            case ExecutionMode.SavedGameTests: SavedGameTests.RoundTripTest(baseDir); break;

            case ExecutionMode.DumpData:
                PerfTracker.BeginFrame();     // Don't need to show verbose startup logging while dumping
                var tf = new TextFormatter();
                exchange.Attach(tf);
                DumpType dumpTypes = DumpType.All;
                if (commandLine.GameModeArgument != null)
                {
                    dumpTypes = 0;
                    foreach (var t in commandLine.GameModeArgument.Split(' ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        dumpTypes |= Enum.Parse <DumpType>(t);
                    }
                }

                if ((dumpTypes & DumpType.Characters) != 0)
                {
                    Dump.CharacterSheets(assets, tf, baseDir);
                }
                if ((dumpTypes & DumpType.Chests) != 0)
                {
                    Dump.Chests(assets, baseDir);
                }
                if ((dumpTypes & DumpType.CoreSprites) != 0)
                {
                    Dump.CoreSprites(assets, baseDir);
                }
                if ((dumpTypes & DumpType.EventSets) != 0)
                {
                    Dump.EventSets(assets, baseDir);
                }
                if ((dumpTypes & DumpType.Items) != 0)
                {
                    Dump.ItemData(assets, baseDir);
                }
                if ((dumpTypes & DumpType.MapEvents) != 0)
                {
                    Dump.MapEvents(assets, baseDir);
                }
                if ((dumpTypes & DumpType.Maps) != 0)
                {
                    Dump.MapData(assets, tf, baseDir);
                }
                if ((dumpTypes & DumpType.Spells) != 0)
                {
                    Dump.Spells(assets, tf, baseDir);
                }
                if ((dumpTypes & DumpType.ThreeDMaps) != 0)
                {
                    Dump.ThreeDMapAndLabInfo(assets, baseDir);
                }
                if ((dumpTypes & DumpType.MonsterGroups) != 0)
                {
                    Dump.MonsterGroups(assets, baseDir);
                }
                break;

            case ExecutionMode.Exit: break;
            }
        }