diff --git a/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs b/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs index e0883ab83..d5373948f 100644 --- a/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs +++ b/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs @@ -1,4 +1,5 @@ using Barotrauma.Items.Components; +using FarseerPhysics; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; @@ -17,7 +18,7 @@ namespace Barotrauma.Tutorials public override IEnumerable UpdateState() { - //Submarine.Loaded.SetPosition(new Vector2(Submarine.Loaded.Position.X, 38500.0f)); + Submarine.Loaded.SetPosition(new Vector2(Submarine.Loaded.Position.X, 38500.0f)); //spawn some fish next to the player GameMain.GameScreen.BackgroundCreatureManager.SpawnSprites(2, @@ -275,7 +276,7 @@ namespace Barotrauma.Tutorials infoBox = CreateInfoFrame("Steer the submarine downwards, heading further into the cavern."); - while (Submarine.Loaded.WorldPosition.Y > 39000.0f) + while (Submarine.Loaded.WorldPosition.Y > 25000.0f) { yield return CoroutineStatus.Running; } @@ -449,6 +450,8 @@ namespace Barotrauma.Tutorials yield return CoroutineStatus.Running; } + moloch.AnimController.SetPosition(ConvertUnits.ToSimUnits(Character.Controlled.WorldPosition + Vector2.UnitY*1000.0f)); + infoBox = CreateInfoFrame("Now we're ready to shoot! Select the railgun controller."); while (Character.Controlled.SelectedConstruction == null || Character.Controlled.SelectedConstruction.Name != "Railgun Controller") diff --git a/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs b/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs index 4c1811280..4754708c9 100644 --- a/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs +++ b/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs @@ -42,7 +42,7 @@ namespace Barotrauma.Tutorials GameMain.GameSession = new GameSession(Submarine.Loaded, "", GameModePreset.list.Find(gm => gm.Name.ToLower() == "tutorial")); (GameMain.GameSession.gameMode as TutorialMode).tutorialType = this; - GameMain.GameSession.StartShift("tutorial"); + GameMain.GameSession.StartShift("tuto1"); GameMain.GameSession.TaskManager.Tasks.Clear(); diff --git a/Subsurface/Source/Items/Components/Signal/AndComponent.cs b/Subsurface/Source/Items/Components/Signal/AndComponent.cs index eba73b42b..4795de333 100644 --- a/Subsurface/Source/Items/Components/Signal/AndComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/AndComponent.cs @@ -13,7 +13,7 @@ namespace Barotrauma.Items.Components //the output is sent if both inputs have received a signal within the timeframe protected float timeFrame; - [InGameEditable, HasDefaultValue(0.1f, true)] + [InGameEditable, HasDefaultValue(0.0f, true)] public float TimeFrame { get { return timeFrame; } @@ -33,7 +33,7 @@ namespace Barotrauma.Items.Components public AndComponent(Item item, XElement element) : base (item, element) { - timeSinceReceived = new float[] { timeFrame*2.0f, timeFrame*2.0f}; + timeSinceReceived = new float[] { Math.Max(timeFrame*2.0f,0.1f), Math.Max(timeFrame*2.0f, 0.1f) }; //output = "1"; } diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 6e5831beb..6ac42ffad 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -328,7 +328,7 @@ namespace Barotrauma.Items.Components //nodes.Add(newNodePos); } - if (!editing || !PlayerInput.MouseInsideWindow || GameMain.EditMapScreen.CharacterMode) return; + if (!editing || !PlayerInput.MouseInsideWindow || !GameMain.EditMapScreen.WiringMode ) return; for (int i = 0; i < Nodes.Count; i++) { @@ -371,7 +371,6 @@ namespace Barotrauma.Items.Components { if (selectedNodeIndex != null && draggingWire == this) { - MapEntity.DisableSelect = true; //Nodes[(int)selectedNodeIndex] = GameMain.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition)-Submarine.HiddenSubPosition+Submarine.Loaded.Position; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index e5447f09b..82399fae4 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -86,6 +86,14 @@ namespace Barotrauma private set; } + public override bool SelectableInEditor + { + get + { + return ParentInventory == null && (body == null || !body.Enabled); + } + } + public List FixRequirements; public override string Name diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index 5b24d7b07..34e8df21a 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -30,7 +30,6 @@ namespace Barotrauma private float higherSurface; private float lowerSurface; - public float Open { get { return open; } @@ -73,6 +72,14 @@ namespace Barotrauma } } + public override bool SelectableInEditor + { + get + { + return ShowGaps; + } + } + public Gap(MapEntityPrefab prefab, Rectangle rectangle) : this (rectangle, Submarine.Loaded) { } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index dd6192653..f2f811137 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -90,6 +90,14 @@ namespace Barotrauma } } + public override bool SelectableInEditor + { + get + { + return ShowHulls; + } + } + public override bool IsLinkable { get { return true; } diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index 12713e97f..250b51729 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -92,6 +92,11 @@ namespace Barotrauma get { return false; } } + public virtual bool SelectableInEditor + { + get { return true; } + } + public override Vector2 Position { get @@ -288,9 +293,12 @@ namespace Barotrauma foreach (MapEntity e in mapEntityList) { + if (!e.SelectableInEditor) continue; + if (highLightedEntity == null || e.Sprite == null || (highLightedEntity.Sprite!=null && e.Sprite.Depth < highLightedEntity.Sprite.Depth)) { + if (e.IsMouseOn(position)) highLightedEntity = e; } e.isSelected = false; @@ -315,8 +323,7 @@ namespace Barotrauma if (moveAmount != Vector2.Zero) { - foreach (MapEntity e in selectedList) - e.Move(moveAmount); + foreach (MapEntity e in selectedList) e.Move(moveAmount); } startMovingPos = Vector2.Zero; @@ -584,8 +591,9 @@ namespace Barotrauma foreach (MapEntity e in mapEntityList) { - if (Submarine.RectsOverlap(selectionRect, e.rect)) - foundEntities.Add(e); + if (!e.SelectableInEditor) continue; + + if (Submarine.RectsOverlap(selectionRect, e.rect)) foundEntities.Add(e); } return foundEntities; diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index d8f987b4d..96ede1c5f 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -2,6 +2,7 @@ using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -28,6 +29,9 @@ namespace Barotrauma private bool characterMode; + private bool wiringMode; + private GUIFrame wiringToolPanel; + private Tutorials.EditorTutorial tutorial; public Camera Cam @@ -65,6 +69,11 @@ namespace Barotrauma get { return characterMode; } } + public bool WiringMode + { + get { return wiringMode; } + } + public EditMapScreen() { @@ -176,6 +185,11 @@ namespace Barotrauma button = new GUIButton(new Rectangle(0, y, 0, 20), "Character mode", Alignment.Left, GUI.Style, leftPanel); button.ToolTip = "Allows you to pick up and use items. Useful for things such as placing items inside closets, turning devices on/off and doing the wiring."; button.OnClicked = ToggleCharacterMode; + + y += 35; + button = new GUIButton(new Rectangle(0, y, 0, 20), "Wiring mode", Alignment.Left, GUI.Style, leftPanel); + //button.ToolTip = "Allows you to pick up and use items. Useful for things such as placing items inside closets, turning devices on/off and doing the wiring."; + button.OnClicked = ToggleWiringMode; y+=50; button = new GUIButton(new Rectangle(0, y, 0, 20), "Generate waypoints", Alignment.Left, GUI.Style, leftPanel); @@ -252,6 +266,10 @@ namespace Barotrauma MapEntityPrefab.Selected = null; + if (characterMode) ToggleCharacterMode(); + + if (wiringMode) ToggleWiringMode(); + if (dummyCharacter != null) { dummyCharacter.Remove(); @@ -444,6 +462,84 @@ namespace Barotrauma return true; } + private void ToggleWiringMode() + { + ToggleWiringMode(null, null); + } + + private bool ToggleWiringMode(GUIButton button, object obj) + { + wiringMode = !wiringMode; + + if (characterMode != wiringMode) ToggleCharacterMode(); + + if (wiringMode) + { + var screwdriverPrefab = ItemPrefab.list.Find(ip => ip.Name == "Screwdriver") as ItemPrefab; + + var item = new Item(screwdriverPrefab, Vector2.Zero, null); + + dummyCharacter.Inventory.TryPutItem(item, new List() { LimbSlot.RightHand }, false); + + wiringToolPanel = CreateWiringPanel(); + } + + return true; + } + + private GUIFrame CreateWiringPanel() + { + GUIFrame frame = new GUIFrame(new Rectangle(0,0,50,300), null, Alignment.Right | Alignment.CenterY, GUI.Style); + frame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); + + GUIListBox listBox = new GUIListBox(Rectangle.Empty, GUI.Style, frame); + listBox.OnSelected = SelectWire; + + foreach (MapEntityPrefab ep in MapEntityPrefab.list) + { + var itemPrefab = ep as ItemPrefab; + if (itemPrefab == null || itemPrefab.Name == null || !itemPrefab.Name.Contains("Wire")) continue; + + GUIFrame imgFrame = new GUIFrame(new Rectangle(0, 0, (int)itemPrefab.sprite.size.X, (int)itemPrefab.sprite.size.Y), null, listBox); + imgFrame.UserData = itemPrefab; + imgFrame.HoverColor = Color.White * 0.5f; + imgFrame.SelectedColor = Color.Gold * 0.7f; + + var img = new GUIImage(new Rectangle(0, 0, (int)itemPrefab.sprite.size.X, (int)itemPrefab.sprite.size.Y), itemPrefab.sprite, Alignment.TopLeft, imgFrame); + img.Color = ep.SpriteColor; + } + + return frame; + } + + private bool SelectWire(GUIComponent component, object userData) + { + if (dummyCharacter == null) return false; + + Item existingWire = dummyCharacter.SelectedItems.FirstOrDefault(i => i != null && i.Prefab == userData as ItemPrefab); + if (existingWire!=null) + { + existingWire.Drop(); + existingWire.Remove(); + return false; + } + + var wire = new Item(userData as ItemPrefab, Vector2.Zero, null); + + + int slotIndex = dummyCharacter.Inventory.FindLimbSlot(LimbSlot.LeftHand); + if (dummyCharacter.Inventory.Items[slotIndex] != null && dummyCharacter.Inventory.Items[slotIndex].Prefab != userData as ItemPrefab) + { + dummyCharacter.Inventory.Items[slotIndex].Drop(); + dummyCharacter.Inventory.Items[slotIndex].Remove(); + } + + dummyCharacter.Inventory.TryPutItem(wire, slotIndex, false, false); + + return true; + + } + private bool ChangeSubName(GUITextBox textBox, string text) { if (string.IsNullOrWhiteSpace(text)) @@ -528,7 +624,7 @@ namespace Barotrauma if (characterMode) { - if (dummyCharacter == null || Entity.FindEntityByID(dummyCharacter.ID)!=dummyCharacter) + if (dummyCharacter == null || Entity.FindEntityByID(dummyCharacter.ID) != dummyCharacter) { ToggleCharacterMode(null, null); } @@ -551,6 +647,7 @@ namespace Barotrauma dummyCharacter.ControlLocalPlayer((float)deltaTime, cam, false); dummyCharacter.Control((float)deltaTime, cam); cam.TargetPos = Vector2.Zero; + } } else @@ -564,6 +661,15 @@ namespace Barotrauma leftPanel.Update((float)deltaTime); topPanel.Update((float)deltaTime); + if (wiringMode) + { + if (!dummyCharacter.SelectedItems.Any(it => it.HasTag("Wire"))) + { + wiringToolPanel.GetChild().Deselect(); + } + wiringToolPanel.Update((float)deltaTime); + } + if (loadFrame!=null) { loadFrame.Update((float)deltaTime); @@ -617,38 +723,33 @@ namespace Barotrauma //EntityPrefab.DrawList(spriteBatch, new Vector2(20,50)); - if (characterMode) - { - if (dummyCharacter != null) + if (characterMode && dummyCharacter != null) + { + dummyCharacter.AnimController.FindHull(dummyCharacter.CursorWorldPosition, false); + + foreach (Item item in dummyCharacter.SelectedItems) { - dummyCharacter.AnimController.FindHull(dummyCharacter.CursorWorldPosition, false); + if (item == null) continue; + item.SetTransform(dummyCharacter.SimPosition, 0.0f); - foreach (Item item in dummyCharacter.SelectedItems) - { - if (item == null) continue; - item.SetTransform(dummyCharacter.SimPosition, 0.0f); - - item.Update(cam, (float)deltaTime); - } - - if (dummyCharacter.SelectedConstruction != null) - { - //if (dummyCharacter.SelectedConstruction == dummyCharacter.ClosestItem) - //{ - dummyCharacter.SelectedConstruction.DrawHUD(spriteBatch, dummyCharacter); - - //} - //else - //{ - // dummyCharacter.SelectedConstruction = null; - //} - - if (PlayerInput.KeyHit(InputType.Select) && dummyCharacter.ClosestItem != dummyCharacter.SelectedConstruction) dummyCharacter.SelectedConstruction = null; - } + item.Update(cam, (float)deltaTime); } - dummyCharacter.DrawHUD(spriteBatch, cam); + if (dummyCharacter.SelectedConstruction != null) + { + dummyCharacter.SelectedConstruction.DrawHUD(spriteBatch, dummyCharacter); + if (PlayerInput.KeyHit(InputType.Select) && dummyCharacter.ClosestItem != dummyCharacter.SelectedConstruction) dummyCharacter.SelectedConstruction = null; + } + + if (!wiringMode) + { + dummyCharacter.DrawHUD(spriteBatch, cam); + } + else + { + wiringToolPanel.Draw(spriteBatch); + } } else {