From 80648ffd46f50a7056bf2a8c80d7286e05243732 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 27 May 2015 01:02:30 +0300 Subject: [PATCH] electricity bugfixes, destructable doors, ai improvements, removed rope, container changes --- Subsurface/Characters/AI/EnemyAIController.cs | 191 ++++++++++-------- Subsurface/Characters/AI/SteeringManager.cs | 27 ++- Subsurface/Characters/Character.cs | 47 +++-- Subsurface/Characters/FishAnimController.cs | 2 +- Subsurface/Characters/Limb.cs | 11 +- Subsurface/Characters/LimbAttack.cs | 13 +- Subsurface/Characters/Ragdoll.cs | 28 +-- .../Content/Characters/Crawler/crawler.xml | 2 +- .../TigerThresher/tigerthresher.xml | 2 +- .../Content/Items/Diving/divinggear.xml | 4 +- Subsurface/Content/Items/Door/doors.xml | 4 + Subsurface/Content/Items/MiniMap/item.xml | 5 + Subsurface/Content/Items/Weapons/weapons.xml | 6 +- Subsurface/Content/Items/poweritems.xml | 3 +- Subsurface/Content/randomevents.xml | 3 +- Subsurface/Events/MonsterEvent.cs | 10 +- Subsurface/GUI/GUI.cs | 10 +- Subsurface/Game1.cs | 15 +- Subsurface/GameSession/CrewManager.cs | 2 +- Subsurface/GameSession/GameSession.cs | 2 + Subsurface/GameSession/HireManager.cs | 1 - Subsurface/Items/Components/Container.cs | 94 ++++++--- Subsurface/Items/Components/Door.cs | 158 ++++++++------- Subsurface/Items/Components/ItemComponent.cs | 52 ++--- Subsurface/Items/Components/MiniMap.cs | 2 +- Subsurface/Items/Components/PowerContainer.cs | 34 ++-- Subsurface/Items/Components/PowerTransfer.cs | 10 +- Subsurface/Items/Components/Projectile.cs | 54 ++--- Subsurface/Items/Components/Pump.cs | 11 +- Subsurface/Items/Components/Reactor.cs | 5 +- Subsurface/Items/Components/Rope.cs | 2 +- .../Components/Signal/ConnectionPanel.cs | 13 +- Subsurface/Items/Components/Signal/Wire.cs | 125 +++++++----- Subsurface/Items/Item.cs | 12 +- Subsurface/Map/Entity.cs | 2 +- Subsurface/Map/Explosion.cs | 7 +- Subsurface/Map/Gap.cs | 119 ++++++----- Subsurface/Map/Hull.cs | 5 +- Subsurface/Map/IDamageable.cs | 11 +- Subsurface/Map/Map.cs | 34 +++- Subsurface/Map/Structure.cs | 7 +- Subsurface/Particles/Particle.cs | 24 ++- Subsurface/Particles/ParticleManager.cs | 12 +- Subsurface/Screens/LobbyScreen.cs | 4 +- Subsurface_Solution.sln | 8 + Subsurface_Solution.v12.suo | Bin 186368 -> 226816 bytes ...{8C1D2051-F0F3-457B-AAAE-4E155FC7C75C}.xml | 10 +- ...gnTimeResolveAssemblyReferencesInput.cache | Bin 5909 -> 5857 bytes ...urface_content.csproj.FileListAbsolute.txt | 6 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 6705 -> 6652 bytes ...ntContent.contentproj.FileListAbsolute.txt | 1 + 51 files changed, 701 insertions(+), 509 deletions(-) diff --git a/Subsurface/Characters/AI/EnemyAIController.cs b/Subsurface/Characters/AI/EnemyAIController.cs index da8c085e1..e80f694f3 100644 --- a/Subsurface/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Characters/AI/EnemyAIController.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using FarseerPhysics; using Lidgren.Network; using Microsoft.Xna.Framework; +using FarseerPhysics.Dynamics; namespace Subsurface { @@ -41,7 +42,7 @@ namespace Subsurface //a point in a wall which the character is currently targeting private Vector2 wallAttackPos; //the entity (a wall) which the character is targeting - private MapEntity targetEntity; + private IDamageable targetEntity; //the limb selected for the current attack private Limb attackingLimb; @@ -157,23 +158,7 @@ namespace Subsurface if (coolDownTimer>0.0f) { - coolDownTimer -= deltaTime; - - //System.Diagnostics.Debug.WriteLine("cooldown"); - - if (selectedTarget.entity is Hull || - Vector2.Distance(attackPosition, character.animController.limbs[0].SimPosition) sectionDamage) sectionIndex = i; - } - wallAttackPos = wall.SectionPosition(sectionIndex); - wallAttackPos = ConvertUnits.ToSimUnits(wallAttackPos); - } - - - targetEntity = closestStructure; - } + GetTargetEntity(); raycastTimer = RaycastInterval; } @@ -246,13 +193,68 @@ namespace Subsurface } + private void UpdateCoolDown(Vector2 attackPosition, float deltaTime) + { + coolDownTimer -= deltaTime; + attackingLimb = null; + + //System.Diagnostics.Debug.WriteLine("cooldown"); + + if (selectedTarget.entity is Hull || + Vector2.Distance(attackPosition, character.animController.limbs[0].SimPosition) < ConvertUnits.ToSimUnits(500.0f)) + { + steeringManager.SteeringSeek(attackPosition, -0.8f); + steeringManager.SteeringAvoid(deltaTime, 1.0f); + } + else + { + steeringManager.SteeringSeek(attackPosition, -0.5f); + steeringManager.SteeringAvoid(deltaTime, 1.0f); + } + } + + private void GetTargetEntity() + { + targetEntity = null; + //check if there's a wall between the target and the character + Vector2 rayStart = character.animController.limbs[0].SimPosition; + Vector2 rayEnd = selectedTarget.Position; + Body closestBody = Map.CheckVisibility(rayStart, rayEnd); + + if (Map.LastPickedFraction == 1.0f || closestBody == null) + { + wallAttackPos = Vector2.Zero; + return; + } + + Structure wall = closestBody.UserData as Structure; + if (wall == null) + { + wallAttackPos = Map.LastPickedPosition; + } + else + { + int sectionIndex = wall.FindSectionIndex(ConvertUnits.ToDisplayUnits(Map.LastPickedPosition)); + + float sectionDamage = wall.SectionDamage(sectionIndex); + for (int i = sectionIndex - 2; i <= sectionIndex + 2; i++) + { + if (wall.SectionHasHole(i)) + { + sectionIndex = i; + break; + } + if (wall.SectionDamage(i) > sectionDamage) sectionIndex = i; + } + wallAttackPos = wall.SectionPosition(sectionIndex); + wallAttackPos = ConvertUnits.ToSimUnits(wallAttackPos); + } + + targetEntity = closestBody.UserData as IDamageable; + } + private void UpdateLimbAttack(float deltaTime, Limb limb, Vector2 attackPosition) { - //DamageType damageType = DamageType.None; - // float damage = 0.0f; - - //bool hasAttacked = false; - IDamageable damageTarget = null; switch (limb.attack.type) @@ -310,21 +312,14 @@ namespace Subsurface attackTimer = 0.0f; if (Vector2.Distance(limb.SimPosition, attackPosition)<5.0) coolDownTimer = attackCoolDown; - System.Diagnostics.Debug.WriteLine("cooldown: " + coolDownTimer); } } - - //private float GetAttackDamage(Limb limb, float deltaTime) - //{ - // return (limb.attack.duration == 0.0f) ? limb.attack.damage : limb.attack.damage * deltaTime; - //} - + //goes through all the AItargets, evaluates how preferable it is to attack the target, //whether the character can see/hear the target and chooses the most preferable target within //sight/hearing range public void UpdateTargets(Character character) { - if (distanceAccumulator<5.0f && Game1.random.Next(1,3)==1) { selectedTarget = null; @@ -344,6 +339,9 @@ namespace Subsurface { float valueModifier = 0.0f; float dist = 0.0f; + + IDamageable targetDamageable = target.entity as IDamageable; + if (targetDamageable!=null && targetDamageable.Health <= 0.0f) continue; Character targetCharacter = target.entity as Character; @@ -371,30 +369,49 @@ namespace Subsurface AITargetMemory targetMemory = FindTargetMemory(target); - valueModifier *= targetMemory.Priority; + valueModifier = valueModifier * targetMemory.Priority / dist; //dist -= targetMemory.Priority; - if (valueModifier != 0.0f && (dist < target.SightRange * sight || dist < target.SoundRange * hearing)) - { - //if the target is a character, check if it is visible + if (Math.Abs(valueModifier) > Math.Abs(this.targetValue) && (dist < target.SightRange * sight || dist < target.SoundRange * hearing)) + { + Vector2 rayStart = character.animController.limbs[0].SimPosition; + Vector2 rayEnd = target.Position; + + Body closestBody = Map.CheckVisibility(rayStart, rayEnd); + Structure closestStructure = (closestBody == null) ? null : closestBody.UserData as Structure; + if (targetCharacter != null) { - Vector2 rayStart = character.animController.limbs[0].SimPosition; - Vector2 rayEnd = target.Position; - - Structure closestStructure = Map.CheckVisibility(rayStart, rayEnd); - //System.Diagnostics.Debug.WriteLine("closestfraction: " + closestFraction); - //if not visible, ignore this AItarget + //if target is a character that isn't visible, ignore if (closestStructure != null) continue; - } - float newTargetValue = valueModifier/dist; - if (selectedTarget == null || Math.Abs(newTargetValue) > Math.Abs(this.targetValue)) + //prefer targets with low health + valueModifier = valueModifier / targetCharacter.Health; + } + else + { + if (targetDamageable != null) + { + valueModifier = valueModifier / targetDamageable.Health; + + } + else if (closestStructure!=null) + { + valueModifier = valueModifier / (closestStructure as IDamageable).Health; + } + + } + + + + //float newTargetValue = valueModifier/dist; + if (selectedTarget == null || Math.Abs(valueModifier) > Math.Abs(this.targetValue)) { selectedTarget = target; selectedTargetMemory = targetMemory; - targetValue = newTargetValue; - Debug.WriteLine(selectedTarget); + + this.targetValue = valueModifier; + Debug.WriteLine(selectedTarget.entity+": "+targetValue); } } } @@ -449,7 +466,7 @@ namespace Subsurface message.Write(raycastTimer); message.Write(coolDownTimer); - message.Write(targetEntity==null ? -1 : targetEntity.ID); + message.Write(targetEntity==null ? -1 : (targetEntity as Entity).ID); } public override void ReadNetworkData(NetIncomingMessage message) @@ -472,7 +489,7 @@ namespace Subsurface this.coolDownTimer = coolDownTimer; if (targetID>-1) - targetEntity = Entity.FindEntityByID(targetID) as MapEntity; + targetEntity = Entity.FindEntityByID(targetID) as IDamageable; } } diff --git a/Subsurface/Characters/AI/SteeringManager.cs b/Subsurface/Characters/AI/SteeringManager.cs index 058cf7efb..0b6337300 100644 --- a/Subsurface/Characters/AI/SteeringManager.cs +++ b/Subsurface/Characters/AI/SteeringManager.cs @@ -1,5 +1,6 @@ using System; using Microsoft.Xna.Framework; +using FarseerPhysics.Dynamics; namespace Subsurface { @@ -112,25 +113,29 @@ namespace Subsurface if (rayCastTimer <= 0.0f) { rayCastTimer = RayCastInterval; - Structure closestStructure = Map.CheckVisibility(host.Position, ahead); - if (closestStructure == null) + Body closestBody = Map.CheckVisibility(host.Position, ahead); + if (closestBody == null) { avoidSteering = Vector2.Zero; return Vector2.Zero; } else { - Vector2 obstaclePosition = Map.LastPickedPosition; - if (closestStructure.IsHorizontal) + Structure closestStructure = closestBody.UserData as Structure; + if (closestStructure!=null) { - obstaclePosition.Y = closestStructure.SimPosition.Y; - } - else - { - obstaclePosition.X = closestStructure.SimPosition.X; - } + Vector2 obstaclePosition = Map.LastPickedPosition; + if (closestStructure.IsHorizontal) + { + obstaclePosition.Y = closestStructure.SimPosition.Y; + } + else + { + obstaclePosition.X = closestStructure.SimPosition.X; + } - avoidSteering = Vector2.Normalize(Map.LastPickedPosition - obstaclePosition); + avoidSteering = Vector2.Normalize(Map.LastPickedPosition - obstaclePosition); + } } } diff --git a/Subsurface/Characters/Character.cs b/Subsurface/Characters/Character.cs index 4eea16735..c76555f74 100644 --- a/Subsurface/Characters/Character.cs +++ b/Subsurface/Characters/Character.cs @@ -119,6 +119,20 @@ namespace Subsurface } } + public float Health + { + get + { + float totalHealth = 0.0f; + foreach (Limb l in animController.limbs) + { + totalHealth += (l.MaxHealth - l.Damage); + + } + return totalHealth/animController.limbs.Count(); + } + } + public float Blood { get { return blood; } @@ -637,29 +651,25 @@ namespace Subsurface Vector2 particleVel = closestLimb.SimPosition-position; if (particleVel != Vector2.Zero) particleVel = Vector2.Normalize(particleVel); - Game1.particleManager.CreateParticle( + Game1.particleManager.CreateParticle("blood", closestLimb.SimPosition, - ToolBox.RandomFloat(0.0f, 3.1f), - particleVel * ToolBox.RandomFloat(1.0f,3.0f), - "blood"); + particleVel * ToolBox.RandomFloat(1.0f,3.0f)); } for (int i = 0; i < bloodAmount / 2; i++) { - Game1.particleManager.CreateParticle(closestLimb.SimPosition, - 0.0f, - Vector2.Zero, "waterblood"); + Game1.particleManager.CreateParticle("waterblood",closestLimb.SimPosition,Vector2.Zero); } } public void Stun() { - for (int i = 0; i < selectedItems.Length; i++ ) - { - if (selectedItems[i] == null) continue; - selectedItems[i].Drop(); - selectedItems[i] = null; - } + //for (int i = 0; i < selectedItems.Length; i++ ) + //{ + // if (selectedItems[i] == null) continue; + // selectedItems[i].Drop(); + // selectedItems[i] = null; + //} selectedConstruction = null; } @@ -691,17 +701,14 @@ namespace Subsurface for (int i = 0; i < 10; i++) { - Particle p = Game1.particleManager.CreateParticle( + Particle p = Game1.particleManager.CreateParticle("waterblood", torso.SimPosition + new Vector2(ToolBox.RandomFloat(-0.5f, 0.5f), ToolBox.RandomFloat(-0.5f, 0.5f)), - 0.0f, - Vector2.Zero, "waterblood"); + Vector2.Zero); if (p!=null) p.Size *= 2.0f; - Game1.particleManager.CreateParticle( + Game1.particleManager.CreateParticle("bubbles", torso.SimPosition, - 0.0f, - new Vector2(ToolBox.RandomFloat(-0.5f, 0.5f), ToolBox.RandomFloat(-1.0f,0.5f)), - "bubbles"); + new Vector2(ToolBox.RandomFloat(-0.5f, 0.5f), ToolBox.RandomFloat(-1.0f,0.5f))); } foreach (var joint in animController.limbJoints) diff --git a/Subsurface/Characters/FishAnimController.cs b/Subsurface/Characters/FishAnimController.cs index c911bb09e..91838b854 100644 --- a/Subsurface/Characters/FishAnimController.cs +++ b/Subsurface/Characters/FishAnimController.cs @@ -103,7 +103,7 @@ namespace Subsurface if (!inWater) movement.Y = Math.Min(0.0f, movement.Y); - float movementAngle = ToolBox.VectorToAngle(movement)+MathHelper.PiOver2; + float movementAngle = ToolBox.VectorToAngle(movement) - MathHelper.PiOver2; Limb tail = GetLimb(LimbType.Tail); if (tail != null && waveAmplitude>0.0f) diff --git a/Subsurface/Characters/Limb.cs b/Subsurface/Characters/Limb.cs index 91e2e5407..53cce8d37 100644 --- a/Subsurface/Characters/Limb.cs +++ b/Subsurface/Characters/Limb.cs @@ -129,6 +129,11 @@ namespace Subsurface } } + public float MaxHealth + { + get { return maxHealth; } + } + public float Bleeding { get { return bleeding; } @@ -290,9 +295,9 @@ namespace Subsurface if (ToolBox.RandomFloat(0.0f, 1000.0f) < Bleeding) { - Game1.particleManager.CreateParticle(SimPosition, - MathHelper.Pi, - ToolBox.RandomFloat(0.0f, 0.0f), !inWater ? "blood" : "waterblood"); + Game1.particleManager.CreateParticle( + !inWater ? "blood" : "waterblood", + SimPosition, Vector2.Zero); } } diff --git a/Subsurface/Characters/LimbAttack.cs b/Subsurface/Characters/LimbAttack.cs index 11d61f90e..96cf795b7 100644 --- a/Subsurface/Characters/LimbAttack.cs +++ b/Subsurface/Characters/LimbAttack.cs @@ -72,15 +72,16 @@ namespace Subsurface float damageAmount = 0.0f; DamageSoundType damageSoundType = DamageSoundType.None; - if (target as Structure == null) - { - damageAmount = damage; - damageSoundType = (damageType == DamageType.Blunt) ? DamageSoundType.LimbBlunt : DamageSoundType.LimbSlash; - } - else + if (target as Character == null) { damageAmount = structureDamage; damageSoundType = (damageType == DamageType.Blunt) ? DamageSoundType.StructureBlunt: DamageSoundType.StructureSlash; + + } + else + { + damageAmount = damage; + damageSoundType = (damageType == DamageType.Blunt) ? DamageSoundType.LimbBlunt : DamageSoundType.LimbSlash; } if (playSound) AmbientSoundManager.PlayDamageSound(damageSoundType, damageAmount, position); diff --git a/Subsurface/Characters/Ragdoll.cs b/Subsurface/Characters/Ragdoll.cs index 59cc0e866..22c98658b 100644 --- a/Subsurface/Characters/Ragdoll.cs +++ b/Subsurface/Characters/Ragdoll.cs @@ -296,7 +296,7 @@ namespace Subsurface Limb l = (Limb)f1.Body.UserData; - if (impact > 1.0f && l.HitSound != null && l.soundTimer<=0.0f) l.HitSound.Play(Math.Min(impact / 5.0f, 1.0f)); + if (impact > 1.0f && l.HitSound != null && l.soundTimer<=0.0f) l.HitSound.Play(Math.Min(impact / 5.0f, 1.0f), impact*100.0f, l.body.FarseerBody); if (impact > l.impactTolerance) { @@ -308,9 +308,7 @@ namespace Subsurface public virtual void Draw(SpriteBatch spriteBatch) { - - - + foreach (Limb limb in limbs) { limb.Draw(spriteBatch, DebugDraw); @@ -340,11 +338,9 @@ namespace Subsurface foreach (RevoluteJoint joint in limbJoints) { Vector2 pos = ConvertUnits.ToDisplayUnits(joint.WorldAnchorA); - pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.White, true); pos = ConvertUnits.ToDisplayUnits(joint.WorldAnchorB); - pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.White, true); } @@ -494,16 +490,20 @@ namespace Subsurface { //create a splash particle - Game1.particleManager.CreateParticle( + Subsurface.Particles.Particle splash = Game1.particleManager.CreateParticle("watersplash", new Vector2(limb.SimPosition.X, ConvertUnits.ToSimUnits(limbHull.Surface)), - 0.0f, - new Vector2(0.0f, Math.Abs(limb.LinearVelocity.Y*0.1f)), - "watersplash"); - Game1.particleManager.CreateParticle( - new Vector2(limb.SimPosition.X, ConvertUnits.ToSimUnits(limbHull.Surface)), - 0.0f, + new Vector2(0.0f, Math.Abs(-limb.LinearVelocity.Y * 0.1f)), + 0.0f); + + if (splash != null) splash.yLimits = ConvertUnits.ToSimUnits( + new Vector2( + limbHull.Rect.Y, + limbHull.Rect.Y - limbHull.Rect.Height)); + + Game1.particleManager.CreateParticle("bubbles", + new Vector2(limb.SimPosition.X, ConvertUnits.ToSimUnits(limbHull.Surface)), limb.LinearVelocity*0.001f, - "bubbles"); + 0.0f); diff --git a/Subsurface/Content/Characters/Crawler/crawler.xml b/Subsurface/Content/Characters/Crawler/crawler.xml index 0516f6573..e98a1bdd9 100644 --- a/Subsurface/Content/Characters/Crawler/crawler.xml +++ b/Subsurface/Content/Characters/Crawler/crawler.xml @@ -26,7 +26,7 @@ - + diff --git a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml index 8474606f0..321b558a0 100644 --- a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml +++ b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml @@ -15,7 +15,7 @@ - + diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index b02f4aff2..b2e8911af 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -11,7 +11,7 @@ - + @@ -38,7 +38,7 @@ - + diff --git a/Subsurface/Content/Items/Door/doors.xml b/Subsurface/Content/Items/Door/doors.xml index 4a4387447..3db3e79cd 100644 --- a/Subsurface/Content/Items/Door/doors.xml +++ b/Subsurface/Content/Items/Door/doors.xml @@ -9,6 +9,8 @@ + + @@ -30,6 +32,8 @@ + + diff --git a/Subsurface/Content/Items/MiniMap/item.xml b/Subsurface/Content/Items/MiniMap/item.xml index ad9e42970..91be063eb 100644 --- a/Subsurface/Content/Items/MiniMap/item.xml +++ b/Subsurface/Content/Items/MiniMap/item.xml @@ -8,4 +8,9 @@ + + + + + \ No newline at end of file diff --git a/Subsurface/Content/Items/Weapons/weapons.xml b/Subsurface/Content/Items/Weapons/weapons.xml index 37f566500..3d6c71d00 100644 --- a/Subsurface/Content/Items/Weapons/weapons.xml +++ b/Subsurface/Content/Items/Weapons/weapons.xml @@ -11,7 +11,7 @@ - + @@ -33,9 +33,7 @@ - - - + diff --git a/Subsurface/Content/Items/poweritems.xml b/Subsurface/Content/Items/poweritems.xml index 0168d3555..0718b56ea 100644 --- a/Subsurface/Content/Items/poweritems.xml +++ b/Subsurface/Content/Items/poweritems.xml @@ -22,10 +22,9 @@ linkable="true" pickdistance="150"> - - + diff --git a/Subsurface/Content/randomevents.xml b/Subsurface/Content/randomevents.xml index e65489627..8ff17ce89 100644 --- a/Subsurface/Content/randomevents.xml +++ b/Subsurface/Content/randomevents.xml @@ -1,9 +1,10 @@  /// This is called when the game should draw itself. /// - /// elapsed time in seconds protected override void Draw(GameTime gameTime) { - //System.Diagnostics.Debug.WriteLine(deltaTime); - //System.Diagnostics.Debug.WriteLine(gameTime.ElapsedGameTime.TotalSeconds); + renderTimer.Restart(); + double deltaTime = gameTime.ElapsedGameTime.TotalSeconds; frameCounter.Update(deltaTime); - Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); + Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); + + renderTimeElapsed = (int)renderTimer.Elapsed.Ticks; + renderTimer.Stop(); } protected override void OnExiting(object sender, EventArgs args) diff --git a/Subsurface/GameSession/CrewManager.cs b/Subsurface/GameSession/CrewManager.cs index db26f0b5a..47438c8c9 100644 --- a/Subsurface/GameSession/CrewManager.cs +++ b/Subsurface/GameSession/CrewManager.cs @@ -32,7 +32,7 @@ namespace Subsurface guiFrame = new GUIFrame(new Rectangle(0, 50, 150, 450), Color.Transparent); - listBox = new GUIListBox(new Rectangle(0, 0, 150, 400), Color.Transparent, guiFrame); + listBox = new GUIListBox(new Rectangle(0, 0, 150, 0), Color.Transparent, guiFrame); listBox.ScrollBarEnabled = false; listBox.OnSelected = SelectCharacter; diff --git a/Subsurface/GameSession/GameSession.cs b/Subsurface/GameSession/GameSession.cs index ea39eb087..122b53868 100644 --- a/Subsurface/GameSession/GameSession.cs +++ b/Subsurface/GameSession/GameSession.cs @@ -97,6 +97,8 @@ namespace Subsurface public void StartShift(int scriptedEventCount = 1) { + if (crewManager.characterInfos.Count == 0) return; + crewManager.StartShift(); taskManager.StartShift(scriptedEventCount); } diff --git a/Subsurface/GameSession/HireManager.cs b/Subsurface/GameSession/HireManager.cs index 3c3efd658..be669bbea 100644 --- a/Subsurface/GameSession/HireManager.cs +++ b/Subsurface/GameSession/HireManager.cs @@ -20,7 +20,6 @@ namespace Subsurface for (int i = 0 ; i(); - itemPos = ToolBox.GetAttributeVector2(element, "ItemPos", Vector2.Zero); - itemPos = ConvertUnits.ToSimUnits(itemPos); + //itemPos = ToolBox.GetAttributeVector2(element, "ItemPos", Vector2.Zero); + //itemPos = ConvertUnits.ToSimUnits(itemPos); - itemInterval = ToolBox.GetAttributeVector2(element, "ItemInterval", Vector2.Zero); - itemInterval = ConvertUnits.ToSimUnits(itemInterval); + //itemInterval = ToolBox.GetAttributeVector2(element, "ItemInterval", Vector2.Zero); + //itemInterval = ConvertUnits.ToSimUnits(itemInterval); foreach (XElement subElement in element.Elements()) { @@ -106,7 +108,7 @@ namespace Subsurface.Items.Components { if (contained == null) continue; - if (contained.body!=null) contained.body.Enabled = !hideItems; + if (contained.body!=null) contained.body.Enabled = false; RelatedItem ri = containableItems.Find(x => x.MatchesItem(item)); if (ri == null) continue; @@ -120,40 +122,74 @@ namespace Subsurface.Items.Components contained.ApplyStatusEffects(ActionType.OnContained, deltaTime); } - if (hideItems) return; + //if (hideItems) return; + //Vector2 transformedItemPos; + //Vector2 transformedItemInterval = itemInterval; + ////float transformedItemRotation = itemRotation; + //if (item.body==null) + //{ + // transformedItemPos = new Vector2(item.Rect.X, item.Rect.Y); + // transformedItemPos = ConvertUnits.ToSimUnits(transformedItemPos) + itemPos; + //} + //else + //{ + // Matrix transform = Matrix.CreateRotationZ(item.body.Rotation); + + // transformedItemPos = item.body.Position + Vector2.Transform(itemPos, transform); + // transformedItemInterval = Vector2.Transform(transformedItemInterval, transform); + // //transformedItemRotation += item.body.Rotation; + //} + + //foreach (Item containedItem in inventory.items) + //{ + // if (containedItem == null) continue; + + // Vector2 itemDist = (transformedItemPos - containedItem.body.Position); + // Vector2 force = (itemDist - containedItem.body.LinearVelocity * 0.1f) * containedItem.body.Mass * 60.0f; + + // containedItem.body.ApplyForce(force); + + // containedItem.body.SmoothRotate(itemRotation); + + // transformedItemPos += transformedItemInterval; + //} + + + } + + public override void Draw(SpriteBatch spriteBatch) + { + base.Draw(spriteBatch); + + if (hideItems) return; + Vector2 transformedItemPos; Vector2 transformedItemInterval = itemInterval; + float currentRotation = itemRotation; //float transformedItemRotation = itemRotation; - if (item.body==null) + if (item.body == null) { transformedItemPos = new Vector2(item.Rect.X, item.Rect.Y); - transformedItemPos = ConvertUnits.ToSimUnits(transformedItemPos) + itemPos; + transformedItemPos = transformedItemPos + itemPos; } else { Matrix transform = Matrix.CreateRotationZ(item.body.Rotation); - transformedItemPos = Vector2.Transform(item.body.Position + itemPos, transform); - transformedItemInterval = Vector2.Transform(transformedItemInterval, transform); - //transformedItemRotation += item.body.Rotation; + transformedItemPos = ConvertUnits.ToDisplayUnits(item.body.Position) + Vector2.Transform(itemPos, transform); + transformedItemInterval = Vector2.Transform(transformedItemInterval, transform); + currentRotation += item.body.Rotation; } foreach (Item containedItem in inventory.items) { if (containedItem == null) continue; - Vector2 itemDist = (transformedItemPos - containedItem.body.Position); - Vector2 force = (itemDist - containedItem.body.LinearVelocity * 0.1f) * containedItem.body.Mass * 60.0f; - - containedItem.body.ApplyForce(force); - - containedItem.body.SmoothRotate(itemRotation); + containedItem.sprite.Draw(spriteBatch, new Vector2(transformedItemPos.X, -transformedItemPos.Y), -currentRotation, 1.0f); transformedItemPos += transformedItemInterval; } - - } public override void DrawHUD(SpriteBatch spriteBatch, Character character) diff --git a/Subsurface/Items/Components/Door.cs b/Subsurface/Items/Components/Door.cs index a0655ea8d..1bc84e980 100644 --- a/Subsurface/Items/Components/Door.cs +++ b/Subsurface/Items/Components/Door.cs @@ -60,82 +60,30 @@ namespace Subsurface.Items.Components set { isOpen = value; - openState = (isOpen) ? 1.0f : 0.0f; + OpenState = (isOpen) ? 1.0f : 0.0f; } } private Rectangle doorRect; - - + public float OpenState { get { return openState; } set { - if (openState == value) return; + + float prevValue = openState; openState = MathHelper.Clamp(value, 0.0f, 1.0f); + if (openState == prevValue) return; - - - if (window==null) - { - Rectangle rect = item.Rect; - rect.Height = (int)(rect.Height * (1.0f - openState)); - - } - else - { - //Rectangle rect = item.Rect; - //rect.Height = (int)(rect.Height * (1.0f - openState)); - - Rectangle rect1 = doorRect; - rect1.Height = -window.Y; - - rect1.Y += (int)(doorRect.Height * openState); - rect1.Height = Math.Max(rect1.Height - (rect1.Y - doorRect.Y), 0); - rect1.Y = Math.Min(doorRect.Y, rect1.Y); - - if (rect1.Height == 0) - { - convexHull.Enabled = false; - } - else - { - convexHull.SetVertices(GetConvexHullCorners(rect1)); - } - - if (convexHull2 != null) - { - Rectangle rect2 = doorRect; - rect2.Y = rect2.Y + window.Y - window.Height; - - rect2.Y += (int)(doorRect.Height * openState); - rect2.Y = Math.Min(doorRect.Y, rect2.Y); - rect2.Height = rect2.Y - (doorRect.Y - (int)(doorRect.Height * (1.0f - openState))); - convexHull2.SetVertices(GetConvexHullCorners(rect2)); - - if (rect2.Height == 0) - { - convexHull2.Enabled = false; - } - else - { - convexHull2.SetVertices(GetConvexHullCorners(rect2)); - } - } - - - - - } - + UpdateConvexHulls(); } } PhysicsBody body; Sprite doorSprite; - + public Door(Item item, XElement element) : base(item, element) { @@ -160,7 +108,9 @@ namespace Subsurface.Items.Components ConvertUnits.ToSimUnits(Math.Max(doorRect.Width, 1)), ConvertUnits.ToSimUnits(Math.Max(doorRect.Height, 1)), 1.5f)); - + + body.CollisionCategories = Physics.CollisionWall; + body.UserData = item; body.BodyType = BodyType.Static; body.SetTransform( ConvertUnits.ToSimUnits(new Vector2(doorRect.Center.X, doorRect.Y - doorRect.Height / 2)), @@ -169,21 +119,69 @@ namespace Subsurface.Items.Components //string spritePath = Path.GetDirectoryName(item.Prefab.ConfigFile) + "\\"+ ToolBox.GetAttributeString(element, "sprite", ""); - - - - isActive = true; - - + Vector2[] corners = GetConvexHullCorners(doorRect); convexHull = new ConvexHull(corners, Color.Black); - if (window!=null) convexHull2 = new ConvexHull(corners, Color.Black); + if (window!=null && window!=Rectangle.Empty) convexHull2 = new ConvexHull(corners, Color.Black); - OpenState = openState; - //powerConsumption = -100.0f; + UpdateConvexHulls(); - //LinkedGap.Open = openState; + isActive = true; + } + + private void UpdateConvexHulls() + { + Rectangle rect = doorRect; + + rect.Height = (int)(rect.Height * (1.0f - openState)); + if (window.Height == 0 || window.Width == 0) + { + + } + else + { + //Rectangle rect = item.Rect; + //rect.Height = (int)(rect.Height * (1.0f - openState)); + + rect.Height = -window.Y; + + rect.Y += (int)(doorRect.Height * openState); + rect.Height = Math.Max(rect.Height - (rect.Y - doorRect.Y), 0); + rect.Y = Math.Min(doorRect.Y, rect.Y); + + + if (convexHull2 != null) + { + Rectangle rect2 = doorRect; + rect2.Y = rect2.Y + window.Y - window.Height; + + rect2.Y += (int)(doorRect.Height * openState); + rect2.Y = Math.Min(doorRect.Y, rect2.Y); + rect2.Height = rect2.Y - (doorRect.Y - (int)(doorRect.Height * (1.0f - openState))); + //convexHull2.SetVertices(GetConvexHullCorners(rect2)); + + if (rect2.Height == 0) + { + convexHull2.Enabled = false; + } + else + { + convexHull2.Enabled = true; + convexHull2.SetVertices(GetConvexHullCorners(rect2)); + } + } + } + + if (rect.Height == 0) + { + convexHull.Enabled = false; + } + else + { + convexHull.Enabled = true; + convexHull.SetVertices(GetConvexHullCorners(rect)); + } } private Vector2[] GetConvexHullCorners(Rectangle rect) @@ -212,7 +210,6 @@ namespace Subsurface.Items.Components public override bool Pick(Character picker) { - isActive = true; isOpen = !isOpen; return true; @@ -222,22 +219,30 @@ namespace Subsurface.Items.Components { OpenState += deltaTime * ((isOpen) ? 3.0f : -3.0f); + LinkedGap.Open = openState; + item.SendSignal((isOpen) ? "1" : "0", "state_out"); } + + public override void UpdateBroken(float deltaTime, Camera cam) + { + body.Enabled = false; + convexHull.Enabled = false; + linkedGap.Open = 1.0f; + if (convexHull2 != null) convexHull2.Enabled = false; + } public override void Draw(SpriteBatch spriteBatch) { - - LinkedGap.Open = openState; - Color color = (item.IsSelected) ? Color.Green : Color.White; + color = color * (item.Condition / 100.0f); + color.A = 255; //prefab.sprite.Draw(spriteBatch, new Vector2(rect.X, -rect.Y), new Vector2(rect.Width, rect.Height), color); if (openState == 1.0f) { body.Enabled = false; - convexHull.Enabled = false; } else { @@ -246,8 +251,6 @@ namespace Subsurface.Items.Components (int)doorSprite.size.X, (int)(doorSprite.size.Y * (1.0f - openState))), color, 0.0f, doorSprite.Origin, 1.0f, SpriteEffects.None, doorSprite.Depth); - convexHull.Enabled = true; - if (openState == 0.0f) { body.Enabled = true; @@ -290,7 +293,6 @@ namespace Subsurface.Items.Components public override void ReceiveSignal(string signal, Connection connection, Item sender) { - isActive = true; if (connection.name=="toggle") { isOpen = !isOpen; diff --git a/Subsurface/Items/Components/ItemComponent.cs b/Subsurface/Items/Components/ItemComponent.cs index 9e47da6f6..9e04d3bc2 100644 --- a/Subsurface/Items/Components/ItemComponent.cs +++ b/Subsurface/Items/Components/ItemComponent.cs @@ -176,54 +176,26 @@ namespace Subsurface } } - //public List GetProperties() - //{ - // List editableProperties = new List(); - - // foreach (var property in properties.Values) - // { - // if (property.Attributes.OfType().Count() > 0) editableProperties.Add(property); - // } - - // return editableProperties; - //} - - - private int loopingSoundIndex; - - public void PlaySound(ActionType type, float volume, Vector2 position, bool loop=false) { - - if (!loop) - { - List matchingSounds = sounds.FindAll(x=> x.type == type); - - if (matchingSounds.Count == 0 || item.Prefab.sounds.Count == 0) return; - - int index = Game1.localRandom.Next(Math.Min(matchingSounds.Count,item.Prefab.sounds.Count)); + if (loop && Sounds.SoundManager.IsPlaying(loopingSoundIndex)) return; - Sound sound = item.Prefab.sounds[matchingSounds[index].index]; + List matchingSounds = sounds.FindAll(x => x.type == type); + if (matchingSounds.Count == 0 || item.Prefab.sounds.Count == 0) return; - sound.Play(volume, matchingSounds[index].range, position); + int index = Game1.localRandom.Next(Math.Min(matchingSounds.Count, item.Prefab.sounds.Count)); + + Sound sound = item.Prefab.sounds[matchingSounds[index].index]; + + if (loop) + { + loopingSoundIndex = sound.Loop(loopingSoundIndex, volume, position, matchingSounds[index].range); } else { - //todo: get rid of copypaste - if (!Sounds.SoundManager.IsPlaying(loopingSoundIndex)) - { - List matchingSounds = sounds.FindAll(x => x.type == type); - - if (matchingSounds.Count == 0 || item.Prefab.sounds.Count == 0) return; - - int index = Game1.localRandom.Next(Math.Min(matchingSounds.Count, item.Prefab.sounds.Count)); - - Sound sound = item.Prefab.sounds[matchingSounds[index].index]; - - loopingSoundIndex = sound.Loop(loopingSoundIndex, volume, position, matchingSounds[index].range); - } - } + sound.Play(volume, matchingSounds[index].range, position); + } } public virtual void Move(Vector2 amount) { } diff --git a/Subsurface/Items/Components/MiniMap.cs b/Subsurface/Items/Components/MiniMap.cs index 90cf3c72f..aa41886c1 100644 --- a/Subsurface/Items/Components/MiniMap.cs +++ b/Subsurface/Items/Components/MiniMap.cs @@ -25,7 +25,7 @@ namespace Subsurface.Items.Components { if (picker == null) return false; - picker.SelectedConstruction = item; + //picker.SelectedConstruction = item; return true; } diff --git a/Subsurface/Items/Components/PowerContainer.cs b/Subsurface/Items/Components/PowerContainer.cs index 61083fa12..501c43b0e 100644 --- a/Subsurface/Items/Components/PowerContainer.cs +++ b/Subsurface/Items/Components/PowerContainer.cs @@ -30,6 +30,7 @@ namespace Subsurface.Items.Components [Editable, HasDefaultValue(10.0f, true)] public float MaxOutPut { + set { maxOutput = value; } get { return maxOutput; } } @@ -42,21 +43,24 @@ namespace Subsurface.Items.Components [HasDefaultValue(10.0f, false)] - private float Capacity + public float Capacity { + get { return capacity; } set { capacity = Math.Max(value,1.0f); } } - [HasDefaultValue(10.0f, false)] - private float MaxInput - { - set { MaxInput = value; } - } + //[HasDefaultValue(10.0f, false)] + //public float MaxInput + //{ + // get { return maxInput; } + // set { maxInput = value; } + //} [HasDefaultValue(10.0f, false)] - private float MaxOutput + public float MaxRechargeSpeed { - set { maxOutput = value; } + get { return maxRechargeSpeed; } + set { maxRechargeSpeed = Math.Max(value, 1.0f); } } public PowerContainer(Item item, XElement element) @@ -65,9 +69,7 @@ namespace Subsurface.Items.Components //capacity = ToolBox.GetAttributeFloat(element, "capacity", 10.0f); //maxRechargeSpeed = ToolBox.GetAttributeFloat(element, "maxinput", 10.0f); //maxOutput = ToolBox.GetAttributeFloat(element, "maxoutput", 10.0f); - - rechargeSpeed = maxRechargeSpeed; - + isActive = true; } @@ -129,7 +131,7 @@ namespace Subsurface.Items.Components return; } - currPowerConsumption = MathHelper.Lerp(currPowerConsumption, rechargeSpeed, 0.05f); + currPowerConsumption = MathHelper.Lerp(currPowerConsumption, maxRechargeSpeed*rechargeSpeed, 0.05f); charge += currPowerConsumption*voltage / 3600.0f; } //provide power to the grid @@ -142,10 +144,10 @@ namespace Subsurface.Items.Components return; } - currPowerConsumption = MathHelper.Lerp( - currPowerConsumption, - -maxOutput * chargeRate, - 0.1f); + //currPowerConsumption = MathHelper.Lerp( + // currPowerConsumption, + // -maxOutput * chargeRate, + // 0.1f); currPowerConsumption = MathHelper.Lerp( currPowerConsumption, diff --git a/Subsurface/Items/Components/PowerTransfer.cs b/Subsurface/Items/Components/PowerTransfer.cs index 47144a969..d13d1b09e 100644 --- a/Subsurface/Items/Components/PowerTransfer.cs +++ b/Subsurface/Items/Components/PowerTransfer.cs @@ -49,9 +49,11 @@ namespace Subsurface.Items.Components pt.powerLoad += (fullLoad - pt.powerLoad) / inertia; pt.currPowerConsumption += (-fullPower - pt.currPowerConsumption) / inertia; pt.Item.SendSignal((fullPower / Math.Max(fullLoad,1.0f)).ToString(), "power_out"); + } else { + //p.Power = fullPower; } } @@ -103,15 +105,15 @@ namespace Subsurface.Items.Components { connectedList.Add(powered); //positive power consumption = the construction requires power -> increase load - if (powered.PowerConsumption > 0.0f) + if (powered.CurrPowerConsumption > 0.0f) { - fullLoad += powered.PowerConsumption; + fullLoad += powered.CurrPowerConsumption; } - else if (powered.PowerConsumption < 0.0f) + else if (powered.CurrPowerConsumption < 0.0f) //negative power consumption = the construction is a //generator/battery or another junction box { - fullPower -= powered.PowerConsumption; + fullPower -= powered.CurrPowerConsumption; } } } diff --git a/Subsurface/Items/Components/Projectile.cs b/Subsurface/Items/Components/Projectile.cs index 6bd2ee72f..a2ae82958 100644 --- a/Subsurface/Items/Components/Projectile.cs +++ b/Subsurface/Items/Components/Projectile.cs @@ -155,38 +155,42 @@ namespace Subsurface.Items.Components //f2.Body.ApplyLinearImpulse(force); //f1.Body.ApplyLinearImpulse(-f1.Body.LinearVelocity * f1.Body.Mass); - float damage = f1.Body.LinearVelocity.Length(); + //float damage = f1.Body.LinearVelocity.Length(); - Limb limb; - Structure structure; - if ((limb = (f2.Body.UserData as Limb)) != null) + if (attack!=null) { - attack.DoDamage(limb.character, item.SimPosition, 0.0f); - //limb.Damage += damage; - //limb.Bleeding += bleedingDamage; + Limb limb; + Structure structure; + if ((limb = (f2.Body.UserData as Limb)) != null) + { + attack.DoDamage(limb.character, item.SimPosition, 0.0f); + //limb.Damage += damage; + //limb.Bleeding += bleedingDamage; - //if (bleedingDamage>0.0f) - //{ - // for (int i = 0; i < 5; i++ ) - // { - // Game1.particleManager.CreateParticle(limb.SimPosition, - // ToolBox.VectorToAngle(-f1.Body.LinearVelocity*0.5f) + ToolBox.RandomFloat(-0.5f, 0.5f), - // ToolBox.RandomFloat(1.0f, 3.0f), "blood"); - // } + //if (bleedingDamage>0.0f) + //{ + // for (int i = 0; i < 5; i++ ) + // { + // Game1.particleManager.CreateParticle(limb.SimPosition, + // ToolBox.VectorToAngle(-f1.Body.LinearVelocity*0.5f) + ToolBox.RandomFloat(-0.5f, 0.5f), + // ToolBox.RandomFloat(1.0f, 3.0f), "blood"); + // } - // Game1.particleManager.CreateParticle(limb.SimPosition, - // 0.0f, - // Vector2.Zero, "waterblood"); - //} + // Game1.particleManager.CreateParticle(limb.SimPosition, + // 0.0f, + // Vector2.Zero, "waterblood"); + //} - //AmbientSoundManager.PlayDamageSound(DamageType.LimbBlunt, damage, limb.body.FarseerBody); + //AmbientSoundManager.PlayDamageSound(DamageType.LimbBlunt, damage, limb.body.FarseerBody); + } + else if ((structure = (f2.Body.UserData as Structure)) != null) + { + attack.DoDamage(structure, item.SimPosition, 0.0f); + + //AmbientSoundManager.PlayDamageSound(DamageType.StructureBlunt, damage, f2.Body); + } } - else if ((structure = (f2.Body.UserData as Structure)) != null) - { - attack.DoDamage(structure, item.SimPosition, 0.0f); - //AmbientSoundManager.PlayDamageSound(DamageType.StructureBlunt, damage, f2.Body); - } item.body.FarseerBody.OnCollision -= OnProjectileCollision; diff --git a/Subsurface/Items/Components/Pump.cs b/Subsurface/Items/Components/Pump.cs index 6ffffd386..7530aa8b8 100644 --- a/Subsurface/Items/Components/Pump.cs +++ b/Subsurface/Items/Components/Pump.cs @@ -18,8 +18,9 @@ namespace Subsurface.Items.Components Hull hull1, hull2; [HasDefaultValue(100.0f, false)] - private float MaxFlow - { + public float MaxFlow + { + get { return maxFlow; } set { maxFlow = value; } } @@ -41,14 +42,14 @@ namespace Subsurface.Items.Components if (voltage < minVoltage) return; if (hull2 == null && hull1 == null) return; + + float powerFactor = (currPowerConsumption==0.0f) ? 1.0f : voltage; + flow = maxFlow * powerFactor; float deltaVolume = flow * ((flowIn) ? 1.0f : -1.0f); hull1.Volume += deltaVolume; if (hull2 != null) hull2.Volume -= deltaVolume; - float powerFactor = (currPowerConsumption==0.0f) ? 1.0f : voltage; - flow = maxFlow * powerFactor; - voltage = 0.0f; } diff --git a/Subsurface/Items/Components/Reactor.cs b/Subsurface/Items/Components/Reactor.cs index 158c5e0c2..b6c9bbb1b 100644 --- a/Subsurface/Items/Components/Reactor.cs +++ b/Subsurface/Items/Components/Reactor.cs @@ -126,9 +126,10 @@ namespace Subsurface.Items.Components if (powerUpTask==null || powerUpTask.IsFinished) { powerUpTask = new PropertyTask(Game1.gameSession.taskManager, item, IsRunning, 20.0f, "Power up the reactor"); - } + } } + item.Condition -= temperature*deltaTime*0.00005f; if (temperature > shutDownTemp) @@ -157,7 +158,7 @@ namespace Subsurface.Items.Components FissionRate = Math.Max(fissionRate, heat / 200.0f); //the power generated by the reactor is equal to the temperature - currPowerConsumption = -temperature; + currPowerConsumption = -temperature*powerPerTemp; if (item.currentHull != null) { diff --git a/Subsurface/Items/Components/Rope.cs b/Subsurface/Items/Components/Rope.cs index 561dbbdf4..dc9300bc9 100644 --- a/Subsurface/Items/Components/Rope.cs +++ b/Subsurface/Items/Components/Rope.cs @@ -140,7 +140,7 @@ namespace Subsurface.Items.Components } else { - gunJoint.Length = Math.Max(gunJoint.Length-0.003f,0.01f); + gunJoint.Length = Math.Max(gunJoint.Length-0.01f,0.01f); gunJoint.Frequency = 30; gunJoint.DampingRatio = 0.05f; //gunJoint.MotorEnabled = true; diff --git a/Subsurface/Items/Components/Signal/ConnectionPanel.cs b/Subsurface/Items/Components/Signal/ConnectionPanel.cs index 1724371b9..f9361442e 100644 --- a/Subsurface/Items/Components/Signal/ConnectionPanel.cs +++ b/Subsurface/Items/Components/Signal/ConnectionPanel.cs @@ -1,4 +1,6 @@ -using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -32,7 +34,12 @@ namespace Subsurface.Items.Components } } - public override void DrawHUD(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Character character) + public override void Move(Vector2 amount) + { + base.Move(amount); + } + + public override void DrawHUD(SpriteBatch spriteBatch, Character character) { if (user!=character) return; Connection.DrawConnections(spriteBatch, this, character); @@ -44,8 +51,6 @@ namespace Subsurface.Items.Components foreach (Connection c in connections) { - //XElement newElement = new XElement(c.isOutput ? "output" : "input", new XAttribute("name", c.name)); - c.Save(componentElement); } diff --git a/Subsurface/Items/Components/Signal/Wire.cs b/Subsurface/Items/Components/Signal/Wire.cs index 7ec9fb32a..9a651221a 100644 --- a/Subsurface/Items/Components/Signal/Wire.cs +++ b/Subsurface/Items/Components/Signal/Wire.cs @@ -11,20 +11,23 @@ namespace Subsurface.Items.Components { class Wire : ItemComponent { - const float nodeDistance = 128.0f; + const float nodeDistance = 32.0f; + const float heightFromFloor = 128.0f; static Sprite wireSprite; List nodes; - + Connection[] connections; + private Vector2 newNodePos; + public Wire(Item item, XElement element) : base(item, element) { - if (wireSprite==null) + if (wireSprite == null) { - wireSprite = new Sprite("Content/Items/wireHorizontal.png",new Vector2(0.5f,0.5f)); + wireSprite = new Sprite("Content/Items/wireHorizontal.png", new Vector2(0.5f, 0.5f)); wireSprite.Depth = 0.85f; } @@ -35,9 +38,9 @@ namespace Subsurface.Items.Components public Connection OtherConnection(Connection connection) { - if (connection==null) return null; - if (connection==connections[0]) return connections[1]; - if (connection==connections[1]) return connections[0]; + if (connection == null) return null; + if (connection == connections[0]) return connections[1]; + if (connection == connections[1]) return connections[0]; return null; } @@ -49,7 +52,7 @@ namespace Subsurface.Items.Components } public void Connect(Connection newConnection, bool addNode = true) - { + { for (int i = 0; i < 2; i++) { if (connections[i] == newConnection) return; @@ -62,8 +65,8 @@ namespace Subsurface.Items.Components connections[i] = newConnection; if (!addNode) break; - - if (i==0) + + if (i == 0) { nodes.Insert(0, newConnection.Item.Position); } @@ -71,16 +74,18 @@ namespace Subsurface.Items.Components { nodes.Add(newConnection.Item.Position); } - + break; } - if (connections[0]!=null && connections[1]!=null) + if (connections[0] != null && connections[1] != null) { item.Drop(null, false); item.body.Enabled = false; + isActive = false; + CleanNodes(); } @@ -98,61 +103,80 @@ namespace Subsurface.Items.Components public override void Unequip(Character character) { ClearConnections(); + + isActive = false; } public override void Update(float deltaTime, Camera cam) { if (nodes.Count == 0) return; - if (Math.Abs(item.Position.X-nodes[nodes.Count-1].X)>nodeDistance) - { - nodes.Add(new Vector2( - ToolBox.Round(item.Position.X, Map.gridSize.X), - nodes[nodes.Count - 1].Y)); + item.FindHull(); - item.NewComponentEvent(this, true); - } - else if (Math.Abs(item.Position.Y-nodes[nodes.Count-1].Y)>nodeDistance) + Vector2 position = item.Position; + position.X = ToolBox.Round(item.Position.X, nodeDistance); + if (item.currentHull == null) { - nodes.Add(new Vector2(nodes[nodes.Count - 1].X, - ToolBox.Round(item.Position.Y, Map.gridSize.Y))); - - item.NewComponentEvent(this, true); + position.Y = ToolBox.Round(item.Position.Y, nodeDistance); } + else + { + position.Y -= item.currentHull.Rect.Y - item.currentHull.Rect.Height; + position.Y = Math.Max(ToolBox.Round(position.Y, nodeDistance), heightFromFloor); + position.Y += item.currentHull.Rect.Y - item.currentHull.Rect.Height; + } + + newNodePos = position; + + //if (Vector2.Distance(position, nodes[nodes.Count - 1]) > nodeDistance*10) + //{ + // nodes.Add(position); + + // item.NewComponentEvent(this, true); + //} + //else if (Math.Abs(position.Y - nodes[nodes.Count - 1].Y) > nodeDistance) + //{ + // nodes.Add(new Vector2(nodes[nodes.Count - 1].X, + // position.Y)); + + // item.NewComponentEvent(this, true); + //} } - //public override bool Use(Character character = null) - //{ - // Vector2 nodePos = item.Position; - // ToolBox.Round(nodePos.X, Map.gridSize.X); - // ToolBox.Round(nodePos.Y, Map.gridSize.Y); + public override bool Use(Character character = null) + { + if (newNodePos!= Vector2.Zero && nodes.Count>0 && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance) + { + nodes.Add(newNodePos); + newNodePos = Vector2.Zero; + } - // nodes.Add(nodePos); - // return true; - //} + + return true; + } public override void SecondaryUse(Character character = null) { - if (nodes.Count > 0) + if (nodes.Count > 1) { nodes.RemoveAt(nodes.Count - 1); item.NewComponentEvent(this, true); } } - + public override bool Pick(Character picker) { ClearConnections(); return true; } - + private void ClearConnections() { nodes.Clear(); - for (int i = 0; i < 2; i++ ) + for (int i = 0; i < 2; i++) { if (connections[i] == null) continue; int wireIndex = connections[i].FindWireIndex(item); @@ -168,8 +192,8 @@ namespace Subsurface.Items.Components { 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])) { @@ -199,29 +223,38 @@ namespace Subsurface.Items.Components public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) { + 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 nodeDistance) + { + DrawSection(spriteBatch, nodes[nodes.Count - 1], newNodePos, nodes.Count, Color.White * 0.5f); + //nodes.Add(newNodePos); + } + } - private void DrawSection(SpriteBatch spriteBatch, Vector2 start, Vector2 end, int i) + private void DrawSection(SpriteBatch spriteBatch, Vector2 start, Vector2 end, int i, Color color) { start.Y = -start.Y; end.Y = -end.Y; - + spriteBatch.Draw(wireSprite.Texture, - start, null, Color.White, + start, null, color, ToolBox.VectorToAngle(end - start), new Vector2(0.0f, wireSprite.size.Y / 2.0f), new Vector2((Vector2.Distance(start, end)) / wireSprite.Texture.Width, 0.3f), SpriteEffects.None, - wireSprite.Depth +0.1f + i * 0.00001f); + wireSprite.Depth + 0.1f + i * 0.00001f); } public override XElement Save(XElement parentElement) @@ -230,7 +263,7 @@ namespace Subsurface.Items.Components if (nodes == null || nodes.Count == 0) return componentElement; - string[] nodeCoords = new string[nodes.Count()*2]; + string[] nodeCoords = new string[nodes.Count() * 2]; for (int i = 0; i < nodes.Count(); i++) { nodeCoords[i * 2] = nodes[i].X.ToString(CultureInfo.InvariantCulture); @@ -250,7 +283,7 @@ namespace Subsurface.Items.Components if (nodeString == "") return; string[] nodeCoords = nodeString.Split(';'); - for (int i = 0; i h.Rect.X && rect.X + rect.Width < h.Rect.X+h.Rect.Width && rect.Y < h.Rect.Y && rect.Y - rect.Height > h.Rect.Y - h.Rect.Height) continue; - - if (hull1 == null) + + for (int i = 0; i < 2; i++ ) { - hull1 = h; - } - else - { - hull2 = h; + if (hulls[i] != null) continue; + hulls[i] = h; break; } + + if (hulls[1] != null) break; } - if (hull1 == null && hull2 == null) return; + if (hulls[0] == null && hulls[1] == null) return; - if (hull1 != null && hull2 != null) + if (hulls[0]!=null && hulls[1]!=null) { - if (isHorizontal) + if ((isHorizontal && hulls[0].Rect.X > hulls[1].Rect.X) || (!isHorizontal && hulls[0].Rect.Y < hulls[1].Rect.Y)) { - //make sure that water1 is the lefthand room - //or that water2 is null if the gap doesn't lead to another room - if (hull1.Rect.X < hull2.Rect.X) - { - linkedTo.Add(hull1); - linkedTo.Add(hull2); - } - else - { - linkedTo.Add(hull2); - linkedTo.Add(hull1); - } - } - else - { - //make sure that water1 is the room on the top - //or that water2 is null if the gap doesn't lead to another room - if (hull1.Rect.Y > hull2.Rect.Y) - { - linkedTo.Add(hull1); - linkedTo.Add(hull2); - } - else - { - linkedTo.Add(hull2); - linkedTo.Add(hull1); - } + //make sure that hull1 is the lefthand room if the gap is horizontal, + //or that hull1 is the upper hull if the gap is vertical + + Hull temp = hulls[0]; + hulls[0] = hulls[1]; + hulls[1] = temp; + } } - else - { - linkedTo.Add(hull1); - } + + linkedTo.Add(hulls[0]); + if (hulls[1] != null) linkedTo.Add(hulls[1]); + + //if (hull1 != null && hull2 != null) + //{ + // if (isHorizontal) + // { + // //make sure that water1 is the lefthand room + // //or that water2 is null if the gap doesn't lead to another room + // if (hull1.Rect.X < hull2.Rect.X) + // { + // linkedTo.Add(hull1); + // linkedTo.Add(hull2); + // } + // else + // { + // linkedTo.Add(hull2); + // linkedTo.Add(hull1); + // } + // } + // else + // { + // //make sure that water1 is the room on the top + // //or that water2 is null if the gap doesn't lead to another room + // if (hull1.Rect.Y > hull2.Rect.Y) + // { + // linkedTo.Add(hull1); + // linkedTo.Add(hull2); + // } + // else + // { + // linkedTo.Add(hull2); + // linkedTo.Add(hull1); + // } + // } + //} + //else + //{ + // linkedTo.Add(hull1); + //} } public override void Draw(SpriteBatch sb, bool editing) @@ -244,22 +260,25 @@ namespace Subsurface { pos.Y = ConvertUnits.ToSimUnits(MathHelper.Clamp(lowerSurface, rect.Y-rect.Height, rect.Y)); - Game1.particleManager.CreateParticle(new Vector2(pos.X, pos.Y - ToolBox.RandomFloat(0.0f, 0.1f)), - 0.0f, new Vector2(flowForce.X * ToolBox.RandomFloat(0.005f, 0.007f), flowForce.Y * ToolBox.RandomFloat(0.005f, 0.007f)), "watersplash"); + Game1.particleManager.CreateParticle("watersplash", + new Vector2(pos.X, pos.Y - ToolBox.RandomFloat(0.0f, 0.1f)), + new Vector2(flowForce.X * ToolBox.RandomFloat(0.005f, 0.007f), flowForce.Y * ToolBox.RandomFloat(0.005f, 0.007f))); pos.Y = ConvertUnits.ToSimUnits(ToolBox.RandomFloat(lowerSurface, rect.Y - rect.Height)); - Game1.particleManager.CreateParticle(pos, 0.0f, flowForce / 200.0f, "bubbles"); + Game1.particleManager.CreateParticle("bubbles", pos, flowForce / 200.0f); } else { pos.Y += Math.Sign(flowForce.Y) * ConvertUnits.ToSimUnits(rect.Height / 2.0f); - for (int i = 0; i < rect.Width; i += (int)ToolBox.RandomFloat(20, 50)) + for (int i = 0; i < rect.Width; i += (int)ToolBox.RandomFloat(80, 100)) { pos.X = ConvertUnits.ToSimUnits(ToolBox.RandomFloat(rect.X, rect.X+rect.Width)); - Game1.particleManager.CreateParticle(pos, - 0.0f, new Vector2(flowForce.X * ToolBox.RandomFloat(0.005f, 0.008f), flowForce.Y * ToolBox.RandomFloat(0.005f, 0.008f)), "watersplash"); + Subsurface.Particles.Particle splash = Game1.particleManager.CreateParticle("watersplash", pos, + new Vector2(flowForce.X * ToolBox.RandomFloat(0.005f, 0.008f), flowForce.Y * ToolBox.RandomFloat(0.005f, 0.008f))); - Game1.particleManager.CreateParticle(pos, ToolBox.VectorToAngle(flowForce), flowForce / 200.0f, "bubbles"); + if (splash!=null) splash.Size = splash.Size * MathHelper.Clamp(rect.Width / 50.0f, 0.8f, 4.0f); + + Game1.particleManager.CreateParticle("bubbles", pos, flowForce / 200.0f); } } diff --git a/Subsurface/Map/Hull.cs b/Subsurface/Map/Hull.cs index f49def308..8bd72fe13 100644 --- a/Subsurface/Map/Hull.cs +++ b/Subsurface/Map/Hull.cs @@ -212,8 +212,9 @@ namespace Subsurface float maxDelta = Math.Max(Math.Abs(rightDelta[i]), Math.Abs(leftDelta[i])); if (maxDelta > ToolBox.RandomFloat(0.2f,10.0f)) { - Game1.particleManager.CreateParticle(ConvertUnits.ToSimUnits(new Vector2(rect.X + WaveWidth * i,surface + waveY[i])), - ToolBox.RandomFloat(0.0f,6.2f), new Vector2(0.0f, -0.5f), "mist"); + Game1.particleManager.CreateParticle("mist", + ConvertUnits.ToSimUnits(new Vector2(rect.X + WaveWidth * i,surface + waveY[i])), + new Vector2(0.0f, -0.5f)); } waveY[i] = waveY[i] + waveVel[i]; diff --git a/Subsurface/Map/IDamageable.cs b/Subsurface/Map/IDamageable.cs index 3537b69da..3b98c3abc 100644 --- a/Subsurface/Map/IDamageable.cs +++ b/Subsurface/Map/IDamageable.cs @@ -4,17 +4,16 @@ namespace Subsurface { interface IDamageable { - //float Damage - //{ - // get; - // set; - //} - Vector2 SimPosition { get; } + float Health + { + get; + } + void AddDamage(Vector2 position, float amount, float bleedingAmount, float stun); } } diff --git a/Subsurface/Map/Map.cs b/Subsurface/Map/Map.cs index e93d22697..b471e873e 100644 --- a/Subsurface/Map/Map.cs +++ b/Subsurface/Map/Map.cs @@ -116,10 +116,19 @@ namespace Subsurface && pos.Y < rect.Y && pos.Y > rect.Y - rect.Height); } - public static bool RectsOverlap(Rectangle rect1, Rectangle rect2) + public static bool RectsOverlap(Rectangle rect1, Rectangle rect2, bool inclusive=true) { - return !(rect1.X > rect2.X + rect2.Width || rect1.X + rect1.Width < rect2.X || - rect1.Y < rect2.Y - rect2.Height || rect1.Y - rect1.Height > rect2.Y); + if (inclusive) + { + return !(rect1.X > rect2.X + rect2.Width || rect1.X + rect1.Width < rect2.X || + rect1.Y < rect2.Y - rect2.Height || rect1.Y - rect1.Height > rect2.Y); + } + else + { + return !(rect1.X >= rect2.X + rect2.Width || rect1.X + rect1.Width <= rect2.X || + rect1.Y <= rect2.Y - rect2.Height || rect1.Y - rect1.Height >= rect2.Y); + } + } public static Body PickBody(Vector2 rayStart, Vector2 rayEnd, List ignoredBodies = null) @@ -149,9 +158,9 @@ namespace Subsurface } - public static Structure CheckVisibility(Vector2 rayStart, Vector2 rayEnd) + public static Body CheckVisibility(Vector2 rayStart, Vector2 rayEnd) { - Structure closestStructure = null; + Body closestBody = null; float closestFraction = 1.0f; if (Vector2.Distance(rayStart,rayEnd)<0.01f) @@ -174,7 +183,7 @@ namespace Subsurface if (fraction < closestFraction) { - if (structure != null) closestStructure = structure; + closestBody = fixture.Body; closestFraction = fraction; } return closestFraction; @@ -184,7 +193,7 @@ namespace Subsurface lastPickedPosition = rayStart + (rayEnd - rayStart) * closestFraction; lastPickedFraction = closestFraction; - return closestStructure; + return closestBody; } public static Body PickBody(Vector2 point) @@ -284,8 +293,17 @@ namespace Subsurface Clear(); filePath = file; XDocument doc = null; + string extension = ""; - string extension = Path.GetExtension(file); + try + { + extension = Path.GetExtension(file); + } + catch + { + DebugConsole.ThrowError("Couldn't load map ''" + file + "! (Unrecognized file extension)"); + return; + } if (extension==".gz") { diff --git a/Subsurface/Map/Structure.cs b/Subsurface/Map/Structure.cs index b6ff4a620..e56375816 100644 --- a/Subsurface/Map/Structure.cs +++ b/Subsurface/Map/Structure.cs @@ -88,6 +88,11 @@ namespace Subsurface get { return sections.Length; } } + public float Health + { + get { return prefab.MaxHealth; } + } + public override void Move(Vector2 amount) { @@ -380,7 +385,7 @@ namespace Subsurface int i = FindSectionIndex(ConvertUnits.ToDisplayUnits(position)); if (i == -1) return; - Game1.particleManager.CreateParticle(ConvertUnits.ToSimUnits(SectionPosition(i)), 0.0f, 0.0f, "dustcloud"); + Game1.particleManager.CreateParticle("dustcloud", ConvertUnits.ToSimUnits(SectionPosition(i)), 0.0f, 0.0f); AddDamage(i, amount); diff --git a/Subsurface/Particles/Particle.cs b/Subsurface/Particles/Particle.cs index d19a441eb..cc17f32e7 100644 --- a/Subsurface/Particles/Particle.cs +++ b/Subsurface/Particles/Particle.cs @@ -31,12 +31,18 @@ namespace Subsurface.Particles private Vector2 drawPosition; private float checkCollisionTimer; - + public bool InWater { get { return prefab.inWater; } } + public Vector2 yLimits + { + get; + set; + } + public Vector2 Size { get { return size; } @@ -49,7 +55,7 @@ namespace Subsurface.Particles set { velocityChange = value; } } - public void Init(Vector2 position, float rotation, Vector2 speed, ParticlePrefab prefab) + public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation) { this.prefab = prefab; @@ -73,13 +79,13 @@ namespace Subsurface.Particles rand = (float)Game1.localRandom.NextDouble(); sizeChange = prefab.sizeChangeMin + (prefab.sizeChangeMax - prefab.sizeChangeMin) * rand; - + + yLimits = Vector2.Zero; color = prefab.startColor; alpha = prefab.startAlpha; - velocityChange = prefab.velocityChange; - + velocityChange = prefab.velocityChange; } public bool Update(float deltaTime) @@ -110,6 +116,14 @@ namespace Subsurface.Particles color.G / 255.0f + prefab.colorChange.Y * deltaTime, color.B / 255.0f + prefab.colorChange.Z * deltaTime); + if (yLimits!=Vector2.Zero) + { + if (position.Y>yLimits.X || position.Y 0.0f) diff --git a/Subsurface/Particles/ParticleManager.cs b/Subsurface/Particles/ParticleManager.cs index 24f9f990e..ad65a31c0 100644 --- a/Subsurface/Particles/ParticleManager.cs +++ b/Subsurface/Particles/ParticleManager.cs @@ -40,12 +40,12 @@ namespace Subsurface.Particles } } - public Particle CreateParticle(Vector2 position, float angle, float speed, string prefabName) + public Particle CreateParticle(string prefabName, Vector2 position, float angle, float speed) { - return CreateParticle(position, angle, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)) * speed, prefabName); + return CreateParticle(prefabName, position, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)) * speed, angle); } - public Particle CreateParticle(Vector2 position, float rotation, Vector2 speed, string prefabName) + public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f) { ParticlePrefab prefab; prefabs.TryGetValue(prefabName, out prefab); @@ -56,17 +56,17 @@ namespace Subsurface.Particles return null; } - return CreateParticle(position, rotation, speed, prefab); + return CreateParticle(prefab, position, speed, rotation); } - public Particle CreateParticle(Vector2 position, float rotation, Vector2 speed, ParticlePrefab prefab) + public Particle CreateParticle(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation=0.0f) { if (!Map.RectContains(cam.WorldView, ConvertUnits.ToDisplayUnits(position))) return null; if (particleCount >= MaxParticles) return null; if (particles[particleCount] == null) particles[particleCount] = new Particle(); - particles[particleCount].Init(position, rotation, speed, prefab); + particles[particleCount].Init(prefab, position, speed, rotation); particleCount++; diff --git a/Subsurface/Screens/LobbyScreen.cs b/Subsurface/Screens/LobbyScreen.cs index 263fcdedf..d7f2e21b0 100644 --- a/Subsurface/Screens/LobbyScreen.cs +++ b/Subsurface/Screens/LobbyScreen.cs @@ -80,14 +80,14 @@ namespace Subsurface new GUITextBlock(new Rectangle(0, 0, 200, 25), "Crew:", Color.Transparent, Color.White, Alignment.Left, rightPanel[0]); - characterList = new GUIListBox(new Rectangle(0, 30, 300, 400), Color.White, rightPanel[0]); + characterList = new GUIListBox(new Rectangle(0, 30, 300, 0), Color.White, rightPanel[0]); //--------------------------------------- rightPanel[1] = new GUIFrame(panelRect, GUI.style.backGroundColor); rightPanel[1].Padding = GUI.style.smallPadding; - hireList = new GUIListBox(new Rectangle(0, 30, 300, 400), Color.White, Alignment.Left, rightPanel[1]); + hireList = new GUIListBox(new Rectangle(0, 30, 300, 0), Color.White, Alignment.Left, rightPanel[1]); hireList.OnSelected = HireCharacter; } diff --git a/Subsurface_Solution.sln b/Subsurface_Solution.sln index e6a746d5e..69dd83e63 100644 --- a/Subsurface_Solution.sln +++ b/Subsurface_Solution.sln @@ -9,6 +9,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Subsurface_contentContent", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Subsurface_content", "Subsurface_content\Subsurface_content\Subsurface_content.csproj", "{1E6BF44D-6E31-40CC-8321-3D5958C983E7}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{EA5F5518-C0B6-49C4-A421-927EE4391842}" + ProjectSection(SolutionItems) = preProject + Performance1.psess = Performance1.psess + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Android|Any CPU = Android|Any CPU @@ -161,4 +166,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 38fae000f607333a218d54f3784895cd1d0e005c..ee0e35036cba2d7b957650817be7ac2fabd50d0c 100644 GIT binary patch delta 22478 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 delta 8055 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 z44XYEi?YOVI^3etFES}1*ig^IFontDescriptionImporter FontDescriptionProcessor None - C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\bin\PSM\Content\SpriteFont1.xnb + E:\Subsurface\Subsurface_content\Subsurface_content\bin\PSM\Content\SpriteFont1.xnb true @@ -17,10 +17,10 @@ HiDef PSM false - C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_contentContent\ - C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\ - C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\obj\PSM\ - C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\bin\PSM\Content\ + E:\Subsurface\Subsurface_content\Subsurface_contentContent\ + E:\Subsurface\Subsurface_content\Subsurface_content\ + E:\Subsurface\Subsurface_content\Subsurface_content\obj\PSM\ + E:\Subsurface\Subsurface_content\Subsurface_content\bin\PSM\Content\ diff --git a/Subsurface_content/Subsurface_content/obj/PSM/DesignTimeResolveAssemblyReferencesInput.cache b/Subsurface_content/Subsurface_content/obj/PSM/DesignTimeResolveAssemblyReferencesInput.cache index 38eefe919e3b23c4b64ab1f5b3e1ddcf05da23ca..99b296ba3d16ddafccc8781544b4934ca3abb989 100644 GIT binary patch delta 59 zcmbQL_fU63EjM4Pt5r;JX;N`%QCebh>SRX|kDsq4c0DZ0$ AuK)l5 delta 103 zcmaE;J5_H(Ew@I!vsFxJacWUfKdfC&KP&n3|S diff --git a/Subsurface_content/Subsurface_content/obj/PSM/Subsurface_content.csproj.FileListAbsolute.txt b/Subsurface_content/Subsurface_content/obj/PSM/Subsurface_content.csproj.FileListAbsolute.txt index 1fd3989bf..4b0fbd222 100644 --- a/Subsurface_content/Subsurface_content/obj/PSM/Subsurface_content.csproj.FileListAbsolute.txt +++ b/Subsurface_content/Subsurface_content/obj/PSM/Subsurface_content.csproj.FileListAbsolute.txt @@ -196,3 +196,9 @@ C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\bi C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\obj\PSM\Subsurface_content.csprojResolveAssemblyReference.cache C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\obj\PSM\Microsoft.Xna.Framework.RuntimeProfile.txt C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_content\obj\PSM\IgnoreMe.dll +E:\Subsurface\Subsurface_content\Subsurface_content\bin\PSM\Content\SpriteFont1.xnb +E:\Subsurface\Subsurface_content\Subsurface_content\bin\PSM\Content\SpriteFont1.spritefont +E:\Subsurface\Subsurface_content\Subsurface_content\bin\PSM\IgnoreMe.dll +E:\Subsurface\Subsurface_content\Subsurface_content\obj\PSM\Subsurface_content.csprojResolveAssemblyReference.cache +E:\Subsurface\Subsurface_content\Subsurface_content\obj\PSM\Microsoft.Xna.Framework.RuntimeProfile.txt +E:\Subsurface\Subsurface_content\Subsurface_content\obj\PSM\IgnoreMe.dll diff --git a/Subsurface_content/Subsurface_contentContent/obj/PSM/DesignTimeResolveAssemblyReferencesInput.cache b/Subsurface_content/Subsurface_contentContent/obj/PSM/DesignTimeResolveAssemblyReferencesInput.cache index 8703509974648e99a031aa496dab8e7f6ad6b420..1907a085f366425d0d854b2fa0dff88b81e4937a 100644 GIT binary patch delta 51 wcmdmJ^2c~XIX7R9t5r;JX;N`%QCebh>gEO9P27CmC}NWraO-WZ5Z}oJ001WwN&o-= delta 100 zcmexkywPMsIk#pTqq9{^XmM&$ag0}feqLg6j7w^9c1eCgOmJyZacNOnVsdJ{p@D(v S=2q?|ZjDr8Rf~#0X956qqa_jm diff --git a/Subsurface_content/Subsurface_contentContent/obj/PSM/Subsurface_contentContent.contentproj.FileListAbsolute.txt b/Subsurface_content/Subsurface_contentContent/obj/PSM/Subsurface_contentContent.contentproj.FileListAbsolute.txt index 1c578d089..fdb676530 100644 --- a/Subsurface_content/Subsurface_contentContent/obj/PSM/Subsurface_contentContent.contentproj.FileListAbsolute.txt +++ b/Subsurface_content/Subsurface_contentContent/obj/PSM/Subsurface_contentContent.contentproj.FileListAbsolute.txt @@ -30,3 +30,4 @@ C:\Users\Joonas\Desktop\Subsurface_3004\Subsurface – Kopio\Subsurface_content\ C:\Users\Joonas\Desktop\Subsurface_0205\Subsurface_content\Subsurface_contentContent\obj\PSM\Subsurface_contentContent.contentprojResolveAssemblyReference.cache C:\Users\Joonas\Desktop\Subsurface_0805\Subsurface_0205\Subsurface_content\Subsurface_contentContent\obj\PSM\Subsurface_contentContent.contentprojResolveAssemblyReference.cache C:\Users\Joonas\Desktop\Subsurface_1005\Subsurface_content\Subsurface_contentContent\obj\PSM\Subsurface_contentContent.contentprojResolveAssemblyReference.cache +E:\Subsurface\Subsurface_content\Subsurface_contentContent\obj\PSM\Subsurface_contentContent.contentprojResolveAssemblyReference.cache