diff --git a/Backup/ChainingPropertyDescriptor.cs b/Backup/ChainingPropertyDescriptor.cs
new file mode 100644
index 000000000..997cfb27c
--- /dev/null
+++ b/Backup/ChainingPropertyDescriptor.cs
@@ -0,0 +1,108 @@
+using System;
+using System.ComponentModel;
+
+namespace Hyper.ComponentModel {
+ public abstract class ChainingPropertyDescriptor : PropertyDescriptor {
+ private readonly PropertyDescriptor _root;
+ protected PropertyDescriptor Root { get { return _root; } }
+ protected ChainingPropertyDescriptor(PropertyDescriptor root)
+ : base(root) {
+ _root = root;
+ }
+ public override void AddValueChanged(object component, EventHandler handler) {
+ Root.AddValueChanged(component, handler);
+ }
+ public override AttributeCollection Attributes {
+ get {
+ return Root.Attributes;
+ }
+ }
+ public override bool CanResetValue(object component) {
+ return Root.CanResetValue(component);
+ }
+ public override string Category {
+ get {
+ return Root.Category;
+ }
+ }
+ public override Type ComponentType {
+ get { return Root.ComponentType; }
+ }
+ public override TypeConverter Converter {
+ get {
+ return Root.Converter;
+ }
+ }
+ public override string Description {
+ get {
+ return Root.Description;
+ }
+ }
+ public override bool DesignTimeOnly {
+ get {
+ return Root.DesignTimeOnly;
+ }
+ }
+ public override string DisplayName {
+ get {
+ return Root.DisplayName;
+ }
+ }
+ public override bool Equals(object obj) {
+ return Root.Equals(obj);
+ }
+ public override PropertyDescriptorCollection GetChildProperties(object instance, Attribute[] filter) {
+ return Root.GetChildProperties(instance, filter);
+ }
+ public override object GetEditor(Type editorBaseType) {
+ return Root.GetEditor(editorBaseType);
+ }
+ public override int GetHashCode() {
+ return Root.GetHashCode();
+ }
+ public override object GetValue(object component) {
+ return Root.GetValue(component);
+ }
+ public override bool IsBrowsable {
+ get {
+ return Root.IsBrowsable;
+ }
+ }
+ public override bool IsLocalizable {
+ get {
+ return Root.IsLocalizable;
+ }
+ }
+ public override bool IsReadOnly {
+ get { return Root.IsReadOnly; }
+ }
+ public override string Name {
+ get {
+ return Root.Name;
+ }
+ }
+ public override Type PropertyType {
+ get { return Root.PropertyType; }
+ }
+ public override void RemoveValueChanged(object component, EventHandler handler) {
+ Root.RemoveValueChanged(component, handler);
+ }
+ public override void ResetValue(object component) {
+ Root.ResetValue(component);
+ }
+ public override void SetValue(object component, object value) {
+ Root.SetValue(component, value);
+ }
+ public override bool ShouldSerializeValue(object component) {
+ return Root.ShouldSerializeValue(component);
+ }
+ public override bool SupportsChangeEvents {
+ get {
+ return Root.SupportsChangeEvents;
+ }
+ }
+ public override string ToString() {
+ return Root.ToString();
+ }
+ }
+}
diff --git a/Backup/HyperPropertyDescriptor.csproj b/Backup/HyperPropertyDescriptor.csproj
new file mode 100644
index 000000000..cf60a1d62
--- /dev/null
+++ b/Backup/HyperPropertyDescriptor.csproj
@@ -0,0 +1,50 @@
+
+
+ Debug
+ AnyCPU
+ 8.0.50727
+ 2.0
+ {954502B1-7282-417D-9310-3332962A1CA1}
+ Library
+ Properties
+ HyperPropertyDescriptor
+ HyperPropertyDescriptor
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Backup/HyperPropertyDescriptor.csproj.user b/Backup/HyperPropertyDescriptor.csproj.user
new file mode 100644
index 000000000..6a34e7dcd
--- /dev/null
+++ b/Backup/HyperPropertyDescriptor.csproj.user
@@ -0,0 +1,5 @@
+
+
+ ShowAllFiles
+
+
\ No newline at end of file
diff --git a/Backup/HyperTypeDescriptionProvider.cs b/Backup/HyperTypeDescriptionProvider.cs
new file mode 100644
index 000000000..f21c47d85
--- /dev/null
+++ b/Backup/HyperTypeDescriptionProvider.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ComponentModel;
+using System.Security.Permissions;
+
+/* Change history:
+ * 20 Apr 2007 Marc Gravell Rollback dictionary on error;
+ * Assert ReflectionPermission for main creation
+ * (thanks/credit to Josh Smith for feedback/hints)
+ */
+
+namespace Hyper.ComponentModel {
+ public sealed class HyperTypeDescriptionProvider : TypeDescriptionProvider {
+ public static void Add(Type type) {
+ TypeDescriptionProvider parent = TypeDescriptor.GetProvider(type);
+ TypeDescriptor.AddProvider(new HyperTypeDescriptionProvider(parent), type);
+ }
+ public HyperTypeDescriptionProvider() : this(typeof(object)) { }
+ public HyperTypeDescriptionProvider(Type type) : this(TypeDescriptor.GetProvider(type)) { }
+ public HyperTypeDescriptionProvider(TypeDescriptionProvider parent) : base(parent) { }
+ public static void Clear(Type type) {
+ lock (descriptors) {
+ descriptors.Remove(type);
+ }
+ }
+ public static void Clear() {
+ lock (descriptors) {
+ descriptors.Clear();
+ }
+ }
+ private static readonly Dictionary descriptors = new Dictionary();
+ public sealed override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) {
+ ICustomTypeDescriptor descriptor;
+ lock (descriptors) {
+ if (!descriptors.TryGetValue(objectType, out descriptor)) {
+ try
+ {
+ descriptor = BuildDescriptor(objectType);
+ }
+ catch
+ {
+ return base.GetTypeDescriptor(objectType, instance);
+ }
+ }
+ return descriptor;
+ }
+ }
+ [ReflectionPermission( SecurityAction.Assert, Flags = ReflectionPermissionFlag.AllFlags)]
+ private ICustomTypeDescriptor BuildDescriptor(Type objectType)
+ {
+ // NOTE: "descriptors" already locked here
+
+ // get the parent descriptor and add to the dictionary so that
+ // building the new descriptor will use the base rather than recursing
+ ICustomTypeDescriptor descriptor = base.GetTypeDescriptor(objectType, null);
+ descriptors.Add(objectType, descriptor);
+ try
+ {
+ // build a new descriptor from this, and replace the lookup
+ descriptor = new HyperTypeDescriptor(descriptor);
+ descriptors[objectType] = descriptor;
+ return descriptor;
+ }
+ catch
+ { // rollback and throw
+ // (perhaps because the specific caller lacked permissions;
+ // another caller may be successful)
+ descriptors.Remove(objectType);
+ throw;
+ }
+ }
+ }
+}
diff --git a/Backup/HyperTypeDescriptor.cs b/Backup/HyperTypeDescriptor.cs
new file mode 100644
index 000000000..d47858bca
--- /dev/null
+++ b/Backup/HyperTypeDescriptor.cs
@@ -0,0 +1,218 @@
+using System;
+using System.ComponentModel;
+using System.Reflection.Emit;
+using System.Reflection;
+using System.Threading;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+/* Change history:
+ * 20 Apr 2007 Marc Gravell Renamed
+ */
+
+namespace Hyper.ComponentModel {
+ sealed class HyperTypeDescriptor : CustomTypeDescriptor {
+ private readonly PropertyDescriptorCollection propertyCollections;
+ static readonly Dictionary properties = new Dictionary();
+ internal HyperTypeDescriptor(ICustomTypeDescriptor parent)
+ : base(parent) {
+ propertyCollections = WrapProperties(parent.GetProperties());
+ }
+ public sealed override PropertyDescriptorCollection GetProperties(Attribute[] attributes) {
+ return propertyCollections;
+ }
+ public sealed override PropertyDescriptorCollection GetProperties() {
+ return propertyCollections;
+ }
+ private static PropertyDescriptorCollection WrapProperties(PropertyDescriptorCollection oldProps) {
+ PropertyDescriptor[] newProps = new PropertyDescriptor[oldProps.Count];
+ int index = 0;
+ bool changed = false;
+ // HACK: how to identify reflection, given that the class is internal...
+ Type wrapMe = Assembly.GetAssembly(typeof(PropertyDescriptor)).GetType("System.ComponentModel.ReflectPropertyDescriptor");
+ foreach (PropertyDescriptor oldProp in oldProps) {
+ PropertyDescriptor pd = oldProp;
+ // if it looks like reflection, try to create a bespoke descriptor
+ if (ReferenceEquals(wrapMe, pd.GetType()) && TryCreatePropertyDescriptor(ref pd)) {
+ changed = true;
+ }
+ newProps[index++] = pd;
+ }
+
+ return changed ? new PropertyDescriptorCollection(newProps, true) : oldProps;
+ }
+
+ static readonly ModuleBuilder moduleBuilder;
+ static int counter;
+ static HyperTypeDescriptor() {
+ AssemblyName an = new AssemblyName("Hyper.ComponentModel.dynamic");
+ AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
+ moduleBuilder = ab.DefineDynamicModule("Hyper.ComponentModel.dynamic.dll");
+
+ }
+
+ private static bool TryCreatePropertyDescriptor(ref PropertyDescriptor descriptor) {
+ try {
+ PropertyInfo property = descriptor.ComponentType.GetProperty(descriptor.Name);
+ if (property == null) return false;
+
+ lock (properties) {
+ PropertyDescriptor foundBuiltAlready;
+ if (properties.TryGetValue(property, out foundBuiltAlready)) {
+ descriptor = foundBuiltAlready;
+ return true;
+ }
+
+ string name = "_c" + Interlocked.Increment(ref counter).ToString();
+ TypeBuilder tb = moduleBuilder.DefineType(name, TypeAttributes.Sealed | TypeAttributes.NotPublic | TypeAttributes.Class | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public, typeof(ChainingPropertyDescriptor));
+
+ // ctor calls base
+ ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, CallingConventions.Standard, new Type[] { typeof(PropertyDescriptor) });
+ ILGenerator il = cb.GetILGenerator();
+ il.Emit(OpCodes.Ldarg_0);
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Call, typeof(ChainingPropertyDescriptor).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(PropertyDescriptor) }, null));
+ il.Emit(OpCodes.Ret);
+
+ MethodBuilder mb;
+ MethodInfo baseMethod;
+ if (property.CanRead) {
+ // obtain the implementation that we want to override
+ baseMethod = typeof(ChainingPropertyDescriptor).GetMethod("GetValue");
+ // create a new method that accepts an object and returns an object (as per the base)
+ mb = tb.DefineMethod(baseMethod.Name,
+ MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final,
+ baseMethod.CallingConvention, baseMethod.ReturnType, new Type[] { typeof(object) });
+ // start writing IL into the method
+ il = mb.GetILGenerator();
+ if (property.DeclaringType.IsValueType) {
+ // upbox the object argument into our known (instance) struct type
+ LocalBuilder lb = il.DeclareLocal(property.DeclaringType);
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Unbox_Any, property.DeclaringType);
+ il.Emit(OpCodes.Stloc_0);
+ il.Emit(OpCodes.Ldloca_S, lb);
+ } else {
+ // cast the object argument into our known class type
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Castclass, property.DeclaringType);
+ }
+ // call the "get" method
+ il.Emit(OpCodes.Callvirt, property.GetGetMethod());
+
+ if (property.PropertyType.IsValueType) {
+ // box it from the known (value) struct type
+ il.Emit(OpCodes.Box, property.PropertyType);
+ }
+ // return the value
+ il.Emit(OpCodes.Ret);
+ // signal that this method should override the base
+ tb.DefineMethodOverride(mb, baseMethod);
+ }
+
+ bool supportsChangeEvents = descriptor.SupportsChangeEvents, isReadOnly = descriptor.IsReadOnly;
+
+ // override SupportsChangeEvents
+ baseMethod = typeof(ChainingPropertyDescriptor).GetProperty("SupportsChangeEvents").GetGetMethod();
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, Type.EmptyTypes);
+ il = mb.GetILGenerator();
+ if (supportsChangeEvents) {
+ il.Emit(OpCodes.Ldc_I4_1);
+ } else {
+ il.Emit(OpCodes.Ldc_I4_0);
+ }
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+
+ // override IsReadOnly
+ baseMethod = typeof(ChainingPropertyDescriptor).GetProperty("IsReadOnly").GetGetMethod();
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, Type.EmptyTypes);
+ il = mb.GetILGenerator();
+ if (isReadOnly) {
+ il.Emit(OpCodes.Ldc_I4_1);
+ } else {
+ il.Emit(OpCodes.Ldc_I4_0);
+ }
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+
+ /* REMOVED: PropertyType, ComponentType; actually *adds* time overriding these
+ // override PropertyType
+ baseMethod = typeof(ChainingPropertyDescriptor).GetProperty("PropertyType").GetGetMethod();
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, Type.EmptyTypes);
+ il = mb.GetILGenerator();
+ il.Emit(OpCodes.Ldtoken, descriptor.PropertyType);
+ il.Emit(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"));
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+
+ // override ComponentType
+ baseMethod = typeof(ChainingPropertyDescriptor).GetProperty("ComponentType").GetGetMethod();
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, Type.EmptyTypes);
+ il = mb.GetILGenerator();
+ il.Emit(OpCodes.Ldtoken, descriptor.ComponentType);
+ il.Emit(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"));
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+ */
+
+ // for classes, implement write (would be lost in unbox for structs)
+ if (!property.DeclaringType.IsValueType) {
+ if (!isReadOnly && property.CanWrite) {
+ // override set method
+ baseMethod = typeof(ChainingPropertyDescriptor).GetMethod("SetValue");
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, baseMethod.CallingConvention, baseMethod.ReturnType, new Type[] { typeof(object), typeof(object) });
+ il = mb.GetILGenerator();
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Castclass, property.DeclaringType);
+ il.Emit(OpCodes.Ldarg_2);
+ if (property.PropertyType.IsValueType) {
+ il.Emit(OpCodes.Unbox_Any, property.PropertyType);
+ } else {
+ il.Emit(OpCodes.Castclass, property.PropertyType);
+ }
+ il.Emit(OpCodes.Callvirt, property.GetSetMethod());
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+ }
+
+ if (supportsChangeEvents) {
+ EventInfo ei = property.DeclaringType.GetEvent(property.Name + "Changed");
+ if (ei != null) {
+ baseMethod = typeof(ChainingPropertyDescriptor).GetMethod("AddValueChanged");
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, new Type[] { typeof(object), typeof(EventHandler) });
+ il = mb.GetILGenerator();
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Castclass, property.DeclaringType);
+ il.Emit(OpCodes.Ldarg_2);
+ il.Emit(OpCodes.Callvirt, ei.GetAddMethod());
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+
+ baseMethod = typeof(ChainingPropertyDescriptor).GetMethod("RemoveValueChanged");
+ mb = tb.DefineMethod(baseMethod.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, baseMethod.ReturnType, new Type[] { typeof(object), typeof(EventHandler) });
+ il = mb.GetILGenerator();
+ il.Emit(OpCodes.Ldarg_1);
+ il.Emit(OpCodes.Castclass, property.DeclaringType);
+ il.Emit(OpCodes.Ldarg_2);
+ il.Emit(OpCodes.Callvirt, ei.GetRemoveMethod());
+ il.Emit(OpCodes.Ret);
+ tb.DefineMethodOverride(mb, baseMethod);
+ }
+ }
+
+ }
+ PropertyDescriptor newDesc = tb.CreateType().GetConstructor(new Type[] { typeof(PropertyDescriptor) }).Invoke(new object[] { descriptor }) as PropertyDescriptor;
+ if (newDesc == null) {
+ return false;
+ }
+ descriptor = newDesc;
+ properties.Add(property, descriptor);
+ return true;
+ }
+ } catch {
+ return false;
+ }
+ }
+ }
+}
diff --git a/Backup/Properties/AssemblyInfo.cs b/Backup/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..89228e1b0
--- /dev/null
+++ b/Backup/Properties/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Security;
+
+[assembly: AllowPartiallyTrustedCallers]
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HyperTypeDescriptor")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HyperTypeDescriptor")]
+[assembly: AssemblyCopyright("Copyright © Marc Gravell 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f22bc56b-501e-438a-967e-8f0b48827869")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs
index 57eb967ad..a00c2f2c0 100644
--- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs
+++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSprite.cs
@@ -15,6 +15,8 @@ namespace Subsurface
const float CheckWallsInterval = 5.0f;
+ public bool Enabled;
+
private BackgroundSpritePrefab prefab;
private Vector2 position;
@@ -29,6 +31,12 @@ namespace Subsurface
public Swarm Swarm;
+ Vector2 drawPosition;
+ public Vector2 TransformedPosition
+ {
+ get { return drawPosition; }
+ }
+
public Vector2 Position
{
get { return position; }
@@ -51,6 +59,8 @@ namespace Subsurface
this.position = position;
+ drawPosition = position + Level.Loaded.Position;
+
steeringManager = new SteeringManager(this);
velocity = new Vector3(
@@ -141,18 +151,16 @@ namespace Subsurface
if (velocity.X < 0.0f) rotation -= MathHelper.Pi;
}
- Vector2 drawPos = position;
-
- if (Level.Loaded != null) drawPos += Level.Loaded.Position;
+ if (Level.Loaded != null) drawPosition = position + Level.Loaded.Position;
if (depth > 0.0f)
{
- Vector2 camOffset = drawPos - GameMain.GameScreen.Cam.WorldViewCenter;
+ Vector2 camOffset = drawPosition - GameMain.GameScreen.Cam.WorldViewCenter;
- drawPos = drawPos - camOffset * (depth / MaxDepth) * 0.05f;
+ drawPosition = drawPosition - camOffset * (depth / MaxDepth) * 0.05f;
}
- prefab.Sprite.Draw(spriteBatch, new Vector2(drawPos.X, -drawPos.Y), Color.Lerp(Color.White, Color.DarkBlue, (depth/MaxDepth)*0.3f),
+ prefab.Sprite.Draw(spriteBatch, new Vector2(drawPosition.X, -drawPosition.Y), Color.Lerp(Color.White, Color.DarkBlue, (depth/MaxDepth)*0.3f),
rotation, 1.0f - (depth / MaxDepth) * 0.2f, velocity.X > 0.0f ? SpriteEffects.None : SpriteEffects.FlipHorizontally, (depth / MaxDepth));
}
}
diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs
index e6fcaac09..7435d6459 100644
--- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs
+++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs
@@ -12,6 +12,10 @@ namespace Subsurface
{
const int MaxSprites = 100;
+ const float checkActiveInterval = 1.0f;
+
+ float checkActiveTimer;
+
private List prefabs;
private List activeSprites;
@@ -31,7 +35,6 @@ namespace Subsurface
public void SpawnSprites(int count)
{
-
activeSprites.Clear();
if (prefabs.Count == 0) return;
@@ -77,10 +80,26 @@ namespace Subsurface
activeSprites.Clear();
}
- public void Update(float deltaTime)
+ public void Update(Camera cam, float deltaTime)
{
+ if (checkActiveTimer<0.0f)
+ {
+ foreach (BackgroundSprite sprite in activeSprites)
+ {
+ sprite.Enabled = (Math.Abs(sprite.TransformedPosition.X - cam.WorldViewCenter.X) < 4000.0f &&
+ Math.Abs(sprite.TransformedPosition.Y - cam.WorldViewCenter.Y) < 4000.0f);
+ }
+
+ checkActiveTimer = checkActiveInterval;
+ }
+ else
+ {
+ checkActiveTimer -= deltaTime;
+ }
+
foreach (BackgroundSprite sprite in activeSprites)
{
+ if (!sprite.Enabled) continue;
sprite.Update(deltaTime);
}
}
@@ -89,6 +108,7 @@ namespace Subsurface
{
foreach (BackgroundSprite sprite in activeSprites)
{
+ if (!sprite.Enabled) continue;
sprite.Draw(spriteBatch);
}
}
diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs
index 274826e1c..602304e6d 100644
--- a/Subsurface/Source/GUI/GUI.cs
+++ b/Subsurface/Source/GUI/GUI.cs
@@ -307,16 +307,22 @@ namespace Subsurface
if (GameMain.DebugDraw)
{
spriteBatch.DrawString(Font,
- "Physics: " + GameMain.World.UpdateTime
- + " - bodies: " + GameMain.World.BodyList.Count
- + " Camera pos: " + GameMain.GameScreen.Cam.Position,
+ "Physics: " + GameMain.World.UpdateTime,
new Vector2(10, 30), Color.White);
+ spriteBatch.DrawString(Font,
+ "Bodies: " + GameMain.World.BodyList.Count + " (" + GameMain.World.BodyList.FindAll(b => b.Awake && b.Enabled).Count + " awake)",
+ new Vector2(10, 50), Color.White);
+
+ spriteBatch.DrawString(Font,
+ "Camera pos: " + GameMain.GameScreen.Cam.Position,
+ new Vector2(10, 70), Color.White);
+
if (Submarine.Loaded!=null)
{
spriteBatch.DrawString(Font,
"Sub pos: " + Submarine.Loaded.Position,
- new Vector2(10, 50), Color.White);
+ new Vector2(10, 90), Color.White);
}
}
diff --git a/Subsurface/Source/Game1.cs b/Subsurface/Source/Game1.cs
index 6c62db18f..3a188df65 100644
--- a/Subsurface/Source/Game1.cs
+++ b/Subsurface/Source/Game1.cs
@@ -120,6 +120,8 @@ namespace Subsurface
//TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 55);
World = new World(new Vector2(0, -9.82f));
+ FarseerPhysics.Settings.AllowSleep = true;
+ FarseerPhysics.Settings.ContinuousPhysics = false;
FarseerPhysics.Settings.VelocityIterations = 2;
FarseerPhysics.Settings.PositionIterations = 1;
}
diff --git a/Subsurface/Source/Items/Components/Container.cs b/Subsurface/Source/Items/Components/Container.cs
index e2e66e542..e252f75ae 100644
--- a/Subsurface/Source/Items/Components/Container.cs
+++ b/Subsurface/Source/Items/Components/Container.cs
@@ -179,7 +179,7 @@ namespace Subsurface.Items.Components
{
if (containedItem == null) continue;
- containedItem.sprite.Draw(
+ containedItem.Sprite.Draw(
spriteBatch,
new Vector2(transformedItemPos.X, -transformedItemPos.Y),
-currentRotation,
diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs
index 2a1119e5b..0dbb5c1f1 100644
--- a/Subsurface/Source/Items/Components/ItemComponent.cs
+++ b/Subsurface/Source/Items/Components/ItemComponent.cs
@@ -82,7 +82,16 @@ namespace Subsurface.Items.Components
public virtual bool IsActive
{
get { return isActive; }
- set { isActive = value; }
+ set
+ {
+ if (!value && isActive)
+ {
+ StopSounds(ActionType.OnActive);
+ StopSounds(ActionType.OnUse);
+ }
+
+ isActive = value;
+ }
}
[HasDefaultValue(false, false)]
diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs
index 95a92416f..efae83239 100644
--- a/Subsurface/Source/Items/Components/Projectile.cs
+++ b/Subsurface/Source/Items/Components/Projectile.cs
@@ -205,7 +205,7 @@ namespace Subsurface.Items.Components
stickJoint.MaxMotorForce = 30.0f;
stickJoint.LimitEnabled = true;
- stickJoint.UpperLimit = ConvertUnits.ToSimUnits(item.sprite.size.X*0.7f);
+ stickJoint.UpperLimit = ConvertUnits.ToSimUnits(item.Sprite.size.X*0.7f);
item.body.FarseerBody.IgnoreCollisionWith(targetBody);
stickTarget = targetBody;
diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs
index 9657701a7..708b5a40b 100644
--- a/Subsurface/Source/Items/Inventory.cs
+++ b/Subsurface/Source/Items/Inventory.cs
@@ -251,7 +251,7 @@ namespace Subsurface
if (item == null) return;
- item.sprite.Draw(spriteBatch, new Vector2(rect.X + rect.Width / 2, rect.Y + rect.Height / 2), item.Color);
+ item.Sprite.Draw(spriteBatch, new Vector2(rect.X + rect.Width / 2, rect.Y + rect.Height / 2), item.Color);
if (isHighLighted)
{
diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs
index 07bcbdde3..79966335d 100644
--- a/Subsurface/Source/Items/Item.cs
+++ b/Subsurface/Source/Items/Item.cs
@@ -68,7 +68,7 @@ namespace Subsurface
get { return prefab.Name; }
}
- public override Sprite sprite
+ public override Sprite Sprite
{
get { return prefab.sprite; }
}
@@ -299,9 +299,8 @@ namespace Subsurface
}
}
-
+ InsertToList();
itemList.Add(this);
- mapEntityList.Add(this);
}
public T GetComponent()
@@ -475,23 +474,8 @@ namespace Subsurface
{
if (ic.Parent != null) ic.IsActive = ic.Parent.IsActive;
- //if (!ic.WasUsed)
- //{
- // if (ic.Name == "RepairTool" && ic.IsActive)
- // {
- // System.Diagnostics.Debug.WriteLine("stop sounds");
- // }
- // ic.StopSounds(ActionType.OnUse);
- //}
- //ic.WasUsed = false;
-
+ if (!ic.IsActive) continue;
- if (!ic.IsActive)
- {
- ic.StopSounds(ActionType.OnActive);
- ic.StopSounds(ActionType.OnUse);
- continue;
- }
if (condition > 0.0f)
{
ic.Update(deltaTime, cam);
@@ -503,17 +487,19 @@ namespace Subsurface
{
ic.UpdateBroken(deltaTime, cam);
}
+ }
+
+ if (body == null || !body.Enabled) return;
+
+ if (body.LinearVelocity.Length() > 0.001f)
+ {
+ FindHull();
+
+ Vector2 displayPos = ConvertUnits.ToDisplayUnits(body.SimPosition);
+
+ rect.X = (int)(displayPos.X - rect.Width / 2.0f);
+ rect.Y = (int)(displayPos.Y + rect.Height / 2.0f);
}
-
-
- if (body == null) return;
-
- if (body.LinearVelocity.Length()>0.001f) FindHull();
-
- Vector2 displayPos = ConvertUnits.ToDisplayUnits(body.SimPosition);
-
- rect.X = (int)(displayPos.X - rect.Width / 2.0f);
- rect.Y = (int)(displayPos.Y + rect.Height / 2.0f);
body.SetToTargetPosition();
@@ -527,7 +513,7 @@ namespace Subsurface
{
Vector2 impulse = -body.LinearVelocity * (body.Mass / body.Density);
body.ApplyLinearImpulse(impulse);
- int n = (int)((displayPos.X - CurrentHull.Rect.X) / Hull.WaveWidth);
+ int n = (int)((ConvertUnits.ToDisplayUnits(body.SimPosition.X) - CurrentHull.Rect.X) / Hull.WaveWidth);
CurrentHull.WaveVel[n] = impulse.Y * 10.0f;
}
}
@@ -537,28 +523,21 @@ namespace Subsurface
Vector2 buoyancy = new Vector2(0, volume * 20.0f);
//apply buoyancy and drag
- try
- {
- //if ((buoyancy - body.LinearVelocity * volume) == Vector2.Zero) DebugConsole.ThrowError("v.zero ");
- if (body.LinearVelocity != Vector2.Zero && body.LinearVelocity.Length() > 1000.0f)
- {
- body.ResetDynamics();
- if (body.SimPosition.Length() > 1000.0f)
- {
- Remove();
- return;
- }
- }
- body.ApplyForce(buoyancy - body.LinearVelocity * volume);
-
- //apply simple angular drag
- body.ApplyTorque(body.AngularVelocity * volume * -0.05f);
- }
- catch
+ //if ((buoyancy - body.LinearVelocity * volume) == Vector2.Zero) DebugConsole.ThrowError("v.zero ");
+ if (body.LinearVelocity != Vector2.Zero && body.LinearVelocity.Length() > 1000.0f)
{
- DebugConsole.ThrowError("something bad happened with the physics");
+ body.ResetDynamics();
+ if (body.SimPosition.Length() > 1000.0f)
+ {
+ Remove();
+ return;
+ }
}
+ body.ApplyForce(buoyancy - body.LinearVelocity * volume);
+
+ //apply simple angular drag
+ body.ApplyTorque(body.AngularVelocity * volume * -0.05f);
}
public override void Draw(SpriteBatch spriteBatch, bool editing)
diff --git a/Subsurface/Source/Items/ItemPrefab.cs b/Subsurface/Source/Items/ItemPrefab.cs
index def5e6eb4..b7021d576 100644
--- a/Subsurface/Source/Items/ItemPrefab.cs
+++ b/Subsurface/Source/Items/ItemPrefab.cs
@@ -145,7 +145,7 @@ namespace Subsurface
name = ToolBox.GetAttributeString(element, "name", "");
if (name == "") DebugConsole.ThrowError("Unnamed item in "+filePath+"!");
-
+
pickDistance = ConvertUnits.ToSimUnits(ToolBox.GetAttributeFloat(element, "pickdistance", 0.0f));
isLinkable = ToolBox.GetAttributeBool(element, "linkable", false);
diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs
index 42c7cc6bf..7f929f0a8 100644
--- a/Subsurface/Source/Map/Gap.cs
+++ b/Subsurface/Source/Map/Gap.cs
@@ -73,7 +73,7 @@ namespace Subsurface
FindHulls();
GapList.Add(this);
- mapEntityList.Add(this);
+ InsertToList();
}
public static void UpdateHulls()
diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs
index 6bf01cea4..4c41965d6 100644
--- a/Subsurface/Source/Map/Hull.cs
+++ b/Subsurface/Source/Map/Hull.cs
@@ -146,8 +146,7 @@ namespace Subsurface
Volume = 0.0f;
- //add to list of entities as well
- mapEntityList.Add(this);
+ InsertToList();
}
public override bool Contains(Vector2 position)
diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs
index e2f115ea8..d069705a6 100644
--- a/Subsurface/Source/Map/Lights/ConvexHull.cs
+++ b/Subsurface/Source/Map/Lights/ConvexHull.cs
@@ -10,18 +10,17 @@ namespace Subsurface.Lights
public static List list = new List();
static BasicEffect shadowEffect;
static BasicEffect penumbraEffect;
-
- private static VertexPositionTexture[] penumbraVertices;
-
- private VertexPositionColor[] vertices;
- private short[] indices;
- int primitiveCount;
+
+ private Vector2[] vertices;
+ private int primitiveCount;
- bool[] backFacing;
- VertexPositionColor[] shadowVertices;
+ private bool[] backFacing;
+
+ private VertexPositionColor[] shadowVertices;
+ private VertexPositionTexture[] penumbraVertices;
private Rectangle boundingBox;
-
+
public bool Enabled
{
get;
@@ -48,86 +47,77 @@ namespace Subsurface.Lights
penumbraEffect.LightingEnabled = false;
penumbraEffect.Texture = TextureLoader.FromFile("Content/Lights/penumbra.png");
}
+
+ vertices = points;
+ primitiveCount = vertices.Length;
- if (penumbraVertices==null)
- {
- penumbraVertices = new VertexPositionTexture[6];
- }
+ CalculateDimensions();
+ //indices = new short[primitiveCount * 3];
- int vertexCount = points.Length;
- vertices = new VertexPositionColor[vertexCount + 1];
- Vector2 center = Vector2.Zero;
-
- float? minX = null, minY = null, maxX = null, maxY = null;
-
- for (int i = 0; i < vertexCount; i++)
- {
- vertices[i] = new VertexPositionColor(new Vector3(points[i], 0), color);
- center += points[i];
-
- if (minX == null || points[i].X < minX) minX = points[i].X;
- if (minY == null || points[i].Y < minY) minY = points[i].Y;
-
- if (maxX == null || points[i].X > maxX) maxX = points[i].X;
- if (maxY == null || points[i].Y > minY) maxY = points[i].Y;
- }
- center /= points.Length;
- vertices[vertexCount] = new VertexPositionColor(new Vector3(center, 0), color);
-
- boundingBox = new Rectangle((int)minX, (int)minY, (int)(maxX-minX), (int)(maxY-minY));
-
- primitiveCount = points.Length;
- indices = new short[primitiveCount * 3];
-
- for (int i = 0; i < primitiveCount; i++)
- {
- indices[3 * i] = (short)i;
- indices[3 * i + 1] = (short)((i + 1) % vertexCount);
- indices[3 * i + 2] = (short)vertexCount;
- }
- backFacing = new bool[vertexCount];
+ //for (int i = 0; i < primitiveCount; i++)
+ //{
+ // indices[3 * i] = (short)i;
+ // indices[3 * i + 1] = (short)((i + 1) % vertexCount);
+ // indices[3 * i + 2] = (short)vertexCount;
+ //}
+ backFacing = new bool[primitiveCount];
Enabled = true;
list.Add(this);
}
+ private void CalculateDimensions()
+ {
+ Vector2 center = Vector2.Zero;
+
+ float? minX = null, minY = null, maxX = null, maxY = null;
+
+ for (int i = 0; i < vertices.Length; i++)
+ {
+ center += vertices[i];
+
+ if (minX == null || vertices[i].X < minX) minX = vertices[i].X;
+ if (minY == null || vertices[i].Y < minY) minY = vertices[i].Y;
+
+ if (maxX == null || vertices[i].X > maxX) maxX = vertices[i].X;
+ if (maxY == null || vertices[i].Y > minY) maxY = vertices[i].Y;
+ }
+ center /= vertices.Length;
+
+ boundingBox = new Rectangle((int)minX, (int)minY, (int)(maxX - minX), (int)(maxY - minY));
+ }
+
public void Move(Vector2 amount)
{
for (int i = 0; i < vertices.Count(); i++)
{
- vertices[i].Position = new Vector3(vertices[i].Position.X + amount.X, vertices[i].Position.Y + amount.Y, vertices[i].Position.Z);
+ vertices[i] += amount;
}
+
+ CalculateDimensions();
}
public void SetVertices(Vector2[] points)
{
- int vertexCount = points.Length;
- vertices = new VertexPositionColor[vertexCount + 1];
-
- for (int i = 0; i < vertexCount; i++)
- {
- vertices[i] = new VertexPositionColor(new Vector3(points[i], 0), Color.Black);
- }
+ vertices = points;
}
- public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Vector2 lightSourcePos, Matrix transform, bool los = true)
+ private void CalculateShadowVertices(Vector2 lightSourcePos, bool los = true)
{
- if (!Enabled) return;
-
//compute facing of each edge, using N*L
for (int i = 0; i < primitiveCount; i++)
{
- Vector2 firstVertex = new Vector2(vertices[i].Position.X, vertices[i].Position.Y);
+ Vector2 firstVertex = new Vector2(vertices[i].X, vertices[i].Y);
int secondIndex = (i + 1) % primitiveCount;
- Vector2 secondVertex = new Vector2(vertices[secondIndex].Position.X, vertices[secondIndex].Position.Y);
+ Vector2 secondVertex = new Vector2(vertices[secondIndex].X, vertices[secondIndex].Y);
Vector2 middle = (firstVertex + secondVertex) / 2;
Vector2 L = lightSourcePos - middle;
- Vector2 N = new Vector2();
- N.X = -(secondVertex.Y - firstVertex.Y);
- N.Y = secondVertex.X - firstVertex.X;
+ Vector2 N = new Vector2(
+ -(secondVertex.Y - firstVertex.Y),
+ secondVertex.X - firstVertex.X);
backFacing[i] = (Vector2.Dot(N, L) < 0);
}
@@ -148,49 +138,6 @@ namespace Subsurface.Lights
startingIndex = nextEdge;
}
- if (los)
- {
- for (int n = 0; n < 4; n+=3)
- {
- Vector3 penumbraStart = (n == 0) ? vertices[startingIndex].Position : vertices[endingIndex].Position;
-
- penumbraVertices[n] = new VertexPositionTexture();
- penumbraVertices[n].Position = penumbraStart;
- penumbraVertices[n].TextureCoordinate = new Vector2(0.0f, 1.0f);
- //penumbraVertices[0].te = fow ? Color.Black : Color.Transparent;
-
- for (int i = 0; i < 2; i++ )
- {
- penumbraVertices[n + i + 1] = new VertexPositionTexture();
- Vector3 vertexDir = penumbraStart - new Vector3(lightSourcePos, 0);
- vertexDir.Normalize();
-
- Vector3 normal = (i == 0) ? new Vector3(-vertexDir.Y, vertexDir.X, 0.0f) : new Vector3(vertexDir.Y, -vertexDir.X, 0.0f)*0.05f;
- if (n > 0) normal = -normal;
- vertexDir = penumbraStart - (new Vector3(lightSourcePos, 0) - normal * 20.0f);
- vertexDir.Normalize();
- penumbraVertices[n + i + 1].Position = new Vector3(lightSourcePos, 0) + vertexDir * 9000;
-
- if (los)
- {
- penumbraVertices[n + i + 1].TextureCoordinate = (i == 0) ? new Vector2(0.05f, 0.0f) : new Vector2(1.0f, 0.0f);
- }
- else
- {
- penumbraVertices[n + i + 1].TextureCoordinate = (i == 0) ? new Vector2(1.0f, 0.0f) : Vector2.Zero;
- }
- }
-
- if (n > 0)
- {
- var temp = penumbraVertices[4];
- penumbraVertices[4] = penumbraVertices[5];
- penumbraVertices[5] = temp;
- }
- }
- }
-
-
int shadowVertexCount;
//nr of vertices that are in the shadow
@@ -206,7 +153,7 @@ namespace Subsurface.Lights
int svCount = 0;
while (svCount != shadowVertexCount * 2)
{
- Vector3 vertexPos = vertices[currentIndex].Position;
+ Vector3 vertexPos = new Vector3(vertices[currentIndex], 0.0f);
//one vertex on the hull
shadowVertices[svCount] = new VertexPositionColor();
@@ -224,10 +171,68 @@ namespace Subsurface.Lights
currentIndex = (currentIndex + 1) % primitiveCount;
}
+ if (los)
+ {
+ CalculatePenumbraVertices(startingIndex, endingIndex, lightSourcePos, los);
+ }
+ }
+
+ private void CalculatePenumbraVertices(int startingIndex, int endingIndex, Vector2 lightSourcePos, bool los)
+ {
+ penumbraVertices = new VertexPositionTexture[6];
+
+ for (int n = 0; n < 4; n += 3)
+ {
+ Vector3 penumbraStart = new Vector3((n == 0) ? vertices[startingIndex] : vertices[endingIndex], 0.0f);
+
+ penumbraVertices[n] = new VertexPositionTexture();
+ penumbraVertices[n].Position = penumbraStart;
+ penumbraVertices[n].TextureCoordinate = new Vector2(0.0f, 1.0f);
+ //penumbraVertices[0].te = fow ? Color.Black : Color.Transparent;
+
+ for (int i = 0; i < 2; i++)
+ {
+ penumbraVertices[n + i + 1] = new VertexPositionTexture();
+ Vector3 vertexDir = penumbraStart - new Vector3(lightSourcePos, 0);
+ vertexDir.Normalize();
+
+ Vector3 normal = (i == 0) ? new Vector3(-vertexDir.Y, vertexDir.X, 0.0f) : new Vector3(vertexDir.Y, -vertexDir.X, 0.0f) * 0.05f;
+ if (n > 0) normal = -normal;
+
+ vertexDir = penumbraStart - (new Vector3(lightSourcePos, 0) - normal * 20.0f);
+ vertexDir.Normalize();
+ penumbraVertices[n + i + 1].Position = new Vector3(lightSourcePos, 0) + vertexDir * 9000;
+
+ if (los)
+ {
+ penumbraVertices[n + i + 1].TextureCoordinate = (i == 0) ? new Vector2(0.05f, 0.0f) : new Vector2(1.0f, 0.0f);
+ }
+ else
+ {
+ penumbraVertices[n + i + 1].TextureCoordinate = (i == 0) ? new Vector2(1.0f, 0.0f) : Vector2.Zero;
+ }
+ }
+
+ if (n > 0)
+ {
+ var temp = penumbraVertices[4];
+ penumbraVertices[4] = penumbraVertices[5];
+ penumbraVertices[5] = temp;
+ }
+ }
+ }
+
+ public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Vector2 lightSourcePos, Matrix transform, bool los = true)
+ {
+ if (!Enabled) return;
+
+ CalculateShadowVertices(lightSourcePos, los);
+
+
shadowEffect.World = transform;
shadowEffect.CurrentTechnique.Passes[0].Apply();
- graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertexCount * 2 - 2);
+ graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertices.Length - 2);
if (los)
{
diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs
index 92c8f8263..c7ec8e9e4 100644
--- a/Subsurface/Source/Map/MapEntity.cs
+++ b/Subsurface/Source/Map/MapEntity.cs
@@ -72,7 +72,7 @@ namespace Subsurface
set { rect = value; }
}
- public virtual Sprite sprite
+ public virtual Sprite Sprite
{
get { return null; }
}
@@ -150,6 +150,28 @@ namespace Subsurface
return (Submarine.RectContains(rect, position));
}
+ protected void InsertToList()
+ {
+ int i = 0;
+
+ if (Sprite==null)
+ {
+ mapEntityList.Add(this);
+ return;
+ }
+
+ while (i
- public static void LinkAll()
+ public static void OnMapLoaded()
{
foreach (MapEntity e in mapEntityList)
{
@@ -465,7 +487,15 @@ namespace Subsurface
e.linkedTo.Add(linked);
}
}
+
+ //mapEntityList.Sort((x, y) =>
+ //{
+ // return x.Name.CompareTo(y.Name);
+ //});
+
}
+
+
public void RemoveLinked(MapEntity e)
{
diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs
index 9843ca16c..886fea72d 100644
--- a/Subsurface/Source/Map/Structure.cs
+++ b/Subsurface/Source/Map/Structure.cs
@@ -57,7 +57,7 @@ namespace Subsurface
bool isHorizontal;
- public override Sprite sprite
+ public override Sprite Sprite
{
get { return prefab.sprite; }
}
@@ -265,7 +265,7 @@ namespace Subsurface
convexHull = new ConvexHull(corners, Color.Black);
}
- mapEntityList.Add(this);
+ InsertToList();
}
public override void Remove()
@@ -290,19 +290,22 @@ namespace Subsurface
Color color = (isHighlighted) ? Color.Green : Color.White;
if (isSelected && editing) color = Color.Red;
+
+ prefab.sprite.DrawTiled(spriteBatch, new Vector2(rect.X, -rect.Y), new Vector2(rect.Width, rect.Height), Vector2.Zero, color);
- prefab.sprite.DrawTiled(spriteBatch, new Vector2(rect.X, -rect.Y), new Vector2(rect.Width, rect.Height), Vector2.Zero, color);
-
foreach (WallSection s in sections)
{
if (s.isHighLighted)
+ {
GUI.DrawRectangle(spriteBatch,
new Rectangle((int)s.rect.X, (int)-s.rect.Y, (int)s.rect.Width, (int)s.rect.Height),
new Color((s.damage / prefab.MaxHealth), 1.0f - (s.damage / prefab.MaxHealth), 0.0f, 1.0f), true);
+ }
+
s.isHighLighted = false;
- if (s.damage == 0.0f) continue;
+ if (s.damage < 0.01f) continue;
GUI.DrawRectangle(spriteBatch,
new Rectangle((int)s.rect.X, (int)-s.rect.Y, (int)s.rect.Width, (int)s.rect.Height),
diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs
index 822026e1d..8d18ce961 100644
--- a/Subsurface/Source/Map/Submarine.cs
+++ b/Subsurface/Source/Map/Submarine.cs
@@ -159,7 +159,7 @@ namespace Subsurface
{
for (int i = 0; i < MapEntity.mapEntityList.Count(); i++)
{
- if (MapEntity.mapEntityList[i].sprite == null || MapEntity.mapEntityList[i].sprite.Depth < 0.5f)
+ if (MapEntity.mapEntityList[i].Sprite == null || MapEntity.mapEntityList[i].Sprite.Depth < 0.5f)
MapEntity.mapEntityList[i].Draw(spriteBatch, editing);
}
@@ -181,7 +181,7 @@ namespace Subsurface
{
for (int i = 0; i < MapEntity.mapEntityList.Count(); i++)
{
- if (MapEntity.mapEntityList[i].sprite == null || MapEntity.mapEntityList[i].sprite.Depth >= 0.5f)
+ if (MapEntity.mapEntityList[i].Sprite == null || MapEntity.mapEntityList[i].Sprite.Depth >= 0.5f)
MapEntity.mapEntityList[i].Draw(spriteBatch, editing);
}
}
@@ -603,7 +603,7 @@ namespace Subsurface
subBody = new SubmarineBody(this);
- MapEntity.LinkAll();
+ MapEntity.OnMapLoaded();
foreach (Item item in Item.itemList)
{
diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs
index 2261bea12..bcfca1136 100644
--- a/Subsurface/Source/Map/WayPoint.cs
+++ b/Subsurface/Source/Map/WayPoint.cs
@@ -48,7 +48,7 @@ namespace Subsurface
linkedTo = new ObservableCollection();
idCardTags = new string[0];
- mapEntityList.Add(this);
+ InsertToList();
WayPointList.Add(this);
}
diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs
index 986e32237..81fd3e84b 100644
--- a/Subsurface/Source/Networking/GameServer.cs
+++ b/Subsurface/Source/Networking/GameServer.cs
@@ -436,9 +436,6 @@ namespace Subsurface.Networking
userID = inc.ReadInt32();
userPassword = inc.ReadString();
version = inc.ReadString();
-#if DEBUG
- version = GameMain.Version.ToString();
-#endif
packageName = inc.ReadString();
packageHash = inc.ReadString();
name = inc.ReadString();
@@ -450,6 +447,8 @@ namespace Subsurface.Networking
return;
}
+#if !DEBUG
+
if (userPassword != password)
{
inc.SenderConnection.Deny("Wrong password!");
@@ -481,6 +480,8 @@ namespace Subsurface.Networking
return;
}
+#endif
+
//existing user re-joining
if (userID > 0)
{
diff --git a/Subsurface/Source/Physics/PhysicsBody.cs b/Subsurface/Source/Physics/PhysicsBody.cs
index 828f3b699..acb4e5834 100644
--- a/Subsurface/Source/Physics/PhysicsBody.cs
+++ b/Subsurface/Source/Physics/PhysicsBody.cs
@@ -226,6 +226,8 @@ namespace Subsurface
body.CollidesWith = Physics.CollisionWall;
body.Friction = ToolBox.GetAttributeFloat(element, "friction", 0.3f);
+ body.Restitution = 0.05f;
+
body.BodyType = BodyType.Dynamic;
//body.AngularDamping = Limb.LimbAngularDamping;
@@ -307,9 +309,14 @@ namespace Subsurface
UpdateDrawPosition();
SpriteEffects spriteEffect = (dir == 1.0f) ? SpriteEffects.None : SpriteEffects.FlipHorizontally;
+
+ if (GameMain.DebugDraw && !body.Awake)
+ {
+ color = Color.Blue;
+ }
sprite.Draw(spriteBatch, new Vector2(drawPosition.X, -drawPosition.Y), color, -drawRotation, 1.0f, spriteEffect, depth);
-
+
//prevPosition = body.Position;
//prevRotation = body.Rotation;
}
diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs
index 83e81e44b..9d88a2f84 100644
--- a/Subsurface/Source/Screens/GameScreen.cs
+++ b/Subsurface/Source/Screens/GameScreen.cs
@@ -3,6 +3,7 @@ using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Subsurface.Lights;
+using System.Diagnostics;
namespace Subsurface
{
@@ -57,8 +58,15 @@ namespace Subsurface
//http://gafferongames.com/game-physics/fix-your-timestep/
Physics.accumulator += deltaTime;
+ Stopwatch sw = new Stopwatch();
+ sw.Start();
+
AmbientSoundManager.Update();
+ sw.Stop();
+ Debug.WriteLine("************** abupdate: "+sw.ElapsedTicks);
+ sw.Restart();
+
//if (Game1.GameSession != null && Game1.GameSession.Level != null)
//{
// Vector2 targetMovement = Vector2.Zero;
@@ -73,17 +81,38 @@ namespace Subsurface
if (GameMain.GameSession!=null) GameMain.GameSession.Update((float)deltaTime);
//EventManager.Update(gameTime);
+ sw.Stop();
+ Debug.WriteLine("gamesession update: " + sw.ElapsedTicks);
+ sw.Restart();
+
Character.UpdateAll(cam, (float)deltaTime);
- BackgroundSpriteManager.Update((float)deltaTime);
+ sw.Stop();
+ Debug.WriteLine("characterupdate: " + sw.ElapsedTicks);
+ sw.Restart();
+
+ BackgroundSpriteManager.Update(cam, (float)deltaTime);
+
+ sw.Stop();
+ Debug.WriteLine("bgsprite: " + sw.ElapsedTicks);
+ sw.Restart();
GameMain.ParticleManager.Update((float)deltaTime);
+ sw.Stop();
+ Debug.WriteLine("particlemanager: " + sw.ElapsedTicks);
+ sw.Restart();
+
StatusEffect.UpdateAll((float)deltaTime);
+
+ sw.Stop();
+ Debug.WriteLine("statuseff: " + sw.ElapsedTicks);
+
Physics.accumulator = Math.Min(Physics.accumulator, Physics.step * 4);
while (Physics.accumulator >= Physics.step)
{
+ sw.Restart();
cam.MoveCamera((float)Physics.step);
foreach (PhysicsBody pb in PhysicsBody.list)
@@ -93,8 +122,16 @@ namespace Subsurface
MapEntity.UpdateAll(cam, (float)Physics.step);
+ sw.Stop();
+ Debug.WriteLine(" mapentity: " + sw.ElapsedTicks);
+ sw.Restart();
+
Character.UpdateAnimAll((float)Physics.step);
+ sw.Stop();
+ Debug.WriteLine(" char: " + sw.ElapsedTicks);
+ sw.Restart();
+
Ragdoll.UpdateAll((float)Physics.step);
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
@@ -102,8 +139,16 @@ namespace Subsurface
GameMain.GameSession.Submarine.Update((float)Physics.step);
}
+ sw.Stop();
+ Debug.WriteLine(" sub: " + sw.ElapsedTicks);
+ sw.Restart();
+
GameMain.World.Step((float)Physics.step);
+ sw.Stop();
+ Debug.WriteLine(" worldstep: " + sw.ElapsedTicks);
+ sw.Restart();
+
Level.AfterWorldStep();
Physics.accumulator -= Physics.step;
@@ -146,7 +191,7 @@ namespace Subsurface
public void DrawMap(GraphicsDevice graphics, SpriteBatch spriteBatch)
{
GameMain.LightManager.DrawLightmap(graphics, spriteBatch, cam);
-
+
//----------------------------------------------------------------------------------------
//1. draw the background, characters and the parts of the submarine that are behind them
//----------------------------------------------------------------------------------------
@@ -200,7 +245,7 @@ namespace Subsurface
Submarine.DrawBack(spriteBatch);
foreach (Character c in Character.CharacterList) c.Draw(spriteBatch);
-
+
spriteBatch.End();
//----------------------------------------------------------------------------------------
@@ -213,10 +258,6 @@ namespace Subsurface
spriteBatch.Draw(renderTarget, new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), new Color(0.75f, 0.8f, 0.9f, 1.0f));
spriteBatch.End();
- BlendState blend = new BlendState();
- blend.AlphaSourceBlend = Blend.One;
- blend.AlphaDestinationBlend = Blend.InverseSourceAlpha;
-
spriteBatch.Begin(SpriteSortMode.Immediate,
BlendState.AlphaBlend,
null, DepthStencilState.DepthRead, null, null,
@@ -258,7 +299,7 @@ namespace Subsurface
}
Hull.renderer.Render(graphics, cam, renderTargetAir, Cam.ShaderTransform);
-
+
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
{
GameMain.GameSession.Level.Render(graphics, cam);
@@ -285,17 +326,16 @@ namespace Subsurface
Submarine.DrawFront(spriteBatch);
foreach (Character c in Character.CharacterList) c.DrawFront(spriteBatch);
-
- if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
- {
- GameMain.GameSession.Level.Draw(spriteBatch);
- //Game1.GameSession.Level.SetObserverPosition(cam.WorldViewCenter);
- }
+
+ //if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
+ //{
+ // GameMain.GameSession.Level.Draw(spriteBatch);
+ // //Game1.GameSession.Level.SetObserverPosition(cam.WorldViewCenter);
+ //}
spriteBatch.End();
GameMain.LightManager.DrawLOS(graphics, cam, LightManager.ViewPos);
-
}
}
}
diff --git a/Subsurface/Source/Sprite.cs b/Subsurface/Source/Sprite.cs
index 7cf40d378..9ab714479 100644
--- a/Subsurface/Source/Sprite.cs
+++ b/Subsurface/Source/Sprite.cs
@@ -80,9 +80,9 @@ namespace Subsurface
if (!path.EndsWith("/")) path += "/";
}
- file = path + file;
-
- texture = LoadTexture(file);
+ this.file = path + file;
+
+ texture = LoadTexture(this.file);
if (texture == null) return;
diff --git a/Subsurface_Solution.sln b/Subsurface_Solution.sln
index 895b06759..441d727e0 100644
--- a/Subsurface_Solution.sln
+++ b/Subsurface_Solution.sln
@@ -19,6 +19,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher2", "Launcher2\Laun
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrashReporter", "CrashReporter\CrashReporter.csproj", "{6BE950CD-9A34-49C9-939A-786AC89C287E}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D32A29D8-AC7B-4189-B734-8ED9EB4120D0}"
+ ProjectSection(SolutionItems) = preProject
+ Performance1.psess = Performance1.psess
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Android|Any CPU = Android|Any CPU
@@ -396,4 +401,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 4ea7d0b8e..a32fa03b6 100644
Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ
diff --git a/UpgradeLog.htm b/UpgradeLog.htm
new file mode 100644
index 000000000..14f56873d
Binary files /dev/null and b/UpgradeLog.htm differ