diff --git a/forge/ForgeEntityNode.cs b/forge/ForgeEntityNode.cs index e8f2b486..e851f535 100644 --- a/forge/ForgeEntityNode.cs +++ b/forge/ForgeEntityNode.cs @@ -22,9 +22,9 @@ public partial class ForgeEntityNode : Node3D, IForgeEntity public override void _Notification(int what) => this.Notify(what); [Dependency] - public TagsManager TagsManager => this.DependOn(); + public TagsManager TagsManager => this.DependOn(() => ForgeManagers.Instance.TagsManager); [Dependency] - public CuesManager CuesManager => this.DependOn(); + public CuesManager CuesManager => this.DependOn(() => ForgeManagers.Instance.CuesManager); [Export] public ForgeTagContainer? BaseTags { get; set; } diff --git a/forge/abilities/ForgeExplodingSwordBehavior.cs b/forge/abilities/ForgeExplodingSwordBehavior.cs index 806eeb55..ff80a48c 100644 --- a/forge/abilities/ForgeExplodingSwordBehavior.cs +++ b/forge/abilities/ForgeExplodingSwordBehavior.cs @@ -31,7 +31,7 @@ public class ExplodingSwordBehavior(PackedScene explosion, float radius) : IAbil } explo.Radius = radius; - owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explo); + owner.GetTree().GetCurrentScene().CallDeferred(Node.MethodName.AddChild, explo); explo.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition); context.AbilityHandle.CommitAbility(); diff --git a/forge/abilities/ForgeSimpleHitBehavior.cs b/forge/abilities/ForgeSimpleHitBehavior.cs index ee153341..fcf9f196 100644 --- a/forge/abilities/ForgeSimpleHitBehavior.cs +++ b/forge/abilities/ForgeSimpleHitBehavior.cs @@ -6,7 +6,7 @@ using Godot; namespace Movementtests.forge.abilities; -public record SimpleHitEffectData(Vector3 SourceLocation, Vector3 TargetLocation); +public record SimpleHitEffectData(Vector3 SourceLocation, Vector3 TargetLocation, float Magnitude = 1); public class SimpleHitBehavior(ForgeEffectData? damage) : IAbilityBehavior { @@ -16,9 +16,10 @@ public class SimpleHitBehavior(ForgeEffectData? damage) : IAbilityBehavior var sourceLocation = (context.Source as Node3D)?.GlobalPosition ?? Vector3.Zero; var targetLocation = (context.Target as Node3D)?.GlobalPosition ?? Vector3.Zero; - + + var magnitude = context.Magnitude == 0 ? 1 : context.Magnitude; var effect = new Effect(damage.GetEffectData(), new EffectOwnership(context.Owner, context.Owner)); - context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation)); + context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation, magnitude)); // context.InstanceHandle.End(); } diff --git a/forge/attribute_sets/MetaAttributeSet.cs b/forge/attribute_sets/MetaAttributeSet.cs index ab938d76..8d1602e6 100644 --- a/forge/attribute_sets/MetaAttributeSet.cs +++ b/forge/attribute_sets/MetaAttributeSet.cs @@ -4,9 +4,11 @@ namespace Movementtests.scenes.enemies; public class MetaAttributeSet : AttributeSet { public EntityAttribute IncomingDamage { get; private set; } + public EntityAttribute Level { get; private set; } public MetaAttributeSet() { IncomingDamage = InitializeAttribute(nameof(IncomingDamage), 0, 0, 1000, channels: 4); + Level = InitializeAttribute(nameof(Level), 1, 1, 1000); } } \ No newline at end of file diff --git a/forge/calculators/DamageType.cs b/forge/calculators/DamageType.cs index 301beb72..81de1081 100644 --- a/forge/calculators/DamageType.cs +++ b/forge/calculators/DamageType.cs @@ -2,18 +2,8 @@ namespace Movementtests.tools.calculators; public enum DamageType { - /// - /// Physical damage. - /// Physical = 0, - - /// - /// Magical damage. - /// Magical = 1, - - /// - /// Elemental damage. - /// Elemental = 2, + Explosive = 3, } \ No newline at end of file diff --git a/forge/calculators/ForgeDamageExecution.cs b/forge/calculators/ForgeDamageExecution.cs index 8b769039..4b907f29 100644 --- a/forge/calculators/ForgeDamageExecution.cs +++ b/forge/calculators/ForgeDamageExecution.cs @@ -11,6 +11,7 @@ using Gamesmiths.Forge.Godot.Resources; using Gamesmiths.Forge.Godot.Resources.Calculators; using Gamesmiths.Forge.Tags; using Godot; +using Movementtests.forge.abilities; namespace Movementtests.tools.calculators; @@ -64,9 +65,9 @@ public class DamageExecution : CustomExecution return [.. results]; } - if (effectEvaluatedData?.TryGetContextData(out float multiplier) == true) + if (effectEvaluatedData?.TryGetContextData(out SimpleHitEffectData? hitEffectData) == true) { - targetIncomingDamage *= multiplier; + targetIncomingDamage *= hitEffectData.Magnitude; } // Apply health reduction to target if attribute exists diff --git a/forge/resources/ability_datas/explosion_hit.tres b/forge/resources/ability_datas/explosion_hit.tres new file mode 100644 index 00000000..ae0f925d --- /dev/null +++ b/forge/resources/ability_datas/explosion_hit.tres @@ -0,0 +1,113 @@ +[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://nns16d5uhtl8"] + +[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_w36j6"] +[ext_resource type="Resource" uid="uid://sn6kndc6ukic" path="res://forge/resources/tag_containers/on_damage_dealt.tres" id="2_3ma4g"] +[ext_resource type="Resource" uid="uid://5tr54q0rdpho" path="res://forge/resources/tag_containers/on_damage_taken.tres" id="3_kyfqu"] +[ext_resource type="Script" uid="uid://cfx62w40nd84v" path="res://forge/calculators/ForgeDamageExecution.cs" id="4_xfamx"] +[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://scenes/components/knockback/RKnockback.cs" id="5_tw4gc"] +[ext_resource type="Resource" uid="uid://bhn27s8ne0uyg" path="res://forge/resources/tag_containers/on_knockback_dealt.tres" id="6_nq3a0"] +[ext_resource type="Resource" uid="uid://bkr6uu57wm3o3" path="res://forge/resources/tag_containers/on_knockback_received.tres" id="7_3utx7"] +[ext_resource type="Resource" uid="uid://45l7vnfs72b" path="res://forge/resources/tag_containers/knockbackable_tag.tres" id="8_7hfxb"] +[ext_resource type="Script" uid="uid://diondfg5xp78h" path="res://forge/calculators/ForgeKnockbackExecution.cs" id="9_lysxe"] +[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="10_sd7ih"] +[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="11_bs6rs"] +[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="12_a6jts"] +[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="13_c85am"] +[ext_resource type="Texture2D" uid="uid://c2akxlg7tdb67" path="res://assets/ui/IconGodotNode/node/icon_projectile.png" id="14_ow2i8"] +[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="15_ki7ct"] +[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="16_hhyju"] + +[sub_resource type="Resource" id="Resource_vy8wr"] +script = ExtResource("4_xfamx") +DamageType = 3 +DamageDealerEventTags = ExtResource("2_3ma4g") +DamageReceiverEventTags = ExtResource("3_kyfqu") +metadata/_custom_type_script = "uid://cfx62w40nd84v" + +[sub_resource type="Resource" id="Resource_ndb8p"] +script = ExtResource("5_tw4gc") +Modifier = 100.0 +metadata/_custom_type_script = "uid://b44cse62qru7j" + +[sub_resource type="Resource" id="Resource_dy671"] +script = ExtResource("9_lysxe") +KnockbackableTag = ExtResource("8_7hfxb") +Knockback = SubResource("Resource_ndb8p") +KnockbackDealerEventTags = ExtResource("6_nq3a0") +KnockbackReceiverEventTags = ExtResource("7_3utx7") +metadata/_custom_type_script = "uid://diondfg5xp78h" + +[sub_resource type="Resource" id="Resource_i0sj3"] +script = ExtResource("10_sd7ih") +BaseValue = 1 + +[sub_resource type="Resource" id="Resource_1mvp7"] +script = ExtResource("11_bs6rs") +BaseValue = 1.0 + +[sub_resource type="Resource" id="Resource_jxdlf"] +script = ExtResource("11_bs6rs") + +[sub_resource type="Resource" id="Resource_rslib"] +script = ExtResource("11_bs6rs") + +[sub_resource type="Resource" id="Resource_3l3du"] +script = ExtResource("11_bs6rs") +BaseValue = 1.0 + +[sub_resource type="Resource" id="Resource_qqpg8"] +script = ExtResource("11_bs6rs") +BaseValue = 10.0 + +[sub_resource type="Resource" id="Resource_igmn0"] +script = ExtResource("11_bs6rs") + +[sub_resource type="Resource" id="Resource_acqnn"] +script = ExtResource("11_bs6rs") +BaseValue = 50.0 +metadata/_custom_type_script = "uid://cn3b4ya15fg7e" + +[sub_resource type="Resource" id="Resource_xwtie"] +script = ExtResource("12_a6jts") +Attribute = "MetaAttributeSet.IncomingDamage" +CalculationType = 1 +ScalableFloat = SubResource("Resource_acqnn") +CapturedAttribute = "MetaAttributeSet.Level" +Coefficient = SubResource("Resource_3l3du") +PreMultiplyAdditiveValue = SubResource("Resource_igmn0") +PostMultiplyAdditiveValue = SubResource("Resource_qqpg8") +CalculatorCoefficient = SubResource("Resource_1mvp7") +CalculatorPreMultiplyAdditiveValue = SubResource("Resource_rslib") +CalculatorPostMultiplyAdditiveValue = SubResource("Resource_jxdlf") +metadata/_custom_type_script = "uid://bdfcavbjyhxxa" + +[sub_resource type="Resource" id="Resource_ikb7l"] +script = ExtResource("10_sd7ih") +BaseValue = 1 + +[sub_resource type="Resource" id="Resource_jdvg8"] +script = ExtResource("13_c85am") +Name = "Explosion hit" +Modifiers = Array[Object]([SubResource("Resource_xwtie")]) +Components = Array[Object]([ExtResource("1_w36j6")]) +Executions = Array[Object]([SubResource("Resource_vy8wr"), SubResource("Resource_dy671")]) +StackLimit = SubResource("Resource_ikb7l") +InitialStack = SubResource("Resource_i0sj3") +Cues = [] +metadata/_custom_type_script = "uid://b83hf13nj37k3" + +[sub_resource type="Resource" id="Resource_ba5lh"] +script = ExtResource("15_ki7ct") +DamageEffect = SubResource("Resource_jdvg8") +Name = "Explostion hit" +Description = "Called by explosion scene" +Icon = ExtResource("14_ow2i8") +metadata/_custom_type_script = "uid://n6efm5o4uxvr" + +[resource] +script = ExtResource("16_hhyju") +Name = "Explosion " +InstancingPolicy = 1 +CooldownEffects = [] +AbilityBehavior = SubResource("Resource_ba5lh") +metadata/_custom_type_script = "uid://dhxfbxh54pyxp" diff --git a/scenes/explosion/Explosion.cs b/scenes/explosion/Explosion.cs index 2ef073f8..db38bfe7 100644 --- a/scenes/explosion/Explosion.cs +++ b/scenes/explosion/Explosion.cs @@ -1,22 +1,42 @@ using Godot; using System; +using System.Linq; +using Chickensoft.AutoInject; +using Chickensoft.Introspection; +using Gamesmiths.Forge.Core; +using Gamesmiths.Forge.Cues; +using Gamesmiths.Forge.Tags; using Movementtests.interfaces; +using Movementtests.tools; -[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_projectile.png")] -public partial class Explosion : Area3D, IDamageDealer +[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_projectile.png"), Meta(typeof(IAutoNode))] +public partial class Explosion : Area3D, IDamageDealer, IProvide { - [Export] public RDamage RDamage { get; set;} - [Export] public float Radius { get; set;} + public override void _Notification(int what) => this.Notify(what); + + [Dependency] + public CuesManager CuesManager => this.DependOn(); + CuesManager IProvide.Value() => CuesManager; + + [Export] public RDamage RDamage { get; set; } + [Export] public float Radius { get; set; } = 1.0f; [Export] public float ExplosionTime { get; set; } = 0.2f; - public override void _Ready() + [Node("CollisionShape3D")] public required CollisionShape3D CollisionShape { get; set; } + [Node("MeshInstance3D")] public required MeshInstance3D CollisionMesh { get; set; } + [Node("ForgeEntityNode")] public required ForgeEntityNode ForgeEntityNode { get; set; } + + public void OnReady() { - var sphereShape = GetNode("CollisionShape3D").Shape as SphereShape3D; - sphereShape!.Radius = Radius; - var sphereMesh = GetNode("MeshInstance3D").Mesh as SphereMesh; - sphereMesh!.Radius = Radius; - sphereMesh!.Height = Radius*2f; + if (CollisionShape.Shape is SphereShape3D sphereShape) sphereShape.Radius = Radius; + if (CollisionMesh.Mesh is not SphereMesh sphereMesh) return; + sphereMesh.Radius = Radius; + sphereMesh.Height = Radius * 2f; + } + public void OnResolved() + { + this.Provide(); GetTree().CreateTimer(ExplosionTime).Timeout += TriggerExplosion; } @@ -25,12 +45,10 @@ public partial class Explosion : Area3D, IDamageDealer var bodies = GetOverlappingBodies(); foreach (var body in bodies) { - if (body is IDamageable damageable) - damageable.TakeDamage(new DamageRecord(GlobalPosition, RDamage)); - if (body is IStunnable stunnable) - stunnable.Stun(); + if (body is not IForgeEntity target) continue; + foreach (var ability in ForgeEntityNode.Abilities.GrantedAbilities.Where(ability => ability.CanActivate(out _, target))) + ability.Activate(out _, target, RDamage.DamageDealt); } - QueueFree(); } } diff --git a/scenes/explosion/explosion.tscn b/scenes/explosion/explosion.tscn index 0054b837..f57d69d7 100644 --- a/scenes/explosion/explosion.tscn +++ b/scenes/explosion/explosion.tscn @@ -2,6 +2,15 @@ [ext_resource type="Script" uid="uid://cnlu64l7oxvv3" path="res://scenes/explosion/Explosion.cs" id="1_82hkh"] [ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_hys74"] +[ext_resource type="Script" uid="uid://rpcbb54q4atx" path="res://forge/ForgeEntityNode.cs" id="3_wikc1"] +[ext_resource type="Script" uid="uid://dps0oef50noil" path="res://addons/forge/nodes/ForgeEffect.cs" id="4_f5lqq"] +[ext_resource type="Resource" uid="uid://nns16d5uhtl8" path="res://forge/resources/ability_datas/explosion_hit.tres" id="5_nphml"] +[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="5_nqbbv"] +[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="8_qslwq"] +[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="10_1ve7p"] +[ext_resource type="Script" uid="uid://72kj3n4lm1em" path="res://addons/forge/resources/components/ForgeGrantAbilityConfig.cs" id="11_l63t1"] +[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="11_nqbbv"] +[ext_resource type="Script" uid="uid://b3wo2uge4ddnj" path="res://addons/forge/resources/components/GrantAbility.cs" id="12_e6gfx"] [sub_resource type="Resource" id="Resource_ffdh3"] script = ExtResource("2_hys74") @@ -19,6 +28,40 @@ transparency = 1 cull_mode = 2 albedo_color = Color(0.9607843, 0.27058825, 0, 0.7176471) +[sub_resource type="Resource" id="Resource_5c2oj"] +script = ExtResource("5_nqbbv") +BaseValue = 1 + +[sub_resource type="Resource" id="Resource_17s7w"] +script = ExtResource("11_l63t1") +AbilityData = ExtResource("5_nphml") +AbilityLevel = SubResource("Resource_5c2oj") +metadata/_custom_type_script = "uid://72kj3n4lm1em" + +[sub_resource type="Resource" id="Resource_pmtlp"] +script = ExtResource("12_e6gfx") +GrantAbilityConfigs = [SubResource("Resource_17s7w")] +metadata/_custom_type_script = "uid://b3wo2uge4ddnj" + +[sub_resource type="Resource" id="Resource_pvvi5"] +script = ExtResource("5_nqbbv") +BaseValue = 1 + +[sub_resource type="Resource" id="Resource_4lkfq"] +script = ExtResource("5_nqbbv") +BaseValue = 1 + +[sub_resource type="Resource" id="Resource_pjqsn"] +script = ExtResource("8_qslwq") +Name = "Grant Explosion Ability" +Modifiers = [] +Components = Array[Object]([SubResource("Resource_pmtlp")]) +Executions = [] +StackLimit = SubResource("Resource_4lkfq") +InitialStack = SubResource("Resource_pvvi5") +Cues = [] +metadata/_custom_type_script = "uid://b83hf13nj37k3" + [node name="Explosion" type="Area3D" unique_id=1876014452] collision_layer = 0 collision_mask = 16 @@ -32,3 +75,23 @@ shape = SubResource("SphereShape3D_82hkh") [node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1864409522] mesh = SubResource("SphereMesh_82hkh") surface_material_override/0 = SubResource("StandardMaterial3D_hys74") + +[node name="ForgeEntityNode" type="Node3D" parent="." unique_id=806020391] +script = ExtResource("3_wikc1") +metadata/_custom_type_script = "uid://rpcbb54q4atx" + +[node name="ForgeEffect" type="Node" parent="ForgeEntityNode" unique_id=2068515708] +script = ExtResource("4_f5lqq") +EffectData = SubResource("Resource_pjqsn") +metadata/_custom_type_script = "uid://dps0oef50noil" + +[node name="ForgeAttributeSet" type="Node" parent="ForgeEntityNode" unique_id=813420941] +script = ExtResource("10_1ve7p") +AttributeSetClass = "MetaAttributeSet" +InitialAttributeValues = Dictionary[String, ExtResource("11_nqbbv")]({ +"IncomingDamage": Object(RefCounted,"script":ExtResource("11_nqbbv"),"Default":0,"Min":0,"Max":1000) +, +"Level": Object(RefCounted,"script":ExtResource("11_nqbbv"),"Default":1,"Min":1,"Max":1000) + +}) +metadata/_custom_type_script = "uid://cxihb42t2mfqi" diff --git a/scenes/player_controller/scripts/PlayerController.cs b/scenes/player_controller/scripts/PlayerController.cs index 742f682b..6579bbb0 100644 --- a/scenes/player_controller/scripts/PlayerController.cs +++ b/scenes/player_controller/scripts/PlayerController.cs @@ -2019,7 +2019,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl explosion.Radius = distanceTraveled; explosion.RDamage.DamageDealt = distanceTraveled; - GetTree().GetRoot().AddChild(explosion); + GetTree().GetCurrentScene().AddChild(explosion); explosion.GlobalPosition = GlobalPosition; }