diff --git a/interfaces/IDamageMaker.cs b/interfaces/IDamageMaker.cs index abc4f1f4..cc49d17e 100644 --- a/interfaces/IDamageMaker.cs +++ b/interfaces/IDamageMaker.cs @@ -5,5 +5,5 @@ namespace Movementtests.interfaces; public interface IDamageMaker { [Export] - public RDamage GetDamageDealt { get; set; } + RDamage GetDamageDealt { get; set; } } \ No newline at end of file diff --git a/interfaces/IDamageable.cs b/interfaces/IDamageable.cs index 4c3a0422..45ff698d 100644 --- a/interfaces/IDamageable.cs +++ b/interfaces/IDamageable.cs @@ -1,3 +1,5 @@ +using Godot; + namespace Movementtests.interfaces; public interface IDamageable diff --git a/interfaces/NodeExtensions.cs b/interfaces/NodeExtensions.cs new file mode 100644 index 00000000..e3c066d4 --- /dev/null +++ b/interfaces/NodeExtensions.cs @@ -0,0 +1,12 @@ +using Godot; +using System.Linq; + +namespace Movementtests.interfaces; + +public static class NodeExtensions +{ + public static IDamageable[] ToIDamageables(this GodotObject[] nodes) + { + return nodes == null ? System.Array.Empty() : nodes.OfType().ToArray(); + } +} \ No newline at end of file diff --git a/interfaces/NodeExtensions.cs.uid b/interfaces/NodeExtensions.cs.uid new file mode 100644 index 00000000..aadb2857 --- /dev/null +++ b/interfaces/NodeExtensions.cs.uid @@ -0,0 +1 @@ +uid://bgnncty7axdwd diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index f54b1929..7b6649c4 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=51 format=3 uid="uid://bei4nhkf8lwdo"] +[gd_scene load_steps=58 format=3 uid="uid://bei4nhkf8lwdo"] [ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"] [ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"] +[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="2_q14ux"] [ext_resource type="Resource" uid="uid://bl5crtu1gkrtr" path="res://systems/inputs/base_mode/base_mode.tres" id="3_cresl"] [ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/base_mode/rotate_y.tres" id="4_rxwoh"] [ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"] +[ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://resource_definitions/RDamageModifier.cs" id="5_q7bng"] [ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://systems/inputs/base_mode/move_left.tres" id="5_q14ux"] [ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://systems/inputs/base_mode/move_right.tres" id="6_q7bng"] [ext_resource type="Script" uid="uid://cwbvxlfvmocc1" path="res://player_controller/Scripts/StairsSystem.cs" id="7_bmt5a"] @@ -43,6 +45,30 @@ [ext_resource type="Texture2D" uid="uid://chvt6g0xn5c2m" path="res://systems/dash/light-ring.jpg" id="32_lgpc8"] [ext_resource type="Script" uid="uid://b4dwolbvt8our" path="res://addons/godot_state_charts/history_state.gd" id="41_ruloh"] +[sub_resource type="Resource" id="Resource_m8gvy"] +script = ExtResource("2_q14ux") +DamageDealt = 3.0 +metadata/_custom_type_script = "uid://jitubgv6judn" + +[sub_resource type="Resource" id="Resource_q14ux"] +script = ExtResource("5_q7bng") +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + +[sub_resource type="Resource" id="Resource_q7bng"] +script = ExtResource("5_q7bng") +DamageType = 1 +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + +[sub_resource type="Resource" id="Resource_jb43f"] +script = ExtResource("5_q7bng") +DamageType = 2 +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + +[sub_resource type="Resource" id="Resource_cmijs"] +script = ExtResource("5_q7bng") +DamageType = 3 +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + [sub_resource type="CapsuleMesh" id="CapsuleMesh_xc2g5"] height = 1.7 @@ -75,6 +101,8 @@ blend_mode = 1 [node name="Player" type="CharacterBody3D"] collision_mask = 272 script = ExtResource("1_poq2x") +GetDamageDealt = SubResource("Resource_m8gvy") +DamageModifiers = Array[Object]([SubResource("Resource_q14ux"), SubResource("Resource_q7bng"), SubResource("Resource_jb43f"), SubResource("Resource_cmijs")]) WalkSpeed = 7.5 AccelerationFloor = 4.0 DecelerationFloor = 3.0 diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index 9695aa45..9b2710e9 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -63,6 +63,8 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback [ExportGroup("Damage")] [Export] public RDamage GetDamageDealt { get; set; } + [Export] + public RDamageModifier[] DamageModifiers { get; set; } [ExportCategory("Movement")] [ExportGroup("Ground")] @@ -1726,10 +1728,11 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition); } } - + public void TakeDamage(RDamage damage) { - GD.Print("Ouch", damage.DamageDealt); + foreach (var damageable in DamageModifiers.ToIDamageables()) + damageable.TakeDamage(damage); } /////////////////////////// diff --git a/resource_definitions/RDamage.cs b/resource_definitions/RDamage.cs index 2f2a6f92..e9e0d5ef 100644 --- a/resource_definitions/RDamage.cs +++ b/resource_definitions/RDamage.cs @@ -1,18 +1,24 @@ using Godot; using System; +using Movementtests.systems.damage; [GlobalClass] public partial class RDamage : Resource { [Export(PropertyHint.Range, "0,10,0.1,or_greater")] - public float DamageDealt; + public float DamageDealt = 1.0f; + + [Export] + public EDamageTypes DamageType = EDamageTypes.Normal; public RDamage() { DamageDealt = 1.0f; + DamageType = EDamageTypes.Normal; } - public RDamage(float damageDealt) + public RDamage(float damageDealt, EDamageTypes damageType) { DamageDealt = damageDealt; + DamageType = damageType; } } diff --git a/resource_definitions/RDamageModifier.cs b/resource_definitions/RDamageModifier.cs new file mode 100644 index 00000000..389b59d5 --- /dev/null +++ b/resource_definitions/RDamageModifier.cs @@ -0,0 +1,37 @@ +using Godot; +using System; +using Movementtests.interfaces; +using Movementtests.systems.damage; + +[GlobalClass] +public partial class RDamageModifier : Resource, IDamageable +{ + [Signal] + delegate void DamageTakenEventHandler(float damage); + + [Export] + public EDamageTypes DamageType = EDamageTypes.Normal; + [Export] + public float Modifier = 1.0f; + + public RDamageModifier() + { + Modifier = 1.0f; + DamageType = EDamageTypes.Normal; + } + public RDamageModifier(EDamageTypes damageType, float modifier) + { + Modifier = modifier; + DamageType = damageType; + } + + public void TakeDamage(RDamage damage) + { + if (damage.DamageType != DamageType) return; + + var finalDamage = damage.DamageDealt * Modifier; + var message = $"Damage of type {DamageType} taken: {finalDamage}"; + GD.Print(message); + EmitSignalDamageTaken(finalDamage); + } +} diff --git a/resource_definitions/RDamageModifier.cs.uid b/resource_definitions/RDamageModifier.cs.uid new file mode 100644 index 00000000..be796947 --- /dev/null +++ b/resource_definitions/RDamageModifier.cs.uid @@ -0,0 +1 @@ +uid://b6y3ugfydvch0 diff --git a/scenes/enemies/FirstEnemy.cs b/scenes/enemies/FirstEnemy.cs index a28446f5..1364c656 100644 --- a/scenes/enemies/FirstEnemy.cs +++ b/scenes/enemies/FirstEnemy.cs @@ -14,6 +14,8 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc [Export] public RDamage GetDamageDealt { get; set; } + [Export] + public RDamageModifier[] DamageModifiers { get; set; } private RayCast3D _wallInFrontRayCast; private Area3D _damageBox; @@ -53,6 +55,7 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc public void TakeDamage(RDamage damage) { - GD.Print("Emotional daaamaaage!", damage.DamageDealt); + foreach (var damageable in DamageModifiers.ToIDamageables()) + damageable.TakeDamage(damage); } } diff --git a/scenes/enemies/FlyingEnemy.cs b/scenes/enemies/FlyingEnemy.cs index 4faec1ec..d8a24e91 100644 --- a/scenes/enemies/FlyingEnemy.cs +++ b/scenes/enemies/FlyingEnemy.cs @@ -13,6 +13,9 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno [Export] public RDamage GetDamageDealt { get; set; } + + [Export] + public RDamageModifier[] DamageModifiers { get; set; } private RayCast3D _groundDistanceRaycast; private Area3D _damageBox; @@ -83,6 +86,7 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno public void TakeDamage(RDamage damage) { - GD.Print("Oh no I'm falling!", damage.DamageDealt); + foreach (var damageable in DamageModifiers.ToIDamageables()) + damageable.TakeDamage(damage); } } diff --git a/scenes/enemies/first_enemy.tscn b/scenes/enemies/first_enemy.tscn index 0911bf17..8301c53e 100644 --- a/scenes/enemies/first_enemy.tscn +++ b/scenes/enemies/first_enemy.tscn @@ -1,6 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://dxt0e2ugmttqq"] +[gd_scene load_steps=9 format=3 uid="uid://dxt0e2ugmttqq"] [ext_resource type="Script" uid="uid://bn7sc6id7n166" path="res://scenes/enemies/FirstEnemy.cs" id="1_4yfjf"] +[ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://resource_definitions/RDamageModifier.cs" id="2_ylcc3"] + +[sub_resource type="Resource" id="Resource_gsmti"] +script = ExtResource("2_ylcc3") +metadata/_custom_type_script = "uid://b6y3ugfydvch0" [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_62kkh"] @@ -22,6 +27,7 @@ size = Vector3(1, 2, 2) collision_layer = 16 collision_mask = 273 script = ExtResource("1_4yfjf") +DamageModifiers = Array[Object]([SubResource("Resource_gsmti")]) [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) diff --git a/scenes/enemies/flying_enemy.tscn b/scenes/enemies/flying_enemy.tscn index 862f61ae..521323f9 100644 --- a/scenes/enemies/flying_enemy.tscn +++ b/scenes/enemies/flying_enemy.tscn @@ -1,6 +1,17 @@ -[gd_scene load_steps=7 format=3 uid="uid://cmlud1hwkd6sv"] +[gd_scene load_steps=10 format=3 uid="uid://cmlud1hwkd6sv"] [ext_resource type="Script" uid="uid://cmvep0qi7qlvf" path="res://scenes/enemies/FlyingEnemy.cs" id="1_b46rq"] +[ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://resource_definitions/RDamageModifier.cs" id="2_1bsgx"] + +[sub_resource type="Resource" id="Resource_2pnje"] +script = ExtResource("2_1bsgx") +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + +[sub_resource type="Resource" id="Resource_1bsgx"] +script = ExtResource("2_1bsgx") +DamageType = 1 +Modifier = 2.0 +metadata/_custom_type_script = "uid://b6y3ugfydvch0" [sub_resource type="SphereShape3D" id="SphereShape3D_b46rq"] @@ -23,6 +34,7 @@ collision_layer = 16 collision_mask = 273 motion_mode = 1 script = ExtResource("1_b46rq") +DamageModifiers = Array[Object]([SubResource("Resource_2pnje"), SubResource("Resource_1bsgx")]) [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("SphereShape3D_b46rq") diff --git a/scenes/enemies/flying_enemy_damage.tres b/scenes/enemies/flying_enemy_damage.tres index 2756be0f..b7392a03 100644 --- a/scenes/enemies/flying_enemy_damage.tres +++ b/scenes/enemies/flying_enemy_damage.tres @@ -4,5 +4,5 @@ [resource] script = ExtResource("1_h6law") -DamageDealt = 1.0 +DamageType = 3 metadata/_custom_type_script = "uid://jitubgv6judn" diff --git a/systems/damage/EDamageTypes.cs b/systems/damage/EDamageTypes.cs new file mode 100644 index 00000000..528725ec --- /dev/null +++ b/systems/damage/EDamageTypes.cs @@ -0,0 +1,9 @@ +namespace Movementtests.systems.damage; + +public enum EDamageTypes +{ + Normal, + Fire, + Ice, + Explosion, +} \ No newline at end of file diff --git a/systems/damage/EDamageTypes.cs.uid b/systems/damage/EDamageTypes.cs.uid new file mode 100644 index 00000000..57a02887 --- /dev/null +++ b/systems/damage/EDamageTypes.cs.uid @@ -0,0 +1 @@ +uid://dubmiwfuunxmu