From 0cbcdd0b038feddd2f3e6735c73c70a883095597 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 4 Sep 2015 21:56:39 +0300 Subject: [PATCH] Turret rotation fix, CharacterInventory networking bugfixes, prevent limbs clipping with other colliders when mirroring, fixed mantis animations, better looking explosions, spark effect when overvoltage breaks an item --- .../Collision/Collision.cs | 13 +- Farseer Physics Engine 3.5/Common/Math.cs | 11 +- Farseer Physics Engine 3.5/Settings.cs | 2 +- .../Content/Characters/Crawler/crawler.xml | 9 +- .../Content/Characters/Mantis/mantis.xml | 39 ++-- Subsurface/Content/Items/Weapons/railgun.xml | 6 +- .../Content/Particles/ParticlePrefabs.xml | 34 +++- Subsurface/Content/Particles/explosion.png | Bin 6442 -> 51459 bytes .../Source/Characters/AnimController.cs | 5 +- .../BackgroundSprite/BackgroundSprite.cs | 12 +- Subsurface/Source/Characters/Character.cs | 2 +- .../Source/Characters/FishAnimController.cs | 19 +- .../Characters/HumanoidAnimController.cs | 1 - Subsurface/Source/Characters/Limb.cs | 11 +- .../GameSession/GameModes/TutorialMode.cs | 10 +- Subsurface/Source/GameSession/GameSession.cs | 2 +- Subsurface/Source/Items/CharacterInventory.cs | 14 +- .../Items/Components/Machines/Reactor.cs | 187 +++++++++--------- .../Items/Components/Power/PowerTransfer.cs | 33 +++- .../Source/Items/Components/Power/Powered.cs | 32 ++- .../Source/Items/Components/Projectile.cs | 11 +- .../Items/Components/Signal/LightComponent.cs | 11 -- Subsurface/Source/Items/Components/Turret.cs | 29 ++- Subsurface/Source/Items/FixRequirement.cs | 4 + Subsurface/Source/Items/Inventory.cs | 2 + Subsurface/Source/Items/Item.cs | 5 +- Subsurface/Source/Map/Explosion.cs | 13 +- Subsurface/Source/Map/Lights/ConvexHull.cs | 65 +++--- Subsurface/Source/Networking/GameServer.cs | 11 +- Subsurface/Source/Program.cs | 14 +- .../Source/Screens/EditCharacterScreen.cs | 13 +- Subsurface/Source/Screens/EditMapScreen.cs | 14 +- Subsurface/Source/Screens/NetLobbyScreen.cs | 13 +- Subsurface_Solution.sln | 8 + Subsurface_Solution.v12.suo | Bin 605184 -> 635904 bytes 35 files changed, 393 insertions(+), 262 deletions(-) diff --git a/Farseer Physics Engine 3.5/Collision/Collision.cs b/Farseer Physics Engine 3.5/Collision/Collision.cs index 287d58687..27d429a7c 100644 --- a/Farseer Physics Engine 3.5/Collision/Collision.cs +++ b/Farseer Physics Engine 3.5/Collision/Collision.cs @@ -434,16 +434,13 @@ namespace FarseerPhysics.Collision /// The first AABB. /// The second AABB. /// True if they are overlapping. + public static bool TestOverlap(ref AABB a, ref AABB b) { - Vector2 d1 = b.LowerBound - a.UpperBound; - Vector2 d2 = a.LowerBound - b.UpperBound; - - if (d1.X > 0.0f || d1.Y > 0.0f) - return false; - - if (d2.X > 0.0f || d2.Y > 0.0f) - return false; + if (b.LowerBound.X - a.UpperBound.X > 0.0f || + b.LowerBound.Y - a.UpperBound.Y > 0.0f || + a.LowerBound.X - b.UpperBound.X > 0.0f || + a.LowerBound.Y - b.UpperBound.Y > 0.0f) return false; return true; } diff --git a/Farseer Physics Engine 3.5/Common/Math.cs b/Farseer Physics Engine 3.5/Common/Math.cs index 766212f19..56df666a1 100644 --- a/Farseer Physics Engine 3.5/Common/Math.cs +++ b/Farseer Physics Engine 3.5/Common/Math.cs @@ -77,10 +77,9 @@ namespace FarseerPhysics.Common public static Vector2 Mul(ref Transform T, ref Vector2 v) { - float x = (T.q.c * v.X - T.q.s * v.Y) + T.p.X; - float y = (T.q.s * v.X + T.q.c * v.Y) + T.p.Y; - - return new Vector2(x, y); + return new Vector2( + (T.q.c * v.X - T.q.s * v.Y) + T.p.X, + (T.q.s * v.X + T.q.c * v.Y) + T.p.Y); } public static Vector2 MulT(ref Mat22 A, Vector2 v) @@ -102,10 +101,8 @@ namespace FarseerPhysics.Common { float px = v.X - T.p.X; float py = v.Y - T.p.Y; - float x = (T.q.c * px + T.q.s * py); - float y = (-T.q.s * px + T.q.c * py); - return new Vector2(x, y); + return new Vector2(T.q.c * px + T.q.s * py, -T.q.s * px + T.q.c * py); } // A^T * B diff --git a/Farseer Physics Engine 3.5/Settings.cs b/Farseer Physics Engine 3.5/Settings.cs index 6968d46ee..51a3dd7f5 100644 --- a/Farseer Physics Engine 3.5/Settings.cs +++ b/Farseer Physics Engine 3.5/Settings.cs @@ -47,7 +47,7 @@ namespace FarseerPhysics /// NOTE: If you are using a debug view that shows performance counters, /// you might want to enable this. /// - public const bool EnableDiagnostics = true; + public const bool EnableDiagnostics = false; /// /// Set this to true to skip sanity checks in the engine. This will speed up the diff --git a/Subsurface/Content/Characters/Crawler/crawler.xml b/Subsurface/Content/Characters/Crawler/crawler.xml index 4c07bf290..38b7e8b3a 100644 --- a/Subsurface/Content/Characters/Crawler/crawler.xml +++ b/Subsurface/Content/Characters/Crawler/crawler.xml @@ -9,8 +9,7 @@ @@ -37,7 +36,7 @@ - + @@ -45,7 +44,7 @@ - + @@ -53,7 +52,7 @@ - + diff --git a/Subsurface/Content/Characters/Mantis/mantis.xml b/Subsurface/Content/Characters/Mantis/mantis.xml index ec41ab048..e6101c656 100644 --- a/Subsurface/Content/Characters/Mantis/mantis.xml +++ b/Subsurface/Content/Characters/Mantis/mantis.xml @@ -1,20 +1,23 @@  - + + + + + - - + + @@ -41,43 +44,43 @@ - + - + - - + + - + - - + + - + - - + + - + - + diff --git a/Subsurface/Content/Items/Weapons/railgun.xml b/Subsurface/Content/Items/Weapons/railgun.xml index fe9db5a6a..06e93d84e 100644 --- a/Subsurface/Content/Items/Weapons/railgun.xml +++ b/Subsurface/Content/Items/Weapons/railgun.xml @@ -2,7 +2,7 @@ @@ -11,7 +11,9 @@ - + + + diff --git a/Subsurface/Content/Particles/ParticlePrefabs.xml b/Subsurface/Content/Particles/ParticlePrefabs.xml index 12807219e..ed5624623 100644 --- a/Subsurface/Content/Particles/ParticlePrefabs.xml +++ b/Subsurface/Content/Particles/ParticlePrefabs.xml @@ -72,19 +72,45 @@ + + + + + + + + - + - + (_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd 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 Ef-PwY4*&oF delta 6434 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 diff --git a/Subsurface/Source/Characters/AnimController.cs b/Subsurface/Source/Characters/AnimController.cs index 3ed46bc4e..3a031d3f7 100644 --- a/Subsurface/Source/Characters/AnimController.cs +++ b/Subsurface/Source/Characters/AnimController.cs @@ -26,7 +26,6 @@ namespace Subsurface protected readonly Vector2 stepSize; protected readonly float legTorque; - protected readonly Vector2 stepOffset; public float StunTimer { @@ -46,8 +45,8 @@ namespace Subsurface stepSize = ToolBox.GetAttributeVector2(element, "stepsize", Vector2.One); stepSize = ConvertUnits.ToSimUnits(stepSize); - stepOffset = ToolBox.GetAttributeVector2(element, "stepoffset", Vector2.One); - stepOffset = ConvertUnits.ToSimUnits(stepOffset); + //stepOffset = ToolBox.GetAttributeVector2(element, "stepoffset", Vector2.One); + //stepOffset = ConvertUnits.ToSimUnits(stepOffset); //impactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", 10.0f); diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs index 8fe786a65..28d5e9238 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs @@ -69,22 +69,22 @@ namespace Subsurface depth = MathHelper.Clamp(depth + velocity.Z * deltaTime, 0.0f, MaxDepth); checkWallsTimer -= deltaTime; - if (checkWallsTimer<=0.0f) + if (checkWallsTimer<=0.0f && Level.Loaded!=null) { checkWallsTimer = CheckWallsInterval; obstacleDiff = Vector2.Zero; var cells = Level.Loaded.GetCells(position, 1); - if (cells.Count>0) + if (cells.Count > 0) { - + foreach (Voronoi2.VoronoiCell cell in cells) { obstacleDiff += cell.Center - position; } - obstacleDiff = Vector2.Normalize(obstacleDiff)*prefab.Speed; + obstacleDiff = Vector2.Normalize(obstacleDiff) * prefab.Speed; } } @@ -141,7 +141,9 @@ namespace Subsurface if (velocity.X < 0.0f) rotation -= MathHelper.Pi; } - Vector2 drawPos = position + Level.Loaded.Position; + Vector2 drawPos = position; + + if (Level.Loaded != null) drawPos += Level.Loaded.Position; if (depth > 0.0f) { diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 7fa3cd14b..0c56b3047 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -866,7 +866,7 @@ namespace Subsurface for (int i = 0; i < sounds.Count(); i++) { if (soundStates[i] != state) continue; - if (n == selectedSound) + if (n == selectedSound && sounds[i]!=null) { sounds[i].Play(1.0f, 2000.0f, AnimController.limbs[0].body.FarseerBody); diff --git a/Subsurface/Source/Characters/FishAnimController.cs b/Subsurface/Source/Characters/FishAnimController.cs index 789852c76..322ec1488 100644 --- a/Subsurface/Source/Characters/FishAnimController.cs +++ b/Subsurface/Source/Characters/FishAnimController.cs @@ -302,8 +302,8 @@ namespace Subsurface RevoluteJoint refJoint = limbJoints[limb.RefJointIndex]; footPos.X = refJoint.WorldAnchorA.X; } - footPos.X += stepOffset.X * Dir; - footPos.Y += stepOffset.Y; + footPos.X += limb.StepOffset.X * Dir; + footPos.Y += limb.StepOffset.Y; if (limb.type == LimbType.LeftFoot) { @@ -373,7 +373,20 @@ namespace Subsurface foreach (Limb l in limbs) { Vector2 newPos = new Vector2(midX - (l.SimPosition.X - midX), l.SimPosition.Y); - l.body.SetTransform(newPos, l.body.Rotation); + + if (Submarine.CheckVisibility(l.SimPosition, newPos)!=null) + { + Vector2 diff = newPos - l.SimPosition; + + l.body.SetTransform( + l.SimPosition + Submarine.LastPickedFraction * diff * 0.8f, l.body.Rotation); + } + else + { + l.body.SetTransform(newPos, l.body.Rotation); + } + + } } diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index 3941c4aa3..54ba5d3f5 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -786,7 +786,6 @@ namespace Subsurface arm.body.SmoothRotate((ang2 - armAngle * Dir), 20.0f); hand.body.SmoothRotate((ang2 + handAngle * Dir), 100.0f); - } } diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index dca870265..a633005b7 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -32,6 +32,8 @@ namespace Subsurface private readonly bool doesFlip; + protected readonly Vector2 stepOffset; + public Sprite sprite; public bool inWater; @@ -128,6 +130,11 @@ namespace Subsurface get { return refJointIndex; } } + public Vector2 StepOffset + { + get { return stepOffset; } + } + //public float Damage //{ // get { return damage; } @@ -205,9 +212,11 @@ namespace Subsurface Vector2 jointPos = ToolBox.GetAttributeVector2(element, "pullpos", Vector2.Zero); - jointPos = ConvertUnits.ToSimUnits(jointPos); + stepOffset = ToolBox.GetAttributeVector2(element, "stepoffset", Vector2.Zero); + stepOffset = ConvertUnits.ToSimUnits(stepOffset); + refJointIndex = ToolBox.GetAttributeInt(element, "refjoint", -1); pullJoint = new FixedMouseJoint(body.FarseerBody, jointPos); diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs index 67dec322a..74c703ccf 100644 --- a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -367,13 +367,13 @@ namespace Subsurface { infoBox = CreateInfoFrame("The diving mask will let you breathe underwater, but it won't protect from the water pressure outside the sub. "+ "It should be fine for the situation at hand, but you still need to find an oxygen tank and drag it into the same slot as the mask." + - "You should grab one or two."); + "You should grab one or two from one of the cabinets."); } else if (HasItem("Diving Suit")) { infoBox = CreateInfoFrame("In addition to letting you breathe underwater, the suit will protect you from the water pressure outside the sub " + - "(unlike the diving mask). However, you still need to drag an oxygen tank into the same slot as the suit to supply oxygen. "+ - "You should grab one or two."); + "(unlike the diving mask). However, you still need to drag an oxygen tank into the same slot as the suit to supply oxygen. "+ + "You should grab one or two from one of the cabinets."); } while (!HasItem("Oxygen Tank")) @@ -431,7 +431,8 @@ namespace Subsurface yield return CoroutineStatus.Running; } - infoBox = CreateInfoFrame("Use the right mouse button to aim and left to shoot."); + infoBox = CreateInfoFrame("Use the right mouse button to aim and wait for the creature to come closer. When you're ready to shoot, " + +"press the left mouse button."); while (!moloch.IsDead) { @@ -510,6 +511,7 @@ namespace Subsurface float secondsLeft = endPreviewLength; Character.Controlled = null; + Game1.GameScreen.Cam.TargetPos = Vector2.Zero; do { diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index 288bc759e..0f30697bc 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -107,7 +107,7 @@ namespace Subsurface public void StartShift(TimeSpan duration, Level level, bool reloadSub = true) { - Game1.LightManager.LosEnabled = (Game1.Server==null && Character.Controlled==null); + Game1.LightManager.LosEnabled = (Game1.Server==null || Game1.Server.CharacterInfo!=null); this.level = level; diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index d705153bb..91fb609f0 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -66,8 +66,13 @@ namespace Subsurface protected override void DropItem(Item item) { + bool enabled = draggingItem.body.Enabled; item.Drop(character); - item.body.SetTransform(character.SimPosition, 0.0f); + + if (!enabled) + { + draggingItem.body.SetTransform(character.SimPosition, 0.0f); + } } public int FindLimbSlot(LimbSlot limbSlot) @@ -202,8 +207,8 @@ namespace Subsurface if (items[rightHandSlot] != null) return false; if (items[leftHandSlot] != null) return false; - PutItem(item, rightHandSlot, true, true); - PutItem(item, leftHandSlot, true, false); + PutItem(item, rightHandSlot, createNetworkEvent, true); + PutItem(item, leftHandSlot, createNetworkEvent, false); item.Equip(character); return true; } @@ -269,8 +274,7 @@ namespace Subsurface DrawSlot(spriteBatch, slotRect, draggingItem, false, false); } else - { - draggingItem.body.SetTransform(character.SimPosition, 0.0f); + { DropItem(draggingItem); //draggingItem = null; } diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 520f7f074..7420c9342 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -12,36 +12,39 @@ namespace Subsurface.Items.Components { //the rate at which the reactor is being run un //higher rates generate more power (and heat) - float fissionRate; + private float fissionRate; //the rate at which the heat is being dissipated - float coolingRate; + private float coolingRate; - float temperature; + private float temperature; //is automatic temperature control on //(adjusts the cooling rate automatically to keep the //amount of power generated balanced with the load) - bool autoTemp; + private bool autoTemp; //the temperature after which fissionrate is automatically //turned down and cooling increased - float shutDownTemp; + private float shutDownTemp; - float meltDownTemp; + private float meltDownTemp; //how much power is provided to the grid per 1 temperature unit - float powerPerTemp; + private float powerPerTemp; - int graphSize = 25; + private int graphSize = 25; - float graphTimer; + private float graphTimer; - int updateGraphInterval = 500; + private int updateGraphInterval = 500; - float[] fissionRateGraph; - float[] coolingRateGraph; - float[] tempGraph; + private float[] fissionRateGraph; + private float[] coolingRateGraph; + private float[] tempGraph; + private float[] loadGraph; + + private float load; private PropertyTask powerUpTask; @@ -118,9 +121,10 @@ namespace Subsurface.Items.Components public Reactor(Item item, XElement element) : base(item, element) { - fissionRateGraph = new float[graphSize]; - coolingRateGraph = new float[graphSize]; - tempGraph = new float[graphSize]; + fissionRateGraph = new float[graphSize]; + coolingRateGraph = new float[graphSize]; + tempGraph = new float[graphSize]; + loadGraph = new float[graphSize]; meltDownTemp = 9000.0f; @@ -155,6 +159,24 @@ namespace Subsurface.Items.Components powerUpTask = new PropertyTask(item, IsRunning, 50.0f, "Power up the reactor"); } } + + load = 0.0f; + + List connections = item.Connections; + if (connections != null && connections.Count > 0) + { + foreach (Connection connection in connections) + { + foreach (Connection recipient in connection.Recipients) + { + Item it = recipient.Item as Item; + if (it == null) continue; + + PowerTransfer pt = it.GetComponent(); + if (pt != null) load += pt.PowerLoad; + } + } + } //item.Condition -= temperature * deltaTime * 0.00005f; @@ -165,34 +187,6 @@ namespace Subsurface.Items.Components } else if (autoTemp) { - - float load = 0.0f; - - List connections = item.Connections; - if (connections!=null && connections.Count>0) - { - foreach (Connection connection in connections) - { - foreach (Connection recipient in connection.Recipients) - { - Item it = recipient.Item as Item; - if (it == null) continue; - - PowerTransfer pt = it.GetComponent(); - if (pt != null) load += pt.PowerLoad; - } - } - } - - //foreach (MapEntity e in item.linkedTo) - //{ - // Item it = e as Item; - // if (it == null) continue; - - // PowerTransfer pt = it.GetComponent(); - // if (pt != null) load += pt.PowerLoad; - //} - fissionRate = Math.Min(load / 200.0f, shutDownTemp); //float target = Math.Min(targetTemp, load); CoolingRate = coolingRate + (temperature - Math.Min(load, shutDownTemp) + deltaTemp)*0.1f; @@ -247,6 +241,9 @@ namespace Subsurface.Items.Components UpdateGraph(fissionRateGraph, fissionRate); UpdateGraph(coolingRateGraph, coolingRate); UpdateGraph(tempGraph, temperature); + + UpdateGraph(loadGraph, load); + graphTimer = 0.0f; } } @@ -304,62 +301,73 @@ namespace Subsurface.Items.Components //GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true); - spriteBatch.DrawString(GUI.Font, "Temperature: " + (int)temperature + " C", new Vector2(x + 30, y + 30), Color.White); - DrawGraph(tempGraph, spriteBatch, x + 30, y + 50, 10000.0f, xOffset); + spriteBatch.DrawString(GUI.Font, "Temperature: " + (int)temperature + " C", + new Vector2(x + 450, y + 30), Color.Red); + spriteBatch.DrawString(GUI.Font, "Grid load: " + (int)load + " C", + new Vector2(x + 620, y + 30), Color.Yellow); - y += 130; + DrawGraph(tempGraph, spriteBatch, + new Rectangle(x + 30, y + 30, 400, 250), 10000.0f, xOffset, Color.Red); - spriteBatch.DrawString(GUI.Font, "Fission rate: " + (int)fissionRate + " %", new Vector2(x + 30, y + 30), Color.White); - DrawGraph(fissionRateGraph, spriteBatch, x + 30, y + 50, 100.0f, xOffset); + DrawGraph(loadGraph, spriteBatch, + new Rectangle(x + 30, y + 30, 400, 250), 10000.0f, xOffset, Color.Yellow); - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 280, y + 30, 40, 40), "+", true)) + spriteBatch.DrawString(GUI.Font, "Shutdown Temperature: " + shutDownTemp, new Vector2(x + 450, y + 80), Color.White); + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 450, y + 110, 40, 40), "+", true)) { valueChanged = true; - FissionRate += 1.0f; + ShutDownTemp += 100.0f; } - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 280, y + 80, 40, 40), "-", true)) + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 500, y + 110, 40, 40), "-", true)) { valueChanged = true; - FissionRate -= 1.0f; + ShutDownTemp -= 100.0f; } - y += 130; - spriteBatch.DrawString(GUI.Font, "Cooling rate: " + (int)coolingRate + " %", new Vector2(x + 30, y + 30), Color.White); - DrawGraph(coolingRateGraph, spriteBatch, x + 30, y + 50, 100.0f, xOffset); - - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 280, y + 30, 40, 40), "+", true)) - { - valueChanged = true; - CoolingRate += 1.0f; - } - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 280, y + 80, 40, 40), "-", true)) - { - valueChanged = true; - CoolingRate -= 1.0f; - } - - y = y - 260; - - spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 400, y + 30), Color.White); - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 400, y + 60, 100, 40), ((autoTemp) ? "TURN OFF" : "TURN ON"))) + spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 450, y + 210, 100, 40), ((autoTemp) ? "TURN OFF" : "TURN ON"))) { valueChanged = true; autoTemp = !autoTemp; } - spriteBatch.DrawString(GUI.Font, "Shutdown Temperature: " + shutDownTemp, new Vector2(x + 400, y + 150), Color.White); - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 400, y + 180, 40, 40), "+", true)) + + + y += 300; + + spriteBatch.DrawString(GUI.Font, "Fission rate: " + (int)fissionRate + " %", new Vector2(x + 30, y), Color.White); + DrawGraph(fissionRateGraph, spriteBatch, + new Rectangle(x + 30, y + 30, 200, 100), 100.0f, xOffset, Color.Orange); + + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 30, 40, 40), "+", true)) { valueChanged = true; - ShutDownTemp += 100.0f; + FissionRate += 1.0f; } - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 450, y + 180, 40, 40), "-", true)) + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 80, 40, 40), "-", true)) { valueChanged = true; - ShutDownTemp -= 100.0f; + FissionRate -= 1.0f; } + spriteBatch.DrawString(GUI.Font, "Cooling rate: " + (int)coolingRate + " %", new Vector2(x + 320, y), Color.White); + DrawGraph(coolingRateGraph, spriteBatch, + new Rectangle(x + 320, y + 30, 200, 100), 100.0f, xOffset, Color.LightBlue); + + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 540, y + 30, 40, 40), "+", true)) + { + valueChanged = true; + CoolingRate += 1.0f; + } + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 540, y + 80, 40, 40), "-", true)) + { + valueChanged = true; + CoolingRate -= 1.0f; + } + + //y = y - 260; + if (valueChanged) { item.NewComponentEvent(this, true); @@ -376,35 +384,32 @@ namespace Subsurface.Items.Components graph[0] = newValue; } - static void DrawGraph(IList graph, SpriteBatch spriteBatch, int x, int y, float maxVal, float xOffset) + static void DrawGraph(IList graph, SpriteBatch spriteBatch, Rectangle rect, float maxVal, float xOffset, Color color) { - int width = 200; - int height = 100; + float lineWidth = (float)rect.Width / (float)(graph.Count - 2); + float yScale = (float)rect.Height / maxVal; - float lineWidth = (float)width / (float)(graph.Count - 2); - float yScale = (float)height / maxVal; + GUI.DrawRectangle(spriteBatch, rect, Color.White); - GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.White); + Vector2 prevPoint = new Vector2(rect.Right, rect.Bottom - (graph[1] + (graph[0] - graph[1]) * xOffset) * yScale); - Vector2 prevPoint = new Vector2(x + width, y + height - (graph[1] + (graph[0] - graph[1]) * xOffset) * yScale); - - float currX = x + width - ((xOffset - 1.0f) * lineWidth); + float currX = rect.Right - ((xOffset - 1.0f) * lineWidth); for (int i = 1; i < graph.Count - 1; i++) { currX -= lineWidth; - Vector2 newPoint = new Vector2(currX, y + height - graph[i] * yScale); + Vector2 newPoint = new Vector2(currX, rect.Bottom - graph[i] * yScale); - GUI.DrawLine(spriteBatch, prevPoint, newPoint, Color.White); + GUI.DrawLine(spriteBatch, prevPoint, newPoint - new Vector2(1.0f, 0), color); prevPoint = newPoint; } - Vector2 lastPoint = new Vector2(x, - y + height - (graph[graph.Count - 1] + (graph[graph.Count - 2] - graph[graph.Count - 1]) * xOffset) * yScale); + Vector2 lastPoint = new Vector2(rect.X, + rect.Bottom - (graph[graph.Count - 1] + (graph[graph.Count - 2] - graph[graph.Count - 1]) * xOffset) * yScale); - GUI.DrawLine(spriteBatch, prevPoint, lastPoint, Color.White); + GUI.DrawLine(spriteBatch, prevPoint, lastPoint, color); } public override void ReceiveSignal(string signal, Connection connection, Item sender, float power) diff --git a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs index 6bb00eefa..e49814559 100644 --- a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs @@ -45,13 +45,34 @@ namespace Subsurface.Items.Components foreach (Powered p in connectedList) { PowerTransfer pt = p as PowerTransfer; - if (pt!=null) + if (pt == null) continue; + + pt.powerLoad += (fullLoad - pt.powerLoad) / inertia; + pt.currPowerConsumption += (-fullPower - pt.currPowerConsumption) / inertia; + pt.Item.SendSignal("", "power", fullPower / Math.Max(fullLoad, 1.0f)); + + //damage the item if voltage is too high + if (-pt.currPowerConsumption > Math.Max(pt.powerLoad * 2.0f, 200.0f)) { - pt.powerLoad += (fullLoad - pt.powerLoad) / inertia; - pt.currPowerConsumption += (-fullPower - pt.currPowerConsumption) / inertia; - pt.Item.SendSignal("", "power", fullPower / Math.Max(fullLoad, 1.0f)); - if (-pt.currPowerConsumption > Math.Max(pt.powerLoad * 2.0f, 200.0f)) pt.item.Condition -= deltaTime*10.0f; + + float prevCondition = pt.item.Condition; + pt.item.Condition -= deltaTime * 10.0f; + + if (pt.item.Condition<=0.0f && prevCondition > 0.0f) + { + sparkSounds[Rand.Int(sparkSounds.Length)].Play(1.0f, 600.0f, item.Position); + + Vector2 baseVel = Rand.Vector(3.0f); + for (int i = 0; i < 10; i++) + { + var particle = Game1.ParticleManager.CreateParticle("spark", pt.item.SimPosition, + baseVel + Rand.Vector(1.0f), 0.0f); + + if (particle != null) particle.Size *= Rand.Range(0.5f,1.0f); + } + } } + } @@ -135,7 +156,7 @@ namespace Subsurface.Items.Components { base.ReceiveSignal(signal, connection, sender, power); - if (connection.Name.Length>5 && connection.Name.Substring(0, 6).ToLower() == "signal") + if (connection.Name.Length > 5 && connection.Name.Substring(0, 6).ToLower() == "signal") { connection.SendSignal(signal, sender, 0.0f); } diff --git a/Subsurface/Source/Items/Components/Power/Powered.cs b/Subsurface/Source/Items/Components/Power/Powered.cs index 236f82daf..78d841bf8 100644 --- a/Subsurface/Source/Items/Components/Power/Powered.cs +++ b/Subsurface/Source/Items/Components/Power/Powered.cs @@ -1,11 +1,15 @@ using System; using System.Globalization; +using System.IO; using System.Xml.Linq; namespace Subsurface.Items.Components { class Powered : ItemComponent { + + protected static Sound[] sparkSounds; + //the amount of power CURRENTLY consumed by the item //negative values mean that the item is providing power to connected items protected float currPowerConsumption; @@ -63,6 +67,25 @@ namespace Subsurface.Items.Components set { voltage = Math.Max(0.0f, value); } } + public Powered(Item item, XElement element) + : base(item, element) + { + if (powerOnSound == null) + { + powerOnSound = Sound.Load("Content/Items/Electricity/powerOn.ogg"); + } + + if (sparkSounds == null) + { + sparkSounds = new Sound[4]; + string dir = Path.GetDirectoryName(item.Prefab.ConfigFile) + "\\"; + for (int i = 0; i < 4; i++) + { + sparkSounds[i] = Sound.Load("Content/Items/Electricity/zap" + (i + 1) + ".ogg"); + } + } + } + public override void ReceiveSignal(string signal, Connection connection, Item sender, float power) { if (currPowerConsumption == 0.0f) voltage = 0.0f; @@ -87,13 +110,6 @@ namespace Subsurface.Items.Components } } - public Powered(Item item, XElement element) - : base(item, element) - { - if (powerOnSound==null) - { - powerOnSound = Sound.Load("Content/Items/Electricity/powerOn.ogg"); - } - } + } } diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index 8deae4633..2cd947aeb 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -162,9 +162,11 @@ namespace Subsurface.Items.Components ignoredBodies.Clear(); + f2.Body.ApplyLinearImpulse(item.body.LinearVelocity * item.body.Mass); + if (attackResult.HitArmor) { - item.body.LinearVelocity *= 0.5f; + item.body.LinearVelocity *= 0.1f; } else if (doesStick) { @@ -175,7 +177,10 @@ namespace Subsurface.Items.Components if (Vector2.Dot(f1.Body.LinearVelocity, normal) < 0.0f) return StickToTarget(f2.Body, dir); } - + else + { + item.body.LinearVelocity *= 0.5f; + } var containedItems = item.ContainedItems; if (containedItems == null) return true; @@ -188,7 +193,7 @@ namespace Subsurface.Items.Components contained.Condition = 0.0f; } - return true; + return false; } private bool StickToTarget(Body targetBody, Vector2 axis) diff --git a/Subsurface/Source/Items/Components/Signal/LightComponent.cs b/Subsurface/Source/Items/Components/Signal/LightComponent.cs index 09d3174ad..6307cb539 100644 --- a/Subsurface/Source/Items/Components/Signal/LightComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/LightComponent.cs @@ -10,7 +10,6 @@ namespace Subsurface.Items.Components { class LightComponent : Powered { - static Sound[] sparkSounds; private Color lightColor; @@ -67,16 +66,6 @@ namespace Subsurface.Items.Components public LightComponent(Item item, XElement element) : base (item, element) { - if (sparkSounds==null) - { - sparkSounds = new Sound[4]; - string dir = Path.GetDirectoryName(item.Prefab.ConfigFile)+"\\"; - for (int i = 0; i<4; i++) - { - sparkSounds[i] = Sound.Load("Content/Items/Electricity/zap"+(i+1)+".ogg"); - } - } - //foreach (XElement subElement in element.Elements()) //{ // if (subElement.Name.ToString().ToLower() != "sprite") continue; diff --git a/Subsurface/Source/Items/Components/Turret.cs b/Subsurface/Source/Items/Components/Turret.cs index b25d9dca1..d8e7252f0 100644 --- a/Subsurface/Source/Items/Components/Turret.cs +++ b/Subsurface/Source/Items/Components/Turret.cs @@ -88,17 +88,36 @@ namespace Subsurface.Items.Components { this.cam = cam; - if (reload>0.0f) reload -= deltaTime; + if (reload > 0.0f) reload -= deltaTime; ApplyStatusEffects(ActionType.OnActive, deltaTime, null); - if (targetRotation < minRotation || targetRotation > maxRotation) + float targetMidDiff = MathHelper.WrapAngle(targetRotation - (minRotation + maxRotation) / 2.0f); + + float maxDist = (maxRotation - minRotation) / 2.0f; + + if (Math.Abs(targetMidDiff) > maxDist) { - float diff = MathUtils.WrapAngleTwoPi(targetRotation - (minRotation + maxRotation) / 2.0f); - targetRotation = (diff > Math.PI) ? minRotation : maxRotation; + targetRotation = (targetMidDiff < 0.0f) ? minRotation : maxRotation; + } + + float deltaRotation = MathHelper.WrapAngle(targetRotation-rotation); + deltaRotation = MathHelper.Clamp(deltaRotation, -0.5f, 0.5f) * 5.0f; + + rotation += deltaRotation * deltaTime; + + float rotMidDiff = MathHelper.WrapAngle(rotation - (minRotation + maxRotation) / 2.0f); + + if (rotMidDiff < -maxDist) + { + rotation = minRotation; + } + else if (rotMidDiff > maxDist) + { + rotation = maxRotation; } - rotation = MathUtils.CurveAngle(rotation, targetRotation, 0.05f); + } public override bool Use(float deltaTime, Character character = null) diff --git a/Subsurface/Source/Items/FixRequirement.cs b/Subsurface/Source/Items/FixRequirement.cs index f5cddde2b..e7a5a02a7 100644 --- a/Subsurface/Source/Items/FixRequirement.cs +++ b/Subsurface/Source/Items/FixRequirement.cs @@ -173,6 +173,7 @@ namespace Subsurface if (!unfixedFound) { item.Condition = 100.0f; + frame = null; } } @@ -184,6 +185,9 @@ namespace Subsurface } UpdateGUIFrame(item, character); + + if (frame == null) return; + frame.Update((float)Physics.step); frame.Draw(spriteBatch); } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 75db0a607..1cd93ce46 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -304,6 +304,8 @@ namespace Subsurface Item item = FindEntityByID(itemId) as Item; if (item == null) return; + System.Diagnostics.Debug.WriteLine("Inventory update: "+itemId+" - "+slotIndex); + if (slotIndex==-1) { if (item.inventory == this) item.Drop(); diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 416d98842..6b42a2203 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -718,8 +718,8 @@ namespace Subsurface FixRequirement.DrawHud(spriteBatch, this, character); } } - - public void SendSignal(string signal, string connectionName, float power=0.0f) + + public void SendSignal(string signal, string connectionName, float power = 0.0f) { ConnectionPanel panel = GetComponent(); if (panel == null) return; @@ -729,7 +729,6 @@ namespace Subsurface c.SendSignal(signal, this, power); } - } /// Position of the character doing the pick, only items that are close enough to this are checked diff --git a/Subsurface/Source/Map/Explosion.cs b/Subsurface/Source/Map/Explosion.cs index 7f53ac4a6..5f108c8f7 100644 --- a/Subsurface/Source/Map/Explosion.cs +++ b/Subsurface/Source/Map/Explosion.cs @@ -51,13 +51,20 @@ namespace Subsurface public void Explode(Vector2 simPosition) { + Game1.ParticleManager.CreateParticle("shockwave", simPosition, + Vector2.Zero, 0.0f); + for (int i = 0; i < range * 10; i++) { - Game1.ParticleManager.CreateParticle("explosionfire", simPosition, - Rand.Vector(Rand.Range(3.0f, 4.0f)), 0.0f); + Game1.ParticleManager.CreateParticle("spark", simPosition, + Rand.Vector(Rand.Range(5.0f, 8.0f)), 0.0f); + + Game1.ParticleManager.CreateParticle("explosionfire", simPosition + Rand.Vector(0.5f), + Rand.Vector(Rand.Range(0.5f, 1.0f)), 0.0f); } + Vector2 displayPosition = ConvertUnits.ToDisplayUnits(simPosition); float displayRange = ConvertUnits.ToDisplayUnits(range); @@ -127,7 +134,7 @@ namespace Subsurface light.Color = new Color(light.Color.R, light.Color.G, light.Color.B, currBrightness); light.Range = startRange * currBrightness; - currBrightness -= 0.1f; + currBrightness -= 0.05f; yield return CoroutineStatus.Running; } diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index 5a8491391..b77f1f36c 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -8,8 +8,10 @@ namespace Subsurface.Lights class ConvexHull { public static List list = new List(); - static BasicEffect losEffect; static BasicEffect shadowEffect; + static BasicEffect penumbraEffect; + + private static VertexPositionTexture[] penumbraVertices; private VertexPositionColor[] vertices; private short[] indices; @@ -33,6 +35,25 @@ namespace Subsurface.Lights public ConvexHull(Vector2[] points, Color color) { + if (shadowEffect == null) + { + shadowEffect = new BasicEffect(Game1.CurrGraphicsDevice); + shadowEffect.VertexColorEnabled = true; + } + if (penumbraEffect == null) + { + penumbraEffect = new BasicEffect(Game1.CurrGraphicsDevice); + penumbraEffect.TextureEnabled = true; + //shadowEffect.VertexColorEnabled = true; + penumbraEffect.LightingEnabled = false; + penumbraEffect.Texture = Game1.TextureLoader.FromFile("Content/Lights/penumbra.png"); + } + + if (penumbraVertices==null) + { + penumbraVertices = new VertexPositionTexture[6]; + } + int vertexCount = points.Length; vertices = new VertexPositionColor[vertexCount + 1]; Vector2 center = Vector2.Zero; @@ -90,37 +111,9 @@ namespace Subsurface.Lights } } - //public void Draw(GameTime gameTime) - //{ - // device.RasterizerState = RasterizerState.CullNone; - // device.BlendState = BlendState.Opaque; - - // drawingEffect.World = Matrix.CreateTranslation(position.X, position.Y, 0); - - // foreach (EffectPass pass in drawingEffect.CurrentTechnique.Passes) - // { - // pass.Apply(); - // device.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, primitiveCount); - // } - //} - public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Vector2 lightSourcePos, bool los = true) { if (!Enabled) return; - - if (losEffect == null) - { - losEffect = new BasicEffect(graphicsDevice); - losEffect.VertexColorEnabled = true; - } - if (shadowEffect==null) - { - shadowEffect = new BasicEffect(graphicsDevice); - shadowEffect.TextureEnabled = true; - //shadowEffect.VertexColorEnabled = true; - shadowEffect.LightingEnabled = false; - shadowEffect.Texture = Game1.TextureLoader.FromFile("Content/Lights/penumbra.png"); - } //compute facing of each edge, using N*L for (int i = 0; i < primitiveCount; i++) @@ -155,8 +148,6 @@ namespace Subsurface.Lights startingIndex = nextEdge; } - VertexPositionTexture[] penumbraVertices = new VertexPositionTexture[6]; - if (los) { for (int n = 0; n < 4; n+=3) @@ -233,21 +224,19 @@ namespace Subsurface.Lights currentIndex = (currentIndex + 1) % primitiveCount; } - losEffect.World = cam.ShaderTransform + shadowEffect.World = cam.ShaderTransform * Matrix.CreateOrthographic(Game1.GraphicsWidth, Game1.GraphicsHeight, -1, 1) * 0.5f; - losEffect.CurrentTechnique.Passes[0].Apply(); + shadowEffect.CurrentTechnique.Passes[0].Apply(); graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertexCount * 2 - 2); if (los) { - shadowEffect.World = cam.ShaderTransform - * Matrix.CreateOrthographic(Game1.GraphicsWidth, Game1.GraphicsHeight, -1, 1) * 0.5f; - shadowEffect.CurrentTechnique.Passes[0].Apply(); + penumbraEffect.World = shadowEffect.World; + penumbraEffect.CurrentTechnique.Passes[0].Apply(); #if WINDOWS - graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, penumbraVertices, 0, 2, VertexPositionTexture.VertexDeclaration); - + graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, penumbraVertices, 0, 2, VertexPositionTexture.VertexDeclaration); #endif } } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index bba43ce29..df8d0947b 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -648,6 +648,13 @@ namespace Subsurface.Networking public IEnumerable EndGame(string endMessage) { + var messageBox = new GUIMessageBox("The round has ended", endMessage); + + + Character.Controlled = null; + Game1.GameScreen.Cam.TargetPos = Vector2.Zero; + Game1.LightManager.LosEnabled = false; + gameStarted = false; if (connectedClients.Count > 0) @@ -685,6 +692,8 @@ namespace Subsurface.Networking Game1.GameScreen.Cam.TargetPos = offset * 0.8f; //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); + messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; + yield return CoroutineStatus.Running; } while (secondsLeft > 0.0f); @@ -692,8 +701,6 @@ namespace Subsurface.Networking Game1.NetLobbyScreen.Select(); - DebugConsole.ThrowError(endMessage); - yield return CoroutineStatus.Success; } diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index 72abd6e6f..0ee45e543 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -26,19 +26,19 @@ namespace Subsurface { using (var game = new Game1()) { -//#if !DEBUG +#if !DEBUG try { -//#endif +#endif game.Run(); -//#if !DEBUG +#if !DEBUG } catch (Exception e) { CrashDump(game, "crashreport.txt", e); } -//#endif +#endif } } @@ -60,11 +60,11 @@ namespace Subsurface if (Game1.Server != null) { - sb.AppendLine("Server (" +(Game1.Server.GameStarted ? "Round had started" : "Round hand't been started")); + sb.AppendLine("Server (" +(Game1.Server.GameStarted ? "Round had started)" : "Round hand't been started)")); } else if (Game1.Client != null) { - sb.AppendLine("Server (" +(Game1.Client.GameStarted ? "Round had started" : "Round hand't been started")); + sb.AppendLine("Client (" +(Game1.Client.GameStarted ? "Round had started)" : "Round hand't been started)")); } sb.AppendLine("\n"); @@ -85,7 +85,7 @@ namespace Subsurface } - sw.WriteLine(sb.ToString()); + sw.WriteLine(sb.ToString()); MessageBox.Show( "A crash report (''crashreport.txt'') was saved in the root folder of the game."+ " If you'd like to help fix this bug, please make a bug report on the Undertow Games forum with the report attached.", diff --git a/Subsurface/Source/Screens/EditCharacterScreen.cs b/Subsurface/Source/Screens/EditCharacterScreen.cs index bea7865ef..7c3fe342f 100644 --- a/Subsurface/Source/Screens/EditCharacterScreen.cs +++ b/Subsurface/Source/Screens/EditCharacterScreen.cs @@ -43,20 +43,19 @@ namespace Subsurface cam = new Camera(); - GUIpanel = new GUIFrame(new Rectangle(0, 0, 300, Game1.GraphicsHeight), Color.DarkGray * 0.8f); + GUIpanel = new GUIFrame(new Rectangle(0, 0, 300, Game1.GraphicsHeight), GUI.style); GUIpanel.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); physicsButton = new GUIButton(new Rectangle(0, 50, 200, 25), "Physics", Alignment.Left, GUI.style, GUIpanel); physicsButton.OnClicked += TogglePhysics; - new GUITextBlock(new Rectangle(0, 80, 0, 25), "Limbs:", Color.Transparent, Color.Black, Alignment.Left, null, GUIpanel); + new GUITextBlock(new Rectangle(0, 80, 0, 25), "Limbs:", GUI.style, GUIpanel); limbList = new GUIListBox(new Rectangle(0, 110, 0, 250), Color.White * 0.7f, GUI.style, GUIpanel); limbList.OnSelected = SelectLimb; - new GUITextBlock(new Rectangle(0, 360, 0, 25), "Joints:", Color.Transparent, Color.Black, Alignment.Left, null, GUIpanel); + new GUITextBlock(new Rectangle(0, 360, 0, 25), "Joints:", GUI.style, GUIpanel); jointList = new GUIListBox(new Rectangle(0, 390, 0, 250), Color.White * 0.7f, GUI.style, GUIpanel); - - + while (Character.CharacterList.Count > 1) { Character.CharacterList.First().Remove(); @@ -226,7 +225,7 @@ namespace Subsurface new Rectangle(0,0,0,25), limb.type.ToString(), Color.Transparent, - Color.Black, + Color.White, Alignment.Left, null, limbList); textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); @@ -243,7 +242,7 @@ namespace Subsurface new Rectangle(0, 0, 0, 25), limb1.type.ToString() + " - " + limb2.type.ToString(), Color.Transparent, - Color.Black, + Color.White, Alignment.Left, null, jointList); textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 6bfc35afe..1cb4753e0 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -31,7 +31,7 @@ namespace Subsurface selectedTab = -1; - GUIpanel = new GUIFrame(new Rectangle(0,0, 120, Game1.GraphicsHeight), Color.DarkGray*0.8f); + GUIpanel = new GUIFrame(new Rectangle(0, 0, 150, Game1.GraphicsHeight), GUI.style); GUIpanel.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); //GUIListBox constructionList = new GUIListBox(new Rectangle(0, 0, 0, 300), Color.White * 0.7f, GUIpanel); //constructionList.OnSelected = MapEntityPrefab.SelectPrefab; @@ -50,13 +50,13 @@ namespace Subsurface GUItabs = new GUIComponent[2]; int width = 400, height = 400; - GUItabs[0] = new GUIFrame(new Rectangle(Game1.GraphicsWidth/2-width/2, Game1.GraphicsHeight/2-height/2, width, height), Color.DarkGray*0.8f); + GUItabs[0] = new GUIFrame(new Rectangle(Game1.GraphicsWidth/2-width/2, Game1.GraphicsHeight/2-height/2, width, height), GUI.style); GUItabs[0].Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); GUIListBox itemList = new GUIListBox(new Rectangle(0, 0, 0, 0), Color.White * 0.7f, GUI.style, GUItabs[0]); itemList.OnSelected = SelectPrefab; itemList.CheckSelected = MapEntityPrefab.GetSelected; - - GUItabs[1] = new GUIFrame(new Rectangle(Game1.GraphicsWidth / 2 - width / 2, Game1.GraphicsHeight / 2 - height / 2, width, height), Color.DarkGray * 0.8f); + + GUItabs[1] = new GUIFrame(new Rectangle(Game1.GraphicsWidth / 2 - width / 2, Game1.GraphicsHeight / 2 - height / 2, width, height), GUI.style); GUItabs[1].Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); GUIListBox structureList = new GUIListBox(new Rectangle(0, 0, 0, 300), Color.White * 0.7f, GUI.style, GUItabs[1]); structureList.OnSelected = SelectPrefab; @@ -65,7 +65,7 @@ namespace Subsurface foreach (MapEntityPrefab ep in MapEntityPrefab.list) { GUIListBox parent = ((ep as ItemPrefab) == null) ? structureList : itemList; - Color color = ((parent.CountChildren % 2) == 0) ? Color.White : Color.LightGray; + Color color = ((parent.CountChildren % 2) == 0) ? Color.Transparent : Color.White * 0.1f; GUIFrame frame = new GUIFrame(new Rectangle(0, 0, 0, 50), Color.Transparent, null, parent); frame.UserData = ep; @@ -77,7 +77,7 @@ namespace Subsurface GUITextBlock textBlock = new GUITextBlock( new Rectangle(40, 0, 0, 25), ep.Name, - Color.Transparent, Color.Black, + Color.Transparent, Color.White, Alignment.Left, Alignment.Left, null, frame); textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f); @@ -130,6 +130,8 @@ namespace Subsurface private bool ToggleCharacterMode(GUIButton button, object obj) { + selectedTab = 0; + characterMode = !characterMode; button.Color = (characterMode) ? Color.Gold : Color.White; diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index d76552e98..24ce258b6 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -284,6 +284,7 @@ namespace Subsurface if (infoFrame.children.Find(c => c.UserData as string == "playyourself") == null) { var playYourself = new GUITickBox(new Rectangle(0, -20, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame); + playYourself.Selected = Game1.Server.CharacterInfo != null; playYourself.OnSelected = TogglePlayYourself; playYourself.UserData = "playyourself"; } @@ -373,6 +374,7 @@ namespace Subsurface if (IsServer && Game1.Server != null) { Game1.Server.CharacterInfo = null; + Game1.Server.Character = null; var playYourself = new GUITickBox(new Rectangle(0, -20, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame); playYourself.OnSelected = TogglePlayYourself; @@ -577,9 +579,14 @@ namespace Subsurface { if (string.IsNullOrEmpty(newName)) return false; - Game1.Client.CharacterInfo.Name = newName; - Game1.Client.Name = newName; - Game1.Client.SendCharacterData(); + if (Game1.NetworkMember == null || Game1.NetworkMember.CharacterInfo == null) return true; + + Game1.NetworkMember.CharacterInfo.Name = newName; + if (Game1.Client != null) + { + Game1.Client.Name = newName; + Game1.Client.SendCharacterData(); + } textBox.Text = newName; textBox.Selected = false; diff --git a/Subsurface_Solution.sln b/Subsurface_Solution.sln index 5255b3473..9d5b8a22c 100644 --- a/Subsurface_Solution.sln +++ b/Subsurface_Solution.sln @@ -15,6 +15,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Launcher\Launch EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lidgren.Network", "Lidgren.Network\Lidgren.Network.csproj", "{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{30B01820-F0C0-4C31-8BE7-804EE61DBC8A}" + ProjectSection(SolutionItems) = preProject + Performance1.psess = Performance1.psess + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Android|Any CPU = Android|Any CPU @@ -302,4 +307,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 7426e91962b88656c706fd8a324d726420b00bad..a2950347a57a7a6ace982cc82476bbbbae3903e0 100644 GIT binary patch delta 16499 zcmeHu3s{s@xBu+-KHMA;5s`3&5lIn8L{w4(#JeJ1Qd2X$qaq@X*HQ-KGfPtBtyy_V z5q0!4Q@rt-nc*cMzt|`e`Xec-y3h z%6)uv#H<2%H+6?>ZT~X@jgW0B=y>2;@Q;Ef0kHtrNoPQYd>GIbcuGGZhX-&qEe7%- z=>Z%9Unpewm02cAf3A;0O^dIq60Q#3W!{ZHssiFas6tQD!W#eG-s%ga0e|Q#FXErm z*MvXoD_7wn4Hg3A0X)1I^m$+j@LY|I%PFc-jB3ugmmysVtg4A!1NsWEwkEut7F3Fl z2JoaiA=*_V-UmwMm7>+cV>oI**B4?hi3h0P7ou%No`sxWh*n=N`4*YJ;|0*pCPIh` z&XcYj=_t0oWQqJg+x!ULk=m~}%xEF-SAfgDhB?gxKa%Oev7yb{As7by3Xuw|1KvkC z5*Q4Af&O@Gc+TqxT|sC$s0yS4cHn8q>_84+LwEz|31B?q3Q`U*3(HEl(p2!Zp!D4+`X2zVIs&q0p^UBK@ET?DE} zwGZl83T8C07Q#8etKeS+Jq1L8UkUme5CL>YxGyMgrT%pL$Pu>@*bTHt#E+l{fuDd^ zfPaDPP0(`SEO-}aG-w(y7yMG7CHTgG4E_ty_kjL@mr1|l+e3Q<;#L41>LxVQ)BG9; zyG{CRzlFjslYYbRw9v>z1O6&D*X@EiYN=#0dGn4h>RNX>!ABH*8yfW18HVInC@o&uDCFX!lGH2 z)&)_Cb)(4<%?9X4gtk-#Mr5t-7f6maEPq#Lt3=k@;t*lAMze2=gQQCjWUuNYIAy{D ze3a(h7F+4IRn7Fb1KP-)xJbV#JgnO$hwSc}bg4O6gM@HillMBrxnUgm^t*$@jp87o z88e$sq2RCT7Vg{BY%;B=PG~C96Z<_wm93S~-NjQzH`kpBHp8}rS(!EmdFIv4M~>&J z`{e6XOs4fU1+38%ThF4RDN5w-wS{@%yTkThWV`lR1>HIeDh^DQccWPc^?~_q^tAjC zO8#9u0LJQpU6AN#U!imH0ZZZ2VMbU-@gj5e6KuO}r*A(@)*CF`%=ieM!6I>QgvfED zR<$=+s#cD;j~|Txg>Bnx9m|9b*4qMEe`QclKwEPB$_AKCThODe5A>>v%RSY+`heVV zv!=Iu(bLs6z5PT_oYR}Ol`4gMD_F8Dz=|)j#$Pmv{~2d|be+@M0CB?(79S-Ni1l zQVR?7qp*F#dNUi3?u-NO+i2B3Aypd%(c}ljj@JdO3VmWE%!zG$8XI9&c1I*@2$OX8 zs$jiqfMO&sWOFmin=vDTx9zFRY-TFd)6ntDjn8OXyr?FTdF%I574_c z@icU+akC9mLtM=nCT4sED{Kp8q(B*NKPI?`Fh7@%RHhu#$u=#sx?rzP{4&3J4gdsVL1f{leS zEeSnIsoNWJG-o#`?YiPm1;e!fqac%I$))k)*R08=BhTKt5j+~46}=`wUvFA9c6`lK3;A+SZ3?lH!!i!8vH{4yhN zx5k7TVM&1CMMZNIFJrPBF|KXG_!W6U^z=5tX2B5LZHcXln-c%1WSh`yMP5MTWC(i# zJ!&Fr6WpcduL+-$voUPKwue=ib9SLcgMfx;Z#z&2umm&wLr{OnUIc#tyccM1paT#K zYzM9ZyxN(d>wy=54B!#09w$IQK|TZYdC*&c0{%0AZx^2eEBGqR3-}9!6Cij7^fe#> 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 delta 13809 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