From 4f54e04c8c1c7257bef12eae4c5bc411bee9b375 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 11 Feb 2016 21:37:37 +0200 Subject: [PATCH] Improved level generation algorithm, fixed invisible hulls, turret projectile fix, fabricators work in mp --- Subsurface/Barotrauma.csproj | 13 + .../Content/Items/Artifacts/artifacts.xml | 6 +- .../Content/Items/Fabricators/fabricators.xml | 3 + .../Items/OxygenGenerator/oxygengenerator.xml | 2 +- Subsurface/Content/Items/Reactor/reactor.xml | 10 + Subsurface/Content/Items/Tools/tools.xml | 4 +- Subsurface/Content/Items/Weapons/railgun.xml | 33 +++ Subsurface/Content/Items/Weapons/weapons.png | Bin 9569 -> 11685 bytes Subsurface/Content/Items/Weapons/weapons.xml | 2 +- Subsurface/Properties/AssemblyInfo.cs | 4 +- .../Animation/HumanoidAnimController.cs | 2 + .../BackgroundSprite/BackgroundCreature.cs | 55 +++- Subsurface/Source/Characters/Character.cs | 6 +- Subsurface/Source/Characters/Limb.cs | 10 +- .../Source/Events/Quests/MonsterQuest.cs | 2 +- Subsurface/Source/GameSession/CrewManager.cs | 1 + .../Items/Components/Holdable/Holdable.cs | 18 +- .../Source/Items/Components/ItemContainer.cs | 2 + .../Items/Components/Machines/Fabricator.cs | 9 +- .../Source/Items/Components/Projectile.cs | 2 + Subsurface/Source/Items/Components/Turret.cs | 2 + Subsurface/Source/Items/Item.cs | 28 +- Subsurface/Source/Map/Explosion.cs | 17 +- Subsurface/Source/Map/Hull.cs | 2 +- Subsurface/Source/Map/Levels/Level.cs | 277 +++++++++++++----- Subsurface/Source/Map/Levels/LevelRenderer.cs | 6 +- Subsurface/Source/Map/Levels/WrappingWall.cs | 4 +- Subsurface/Source/Map/Map/Map.cs | 35 +-- Subsurface/Source/Sprite.cs | 2 +- Subsurface/Source/Utils/MathUtils.cs | 31 ++ Subsurface/changelog.txt | 8 + Subsurface_Solution.v12.suo | Bin 925184 -> 903680 bytes 32 files changed, 435 insertions(+), 161 deletions(-) diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 1d3b32f53..b4383195e 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -331,6 +331,16 @@ Designer PreserveNewest + + PreserveNewest + + + PreserveNewest + + + Designer + PreserveNewest + PreserveNewest @@ -397,6 +407,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Items/Artifacts/artifacts.xml b/Subsurface/Content/Items/Artifacts/artifacts.xml index 4936b5054..9b81e1a74 100644 --- a/Subsurface/Content/Items/Artifacts/artifacts.xml +++ b/Subsurface/Content/Items/Artifacts/artifacts.xml @@ -4,7 +4,7 @@ name="Skyholder Artifact" pickdistance="150"> - + @@ -23,7 +23,7 @@ name="Thermal Artifact" pickdistance="150"> - + @@ -45,7 +45,7 @@ name="Faraday Artifact" pickdistance="150"> - + diff --git a/Subsurface/Content/Items/Fabricators/fabricators.xml b/Subsurface/Content/Items/Fabricators/fabricators.xml index af44d57d9..7938b6278 100644 --- a/Subsurface/Content/Items/Fabricators/fabricators.xml +++ b/Subsurface/Content/Items/Fabricators/fabricators.xml @@ -16,10 +16,13 @@ + + + diff --git a/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml b/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml index 1f7a57513..77ee846ef 100644 --- a/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml +++ b/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml @@ -8,7 +8,7 @@ - + diff --git a/Subsurface/Content/Items/Reactor/reactor.xml b/Subsurface/Content/Items/Reactor/reactor.xml index 3ef81e616..597b35ba8 100644 --- a/Subsurface/Content/Items/Reactor/reactor.xml +++ b/Subsurface/Content/Items/Reactor/reactor.xml @@ -57,6 +57,11 @@ pickdistance="150" price="200"> + + + + + @@ -71,6 +76,11 @@ pickdistance="150" spritecolor="0.5,0.0,0.0,1.0"> + + + + + diff --git a/Subsurface/Content/Items/Tools/tools.xml b/Subsurface/Content/Items/Tools/tools.xml index 6682a8348..9009c0405 100644 --- a/Subsurface/Content/Items/Tools/tools.xml +++ b/Subsurface/Content/Items/Tools/tools.xml @@ -30,7 +30,7 @@ - + @@ -77,7 +77,7 @@ - + diff --git a/Subsurface/Content/Items/Weapons/railgun.xml b/Subsurface/Content/Items/Weapons/railgun.xml index 7adf39b6f..f77e5ead4 100644 --- a/Subsurface/Content/Items/Weapons/railgun.xml +++ b/Subsurface/Content/Items/Weapons/railgun.xml @@ -58,6 +58,7 @@ + @@ -88,5 +89,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Subsurface/Content/Items/Weapons/weapons.png b/Subsurface/Content/Items/Weapons/weapons.png index 398e17bd0b8db021a5f9d42224905e01e9e75e61..df643f1c785fa4f68d5ceb30384dab5b7c952174 100644 GIT binary patch literal 11685 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 - + diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index d8e05518c..47ffee42f 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.1.0")] -[assembly: AssemblyFileVersion("0.3.1.0")] +[assembly: AssemblyVersion("0.3.1.1")] +[assembly: AssemblyFileVersion("0.3.1.1")] diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index a9b3c1157..e7b2e5813 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -789,6 +789,8 @@ namespace Barotrauma public override void DragCharacter(Character target) { + if (target == null) return; + Limb leftHand = GetLimb(LimbType.LeftHand); Limb rightHand = GetLimb(LimbType.RightHand); diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundCreature.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundCreature.cs index f29e89e99..c2abfce94 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundCreature.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundCreature.cs @@ -39,7 +39,7 @@ namespace Barotrauma public Vector2 SimPosition { - get { return position; } + get { return FarseerPhysics.ConvertUnits.ToSimUnits(position); } } public Vector2 Velocity @@ -81,29 +81,51 @@ namespace Barotrauma depth = MathHelper.Clamp(depth + velocity.Z * deltaTime, 0.0f, MaxDepth); checkWallsTimer -= deltaTime; - if (checkWallsTimer<=0.0f && Level.Loaded!=null) + if (checkWallsTimer <= 0.0f && Level.Loaded != null) { checkWallsTimer = CheckWallsInterval; obstacleDiff = Vector2.Zero; - - var cells = Level.Loaded.GetCells(position, 1); - if (cells.Count > 0) + if (position.Y > Level.Loaded.Size.Y) { - - foreach (Voronoi2.VoronoiCell cell in cells) - { - obstacleDiff += cell.Center - position; - } - - obstacleDiff = Vector2.Normalize(obstacleDiff) * prefab.Speed; + obstacleDiff = Vector2.UnitY; } - } + else if (position.Y < 0.0f) + { + obstacleDiff = -Vector2.UnitY; + } + else if (position.X < 0.0f) + { + obstacleDiff = Vector2.UnitX; + } + else if (position.X > Level.Loaded.Size.X) + { + obstacleDiff = -Vector2.UnitX; + } + else + { + var cells = Level.Loaded.GetCells(position, 1); + if (cells.Count > 0) + { + + foreach (Voronoi2.VoronoiCell cell in cells) + { + obstacleDiff += cell.Center - position; + } + obstacleDiff /= cells.Count; + + obstacleDiff = Vector2.Normalize(obstacleDiff) * prefab.Speed; + } + } + } + + + if (Swarm!=null) { Vector2 midPoint = Swarm.MidPoint(); - float midPointDist = Vector2.Distance(position, midPoint); + float midPointDist = Vector2.Distance(SimPosition, midPoint); if (midPointDist > Swarm.MaxDistance) { @@ -116,9 +138,12 @@ namespace Barotrauma steeringManager.SteeringWander(prefab.Speed); } + //Level.Loaded.Size + + if (obstacleDiff != Vector2.Zero) { - steeringManager.SteeringSeek(-obstacleDiff, prefab.Speed); + steeringManager.SteeringSeek(SimPosition-obstacleDiff, prefab.Speed*2.0f); } steeringManager.Update(prefab.Speed); diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 0f3ceae21..c32565245 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -918,10 +918,10 @@ namespace Barotrauma if (!(AnimController is FishAnimController)) { bool protectedFromPressure = PressureProtection > 0.0f; - - if (Submarine.Loaded!=null && Level.Loaded !=null) + + if (Submarine.Loaded != null && Level.Loaded != null) { - protectedFromPressure = protectedFromPressure && Position.Y > SubmarineBody.DamageDepth; + protectedFromPressure = protectedFromPressure && WorldPosition.Y > SubmarineBody.DamageDepth; } if (!protectedFromPressure && diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index fd0a25df7..d1e8b1684 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -532,6 +532,7 @@ namespace Barotrauma break; } } + spriteBatch.Draw( bodyShapeTexture, new Vector2(body.DrawPosition.X, -body.DrawPosition.Y), @@ -546,7 +547,14 @@ namespace Barotrauma { sprite.Remove(); body.Remove(); - if (hitSound!=null) hitSound.Remove(); + + if (bodyShapeTexture != null) + { + bodyShapeTexture.Dispose(); + } + + + if (hitSound != null) hitSound.Remove(); } } } diff --git a/Subsurface/Source/Events/Quests/MonsterQuest.cs b/Subsurface/Source/Events/Quests/MonsterQuest.cs index cba33be31..13581fe82 100644 --- a/Subsurface/Source/Events/Quests/MonsterQuest.cs +++ b/Subsurface/Source/Events/Quests/MonsterQuest.cs @@ -27,7 +27,7 @@ namespace Barotrauma public override void Start(Level level) { - Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)]; + Vector2 position = level.GetRandomInterestingPosition(monster.Mass > 500.0f, true); monster = Character.Create(monsterFile, position); monster.Enabled = false; diff --git a/Subsurface/Source/GameSession/CrewManager.cs b/Subsurface/Source/GameSession/CrewManager.cs index 8a9722687..225faeb1e 100644 --- a/Subsurface/Source/GameSession/CrewManager.cs +++ b/Subsurface/Source/GameSession/CrewManager.cs @@ -314,6 +314,7 @@ namespace Barotrauma characters.Clear(); listBox.ClearChildren(); + orderListBox.ClearChildren(); } public void Draw(SpriteBatch spriteBatch) diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index c1352485a..2cb8b51b2 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -30,7 +30,7 @@ namespace Barotrauma.Items.Components [HasDefaultValue(false, true)] public bool Attached { - get { return attached; } + get { return attached && item.Inventory == null; } set { attached = value; } } @@ -101,7 +101,7 @@ namespace Barotrauma.Items.Components Msg = ""; } - if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen && Submarine.Loaded!=null)) Use(1.0f); + if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen && Submarine.Loaded!=null)) Use(1.0f); //holdAngle = ToolBox.GetAttributeFloat(element, "holdangle", 0.0f); @@ -259,12 +259,22 @@ namespace Barotrauma.Items.Components { //prevRequiredItems = new List(requiredItems); - if (attached) + if (Attached) { Use(1.0f); } else - { + { + if (item.Inventory!=null) + { + if (body != null) + { + item.body = body; + body.Enabled = false; + } + attached = false; + } + requiredItems.Clear(); Msg = ""; } diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index e0d1b4d2a..0f59ed56f 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -9,6 +9,8 @@ namespace Barotrauma.Items.Components { class ItemContainer : ItemComponent { + public const int MaxInventoryCount = 4; + List containableItems; public ItemInventory Inventory; diff --git a/Subsurface/Source/Items/Components/Machines/Fabricator.cs b/Subsurface/Source/Items/Components/Machines/Fabricator.cs index 1a4efc1d1..136c49bc5 100644 --- a/Subsurface/Source/Items/Components/Machines/Fabricator.cs +++ b/Subsurface/Source/Items/Components/Machines/Fabricator.cs @@ -301,6 +301,10 @@ namespace Barotrauma.Items.Components int itemIndex = fabricatedItem == null ? -1 : fabricableItems.IndexOf(fabricatedItem); message.WriteRangedInteger(-1, fabricableItems.Count-1, itemIndex); + + var containers = item.GetComponents(); + containers[0].Inventory.FillNetworkData(type, message, null); + containers[1].Inventory.FillNetworkData(type, message, null); return true; } @@ -311,6 +315,10 @@ namespace Barotrauma.Items.Components int itemIndex = message.ReadRangedInteger(-1, fabricableItems.Count-1); + var containers = item.GetComponents(); + containers[0].Inventory.ReadNetworkData(type, message, sendingTime); + containers[1].Inventory.ReadNetworkData(type, message, sendingTime); + if (itemIndex == -1) { CancelFabricating(); @@ -324,7 +332,6 @@ namespace Barotrauma.Items.Components SelectItem(null, fabricableItems[itemIndex]); StartFabricating(fabricableItems[itemIndex]); - timeUntilReady -= sendingTime - (float)Lidgren.Network.NetTime.Now; } lastNetworkUpdate = sendingTime; diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index 3f94f2d36..c9a59de0a 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -177,6 +177,8 @@ namespace Barotrauma.Items.Components } } + ApplyStatusEffects(ActionType.OnUse, 1.0f, null); + item.body.FarseerBody.OnCollision -= OnProjectileCollision; item.body.FarseerBody.IsBullet = false; diff --git a/Subsurface/Source/Items/Components/Turret.cs b/Subsurface/Source/Items/Components/Turret.cs index d052165f2..ed9118b46 100644 --- a/Subsurface/Source/Items/Components/Turret.cs +++ b/Subsurface/Source/Items/Components/Turret.cs @@ -172,6 +172,8 @@ namespace Barotrauma.Items.Components projectile.body.ResetDynamics(); projectile.body.Enabled = true; projectile.SetTransform(ConvertUnits.ToSimUnits(new Vector2(item.WorldRect.X + barrelPos.X, item.WorldRect.Y - barrelPos.Y)), -rotation); + projectile.FindHull(); + projectile.Submarine = projectile.body.Submarine; projectiles[0].Use(deltaTime); projectiles[0].User = character; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 727ae9e50..a9d2bcc10 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1370,9 +1370,16 @@ namespace Barotrauma message.Write(requirementIndex); break; case NetworkEventType.InventoryUpdate: - var itemContainer = GetComponent(); - if (itemContainer == null || itemContainer.Inventory == null) return false; - return itemContainer.Inventory.FillNetworkData(NetworkEventType.InventoryUpdate, message, data); + var itemContainers = GetComponents(); + if (itemContainers == null || !itemContainers.Any()) return false; + + message.WriteRangedInteger(1, ItemContainer.MaxInventoryCount, itemContainers.Count); + foreach (ItemContainer container in itemContainers) + { + container.Inventory.FillNetworkData(NetworkEventType.InventoryUpdate, message, data); + } + + return true; case NetworkEventType.ComponentUpdate: case NetworkEventType.ImportantComponentUpdate: @@ -1434,7 +1441,7 @@ namespace Barotrauma { case NetworkEventType.DropItem: Vector2 newSimPos = Vector2.Zero; - newSimPos = new Vector2(message.ReadFloat(), message.ReadFloat()); + newSimPos = new Vector2(message.ReadFloat(), message.ReadFloat()); SetTransform(newSimPos, body.Rotation); Drop(null, false); break; @@ -1443,15 +1450,20 @@ namespace Barotrauma byte requirementIndex = message.ReadByte(); data = requirementIndex; - if (requirementIndex>=FixRequirements.Count) return; + if (requirementIndex >= FixRequirements.Count) return; FixRequirements[requirementIndex].Fixed = true; break; case NetworkEventType.InventoryUpdate: + var itemContainers = GetComponents(); + if (itemContainers == null || !itemContainers.Any()) return; + + int containerCount = message.ReadRangedInteger(1, ItemContainer.MaxInventoryCount); + for (int i = 0; i < containerCount;i++ ) + { + itemContainers[i].Inventory.ReadNetworkData(type, message, sendingTime); + } - var itemContainer = GetComponent(); - if (itemContainer == null || itemContainer.Inventory == null) return; - itemContainer.Inventory.ReadNetworkData(NetworkEventType.DropItem, message, sendingTime); break; case NetworkEventType.ComponentUpdate: case NetworkEventType.ImportantComponentUpdate: diff --git a/Subsurface/Source/Map/Explosion.cs b/Subsurface/Source/Map/Explosion.cs index 329e3c5e8..9e5d4d8cc 100644 --- a/Subsurface/Source/Map/Explosion.cs +++ b/Subsurface/Source/Map/Explosion.cs @@ -41,10 +41,16 @@ namespace Barotrauma { GameMain.ParticleManager.CreateParticle("shockwave", worldPosition, Vector2.Zero, 0.0f, hull); + + } for (int i = 0; i < attack.Range * 0.1f; i++) { + Vector2 bubblePos = Rand.Vector(attack.Range * 0.5f); + GameMain.ParticleManager.CreateParticle("bubbles", worldPosition+bubblePos, + bubblePos, 0.0f, hull); + if (sparks) { GameMain.ParticleManager.CreateParticle("spark", worldPosition, @@ -75,16 +81,17 @@ namespace Barotrauma foreach (Character c in Character.CharacterList) { - float dist = Vector2.Distance(c.WorldPosition, worldPosition); - if (dist > attack.Range) continue; - - float distFactor = 1.0f - dist / attack.Range; foreach (Limb limb in c.AnimController.Limbs) { + float dist = Vector2.Distance(limb.WorldPosition, worldPosition); + + if (dist > attack.Range) continue; + + float distFactor = 1.0f - dist / attack.Range; + if (limb.WorldPosition == worldPosition) continue; - distFactor = 1.0f - Vector2.Distance(limb.WorldPosition, worldPosition)/attack.Range; c.AddDamage(limb.SimPosition, DamageType.None, attack.GetDamage(1.0f) / c.AnimController.Limbs.Length * distFactor, 0.0f, attack.Stun * distFactor, false); diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index ab62b1e4e..5947c7ab6 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -407,7 +407,7 @@ namespace Barotrauma public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true) { - if (back) return; + //if (back) return; if (!ShowHulls && !GameMain.DebugDraw) return; diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index f91fa1cf8..530003b63 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -13,12 +13,25 @@ using Voronoi2; namespace Barotrauma { + class Level { public static Level Loaded { get { return loaded; } } + + struct InterestingPosition + { + public readonly Vector2 Position; + public readonly bool IsLarge; + + public InterestingPosition(Vector2 position, bool isLarge) + { + Position = position; + IsLarge = isLarge; + } + } static Level loaded; @@ -49,7 +62,7 @@ namespace Barotrauma private List bodies; - private List positionsOfInterest; + private List positionsOfInterest; public Vector2 StartPosition { @@ -65,12 +78,7 @@ namespace Barotrauma { get { return endPosition; } } - - public List PositionsOfInterest - { - get { return positionsOfInterest; } - } - + public WrappingWall[,] WrappingWalls { get { return wrappingWalls; } @@ -101,7 +109,7 @@ namespace Barotrauma this.Difficulty = difficulty; - positionsOfInterest = new List(); + positionsOfInterest = new List(); borders = new Rectangle(0, 0, width, height); } @@ -109,7 +117,7 @@ namespace Barotrauma public static Level CreateRandom(LocationConnection locationConnection) { string seed = locationConnection.Locations[0].Name + locationConnection.Locations[1].Name; - return new Level(seed, locationConnection.Difficulty, 100000, 40000, 2000); + return new Level(seed, locationConnection.Difficulty, 100000, 50000, 2000); } public static Level CreateRandom(string seed = "") @@ -118,7 +126,7 @@ namespace Barotrauma { seed = Rand.Range(0, int.MaxValue, false).ToString(); } - return new Level(seed, Rand.Range(30.0f,80.0f,false), 100000, 40000, 2000); + return new Level(seed, Rand.Range(30.0f,80.0f,false), 100000, 50000, 2000); } public void Generate(bool mirror=false) @@ -140,6 +148,63 @@ namespace Barotrauma Rand.SetSyncedSeed(ToolBox.StringToInt(seed)); + float minWidth = Submarine.Loaded == null ? 3000.0f : Math.Max(Submarine.Borders.Width, Submarine.Borders.Height); + + startPosition = new Vector2(minWidth * 2, borders.Height); + endPosition = new Vector2(borders.Width - minWidth * 2, borders.Height); + + + List pathNodes = new List(); + Rectangle pathBorders = borders;// new Rectangle((int)minWidth, (int)minWidth, borders.Width - (int)minWidth * 2, borders.Height - (int)minWidth); + pathBorders.Inflate(-minWidth*2, -minWidth*2); + + pathNodes.Add(startPosition); + //pathNodes.Add(new Vector2(minWidth * 3, Rand.Range(minWidth * 2, borders.Height - minWidth * 2, false))); + + for (float x = startPosition.X; x < endPosition.X; x += Rand.Range(2000.0f, 10000.0f, false)) + { + pathNodes.Add(new Vector2(x, Rand.Range(pathBorders.Y, pathBorders.Bottom, false))); + + //if (x > borders.Center.X) + //{ + // positionsOfInterest.Add(pathNodes.Last()); + //} + } + + //pathNodes.Add(new Vector2(borders.Width - minWidth * 3, borders.Height / 2)); + pathNodes.Add(endPosition); + + int smallTunnelCount = 5; + + List> smallTunnels = new List>(); + + for (int i = 0; i < smallTunnelCount; i++) + { + var tunnelStartPos = pathNodes[Rand.Range(2, pathNodes.Count - 2, false)]; + tunnelStartPos.X = MathHelper.Clamp(tunnelStartPos.X, pathBorders.X, pathBorders.Right); + + float tunnelLength = Rand.Range(5000.0f, 10000.0f, false); + + var tunnelNodes = MathUtils.GenerateJaggedLine(tunnelStartPos, tunnelStartPos + Rand.Vector(tunnelLength,false) + Vector2.UnitY*5000.0f, 3, 1000.0f); + + List tunnel = new List(); + foreach (Vector2[] tunnelNode in tunnelNodes) + { + if (!pathBorders.Contains(tunnelNode[0])) break; + tunnel.Add(tunnelNode[0]); + } + + if (tunnel.Any()) + { + smallTunnels.Add(tunnel); + positionsOfInterest.Add(new InterestingPosition(tunnel.Last(), false)); + + if (tunnel.Count() > 4) positionsOfInterest.Add(new InterestingPosition(tunnel[tunnel.Count()/2], false)); + } + } + + + float siteVariance = siteInterval * 0.4f; for (int x = siteInterval / 2; x < borders.Width; x += siteInterval) { @@ -147,6 +212,13 @@ namespace Barotrauma { Vector2 site = new Vector2(x, y) + Rand.Vector(siteVariance, false); + if (smallTunnels.Any(t => t.Any(node => Vector2.Distance(node, site) < siteInterval))) + { + if (x < borders.Width - siteInterval) sites.Add(new Vector2(x, y) + Vector2.UnitX * siteInterval * 0.2f); + if (y < borders.Height - siteInterval) sites.Add(new Vector2(x, y) + Vector2.UnitY * siteInterval * 0.2f); + if (x < borders.Width - siteInterval && y < borders.Height - siteInterval) sites.Add(new Vector2(x, y) + Vector2.One * siteInterval * 0.2f); + } + if (mirror) site.X = borders.Width - site.X; sites.Add(site); @@ -205,68 +277,63 @@ namespace Barotrauma Debug.WriteLine("find cells: " + sw2.ElapsedMilliseconds + " ms"); sw2.Restart(); - float minWidth = Submarine.Loaded == null ? 3000.0f : Math.Max(Submarine.Borders.Width, Submarine.Borders.Height); - //generate a path from the left edge of the map to right edge - Rectangle pathBorders = new Rectangle( - borders.X + (int)minWidth * 2, borders.Y + (int)minWidth * 2, - borders.Right - (int)minWidth * 4, borders.Y + borders.Height - (int)minWidth * 4); - - List pathNodes = new List(); - - startPosition = new Vector2((int)minWidth * 2, Rand.Range((int)minWidth * 2, borders.Height - (int)minWidth * 2, false)); - endPosition = new Vector2(borders.Width - (int)minWidth * 2, Rand.Range((int)minWidth * 2, borders.Height - (int)minWidth * 2, false)); - - pathNodes.Add(new Vector2(startPosition.X, borders.Height)); - pathNodes.Add(startPosition); - pathNodes.Add(endPosition); - pathNodes.Add(new Vector2(endPosition.X, borders.Height)); - - if (mirror) - { - pathNodes.Reverse(); - } + //if (mirror) + //{ + // pathNodes.Reverse(); + //} List pathCells = GeneratePath(pathNodes, cells, pathBorders, minWidth, 0.3f, mirror, true); - //place some enemy spawnpoints at random points in the path - for (int i = 0; i <3 ; i++ ) + foreach (InterestingPosition positionOfInterest in positionsOfInterest) { - Vector2 position = pathCells[Rand.Range((int)(pathCells.Count * 0.5f), pathCells.Count - 2, false)].Center; - WayPoint wayPoint = new WayPoint(new Rectangle((int)position.X, (int)position.Y, 10, 10), null); + WayPoint wayPoint = new WayPoint(positionOfInterest.Position, SpawnType.Enemy, null); wayPoint.MoveWithLevel = true; - wayPoint.SpawnType = SpawnType.Enemy; } startPosition = pathCells[0].Center; endPosition = pathCells[pathCells.Count - 1].Center; - //generate a couple of random paths - for (int i = 0; i <= Rand.Range(1,4,false); i++) + foreach (List tunnel in smallTunnels) { - //pathBorders = new Rectangle( - //borders.X + siteInterval * 2, borders.Y - siteInterval * 2, - //borders.Right - siteInterval * 2, borders.Y + borders.Height - siteInterval * 2); + if (tunnel.Count<2) continue; - Vector2 start = pathCells[Rand.Range(1, pathCells.Count - 2,false)].Center; + var newPathCells = GeneratePath(tunnel, cells, pathBorders, 0.0f, 0.0f); - float x = pathBorders.X + Rand.Range(0, pathBorders.Right - pathBorders.X, false); - float y = pathBorders.Y + Rand.Range(0,pathBorders.Bottom - pathBorders.Y, false); - - if (mirror) x = borders.Width - x; - - Vector2 end = new Vector2(x, y); - - var newPathCells = GeneratePath(new List { start, end }, cells, pathBorders, 0.0f, 0.8f, mirror); - - for (int n = 0; n < newPathCells.Count; n += 5) - { - positionsOfInterest.Add(newPathCells[n].Center); - } + //for (int n = 0; n < newPathCells.Count; n += 5) + //{ + // positionsOfInterest.Add(newPathCells[n].Center); + //} pathCells.AddRange(newPathCells); } + ////generate a couple of random paths + //for (int i = 0; i <= Rand.Range(1,4,false); i++) + //{ + // //pathBorders = new Rectangle( + // //borders.X + siteInterval * 2, borders.Y - siteInterval * 2, + // //borders.Right - siteInterval * 2, borders.Y + borders.Height - siteInterval * 2); + + // Vector2 start = pathCells[Rand.Range(1, pathCells.Count - 2,false)].Center; + + // float x = pathBorders.X + Rand.Range(0, pathBorders.Right - pathBorders.X, false); + // float y = pathBorders.Y + Rand.Range(0,pathBorders.Bottom - pathBorders.Y, false); + + // if (mirror) x = borders.Width - x; + + // Vector2 end = new Vector2(x, y); + + // var newPathCells = GeneratePath(new List { start, end }, cells, pathBorders, 0.0f, 0.8f, mirror); + + // for (int n = 0; n < newPathCells.Count; n += 5) + // { + // positionsOfInterest.Add(newPathCells[n].Center); + // } + + // pathCells.AddRange(newPathCells); + //} + Debug.WriteLine("path: " + sw2.ElapsedMilliseconds + " ms"); sw2.Restart(); @@ -282,9 +349,9 @@ namespace Barotrauma cells = CleanCells(pathCells); - pathCells.AddRange(CreateBottomHoles(0.8f, new Rectangle( + pathCells.AddRange(CreateBottomHoles(Rand.Range(0.2f,0.8f, false), new Rectangle( (int)(borders.Width * 0.2f), 0, - (int)(borders.Width * 0.6f), (int)(borders.Height * 0.5f)))); + (int)(borders.Width * 0.6f), (int)(borders.Height * 0.3f)))); foreach (VoronoiCell cell in pathCells) { @@ -345,7 +412,11 @@ namespace Barotrauma ShaftBodies[i] = BodyFactory.CreateRectangle(GameMain.World, 100.0f, 10.0f, 5.0f); ShaftBodies[i].BodyType = BodyType.Static; ShaftBodies[i].CollisionCategories = Physics.CollisionLevel; - ShaftBodies[i].SetTransform(ConvertUnits.ToSimUnits((i == 0) ? startPosition : endPosition), 0.0f); + + Vector2 shaftPos = (i == 0) ? startPosition : endPosition; + shaftPos.Y = borders.Height; + + ShaftBodies[i].SetTransform(ConvertUnits.ToSimUnits(shaftPos), 0.0f); bodies.Add(ShaftBodies[i]); } @@ -403,7 +474,9 @@ namespace Barotrauma VoronoiCell currentCell = targetCells[0]; pathCells.Add(currentCell); - int currentTargetIndex = 1; + int currentTargetIndex = 1; + + wanderAmount = 0.0f; do { @@ -416,7 +489,7 @@ namespace Barotrauma allowedEdges.Add(edge); } - + //steer towards target if (Rand.Range(0.0f, 1.0f, false) > wanderAmount || allowedEdges.Count == 0) { @@ -544,22 +617,31 @@ namespace Barotrauma minDistance *= 0.5f; do { - for (int x = -1; x <= 1; x++) - { - for (int y = -1; y <= 1; y++) - { - if (x == 0 && y == 0) continue; - Vector2 cornerPos = position + new Vector2(x * minDistance, y * minDistance); + var closeCells = GetCells(position, 2); - int cellIndex = FindCellIndex(cornerPos); - if (cellIndex == -1) continue; - if (!tooCloseCells.Contains(cells[cellIndex])) - { - tooCloseCells.Add(cells[cellIndex]); - } - } + foreach (VoronoiCell cell in closeCells) + { + if (!cell.edges.Any(e => Vector2.Distance(position, e.point1) < minDistance || Vector2.Distance(position, e.point2) < minDistance)) continue; + + if (!tooCloseCells.Contains(cell)) tooCloseCells.Add(cell); } + //for (int x = -1; x <= 1; x++) + //{ + // for (int y = -1; y <= 1; y++) + // { + // if (x == 0 && y == 0) continue; + // Vector2 cornerPos = position + new Vector2(x * minDistance, y * minDistance); + + // int cellIndex = FindCellIndex(cornerPos); + // if (cellIndex == -1) continue; + // if (!tooCloseCells.Contains(cells[cellIndex])) + // { + // tooCloseCells.Add(cells[cellIndex]); + // } + // } + //} + position += Vector2.Normalize(emptyCells[targetCellIndex].Center - position) * step; if (Vector2.Distance(emptyCells[targetCellIndex].Center, position) < step * 2.0f) targetCellIndex++; @@ -771,6 +853,15 @@ namespace Barotrauma } + if (!leftNormal.IsValid()) + { +#if DEBUG + DebugConsole.ThrowError("Invalid right normal"); +#endif + leftNormal = Vector2.UnitX; + } + + if (rightEdge == null) { rightNormal = GetEdgeNormal(edge, cell); @@ -782,6 +873,14 @@ namespace Barotrauma Vector2.Normalize(rightEdge.Center - edge.point2); } + if (!rightNormal.IsValid()) + { +#if DEBUG + DebugConsole.ThrowError("Invalid right normal"); +#endif + rightNormal = Vector2.UnitX; + } + @@ -856,6 +955,8 @@ namespace Barotrauma public Vector2 GetRandomItemPos(float offsetFromWall = 10.0f) { + if (!positionsOfInterest.Any()) return Size*0.5f; + Vector2 position = Vector2.Zero; offsetFromWall = ConvertUnits.ToSimUnits(offsetFromWall); @@ -863,7 +964,7 @@ namespace Barotrauma int tries = 0; do { - Vector2 startPos = ConvertUnits.ToSimUnits(PositionsOfInterest[Rand.Int(PositionsOfInterest.Count, false)]); + Vector2 startPos = ConvertUnits.ToSimUnits(positionsOfInterest[Rand.Int(positionsOfInterest.Count, false)].Position); Vector2 endPos = startPos - ConvertUnits.ToSimUnits(Vector2.UnitY * Size.Y); @@ -888,6 +989,23 @@ namespace Barotrauma return position; } + public Vector2 GetRandomInterestingPosition(bool requireSpace, bool useSyncedRand) + { + if (!positionsOfInterest.Any()) return Size * 0.5f; + + if (requireSpace) + { + var positionsWithSpace = positionsOfInterest.FindAll(p => p.IsLarge); + if (!positionsWithSpace.Any()) return Size * 0.5f; + + return positionsWithSpace[Rand.Int(positionsOfInterest.Count, !useSyncedRand)].Position; + } + else + { + return positionsOfInterest[Rand.Int(positionsOfInterest.Count, !useSyncedRand)].Position; + } + } + public void Update (float deltaTime) { if (Submarine.Loaded!=null) @@ -902,6 +1020,14 @@ namespace Barotrauma { if (renderer == null) return; renderer.Draw(spriteBatch); + + if (GameMain.DebugDraw) + { + foreach (InterestingPosition pos in positionsOfInterest) + { + GUI.DrawRectangle(spriteBatch, new Vector2(pos.Position.X-15.0f, -pos.Position.Y-15.0f), new Vector2(30.0f, 30.0f), Color.Gold, true); + } + } } public void DrawBack(SpriteBatch spriteBatch, Camera cam, BackgroundCreatureManager backgroundSpriteManager = null) @@ -934,10 +1060,14 @@ namespace Barotrauma } } + if (wrappingWalls == null) return cells; + for (int side = 0; side < 2; side++) { for (int n = 0; n < 2; n++) { + if (wrappingWalls[side, n] == null) continue; + if (Vector2.Distance(wrappingWalls[side, n].MidPos, pos) > WrappingWall.WallWidth) continue; foreach (VoronoiCell cell in wrappingWalls[side, n].Cells) @@ -1015,6 +1145,7 @@ namespace Barotrauma private void Unload() { + renderer.Dispose(); renderer = null; diff --git a/Subsurface/Source/Map/Levels/LevelRenderer.cs b/Subsurface/Source/Map/Levels/LevelRenderer.cs index 136fa9949..2cbd4fccf 100644 --- a/Subsurface/Source/Map/Levels/LevelRenderer.cs +++ b/Subsurface/Source/Map/Levels/LevelRenderer.cs @@ -144,7 +144,7 @@ namespace Barotrauma public void Draw(SpriteBatch spriteBatch) { - Vector2 pos = new Vector2(0.0f, -level.StartPosition.Y);// level.EndPosition; + Vector2 pos = new Vector2(0.0f, -level.Size.Y);// level.EndPosition; if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y - 512) return; @@ -232,8 +232,8 @@ namespace Barotrauma protected virtual void Dispose(bool disposing) { - wallVertices.Dispose(); - bodyVertices.Dispose(); + if (wallVertices!=null) wallVertices.Dispose(); + if (bodyVertices != null) bodyVertices.Dispose(); } } diff --git a/Subsurface/Source/Map/Levels/WrappingWall.cs b/Subsurface/Source/Map/Levels/WrappingWall.cs index 43accf309..797a34bfb 100644 --- a/Subsurface/Source/Map/Levels/WrappingWall.cs +++ b/Subsurface/Source/Map/Levels/WrappingWall.cs @@ -198,8 +198,8 @@ namespace Barotrauma protected virtual void Dispose(bool disposing) { - wallVertices.Dispose(); - bodyVertices.Dispose(); + if (wallVertices!=null) wallVertices.Dispose(); + if (bodyVertices!=null) bodyVertices.Dispose(); } } } diff --git a/Subsurface/Source/Map/Map/Map.cs b/Subsurface/Source/Map/Map/Map.cs index 077b48cc6..4fc161460 100644 --- a/Subsurface/Source/Map/Map/Map.cs +++ b/Subsurface/Source/Map/Map/Map.cs @@ -176,7 +176,7 @@ namespace Barotrauma Vector2 start = connection.Locations[0].MapPosition; Vector2 end = connection.Locations[1].MapPosition; int generations = (int)(Math.Sqrt(Vector2.Distance(start, end) / 10.0f)); - connection.CrackSegments = GenerateCrack(start, end, generations); + connection.CrackSegments = MathUtils.GenerateJaggedLine(start, end, generations, 5.0f); } } @@ -200,39 +200,6 @@ namespace Barotrauma } } - private List GenerateCrack(Vector2 start, Vector2 end, int generations) - { - List segments = new List(); - - segments.Add(new Vector2[] {start, end}); - - float offsetAmount = 5.0f; - - for (int n = 0; n < generations; n++) - { - for (int i = 0; i < segments.Count; i++) - { - Vector2 startSegment = segments[i][0]; - Vector2 endSegment = segments[i][1]; - - segments.RemoveAt(i); - - Vector2 midPoint = (startSegment + endSegment) / 2.0f; - - Vector2 normal = Vector2.Normalize(endSegment - startSegment); - normal = new Vector2(-normal.Y, normal.X); - midPoint += normal * Rand.Range(-offsetAmount, offsetAmount, false); - - segments.Insert(i, new Vector2[] { startSegment, midPoint }); - segments.Insert(i+1, new Vector2[] { midPoint, endSegment }); - - i++; - } - } - - return segments; - } - public void MoveToNextLocation() { currentLocation = selectedLocation; diff --git a/Subsurface/Source/Sprite.cs b/Subsurface/Source/Sprite.cs index cbc1ed45e..99038a9c9 100644 --- a/Subsurface/Source/Sprite.cs +++ b/Subsurface/Source/Sprite.cs @@ -68,7 +68,7 @@ namespace Barotrauma { file = ToolBox.GetAttributeString(element, "texture", ""); } - + if (file == "") { DebugConsole.ThrowError("Sprite " + element + " doesn't have a texture specified!"); diff --git a/Subsurface/Source/Utils/MathUtils.cs b/Subsurface/Source/Utils/MathUtils.cs index 781454bcf..ddba37391 100644 --- a/Subsurface/Source/Utils/MathUtils.cs +++ b/Subsurface/Source/Utils/MathUtils.cs @@ -242,6 +242,37 @@ namespace Barotrauma return triangles; } + + public static List GenerateJaggedLine(Vector2 start, Vector2 end, int generations, float offsetAmount) + { + List segments = new List(); + + segments.Add(new Vector2[] { start, end }); + + for (int n = 0; n < generations; n++) + { + for (int i = 0; i < segments.Count; i++) + { + Vector2 startSegment = segments[i][0]; + Vector2 endSegment = segments[i][1]; + + segments.RemoveAt(i); + + Vector2 midPoint = (startSegment + endSegment) / 2.0f; + + Vector2 normal = Vector2.Normalize(endSegment - startSegment); + normal = new Vector2(-normal.Y, normal.X); + midPoint += normal * Rand.Range(-offsetAmount, offsetAmount, false); + + segments.Insert(i, new Vector2[] { startSegment, midPoint }); + segments.Insert(i + 1, new Vector2[] { midPoint, endSegment }); + + i++; + } + } + + return segments; + } } class CompareCCW : IComparer diff --git a/Subsurface/changelog.txt b/Subsurface/changelog.txt index 9aa4fb76a..811654252 100644 --- a/Subsurface/changelog.txt +++ b/Subsurface/changelog.txt @@ -1,3 +1,11 @@ +--------------------------------------------------------------------------------------------------------- +v0.3.1.1 +--------------------------------------------------------------------------------------------------------- + +- fixed a major bug that caused item/monster ID mismatches between the server and the clients, which +accounted for many of the monster/inventory/item syncing issues +- improved player position syncing + --------------------------------------------------------------------------------------------------------- v0.3.1.0 --------------------------------------------------------------------------------------------------------- diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index d7b626fe7353cdea15923df6309110c79c8520e2..d098ef3956c65649dd34f35b7b68a83fb98ada0f 100644 GIT binary patch delta 19092 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 bng<>43k0&@3;MYdDd;O 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