diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 65b99f715..539ce7732 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -98,6 +98,7 @@ + diff --git a/Subsurface/Content/Characters/Endworm/endworm.xml b/Subsurface/Content/Characters/Endworm/endworm.xml index a944deec0..5e66c463a 100644 --- a/Subsurface/Content/Characters/Endworm/endworm.xml +++ b/Subsurface/Content/Characters/Endworm/endworm.xml @@ -44,12 +44,12 @@ - + - + @@ -71,12 +71,8 @@ - - - -s - + diff --git a/Subsurface/Content/Characters/Endworm/endwormattack1.ogg b/Subsurface/Content/Characters/Endworm/endwormattack1.ogg index 317844df9..2b052bcb5 100644 Binary files a/Subsurface/Content/Characters/Endworm/endwormattack1.ogg and b/Subsurface/Content/Characters/Endworm/endwormattack1.ogg differ diff --git a/Subsurface/Content/Characters/Endworm/endwormattack2.ogg b/Subsurface/Content/Characters/Endworm/endwormattack2.ogg index 3ca5def8d..dcc973b2a 100644 Binary files a/Subsurface/Content/Characters/Endworm/endwormattack2.ogg and b/Subsurface/Content/Characters/Endworm/endwormattack2.ogg differ diff --git a/Subsurface/Content/Characters/Endworm/endwormidle.ogg b/Subsurface/Content/Characters/Endworm/endwormidle.ogg index 26fb8b15b..122f6710a 100644 Binary files a/Subsurface/Content/Characters/Endworm/endwormidle.ogg and b/Subsurface/Content/Characters/Endworm/endwormidle.ogg differ diff --git a/Subsurface/Content/Items/Artifacts/artifacts.xml b/Subsurface/Content/Items/Artifacts/artifacts.xml index 0ad75c764..4936b5054 100644 --- a/Subsurface/Content/Items/Artifacts/artifacts.xml +++ b/Subsurface/Content/Items/Artifacts/artifacts.xml @@ -39,5 +39,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Subsurface/Content/Items/Fabricators/fabricators.xml b/Subsurface/Content/Items/Fabricators/fabricators.xml index 79c7ce3f2..1cc85e0c8 100644 --- a/Subsurface/Content/Items/Fabricators/fabricators.xml +++ b/Subsurface/Content/Items/Fabricators/fabricators.xml @@ -31,6 +31,10 @@ + + + + diff --git a/Subsurface/Content/Items/Reactor/reactor.xml b/Subsurface/Content/Items/Reactor/reactor.xml index 4c87759f6..bd28a2b82 100644 --- a/Subsurface/Content/Items/Reactor/reactor.xml +++ b/Subsurface/Content/Items/Reactor/reactor.xml @@ -23,7 +23,6 @@ - @@ -45,6 +44,7 @@ + diff --git a/Subsurface/Content/Items/Weapons/weapons.xml b/Subsurface/Content/Items/Weapons/weapons.xml index 3fbace3ac..2af647f1b 100644 --- a/Subsurface/Content/Items/Weapons/weapons.xml +++ b/Subsurface/Content/Items/Weapons/weapons.xml @@ -89,11 +89,16 @@ - + + + + + + @@ -111,6 +116,20 @@ + + + + + + + + + diff --git a/Subsurface/Content/randomevents.xml b/Subsurface/Content/randomevents.xml index 660868cdb..e71685a70 100644 --- a/Subsurface/Content/randomevents.xml +++ b/Subsurface/Content/randomevents.xml @@ -41,5 +41,26 @@ difficulty="5" minamount="1" maxamount="1" musictype="deep"/> + + + + + + + + \ No newline at end of file diff --git a/Subsurface/Source/Characters/AI/EnemyAIController.cs b/Subsurface/Source/Characters/AI/EnemyAIController.cs index 5de5c063b..071b31981 100644 --- a/Subsurface/Source/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Source/Characters/AI/EnemyAIController.cs @@ -143,7 +143,6 @@ namespace Barotrauma private void UpdateNone(float deltaTime) { //wander around randomly - //UpdateSteeringWander(deltaTime, 0.8f); steeringManager.SteeringWander(0.8f); steeringManager.SteeringAvoid(deltaTime, 1.0f); @@ -328,9 +327,12 @@ namespace Barotrauma attackTimer += deltaTime; limb.body.ApplyTorque(limb.Mass * 50.0f * Character.AnimController.Dir * dir); - limb.attack.DoDamage(Character, damageTarget, limb.WorldPosition, deltaTime, (limb.soundTimer <= 0.0f)); + if (attackTimer >= limb.attack.Duration) + { + limb.attack.DoDamage(Character, damageTarget, limb.WorldPosition, 1.0f, (limb.soundTimer <= 0.0f)); - limb.soundTimer = Limb.SoundInterval; + limb.soundTimer = Limb.SoundInterval; + } } Vector2 diff = attackPosition - limb.SimPosition; diff --git a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs index 9ca539095..69a47ee4d 100644 --- a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs @@ -96,6 +96,17 @@ namespace Barotrauma { if (currentPath == null) return Vector2.Zero; + if (currentPath.CurrentIndex == currentPath.Nodes.Count) + { + + Vector2 pos2 = host.SimPosition; + if (character != null && character.Submarine == null) + { + pos2 -= Submarine.Loaded.SimPosition; + } + return currentTarget-pos2; + } + if (canOpenDoors) CheckDoorsInPath(); float allowedDistance = character.AnimController.InWater ? 1.0f : 0.6f; diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs index 29ab15d4e..2c5064c88 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs @@ -149,7 +149,10 @@ namespace Barotrauma if (divingGearObjective != null) { divingGearObjective.TryComplete(deltaTime); - return divingGearObjective.IsCompleted(); + + bool isCompleted = divingGearObjective.IsCompleted(); + if (isCompleted) divingGearObjective = null; + return isCompleted; } return false; @@ -165,6 +168,10 @@ namespace Barotrauma if (character.AnimController.CurrentHull == null) return 0.0f; currenthullSafety = GetHullSafety(character.AnimController.CurrentHull); priority = 100.0f - currenthullSafety; + + + if (divingGearObjective != null && !divingGearObjective.IsCompleted()) priority += 20.0f; + return priority; } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs index 6099605ee..7106ccf27 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs @@ -25,10 +25,12 @@ namespace Barotrauma public override float GetPriority(Character character) { - float leakSize = (leak.isHorizontal ? leak.Rect.Height : leak.Rect.Width) * leak.Open; + if (leak.Open == 0.0f) return 0.0f; + + float leakSize = (leak.isHorizontal ? leak.Rect.Height : leak.Rect.Width) * Math.Max(leak.Open, 0.1f); float dist = Vector2.DistanceSquared(character.SimPosition, leak.SimPosition); - dist = Math.Max(dist/1000.0f, 1.0f); + dist = Math.Max(dist/100.0f, 1.0f); return Math.Min(leakSize/dist, 40.0f); } @@ -69,7 +71,7 @@ namespace Barotrauma { var repairTool = weldingTool.GetComponent(); if (repairTool == null) return; - AddSubObjective(new AIObjectiveOperateItem(repairTool, character, "")); + AddSubObjective(new AIObjectiveOperateItem(repairTool, character, "", leak)); } } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs index 666c8c1a9..aa7f8210c 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -46,7 +46,7 @@ namespace Barotrauma this.equip = equip; currSearchIndex = 0; - + this.itemName = itemName; } @@ -136,7 +136,18 @@ namespace Barotrauma public override bool IsCompleted() { - return character.Inventory.FindItem(itemName) != null; + if (itemName!=null) + { + return character.Inventory.FindItem(itemName) != null; + } + else if (targetItem!= null) + { + return character.Inventory.Items.Contains(targetItem); + } + else + { + return false; + } } } } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index 39a40396f..e2cc46235 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -16,18 +16,18 @@ namespace Barotrauma bool repeat; + //how long until the path to the target is declared unreachable + private float waitUntilPathUnreachable; + public override bool CanBeCompleted { get { - if (repeat) return true; + if (repeat || waitUntilPathUnreachable > 0.0f) return true; var pathSteering = character.AIController.SteeringManager as IndoorsSteeringManager; //path doesn't exist (= hasn't been searched for yet), assume for now that the target is reachable if (pathSteering.CurrentPath == null) return true; - //steeringmanager is still targeting some other position, assume for now that the target is reachable - if ((target != null && Vector2.Distance(target.Position, targetPos) > 5.0f) || - Vector2.Distance(pathSteering.CurrentTarget, targetPos) > 5.0f) return true; return (!pathSteering.CurrentPath.Unreachable); } @@ -43,6 +43,8 @@ namespace Barotrauma { this.target = target; this.repeat = repeat; + + waitUntilPathUnreachable = 5.0f; } @@ -51,17 +53,20 @@ namespace Barotrauma { this.targetPos = simPos; this.repeat = repeat; + + waitUntilPathUnreachable = 5.0f; } protected override void Act(float deltaTime) - { + { + waitUntilPathUnreachable -= deltaTime; + if (character.SelectedConstruction!=null && character.SelectedConstruction.GetComponent()==null) { character.SelectedConstruction = null; } - if (target!=null) character.AIController.SelectTarget(target.AiTarget); - + if (target != null) character.AIController.SelectTarget(target.AiTarget); Vector2 currTargetPos = Vector2.Zero; diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveIdle.cs index 5f3f9b724..b6342db9c 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveIdle.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveIdle.cs @@ -71,8 +71,15 @@ namespace Barotrauma } } + if (character.AnimController.InWater) + { + character.AIController.SteeringManager.SteeringManual(deltaTime, new Vector2(0.0f, 0.5f)); + } + else + { + character.AIController.SteeringManager.SteeringWander(); + } - character.AIController.SteeringManager.SteeringWander(1.0f); return; } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveManager.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveManager.cs index c648355c8..13d3190a4 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveManager.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveManager.cs @@ -57,7 +57,7 @@ namespace Barotrauma foreach (Gap gap in Gap.GapList) { - if (gap.IsRoomToRoom || gap.ConnectedDoor != null || gap.Open<0.1f) continue; + if (gap.IsRoomToRoom || gap.ConnectedDoor != null || gap.Open<0.01f) continue; AddObjective(new AIObjectiveFixLeak(gap, character)); } diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 1ff0a31d0..3a5e7699a 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -429,13 +429,13 @@ namespace Barotrauma pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)pos.Y, 5, 5), Color.Red, true, 0.01f); - if (limb.AnimTargetPos == Vector2.Zero) continue; + //if (limb.AnimTargetPos == Vector2.Zero) continue; - Vector2 pos2 = ConvertUnits.ToDisplayUnits(limb.AnimTargetPos); - pos2.Y = -pos2.Y; - GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos2.X, (int)pos2.Y, 5, 5), Color.Blue, true, 0.01f); + //Vector2 pos2 = ConvertUnits.ToDisplayUnits(limb.AnimTargetPos); + //pos2.Y = -pos2.Y; + //GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos2.X, (int)pos2.Y, 5, 5), Color.Blue, true, 0.01f); - GUI.DrawLine(spriteBatch, pos, pos2, Color.Green); + //GUI.DrawLine(spriteBatch, pos, pos2, Color.Green); } } @@ -456,7 +456,7 @@ namespace Barotrauma pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - 10, (int)pos.Y - 10, 20, 20), Color.Cyan, false, 0.01f); - GUI.DrawLine(spriteBatch, pos, new Vector2(limb.Position.X, -limb.Position.Y), limb==RefLimb ? Color.Orange : Color.Cyan); + GUI.DrawLine(spriteBatch, pos, new Vector2(limb.Position.X, -limb.Position.Y), limb == RefLimb ? Color.Orange : Color.Cyan); } } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 0e4a1fe1b..db40f3d36 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1044,7 +1044,7 @@ namespace Barotrauma if (soundStates[i] != state) continue; if (n == selectedSound && sounds[i]!=null) { - sounds[i].Play(1.0f, 2000.0f, AnimController.Limbs[0].WorldPosition); + sounds[i].Play(1.0f, soundRange[i], AnimController.Limbs[0].WorldPosition); return; } n++; diff --git a/Subsurface/Source/Events/ArtifactEvent.cs b/Subsurface/Source/Events/ArtifactEvent.cs new file mode 100644 index 000000000..b441c6ea6 --- /dev/null +++ b/Subsurface/Source/Events/ArtifactEvent.cs @@ -0,0 +1,66 @@ +using FarseerPhysics; +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Linq; + +namespace Barotrauma +{ + class ArtifactEvent : ScriptedEvent + { + private ItemPrefab itemPrefab; + + private Item item; + + private int state; + + public ArtifactEvent(XElement element) + : base(element) + { + string itemName = ToolBox.GetAttributeString(element, "itemname", ""); + + itemPrefab = ItemPrefab.list.Find(ip => ip.Name == itemName) as ItemPrefab; + + if (itemPrefab == null) + { + DebugConsole.ThrowError("Error in SalvageMission: couldn't find an item prefab with the name "+itemName); + } + } + + protected override void Start() + { + Vector2 position = Level.Loaded.GetRandomItemPos(30.0f); + + item = new Item(itemPrefab, position, null); + item.MoveWithLevel = true; + item.body.FarseerBody.IsKinematic = true; + } + + public override void Update(float deltaTime) + { + switch (state) + { + case 0: + Start(); + state = 1; + break; + case 1: + + //item.body.LinearVelocity = Vector2.Zero; + if (item.Inventory!=null) item.body.FarseerBody.IsKinematic = false; + if (item.CurrentHull == null) return; + + state = 2; + break; + case 2: + if (!Submarine.Loaded.AtEndPosition && !Submarine.Loaded.AtStartPosition) return; + + Finished(); + state = 3; + break; + } + } + } +} diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index e4b8f1bd9..259f2555d 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -37,10 +37,8 @@ namespace Barotrauma { Vector2 position = (randomWayPoint == null) ? Vector2.Zero : randomWayPoint.Position; - //!!!!!!!!!!!!!!!!!! if (spawnDeep) { - position.Y -= Level.Loaded.Size.Y; } @@ -70,8 +68,8 @@ namespace Barotrauma monstersDead = false; break; } - if (monstersDead) Finished(); - + + if (monstersDead) Finished(); } } } diff --git a/Subsurface/Source/Events/Quests/SalvageQuest.cs b/Subsurface/Source/Events/Quests/SalvageQuest.cs index 51d89cf42..08878b26c 100644 --- a/Subsurface/Source/Events/Quests/SalvageQuest.cs +++ b/Subsurface/Source/Events/Quests/SalvageQuest.cs @@ -39,36 +39,11 @@ namespace Barotrauma public override void Start(Level level) { - Vector2 position = Vector2.Zero; - - int tries = 0; - do - { - Vector2 tryPos = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)]; - - if (Submarine.PickBody( - ConvertUnits.ToSimUnits(tryPos), - ConvertUnits.ToSimUnits(tryPos - Vector2.UnitY*level.Size.Y), - null, Physics.CollisionLevel) != null) - { - position = ConvertUnits.ToDisplayUnits(Submarine.LastPickedPosition); - break; - } - - tries++; - - if (tries==10) - { - position = level.EndPosition - Vector2.UnitY*300.0f; - } - - } while (tries < 10); - - + Vector2 position = Level.Loaded.GetRandomItemPos(30.0f); + item = new Item(itemPrefab, position, null); item.MoveWithLevel = true; item.body.FarseerBody.IsKinematic = true; - //item.MoveWithLevel = true; } public override void Update(float deltaTime) diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index 5fe798ac4..1d342fb0b 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -214,6 +214,8 @@ namespace Barotrauma.Items.Components Gap leak = objective.OperateTarget as Gap; if (leak == null) return true; + if (Vector2.Distance(leak.WorldPosition, item.WorldPosition) > range) return true; + character.CursorPosition = leak.Position; character.SetInput(InputType.Aim, false, true); diff --git a/Subsurface/Source/Items/Components/Machines/Fabricator.cs b/Subsurface/Source/Items/Components/Machines/Fabricator.cs index d4dfb6855..c12b51a2b 100644 --- a/Subsurface/Source/Items/Components/Machines/Fabricator.cs +++ b/Subsurface/Source/Items/Components/Machines/Fabricator.cs @@ -249,8 +249,11 @@ namespace Barotrauma.Items.Components foreach (Tuple ip in fabricatedItem.RequiredItems) { - var requiredItem = containers[0].Inventory.Items.FirstOrDefault(it => it != null && it.Prefab == ip.Item1); - containers[0].Inventory.RemoveItem(requiredItem); + for (int i = 0; i it != null && it.Prefab == ip.Item1); + containers[0].Inventory.RemoveItem(requiredItem); + } } Item.Spawner.QueueItem(fabricatedItem.TargetItem, containers[1].Inventory); @@ -268,7 +271,7 @@ namespace Barotrauma.Items.Components ItemContainer container = item.GetComponent(); foreach (Tuple ip in targetItem.RequiredItems) { - if (Array.FindAll(container.Inventory.Items, it => it != null && it.Prefab == ip.Item1).Count() < ip.Item2) continue; + if (Array.FindAll(container.Inventory.Items, it => it != null && it.Prefab == ip.Item1).Count() >= ip.Item2) continue; activateButton.Enabled = false; break; } @@ -276,15 +279,6 @@ namespace Barotrauma.Items.Components GuiFrame.Update((float)Physics.step); GuiFrame.Draw(spriteBatch); - - //itemList.Update(0.016f); - //itemList.Draw(spriteBatch); - - //if (selectedItemFrame != null) - //{ - // selectedItemFrame.Update(0.016f); - // selectedItemFrame.Draw(spriteBatch); - //} } public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message) diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index 1baec41b4..473684e99 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -9,14 +9,16 @@ namespace Barotrauma.Items.Components { class Pump : Powered { - float flowPercentage; - float maxFlow; + private float flowPercentage; + private float maxFlow; - float? targetLevel; + private float? targetLevel; - float lastUpdate; + private float lastUpdate; - Hull hull1; + private Hull hull1; + + private GUITickBox isActiveTickBox; [HasDefaultValue(0.0f, true)] public float FlowPercentage @@ -47,10 +49,53 @@ namespace Barotrauma.Items.Components } } + public override bool IsActive + { + get + { + return base.IsActive; + } + set + { + base.IsActive = value; + + if (isActiveTickBox != null) isActiveTickBox.Selected = value; + } + } + public Pump(Item item, XElement element) : base(item, element) { GetHull(); + + isActiveTickBox = new GUITickBox(new Rectangle(0, 0, 20, 20), "Running", Alignment.TopLeft, GuiFrame); + isActiveTickBox.OnSelected = (GUITickBox box) => + { + targetLevel = null; + IsActive = !IsActive; + if (!IsActive) currPowerConsumption = 0.0f; + item.NewComponentEvent(this, true, true); + + return true; + }; + + var button = new GUIButton(new Rectangle(160, 40, 35, 30), "OUT", GUI.Style, GuiFrame); + button.OnClicked = (GUIButton btn, object obj) => + { + FlowPercentage -= 10.0f; + item.NewComponentEvent(this, true, true); + + return true; + }; + + button = new GUIButton(new Rectangle(210, 40, 35, 30), "IN", GUI.Style, GuiFrame); + button.OnClicked = (GUIButton btn, object obj) => + { + FlowPercentage += 10.0f; + item.NewComponentEvent(this, true, true); + + return true; + }; } public override void Move(Vector2 amount) @@ -112,28 +157,11 @@ namespace Barotrauma.Items.Components int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; + GuiFrame.Update(1.0f / 60.0f); GuiFrame.Draw(spriteBatch); - - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 20, y + 20, 100, 40), ((IsActive) ? "TURN OFF" : "TURN ON"))) - { - targetLevel = null; - IsActive = !IsActive; - if (!IsActive) currPowerConsumption = 0.0f; - item.NewComponentEvent(this, true, true); - } - spriteBatch.DrawString(GUI.Font, "Pumping speed: " + (int)flowPercentage + " %", new Vector2(x + 20, y + 80), Color.White); - - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 200, y + 70, 40, 40), "OUT", false)) - { - FlowPercentage -= 10.0f; - item.NewComponentEvent(this, true, true); - } - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 70, 40, 40), "IN", false)) - { - FlowPercentage += 10.0f; - item.NewComponentEvent(this, true, true); - } + spriteBatch.DrawString(GUI.Font, "Pumping speed: " + (int)flowPercentage + " %", new Vector2(x + 40, y + 85), Color.White); + } public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f) diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 2ac5a2b3b..8ea54a446 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -52,6 +52,8 @@ namespace Barotrauma.Items.Components private PropertyTask powerUpTask; + private GUITickBox autoTempTickBox; + private bool unsentChanges; private float sendUpdateTimer; @@ -127,7 +129,11 @@ namespace Barotrauma.Items.Components public bool AutoTemp { get { return autoTemp; } - set { autoTemp = value; } + set + { + autoTemp = value; + if (autoTempTickBox!=null) autoTempTickBox.Selected = value; + } } public float ExtraCooling { get; set; } @@ -173,8 +179,8 @@ namespace Barotrauma.Items.Components return true; }; - button = new GUIButton(new Rectangle(410, 170, 100, 40), "TURN ON", GUI.Style, GuiFrame); - button.OnClicked = ToggleAutoTemp; + autoTempTickBox = new GUITickBox(new Rectangle(410, 170, 20, 20), "Automatic temperature control", Alignment.TopLeft, GuiFrame); + autoTempTickBox.OnSelected = ToggleAutoTemp; button = new GUIButton(new Rectangle(210, 290, 40, 40), "+", GUI.Style, GuiFrame); button.OnPressed = () => @@ -449,7 +455,7 @@ namespace Barotrauma.Items.Components spriteBatch.DrawString(GUI.Font, "Shutdown Temperature: " + shutDownTemp, new Vector2(x + 450, y + 80), Color.White); - spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); + //spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); y += 300; @@ -466,12 +472,10 @@ namespace Barotrauma.Items.Components //y = y - 260; } - private bool ToggleAutoTemp(GUIButton button, object userdata) + private bool ToggleAutoTemp(GUITickBox tickBox) { unsentChanges = true; - autoTemp = !autoTemp; - - button.Text = autoTemp ? "TURN OFF" : "TURN ON"; + autoTemp = tickBox.Selected; return true; } diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs index 226760936..2de7c6d51 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -73,6 +73,24 @@ namespace Barotrauma.Items.Components //maxOutput = ToolBox.GetAttributeFloat(element, "maxoutput", 10.0f); IsActive = true; + + var button = new GUIButton(new Rectangle(160, 50, 30,30), "-", GUI.Style, GuiFrame); + button.OnClicked = (GUIButton btn, object obj) => + { + rechargeSpeed = Math.Max(rechargeSpeed - maxRechargeSpeed * 0.1f, 0.0f); + item.NewComponentEvent(this, true, false); + + return true; + }; + + button = new GUIButton(new Rectangle(200, 50, 30, 30), "+", GUI.Style, GuiFrame); + button.OnClicked = (GUIButton btn, object obj) => + { + rechargeSpeed = Math.Max(rechargeSpeed + maxRechargeSpeed * 0.1f, 0.0f); + item.NewComponentEvent(this, true, false); + + return true; + }; } public override bool Pick(Character picker) @@ -189,18 +207,8 @@ namespace Barotrauma.Items.Components "Charge: " + (int)charge + "/" + (int)capacity + " (" + (int)((charge / capacity) * 100.0f) + " %)", new Vector2(x + 30, y + 30), Color.White); - spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed)*100.0f)+" %", new Vector2(x + 30, y + 100), Color.White); - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 200, y + 90, 40, 40), "+")) - { - rechargeSpeed = Math.Min(rechargeSpeed + maxRechargeSpeed*0.1f, maxRechargeSpeed); - item.NewComponentEvent(this, true, false); - } + spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed)*100.0f)+" %", new Vector2(x + 30, y + 95), Color.White); - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 90, 40, 40), "-")) - { - rechargeSpeed = Math.Max(rechargeSpeed - maxRechargeSpeed * 0.1f, 0.0f); - item.NewComponentEvent(this, true, false); - } } public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message) diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 665123c27..34a0c5a3c 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -140,6 +140,8 @@ namespace Barotrauma public Item FindItem(string itemName) { + if (itemName == null) return null; + return Items.FirstOrDefault(i => i != null && (i.Name == itemName || i.HasTag(itemName))); } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 1a8b034a8..9e1bccab4 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -459,6 +459,8 @@ namespace Barotrauma public bool HasTag(string tag) { + if (tag == null) return true; + return (tags.Contains(tag) || tags.Contains(tag.ToLower())); } diff --git a/Subsurface/Source/Items/ItemPrefab.cs b/Subsurface/Source/Items/ItemPrefab.cs index 9ed2ec443..1f98ed3b2 100644 --- a/Subsurface/Source/Items/ItemPrefab.cs +++ b/Subsurface/Source/Items/ItemPrefab.cs @@ -112,7 +112,7 @@ namespace Barotrauma return; } - sprite.Draw(spriteBatch, new Vector2(position.X + sprite.size.X / 2.0f, -position.Y + sprite.size.Y / 2.0f)); + sprite.Draw(spriteBatch, new Vector2(position.X + sprite.size.X / 2.0f, -position.Y + sprite.size.Y / 2.0f), SpriteColor); } else { @@ -146,7 +146,7 @@ namespace Barotrauma position = placePosition; } - if (sprite != null) sprite.DrawTiled(spriteBatch, new Vector2(position.X, -position.Y), placeSize, Color.White); + if (sprite != null) sprite.DrawTiled(spriteBatch, new Vector2(position.X, -position.Y), placeSize, SpriteColor); } //if (PlayerInput.GetMouseState.RightButton == ButtonState.Pressed) selected = null; diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index 741a7d128..db0d95c66 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -854,6 +854,40 @@ namespace Barotrauma return normal; } + public Vector2 GetRandomItemPos(float offsetFromWall = 10.0f) + { + Vector2 position = Vector2.Zero; + + offsetFromWall = ConvertUnits.ToSimUnits(offsetFromWall); + + int tries = 0; + do + { + Vector2 startPos = ConvertUnits.ToSimUnits(PositionsOfInterest[Rand.Int(PositionsOfInterest.Count, false)]); + + Vector2 endPos = startPos - ConvertUnits.ToSimUnits(Vector2.UnitY * Size.Y); + + if (Submarine.PickBody( + startPos, + endPos, + null, Physics.CollisionLevel) != null) + { + position = ConvertUnits.ToDisplayUnits(Submarine.LastPickedPosition - Vector2.Normalize(startPos - endPos)*offsetFromWall); + break; + } + + tries++; + + if (tries == 10) + { + position = EndPosition - Vector2.UnitY * 300.0f; + } + + } while (tries < 10); + + return position; + } + //public void SetPosition(Vector2 pos) //{ // Vector2 amount = pos - Position; diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 4179b31a9..935b9c7d4 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ