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