Пример #1
0
        public override void Construct()
        {
            MaxLabel = AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockBottom,
                MinimumSize         = new Point(0, 30),
                TextSize            = GameSettings.Default.ConsoleTextSize,
                Font                = "monofont",
                TextHorizontalAlign = HorizontalAlign.Left
            });

            MinLabel = AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockTop,
                MinimumSize         = new Point(0, 30),
                TextSize            = GameSettings.Default.ConsoleTextSize,
                Font                = "monofont",
                TextHorizontalAlign = HorizontalAlign.Left
            });

            GraphBox = AddChild(new Widget
            {
                AutoLayout = AutoLayout.DockFill,
                Hidden     = true
            });
        }
Пример #2
0
        public override void OnEnter()
        {
            // Clear the input queue... cause other states aren't using it and it's been filling up.
            DwarfGame.GumInputMapper.GetInputQueue();

            GuiRoot = new Gui.Root(DwarfGame.GuiSkin);
            GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0);
            var rect = GuiRoot.RenderData.VirtualScreen;

            mainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect           = rect,
                MinimumSize    = new Point(3 * GuiRoot.RenderData.VirtualScreen.Width / 4, 3 * GuiRoot.RenderData.VirtualScreen.Height / 4),
                AutoLayout     = AutoLayout.FloatCenter,
                Border         = "border-fancy",
                Padding        = new Margin(4, 4, 4, 4),
                InteriorMargin = new Margin(2, 0, 0, 0),
                TextSize       = 1,
                Font           = "font10"
            });
            Reset();

            IsInitialized = true;

            base.OnEnter();
        }
Пример #3
0
        private void AddSelector(Gui.Widget Panel, String LayerType)
        {
            var panel = Panel.AddChild(new Widget
            {
                MinimumSize = new Point(0, 44),
                AutoLayout  = AutoLayout.DockTop,
                Padding     = new Margin(2, 2, 2, 2)
            });

            panel.AddChild(new Widget
            {
                Text                = LayerType,
                MinimumSize         = new Point(64, 0),
                AutoLayout          = AutoLayout.DockLeft,
                TextVerticalAlign   = VerticalAlign.Center,
                TextHorizontalAlign = HorizontalAlign.Center,
            });

            var layerCombo = panel.AddChild(new Gui.Widgets.ComboBox
            {
                Items               = LayeredSprites.LayerLibrary.EnumerateLayers(LayerType).Select(l => l.Asset).ToList(),
                Border              = "border-thin",
                AutoLayout          = AutoLayout.DockTop,
                ItemsVisibleInPopup = 12,
            }) as Gui.Widgets.ComboBox;

            var paletteCombo = panel.AddChild(new Gui.Widgets.ComboBox
            {
                Items               = new string[] { "base palette" }.Concat(LayeredSprites.LayerLibrary.EnumeratePalettes().Select(p => p.Asset)).ToList(),
                Border              = "border-thin",
                AutoLayout          = AutoLayout.DockTop,
                ItemsVisibleInPopup = 12,
            }) as Gui.Widgets.ComboBox;

            layerCombo.SelectedIndex   = 0;
            paletteCombo.SelectedIndex = 0;

            layerCombo.OnSelectedIndexChanged = (sender) =>
            {
                var layer   = (panel.Children[1] as Gui.Widgets.ComboBox).SelectedItem;
                var palette = (panel.Children[2] as Gui.Widgets.ComboBox).SelectedItem;

                SpriteFrame.Sprite.AddLayer(GetLayer(LayerType, layer), GetPalette(palette));
            };

            paletteCombo.OnSelectedIndexChanged = (sender) =>
            {
                var layer   = (panel.Children[1] as Gui.Widgets.ComboBox).SelectedItem;
                var palette = (panel.Children[2] as Gui.Widgets.ComboBox).SelectedItem;

                SpriteFrame.Sprite.AddLayer(GetLayer(LayerType, layer), GetPalette(palette));
            };

            layerCombo.SelectedIndex   = 0;
            paletteCombo.SelectedIndex = 0;
        }
Пример #4
0
        public override void Construct()
        {
            Padding = new Margin(2, 2, 2, 2);

            base.Construct();

            var bar = AddChild(new Widget
            {
                MinimumSize = new Point(0, 24),
                Padding     = new Margin(0, 0, 2, 2),
                AutoLayout  = AutoLayout.DockTop
            });

            bar.AddChild(new Widget
            {
                Text       = "Filter:",
                AutoLayout = AutoLayout.DockLeft
            });

            FilterBox = bar.AddChild(new Gui.Widgets.EditableTextField
            {
                AutoLayout   = AutoLayout.DockFill,
                MinimumSize  = new Point(0, 24),
                OnTextChange = (sender) => { Grid.ApplyFilter(FilterBox.Text); }
            }) as Gui.Widgets.EditableTextField;

            SelectedCommandDisplay = AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockBottom,
                MinimumSize = new Point(0, 200)
            });

            Grid = AddChild(new CommandGrid
            {
                AutoLayout       = AutoLayout.DockFill,
                World            = World,
                OnCommandClicked = (command) =>
                {
                    SelectedCommandDisplay.Children.Clear();
                    if (command.HoverWidget != null)
                    {
                        SelectedCommandDisplay.AddChild(command.HoverWidget);
                        command.HoverWidget.AutoLayout = AutoLayout.DockFill;
                        command.HoverWidget.Border     = "";
                    }

                    SelectedCommandDisplay.Layout();

                    command.OnClick?.Invoke(command, null);
                }
            }) as CommandGrid;
        }
Пример #5
0
    private static bool Overlap(Gui.Widget w1, Gui.Widget w2)
    {
        if (w1.left > w2.left + w2.width || w2.left > w1.left + w1.width)
        {
            return(false);
        }
        if (w1.top > w2.top + w2.height || w2.top > w1.top + w1.height)
        {
            return(false);
        }

        return(true);
    }
Пример #6
0
 private void MakeMenuItem(Gui.Widget Menu, string Name, string Tooltip, Action <Gui.Widget, Gui.InputEventArgs> OnClick)
 {
     Menu.AddChild(new Gui.Widget
     {
         AutoLayout          = Gui.AutoLayout.DockTop,
         Border              = "border-thin",
         Text                = Name,
         OnClick             = OnClick,
         Tooltip             = Tooltip,
         TextHorizontalAlign = Gui.HorizontalAlign.Center,
         TextVerticalAlign   = Gui.VerticalAlign.Center
     });
 }
Пример #7
0
        public override void Construct()
        {
            MaxLabel = AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockBottom,
                MinimumSize         = new Point(0, 30),
                TextSize            = GameSettings.Current.ConsoleTextSize,
                Font                = "monofont",
                TextHorizontalAlign = HorizontalAlign.Left
            });

            MinLabel = AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockTop,
                MinimumSize         = new Point(0, 30),
                TextSize            = GameSettings.Current.ConsoleTextSize,
                Font                = "monofont",
                TextHorizontalAlign = HorizontalAlign.Left
            });

            GraphBox = AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockFill,
                Transparent = true
            });

            XLabelMinWidget = GraphBox.AddChild(new Widget()
            {
                Font                = "monofont",
                TextColor           = Color.Black.ToVector4(),
                AutoLayout          = AutoLayout.FloatBottomLeft,
                MinimumSize         = new Point(128, 32),
                Text                = XLabelMin,
                TextHorizontalAlign = HorizontalAlign.Left,
                TextVerticalAlign   = VerticalAlign.Below
            });

            XLabelMaxWidget = GraphBox.AddChild(new Widget()
            {
                Font                = "monofont",
                TextColor           = Color.Black.ToVector4(),
                AutoLayout          = AutoLayout.FloatBottomRight,
                MinimumSize         = new Point(128, 32),
                Text                = XLabelMin,
                TextHorizontalAlign = HorizontalAlign.Right,
                TextVerticalAlign   = VerticalAlign.Below
            });
            GraphBox.Layout();
            Layout();
        }
Пример #8
0
        public override void OnEnter()
        {
            TutorialManager          = new Tutorial.TutorialManager();
            IsInitialized            = true;
            DwarfTime.LastTime.Speed = 1.0f;

            IndicatorManager.SetupStandards();

            DwarfGame.GumInputMapper.GetInputQueue();
            GuiRoot = new Gui.Root(DwarfGame.GuiSkin);

            Tip = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Font                = "font10",
                TextColor           = new Vector4(1, 1, 1, 1),
                MinimumSize         = new Point(0, 64),
                TextHorizontalAlign = Gui.HorizontalAlign.Center,
                TextVerticalAlign   = Gui.VerticalAlign.Center,
                Text                = "Press any key to jump!",
                AutoLayout          = Gui.AutoLayout.DockBottom,
                Background          = new Gui.TileReference("basic", 0),
                BackgroundColor     = new Vector4(0, 0, 0, 0.5f),
                InteriorMargin      = new Gui.Margin(0, 0, 15, 15)
            });

            LoadTicker = GuiRoot.RootItem.AddChild(new Gui.Widgets.InfoTicker
            {
                Font       = "font8",
                AutoLayout = Gui.AutoLayout.DockFill,
                TextColor  = new Vector4(1, 1, 1, 1)
            }) as Gui.Widgets.InfoTicker;

            GuiRoot.RootItem.Layout();

            if (Settings.GenerateFromScratch)
            {
                Generator = new WorldGenerator(Settings)
                {
                    Seed = MathFunctions.Random.Next()
                };
                Generator.Generate();
            }
            else
            {
                CreateWorld();
            }

            base.OnEnter();
        }
Пример #9
0
 private void MakeMenuItem(Gui.Widget Menu, string Name, string Tooltip, Action <Gui.Widget, Gui.InputEventArgs> OnClick)
 {
     Menu.AddChild(new Gui.Widgets.Button
     {
         AutoLayout          = Gui.AutoLayout.DockTop,
         Text                = Name,
         Border              = "none",
         OnClick             = OnClick,
         Tooltip             = Tooltip,
         TextHorizontalAlign = Gui.HorizontalAlign.Center,
         TextVerticalAlign   = Gui.VerticalAlign.Center,
         Font                = "font18-outline",
         TextColor           = Color.White.ToVector4(),
         HoverTextColor      = Color.Red.ToVector4()
     });
 }
Пример #10
0
 private void MakeMenuItem(Gui.Widget Menu, string Name, string Tooltip, Action <Gui.Widget, Gui.InputEventArgs> OnClick)
 {
     Menu.AddChild(new Gui.Widgets.Button
     {
         AutoLayout          = Gui.AutoLayout.DockTop,
         Text                = Name,
         Border              = "none",
         OnClick             = OnClick,
         Tooltip             = Tooltip,
         TextHorizontalAlign = Gui.HorizontalAlign.Center,
         TextVerticalAlign   = Gui.VerticalAlign.Center,
         Font                = GameSettings.Default.GuiScale == 1 ? "font18-outline" : "font10",
         TextColor           = Color.White.ToVector4(),
         HoverTextColor      = GameSettings.Default.Colors.GetColor("Highlight", Color.DarkRed).ToVector4()
     });
 }
Пример #11
0
 protected Gui.Widget CreateMenuItem(Gui.Widget Menu, string Name, string Tooltip, Action <Gui.Widget, Gui.InputEventArgs> OnClick)
 {
     return(Menu.AddChild(new Gui.Widgets.Button
     {
         AutoLayout = Gui.AutoLayout.DockTop,
         Text = Name,
         Border = "none",
         OnClick = OnClick,
         Tooltip = Tooltip,
         TextHorizontalAlign = Gui.HorizontalAlign.Center,
         TextVerticalAlign = Gui.VerticalAlign.Center,
         Font = "font18-outline",
         TextColor = Color.White.ToVector4(),
         HoverTextColor = GameSettings.Current.Colors.GetColor("Highlight", Color.DarkRed).ToVector4()
     }));
 }
Пример #12
0
        public override void Construct()
        {
            Border = "border-thin";

            var topBar = AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockTop,
                MinimumSize = new Point(0, 30)
            });

            var KeyPanel = AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockLeft,
                MinimumSize = new Point(64, 0)
            });

            MaxLabel = KeyPanel.AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockTop,
                MinimumSize         = new Point(0, 30),
                TextHorizontalAlign = HorizontalAlign.Right
            });

            MinLabel = KeyPanel.AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockBottom,
                MinimumSize         = new Point(0, 30),
                TextHorizontalAlign = HorizontalAlign.Right
            });

            MidLabel = KeyPanel.AddChild(new Widget
            {
                AutoLayout          = AutoLayout.DockFill,
                MinimumSize         = new Point(0, 30),
                TextHorizontalAlign = HorizontalAlign.Right,
                TextVerticalAlign   = VerticalAlign.Center
            });



            GraphBox = AddChild(new Widget
            {
                AutoLayout = AutoLayout.DockFill,
                Border     = "border-thin",
                Hidden     = true
            });
        }
Пример #13
0
 private bool Inside(Gui.Widget that)
 {
     if (that.left < 0)
     {
         return(false);
     }
     if (that.left + that.width > this.width)
     {
         return(false);
     }
     if (that.top < 0)
     {
         return(false);
     }
     if (that.top + that.height > this.height)
     {
         return(false);
     }
     return(true);
 }
Пример #14
0
        private Gui.Widget CreateTrayIcon(int Tile, Gui.Widget Child)
        {
            var r = new Gui.Widgets.FramedIcon
            {
                Icon    = new Gui.TileReference("tool-icons", Tile),
                OnClick = (sender, args) =>
                {
                },
                OnHover = (sender) =>
                {
                    foreach (var child in sender.Parent.EnumerateChildren().Where(c => c is Gui.Widgets.FramedIcon)
                             .SelectMany(c => c.EnumerateChildren()))
                    {
                        child.Hidden = true;
                        child.Invalidate();
                    }

                    if (Child != null)
                    {
                        Child.Hidden = false;
                        Child.Invalidate();
                    }
                },
                OnLayout = (sender) =>
                {
                    if (Child != null)
                    {
                        var midPoint = sender.Rect.X + (sender.Rect.Width / 2);
                        Child.Rect.X = midPoint - (Child.Rect.Width / 2);
                        Child.Rect.Y = sender.Rect.Y - 60;
                    }
                }
            };

            GuiRoot.ConstructWidget(r);
            if (Child != null)
            {
                r.AddChild(Child);
            }
            return(r);
        }
Пример #15
0
        private void SwitchToLaunchPanel()
        {
            if (PanelState != PanelStates.Generate)
            {
                return;
            }

            PanelState = PanelStates.Launch;

            var rect   = RightPanel.Rect;
            var parent = RightPanel.Parent;

            RightPanel.Close();

            RightPanel = parent.AddChild(new LaunchPanel(Game, Generator, Settings, this)
            {
                Rect = rect
            });

            RightPanel.Layout();
        }
Пример #16
0
        public override void Construct()
        {
            TextColor   = new Vector4(0, 0, 0, 1);
            MinimumSize = new Point(96, 32);
            Padding     = new Gui.Margin(2, 2, 4, 4);
            Font        = "font10";

            TimeLabel = AddChild(new Gui.Widget
            {
                AutoLayout        = Gui.AutoLayout.DockLeft,
                MinimumSize       = new Point(16, 0),
                Text              = "1x",
                Tooltip           = "Current Game Speed",
                TextVerticalAlign = Gui.VerticalAlign.Center,
                TextColor         = new Vector4(1, 1, 1, 1)
            });

            SlowButton = AddChild(new Widget()
            {
                AutoLayout         = Gui.AutoLayout.DockLeft,
                Text               = "<<",
                TextColor          = Color.White.ToVector4(),
                Tooltip            = "Decrease Speed",
                HoverTextColor     = GameSettings.Current.Colors.GetColor("Highlight", Color.DarkRed).ToVector4(),
                ChangeColorOnHover = true,
                OnClick            = (sender, args) =>
                {
                    CurrentSpeed -= 1;
                },
                TextVerticalAlign = Gui.VerticalAlign.Center
            });


            PlayPauseButton = AddChild(new Widget()
            {
                AutoLayout         = Gui.AutoLayout.DockLeft,
                TextColor          = Color.White.ToVector4(),
                Text               = "||",
                Tooltip            = "Pause",
                HoverTextColor     = GameSettings.Current.Colors.GetColor("Highlight", Color.DarkRed).ToVector4(),
                ChangeColorOnHover = true,
                OnClick            = (sender, args) =>
                {
                    if (CurrentSpeed == 0)
                    {
                        if (PlaySpeed == 0)
                        {
                            PlaySpeed = 1;
                        }
                        CurrentSpeed = PlaySpeed;
                    }
                    else
                    {
                        PlaySpeed    = CurrentSpeed;
                        CurrentSpeed = 0;
                    }
                },
                TextVerticalAlign = Gui.VerticalAlign.Center
            });

            FastButton = AddChild(new Widget()
            {
                AutoLayout         = Gui.AutoLayout.DockLeft,
                Text               = ">>",
                TextColor          = Color.White.ToVector4(),
                Tooltip            = "Increase Speed",
                HoverTextColor     = GameSettings.Current.Colors.GetColor("Highlight", Color.DarkRed).ToVector4(),
                ChangeColorOnHover = true,
                OnClick            = (sender, args) =>
                {
                    CurrentSpeed += 1;
                },
                TextVerticalAlign = Gui.VerticalAlign.Center
            });


            base.Construct();
        }
Пример #17
0
        public override void OnEnter()
        {
            if (ItemSource != null)
            {
                foreach (var path in ItemSource())
                {
                    var meta = path.GetFiles("meta.txt");

                    Items.Add(new ChooserItem
                    {
                        Name  = GetItemName(path.FullName),
                        Path  = path.FullName,
                        Valid = ValidateItem == null ? "" : ValidateItem(path.FullName),
                        Age   = meta.Length > 0 ? DateTime.Now - meta[0].LastWriteTime : DateTime.Now - path.LastWriteTime
                    });
                }
            }

            foreach (var item in Items)
            {
                item.Screenshot = ScreenshotSource(item.Path);
            }

            DwarfGame.GumInputMapper.GetInputQueue();

            GuiRoot = new Gui.Root(DwarfGame.GuiSkin);
            GuiRoot.MousePointer            = new Gui.MousePointer("mouse", 4, 0);
            GuiRoot.RootItem.Transparent    = false;
            GuiRoot.RootItem.InteriorMargin = new Gui.Margin(16, 16, 32, 32);

            BottomBar = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                AutoLayout          = Gui.AutoLayout.DockBottom,
                MinimumSize         = new Point(0, 60),
                TextHorizontalAlign = Gui.HorizontalAlign.Center,
                TextVerticalAlign   = Gui.VerticalAlign.Center,
                Background          = new Gui.TileReference("basic", 0),
                Font           = "font10",
                InteriorMargin = new Gui.Margin(10, 10, 10, 10)
            });

            if (Items.Count == 0)
            {
                BottomBar.Text = NoItemsText;
            }


            BottomBar.AddChild(new Gui.Widgets.Button
            {
                AutoLayout = Gui.AutoLayout.FloatBottomLeft,
                Border     = "border-button",
                Text       = "< Back",
                Tooltip    = "Back to the main screen",
                OnClick    = (sender, args) =>
                {
                    GameStateManager.PopState();
                }
            });

            Grid = GuiRoot.RootItem.AddChild(new Gui.Widgets.WidgetListView
            {
                AutoLayout                  = Gui.AutoLayout.DockFill,
                Border                      = "border-one",
                Font                        = "font10",
                InteriorMargin              = new Gui.Margin(32, 0, 0, 0),
                TextHorizontalAlign         = HorizontalAlign.Center,
                TextVerticalAlign           = VerticalAlign.Top,
                SelectedItemBackgroundColor = Color.LightBlue.ToVector4(),
                SelectedItemForegroundColor = Color.Black.ToVector4()
            }) as Gui.Widgets.WidgetListView;

            GuiRoot.RootItem.Layout();

            GuiRoot.RootItem.Layout();

            // Must be true or Render will not be called.
            IsInitialized = true;

            base.OnEnter();
        }
Пример #18
0
 /// <summary>
 /// Called to create a custom GUI for the goal.
 /// </summary>
 /// <param name="Widget"></param>
 public virtual void CreateGUI(Gui.Widget Widget)
 {
     Widget.Text = Description;
 }
Пример #19
0
        public override void Construct()
        {
            PreviewPanel = AddChild(new Gui.Widget
            {
                AutoLayout = Gui.AutoLayout.DockFill,
                OnLayout   = (sender) =>
                {
                    Camera.Rect = sender.Rect;
                },
                OnClick = (sender, args) =>
                {
                    if (Generator.CurrentState != OverworldGenerator.GenerationState.Finished)
                    {
                        return;
                    }

                    if (args.MouseButton == 0)
                    {
                        var clickPoint = Camera.ScreenToWorld(new Vector2(args.X, args.Y));

                        var colonyCell = Overworld.ColonyCells.GetCellAt(clickPoint.X, clickPoint.Y);
                        if (colonyCell != null)
                        {
                            Overworld.InstanceSettings.Cell = colonyCell;
                            previewText = Generator.GetSpawnStats();
                            Camera.SetGoalFocus(new Vector3((float)colonyCell.Bounds.Center.X / (float)Overworld.Width, 0, (float)colonyCell.Bounds.Center.Y / (float)Overworld.Height));
                        }

                        UpdatePreview = true;


                        OnCellSelectionMade?.Invoke();
                    }
                },
                OnMouseMove = (sender, args) =>
                {
                    if (Generator.CurrentState != OverworldGenerator.GenerationState.Finished)
                    {
                        return;
                    }
                    Camera.OnMouseMove(args);
                },
                OnScroll = (sender, args) =>
                {
                    if (Generator.CurrentState != OverworldGenerator.GenerationState.Finished)
                    {
                        return;
                    }

                    Camera.OnScroll(args);
                }
            });

            OnClose += (sender) =>
            {
                Mesh.Dispose();
                TerrainTexture.Dispose();
                PreviewTexture.Dispose();
            };

            Camera.Overworld = Overworld;
        }
Пример #20
0
        public override void Construct()
        {
            Padding = new Margin(2, 2, 0, 0);

            StartButton = AddChild(new Gui.Widget
            {
                Text               = "Start Game",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockBottom,
                OnClick            = (sender, args) =>
                {
                    var saveName = DwarfGame.GetWorldDirectory() + Path.DirectorySeparatorChar + Settings.Name + Path.DirectorySeparatorChar + String.Format("{0}-{1}", (int)Settings.InstanceSettings.Origin.X, (int)Settings.InstanceSettings.Origin.Y);
                    var saveGame = SaveGame.LoadMetaFromDirectory(saveName);
                    if (saveGame != null)
                    {
                        DwarfGame.LogSentryBreadcrumb("WorldGenerator", "User is loading a saved game.");
                        Settings.InstanceSettings.ExistingFile = saveName;
                        Settings.InstanceSettings.LoadType     = LoadType.LoadFromFile;

                        GameStateManager.ClearState();
                        GameStateManager.PushState(new LoadState(Game, Settings, LoadTypes.UseExistingOverworld));
                    }
                    else
                    {
                        DwarfGame.LogSentryBreadcrumb("WorldGenerator", string.Format("User is starting a game with a {0} x {1} world.", Settings.Width, Settings.Height));
                        Settings.InstanceSettings.ExistingFile = null;
                        Settings.InstanceSettings.LoadType     = LoadType.CreateNew;

                        var message = "";
                        var valid   = InstanceSettings.ValidateEmbarkment(Settings, out message);
                        if (valid == InstanceSettings.ValidationResult.Pass)
                        {
                            LaunchNewGame();
                        }
                        else if (valid == InstanceSettings.ValidationResult.Query)
                        {
                            var popup = new Gui.Widgets.Confirm()
                            {
                                Text    = message,
                                OnClose = (_sender) =>
                                {
                                    if ((_sender as Gui.Widgets.Confirm).DialogResult == Gui.Widgets.Confirm.Result.OKAY)
                                    {
                                        LaunchNewGame();
                                    }
                                }
                            };
                            Root.ShowModalPopup(popup);
                        }
                        else if (valid == InstanceSettings.ValidationResult.Reject)
                        {
                            var popup = new Gui.Widgets.Confirm()
                            {
                                Text       = message,
                                CancelText = ""
                            };
                            Root.ShowModalPopup(popup);
                        }
                    }
                }
            });

            CellInfo = AddChild(new Widget
            {
                AutoLayout = AutoLayout.DockFill,
                TextColor  = new Vector4(0, 0, 0, 1),
                Font       = "font10"
            });

            ZoomedPreview = AddChild(new Gui.Widget
            {
                AutoLayout = Gui.AutoLayout.DockBottom,
                OnLayout   = (sender) =>
                {
                    sender.Rect.Height = StartButton.Rect.Width;
                    sender.Rect.Width  = StartButton.Rect.Width;
                    sender.Rect.Y      = StartButton.Rect.Top - StartButton.Rect.Width - 2;
                    sender.Rect.X      = StartButton.Rect.X;
                }
            });

            UpdateCellInfo();
            this.Layout();

            base.Construct();
        }
Пример #21
0
        public override void OnEnter()
        {
            if (SuppressEnter)
            {
                SuppressEnter = false;
                return;
            }

            DwarfGame.GumInputMapper.GetInputQueue();

            #region Setup GUI
            GuiRoot = new Gui.Root(DwarfGame.GuiSkin);
            GuiRoot.MousePointer = new MousePointer("mouse", 15.0f, 16, 17, 18, 19, 20, 21, 22, 23);

            MainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect           = GuiRoot.RenderData.VirtualScreen,
                Border         = "border-fancy",
                Text           = Settings.Name,
                Font           = "font16",
                TextColor      = new Vector4(0, 0, 0, 1),
                Padding        = new Margin(4, 4, 4, 4),
                InteriorMargin = new Margin(24, 0, 0, 0)
            });

            var rightPanel = MainPanel.AddChild(new Widget
            {
                MinimumSize = new Point(256, 0),
                Padding     = new Margin(2, 2, 2, 2),
                AutoLayout  = AutoLayout.DockRight
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Back",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockTop,
                OnClick            = (sender, args) =>
                {
                    GameStateManager.PopState();
                }
            });

            rightPanel.AddChild(new Widget
            {
                Text               = "Factions",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = AutoLayout.DockTop,
                OnClick            = (sender, args) =>
                {
                    SuppressEnter = true;
                    GameStateManager.PushState(new FactionViewState(GameState.Game, Settings));
                }
            });

            switch (PanelState)
            {
            case PanelStates.Generate:
                RightPanel = rightPanel.AddChild(new GenerationPanel(Game, Settings)
                {
                    RestartGeneration = () => RestartGeneration(),
                    GetGenerator      = () => Generator,
                    OnVerified        = () =>
                    {
                        SwitchToLaunchPanel();
                    },
                    AutoLayout = Gui.AutoLayout.DockFill,
                });
                break;

            case PanelStates.Launch:
                RightPanel = rightPanel.AddChild(new LaunchPanel(Game, Generator, Settings, this)
                {
                    AutoLayout = AutoLayout.DockFill,
                });

                break;
            }

            GenerationProgress = MainPanel.AddChild(new Gui.Widgets.ProgressBar
            {
                AutoLayout          = Gui.AutoLayout.DockBottom,
                TextHorizontalAlign = Gui.HorizontalAlign.Center,
                TextVerticalAlign   = Gui.VerticalAlign.Center,
                Font      = "font10",
                TextColor = new Vector4(1, 1, 1, 1)
            }) as Gui.Widgets.ProgressBar;

            PoliticsToggle = MainPanel.AddChild(new Gui.Widgets.CheckBox
            {
                Text     = "Show Political Boundaries",
                Hidden   = true,
                OnLayout = (sender) =>
                {
                    sender.Rect = GenerationProgress.Rect;
                },
                OnCheckStateChange = (sender) =>
                {
                    Preview.ShowPolitics = (sender as Gui.Widgets.CheckBox).CheckState;
                }
            }) as Gui.Widgets.CheckBox;

            Preview = MainPanel.AddChild(new WorldGeneratorPreview(Game.GraphicsDevice)
            {
                Border     = "border-thin",
                AutoLayout = Gui.AutoLayout.DockFill,
                Overworld  = Settings,
                Hidden     = true,
                OnLayout   = (sender) =>
                {
                    //sender.Rect = new Rectangle(sender.Rect.X, sender.Rect.Y, sender.Rect.Width, GenerationProgress.Rect.Bottom - sender.Rect.Y);
                },
                OnCellSelectionMade = () =>
                {
                    if (RightPanel is LaunchPanel launch)
                    {
                        launch.UpdateCellInfo();
                    }
                }
            }) as WorldGeneratorPreview;
Пример #22
0
        public override void Construct()
        {
            base.Construct();

            SubscribedItems = Steam.GetSubscribedMods();

            this.Padding = new Margin(4, 4, 4, 4);
            this.Font    = "font10";

            var top = AddChild(new Widget
            {
                Transparent = true,
                MinimumSize = new Point(0, 32),
                AutoLayout  = AutoLayout.DockTop,
                Padding     = new Margin(2, 2, 2, 2)
            });

            var searchText = top.AddChild(new Gui.Widgets.EditableTextField
            {
                PromptText  = "Enter text to search for",
                AutoLayout  = AutoLayout.DockLeft,
                MinimumSize = new Point(256, 0),
            }) as Gui.Widgets.EditableTextField;

            var button = top.AddChild(new Gui.Widgets.Button
            {
                Text = "Search",
                Font = "font10",
                TextHorizontalAlign = HorizontalAlign.Center,
                TextVerticalAlign   = VerticalAlign.Center,
                Border  = "border-button",
                OnClick = (sender, args) =>
                {
                    if (!Steam.SteamAvailable)
                    {
                        List.ClearItems();
                        List.AddItem(new Widget()
                        {
                            Text       = "Error: Can't connect to steam!",
                            Background = new TileReference("basic", 0),
                            TextColor  = new Vector4(0, 0, 0, 1),
                        });
                        return;
                    }

                    if (!Steam.HasTransactionOfType <UGCQuery>())
                    {
                        Steam.AddTransaction(new UGCTransactionProcessor
                        {
                            Transaction = new UGCQuery
                            {
                                SearchString = searchText.Text
                            },
                            StatusMessageDisplay = QueryStatusMessage,
                            OnSuccess            = (query) => RefreshList((query.Transaction as UGCQuery).Results)
                        });
                    }
                },
                AutoLayout = AutoLayout.DockRight
            });

            searchText.OnEnter = (sender) =>
            {
                button.OnClick.Invoke(button, null);
            };


            QueryStatusMessage = top.AddChild(new Widget
            {
                AutoLayout = AutoLayout.DockFill
            });

            List = AddChild(new WidgetListView
            {
                ItemHeight = 32,
                AutoLayout = AutoLayout.DockFill,
                Border     = null,
                SelectedItemBackgroundColor = new Vector4(0.5f, 0.5f, 0.5f, 1.0f),
                Padding = new Margin(2, 2, 2, 2)
            }) as WidgetListView;
        }
Пример #23
0
        public override void OnEnter()
        {
            // Clear the input queue... cause other states aren't using it and it's been filling up.
            DwarfGame.GumInputMapper.GetInputQueue();

            GuiRoot = new Gui.Root(DwarfGame.GuiSkin);
            GuiRoot.MousePointer = new MousePointer("mouse", 15.0f, 16, 17, 18, 19, 20, 21, 22, 23);

            var mainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect           = GuiRoot.RenderData.VirtualScreen,
                Border         = "border-fancy",
                Text           = Settings.Name,
                Font           = "font16",
                TextColor      = new Vector4(0, 0, 0, 1),
                Padding        = new Gui.Margin(4, 4, 4, 4),
                InteriorMargin = new Gui.Margin(24, 0, 0, 0),
            });

            var rightPanel = mainPanel.AddChild(new Gui.Widget
            {
                AutoLayout  = Gui.AutoLayout.DockRight,
                MinimumSize = new Point(256, 0),
                Padding     = new Gui.Margin(2, 2, 2, 2)
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Regenerate",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockTop,
                OnClick            = (sender, args) => { Settings = new WorldGenerationSettings();  RestartGeneration(); }
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Save World",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockTop,
                OnClick            = (sender, args) =>
                {
                    if (Generator.CurrentState != WorldGenerator.GenerationState.Finished)
                    {
                        GuiRoot.ShowTooltip(GuiRoot.MousePosition, "Generator is not finished.");
                    }
                    else
                    {
                        System.IO.DirectoryInfo worldDirectory = System.IO.Directory.CreateDirectory(DwarfGame.GetWorldDirectory() + System.IO.Path.DirectorySeparatorChar + Settings.Name);
                        NewOverworldFile file = new NewOverworldFile(Game.GraphicsDevice, Overworld.Map, Settings.Name, Settings.SeaLevel);
                        file.WriteFile(worldDirectory.FullName);
                        file.SaveScreenshot(worldDirectory.FullName + System.IO.Path.DirectorySeparatorChar + "screenshot.png");
                        GuiRoot.ShowModalPopup(GuiRoot.ConstructWidget(new Gui.Widgets.Popup
                        {
                            Text = "File saved."
                        }));
                    }
                }
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Advanced",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockTop,
                OnClick            = (sender, args) =>
                {
                    var advancedSettingsEditor = GuiRoot.ConstructWidget(new Gui.Widgets.WorldGenerationSettingsDialog
                    {
                        Settings = Settings,
                        OnClose  = (s) =>
                        {
                            if ((s as Gui.Widgets.WorldGenerationSettingsDialog).Result == Gui.Widgets.WorldGenerationSettingsDialog.DialogResult.Okay)
                            {
                                RestartGeneration();
                            }
                        }
                    });

                    GuiRoot.ShowModalPopup(advancedSettingsEditor);
                }
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Back",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockTop,
                OnClick            = (sender, args) =>
                {
                    Generator.Abort();
                    StateManager.PopState();
                }
            });

            StartButton = rightPanel.AddChild(new Gui.Widget
            {
                Text               = "Start Game",
                Border             = "border-button",
                ChangeColorOnHover = true,
                TextColor          = new Vector4(0, 0, 0, 1),
                Font               = "font16",
                AutoLayout         = Gui.AutoLayout.DockBottom,
                OnClick            = (sender, args) =>
                {
                    if (Generator.CurrentState != WorldGenerator.GenerationState.Finished)
                    {
                        GuiRoot.ShowTooltip(GuiRoot.MousePosition, "World generation is not finished.");
                    }
                    else
                    {
                        Overworld.Name        = Settings.Name;
                        Settings.ExistingFile = null;
                        Settings.WorldOrigin  = Settings.WorldGenerationOrigin;
                        Settings.SpawnRect    = Generator.GetSpawnRectangle();
                        if (Settings.Natives == null || Settings.Natives.Count == 0)
                        {
                            Settings.Natives = Generator.NativeCivilizations;
                        }
                        //Settings.StartUnderground = StartUnderground.CheckState;
                        //Settings.RevealSurface = RevealSurface.CheckState;

                        foreach (var faction in Settings.Natives)
                        {
                            Vector2 center            = new Vector2(faction.Center.X, faction.Center.Y);
                            Vector2 spawn             = new Vector2(Generator.GetSpawnRectangle().Center.X, Generator.GetSpawnRectangle().Center.Y);
                            faction.DistanceToCapital = (center - spawn).Length();
                            faction.ClaimsColony      = false;
                        }

                        foreach (var faction in Generator.GetFactionsInSpawn())
                        {
                            faction.ClaimsColony = true;
                        }

                        StateManager.ClearState();
                        StateManager.PushState(new LoadState(Game, StateManager, Settings));
                    }
                }
            });

            rightPanel.AddChild(new Gui.Widget
            {
                Text       = "Territory size",
                AutoLayout = Gui.AutoLayout.DockTop,
                Font       = "font8",
                TextColor  = new Vector4(0, 0, 0, 1),
            });

            var colonySizeCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox
            {
                AutoLayout             = Gui.AutoLayout.DockTop,
                Items                  = new List <string>(new string[] { "Small", "Medium", "Large" }),
                Font                   = "font8",
                TextColor              = new Vector4(0, 0, 0, 1),
                OnSelectedIndexChanged = (sender) =>
                {
                    switch ((sender as Gui.Widgets.ComboBox).SelectedItem)
                    {
                    case "Small": Settings.ColonySize = new Point3(4, 1, 4); break;

                    case "Medium": Settings.ColonySize = new Point3(8, 1, 8); break;

                    case "Large": Settings.ColonySize = new Point3(10, 1, 10); break;
                    }

                    var worldSize = Settings.ColonySize.ToVector3() * VoxelConstants.ChunkSizeX / Settings.WorldScale;

                    float w = worldSize.X;
                    float h = worldSize.Z;

                    float clickX = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.X, Settings.Width - w), 0);
                    float clickY = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.Y, Settings.Height - h), 0);

                    Settings.WorldGenerationOrigin = new Vector2((int)(clickX), (int)(clickY));
                }
            }) as Gui.Widgets.ComboBox;

            rightPanel.AddChild(new Gui.Widget
            {
                Text       = "Difficulty",
                AutoLayout = Gui.AutoLayout.DockTop,
                Font       = "font8",
                TextColor  = new Vector4(0, 0, 0, 1)
            });

            var difficultySelectorCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox
            {
                AutoLayout             = Gui.AutoLayout.DockTop,
                Items                  = EmbarkmentLibrary.Embarkments.Select(e => e.Key).ToList(),
                TextColor              = new Vector4(0, 0, 0, 1),
                Font                   = "font8",
                OnSelectedIndexChanged = (sender) =>
                {
                    Settings.InitalEmbarkment = EmbarkmentLibrary.Embarkments[(sender as Gui.Widgets.ComboBox).SelectedItem];
                }
            }) as Gui.Widgets.ComboBox;

            /*
             * StartUnderground = rightPanel.AddChild(new Gui.Widgets.CheckBox
             * {
             *  AutoLayout = Gui.AutoLayout.DockTop,
             *  Font = "font8",
             *  Text = "@world-generation-start-underground"
             * }) as Gui.Widgets.CheckBox;
             *
             * RevealSurface = rightPanel.AddChild(new Gui.Widgets.CheckBox
             * {
             *  AutoLayout = Gui.AutoLayout.DockTop,
             *  Font = "font8",
             *  Text = "@world-generation-reveal-surface",
             *  CheckState = true
             * }) as Gui.Widgets.CheckBox;
             */

            rightPanel.AddChild(new Gui.Widget
            {
                Text       = "Cave Layers",
                AutoLayout = Gui.AutoLayout.DockTop,
                Font       = "font8",
                TextColor  = new Vector4(0, 0, 0, 1),
            });

            var layerSetting = rightPanel.AddChild(new Gui.Widgets.ComboBox
            {
                AutoLayout             = AutoLayout.DockTop,
                Items                  = new List <string>(new string[] { "Barely any", "Few", "Normal", "Lots", "Way too many" }),
                Font                   = "font8",
                TextColor              = new Vector4(0, 0, 0, 1),
                OnSelectedIndexChanged = (sender) =>
                {
                    switch ((sender as Gui.Widgets.ComboBox).SelectedItem)
                    {
                    case "Barely any": Settings.NumCaveLayers = 2; break;

                    case "Few": Settings.NumCaveLayers = 3; break;

                    case "Normal": Settings.NumCaveLayers = 4; break;

                    case "Lots": Settings.NumCaveLayers = 6; break;

                    case "Way too many": Settings.NumCaveLayers = 9; break;
                    }
                }
            }) as Gui.Widgets.ComboBox;

            ZoomedPreview = rightPanel.AddChild(new Gui.Widget
            {
                AutoLayout = Gui.AutoLayout.DockBottom,
                OnLayout   = (sender) =>
                {
                    var space = System.Math.Min(
                        layerSetting.Rect.Width, StartButton.Rect.Top - layerSetting.Rect.Bottom - 4);
                    sender.Rect.Height = space;
                    sender.Rect.Width  = space;
                    sender.Rect.Y      = layerSetting.Rect.Bottom + 2;
                    sender.Rect.X      = layerSetting.Rect.X +
                                         ((layerSetting.Rect.Width - space) / 2);
                }
            });

            GenerationProgress = mainPanel.AddChild(new Gui.Widgets.ProgressBar
            {
                AutoLayout          = Gui.AutoLayout.DockBottom,
                TextHorizontalAlign = Gui.HorizontalAlign.Center,
                TextVerticalAlign   = Gui.VerticalAlign.Center,
                Font      = "font10",
                TextColor = new Vector4(1, 1, 1, 1)
            }) as Gui.Widgets.ProgressBar;

            Preview = mainPanel.AddChild(new WorldGeneratorPreview(Game.GraphicsDevice)
            {
                Border     = "border-thin",
                AutoLayout = Gui.AutoLayout.DockFill
            }) as WorldGeneratorPreview;

            GuiRoot.RootItem.Layout();

            difficultySelectorCombo.SelectedIndex = difficultySelectorCombo.Items.IndexOf("Normal");
            colonySizeCombo.SelectedIndex         = colonySizeCombo.Items.IndexOf("Medium");
            layerSetting.SelectedIndex            = layerSetting.Items.IndexOf("Normal");

            IsInitialized = true;

            if (AutoGenerate)
            {
                RestartGeneration();
            }
            else // Setup a dummy generator for now.
            {
                Generator = new WorldGenerator(Settings);
                Generator.LoadDummy(
                    new Color[Overworld.Map.GetLength(0) * Overworld.Map.GetLength(1)],
                    Game.GraphicsDevice);
                Preview.SetGenerator(Generator);
            }

            base.OnEnter();
        }
Пример #24
0
        public override void Construct()
        {
            PreviewSelector = AddChild(new Gui.Widgets.ComboBox
            {
                Items = new List <string>(new string[] {
                    "Height",
                    "Biomes",
                    "Temperature",
                    "Rain",
                    "Erosion",
                    "Faults",
                    "Factions"
                }),
                AutoLayout             = Gui.AutoLayout.FloatTopLeft,
                MinimumSize            = new Point(128, 0),
                OnSelectedIndexChanged = (sender) => UpdatePreview = true,
                Font      = "font8",
                TextColor = new Vector4(0, 0, 0, 1)
            }) as Gui.Widgets.ComboBox;

            PreviewSelector.SelectedIndex = 0;

            PreviewPanel = AddChild(new Gui.Widget
            {
                AutoLayout = Gui.AutoLayout.DockFill,
                OnLayout   = (sender) =>
                {
                    sender.Rect = sender.Rect.Interior(0, PreviewSelector.Rect.Height + 2, 0, 0);
                },
                OnClick = (sender, args) =>
                {
                    if (args.MouseButton == 0)
                    {
                        int chunkSize  = 16;
                        var worldSize  = Generator.Settings.ColonySize.ToVector3() * chunkSize / Generator.Settings.WorldScale;
                        var clickPoint = ScreenToWorld(new Vector2(args.X, args.Y));
                        Generator.Settings.WorldGenerationOrigin = Generator.GetOrigin(clickPoint, worldSize);
                    }
                },
                OnMouseMove = (sender, args) =>
                {
                    if (Microsoft.Xna.Framework.Input.Mouse.GetState().RightButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                    {
                        var delta = new Vector2(args.X, args.Y) - new Vector2(PreviousMousePosition.X,
                                                                              PreviousMousePosition.Y);

                        var keyboard = Microsoft.Xna.Framework.Input.Keyboard.GetState();
                        if (keyboard.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.LeftShift) ||
                            keyboard.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.RightShift))
                        {
                            zoom = System.Math.Min((float)System.Math.Max(zoom + delta.Y * 0.001f, 0.1f), 1.5f);
                        }
                        else
                        {
                            phi   += delta.Y * 0.01f;
                            theta -= delta.X * 0.01f;
                            phi    = System.Math.Max(phi, 0.5f);
                            phi    = System.Math.Min(phi, 1.5f);
                        }
                    }
                },
                OnScroll = (sender, args) =>
                {
                    zoom = System.Math.Min((float)System.Math.Max(args.ScrollValue > 0 ? zoom - 0.1f : zoom + 0.1f, 0.1f), 1.5f);
                }
            });
        }
Пример #25
0
        public override void Construct()
        {
            IsRootTray = true;

            ItemSource = new Gui.Widget[]
            {
                new HorizontalMenuTray.MenuItem
                {
                    Text = "CHEAT MODE",
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "BUILD",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = RoomLibrary.GetRoomTypes().Select(r =>
                                                                       new HorizontalMenuTray.MenuItem
                        {
                            Text    = r,
                            OnClick = (sender, args) => ActivateGodTool("Build/" + r)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "SPAWN",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 5,
                        ItemSource = EntityFactory.EntityFuncs.Keys.OrderBy(s => s).Select(s =>
                                                                                           new HorizontalMenuTray.MenuItem
                        {
                            Text    = s,
                            OnClick = (sender, args) => ActivateGodTool("Spawn/" + s)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = VoxelLibrary.PrimitiveMap.Keys
                                     .Where(t => t.Name != "empty" && t.Name != "water")
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Place/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DELETE BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Delete Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Kill Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE GRASS",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = GrassLibrary.TypeList
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Grass/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE DECAL",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = DecalLibrary.TypeList
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Decal/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL THINGS",
                    OnClick = (sender, args) => ActivateGodTool("Kill Things")
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DISEASE",
                    OnClick = (sender, args) => ActivateGodTool("Disease")
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL WATER",
                    OnClick = (sender, args) => ActivateGodTool("Fill Water")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL LAVA",
                    OnClick = (sender, args) => ActivateGodTool("Fill Lava")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FIRE",
                    OnClick = (sender, args) => ActivateGodTool("Fire")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "TRADE ENVOY",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Master.World.Factions.Factions.Values.Where(f => f.Race.IsIntelligent && f != Master.Faction).Select(s =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = s.Name,
                                OnClick = (sender, args) => Master.World.Diplomacy.SendTradeEnvoy(s, Master.World)
                            });
                        }),
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DWARF BUX",
                    OnClick = (sender, args) => Master.Faction.AddMoney(100m)
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "PAY",
                    OnClick = (sender, args) => Master.PayEmployees()
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "STARVE",
                    OnClick = (sender, args) =>
                    {
                        foreach (var minion in Master.Faction.Minions)
                        {
                            minion.Status.Hunger.CurrentValue = 0;
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "XP",
                    OnClick = (sender, args) =>
                    {
                        foreach (var minion in Master.Faction.Minions)
                        {
                            minion.AddXP(100);
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SPAWN TEST",
                    OnClick = (sender, args) =>
                    {
                        var keys = EntityFactory.EntityFuncs.Keys.ToList();
                        foreach (var key in keys)
                        {
                            EntityFactory.CreateEntity <GameComponent>(key, Master.World.CursorLightPos);
                        }
                    }
                },

                // Shouldn't this go into some kind of 'debug' menu?
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DRAW PATHS",
                    OnClick = (sender, args) =>
                    {
                        GameSettings.Default.DrawPaths = !GameSettings.Default.DrawPaths;
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "+1 HOUR",
                    OnClick = (sender, args) =>
                    {
                        Master.World.Time.CurrentDate += new TimeSpan(1, 0, 0);
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FORCE REBUILD",
                    OnClick = (sender, args) =>
                    {
                        foreach (var chunk in Master.World.ChunkManager.ChunkData.ChunkMap)
                        {
                            for (int Y = 0; Y < VoxelConstants.ChunkSizeY; ++Y)
                            {
                                chunk.InvalidateSlice(Y);
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "LET IT SNOW",
                    OnClick = (sender, args) =>
                    {
                        var storm = Weather.CreateStorm(Vector3.One, 100.0f, Master.World);
                        storm.TypeofStorm = StormType.SnowStorm;
                        storm.Start();
                    }
                },
            };

            base.Construct();
        }
Пример #26
0
        public override void OnEnter()
        {
            // Clear the input queue... cause other states aren't using it and it's been filling up.
            DwarfGame.GumInputMapper.GetInputQueue();

            GuiRoot = new Gui.Root(DwarfGame.GumSkin);
            GuiRoot.MousePointer  = new Gui.MousePointer("mouse", 4, 0);
            GuiRoot.RootItem.Font = "font8";

            int w = System.Math.Min(GuiRoot.RenderData.VirtualScreen.Width - 256, 550);
            int h = System.Math.Min(GuiRoot.RenderData.VirtualScreen.Height - 256, 300);
            int x = GuiRoot.RenderData.VirtualScreen.Width / 2 - w / 2;
            int y = System.Math.Max(GuiRoot.RenderData.VirtualScreen.Height / 2 - h / 2, 280);

            int bgx = x - 258;
            int bgy = y - 128;

            DialogueContext.SpeechBubble = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect      = new Rectangle(bgx + 258, bgy, w + 50, 128),
                Border    = "speech-bubble-reverse",
                Font      = "font16",
                TextColor = Color.Black.ToVector4()
            });

            var bg = GuiRoot.RootItem.AddChild(new Widget()
            {
                Border = "border-dark",
                Rect   = new Rectangle(bgx, bgy, 258, 258)
            });


            DialogueContext.ChoicePanel = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect       = new Rectangle(x, y, w, h),
                Border     = "border-fancy",
                AutoLayout = AutoLayout.DockFill
            });

            SpeakerAnimation                 = AnimationLibrary.CreateAnimation(DialogueContext.Envoy.OwnerFaction.Race.TalkAnimation);
            SpeakerAnimationPlayer           = new AnimationPlayer(SpeakerAnimation);
            DialogueContext.SpeakerAnimation = SpeakerAnimationPlayer;


            SpeakerWidget = bg.AddChild(new Widget()
            {
                Background  = new TileReference(SpeakerAnimation.SpriteSheet.AssetName, 0),
                AutoLayout  = AutoLayout.DockFill,
                MinimumSize = new Point(256, 256),
                Rect        = new Rectangle(bgx, bgy - 5, 256, 256)
            });

            DialogueContext.Politics = World.Diplomacy.GetPolitics(
                DialogueContext.PlayerFaction, DialogueContext.Envoy.OwnerFaction);
            DialogueContext.World = World;

            if (!DialogueContext.Politics.HasMet)
            {
                DialogueContext.Politics.HasMet = true;

                DialogueContext.Politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                {
                    Change      = 0.0f,
                    Description = "we just met",
                    Duration    = new TimeSpan(1, 0, 0, 0),
                    Time        = World.Time.CurrentDate
                });
            }

            DialogueContext.EnvoyName = TextGenerator.GenerateRandom(Datastructures.SelectRandom(DialogueContext.Envoy.OwnerFaction.Race.NameTemplates).ToArray());

            DialogueContext.Transition(DialogueTree.ConversationRoot);

            IsInitialized = true;
            base.OnEnter();
        }
Пример #27
0
        public override void Construct()
        {
            AutoSizeColumns = true;
            IsRootTray      = true;

            ItemSource = new Gui.Widget[]
            {
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "DEBUG",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSize   = new Point(200, 20),
                        ItemSource = Debugger.EnumerateSwitches().Select(s =>
                                                                         new HorizontalMenuTray.CheckboxMenuItem
                        {
                            Text         = Debugger.GetNicelyFormattedName(s.Name),
                            InitialState = s.State,
                            SetCallback  = s.Set
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "BUILD",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Library.EnumerateZoneTypeNames().Select(r =>
                                                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = r,
                            OnClick = (sender, args) => ActivateGodTool("Build/" + r)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "SPAWN",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns         = 8,
                        AutoSizeColumns = false,
                        ItemSize        = new Point(110, 28),
                        ItemSource      = EntityFactory.EnumerateEntityTypes()
                                          .Where(s => !s.Contains("Resource") || !Library.GetResourceType(s.Substring(0, s.Length - " Resource".Length)).Generated)
                                          .OrderBy(s => s).Select(s =>
                                                                  new HorizontalMenuTray.MenuItem
                        {
                            Text    = s,
                            OnClick = (sender, args) => ActivateGodTool("Spawn/" + s),
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE BLOCK",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = Library.EnumerateVoxelTypes()
                                     .Where(t => t.Name != "_empty" && t.Name != "water")
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Place/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DELETE BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Delete Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "NUKE COLUMN",
                    OnClick = (sender, args) => ActivateGodTool("Nuke Column")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Kill Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE GRASS",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = Library.EnumerateGrassTypes()
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Grass/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE RAIL",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 1,
                        ItemSource = new HorizontalMenuTray.MenuItem[]
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text           = "RAW PIECES",
                                ExpansionChild = new HorizontalMenuTray.Tray
                                {
                                    Columns    = 2,
                                    ItemSize   = new Point(200, 20),
                                    ItemSource = Library.EnumerateRailPieces().Select(p =>
                                                                                      new HorizontalMenuTray.MenuItem
                                    {
                                        Text    = p.Name,
                                        OnClick = (sender, args) => ActivateGodTool("Rail/" + p.Name)
                                    })
                                }
                            },

                            new HorizontalMenuTray.MenuItem
                            {
                                Text           = "USING PATTERNS",
                                ExpansionChild = new HorizontalMenuTray.Tray
                                {
                                    Columns    = 1,
                                    ItemSource = Library.EnumerateRailPatterns().Select(p =>
                                                                                        new HorizontalMenuTray.MenuItem
                                    {
                                        Text    = p.Name,
                                        OnClick = (sender, args) =>
                                        {
                                            var railTool     = World.UserInterface.Tools["BuildRail"] as Rail.BuildRailTool;
                                            railTool.Pattern = p;
                                            World.UserInterface.ChangeTool("BuildRail");
                                            railTool.GodModeSwitch = true;
                                        }
                                    })
                                }
                            },

                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PAINT",
                                OnClick = (sender, args) =>
                                {
                                    var railTool = World.UserInterface.Tools["PaintRail"] as Rail.PaintRailTool;
                                    railTool.SelectedResources = new List <ResourceAmount>(new ResourceAmount[] { new ResourceAmount("Rail", 1) });
                                    World.UserInterface.ChangeTool("PaintRail");
                                    railTool.GodModeSwitch = true;
                                }
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "AUTO SAVE",
                    OnClick = (sender, args) =>
                    {
                        World.UserInterface.AutoSave();
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL THINGS",
                    OnClick = (sender, args) => ActivateGodTool("Kill Things")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "TRAILER",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = new List <HorizontalMenuTray.MenuItem>()
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "SPIN +",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Zero, 2.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "SPIN -",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Zero, -2.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "ZOOM -",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Zero, 0.0f, 2.5f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "ZOOM +",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Zero, 0.0f, -2.5f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "FWD",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Forward * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "BACK",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Backward * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "LEFT",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Left * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "RIGHT",
                                OnClick = (sender, args) => World.Renderer.Camera.Trailer(Vector3.Right * 5, 0.0f, 0.0f),
                            },
                        }
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL WATER",
                    OnClick = (sender, args) => ActivateGodTool("Fill Water")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL LAVA",
                    OnClick = (sender, args) => ActivateGodTool("Fill Lava")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "TRADE ENVOY",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = World.Factions.Factions.Values.Where(f => f.Race.IsIntelligent && f != World.PlayerFaction).Select(s =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = s.ParentFaction.Name,
                                OnClick = (sender, args) => s.SendTradeEnvoy()
                            });
                        }),
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "EVENT",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Events.Library.Enumerate().Select(e =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = e.Name,
                                OnClick = (sender, args) => World.EventScheduler.ActivateEvent(World, e)
                            });
                        }),
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "WAR PARTY",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = World.Factions.Factions.Values.Where(f => f.Race.IsIntelligent && f != World.PlayerFaction).Select(s =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = s.ParentFaction.Name,
                                OnClick = (sender, args) => s.SendWarParty()
                            });
                        }),
                    }
                },


                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DWARF BUX",
                    OnClick = (sender, args) => World.PlayerFaction.AddMoney(100m)
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "MINIONS",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = new HorizontalMenuTray.MenuItem[]
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PAY",
                                OnClick = (sender, args) => World.PayEmployees()
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "STARVE",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in World.PlayerFaction.Minions)
                                    {
                                        minion.Stats.Hunger.CurrentValue = 0;
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "XP",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in World.PlayerFaction.Minions)
                                    {
                                        minion.AddXP(100);
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "DISEASE",
                                OnClick = (sender, args) => ActivateGodTool("Disease")
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "HAPPY",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in World.PlayerFaction.Minions)
                                    {
                                        minion.Creature.AddThought("You used the god menu to make me happy.", new TimeSpan(0, 8, 0, 0), 100.0f);
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PISSED",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in World.PlayerFaction.Minions)
                                    {
                                        minion.Creature.AddThought("You used the god menu to piss me off.", new TimeSpan(0, 8, 0, 0), -100.0f);
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "GAMBLE",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var employee in World.PlayerFaction.Minions)
                                    {
                                        employee.Stats.Boredom.CurrentValue = employee.Stats.Boredom.MinValue;
                                        employee.AddMoney(100);
                                        employee.AssignTask(new Scripting.GambleTask()
                                        {
                                            Priority = TaskPriority.High
                                        });
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PASS OUT",
                                OnClick = (sender, args) =>
                                {
                                    var employee = Datastructures.SelectRandom(World.PlayerFaction.Minions);
                                    if (employee != null)
                                    {
                                        employee.Creature.Heal(-employee.Stats.Health.CurrentValue * employee.Creature.MaxHealth + 1);
                                    }
                                }
                            }
                        }
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SPAWN TEST",
                    OnClick = (sender, args) =>
                    {
                        // Copy is required because spawning some types results in the creation of new types. EG, snakes create snake meat.
                        var     keys       = EntityFactory.EnumerateEntityTypes().ToList();
                        int     num        = keys.Count();
                        float   gridSize   = (float)Math.Ceiling(Math.Sqrt((double)num));
                        Vector3 gridCenter = World.Renderer.CursorLightPos;
                        int     i          = 0;
                        for (float dx = -gridSize / 2; dx <= gridSize / 2; dx++)
                        {
                            for (float dz = -gridSize / 2; dz <= gridSize / 2; dz++)
                            {
                                if (i >= num)
                                {
                                    continue;
                                }

                                Vector3     pos    = MathFunctions.Clamp(gridCenter + new Vector3(dx, World.WorldSizeInVoxels.Y, dz), World.ChunkManager.Bounds);
                                VoxelHandle handle = VoxelHelpers.FindFirstVisibleVoxelOnRay(World.ChunkManager, pos, pos + Vector3.Down * 100);
                                if (handle.IsValid)
                                {
                                    EntityFactory.CreateEntity <GameComponent>(keys[i], handle.WorldPosition + Vector3.Up);
                                }
                                i++;
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SPAWN CRAFTS",
                    OnClick = (sender, args) =>
                    {
                        // Copy is required because spawning some types results in the creation of new types. EG, snakes create snake meat.
                        var     itemTypes  = Library.EnumerateCraftables().Where(craft => craft.Type == CraftItem.CraftType.Object).ToList();
                        int     num        = itemTypes.Count();
                        float   gridSize   = (float)Math.Ceiling(Math.Sqrt((double)num));
                        Vector3 gridCenter = World.Renderer.CursorLightPos;

                        int i = 0;
                        for (float dx = -gridSize / 2; dx <= gridSize / 2; dx++)
                        {
                            for (float dz = -gridSize / 2; dz <= gridSize / 2; dz++)
                            {
                                if (i < num)
                                {
                                    var item = itemTypes[i];
                                    if (item.Name != "Explosive")
                                    {
                                        Vector3     pos    = MathFunctions.Clamp(gridCenter + new Vector3(dx, World.WorldSizeInVoxels.Y, dz), World.ChunkManager.Bounds);
                                        VoxelHandle handle = VoxelHelpers.FindFirstVisibleVoxelOnRay(World.ChunkManager, pos, pos + Vector3.Down * 100);

                                        if (handle.IsValid)
                                        {
                                            var blackboard = new Blackboard();
                                            List <ResourceAmount> resources = item.RequiredResources.Select(r => new ResourceAmount(Library.EnumerateResourceTypesWithTag(r.Type).First(), r.Count)).ToList();
                                            blackboard.SetData <List <ResourceAmount> >("Resources", resources);
                                            blackboard.SetData <string>("CraftType", item.Name);

                                            var entity = EntityFactory.CreateEntity <GameComponent>(item.EntityName, handle.WorldPosition + Vector3.Up + item.SpawnOffset, blackboard);
                                            if (entity != null)
                                            {
                                                if (item.AddToOwnedPool)
                                                {
                                                    World.PlayerFaction.OwnedObjects.Add(entity as GameComponent);
                                                }
                                                if (item.Moveable)
                                                {
                                                    entity.Tags.Add("Moveable");
                                                }
                                                if (item.Deconstructable)
                                                {
                                                    entity.Tags.Add("Deconstructable");
                                                }
                                            }
                                        }
                                    }
                                }
                                i++;
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "+1 HOUR",
                    OnClick = (sender, args) =>
                    {
                        World.Time.CurrentDate += new TimeSpan(1, 0, 0);
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FORCE REBUILD",
                    OnClick = (sender, args) =>
                    {
                        foreach (var chunk in World.ChunkManager.ChunkMap)
                        {
                            for (int Y = 0; Y < VoxelConstants.ChunkSizeY; ++Y)
                            {
                                chunk.InvalidateSlice(Y);
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "REPULSE",
                    OnClick = (sender, args) => ActivateGodTool("Repulse")
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SLOWMO",
                    OnClick = (sender, args) => GameSettings.Default.EnableSlowMotion = !GameSettings.Default.EnableSlowMotion
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "LET IT SNOW",
                    OnClick = (sender, args) =>
                    {
                        var storm = Weather.CreateStorm(Vector3.One, 100.0f, World);
                        storm.TypeofStorm = StormType.SnowStorm;
                        storm.Start();
                    }
                }
            };

            base.Construct();
        }
Пример #28
0
        public override void Construct()
        {
            Settings.Seed        = Settings.Name.GetHashCode();
            PopupDestructionType = PopupDestructionType.Keep;
            Padding = new Margin(2, 2, 2, 2);
            //Set size and center on screen.
            Rect   = new Rectangle(0, 0, 400, 400);
            Rect.X = (Root.RenderData.VirtualScreen.Width / 2) - 200;
            Rect.Y = (Root.RenderData.VirtualScreen.Height / 2) - 200;

            Border = "border-fancy";

            var okayButton = AddChild(new Gui.Widgets.Button
            {
                Text = "Okay",
                TextHorizontalAlign = HorizontalAlign.Center,
                TextVerticalAlign   = VerticalAlign.Center,
                Border  = "border-button",
                OnClick = (sender, args) =>
                {
                    Result = DialogResult.Okay;
                    this.Close();
                },
                AutoLayout = AutoLayout.FloatBottomRight
            });

            AddChild(new Button
            {
                Text = "Cancel",
                TextHorizontalAlign = HorizontalAlign.Center,
                TextVerticalAlign   = VerticalAlign.Center,
                Border  = "border-button",
                OnClick = (sender, args) =>
                {
                    Result = DialogResult.Cancel;
                    this.Close();
                },
                AutoLayout = AutoLayout.FloatBottomRight,
                OnLayout   = (sender) => sender.Rect.X -= okayButton.Rect.Width + 4
            });

            var topRow = AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockTop,
                MinimumSize = new Point(0, 30)
            });

            topRow.AddChild(new Widget
            {
                AutoLayout  = AutoLayout.DockLeft,
                MinimumSize = new Point(64, 0),
                Text        = "Name"
            });

            topRow.AddChild(new Widget
            {
                AutoLayout = AutoLayout.DockRight,
                Border     = "border-button",
                Text       = "Random",
                OnClick    = (sender, args) =>
                {
                    Settings.Name    = TextGenerator.GenerateRandom(TextGenerator.GetAtoms(ContentPaths.Text.Templates.worlds));
                    NameEditBox.Text = Settings.Name;
                    Settings.Seed    = Settings.Name.GetHashCode();
                }
            });

            NameEditBox = topRow.AddChild(new Gui.Widgets.EditableTextField
            {
                AutoLayout   = AutoLayout.DockFill,
                Text         = Settings.Name,
                OnTextChange = (sender) =>
                {
                    Settings.Name = sender.Text;
                    Settings.Seed = Settings.Name.GetHashCode();
                }
            });


            AddChild(CreateCombo <int>(Root, "World Size", "Size of the world to generate",
                                       new int[] { 256, 384, 512, 1024, 2048 }, (i) =>
            {
                Settings.Width  = i;
                Settings.Height = i;
            }, () => Settings.Width));

            AddChild(CreateCombo <int>(Root, "Natives", "Number of native civilizations",
                                       new int[] { 0, 2, 4, 8, 16 }, (i) => Settings.NumCivilizations = i,
                                       () => Settings.NumCivilizations));


            AddChild(CreateCombo <int>(Root, "Faults", "Number of straights, seas, etc.",
                                       new int[] { 0, 1, 3, 5, 10 }, (i) => Settings.NumFaults = i, () => Settings.NumFaults));

            AddChild(CreateCombo <float>(Root, "Rainfall", "Amount of moisture in the world.",
                                         new float[] { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f }, (f) => Settings.RainfallScale = f,
                                         () => Settings.RainfallScale));

            AddChild(CreateCombo <int>(Root, "Erosion", "How eroded is the landscape.",
                                       new int[] { 50, 1000, 8000, 20000, 50000 }, (i) => Settings.NumRains = i,
                                       () => Settings.NumRains));

            AddChild(CreateCombo <float>(Root, "Sea Level", "Height of the sea.",
                                         new float[] { 0.05f, 0.1f, 0.17f, 0.25f, 0.3f }, (f) => Settings.SeaLevel = f,
                                         () => Settings.SeaLevel));

            AddChild(CreateCombo <float>(Root, "Temperature", "Average temperature.",
                                         new float[] { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f }, (f) => Settings.TemperatureScale = f,
                                         () => Settings.TemperatureScale));

            Layout();
        }
Пример #29
0
        public override void Construct()
        {
            AutoSizeColumns = true;
            IsRootTray      = true;

            ItemSource = new Gui.Widget[]
            {
                new HorizontalMenuTray.MenuItem
                {
                    Text = "CHEAT MODE",
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "DEBUG",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSize   = new Point(200, 20),
                        ItemSource = Debugger.EnumerateSwitches().Select(s =>
                                                                         new HorizontalMenuTray.CheckboxMenuItem
                        {
                            Text         = Debugger.GetNicelyFormattedName(s.Name),
                            InitialState = s.State,
                            SetCallback  = s.Set
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DEBUG SAVE",
                    OnClick = (sender, args) =>
                    {
                        // Turn off binary compressed saves and save a nice straight json save for debugging purposes.

                        // Todo: Why isn't World managing this paused state itself?
                        bool paused          = Master.World.Paused;
                        var  previousSetting = DwarfGame.COMPRESSED_BINARY_SAVES;
                        DwarfGame.COMPRESSED_BINARY_SAVES = false;
                        Master.World.Save(
                            String.Format("{0}_{1}_DEBUG", Overworld.Name, Master.World.GameID),
                            (success, exception) =>
                        {
                            Master.World.MakeAnnouncement(success ? "Debug save created.": "Debug save failed - " + exception.Message);
                            DwarfGame.COMPRESSED_BINARY_SAVES = previousSetting;
                            Master.World.Paused = paused;
                        });
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "BUILD",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = RoomLibrary.GetRoomTypes().Select(r =>
                                                                       new HorizontalMenuTray.MenuItem
                        {
                            Text    = r,
                            OnClick = (sender, args) => ActivateGodTool("Build/" + r)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "SPAWN",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 5,
                        ItemSource = EntityFactory.EnumerateEntityTypes().Where(s => !s.Contains("Resource") ||
                                                                                !ResourceLibrary.GetResourceByName(s.Substring(0, s.Length - " Resource".Length)).Generated).OrderBy(s => s).Select(s =>
                                                                                                                                                                                                    new HorizontalMenuTray.MenuItem
                        {
                            Text    = s,
                            OnClick = (sender, args) => ActivateGodTool("Spawn/" + s)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE BLOCK",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = VoxelLibrary.PrimitiveMap.Keys
                                     .Where(t => t.Name != "empty" && t.Name != "water")
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Place/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DELETE BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Delete Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL BLOCK",
                    OnClick = (sender, args) => ActivateGodTool("Kill Block")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE GRASS",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = GrassLibrary.TypeList
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Grass/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE DECAL",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 3,
                        ItemSource = DecalLibrary.TypeList
                                     .OrderBy(s => s.Name)
                                     .Select(s =>
                                             new HorizontalMenuTray.MenuItem
                        {
                            Text    = s.Name,
                            OnClick = (sender, args) => ActivateGodTool("Decal/" + s.Name)
                        })
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "PLACE RAIL",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        Columns    = 1,
                        ItemSource = new HorizontalMenuTray.MenuItem[]
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text           = "RAW PIECES",
                                ExpansionChild = new HorizontalMenuTray.Tray
                                {
                                    Columns    = 2,
                                    ItemSize   = new Point(200, 20),
                                    ItemSource = Rail.RailLibrary.EnumeratePieces().Select(p =>
                                                                                           new HorizontalMenuTray.MenuItem
                                    {
                                        Text    = p.Name,
                                        OnClick = (sender, args) => ActivateGodTool("Rail/" + p.Name)
                                    })
                                }
                            },

                            new HorizontalMenuTray.MenuItem
                            {
                                Text           = "USING PATTERNS",
                                ExpansionChild = new HorizontalMenuTray.Tray
                                {
                                    Columns    = 1,
                                    ItemSource = Rail.RailLibrary.EnumeratePatterns().Select(p =>
                                                                                             new HorizontalMenuTray.MenuItem
                                    {
                                        Text    = p.Name,
                                        OnClick = (sender, args) =>
                                        {
                                            var railTool     = Master.Tools[GameMaster.ToolMode.BuildRail] as Rail.BuildRailTool;
                                            railTool.Pattern = p;
                                            Master.ChangeTool(GameMaster.ToolMode.BuildRail);
                                            railTool.GodModeSwitch = true;
                                        }
                                    })
                                }
                            },

                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PAINT",
                                OnClick = (sender, args) =>
                                {
                                    var railTool = Master.Tools[GameMaster.ToolMode.PaintRail] as Rail.PaintRailTool;
                                    railTool.SelectedResources = new List <ResourceAmount>(new ResourceAmount[] { new ResourceAmount("Rail", 1) });
                                    Master.ChangeTool(GameMaster.ToolMode.PaintRail);
                                    railTool.GodModeSwitch = true;
                                }
                            }
                        }
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "KILL THINGS",
                    OnClick = (sender, args) => ActivateGodTool("Kill Things")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "TRAILER",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = new List <HorizontalMenuTray.MenuItem>()
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "SPIN +",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Zero, 2.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "SPIN -",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Zero, -2.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "ZOOM -",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Zero, 0.0f, 2.5f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "ZOOM +",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Zero, 0.0f, -2.5f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "FWD",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Forward * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "BACK",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Backward * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "LEFT",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Left * 5, 0.0f, 0.0f),
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "RIGHT",
                                OnClick = (sender, args) => this.Master.World.Camera.Trailer(Vector3.Right * 5, 0.0f, 0.0f),
                            },
                        }
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL WATER",
                    OnClick = (sender, args) => ActivateGodTool("Fill Water")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FILL LAVA",
                    OnClick = (sender, args) => ActivateGodTool("Fill Lava")
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "TRADE ENVOY",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Master.World.Factions.Factions.Values.Where(f => f.Race.IsIntelligent && f != Master.Faction).Select(s =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = s.Name,
                                OnClick = (sender, args) => Master.World.Diplomacy.SendTradeEnvoy(s, Master.World)
                            });
                        }),
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "EVENT",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Master.World.GoalManager.EventScheduler.Events.Events.Select(e =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = e.Name,
                                OnClick = (sender, args) => Master.World.GoalManager.EventScheduler.ActivateEvent(Master.World, e)
                            });
                        }),
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text           = "WAR PARTY",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = Master.World.Factions.Factions.Values.Where(f => f.Race.IsIntelligent && f != Master.Faction).Select(s =>
                        {
                            return(new HorizontalMenuTray.MenuItem
                            {
                                Text = s.Name,
                                OnClick = (sender, args) => Master.World.Diplomacy.SendWarParty(s)
                            });
                        }),
                    }
                },


                new HorizontalMenuTray.MenuItem
                {
                    Text    = "DWARF BUX",
                    OnClick = (sender, args) => Master.Faction.AddMoney(100m)
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text           = "MINIONS",
                    ExpansionChild = new HorizontalMenuTray.Tray
                    {
                        ItemSource = new HorizontalMenuTray.MenuItem[]
                        {
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PAY",
                                OnClick = (sender, args) => Master.PayEmployees()
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "STARVE",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in Master.Faction.Minions)
                                    {
                                        minion.Status.Hunger.CurrentValue = 0;
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "XP",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in Master.Faction.Minions)
                                    {
                                        minion.AddXP(100);
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "DISEASE",
                                OnClick = (sender, args) => ActivateGodTool("Disease")
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "HAPPY",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in Master.Faction.Minions)
                                    {
                                        var thoughts = minion.GetRoot().GetComponent <DwarfThoughts>();
                                        if (thoughts != null)
                                        {
                                            thoughts.AddThought(Thought.ThoughtType.CheatedHappy);
                                        }
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PISSED",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var minion in Master.Faction.Minions)
                                    {
                                        var thoughts = minion.GetRoot().GetComponent <DwarfThoughts>();
                                        if (thoughts != null)
                                        {
                                            thoughts.AddThought(Thought.ThoughtType.CheatedPissed);
                                        }
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "GAMBLE",
                                OnClick = (sender, args) =>
                                {
                                    foreach (var employee in Master.Faction.Minions)
                                    {
                                        employee.AssignTask(new Scripting.GambleTask()
                                        {
                                            Priority = Task.PriorityType.High
                                        });
                                    }
                                }
                            },
                            new HorizontalMenuTray.MenuItem
                            {
                                Text    = "PASS OUT",
                                OnClick = (sender, args) =>
                                {
                                    var employee = Datastructures.SelectRandom(Master.Faction.Minions);
                                    if (employee != null)
                                    {
                                        employee.Creature.Heal(-employee.Status.Health.CurrentValue * employee.Creature.MaxHealth + 1);
                                    }
                                }
                            }
                        }
                    }
                },

                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SPAWN TEST",
                    OnClick = (sender, args) =>
                    {
                        // Copy is required because spawning some types results in the creation of new types. EG, snakes create snake meat.
                        var     keys       = EntityFactory.EnumerateEntityTypes().ToList();
                        int     num        = keys.Count();
                        float   gridSize   = (float)Math.Ceiling(Math.Sqrt((double)num));
                        Vector3 gridCenter = Master.World.CursorLightPos;
                        int     i          = 0;
                        for (float dx = -gridSize / 2; dx <= gridSize / 2; dx++)
                        {
                            for (float dz = -gridSize / 2; dz <= gridSize / 2; dz++)
                            {
                                if (i >= num)
                                {
                                    continue;
                                }

                                Vector3     pos    = MathFunctions.Clamp(gridCenter + new Vector3(dx, VoxelConstants.ChunkSizeY, dz), Master.World.ChunkManager.Bounds);
                                VoxelHandle handle = VoxelHelpers.FindFirstVisibleVoxelOnRay(Master.World.ChunkManager.ChunkData, pos, pos + Vector3.Down * 100);
                                if (handle.IsValid)
                                {
                                    EntityFactory.CreateEntity <GameComponent>(keys[i], handle.WorldPosition + Vector3.Up);
                                }
                                i++;
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SPAWN CRAFTS",
                    OnClick = (sender, args) =>
                    {
                        // Copy is required because spawning some types results in the creation of new types. EG, snakes create snake meat.
                        var     itemTypes  = CraftLibrary.EnumerateCraftables().Where(craft => craft.Type == CraftItem.CraftType.Object).ToList();
                        int     num        = itemTypes.Count();
                        float   gridSize   = (float)Math.Ceiling(Math.Sqrt((double)num));
                        Vector3 gridCenter = Master.World.CursorLightPos;

                        int i = 0;
                        for (float dx = -gridSize / 2; dx <= gridSize / 2; dx++)
                        {
                            for (float dz = -gridSize / 2; dz <= gridSize / 2; dz++)
                            {
                                if (i < num)
                                {
                                    var item = itemTypes[i];
                                    if (item.Name != "Explosive")
                                    {
                                        Vector3     pos    = MathFunctions.Clamp(gridCenter + new Vector3(dx, VoxelConstants.ChunkSizeY, dz), Master.World.ChunkManager.Bounds);
                                        VoxelHandle handle = VoxelHelpers.FindFirstVisibleVoxelOnRay(Master.World.ChunkManager.ChunkData, pos, pos + Vector3.Down * 100);

                                        if (handle.IsValid)
                                        {
                                            var blackboard = new Blackboard();
                                            List <ResourceAmount> resources = item.RequiredResources.Select(r => new ResourceAmount(ResourceLibrary.GetResourcesByTag(r.ResourceType).First(), r.NumResources)).ToList();
                                            blackboard.SetData <List <ResourceAmount> >("Resources", resources);
                                            blackboard.SetData <string>("CraftType", item.Name);

                                            var entity = EntityFactory.CreateEntity <GameComponent>(item.EntityName, handle.WorldPosition + Vector3.Up + item.SpawnOffset, blackboard);
                                            if (entity != null)
                                            {
                                                if (item.AddToOwnedPool)
                                                {
                                                    Master.Faction.OwnedObjects.Add(entity as Body);
                                                }
                                                if (item.Moveable)
                                                {
                                                    entity.Tags.Add("Moveable");
                                                }
                                                if (item.Deconstructable)
                                                {
                                                    entity.Tags.Add("Deconstructable");
                                                }
                                            }
                                        }
                                    }
                                }
                                i++;
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "+1 HOUR",
                    OnClick = (sender, args) =>
                    {
                        Master.World.Time.CurrentDate += new TimeSpan(1, 0, 0);
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "FORCE REBUILD",
                    OnClick = (sender, args) =>
                    {
                        foreach (var chunk in Master.World.ChunkManager.ChunkData.ChunkMap)
                        {
                            for (int Y = 0; Y < VoxelConstants.ChunkSizeY; ++Y)
                            {
                                chunk.InvalidateSlice(Y);
                            }
                        }
                    }
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "REPULSE",
                    OnClick = (sender, args) => ActivateGodTool("Repulse")
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "SLOWMO",
                    OnClick = (sender, args) => GameSettings.Default.EnableSlowMotion = !GameSettings.Default.EnableSlowMotion
                },
                new HorizontalMenuTray.MenuItem
                {
                    Text    = "LET IT SNOW",
                    OnClick = (sender, args) =>
                    {
                        var storm = Weather.CreateStorm(Vector3.One, 100.0f, Master.World);
                        storm.TypeofStorm = StormType.SnowStorm;
                        storm.Start();
                    }
                }
            };

            base.Construct();
        }
Пример #30
0
        private void RebuildGui()
        {
            BuildingGUI = true;

            // Create and initialize GUI framework.
            GuiRoot = new Gui.Root(DwarfGame.GumSkin);
            GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0);
            var       screen    = GuiRoot.RenderData.VirtualScreen;
            float     scale     = 0.75f;
            float     newWidth  = System.Math.Min(System.Math.Max(screen.Width * scale, 640), screen.Width * scale);
            float     newHeight = System.Math.Min(System.Math.Max(screen.Height * scale, 480), screen.Height * scale);
            Rectangle rect      = new Rectangle((int)(screen.Width / 2 - newWidth / 2), (int)(screen.Height / 2 - newHeight / 2), (int)newWidth, (int)newHeight);

            // CONSTRUCT GUI HERE...
            MainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget
            {
                Rect        = rect,
                Padding     = new Margin(4, 4, 4, 4),
                Transparent = true,
                MinimumSize = new Point(640, 480),
                Font        = "font10"
            });

            MainPanel.AddChild(new Gui.Widgets.Button
            {
                Text = "Close",
                Font = "font16",
                TextHorizontalAlign = HorizontalAlign.Center,
                TextVerticalAlign   = VerticalAlign.Center,
                Border  = "border-button",
                OnClick = (sender, args) =>
                {
                    // If changes, prompt before closing.
                    if (HasChanges)
                    {
                        var confirm = new Gui.Widgets.Confirm
                        {
                            Text       = "Apply changes?",
                            OkayText   = "Yes",
                            CancelText = "No",
                            OnClose    = (s2) =>
                            {
                                if ((s2 as Gui.Widgets.Confirm).DialogResult == Gui.Widgets.Confirm.Result.OKAY)
                                {
                                    ConfirmSettings();
                                }
                                if (OnClosed != null)
                                {
                                    OnClosed();
                                }
                                StateManager.PopState();
                            }
                        };
                        GuiRoot.ShowModalPopup(confirm);
                    }
                    else
                    {
                        if (OnClosed != null)
                        {
                            OnClosed();
                        }
                        StateManager.PopState();
                    }
                },
                AutoLayout = AutoLayout.FloatBottomRight
            });

            MainPanel.AddChild(new Gui.Widgets.Button
            {
                Text = "Apply",
                Font = "font16",
                TextHorizontalAlign = HorizontalAlign.Center,
                TextVerticalAlign   = VerticalAlign.Center,
                Border  = "border-button",
                OnClick = (sender, args) =>
                {
                    ConfirmSettings();
                },
                AutoLayout = AutoLayout.FloatBottomRight,
                OnLayout   = s => s.Rect.X -= 128 // Hack to keep it from floating over the other button.
            });

            TabPanel = MainPanel.AddChild(new Gui.Widgets.TabPanel
            {
                AutoLayout       = AutoLayout.DockFill,
                TextSize         = 1,
                SelectedTabColor = new Vector4(1, 0, 0, 1),
                OnLayout         = (sender) => sender.Rect.Height -= 36 // Keep it from overlapping bottom buttons.
            }) as Gui.Widgets.TabPanel;

            CreateGameplayTab();
            CreateAudioTab();
            CreateKeysTab();
            CreateGraphicsTab();

            TabPanel.SelectedTab = 0;

            GuiRoot.RootItem.Layout();

            LoadSettings();

            BuildingGUI = false;
        }