From 237df1876531f82187cb2870d0e1d685ffcae28c Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 15 Jul 2015 23:34:13 +0300 Subject: [PATCH] fixed railgun, fixed repairtools radar ping & improved rendering, waypoint bugfixes, inventory bugfixes, syncing wires between clients --- Subsurface/Characters/AI/PathFinder.cs | 4 +- Subsurface/Characters/Jobs/Job.cs | 9 +- Subsurface/Characters/Ragdoll.cs | 2 +- Subsurface/Content/Items/Engine/engine.xml | 1 + Subsurface/Content/Items/Engine/radarPing.ogg | Bin 0 -> 11907 bytes Subsurface/Content/Items/Weapons/railgun.xml | 22 +++- .../Content/Items/Weapons/railgunbase.png | Bin 1287 -> 2001 bytes Subsurface/Content/randomevents.xml | 17 ++- Subsurface/GUI/GUI.cs | 14 +-- Subsurface/GUI/GUIListBox.cs | 25 +++- Subsurface/GUI/GUIScrollBar.cs | 5 +- Subsurface/GameSession/GameMode.cs | 2 +- Subsurface/GameSession/GameSession.cs | 10 +- Subsurface/Items/CharacterInventory.cs | 8 +- .../Items/Components/Holdable/RepairTool.cs | 2 +- Subsurface/Items/Components/ItemComponent.cs | 36 +++--- Subsurface/Items/Components/Ladder.cs | 6 +- .../Items/Components/Machines/Controller.cs | 87 ++++++++----- Subsurface/Items/Components/Machines/Radar.cs | 15 ++- .../Items/Components/Machines/Steering.cs | 67 +++++----- .../Components/Signal/ConnectionPanel.cs | 57 ++++----- Subsurface/Items/Components/Signal/Wire.cs | 81 ++++++------ Subsurface/Items/Components/Turret.cs | 117 +++++++++--------- Subsurface/Items/Inventory.cs | 31 ++--- Subsurface/Items/Item.cs | 5 +- Subsurface/Items/ItemInventory.cs | 7 ++ Subsurface/Items/RelatedItem.cs | 2 +- Subsurface/Map/Levels/Level.cs | 31 ++--- Subsurface/Map/MapEntity.cs | 7 +- Subsurface/Map/Submarine.cs | 26 ++-- Subsurface/Map/WayPoint.cs | 13 +- Subsurface/Networking/GameClient.cs | 6 +- Subsurface/Networking/GameServer.cs | 63 +++++----- Subsurface/Networking/NetworkMember.cs | 23 +++- Subsurface/Properties.cs | 11 +- Subsurface/Screens/NetLobbyScreen.cs | 49 ++------ Subsurface/Subsurface.csproj | 3 + Subsurface/Subsurface.csproj.user | 2 +- Subsurface_Solution.v12.suo | Bin 388096 -> 416768 bytes 39 files changed, 461 insertions(+), 405 deletions(-) create mode 100644 Subsurface/Content/Items/Engine/radarPing.ogg diff --git a/Subsurface/Characters/AI/PathFinder.cs b/Subsurface/Characters/AI/PathFinder.cs index 1ba662db4..0e4c8dfd4 100644 --- a/Subsurface/Characters/AI/PathFinder.cs +++ b/Subsurface/Characters/AI/PathFinder.cs @@ -116,7 +116,7 @@ namespace Subsurface if (startNode == null || endNode == null) { DebugConsole.ThrowError("Pathfinding error, couldn't find pathnodes"); - return null; + return new SteeringPath(); } return FindPath(startNode,endNode); @@ -141,7 +141,7 @@ namespace Subsurface if (startNode==null || endNode==null) { DebugConsole.ThrowError("Pathfinding error, couldn't find matching pathnodes to waypoints"); - return null; + return new SteeringPath();; } } diff --git a/Subsurface/Characters/Jobs/Job.cs b/Subsurface/Characters/Jobs/Job.cs index c90ab4ad0..2e97c48de 100644 --- a/Subsurface/Characters/Jobs/Job.cs +++ b/Subsurface/Characters/Jobs/Job.cs @@ -86,9 +86,12 @@ namespace Subsurface foreach (XElement subElement in element.Elements()) { + if (subElement.Name.ToString().ToLower() != "skill") continue; + string skillName = ToolBox.GetAttributeString(subElement, "name", ""); + if (string.IsNullOrEmpty(name)) continue; skills.Add( - subElement.Name.ToString(), - new Skill(subElement.Name.ToString(), ToolBox.GetAttributeInt(subElement, "level", 0))); + skillName, + new Skill(skillName, ToolBox.GetAttributeInt(subElement, "level", 0))); } } @@ -115,7 +118,7 @@ namespace Subsurface foreach (KeyValuePair skill in skills) { - jobElement.Add(new XElement(skill.Key, new XAttribute("level", skill.Value.Level))); + jobElement.Add(new XElement("skill", new XAttribute("name", skill.Value.Name), new XAttribute("level", skill.Value.Level))); } parentElement.Add(jobElement); diff --git a/Subsurface/Characters/Ragdoll.cs b/Subsurface/Characters/Ragdoll.cs index dd00ad5c4..937e7649d 100644 --- a/Subsurface/Characters/Ragdoll.cs +++ b/Subsurface/Characters/Ragdoll.cs @@ -609,7 +609,7 @@ namespace Subsurface float dist = Vector2.Distance(limbPos, gapPos); - force += Vector2.Normalize(gap.FlowForce)*(Math.Max(gap.FlowForce.Length() - dist, 0.0f)/500.0f); + force += Vector2.Normalize(gap.FlowForce)*(Math.Max(gap.FlowForce.Length() - dist, 0.0f)/1000.0f); } if (force.Length() > 20.0f) return force; diff --git a/Subsurface/Content/Items/Engine/engine.xml b/Subsurface/Content/Items/Engine/engine.xml index 856d8462b..cb3318286 100644 --- a/Subsurface/Content/Items/Engine/engine.xml +++ b/Subsurface/Content/Items/Engine/engine.xml @@ -31,6 +31,7 @@ + diff --git a/Subsurface/Content/Items/Engine/radarPing.ogg b/Subsurface/Content/Items/Engine/radarPing.ogg new file mode 100644 index 0000000000000000000000000000000000000000..41284f48b19ee698ffdd7084b33acca3f5189ec3 GIT binary patch literal 11907 zcmcI~bzGEB_vkDvDX}0eu^hlt`BgOLsR&sR+1I0@4!Foq~Y^0uqXZbcZNN zwbM)}E^|E#IM&WV8h)zF6$=}d}0a9p0SRL7l>yN_% zfB?XP8%6cRP6bt%n9FzXX`(V7Y88rjni$c_WE~~k_D_ctv!Mq74sd*AG5L!sPQ7S* zCf*p&9JHgRL@|;i^42#r*@xW=)^0^_ik#hgQ9PuShC~3;i>xwdC>;jhS%q_kF+trU zR?iO3;tWsnizPWhhINy zUds4aM|L6y65>UknArv)Pl`t$jw*WU386X_3kh(Lm_R9>PURI{*DKbZ0dB1=fm>(A z2Sjh`=xSi0=3}bwYdhxaGv*s$_%zh`ZGhq1P~-7X(_f*MOkw|eeg{nd!apaXBVi!t zJUV#}mB+=BH;c|A3<)bI05*7)AjuNAPzm`eMRrcl9n-5Fo>jYcRSI-fQk*P-YzoJ7 z19BYGivH`dGfcMqe?PJg9T$Ntq|5f(tnIhCZ(_LHJq1WkG~59oo62GYT0O;-yu{kQ zq@YL1Tj5ipde4qJ^*=_yn;igIVb<2$te+rlU<8Le#r3_ek9lc~L8`!OtpnaQ+?>%JrvH$5lvXI>@ z$C=tPgOC9+#8z~iMVwFAy<@4K|*7yroxi?PUw%28A%>#RB4x7e`kuW_dkFD?1lfjT-S6CSp`k zg{Kh(85L<0Cr8YD5+q?yJv&jwP*nV<;eK%U(Xb8t$J6(d^%gA;^bCjy>WE&)>SFbM zT@6!wCTl`X$9<;90;b2J%^Ab~r(^v)asU)GAty1JXcZ;go)N4mPj+hHeW)r>==<&R-5P2`FySJ|M~noa+Ex|p$Cebo1WbN5joAmtT&)&sua-J zK9%wM0Hjdwn~eWy005ffDAZ2!$SsWE2u6GaBZ$?#{(p}cXm&(QV@M2AY!U#>0Nl7v z%Z7FHTW z5Xraa+$zc;fzlov+yVe6+$Q{y$+K7GQ;tHfFj;0|2b#C=$)E~KFqugd#ZyFUJ)e<3 zsPd^Gkx4Bwvw+q*q5}E|kU&3Ya{J@xVX|}pSW#feQK5;LUesb7rc-!<6{CtS&d}*a zld^?G3KM4rBT$8`I=!eR){t(wg^b{SIX(c8%`oUko=?o?CP46lZ*i=BPsG&dc+}3` z)S|N;JFB6eEY?FOeoGhIa~3r< zjM$NC+ewB%eaLM@H6|FaBcmE4RX$_M0jAZirccFs#PFyz=&&Q+*vTunWs2+i`B zl?gm9yVzAGa8P%#zV1?4ncK5Ufx{yHwZ@HusL4^E8C_FTecOp&Si`-5$zMq`qdu0u z)rYDz^hbPjd;-3X`pl)enoB5RM*^_Pp_WOuGh+c9Uw_eHv11U^zR;LCqp$r$fH`XI z%FJj$@AremnefZ3wbd1@uiehNebrB%{*CGqmAXEZ=&FPD`RZ-@wZ_MI-__JUs%&+w zOkf+UzZW{mc(H!-+|3gj0p?Y<*5d)wcYQ5CRk>Qe4PcuXO=|o(f6z8ih@>s#(>OvPizBnmIdO^%0D|MZB2lDCRtQN_ln(+^#uOZf=H;=bQsv_*M5sE^ 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 + linkable="true" + pickdistance="150"> @@ -12,6 +13,13 @@ powerconsumption="500.0"> + + + + + + + - + + + + + + + - + + + diff --git a/Subsurface/Content/Items/Weapons/railgunbase.png b/Subsurface/Content/Items/Weapons/railgunbase.png index 7e1492d39fb74c267f42ef3298b0727b4760c7d5..bf2ef92f7741b6cfbfe72c01182dcdf0fd07eac6 100644 GIT binary patch literal 2001 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 A{Qv*} diff --git a/Subsurface/Content/randomevents.xml b/Subsurface/Content/randomevents.xml index beb43f35c..027a43ca1 100644 --- a/Subsurface/Content/randomevents.xml +++ b/Subsurface/Content/randomevents.xml @@ -3,7 +3,7 @@ @@ -14,4 +14,19 @@ difficulty="50" starttimemin="15" starttimemax="20" musictype="monster"/> + + + + \ No newline at end of file diff --git a/Subsurface/GUI/GUI.cs b/Subsurface/GUI/GUI.cs index f31ba8eaf..bcb251288 100644 --- a/Subsurface/GUI/GUI.cs +++ b/Subsurface/GUI/GUI.cs @@ -265,20 +265,18 @@ namespace Subsurface public static void Draw(float deltaTime, SpriteBatch spriteBatch, Camera cam) { spriteBatch.DrawString(font, - "FPS: " + (int)Game1.frameCounter.AverageFramesPerSecond, + "FPS: " + (int)Game1.frameCounter.AverageFramesPerSecond + + " - Physics: " + Game1.World.UpdateTime + + " - bodies: " + Game1.World.BodyList.Count, new Vector2(10, 10), Color.White); - spriteBatch.DrawString(font, - "Physics: " + Game1.World.UpdateTime - + " - bodies: " + Game1.World.BodyList.Count, - new Vector2(10, 30), Color.White); spriteBatch.DrawString(font, "Camera pos: " + Game1.GameScreen.Cam.Position, - new Vector2(10, 50), Color.White); - - + new Vector2(10, 30), Color.White); + if (Character.Controlled != null && cam!=null) Character.Controlled.DrawHud(spriteBatch, cam); + if (Game1.NetworkMember != null) Game1.NetworkMember.Draw(spriteBatch); DrawMessages(spriteBatch, (float)deltaTime); diff --git a/Subsurface/GUI/GUIListBox.cs b/Subsurface/GUI/GUIListBox.cs index 43d0d4b83..09f6f0a43 100644 --- a/Subsurface/GUI/GUIListBox.cs +++ b/Subsurface/GUI/GUIListBox.cs @@ -44,6 +44,17 @@ namespace Subsurface } } + public float BarScroll + { + get { return scrollBar.BarScroll; } + set { scrollBar.BarScroll = value; } + } + + public float BarSize + { + get { return scrollBar.BarSize; } + } + public int Spacing { get { return spacing; } @@ -173,14 +184,16 @@ namespace Subsurface { base.AddChild(child); - float oldScroll = scrollBar.BarScroll; - float oldSize = scrollBar.BarSize; + //float oldScroll = scrollBar.BarScroll; + //float oldSize = scrollBar.BarSize; UpdateScrollBarSize(); - if (scrollBar.BarSize < 1.0f && oldScroll == 1.0f) - { - scrollBar.BarScroll = 1.0f; - } + //if (oldSize == 1.0f && scrollBar.BarScroll == 0.0f) scrollBar.BarScroll = 1.0f; + + //if (scrollBar.BarSize < 1.0f && oldScroll == 1.0f) + //{ + // scrollBar.BarScroll = 1.0f; + //} } diff --git a/Subsurface/GUI/GUIScrollBar.cs b/Subsurface/GUI/GUIScrollBar.cs index fa7568518..0ab9663d7 100644 --- a/Subsurface/GUI/GUIScrollBar.cs +++ b/Subsurface/GUI/GUIScrollBar.cs @@ -107,9 +107,10 @@ namespace Subsurface private void UpdateRect() { + bar.Rect = new Rectangle( - frame.Rect.X, - frame.Rect.Y, + bar.Rect.X, + bar.Rect.Y, isHorizontal ? (int)(frame.Rect.Width * barSize) : frame.Rect.Width, isHorizontal ? frame.Rect.Height : (int)(frame.Rect.Height * barSize)); diff --git a/Subsurface/GameSession/GameMode.cs b/Subsurface/GameSession/GameMode.cs index bdd7acd68..ce89ffbe2 100644 --- a/Subsurface/GameSession/GameMode.cs +++ b/Subsurface/GameSession/GameMode.cs @@ -120,7 +120,7 @@ namespace Subsurface { if (!isRunning) return; - if (duration!=TimeSpan.Zero) + if (duration != TimeSpan.Zero) { double elapsedTime = (DateTime.Now - startTime).TotalSeconds; timerBar.BarSize = (float)(elapsedTime / duration.TotalSeconds); diff --git a/Subsurface/GameSession/GameSession.cs b/Subsurface/GameSession/GameSession.cs index c9fd04fc5..25477bd55 100644 --- a/Subsurface/GameSession/GameSession.cs +++ b/Subsurface/GameSession/GameSession.cs @@ -134,14 +134,6 @@ namespace Subsurface submarine.SetPosition(level.StartPosition - new Vector2(0.0f, 2000.0f)); } - foreach (Item item in Item.itemList) - { - foreach (ItemComponent ic in item.components) - { - ic.OnMapLoaded(); - } - } - taskManager.StartShift(level); } @@ -227,7 +219,7 @@ namespace Subsurface //double elapsedTime = (DateTime.Now-startTime).TotalSeconds; //timerBar.BarSize = (float)(elapsedTime / Math.Max(duration, 1.0)); - if (PlayerInput.KeyHit(Keys.Tab)) + if (PlayerInput.KeyHit(Keys.Tab) && textBox!=null) { if (textBox.Selected) { diff --git a/Subsurface/Items/CharacterInventory.cs b/Subsurface/Items/CharacterInventory.cs index 5606c124f..e924accb7 100644 --- a/Subsurface/Items/CharacterInventory.cs +++ b/Subsurface/Items/CharacterInventory.cs @@ -25,6 +25,12 @@ namespace Subsurface this.character = character; } + protected override void DropItem(Item item) + { + item.Drop(character); + item.body.SetTransform(character.SimPosition, 0.0f); + } + public int FindLimbSlot(LimbSlot limbSlot) { for (int i = 0; i < items.Length; i++) @@ -232,7 +238,7 @@ namespace Subsurface else { draggingItem.body.SetTransform(character.SimPosition, 0.0f); - draggingItem.Drop(character); + DropItem(draggingItem); //draggingItem = null; } } diff --git a/Subsurface/Items/Components/Holdable/RepairTool.cs b/Subsurface/Items/Components/Holdable/RepairTool.cs index dce55bfde..7cd21e7e8 100644 --- a/Subsurface/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Items/Components/Holdable/RepairTool.cs @@ -129,7 +129,7 @@ namespace Subsurface.Items.Components targetStructure.HighLightSection(sectionIndex); - + targetStructure.AddDamage(sectionIndex, -structureFixAmount); } else if ((targetLimb = (targetBody.UserData as Limb)) != null) diff --git a/Subsurface/Items/Components/ItemComponent.cs b/Subsurface/Items/Components/ItemComponent.cs index 1b644c05a..d500b0498 100644 --- a/Subsurface/Items/Components/ItemComponent.cs +++ b/Subsurface/Items/Components/ItemComponent.cs @@ -284,6 +284,11 @@ namespace Subsurface { return false; } + + public virtual bool Select(Character character) + { + return CanBeSelected; + } /// a character has dropped the item public virtual void Drop(Character dropper) { } @@ -395,40 +400,31 @@ namespace Subsurface return true; } - public bool HasRequiredEquippedItems(Character character, bool addMessage) + public bool HasRequiredItems(Character character, bool addMessage) { if (!requiredItems.Any()) return true; + + foreach (RelatedItem ri in requiredItems) { + if (!ri.Type.HasFlag(RelatedItem.RelationType.Equipped) && !ri.Type.HasFlag(RelatedItem.RelationType.Picked)) continue; + + bool hasItem = false; if (ri.Type.HasFlag(RelatedItem.RelationType.Equipped)) { - for (int i = 0; i < character.SelectedItems.Length; i++ ) - { - Item selectedItem = character.SelectedItems[i]; - if (selectedItem !=null && selectedItem.Condition>0.0f && ri.MatchesItem(selectedItem )) - { - return true; - } - } - - //if (addMessage && !String.IsNullOrEmpty(ri.Msg)) GUI.AddMessage(ri.Msg, Color.Red); - return false; + if (character.SelectedItems.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) != null) hasItem = true; } - else if (ri.Type.HasFlag(RelatedItem.RelationType.Picked)) + if (!hasItem && ri.Type.HasFlag(RelatedItem.RelationType.Picked)) { - Item pickedItem = character.Inventory.items.FirstOrDefault(x => x!=null && x.Condition>0.0f && ri.MatchesItem(x)); - if (pickedItem == null) - { - //if (addMessage && !String.IsNullOrEmpty(ri.Msg)) GUI.AddMessage(ri.Msg, Color.Red); - return false; - } + if (character.Inventory.items.FirstOrDefault(x => x!=null && x.Condition>0.0f && ri.MatchesItem(x))!=null) hasItem = true; } + if (!hasItem) return false; } return true; } - + public void ApplyStatusEffects(ActionType type, float deltaTime, Character character = null) { foreach (StatusEffect effect in statusEffects) diff --git a/Subsurface/Items/Components/Ladder.cs b/Subsurface/Items/Components/Ladder.cs index 89f97803e..9323bf328 100644 --- a/Subsurface/Items/Components/Ladder.cs +++ b/Subsurface/Items/Components/Ladder.cs @@ -10,11 +10,11 @@ namespace Subsurface.Items.Components { } - public override bool Pick(Character picker = null) + public override bool Select(Character character = null) { - if (picker == null) return false; + if (character == null) return false; - picker.AnimController.Anim = AnimController.Animation.Climbing; + character.AnimController.Anim = AnimController.Animation.Climbing; //picker.SelectedConstruction = item; return true; diff --git a/Subsurface/Items/Components/Machines/Controller.cs b/Subsurface/Items/Components/Machines/Controller.cs index 2c5067435..a968e8ed9 100644 --- a/Subsurface/Items/Components/Machines/Controller.cs +++ b/Subsurface/Items/Components/Machines/Controller.cs @@ -23,6 +23,8 @@ namespace Subsurface.Items.Components //the x-position where the user walks to when using the controller float userPos; + Camera cam; + Character character; [HasDefaultValue(1.0f,false)] @@ -38,19 +40,6 @@ namespace Subsurface.Items.Components dir = (Direction)Enum.Parse(typeof(Direction), ToolBox.GetAttributeString(element, "direction", "None"), true); - //userPos = ToolBox.GetAttributeInt(element, "userpos", 1); - - //string allowedIdString = ToolBox.GetAttributeString(element, "allowedids", ""); - //if (allowedIdString!="") - //{ - // string[] splitIds = allowedIdString.Split(','); - // allowedIDs = new string[splitIds.Length]; - // for (int i = 0; i1.0f) + { + item.Use(deltaTime,null); + pingState = 0.0f; + } - angle = (angle + deltaTime) % MathHelper.TwoPi; + //angle = (angle + deltaTime) % MathHelper.TwoPi; + } + + public override bool Use(float deltaTime, Character character = null) + { + return true; } public override void DrawHUD(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Character character) diff --git a/Subsurface/Items/Components/Machines/Steering.cs b/Subsurface/Items/Components/Machines/Steering.cs index 991be701a..305bbd46d 100644 --- a/Subsurface/Items/Components/Machines/Steering.cs +++ b/Subsurface/Items/Components/Machines/Steering.cs @@ -34,45 +34,37 @@ namespace Subsurface.Items.Components { isActive = true; } - - public override void OnMapLoaded() - { - PathFinder pathFinder = new PathFinder(WayPoint.WayPointList, false); - steeringPath = pathFinder.FindPath( - ConvertUnits.ToSimUnits(Level.Loaded.StartPosition), - ConvertUnits.ToSimUnits(Level.Loaded.EndPosition)); - } - + public override void Update(float deltaTime, Camera cam) { base.Update(deltaTime, cam); - if (autoPilot || true) + + + if (autoPilot) { - steeringPath.GetNode(Vector2.Zero, 5.0f); + if (steeringPath==null) + { + PathFinder pathFinder = new PathFinder(WayPoint.WayPointList, false); + steeringPath = pathFinder.FindPath( + ConvertUnits.ToSimUnits(Level.Loaded.StartPosition), + ConvertUnits.ToSimUnits(Level.Loaded.EndPosition)); + } + + steeringPath.GetNode(Vector2.Zero, 20.0f); if (steeringPath.CurrentNode!=null) { - Vector2 targetSpeed = steeringPath.CurrentNode.Position; + float prediction = 10.0f; - float dist = targetSpeed.Length(); + Vector2 futurePosition = Submarine.Loaded.Speed * prediction; + + Vector2 targetSpeed = (steeringPath.CurrentNode.Position - futurePosition); + + //float dist = targetSpeed.Length(); targetSpeed = Vector2.Normalize(targetSpeed); - if (dist<2000.0f) - { - targetSpeed = targetSpeed * Math.Max(dist / 2000.0f, 0.5f); - - } - - - Vector2 currSpeed = (Submarine.Loaded.Speed == Vector2.Zero) ? Vector2.Zero : Vector2.Normalize(Submarine.Loaded.Speed); - - //targetSpeed.X = (targetSpeed.X - currSpeed.X); - //targetSpeed.Y = (targetSpeed.Y - currSpeed.Y); - - //TargetVelocity += targetSpeed; - - TargetVelocity += (targetSpeed-currSpeed); + TargetVelocity = targetSpeed*100.0f; } } @@ -91,6 +83,13 @@ namespace Subsurface.Items.Components Rectangle velRect = new Rectangle(x + 20, y + 20, width - 40, height - 40); GUI.DrawRectangle(spriteBatch, velRect, Color.White, false); + if (GUI.DrawButton(spriteBatch, new Rectangle(x + width - 150, y + height - 30, 150, 30), "Autopilot")) + { + autoPilot = !autoPilot; + + item.NewComponentEvent(this, true); + } + GUI.DrawLine(spriteBatch, new Vector2(velRect.Center.X,velRect.Center.Y), new Vector2(velRect.Center.X + currVelocity.X, velRect.Center.Y - currVelocity.Y), @@ -113,10 +112,10 @@ namespace Subsurface.Items.Components { targetVelocity = PlayerInput.MousePosition - new Vector2(velRect.Center.X, velRect.Center.Y); targetVelocity.Y = -targetVelocity.Y; + + item.NewComponentEvent(this, true); } } - - item.NewComponentEvent(this, true); } public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f) @@ -131,14 +130,19 @@ namespace Subsurface.Items.Components { message.Write(targetVelocity.X); message.Write(targetVelocity.Y); + + message.Write(autoPilot); } public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message) { - Vector2 newTargetVelocity = Vector2.Zero; + Vector2 newTargetVelocity = Vector2.Zero; + bool newAutoPilot = false; + try { newTargetVelocity = new Vector2(message.ReadFloat(), message.ReadFloat()); + newAutoPilot = message.ReadBoolean(); } catch @@ -147,6 +151,7 @@ namespace Subsurface.Items.Components } TargetVelocity = newTargetVelocity; + autoPilot = newAutoPilot; } } } diff --git a/Subsurface/Items/Components/Signal/ConnectionPanel.cs b/Subsurface/Items/Components/Signal/ConnectionPanel.cs index 4b48bea80..50cbd499f 100644 --- a/Subsurface/Items/Components/Signal/ConnectionPanel.cs +++ b/Subsurface/Items/Components/Signal/ConnectionPanel.cs @@ -1,5 +1,6 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using System; using System.Collections.Generic; using System.Xml.Linq; @@ -28,26 +29,13 @@ namespace Subsurface.Items.Components break; } } + + isActive = true; } - //public override void Move(Vector2 amount) - //{ - // base.Move(amount); - - // foreach (Connection c in connections) - // { - // foreach (Wire w in c.wires) - // { - // if (w == null) continue; - - // w.Move - // } - // } - //} - public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - if (user!=character) return; + if (character != Character.Controlled || character != user) return; Connection.DrawConnections(spriteBatch, this, character); } @@ -76,7 +64,7 @@ namespace Subsurface.Items.Components if (user != null && user.SelectedConstruction != item) user = null; } - public override bool Pick(Character picker) + public override bool Select(Character picker) { user = picker; isActive = true; @@ -107,10 +95,12 @@ namespace Subsurface.Items.Components { foreach (Connection c in connections) { - int wireCount = c.Wires.Length; - for (int i = 0 ; i < wireCount; i++) + Wire[] wires = Array.FindAll(c.Wires, w => w != null); + message.Write((byte)wires.Length); + for (int i = 0 ; i < c.Wires.Length; i++) { - message.Write(c.Wires[i]==null ? -1 : c.Wires[i].Item.ID); + if (c.Wires[i] == null) continue; + message.Write(c.Wires[i].Item.ID); } } } @@ -120,23 +110,28 @@ namespace Subsurface.Items.Components System.Diagnostics.Debug.WriteLine("connectionpanel update"); foreach (Connection c in connections) { - int wireCount = c.Wires.Length; + //int wireCount = c.Wires.Length; c.ClearConnections(); - - for (int i = 0; i < wireCount; i++) + try { - int wireId = message.ReadInt32(); - if (wireId == -1) continue; + byte wireCount = message.ReadByte(); - Item wireItem = MapEntity.FindEntityByID(wireId) as Item; - if (wireItem == null) continue; + for (int i = 0; i < wireCount; i++) + { + int wireId = message.ReadInt32(); + + Item wireItem = MapEntity.FindEntityByID(wireId) as Item; + if (wireItem == null) continue; - Wire wireComponent = wireItem.GetComponent(); - if (wireComponent == null) continue; + Wire wireComponent = wireItem.GetComponent(); + if (wireComponent == null) continue; - c.Wires[i] = wireComponent; - wireComponent.Connect(c, false); + c.Wires[i] = wireComponent; + wireComponent.Connect(c, false); + } } + + catch { } } } } diff --git a/Subsurface/Items/Components/Signal/Wire.cs b/Subsurface/Items/Components/Signal/Wire.cs index 240d474ae..c50649956 100644 --- a/Subsurface/Items/Components/Signal/Wire.cs +++ b/Subsurface/Items/Components/Signal/Wire.cs @@ -15,12 +15,12 @@ namespace Subsurface.Items.Components static Sprite wireSprite; - List nodes; + public List Nodes; Connection[] connections; private Vector2 newNodePos; - + public Wire(Item item, XElement element) : base(item, element) { @@ -30,7 +30,7 @@ namespace Subsurface.Items.Components wireSprite.Depth = 0.85f; } - nodes = new List(); + Nodes = new List(); connections = new Connection[2]; } @@ -38,9 +38,9 @@ namespace Subsurface.Items.Components public override void Move(Vector2 amount) { amount = FarseerPhysics.ConvertUnits.ToDisplayUnits(amount); - for (int i = 0; i0 && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance) + if (newNodePos!= Vector2.Zero && Nodes.Count>0 && Vector2.Distance(newNodePos, Nodes[Nodes.Count - 1]) > nodeDistance) { - nodes.Add(newNodePos); + Nodes.Add(newNodePos); newNodePos = Vector2.Zero; } @@ -166,9 +165,9 @@ namespace Subsurface.Items.Components public override void SecondaryUse(float deltaTime, Character character = null) { - if (nodes.Count > 1) + if (Nodes.Count > 1) { - nodes.RemoveAt(nodes.Count - 1); + Nodes.RemoveAt(Nodes.Count - 1); item.NewComponentEvent(this, true); } } @@ -182,7 +181,7 @@ namespace Subsurface.Items.Components private void ClearConnections() { - nodes.Clear(); + Nodes.Clear(); for (int i = 0; i < 2; i++) { @@ -198,14 +197,14 @@ namespace Subsurface.Items.Components private void CleanNodes() { - for (int i = nodes.Count - 2; i > 0; i--) + for (int i = Nodes.Count - 2; i > 0; i--) { - if ((nodes[i - 1].X == nodes[i].X || nodes[i - 1].Y == nodes[i].Y) && - (nodes[i + 1].X == nodes[i].X || nodes[i + 1].Y == nodes[i].Y)) + if ((Nodes[i - 1].X == Nodes[i].X || Nodes[i - 1].Y == Nodes[i].Y) && + (Nodes[i + 1].X == Nodes[i].X || Nodes[i + 1].Y == Nodes[i].Y)) { - if (Vector2.Distance(nodes[i - 1], nodes[i]) == Vector2.Distance(nodes[i + 1], nodes[i])) + if (Vector2.Distance(Nodes[i - 1], Nodes[i]) == Vector2.Distance(Nodes[i + 1], Nodes[i])) { - nodes.RemoveAt(i); + Nodes.RemoveAt(i); } } } @@ -214,12 +213,12 @@ namespace Subsurface.Items.Components do { removed = false; - for (int i = nodes.Count - 2; i > 0; i--) + for (int i = Nodes.Count - 2; i > 0; i--) { - if ((nodes[i - 1].X == nodes[i].X && nodes[i + 1].X == nodes[i].X) - || (nodes[i - 1].Y == nodes[i].Y && nodes[i + 1].Y == nodes[i].Y)) + if ((Nodes[i - 1].X == Nodes[i].X && Nodes[i + 1].X == Nodes[i].X) + || (Nodes[i - 1].Y == Nodes[i].Y && Nodes[i + 1].Y == Nodes[i].Y)) { - nodes.RemoveAt(i); + Nodes.RemoveAt(i); removed = true; } } @@ -231,21 +230,21 @@ namespace Subsurface.Items.Components public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) { - if (nodes.Count == 0) return; + if (Nodes.Count == 0) return; //for (int i = 0; i < nodes.Count; i++) //{ // GUI.DrawRectangle(spriteBatch, new Rectangle((int)nodes[i].X, (int)-nodes[i].Y, 5, 5), Color.DarkGray, true, wireSprite.Depth - 0.01f); //} - for (int i = 1; i < nodes.Count; i++) + for (int i = 1; i < Nodes.Count; i++) { - DrawSection(spriteBatch, nodes[i], nodes[i - 1], i, Color.White); + DrawSection(spriteBatch, Nodes[i], Nodes[i - 1], i, Color.White); } - if (isActive && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance) + if (isActive && Vector2.Distance(newNodePos, Nodes[Nodes.Count - 1]) > nodeDistance) { - DrawSection(spriteBatch, nodes[nodes.Count - 1], newNodePos, nodes.Count, Color.White * 0.5f); + DrawSection(spriteBatch, Nodes[Nodes.Count - 1], newNodePos, Nodes.Count, Color.White * 0.5f); //nodes.Add(newNodePos); } @@ -269,13 +268,13 @@ namespace Subsurface.Items.Components { XElement componentElement = base.Save(parentElement); - if (nodes == null || nodes.Count == 0) return componentElement; + if (Nodes == null || Nodes.Count == 0) return componentElement; - string[] nodeCoords = new string[nodes.Count() * 2]; - for (int i = 0; i < nodes.Count(); i++) + string[] nodeCoords = new string[Nodes.Count() * 2]; + for (int i = 0; i < Nodes.Count(); i++) { - nodeCoords[i * 2] = nodes[i].X.ToString(CultureInfo.InvariantCulture); - nodeCoords[i * 2 + 1] = nodes[i].Y.ToString(CultureInfo.InvariantCulture); + nodeCoords[i * 2] = Nodes[i].X.ToString(CultureInfo.InvariantCulture); + nodeCoords[i * 2 + 1] = Nodes[i].Y.ToString(CultureInfo.InvariantCulture); } componentElement.Add(new XAttribute("nodes", string.Join(";", nodeCoords))); @@ -307,28 +306,28 @@ namespace Subsurface.Items.Components } catch { y = 0.0f; } - nodes.Add(new Vector2(x, y)); + Nodes.Add(new Vector2(x, y)); } } public override void FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetOutgoingMessage message) { - message.Write(nodes.Count); - for (int i = 0; i < nodes.Count; i++) + message.Write(Nodes.Count); + for (int i = 0; i < Nodes.Count; i++) { - message.Write(nodes[i].X); - message.Write(nodes[i].Y); + message.Write(Nodes[i].X); + message.Write(Nodes[i].Y); } } public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message) { - nodes.Clear(); + Nodes.Clear(); int nodeCount = message.ReadInt32(); for (int i = 0; i < nodeCount; i++) { - nodes.Add(new Vector2(message.ReadFloat(), message.ReadFloat())); + Nodes.Add(new Vector2(message.ReadFloat(), message.ReadFloat())); } } } diff --git a/Subsurface/Items/Components/Turret.cs b/Subsurface/Items/Components/Turret.cs index fcd4ec371..81da94d8a 100644 --- a/Subsurface/Items/Components/Turret.cs +++ b/Subsurface/Items/Components/Turret.cs @@ -4,6 +4,7 @@ using System.IO; using System.Xml.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using FarseerPhysics; namespace Subsurface.Items.Components { @@ -13,14 +14,11 @@ namespace Subsurface.Items.Components Vector2 barrelPos; - float targetRotation; - float rotation; + float rotation, targetRotation; - float reload; - float reloadTime; + float reload, reloadTime; - float minRotation; - float maxRotation; + float minRotation, maxRotation; float launchImpulse; @@ -53,12 +51,16 @@ namespace Subsurface.Items.Components set { reloadTime = value; } } - [HasDefaultValue("0.0,0.0", false)] + [HasDefaultValue("0.0,0.0", true)] public string RotationLimits { get { - return ToolBox.Vector2ToString(barrelPos); + Vector2 limits = new Vector2(minRotation, maxRotation); + limits.X = MathHelper.ToDegrees(limits.X); + limits.Y = MathHelper.ToDegrees(limits.Y); + + return ToolBox.Vector2ToString(limits); } set { @@ -75,35 +77,15 @@ namespace Subsurface.Items.Components barrelSprite = new Sprite(Path.GetDirectoryName(item.Prefab.ConfigFile) + "\\" +element.Attribute("barrelsprite").Value, ToolBox.GetAttributeVector2(element, "origin", Vector2.Zero)); - - //barrelPos = ToolBox.GetAttributeVector2(element, "BarrelPos", Vector2.Zero); - - //launchImpulse = ToolBox.GetAttributeFloat(element, "launchimpulse", 0.0f); - - //minRotation = ToolBox.GetAttributeFloat(element, "MinimumRotation", 0.0f); - //maxRotation = ToolBox.GetAttributeFloat(element, "MaximumRotation", MathHelper.TwoPi); - - //reloadTime = ToolBox.GetAttributeFloat(element, "reload", 5.0f); } public override void Draw(SpriteBatch spriteBatch) { barrelSprite.Draw(spriteBatch, new Vector2(item.Rect.X, -item.Rect.Y) + barrelPos, rotation + MathHelper.PiOver2, 1.0f); - - //GUI.DrawRectangle(spriteBatch, - // new Rectangle((int)(rect.X + barrelPos.X), (int)(-rect.Y + barrelPos.Y), 10, 10), - // Color.White, true); } public override void Update(float deltaTime, Camera cam) { - //if (character == null || character.SelectedConstruction != item) - //{ - // character = null; - // isActive = false; - // return; - //} - this.cam = cam; if (reload>0.0f) reload -= deltaTime; @@ -117,30 +99,22 @@ namespace Subsurface.Items.Components } rotation = MathUtils.CurveAngle(rotation, targetRotation, 0.05f); - - //if (!prefab.FocusOnSelected) return; - //cam.OffsetAmount = prefab.OffsetOnSelected; + } - public override void SecondaryUse(float deltaTime, Character character = null) - { - if (character == null) return; - Vector2 centerPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); + //public override void SecondaryUse(float deltaTime, Character character = null) + //{ + // if (character == null) return; + + // Vector2 centerPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); - Vector2 offset = character.CursorPosition - centerPos; - offset.Y = -offset.Y; - - targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); - - isActive = true; - - if (character == Character.Controlled && cam!=null) - { - Lights.LightManager.ViewPos = centerPos; - cam.TargetPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); - } - } + // if (character == Character.Controlled && cam!=null) + // { + // Lights.LightManager.ViewPos = centerPos; + // cam.TargetPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); + // } + //} public override bool Use(float deltaTime, Character character = null) { @@ -148,23 +122,25 @@ namespace Subsurface.Items.Components Projectile projectileComponent = null; - currPowerConsumption = powerConsumption; + //currPowerConsumption = powerConsumption; float availablePower = 0.0f; //List batteries = new List(); - foreach (MapEntity e in item.linkedTo) + foreach (Connection c in item.Connections) { - Item battery = e as Item; - if (battery == null) continue; + foreach (Connection c2 in c.Recipients) + { + if (c2 == null || c2.Item == null) continue; - PowerContainer batteryComponent = battery.GetComponent(); - if (batteryComponent == null) continue; + PowerContainer batteryComponent = c2.Item.GetComponent(); + if (batteryComponent == null) continue; - float batteryPower = Math.Min(batteryComponent.Charge, batteryComponent.MaxOutPut); - float takePower = Math.Min(currPowerConsumption - availablePower, batteryPower); + float batteryPower = Math.Min(batteryComponent.Charge, batteryComponent.MaxOutPut); + float takePower = Math.Min(currPowerConsumption - availablePower, batteryPower); - batteryComponent.Charge -= takePower; - availablePower += takePower; + batteryComponent.Charge -= takePower; + availablePower += takePower; + } } reload = reloadTime; @@ -198,7 +174,7 @@ namespace Subsurface.Items.Components projectile.body.ResetDynamics(); projectile.body.Enabled = true; - projectile.SetTransform(item.SimPosition, rotation); + projectile.SetTransform(ConvertUnits.ToSimUnits(new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y)), -rotation); //if (useSounds.Count() > 0) useSounds[Game1.localRandom.Next(useSounds.Count())].Play(1.0f, 800.0f, item.body.FarseerBody); @@ -207,6 +183,29 @@ namespace Subsurface.Items.Components return true; } + + public override void ReceiveSignal(string signal, Connection connection, Item sender, float power) + { + switch (connection.Name) + { + case "position_in": + Vector2 receivedPos = ToolBox.ParseToVector2(signal, false); + + Vector2 centerPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); + + Vector2 offset = receivedPos - centerPos; + offset.Y = -offset.Y; + + targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); + + isActive = true; + + break; + case "trigger_in": + item.Use((float)Physics.step, null); + break; + } + } } } diff --git a/Subsurface/Items/Inventory.cs b/Subsurface/Items/Inventory.cs index 2e802cccb..55f5ece09 100644 --- a/Subsurface/Items/Inventory.cs +++ b/Subsurface/Items/Inventory.cs @@ -134,20 +134,17 @@ namespace Subsurface } } - //protected virtual void DropItem(Item item) - //{ - // for (int i = 0; i < capacity; i++) - // { - // if (items[i] == item) items[i] = null; - // } - // item.Drop(); - // return; - //} - //public void DropItem(int i) - //{ - // items[i].Drop(); - // items[i] = null; - //} + protected virtual void DropItem(Item item) + { + + item.Drop(null, false); + return; + } + public void DropItem(int i) + { + items[i].Drop(); + items[i] = null; + } public virtual void Draw(SpriteBatch spriteBatch) { @@ -188,12 +185,10 @@ namespace Subsurface } else { - draggingItem.Drop(null, false); - int[] data = { draggingItem.ID, -1 }; new NetworkEvent(NetworkEventType.InventoryUpdate, ID, true, data); - - //draggingItem = null; + + DropItem(draggingItem); } } } diff --git a/Subsurface/Items/Item.cs b/Subsurface/Items/Item.cs index d428d2044..787fc378a 100644 --- a/Subsurface/Items/Item.cs +++ b/Subsurface/Items/Item.cs @@ -734,9 +734,8 @@ namespace Subsurface foreach (ItemComponent ic in components) { if (!ic.HasRequiredSkills(picker)) hasRequiredSkills = false; - if ((ic.CanBePicked || ic.CanBeSelected) - && (ic.HasRequiredEquippedItems(picker, picker == Character.Controlled) || forcePick) - && ic.Pick(picker)) + if (!ic.HasRequiredItems(picker, picker == Character.Controlled) && !forcePick) continue; + if ((ic.CanBePicked && ic.Pick(picker)) || (ic.CanBeSelected && ic.Select(picker))) { picked = true; ic.ApplyStatusEffects(ActionType.OnPicked, 1.0f, picker); diff --git a/Subsurface/Items/ItemInventory.cs b/Subsurface/Items/ItemInventory.cs index fe2840ab9..b3f2ed9fb 100644 --- a/Subsurface/Items/ItemInventory.cs +++ b/Subsurface/Items/ItemInventory.cs @@ -13,6 +13,13 @@ namespace Subsurface this.container = container; } + protected override void DropItem(Item item) + { + item.Drop(); + item.body.Enabled = true; + item.body.SetTransform(container.Item.SimPosition, 0.0f); + } + public override int FindAllowedSlot(Item item) { for (int i = 0; i < capacity; i++) diff --git a/Subsurface/Items/RelatedItem.cs b/Subsurface/Items/RelatedItem.cs index 5ee8c0c54..41bac1a0c 100644 --- a/Subsurface/Items/RelatedItem.cs +++ b/Subsurface/Items/RelatedItem.cs @@ -13,7 +13,7 @@ namespace Subsurface None = 0, Contained = 1, Equipped = 2, - Picked = 3 + Picked = 4 } string[] names; diff --git a/Subsurface/Map/Levels/Level.cs b/Subsurface/Map/Levels/Level.cs index 567bfb627..d153f73a5 100644 --- a/Subsurface/Map/Levels/Level.cs +++ b/Subsurface/Map/Levels/Level.cs @@ -74,7 +74,7 @@ namespace Subsurface public Vector2 Position { - get { return ConvertUnits.ToDisplayUnits(cells[1].body.Position); } + get { return ConvertUnits.ToDisplayUnits(cells[0].body.Position); } } public string Seed @@ -546,11 +546,10 @@ int currentTargetIndex = 1; List tempVertices = new List(); List bodyPoints = new List(); - int n = 0; - foreach (VoronoiCell cell in cells) + for (int n = cells.Count - 1; n >= 0; n-- ) { - n = (n + 30) % 255; - + VoronoiCell cell = cells[n]; + bodyPoints.Clear(); tempVertices.Clear(); foreach (GraphEdge ge in cell.edges) @@ -568,14 +567,18 @@ int currentTargetIndex = 1; if (!bodyPoints.Contains(ge.point2)) bodyPoints.Add(ge.point2); } - if (tempVertices.Count < 3) continue; + if (tempVertices.Count < 3 || bodyPoints.Count < 2) + { + cells.RemoveAt(n); + continue; + } var triangles = MathUtils.TriangulateConvexHull(tempVertices, cell.Center); - for (int i = 0; i < triangles.Count; i++ ) + for (int i = 0; i < triangles.Count; i++) { foreach (Vector2 vertex in triangles[i]) { - verticeList.Add(new VertexPositionColor(new Vector3(vertex, 0.0f), new Color(n,(n*2)%255,(n*3)%255)*0.5f)); + verticeList.Add(new VertexPositionColor(new Vector3(vertex, 0.0f), new Color(n*30, (n * 60) % 255, (n * 90) % 255) * 0.5f)); } } @@ -584,7 +587,7 @@ int currentTargetIndex = 1; if (bodyPoints.Count < 3) { - foreach(Vector2 vertex in tempVertices) + foreach (Vector2 vertex in tempVertices) { if (bodyPoints.Contains(vertex)) continue; bodyPoints.Add(vertex); @@ -608,7 +611,7 @@ int currentTargetIndex = 1; if (triangles[i][0].X == triangles[i][1].X && triangles[i][0].X == triangles[i][2].X) continue; Vertices bodyVertices = new Vertices(triangles[i]); - FixtureFactory.AttachPolygon(bodyVertices, 5.0f, edgeBody); + FixtureFactory.AttachPolygon(bodyVertices, 5.0f, edgeBody); } edgeBody.UserData = cell; @@ -655,8 +658,8 @@ int currentTargetIndex = 1; Item item = mapEntity as Item; if (item == null) { - if (!mapEntity.MoveWithLevel) continue; - mapEntity.Move(amount); + //if (!mapEntity.MoveWithLevel) continue; + //mapEntity.Move(amount); } else if (item.body != null) { @@ -692,8 +695,8 @@ int currentTargetIndex = 1; Item item = mapEntity as Item; if (item == null) { - if (!mapEntity.MoveWithLevel) continue; - mapEntity.Move(velocity); + //if (!mapEntity.MoveWithLevel) continue; + //mapEntity.Move(velocity); } else if (item.body!=null) { diff --git a/Subsurface/Map/MapEntity.cs b/Subsurface/Map/MapEntity.cs index 62f369eed..33e751983 100644 --- a/Subsurface/Map/MapEntity.cs +++ b/Subsurface/Map/MapEntity.cs @@ -61,13 +61,16 @@ namespace Subsurface get { return false; } } - public Vector2 Position + public virtual Vector2 Position { get { - return new Vector2( + Vector2 rectPos = new Vector2( rect.X + rect.Width / 2.0f, rect.Y - rect.Height / 2.0f); + + if (MoveWithLevel) rectPos += Level.Loaded.Position; + return rectPos; } } diff --git a/Subsurface/Map/Submarine.cs b/Subsurface/Map/Submarine.cs index 9fd35bf31..22813b215 100644 --- a/Subsurface/Map/Submarine.cs +++ b/Subsurface/Map/Submarine.cs @@ -40,7 +40,6 @@ namespace Subsurface Vector2 speed; Vector2 targetPosition; - Vector2 targetSpeed; private Rectangle borders; @@ -417,7 +416,7 @@ namespace Subsurface if (targetPosition != Vector2.Zero && Vector2.Distance(targetPosition, Position) > 5.0f) { - translateAmount += (targetPosition - Position) * 0.05f; + translateAmount += (targetPosition - Position) * 0.01f; } else { @@ -583,6 +582,7 @@ namespace Subsurface return; } + newTargetPosition = newTargetPosition + newSpeed * (float)(NetTime.Now - sendingTime); targetPosition = newTargetPosition; speed = newSpeed; @@ -818,20 +818,16 @@ namespace Subsurface hullBody.GravityScale = 0.0f; hullBody.OnCollision += OnCollision; hullBody.OnSeparation += OnSeparation; - //body.IsSensor = true; - - //body.SetTransform(); - - //HullBody hullBody = new HullBody(); - //hullBody.body = body; - ////hullBody.shapeTexture = GUI.CreateRectangle(borders.Width, borders.Height); - - //hullBodies = new List(); - //hullBodies.Add(hullBody); - + MapEntity.LinkAll(); - - + + foreach (Item item in Item.itemList) + { + foreach (ItemComponent ic in item.components) + { + ic.OnMapLoaded(); + } + } ID = int.MaxValue-10; diff --git a/Subsurface/Map/WayPoint.cs b/Subsurface/Map/WayPoint.cs index b2c8de052..5027876c3 100644 --- a/Subsurface/Map/WayPoint.cs +++ b/Subsurface/Map/WayPoint.cs @@ -42,11 +42,6 @@ namespace Subsurface } } - public override Vector2 SimPosition - { - get { return ConvertUnits.ToSimUnits(new Vector2(rect.X, rect.Y)); } - } - public WayPoint(Rectangle newRect) { rect = newRect; @@ -61,14 +56,16 @@ namespace Subsurface { //if (!editing) return; + Point pos = new Point((int)Position.X, (int)Position.Y); + Color clr = (isSelected) ? Color.Red : Color.LightGreen; - GUI.DrawRectangle(spriteBatch, new Rectangle(rect.X, -rect.Y, rect.Width, rect.Height), clr, true); + GUI.DrawRectangle(spriteBatch, new Rectangle(pos.X, -pos.Y, rect.Width, rect.Height), clr, true); foreach (MapEntity e in linkedTo) { GUI.DrawLine(spriteBatch, - new Vector2(rect.X + rect.Width / 2, -rect.Y + rect.Height / 2), - new Vector2(e.Rect.X + e.Rect.Width / 2, -e.Rect.Y + e.Rect.Height / 2), + new Vector2(pos.X, -pos.Y), + new Vector2(e.Position.X + e.Rect.Width / 2, -e.Position.Y + e.Rect.Height / 2), Color.Green); } } diff --git a/Subsurface/Networking/GameClient.cs b/Subsurface/Networking/GameClient.cs index bbbf508c6..ade53d4c7 100644 --- a/Subsurface/Networking/GameClient.cs +++ b/Subsurface/Networking/GameClient.cs @@ -132,7 +132,8 @@ namespace Subsurface.Networking { // All manually sent messages are type of "Data" case NetIncomingMessageType.Data: - if (inc.ReadByte() == (byte)PacketTypes.LoggedIn) + byte packetType = inc.ReadByte(); + if (packetType == (byte)PacketTypes.LoggedIn) { myID = inc.ReadInt32(); @@ -152,7 +153,7 @@ namespace Subsurface.Networking CanStart = true; } - else if (inc.ReadByte() == (byte)PacketTypes.KickedOut) + else if (packetType == (byte)PacketTypes.KickedOut) { string msg = inc.ReadString(); DebugConsole.ThrowError(msg); @@ -199,6 +200,7 @@ namespace Subsurface.Networking SendRandomData(); } + if (gameStarted) inGameHUD.Update((float)Physics.step); if (!connected || updateTimer > DateTime.Now) return; diff --git a/Subsurface/Networking/GameServer.cs b/Subsurface/Networking/GameServer.cs index 79a244cc2..8207cbf78 100644 --- a/Subsurface/Networking/GameServer.cs +++ b/Subsurface/Networking/GameServer.cs @@ -21,6 +21,9 @@ namespace Subsurface.Networking public GameServer() { + var endRoundButton = new GUIButton(new Rectangle(Game1.GraphicsWidth - 170-120, 20, 150, 25), "End round", Alignment.TopLeft, GUI.style, inGameHUD); + endRoundButton.OnClicked = EndButtonHit; + name = "Server"; Config = new NetPeerConfiguration("subsurface"); @@ -49,13 +52,11 @@ namespace Subsurface.Networking updateInterval = new TimeSpan(0, 0, 0, 0, 30); DebugConsole.NewMessage("Server started", Color.Green); - } public override void Update() { - // Server.ReadMessage() Returns new messages, that have not yet been read. - // If "inc" is null -> ReadMessage returned null -> Its null, so dont do this :) + if (gameStarted) inGameHUD.Update((float)Physics.step); NetIncomingMessage inc = Server.ReadMessage(); if (inc != null) @@ -84,6 +85,30 @@ namespace Subsurface.Networking } } + private void SparseUpdate() + { + foreach (Character c in Character.CharacterList) + { + bool isClient = false; + foreach (Client client in connectedClients) + { + if (client.character != c) continue; + isClient = true; + break; + } + + if (!isClient) + { + c.LargeUpdateTimer = 0; + new NetworkEvent(c.ID, false); + } + } + + new NetworkEvent(Submarine.Loaded.ID, false); + + sparseUpdateTimer = DateTime.Now + SparseUpdateInterval; + } + private void ReadMessage(NetIncomingMessage inc) { NetOutgoingMessage outmsg; @@ -224,30 +249,6 @@ namespace Subsurface.Networking } } - private void SparseUpdate() - { - foreach (Character c in Character.CharacterList) - { - bool isClient = false; - foreach (Client client in connectedClients) - { - if (client.character != c) continue; - isClient = true; - break; - } - - if (!isClient) - { - c.LargeUpdateTimer = 0; - new NetworkEvent(c.ID, false); - } - } - - new NetworkEvent(Submarine.Loaded.ID, false); - - sparseUpdateTimer = DateTime.Now + SparseUpdateInterval; - } - private void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod deliveryMethod, NetConnection excludedConnection) { List recipients = new List(); @@ -296,7 +297,6 @@ namespace Subsurface.Networking Submarine selectedMap = Game1.NetLobbyScreen.SelectedMap as Submarine; - //selectedMap.Load(); Game1.GameSession = new GameSession(selectedMap, Game1.NetLobbyScreen.SelectedMode); @@ -378,6 +378,13 @@ namespace Subsurface.Networking return true; } + private bool EndButtonHit(GUIButton button, object obj) + { + Game1.GameSession.gameMode.End("The round has ended"); + + return true; + } + public void EndGame(string endMessage) { Submarine.Unload(); diff --git a/Subsurface/Networking/NetworkMember.cs b/Subsurface/Networking/NetworkMember.cs index 57571f877..d191307d0 100644 --- a/Subsurface/Networking/NetworkMember.cs +++ b/Subsurface/Networking/NetworkMember.cs @@ -1,5 +1,6 @@ using System; using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; namespace Subsurface.Networking { @@ -93,12 +94,17 @@ namespace Subsurface.Networking Alignment.Left, null, null, true); msg.Padding = new Vector4(20.0f, 0, 0, 0); - chatBox.AddChild(msg); - while (chatBox.CountChildren > 20) - { - chatBox.RemoveChild(chatBox.children[0]); - } + //float prevScroll = chatBox.BarScroll; + + //chatBox.AddChild(msg); + + //while (chatBox.CountChildren > 20) + //{ + // chatBox.RemoveChild(chatBox.children[0]); + //} + + //if (prevScroll == 1.0f) chatBox.BarScroll = 1.0f; GUI.PlayMessageSound(); } @@ -107,6 +113,13 @@ namespace Subsurface.Networking public virtual void Update() { } + public virtual void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) + { + if (!gameStarted) return; + + inGameHUD.Draw(spriteBatch); + } + public virtual void Disconnect() { } } diff --git a/Subsurface/Properties.cs b/Subsurface/Properties.cs index caa2ea365..3b4d10fef 100644 --- a/Subsurface/Properties.cs +++ b/Subsurface/Properties.cs @@ -30,16 +30,7 @@ namespace Subsurface this.isSaveable = isSaveable; } } - - //[AttributeUsage(AttributeTargets.Property)] - //public class Saveable : Initable - //{ - // public Saveable(object defaultValue) - // :base(defaultValue) - // { - // } - //} - + class ObjectProperty { readonly PropertyDescriptor property; diff --git a/Subsurface/Screens/NetLobbyScreen.cs b/Subsurface/Screens/NetLobbyScreen.cs index 9d68dfe97..02afdcfc4 100644 --- a/Subsurface/Screens/NetLobbyScreen.cs +++ b/Subsurface/Screens/NetLobbyScreen.cs @@ -31,9 +31,6 @@ namespace Subsurface private float camAngle; - //private Body previewPlatform; - //private Hull previewHull; - public bool IsServer; public Submarine SelectedMap @@ -112,7 +109,7 @@ namespace Subsurface GUI.style, menu); chatBox = new GUIListBox(new Rectangle(0,0,0,chatFrame.Rect.Height-80), Color.White, GUI.style, chatFrame); - textBox = new GUITextBox(new Rectangle(0, 0, 0, 25), Alignment.Bottom, GUI.style, chatFrame); + textBox = new GUITextBox(new Rectangle(0, 25, 0, 25), Alignment.Bottom, GUI.style, chatFrame); textBox.OnEnter = EnterChatMessage; //player info panel ------------------------------------------------------------ @@ -135,18 +132,6 @@ namespace Subsurface public override void Deselect() { textBox.Deselect(); - - //if (previewPlatform!=null) - //{ - // Game1.World.RemoveBody(previewPlatform); - // previewPlatform = null; - //} - - //if (previewHull!=null) - //{ - // previewHull.Remove(); - // previewHull = null; - //} } public override void Select() @@ -186,7 +171,6 @@ namespace Subsurface new GUITextBlock(new Rectangle(220, 30, 0, 30), "Selected game mode: ", GUI.style, infoFrame); modeList = new GUIListBox(new Rectangle(220, 60, 200, 200), GUI.style, infoFrame); modeList.Enabled = (Game1.Server != null); - //modeList.OnSelected = new GUIListBox.OnSelectedHandler(SelectEvent); foreach (GameModePreset mode in GameModePreset.list) { @@ -324,7 +308,8 @@ namespace Subsurface public override void Update(double deltaTime) { base.Update(deltaTime); - + + Game1.GameScreen.Cam.TargetPos = Vector2.Zero; Game1.GameScreen.Cam.MoveCamera((float)deltaTime); Vector2 pos = new Vector2( @@ -342,7 +327,7 @@ namespace Subsurface menu.Update((float)deltaTime); - durationBar.BarScroll = Math.Max(durationBar.BarScroll, 1.0f / 60.0f); + //durationBar.BarScroll = Math.Max(durationBar.BarScroll, 1.0f / 60.0f); } public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) @@ -361,31 +346,13 @@ namespace Subsurface spriteBatch.End(); - - //if (Game1.Client != null) - //{ - // if (Game1.Client.Character != null) - // { - // Vector2 position = new Vector2(playerFrame.Rect.X + playerFrame.Rect.Width * 0.25f, playerFrame.Rect.Y + 25.0f); - - // Vector2 pos = Game1.Client.Character.Position; - // pos.Y = -pos.Y; - // Matrix transform = Matrix.CreateTranslation(new Vector3(-pos + position, 0.0f)); - - // spriteBatch.Begin(SpriteSortMode.BackToFront, null, null, null, null, null, transform); - // Game1.Client.Character.Draw(spriteBatch); - // spriteBatch.End(); - // } - // else - // { - // CreatePreviewCharacter(); - // } - //} - } public void NewChatMessage(string message, Color color) { + float prevSize = chatBox.BarSize; + float oldScroll = chatBox.BarScroll; + GUITextBlock msg = new GUITextBlock(new Rectangle(0, 0, 0, 20), message, ((chatBox.CountChildren % 2) == 0) ? Color.Transparent : Color.Black*0.1f, color, @@ -393,6 +360,8 @@ namespace Subsurface msg.Padding = new Vector4(20, 0, 0, 0); chatBox.AddChild(msg); + + if ((prevSize == 1.0f && chatBox.BarScroll == 0.0f) || (prevSize < 1.0f && chatBox.BarScroll == 1.0f)) chatBox.BarScroll = 1.0f; } diff --git a/Subsurface/Subsurface.csproj b/Subsurface/Subsurface.csproj index 71f9a4b30..268807c0d 100644 --- a/Subsurface/Subsurface.csproj +++ b/Subsurface/Subsurface.csproj @@ -659,6 +659,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Subsurface.csproj.user b/Subsurface/Subsurface.csproj.user index 693505ea4..505c3a0bf 100644 --- a/Subsurface/Subsurface.csproj.user +++ b/Subsurface/Subsurface.csproj.user @@ -9,6 +9,6 @@ en-US false - ShowAllFiles + ProjectFiles \ No newline at end of file diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index d0c3c4db532b90dff5c180b49e26c51dc0e4439d..a8a0ae7a14c38ac5b5710ce4945876830d101f0a 100644 GIT binary patch delta 17267 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 B_r?GK