From 3b59566b204a221c3bbeb21f114ea26db55bbc6a Mon Sep 17 00:00:00 2001 From: treesgobark Date: Thu, 25 Jan 2024 16:30:15 -0500 Subject: [PATCH 1/2] Added toggle properties for damage dealing and receiving --- .../FlatRedBall/Entities/IDamageArea.cs | 1 + .../FlatRedBall/Entities/IDamageable.cs | 8 ++++++-- .../FlatRedBall/FlatRedBallServices.cs | 2 +- FRBDK/Glue/Glue/SaveClasses/GlueProjectSave.cs | 5 +++-- .../CodeGenerators/DamageDealingCodeGenerator.cs | 15 ++++++++++++++- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageArea.cs b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageArea.cs index 075615ffc..ee690dc70 100644 --- a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageArea.cs +++ b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageArea.cs @@ -9,6 +9,7 @@ public interface IDamageArea : ICollidable { event Action Destroyed; double SecondsBetweenDamage { get; set; } + bool IsDamageDealingEnabled { get; } object DamageDealer { get; } int TeamIndex { get; } diff --git a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs index 997495380..827795cb7 100644 --- a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs +++ b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs @@ -10,6 +10,7 @@ public interface IDamageable { Dictionary DamageAreaLastDamage { get; } int TeamIndex { get; } + bool IsDamageReceivingEnabled { get; } decimal CurrentHealth { get; set; } decimal MaxHealth { get; set; } @@ -30,7 +31,7 @@ public static class DamageableExtensionMethods { /// /// Returns whether the argument IDamageable should take damage from the argument IDamageArea. - /// This returns true if the team indexes are different, ifthe damageable has > 0 CurrentHealth, + /// This returns true if the team indexes are different, if the damageable has > 0 CurrentHealth, /// and if enough time has passed since the last damage was dealt by this particular IDamageArea instance. /// /// The damageable object, typically a Player or Enemy. @@ -38,7 +39,10 @@ public static class DamageableExtensionMethods /// public static bool ShouldTakeDamage(this IDamageable damageable, IDamageArea damageArea) { - if (damageable.TeamIndex == damageArea.TeamIndex || damageable.CurrentHealth <= 0) + if (damageable.TeamIndex == damageArea.TeamIndex + || damageable.CurrentHealth <= 0 + || !damageArea.IsDamageDealingEnabled + || !damageable.IsDamageReceivingEnabled) { return false; } diff --git a/Engines/FlatRedBallXNA/FlatRedBall/FlatRedBallServices.cs b/Engines/FlatRedBallXNA/FlatRedBall/FlatRedBallServices.cs index adedfc931..b19bbc144 100644 --- a/Engines/FlatRedBallXNA/FlatRedBall/FlatRedBallServices.cs +++ b/Engines/FlatRedBallXNA/FlatRedBall/FlatRedBallServices.cs @@ -114,7 +114,7 @@ public object GetService(Type serviceType) public class SyntaxVersionAttribute : Attribute { - public int Version = 51; + public int Version = 52; } public static partial class FlatRedBallServices diff --git a/FRBDK/Glue/Glue/SaveClasses/GlueProjectSave.cs b/FRBDK/Glue/Glue/SaveClasses/GlueProjectSave.cs index 3075a4f61..3b3ea2f9b 100644 --- a/FRBDK/Glue/Glue/SaveClasses/GlueProjectSave.cs +++ b/FRBDK/Glue/Glue/SaveClasses/GlueProjectSave.cs @@ -134,7 +134,8 @@ public enum GluxVersions GumUsesSystemTypes = 49, // Technically this isn't referencing GumCommon project, but it's referencing code from GumCommon GumCommonCodeReferencing = 50, - GumTextSupportsBbCode = 51 + GumTextSupportsBbCode = 51, + DamageDealingToggles = 52 // Stop! If adding an entry here, modify SyntaxVersionAttribute.Version } @@ -143,7 +144,7 @@ public enum GluxVersions #region Versions - public const int LatestVersion = (int)GluxVersions.GumTextSupportsBbCode; + public const int LatestVersion = (int)GluxVersions.DamageDealingToggles; public int FileVersion { get; set; } diff --git a/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs b/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs index 2b368494c..c2065ba77 100644 --- a/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs +++ b/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs @@ -31,7 +31,10 @@ public override void AddInheritedTypesToList(List listToAddTo, IElement #endregion - public static bool UsesDamageV2 => GlueState.Self.CurrentGlueProject.FileVersion >= (int)GlueProjectSave.GluxVersions.DamageableHasHealth; + public static bool UsesDamageV2 => GlueState.Self.CurrentMainProject.IsFrbSourceLinked() + || GlueState.Self.CurrentGlueProject.FileVersion >= (int)GlueProjectSave.GluxVersions.DamageableHasHealth; + public static bool UsesDamageV3 => GlueState.Self.CurrentMainProject.IsFrbSourceLinked() + || GlueState.Self.CurrentGlueProject.FileVersion >= (int)GlueProjectSave.GluxVersions.DamageDealingToggles; public override ICodeBlock GenerateFields(ICodeBlock codeBlock, IElement element) { @@ -70,6 +73,11 @@ public override ICodeBlock GenerateFields(ICodeBlock codeBlock, IElement element codeBlock.Line("public Action RemovedByCollision { get; set; }"); } + + if (UsesDamageV3) + { + codeBlock.Line("public bool IsDamageDealingEnabled { get; set; } = true;"); + } } if (shouldImplementIDamageable) @@ -90,6 +98,11 @@ public override ICodeBlock GenerateFields(ICodeBlock codeBlock, IElement element codeBlock.Line("public decimal CurrentHealth { get; set; }"); codeBlock.Line("public Action Died { get; set; }"); } + + if (UsesDamageV3) + { + codeBlock.Line("public bool IsDamageReceivingEnabled { get; set; } = true;"); + } } } From 153c0c6934402078835fe2d3bfad45a55a4acf8a Mon Sep 17 00:00:00 2001 From: treesgobark Date: Thu, 25 Jan 2024 22:16:19 -0500 Subject: [PATCH 2/2] Added invulnerability time when taking damage to IDamageable --- .../FlatRedBall/Entities/IDamageable.cs | 23 +++++++++++++++---- .../DamageDealingCodeGenerator.cs | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs index 827795cb7..be94da506 100644 --- a/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs +++ b/Engines/FlatRedBallXNA/FlatRedBall/Entities/IDamageable.cs @@ -11,11 +11,14 @@ public interface IDamageable Dictionary DamageAreaLastDamage { get; } int TeamIndex { get; } bool IsDamageReceivingEnabled { get; } + double InvulnerabilityTimeAfterDamage { get; } + double LastDamageTime { get; set; } decimal CurrentHealth { get; set; } + bool IsInvulnerable { get; } decimal MaxHealth { get; set; } /// - /// Event raised before damave is dealt. This event can be used to modify the damage dealt. + /// Event raised before damage is dealt. This event can be used to modify the damage dealt. /// Func ModifyDamageReceived { get; set; } /// @@ -42,7 +45,8 @@ public static bool ShouldTakeDamage(this IDamageable damageable, IDamageArea dam if (damageable.TeamIndex == damageArea.TeamIndex || damageable.CurrentHealth <= 0 || !damageArea.IsDamageDealingEnabled - || !damageable.IsDamageReceivingEnabled) + || !damageable.IsDamageReceivingEnabled + || damageable.IsInvulnerable) { return false; } @@ -52,6 +56,7 @@ public static bool ShouldTakeDamage(this IDamageable damageable, IDamageArea dam // damage area, so deal damage and record the time in the damageAreaLastDamage // dictionary. damageable.DamageAreaLastDamage.Add(damageArea, TimeManager.CurrentScreenTime); + damageable.LastDamageTime = TimeManager.CurrentScreenTime; // Remove the damage area from the dictionary when it is destroyed or else // the Player may accumulate a large collection of damage areas, resulting in @@ -69,6 +74,7 @@ public static bool ShouldTakeDamage(this IDamageable damageable, IDamageArea dam { // If so, update the last damage time. damageable.DamageAreaLastDamage[damageArea] = TimeManager.CurrentScreenTime; + damageable.LastDamageTime = TimeManager.CurrentScreenTime; return true; } else @@ -100,14 +106,21 @@ public static decimal TakeDamage(this IDamageable damageable, IDamageArea damage var modifiedByBoth = damageArea.ModifyDamageDealt?.Invoke(modifiedByDamageable, damageable) ?? modifiedByDamageable; var healthBefore = damageable.CurrentHealth; - + if (modifiedByBoth != 0) { - damageable.CurrentHealth -= modifiedByBoth; + decimal newHealth = damageable.CurrentHealth - modifiedByBoth; + + if (newHealth > damageable.MaxHealth) + { + newHealth = damageable.MaxHealth; + } + + damageable.CurrentHealth = newHealth; } // We used to not raise events when taking 0 damage, but we may want - // to have some kind of logic play when taking 0 damage, likeplay a sound + // to have some kind of logic play when taking 0 damage, like play a sound // effect to indicate that this is not a spot that an enemy can get hit. damageable.ReactToDamageReceived?.Invoke(modifiedByBoth, damageArea); damageArea.ReactToDamageDealt?.Invoke(modifiedByBoth, damageable); diff --git a/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs b/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs index c2065ba77..38232cb95 100644 --- a/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs +++ b/FRBDK/Glue/OfficialPlugins/DamageDealingPlugin/CodeGenerators/DamageDealingCodeGenerator.cs @@ -102,6 +102,9 @@ public override ICodeBlock GenerateFields(ICodeBlock codeBlock, IElement element if (UsesDamageV3) { codeBlock.Line("public bool IsDamageReceivingEnabled { get; set; } = true;"); + codeBlock.Line("public double InvulnerabilityTimeAfterDamage { get; set; } = 0;"); + codeBlock.Line("public bool IsInvulnerable => TimeManager.CurrentScreenSecondsSince(LastDamageTime) < InvulnerabilityTimeAfterDamage;"); + codeBlock.Line("public double LastDamageTime { get; set; } = -999;"); } } }