setup damage types and modifiers as resources
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 10m48s

This commit is contained in:
2026-01-17 14:32:48 +01:00
parent b1e78df6c7
commit 6b97c226f1
16 changed files with 136 additions and 11 deletions

View File

@@ -5,5 +5,5 @@ namespace Movementtests.interfaces;
public interface IDamageMaker
{
[Export]
public RDamage GetDamageDealt { get; set; }
RDamage GetDamageDealt { get; set; }
}

View File

@@ -1,3 +1,5 @@
using Godot;
namespace Movementtests.interfaces;
public interface IDamageable

View File

@@ -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<IDamageable>() : nodes.OfType<IDamageable>().ToArray();
}
}

View File

@@ -0,0 +1 @@
uid://bgnncty7axdwd

View File

@@ -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

View File

@@ -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")]
@@ -1729,7 +1731,8 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback
public void TakeDamage(RDamage damage)
{
GD.Print("Ouch", damage.DamageDealt);
foreach (var damageable in DamageModifiers.ToIDamageables())
damageable.TakeDamage(damage);
}
///////////////////////////

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1 @@
uid://b6y3ugfydvch0

View File

@@ -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);
}
}

View File

@@ -14,6 +14,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);
}
}

View File

@@ -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)

View File

@@ -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")

View File

@@ -4,5 +4,5 @@
[resource]
script = ExtResource("1_h6law")
DamageDealt = 1.0
DamageType = 3
metadata/_custom_type_script = "uid://jitubgv6judn"

View File

@@ -0,0 +1,9 @@
namespace Movementtests.systems.damage;
public enum EDamageTypes
{
Normal,
Fire,
Ice,
Explosion,
}

View File

@@ -0,0 +1 @@
uid://dubmiwfuunxmu