diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs
index a498b37f1..969af89cf 100644
--- a/Subsurface/Source/Characters/Character.cs
+++ b/Subsurface/Source/Characters/Character.cs
@@ -487,7 +487,9 @@ namespace Subsurface
return Info.Job.GetSkillLevel(skillName);
}
- public void Control(float deltaTime, Camera cam, bool forcePick = false)
+ float findClosestTimer;
+
+ public void Control(float deltaTime, Camera cam)
{
if (isDead) return;
@@ -530,63 +532,6 @@ namespace Subsurface
}
}
- //find the closest item if selectkey has been hit, or if the character is being
- //controlled by the player (in order to highlight it)
- if (controlled == this)
- {
- Vector2 mouseSimPos = ConvertUnits.ToSimUnits(cam.ScreenToWorld(PlayerInput.MousePosition));
-
- closestCharacter = FindClosestCharacter(mouseSimPos);
- if (closestCharacter != null)
- {
- if (closestCharacter != selectedCharacter) selectedCharacter = null;
- if (!closestCharacter.isHumanoid) closestCharacter = null;
- }
-
-
- closestItem = FindClosestItem(mouseSimPos);
-
- if (closestCharacter != null && closestItem != null)
- {
- if (Vector2.Distance(closestCharacter.SimPosition, mouseSimPos) < Vector2.Distance(closestItem.SimPosition, mouseSimPos))
- {
- if (selectedConstruction!=closestItem) closestItem = null;
- }
- else
- {
- closestCharacter = null;
- }
- }
-
- if (selectedCharacter==null)
- {
- if (closestItem != null)
- {
- closestItem.IsHighlighted = true;
- if (GetInputState(InputType.Select) && closestItem.Pick(this, forcePick))
- {
- new NetworkEvent(NetworkEventType.PickItem, ID, true, closestItem.ID);
- }
- }
- }
- else
- {
- if (Vector2.Distance(selectedCharacter.SimPosition, SimPosition) > 2.0f) selectedCharacter = null;
- }
-
- if (GetInputState(InputType.Select))
- {
- if (selectedCharacter!=null)
- {
- selectedCharacter = null;
- }
- else if (closestCharacter!=null && closestCharacter.isDead && closestCharacter.isHumanoid)
- {
- selectedCharacter = closestCharacter;
- }
- }
- }
-
for (int i = 0; i < selectedItems.Length; i++ )
{
if (selectedItems[i] == null) continue;
@@ -616,7 +561,7 @@ namespace Subsurface
Limb torso = AnimController.GetLimb(LimbType.Torso);
Vector2 pos = (torso.body.TargetPosition != Vector2.Zero) ? torso.body.TargetPosition : torso.SimPosition;
- return Item.FindPickable(pos, selectedConstruction == null ? mouseSimPos : selectedConstruction.SimPosition, null, selectedItems);
+ return Item.FindPickable(pos, selectedConstruction == null ? mouseSimPos : selectedConstruction.SimPosition, AnimController.CurrentHull, selectedItems);
}
private Character FindClosestCharacter(Vector2 mouseSimPos, float maxDist = 150.0f)
@@ -647,7 +592,7 @@ namespace Subsurface
///
/// Control the character according to player input
///
- public void ControlLocalPlayer(Camera cam, bool moveCam = true)
+ public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true)
{
//if (isDead)
//{
@@ -704,6 +649,69 @@ namespace Subsurface
}
}
+
+ //find the closest item if selectkey has been hit, or if the character is being
+ //controlled by the player (in order to highlight it)
+
+ if (findClosestTimer <= 0.0f || Screen.Selected == GameMain.EditMapScreen)
+ {
+ closestCharacter = FindClosestCharacter(mouseSimPos);
+ if (closestCharacter != null)
+ {
+ if (closestCharacter != selectedCharacter) selectedCharacter = null;
+ if (!closestCharacter.isHumanoid) closestCharacter = null;
+ }
+
+ closestItem = FindClosestItem(mouseSimPos);
+
+ if (closestCharacter != null && closestItem != null)
+ {
+ if (Vector2.Distance(closestCharacter.SimPosition, mouseSimPos) < Vector2.Distance(closestItem.SimPosition, mouseSimPos))
+ {
+ if (selectedConstruction != closestItem) closestItem = null;
+ }
+ else
+ {
+ closestCharacter = null;
+ }
+ }
+
+ findClosestTimer = 0.1f;
+ }
+ else
+ {
+ findClosestTimer -= deltaTime;
+ }
+
+ if (selectedCharacter == null)
+ {
+ if (closestItem != null)
+ {
+ closestItem.IsHighlighted = true;
+ if (GetInputState(InputType.Select) && closestItem.Pick(this, false))
+ {
+ new NetworkEvent(NetworkEventType.PickItem, ID, true, closestItem.ID);
+ }
+ }
+ }
+ else
+ {
+ if (Vector2.Distance(selectedCharacter.SimPosition, SimPosition) > 2.0f) selectedCharacter = null;
+ }
+
+ if (GetInputState(InputType.Select))
+ {
+ if (selectedCharacter != null)
+ {
+ selectedCharacter = null;
+ }
+ else if (closestCharacter != null && closestCharacter.isDead && closestCharacter.isHumanoid)
+ {
+ selectedCharacter = closestCharacter;
+ }
+ }
+
+
DisableControls = false;
}
@@ -744,7 +752,7 @@ namespace Subsurface
if (controlled == this)
{
CharacterHUD.Update(deltaTime,this);
- ControlLocalPlayer(cam);
+ ControlLocalPlayer(deltaTime, cam);
}
Control(deltaTime, cam);
diff --git a/Subsurface/Source/Items/Components/Signal/RegExFindComponent.cs b/Subsurface/Source/Items/Components/Signal/RegExFindComponent.cs
index 917c45ac8..36d2e5353 100644
--- a/Subsurface/Source/Items/Components/Signal/RegExFindComponent.cs
+++ b/Subsurface/Source/Items/Components/Signal/RegExFindComponent.cs
@@ -10,6 +10,11 @@ namespace Subsurface.Items.Components
private string expression;
private string receivedSignal;
+ private string previousReceivedSignal;
+
+ bool previousResult;
+
+ private Regex regex;
[InGameEditable, HasDefaultValue("1", true)]
public string Output
@@ -22,7 +27,22 @@ namespace Subsurface.Items.Components
public string Expression
{
get { return expression; }
- set { expression = value; }
+ set
+ {
+ if (expression == value) return;
+ expression = value;
+
+ try
+ {
+ regex = new Regex(@expression);
+ }
+
+ catch
+ {
+ item.SendSignal("ERROR", "signal_out");
+ return;
+ }
+ }
}
public RegExFindComponent(Item item, XElement element)
@@ -33,22 +53,26 @@ namespace Subsurface.Items.Components
public override void Update(float deltaTime, Camera cam)
{
- if (string.IsNullOrWhiteSpace(expression)) return;
+ if (string.IsNullOrWhiteSpace(expression) || regex==null) return;
- bool success = false;
- try
+ if (receivedSignal!=previousReceivedSignal)
{
- Regex regex = new Regex(@expression);
- Match match = regex.Match(receivedSignal);
- success = match.Success;
- }
- catch
- {
- item.SendSignal("ERROR", "signal_out");
- return;
+ try
+ {
+ Match match = regex.Match(receivedSignal);
+ previousResult = match.Success;
+
+ }
+ catch
+ {
+ item.SendSignal("ERROR", "signal_out");
+ previousResult = false;
+ return;
+ }
}
- item.SendSignal(success ? output : "0", "signal_out");
+
+ item.SendSignal(previousResult ? output : "0", "signal_out");
}
public override void ReceiveSignal(string signal, Connection connection, Item sender, float power = 0.0f)
@@ -57,7 +81,6 @@ namespace Subsurface.Items.Components
{
case "signal_in":
receivedSignal = signal;
-
break;
case "set_output":
output = signal;
diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs
index 5b0dd2027..4481045ba 100644
--- a/Subsurface/Source/Items/Item.cs
+++ b/Subsurface/Source/Items/Item.cs
@@ -326,11 +326,7 @@ namespace Subsurface
public void SetTransform(Vector2 simPosition, float rotation)
{
- if (body != null)
- {
- body.SetTransform(simPosition, rotation);
- }
-
+ if (body != null) body.SetTransform(simPosition, rotation);
Vector2 displayPos = ConvertUnits.ToDisplayUnits(simPosition);
@@ -770,7 +766,7 @@ namespace Subsurface
foreach (Item item in itemList)
{
if (ignoredItems!=null && ignoredItems.Contains(item)) continue;
- if (hull != null && item.CurrentHull != hull) continue;
+ if (hull != item.CurrentHull) continue;
if (item.body != null && !item.body.Enabled) continue;
Pickable pickableComponent = item.GetComponent();
diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs
index 4c99cbb60..e2f115ea8 100644
--- a/Subsurface/Source/Map/Lights/ConvexHull.cs
+++ b/Subsurface/Source/Map/Lights/ConvexHull.cs
@@ -111,7 +111,7 @@ namespace Subsurface.Lights
}
}
- public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Vector2 lightSourcePos, bool los = true)
+ public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Vector2 lightSourcePos, Matrix transform, bool los = true)
{
if (!Enabled) return;
@@ -224,8 +224,7 @@ namespace Subsurface.Lights
currentIndex = (currentIndex + 1) % primitiveCount;
}
- shadowEffect.World = cam.ShaderTransform
- * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f;
+ shadowEffect.World = transform;
shadowEffect.CurrentTechnique.Passes[0].Apply();
graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertexCount * 2 - 2);
diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs
index 3d0565ad9..2f53ce7f5 100644
--- a/Subsurface/Source/Map/Lights/LightManager.cs
+++ b/Subsurface/Source/Map/Lights/LightManager.cs
@@ -59,18 +59,24 @@ namespace Subsurface.Lights
{
Rectangle camView = new Rectangle(cam.WorldView.X, cam.WorldView.Y - cam.WorldView.Height, cam.WorldView.Width, cam.WorldView.Height);
+ Matrix shadowTransform = cam.ShaderTransform
+ * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f;
+
if (!LosEnabled) return;
foreach (ConvexHull convexHull in ConvexHull.list)
{
if (!camView.Intersects(convexHull.BoundingBox)) continue;
- convexHull.DrawShadows(graphics, cam, pos);
+ convexHull.DrawShadows(graphics, cam, pos, shadowTransform);
}
}
public void DrawLightmap(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam)
{
+ Matrix shadowTransform = cam.ShaderTransform
+ * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f;
+
graphics.SetRenderTarget(lightMap);
Rectangle viewRect = cam.WorldView;
@@ -96,7 +102,7 @@ namespace Subsurface.Lights
{
if (!MathUtils.CircleIntersectsRectangle(light.Position, light.Range, ch.BoundingBox)) continue;
//draw shadow
- ch.DrawShadows(graphics, cam, light.Position, false);
+ ch.DrawShadows(graphics, cam, light.Position, shadowTransform, false);
}
//draw the light shape
diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs
index 8e1f8f259..dedcc3737 100644
--- a/Subsurface/Source/Screens/EditMapScreen.cs
+++ b/Subsurface/Source/Screens/EditMapScreen.cs
@@ -225,7 +225,7 @@ namespace Subsurface
}
}
- dummyCharacter.ControlLocalPlayer(cam, false);
+ dummyCharacter.ControlLocalPlayer((float)deltaTime, cam);
dummyCharacter.Control((float)deltaTime, cam);
}
else
@@ -287,6 +287,8 @@ namespace Subsurface
{
if (dummyCharacter != null)
{
+ dummyCharacter.AnimController.FindHull();
+
foreach (Item item in dummyCharacter.SelectedItems)
{
if (item == null) continue;
@@ -311,10 +313,6 @@ namespace Subsurface
if (PlayerInput.GetMouseState.LeftButton != ButtonState.Pressed)
{
- //if (Inventory.draggingItem!=null)
- //{
- // Inventory.draggingItem.see
- //}
Inventory.draggingItem = null;
}
}
diff --git a/Subsurface_Solution.sln b/Subsurface_Solution.sln
index 895b06759..786e0b01e 100644
--- a/Subsurface_Solution.sln
+++ b/Subsurface_Solution.sln
@@ -396,4 +396,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(Performance) = preSolution
+ HasPerformanceSessions = true
+ EndGlobalSection
EndGlobal
diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo
index 40c75b0e8..72d4d8b01 100644
Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ