public GUINumberInput(Rectangle rect, string style, NumberType inputType, Alignment alignment, GUIComponent parent = null) : base(style) { this.rect = rect; this.alignment = alignment; if (parent != null) { parent.AddChild(this); } textBox = new GUITextBox(Rectangle.Empty, style, this); textBox.OnTextChanged += TextChanged; plusButton = new GUIButton(new Rectangle(0, 0, 15, rect.Height / 2), "+", null, Alignment.TopRight, Alignment.Center, style, this); plusButton.OnClicked += ChangeIntValue; plusButton.Visible = inputType == NumberType.Int; minusButton = new GUIButton(new Rectangle(0, 0, 15, rect.Height / 2), "-", null, Alignment.BottomRight, Alignment.Center, style, this); minusButton.OnClicked += ChangeIntValue; minusButton.Visible = inputType == NumberType.Int; if (inputType == NumberType.Int) { textBox.Text = "0"; textBox.OnEnterPressed += (txtBox, txt) => { textBox.Text = IntValue.ToString(); textBox.Deselect(); return(true); }; textBox.OnDeselected += (txtBox, key) => { textBox.Text = IntValue.ToString(); }; } else if (inputType == NumberType.Float) { textBox.Text = "0.0"; textBox.OnDeselected += (txtBox, key) => { textBox.Text = FloatValue.ToString("G", CultureInfo.InvariantCulture); }; textBox.OnEnterPressed += (txtBox, txt) => { textBox.Text = FloatValue.ToString("G", CultureInfo.InvariantCulture); textBox.Deselect(); return(true); }; } InputType = inputType; }
public ChatBox(GUIComponent parent, bool isSinglePlayer) { this.isSinglePlayer = isSinglePlayer; if (radioIcon == null) { radioIcon = new Sprite("Content/UI/inventoryAtlas.png", new Rectangle(527, 952, 38, 52), null); radioIcon.Origin = radioIcon.size / 2; } screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight); int toggleButtonWidth = (int)(30 * GUI.Scale); guiFrame = new GUIFrame(HUDLayoutSettings.ToRectTransform(HUDLayoutSettings.ChatBoxArea, parent.RectTransform), style: null); chatBox = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.9f), guiFrame.RectTransform), style: "ChatBox"); toggleButton = new GUIButton(new RectTransform(new Point(toggleButtonWidth, HUDLayoutSettings.ChatBoxArea.Height), parent.RectTransform), style: "UIToggleButton"); toggleButton.OnClicked += (GUIButton btn, object userdata) => { toggleOpen = !toggleOpen; foreach (GUIComponent child in btn.Children) { child.SpriteEffects = toggleOpen == (HUDLayoutSettings.ChatBoxAlignment == Alignment.Right) ? SpriteEffects.FlipHorizontally : SpriteEffects.None; } return(true); }; inputBox = new GUITextBox(new RectTransform(new Vector2(1.0f, 0.1f), guiFrame.RectTransform, Anchor.BottomCenter), style: "ChatTextBox") { Font = GUI.SmallFont, MaxTextLength = ChatMessage.MaxLength }; radioButton = new GUIButton(new RectTransform(new Vector2(0.1f, 2.0f), inputBox.RectTransform, HUDLayoutSettings.ChatBoxAlignment == Alignment.Right ? Anchor.BottomRight : Anchor.BottomLeft, HUDLayoutSettings.ChatBoxAlignment == Alignment.Right ? Pivot.TopRight : Pivot.TopLeft), style: null); new GUIImage(new RectTransform(Vector2.One, radioButton.RectTransform), radioIcon, scaleToFit: true); radioButton.OnClicked = (GUIButton btn, object userData) => { if (inputBox.Selected) { inputBox.Text = ""; inputBox.Deselect(); } else { inputBox.Select(); var radioItem = Character.Controlled?.Inventory?.Items.FirstOrDefault(i => i?.GetComponent <WifiComponent>() != null); if (radioItem != null && Character.Controlled.HasEquippedItem(radioItem) && radioItem.GetComponent <WifiComponent>().CanTransmit()) { inputBox.Text = "r; "; } } return(true); }; }
private bool EnterTags(GUITextBox textBox, string text) { tags = text.Split(',').ToList(); textBox.Text = string.Join(",", Tags); textBox.Flash(GUI.Style.Green); textBox.Deselect(); return(true); }
private bool EnterIDCardTags(GUITextBox textBox, string text) { IdCardTags = text.Split(','); textBox.Text = string.Join(",", IdCardTags); textBox.Flash(Color.Green); textBox.Deselect(); return(true); }
public static void Update(GameMain game, float deltaTime) { lock (queuedMessages) { while (queuedMessages.Count > 0) { AddMessage(queuedMessages.Dequeue()); } } if (activeQuestionText != null && (listBox.children.Count == 0 || listBox.children[listBox.children.Count - 1] != activeQuestionText)) { listBox.children.Remove(activeQuestionText); listBox.children.Add(activeQuestionText); } if (PlayerInput.KeyHit(Keys.F3)) { isOpen = !isOpen; if (isOpen) { textBox.Select(); AddToGUIUpdateList(); } else { GUIComponent.ForceMouseOn(null); textBox.Deselect(); } } if (isOpen) { frame.Update(deltaTime); Character.DisableControls = true; if (PlayerInput.KeyHit(Keys.Up)) { textBox.Text = SelectMessage(-1); } else if (PlayerInput.KeyHit(Keys.Down)) { textBox.Text = SelectMessage(1); } else if (PlayerInput.KeyHit(Keys.Tab)) { textBox.Text = AutoComplete(textBox.Text); } if (PlayerInput.KeyHit(Keys.Enter)) { ExecuteCommand(textBox.Text); textBox.Text = ""; } } }
private bool EnterIDCardTags(GUITextBox textBox, string text) { IdCardTags = text.Split(','); textBox.Text = text; textBox.Color = Color.Green; textBox.Deselect(); return(true); }
private bool EnterIDCardDesc(GUITextBox textBox, string text) { IdCardDesc = text; textBox.Text = text; textBox.Color = Color.Green; textBox.Deselect(); return(true); }
private IEnumerable <object> WaitForKeyPress(GUITextBox keyBox) { yield return(CoroutineStatus.Running); while (PlayerInput.LeftButtonHeld() || PlayerInput.LeftButtonClicked()) { //wait for the mouse to be released, so that we don't interpret clicking on the textbox as the keybinding yield return(CoroutineStatus.Running); } while (keyBox.Selected && PlayerInput.GetKeyboardState.GetPressedKeys().Length == 0 && !PlayerInput.LeftButtonClicked() && !PlayerInput.RightButtonClicked() && !PlayerInput.MidButtonClicked()) { if (Screen.Selected != GameMain.MainMenuScreen && !GUI.SettingsMenuOpen) { yield return(CoroutineStatus.Success); } yield return(CoroutineStatus.Running); } UnsavedSettings = true; int keyIndex = (int)keyBox.UserData; if (PlayerInput.LeftButtonClicked()) { keyMapping[keyIndex] = new KeyOrMouse(0); keyBox.Text = "Mouse1"; } else if (PlayerInput.RightButtonClicked()) { keyMapping[keyIndex] = new KeyOrMouse(1); keyBox.Text = "Mouse2"; } else if (PlayerInput.MidButtonClicked()) { keyMapping[keyIndex] = new KeyOrMouse(2); keyBox.Text = "Mouse3"; } else if (PlayerInput.GetKeyboardState.GetPressedKeys().Length > 0) { Keys key = PlayerInput.GetKeyboardState.GetPressedKeys()[0]; keyMapping[keyIndex] = new KeyOrMouse(key); keyBox.Text = key.ToString("G"); } else { yield return(CoroutineStatus.Success); } keyBox.Deselect(); yield return(CoroutineStatus.Success); }
private bool EnterAssignedJob(GUITextBox textBox, string text) { string trimmedName = text.ToLowerInvariant().Trim(); assignedJob = JobPrefab.List.Find(jp => jp.Name.ToLowerInvariant() == trimmedName); if (assignedJob != null && trimmedName != TextManager.Get("None").ToLowerInvariant()) { textBox.Color = Color.Green; textBox.Text = (assignedJob == null) ? TextManager.Get("None") : assignedJob.Name; } textBox.Deselect(); return(true); }
public static void Update(GameMain game, float deltaTime) { if (PlayerInput.KeyHit(Keys.F3)) { isOpen = !isOpen; if (isOpen) { textBox.Select(); AddToGUIUpdateList(); } else { GUIComponent.ForceMouseOn(null); textBox.Deselect(); } //keyboardDispatcher.Subscriber = (isOpen) ? textBox : null; } if (isOpen) { frame.Update(deltaTime); Character.DisableControls = true; if (PlayerInput.KeyHit(Keys.Up)) { SelectMessage(-1); } else if (PlayerInput.KeyHit(Keys.Down)) { SelectMessage(1); } //textBox.Update(deltaTime); if (PlayerInput.KeyDown(Keys.Enter) && textBox.Text != "") { ExecuteCommand(textBox.Text, game); textBox.Text = ""; //selectedIndex = messages.Count; } } }
private bool ChangeSubName(GUITextBox textBox, string text) { if (string.IsNullOrWhiteSpace(text)) { textBox.Flash(Color.Red); return(false); } if (Submarine.MainSub != null) { Submarine.MainSub.Name = text; } textBox.Deselect(); textBox.Text = text; textBox.Flash(Color.Green); return(true); }
private bool EnterProperty(GUITextBox textBox, string text) { textBox.Color = Color.DarkGreen; var objectProperty = textBox.UserData as ObjectProperty; if (objectProperty == null) { return(false); } object prevValue = objectProperty.GetValue(); textBox.Deselect(); if (objectProperty.TrySetValue(text)) { textBox.Text = text; if (GameMain.Server != null) { GameMain.Server.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.ChangeProperty, objectProperty }); } else if (GameMain.Client != null) { GameMain.Client.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.ChangeProperty, objectProperty }); } return(true); } else { if (prevValue != null) { textBox.Text = prevValue.ToString(); } return(false); } }
public GUINumberInput(RectTransform rectT, NumberType inputType, string style = "", Alignment textAlignment = Alignment.Center) : base(style, rectT) { LayoutGroup = new GUILayoutGroup(new RectTransform(Vector2.One, rectT), isHorizontal: true) { Stretch = true }; float relativeButtonAreaWidth = MathHelper.Clamp(Rect.Height / (float)Rect.Width, 0.1f, 0.5f); TextBox = new GUITextBox(new RectTransform(new Vector2(1.0f - relativeButtonAreaWidth, 1.0f), LayoutGroup.RectTransform), textAlignment: textAlignment, style: style) { ClampText = false, // For some reason the caret in the number inputs is dimmer than it should. // It should not be rendered behind anything, as I first suspected. // Therefore this hack. CaretColor = Color.White }; TextBox.OnTextChanged += TextChanged; var buttonArea = new GUIFrame(new RectTransform(new Vector2(relativeButtonAreaWidth, 1.0f), LayoutGroup.RectTransform, Anchor.CenterRight) { MinSize = new Point(Rect.Height, 0) }, style: null); PlusButton = new GUIButton(new RectTransform(new Vector2(1.0f, 0.5f), buttonArea.RectTransform), "+"); PlusButton.OnButtonDown += () => { pressedTimer = pressedDelay; return(true); }; PlusButton.OnClicked += (button, data) => { IncreaseValue(); return(true); }; PlusButton.OnPressed += () => { if (!IsPressedTimerRunning) { IncreaseValue(); } return(true); }; PlusButton.Visible = inputType == NumberType.Int; MinusButton = new GUIButton(new RectTransform(new Vector2(1.0f, 0.5f), buttonArea.RectTransform, Anchor.BottomRight), "-"); MinusButton.OnButtonDown += () => { pressedTimer = pressedDelay; return(true); }; MinusButton.OnClicked += (button, data) => { ReduceValue(); return(true); }; MinusButton.OnPressed += () => { if (!IsPressedTimerRunning) { ReduceValue(); } return(true); }; MinusButton.Visible = inputType == NumberType.Int; if (inputType == NumberType.Int) { UpdateText(); TextBox.OnEnterPressed += (txtBox, txt) => { UpdateText(); TextBox.Deselect(); return(true); }; TextBox.OnDeselected += (txtBox, key) => UpdateText(); } else if (inputType == NumberType.Float) { UpdateText(); TextBox.OnDeselected += (txtBox, key) => UpdateText(); TextBox.OnEnterPressed += (txtBox, txt) => { UpdateText(); TextBox.Deselect(); return(true); }; } InputType = inputType; switch (InputType) { case NumberType.Int: TextBox.textFilterFunction = text => new string(text.Where(c => char.IsNumber(c)).ToArray()); break; case NumberType.Float: TextBox.textFilterFunction = text => new string(text.Where(c => char.IsDigit(c) || c == '.' || c == '-').ToArray()); break; } LayoutGroup.Recalculate(); }
public LevelEditorScreen() { cam = new Camera() { MinZoom = 0.01f, MaxZoom = 1.0f }; leftPanel = new GUIFrame(new RectTransform(new Vector2(0.125f, 0.8f), Frame.RectTransform) { MinSize = new Point(150, 0) }); var paddedLeftPanel = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.95f), leftPanel.RectTransform, Anchor.CenterLeft) { RelativeOffset = new Vector2(0.02f, 0.0f) }) { Stretch = true, RelativeSpacing = 0.01f }; paramsList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.3f), paddedLeftPanel.RectTransform)); paramsList.OnSelected += (GUIComponent component, object obj) => { selectedParams = obj as LevelGenerationParams; editorContainer.ClearChildren(); SortLevelObjectsList(selectedParams); new SerializableEntityEditor(editorContainer.Content.RectTransform, selectedParams, false, true, elementHeight: 20); return(true); }; ruinParamsList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.2f), paddedLeftPanel.RectTransform)); ruinParamsList.OnSelected += (GUIComponent component, object obj) => { var ruinGenerationParams = obj as RuinGenerationParams; editorContainer.ClearChildren(); new SerializableEntityEditor(editorContainer.Content.RectTransform, ruinGenerationParams, false, true, elementHeight: 20); return(true); }; new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.createlevelobj")) { OnClicked = (btn, obj) => { Wizard.Instance.Create(); return(true); } }; lightingEnabled = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.025f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.lightingenabled")); cursorLightEnabled = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.025f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.cursorlightenabled")); new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.reloadtextures")) { OnClicked = (btn, obj) => { Level.Loaded?.ReloadTextures(); return(true); } }; new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("editor.saveall")) { OnClicked = (btn, obj) => { SerializeAll(); return(true); } }; rightPanel = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), Frame.RectTransform, Anchor.TopRight) { MinSize = new Point(450, 0) }); var paddedRightPanel = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.95f), rightPanel.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.02f, 0.0f) }) { Stretch = true, RelativeSpacing = 0.01f }; editorContainer = new GUIListBox(new RectTransform(new Vector2(1.0f, 1.0f), paddedRightPanel.RectTransform)); var seedContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.05f), paddedRightPanel.RectTransform), isHorizontal: true); new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), seedContainer.RectTransform), TextManager.Get("leveleditor.levelseed")); seedBox = new GUITextBox(new RectTransform(new Vector2(0.5f, 1.0f), seedContainer.RectTransform), ToolBox.RandomSeed(8)); new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedRightPanel.RectTransform), TextManager.Get("leveleditor.generate")) { OnClicked = (btn, obj) => { Submarine.Unload(); GameMain.LightManager.ClearLights(); Level.CreateRandom(seedBox.Text, generationParams: selectedParams).Generate(mirror: false); GameMain.LightManager.AddLight(pointerLightSource); cam.Position = new Vector2(Level.Loaded.Size.X / 2, Level.Loaded.Size.Y / 2); foreach (GUITextBlock param in paramsList.Content.Children) { param.TextColor = param.UserData == selectedParams ? GUI.Style.Green : param.Style.TextColor; } seedBox.Deselect(); return(true); } }; bottomPanel = new GUIFrame(new RectTransform(new Vector2(0.75f, 0.22f), Frame.RectTransform, Anchor.BottomLeft) { MaxSize = new Point(GameMain.GraphicsWidth - rightPanel.Rect.Width, 1000) }, style: "GUIFrameBottom"); levelObjectList = new GUIListBox(new RectTransform(new Vector2(0.99f, 0.85f), bottomPanel.RectTransform, Anchor.Center)) { UseGridLayout = true }; levelObjectList.OnSelected += (GUIComponent component, object obj) => { selectedLevelObject = obj as LevelObjectPrefab; CreateLevelObjectEditor(selectedLevelObject); return(true); }; spriteEditDoneButton = new GUIButton(new RectTransform(new Point(200, 30), anchor: Anchor.BottomRight) { AbsoluteOffset = new Point(20, 20) }, TextManager.Get("leveleditor.spriteeditdone")) { OnClicked = (btn, userdata) => { editingSprite = null; return(true); } }; topPanel = new GUIFrame(new RectTransform(new Point(400, 100), GUI.Canvas) { RelativeOffset = new Vector2(leftPanel.RectTransform.RelativeSize.X * 2, 0.0f) }, style: "GUIFrameTop"); }
public GUINumberInput(RectTransform rectT, NumberType inputType, string style = "", Alignment textAlignment = Alignment.Center) : base(style, rectT) { int buttonHeight = Rect.Height / 2; int margin = 2; Point buttonSize = new Point(buttonHeight - margin, buttonHeight - margin); TextBox = new GUITextBox(new RectTransform(new Point(Rect.Width, Rect.Height), rectT), textAlignment: textAlignment, style: style) { ClampText = false, // For some reason the caret in the number inputs is dimmer than it should. // It should not be rendered behind anything, as I first suspected. // Therefore this hack. CaretColor = Color.White }; TextBox.OnTextChanged += TextChanged; var buttonArea = new GUIFrame(new RectTransform(new Point(buttonSize.X, buttonSize.Y * 2), rectT, Anchor.CenterRight), style: null); PlusButton = new GUIButton(new RectTransform(buttonSize, buttonArea.RectTransform), "+"); PlusButton.OnButtonDown += () => { pressedTimer = pressedDelay; return(true); }; PlusButton.OnClicked += (button, data) => { if (inputType == NumberType.Int) { IntValue++; } else if (inputType == NumberType.Float) { FloatValue += Round(); } return(true); }; PlusButton.OnPressed += () => { if (!IsPressedTimerRunning) { if (inputType == NumberType.Int) { IntValue++; } else if (maxValueFloat.HasValue && minValueFloat.HasValue) { FloatValue += (MaxValueFloat.Value - minValueFloat.Value) / 100.0f; } } return(true); }; PlusButton.Visible = inputType == NumberType.Int; MinusButton = new GUIButton(new RectTransform(buttonSize, buttonArea.RectTransform, Anchor.BottomRight), "-"); MinusButton.OnButtonDown += () => { pressedTimer = pressedDelay; return(true); }; MinusButton.OnClicked += (button, data) => { if (inputType == NumberType.Int) { IntValue--; } else if (inputType == NumberType.Float) { FloatValue -= Round(); } return(true); }; MinusButton.OnPressed += () => { if (!IsPressedTimerRunning) { if (inputType == NumberType.Int) { IntValue--; } else if (maxValueFloat.HasValue && minValueFloat.HasValue) { FloatValue -= (MaxValueFloat.Value - minValueFloat.Value) / 100.0f; } } return(true); }; MinusButton.Visible = inputType == NumberType.Int; if (inputType == NumberType.Int) { UpdateText(); TextBox.OnEnterPressed += (txtBox, txt) => { UpdateText(); TextBox.Deselect(); return(true); }; TextBox.OnDeselected += (txtBox, key) => UpdateText(); } else if (inputType == NumberType.Float) { UpdateText(); TextBox.OnDeselected += (txtBox, key) => UpdateText(); TextBox.OnEnterPressed += (txtBox, txt) => { UpdateText(); TextBox.Deselect(); return(true); }; } InputType = inputType; switch (InputType) { case NumberType.Int: TextBox.textFilterFunction = text => new string(text.Where(c => char.IsNumber(c)).ToArray()); break; case NumberType.Float: TextBox.textFilterFunction = text => new string(text.Where(c => char.IsDigit(c) || c == '.' || c == '-').ToArray()); break; } }
public LevelEditorScreen() { cam = new Camera() { MinZoom = 0.01f, MaxZoom = 1.0f }; leftPanel = new GUIFrame(new RectTransform(new Vector2(0.125f, 0.8f), Frame.RectTransform) { MinSize = new Point(150, 0) }); var paddedLeftPanel = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.95f), leftPanel.RectTransform, Anchor.CenterLeft) { RelativeOffset = new Vector2(0.02f, 0.0f) }) { Stretch = true, RelativeSpacing = 0.01f }; paramsList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.3f), paddedLeftPanel.RectTransform)); paramsList.OnSelected += (GUIComponent component, object obj) => { selectedParams = obj as LevelGenerationParams; editorContainer.ClearChildren(); SortLevelObjectsList(selectedParams); new SerializableEntityEditor(editorContainer.Content.RectTransform, selectedParams, false, true, elementHeight: 20); return(true); }; var ruinTitle = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.ruinparams"), font: GUI.SubHeadingFont); ruinParamsList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.1f), paddedLeftPanel.RectTransform)); ruinParamsList.OnSelected += (GUIComponent component, object obj) => { var ruinGenerationParams = obj as RuinGenerationParams; editorContainer.ClearChildren(); new SerializableEntityEditor(editorContainer.Content.RectTransform, ruinGenerationParams, false, true, elementHeight: 20); return(true); }; var outpostTitle = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.outpostparams"), font: GUI.SubHeadingFont); GUITextBlock.AutoScaleAndNormalize(ruinTitle, outpostTitle); outpostParamsList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.2f), paddedLeftPanel.RectTransform)); outpostParamsList.OnSelected += (GUIComponent component, object obj) => { var outpostGenerationParams = obj as OutpostGenerationParams; editorContainer.ClearChildren(); var outpostParamsEditor = new SerializableEntityEditor(editorContainer.Content.RectTransform, outpostGenerationParams, false, true, elementHeight: 20); // location type ------------------------- var locationTypeGroup = new GUILayoutGroup(new RectTransform(new Point(editorContainer.Content.Rect.Width, 20)), isHorizontal: true, childAnchor: Anchor.CenterLeft) { Stretch = true }; new GUITextBlock(new RectTransform(new Vector2(0.5f, 1f), locationTypeGroup.RectTransform), TextManager.Get("outpostmoduleallowedlocationtypes"), textAlignment: Alignment.CenterLeft); HashSet <string> availableLocationTypes = new HashSet <string> { "any" }; foreach (LocationType locationType in LocationType.List) { availableLocationTypes.Add(locationType.Identifier); } var locationTypeDropDown = new GUIDropDown(new RectTransform(new Vector2(0.5f, 1f), locationTypeGroup.RectTransform), text: string.Join(", ", outpostGenerationParams.AllowedLocationTypes.Select(lt => TextManager.Capitalize(lt)) ?? "any".ToEnumerable()), selectMultiple: true); foreach (string locationType in availableLocationTypes) { locationTypeDropDown.AddItem(TextManager.Capitalize(locationType), locationType); if (outpostGenerationParams.AllowedLocationTypes.Contains(locationType)) { locationTypeDropDown.SelectItem(locationType); } } if (!outpostGenerationParams.AllowedLocationTypes.Any()) { locationTypeDropDown.SelectItem("any"); } locationTypeDropDown.OnSelected += (_, __) => { outpostGenerationParams.SetAllowedLocationTypes(locationTypeDropDown.SelectedDataMultiple.Cast <string>()); locationTypeDropDown.Text = ToolBox.LimitString(locationTypeDropDown.Text, locationTypeDropDown.Font, locationTypeDropDown.Rect.Width); return(true); }; locationTypeGroup.RectTransform.MinSize = new Point(locationTypeGroup.Rect.Width, locationTypeGroup.RectTransform.Children.Max(c => c.MinSize.Y)); outpostParamsEditor.AddCustomContent(locationTypeGroup, 100); // module count ------------------------- var moduleLabel = new GUITextBlock(new RectTransform(new Point(editorContainer.Content.Rect.Width, (int)(70 * GUI.Scale))), TextManager.Get("submarinetype.outpostmodules"), font: GUI.SubHeadingFont); outpostParamsEditor.AddCustomContent(moduleLabel, 100); foreach (KeyValuePair <string, int> moduleCount in outpostGenerationParams.ModuleCounts) { var moduleCountGroup = new GUILayoutGroup(new RectTransform(new Point(editorContainer.Content.Rect.Width, (int)(25 * GUI.Scale))), isHorizontal: true, childAnchor: Anchor.CenterLeft); new GUITextBlock(new RectTransform(new Vector2(0.5f, 1f), moduleCountGroup.RectTransform), TextManager.Capitalize(moduleCount.Key), textAlignment: Alignment.CenterLeft); new GUINumberInput(new RectTransform(new Vector2(0.5f, 1f), moduleCountGroup.RectTransform), GUINumberInput.NumberType.Int) { MinValueInt = 0, MaxValueInt = 100, IntValue = moduleCount.Value, OnValueChanged = (numInput) => { outpostGenerationParams.SetModuleCount(moduleCount.Key, numInput.IntValue); if (numInput.IntValue == 0) { outpostParamsList.Select(outpostParamsList.SelectedData); } } }; moduleCountGroup.RectTransform.MinSize = new Point(moduleCountGroup.Rect.Width, moduleCountGroup.RectTransform.Children.Max(c => c.MinSize.Y)); outpostParamsEditor.AddCustomContent(moduleCountGroup, 100); } // add module count ------------------------- var addModuleCountGroup = new GUILayoutGroup(new RectTransform(new Point(editorContainer.Content.Rect.Width, (int)(40 * GUI.Scale))), isHorizontal: true, childAnchor: Anchor.Center); HashSet <string> availableFlags = new HashSet <string>(); foreach (string flag in OutpostGenerationParams.Params.SelectMany(p => p.ModuleCounts.Select(m => m.Key))) { availableFlags.Add(flag); } foreach (var sub in SubmarineInfo.SavedSubmarines) { if (sub.OutpostModuleInfo == null) { continue; } foreach (string flag in sub.OutpostModuleInfo.ModuleFlags) { availableFlags.Add(flag); } } var moduleTypeDropDown = new GUIDropDown(new RectTransform(new Vector2(0.8f, 0.8f), addModuleCountGroup.RectTransform), text: TextManager.Get("leveleditor.addmoduletype")); foreach (string flag in availableFlags) { if (outpostGenerationParams.ModuleCounts.Any(mc => mc.Key.Equals(flag, StringComparison.OrdinalIgnoreCase))) { continue; } moduleTypeDropDown.AddItem(TextManager.Capitalize(flag), flag); } moduleTypeDropDown.OnSelected += (_, userdata) => { outpostGenerationParams.SetModuleCount(userdata as string, 1); outpostParamsList.Select(outpostParamsList.SelectedData); return(true); }; addModuleCountGroup.RectTransform.MinSize = new Point(addModuleCountGroup.Rect.Width, addModuleCountGroup.RectTransform.Children.Max(c => c.MinSize.Y)); outpostParamsEditor.AddCustomContent(addModuleCountGroup, 100); return(true); }; var createLevelObjButton = new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.createlevelobj")) { OnClicked = (btn, obj) => { Wizard.Instance.Create(); return(true); } }; GUITextBlock.AutoScaleAndNormalize(createLevelObjButton.TextBlock); lightingEnabled = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.025f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.lightingenabled")); cursorLightEnabled = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.025f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.cursorlightenabled")); new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("leveleditor.reloadtextures")) { OnClicked = (btn, obj) => { Level.Loaded?.ReloadTextures(); return(true); } }; new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedLeftPanel.RectTransform), TextManager.Get("editor.saveall")) { OnClicked = (btn, obj) => { SerializeAll(); return(true); } }; rightPanel = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), Frame.RectTransform, Anchor.TopRight) { MinSize = new Point(450, 0) }); var paddedRightPanel = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.95f), rightPanel.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.02f, 0.0f) }) { Stretch = true, RelativeSpacing = 0.01f }; editorContainer = new GUIListBox(new RectTransform(new Vector2(1.0f, 1.0f), paddedRightPanel.RectTransform)); var seedContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.05f), paddedRightPanel.RectTransform), isHorizontal: true); new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), seedContainer.RectTransform), TextManager.Get("leveleditor.levelseed")); seedBox = new GUITextBox(new RectTransform(new Vector2(0.5f, 1.0f), seedContainer.RectTransform), ToolBox.RandomSeed(8)); new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedRightPanel.RectTransform), TextManager.Get("leveleditor.generate")) { OnClicked = (btn, obj) => { Submarine.Unload(); GameMain.LightManager.ClearLights(); LevelData levelData = LevelData.CreateRandom(seedBox.Text, generationParams: selectedParams); levelData.ForceOutpostGenerationParams = outpostParamsList.SelectedData as OutpostGenerationParams; Level.Generate(levelData, mirror: false); GameMain.LightManager.AddLight(pointerLightSource); cam.Position = new Vector2(Level.Loaded.Size.X / 2, Level.Loaded.Size.Y / 2); foreach (GUITextBlock param in paramsList.Content.Children) { param.TextColor = param.UserData == selectedParams ? GUI.Style.Green : param.Style.TextColor; } seedBox.Deselect(); return(true); } }; new GUIButton(new RectTransform(new Vector2(1.0f, 0.05f), paddedRightPanel.RectTransform), TextManager.Get("leveleditor.test")) { OnClicked = (btn, obj) => { if (Level.Loaded?.LevelData == null) { return(false); } GameMain.GameScreen.Select(); var currEntities = Entity.GetEntities().ToList(); if (Submarine.MainSub != null) { var toRemove = Entity.GetEntities().Where(e => e.Submarine == Submarine.MainSub).ToList(); foreach (Entity ent in toRemove) { ent.Remove(); } Submarine.MainSub.Remove(); } //TODO: hacky workaround to check for wrecks and outposts, refactor SubmarineInfo and ContentType at some point var nonPlayerFiles = ContentPackage.GetFilesOfType(GameMain.Config.AllEnabledPackages, ContentType.Wreck).ToList(); nonPlayerFiles.AddRange(ContentPackage.GetFilesOfType(GameMain.Config.AllEnabledPackages, ContentType.Outpost)); nonPlayerFiles.AddRange(ContentPackage.GetFilesOfType(GameMain.Config.AllEnabledPackages, ContentType.OutpostModule)); SubmarineInfo subInfo = SubmarineInfo.SavedSubmarines.FirstOrDefault(s => s.Name.Equals(GameMain.Config.QuickStartSubmarineName, StringComparison.InvariantCultureIgnoreCase)); subInfo ??= SubmarineInfo.SavedSubmarines.GetRandom(s => s.IsPlayer && !s.HasTag(SubmarineTag.Shuttle) && !nonPlayerFiles.Any(f => f.Path.CleanUpPath().Equals(s.FilePath.CleanUpPath(), StringComparison.InvariantCultureIgnoreCase))); GameSession gameSession = new GameSession(subInfo, "", GameModePreset.TestMode, null); gameSession.StartRound(Level.Loaded.LevelData); (gameSession.GameMode as TestGameMode).OnRoundEnd = () => { GameMain.LevelEditorScreen.Select(); Submarine.MainSub.Remove(); var toRemove = Entity.GetEntities().Where(e => !currEntities.Contains(e)).ToList(); foreach (Entity ent in toRemove) { ent.Remove(); } Submarine.MainSub = null; }; GameMain.GameSession = gameSession; return(true); } }; bottomPanel = new GUIFrame(new RectTransform(new Vector2(0.75f, 0.22f), Frame.RectTransform, Anchor.BottomLeft) { MaxSize = new Point(GameMain.GraphicsWidth - rightPanel.Rect.Width, 1000) }, style: "GUIFrameBottom"); levelObjectList = new GUIListBox(new RectTransform(new Vector2(0.99f, 0.85f), bottomPanel.RectTransform, Anchor.Center)) { UseGridLayout = true }; levelObjectList.OnSelected += (GUIComponent component, object obj) => { selectedLevelObject = obj as LevelObjectPrefab; CreateLevelObjectEditor(selectedLevelObject); return(true); }; spriteEditDoneButton = new GUIButton(new RectTransform(new Point(200, 30), anchor: Anchor.BottomRight) { AbsoluteOffset = new Point(20, 20) }, TextManager.Get("leveleditor.spriteeditdone")) { OnClicked = (btn, userdata) => { editingSprite = null; return(true); } }; topPanel = new GUIFrame(new RectTransform(new Point(400, 100), GUI.Canvas) { RelativeOffset = new Vector2(leftPanel.RectTransform.RelativeSize.X * 2, 0.0f) }, style: "GUIFrameTop"); }
public static void Update(GameMain game, float deltaTime) { lock (queuedMessages) { while (queuedMessages.Count > 0) { var newMsg = queuedMessages.Dequeue(); AddMessage(newMsg); if (GameSettings.SaveDebugConsoleLogs) { unsavedMessages.Add(newMsg); if (unsavedMessages.Count >= messagesPerFile) { SaveLogs(); unsavedMessages.Clear(); } } } } activeQuestionText?.SetAsLastChild(); if (PlayerInput.KeyHit(Keys.F3)) { isOpen = !isOpen; if (isOpen) { textBox.Select(); AddToGUIUpdateList(); } else { GUI.ForceMouseOn(null); textBox.Deselect(); } } if (isOpen) { frame.UpdateManually(deltaTime); Character.DisableControls = true; if (PlayerInput.KeyHit(Keys.Up)) { textBox.Text = SelectMessage(-1, textBox.Text); } else if (PlayerInput.KeyHit(Keys.Down)) { textBox.Text = SelectMessage(1, textBox.Text); } else if (PlayerInput.KeyHit(Keys.Tab)) { textBox.Text = AutoComplete(textBox.Text); } if (PlayerInput.KeyHit(Keys.Enter)) { ExecuteCommand(textBox.Text); textBox.Text = ""; } } }