diff --git a/Movement tests.sln.DotSettings.user b/Movement tests.sln.DotSettings.user
index 7ffbec7a..87f55fae 100644
--- a/Movement tests.sln.DotSettings.user
+++ b/Movement tests.sln.DotSettings.user
@@ -1,5 +1,6 @@
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
True
\ No newline at end of file
diff --git a/components/damage/RDamage.cs b/components/damage/RDamage.cs
index e9e0d5ef..f617e06a 100644
--- a/components/damage/RDamage.cs
+++ b/components/damage/RDamage.cs
@@ -6,16 +6,12 @@ using Movementtests.systems.damage;
public partial class RDamage : Resource
{
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
- public float DamageDealt = 1.0f;
+ public float DamageDealt { get; set;}
[Export]
- public EDamageTypes DamageType = EDamageTypes.Normal;
+ public EDamageTypes DamageType { get; set;}
- public RDamage()
- {
- DamageDealt = 1.0f;
- DamageType = EDamageTypes.Normal;
- }
+ public RDamage() : this(1.0f, EDamageTypes.Normal) {}
public RDamage(float damageDealt, EDamageTypes damageType)
{
DamageDealt = damageDealt;
diff --git a/components/damage/RDamageModifier.cs b/components/damage/RDamageModifier.cs
index e51a6b0a..e5aaaf76 100644
--- a/components/damage/RDamageModifier.cs
+++ b/components/damage/RDamageModifier.cs
@@ -9,15 +9,11 @@ public partial class RDamageModifier : Resource, IDamageable
public event Action DamageTaken;
[Export]
- public EDamageTypes DamageType = EDamageTypes.Normal;
+ public EDamageTypes DamageType { get; set;}
[Export]
- public float Modifier = 1.0f;
+ public float Modifier { get; set;}
- public RDamageModifier()
- {
- Modifier = 1.0f;
- DamageType = EDamageTypes.Normal;
- }
+ public RDamageModifier() : this(EDamageTypes.Normal, 1.0f) {}
public RDamageModifier(EDamageTypes damageType, float modifier)
{
Modifier = modifier;
diff --git a/components/health/RHealth.cs b/components/health/RHealth.cs
index cd78f89d..3392d5bd 100644
--- a/components/health/RHealth.cs
+++ b/components/health/RHealth.cs
@@ -6,13 +6,9 @@ using Movementtests.interfaces;
public partial class RHealth : Resource
{
[Export]
- public float StartingHealth = 100.0f;
-
- public RHealth()
- {
- StartingHealth = 100.0f;
- }
+ public float StartingHealth { get; set;}
+ public RHealth() : this(100.0f) {}
public RHealth(float startingHealth)
{
StartingHealth = startingHealth;
diff --git a/components/knockback/RKnockback.cs b/components/knockback/RKnockback.cs
index cfcb1108..5906b358 100644
--- a/components/knockback/RKnockback.cs
+++ b/components/knockback/RKnockback.cs
@@ -6,12 +6,9 @@ using Movementtests.interfaces;
public partial class RKnockback : Resource
{
[Export]
- public float Modifier = 1.0f;
+ public float Modifier { get; set;}
- public RKnockback()
- {
- Modifier = 1.0f;
- }
+ public RKnockback() : this(1.0f) {}
public RKnockback(float modifier)
{
Modifier = modifier;
diff --git a/components/movement/RMovement.cs b/components/movement/RMovement.cs
index fe3645d2..770ba499 100644
--- a/components/movement/RMovement.cs
+++ b/components/movement/RMovement.cs
@@ -14,13 +14,7 @@ public partial class RMovement : Resource
[Export(PropertyHint.Range, "0,20,1,or_greater")]
public float TargetHeight { get; set;}
- public RMovement()
- {
- Speed = 3.0f;
- Acceleration = 1.0f;
- GravityModifier = 1.0f;
- TargetHeight = 10.0f;
- }
+ public RMovement() : this(1.0f, 0.0f, 0.0f, 0.0f) {}
public RMovement(float speed, float acceleration, float gravityModifier, float targetHeight)
{
Speed = speed;
diff --git a/maps/GYMs/enemies.tscn b/maps/GYMs/enemies.tscn
index e4af7790..9b26b9ec 100644
--- a/maps/GYMs/enemies.tscn
+++ b/maps/GYMs/enemies.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=20 format=3 uid="uid://q7uc1h2jpbd2"]
+[gd_scene load_steps=24 format=3 uid="uid://q7uc1h2jpbd2"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_62kkh"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/greybox/m_greybox.tres" id="2_3uydm"]
@@ -7,6 +7,7 @@
[ext_resource type="Script" uid="uid://b4cwruitopcee" path="res://components/health/RDeathEffect.cs" id="5_7m3bq"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="5_8fd2t"]
[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="6_7m3bq"]
+[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://components/movement/RMovement.cs" id="6_ybosk"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="7_caohq"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://components/health/RHealth.cs" id="9_2e4ci"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="9_dmw1t"]
@@ -44,6 +45,19 @@ glow_enabled = true
script = ExtResource("5_7m3bq")
metadata/_custom_type_script = "uid://b4cwruitopcee"
+[sub_resource type="Resource" id="Resource_5fa36"]
+script = ExtResource("6_ybosk")
+metadata/_custom_type_script = "uid://dtpxijlnb2c5"
+
+[sub_resource type="Resource" id="Resource_blhrq"]
+script = ExtResource("6_ybosk")
+metadata/_custom_type_script = "uid://dtpxijlnb2c5"
+
+[sub_resource type="Resource" id="Resource_1hrkh"]
+script = ExtResource("6_ybosk")
+TargetHeight = 5.0
+metadata/_custom_type_script = "uid://dtpxijlnb2c5"
+
[sub_resource type="Resource" id="Resource_ybosk"]
script = ExtResource("9_2e4ci")
StartingHealth = 1.0
@@ -120,22 +134,27 @@ material = ExtResource("2_3uydm")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16.83681)
Target = NodePath("../Player")
DeathEffects = Array[Object]([SubResource("Resource_sysok")])
+RMovement = SubResource("Resource_5fa36")
[node name="Enemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, -16.83681)
Target = NodePath("../Player")
+RMovement = SubResource("Resource_blhrq")
[node name="Enemy3" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -16.83681)
Target = NodePath("../Player")
+RMovement = SubResource("Resource_5fa36")
[node name="FlyingEnemy" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 7, -16)
Target = NodePath("../Player")
+RMovement = SubResource("Resource_1hrkh")
[node name="FlyingEnemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16)
Target = NodePath("../Player")
+RMovement = SubResource("Resource_1hrkh")
[node name="GroundedSpawner" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("6_7m3bq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.5, -15)
diff --git a/maps/city.tscn b/maps/city.tscn
index 5dcb64cd..2ab0d318 100644
--- a/maps/city.tscn
+++ b/maps/city.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=45 format=3 uid="uid://dmkw8cmalm5k"]
+[gd_scene load_steps=50 format=3 uid="uid://dmkw8cmalm5k"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_2vsi6"]
[ext_resource type="Script" uid="uid://blenis2y55fmg" path="res://tools/city_helpers.gd" id="1_qwuk2"]
@@ -27,6 +27,11 @@
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="25_nrosh"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="25_x7fl1"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://components/movement/RMovement.cs" id="26_lu3yt"]
+[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="27_lgco8"]
+[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="28_51ivn"]
+[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="30_3w3wd"]
+[ext_resource type="Resource" uid="uid://bohbojc68j7y1" path="res://scenes/enemies/grounded_enemy/grounded_enemy_health.tres" id="31_5hbxb"]
+[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="32_hmdts"]
[sub_resource type="LabelSettings" id="LabelSettings_2k3fr"]
font_size = 30
@@ -450,11 +455,16 @@ spot_angle_attenuation = 10.556052
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19, 43, -111.5)
EnemyToSpawn = ExtResource("25_x7fl1")
MovementInputs = SubResource("Resource_pxspk")
+HealthInputs = ExtResource("27_lgco8")
+DamageInputs = ExtResource("28_51ivn")
Target = NodePath("../Player")
[node name="Spawner2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("24_qwuk2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 31, 7.5, -88)
EnemyToSpawn = ExtResource("25_nrosh")
+MovementInputs = ExtResource("30_3w3wd")
+HealthInputs = ExtResource("31_5hbxb")
+DamageInputs = ExtResource("32_hmdts")
Target = NodePath("../Player")
[connection signal="timeout" from="TutorialController/WaitToShowBlockingTuto" to="TutorialController" method="_show_weapon_tutorial"]
diff --git a/project.godot b/project.godot
index aebea61e..113e849f 100644
--- a/project.godot
+++ b/project.godot
@@ -15,7 +15,7 @@ warnings/check_invalid_track_paths=false
[application]
config/name="Movement tests"
-run/main_scene="uid://vm22i5sv3p3s"
+run/main_scene="uid://q7uc1h2jpbd2"
config/features=PackedStringArray("4.5", "C#", "Forward Plus")
config/icon="res://icon.svg"
diff --git a/scenes/enemies/Enemy.cs b/scenes/enemies/Enemy.cs
index b72e6137..1b2da965 100644
--- a/scenes/enemies/Enemy.cs
+++ b/scenes/enemies/Enemy.cs
@@ -23,28 +23,24 @@ public partial class Enemy : CharacterBody3D,
[ExportGroup("Health")]
[Export]
- public Node CHealth { get; set; }
- [Export]
public RHealth RHealth { get; set; }
-
[Export]
public RDeathEffect[] DeathEffects { get; set; }
+ public IHealthable CHealth { get; set; }
[ExportGroup("Damage")]
[Export]
- public Node CDamage { get; set; }
- [Export]
public RDamage RDamage { get; set; }
- [Export]
- public Node CKnockback { get; set; }
+ public IDamageable CDamageable { get; set; }
+
[Export]
public RKnockback RKnockback { get; set; }
+ public IKnockbackable CKnockback { get; set; }
[ExportGroup("Movement")]
[Export]
- public Node CMovement { get; set; }
- [Export]
public RMovement RMovement { get; set; }
+ public IMoveable CMovement { get; set; }
// Public stuff
public float CurrentHealth { get; set; }
@@ -62,29 +58,35 @@ public partial class Enemy : CharacterBody3D,
{
_damageBox = GetNode("DamageBox");
- if (CMovement is IMoveable moveable && RMovement != null) moveable.RMovement = RMovement;
- if (CHealth is IHealthable healthable && RHealth != null)
+ CDamageable = GetNode("CDamageable") as IDamageable;
+ CMovement = GetNode("CMovement") as IMoveable;
+ CHealth = GetNode("CHealth") as IHealthable;
+ CKnockback = GetNode("CKnockback") as IKnockbackable;
+ if (CDamageable is null) GD.PrintErr("This node needs a 'CDamage' child of type IDamageable!");
+ if (CMovement is null) GD.PrintErr("This node needs a 'CMovement' child of type IMoveable!");
+ if (CHealth is null) GD.PrintErr("This node needs a 'CHealth' child of type IHealthable!");
+ if (CKnockback is null) GD.PrintErr("This node needs a 'CKnockback' child of type IKnockbackable!");
+
+ if (RMovement != null) CMovement!.RMovement = RMovement;
+ if (RHealth != null)
{
- healthable.RHealth = RHealth;
- healthable.CurrentHealth = RHealth.StartingHealth;
+ CHealth!.RHealth = RHealth;
+ CHealth.CurrentHealth = RHealth.StartingHealth;
}
- if (CKnockback is IKnockbackable knockbackable && RKnockback != null) knockbackable.RKnockback = RKnockback;
+ if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
}
public void SetupSignals()
{
- if (CDamage is IDamageable damageable)
- {
- damageable.DamageTaken += ReduceHealth;
- damageable.DamageTaken += RegisterKnockback;
- }
- if (CHealth is IHealthable healthable) healthable.HealthDepleted += Kill;
+ CDamageable.DamageTaken += ReduceHealth;
+ CDamageable.DamageTaken += RegisterKnockback;
+ CHealth.HealthDepleted += Kill;
}
public override void _PhysicsProcess(double delta)
{
- // Only trigger gameplay related effects 4 times per second
- if(Engine.GetPhysicsFrames() % 15 == 0) ProcessGameplay(delta);
+ // Only trigger gameplay related effects on specific frames
+ if(Engine.GetPhysicsFrames() % 10 == 0) ProcessGameplay(delta);
var targetPlanar = new Vector3(Target.GlobalPosition.X, GlobalPosition.Y, Target.GlobalPosition.Z);
LookAt(targetPlanar);
@@ -113,25 +115,25 @@ public partial class Enemy : CharacterBody3D,
public Vector3 ComputeVelocity(MovementInputs inputs)
{
- if (CMovement is not IMoveable movement) return Vector3.Zero;
- return movement!.ComputeVelocity(inputs);
+ if (CMovement is null) return Vector3.Zero;
+ return CMovement.ComputeVelocity(inputs);
}
public DamageRecord TakeDamage(DamageRecord damageRecord)
{
- if (CDamage is not IDamageable damageable)
+ if (CDamageable is null)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
- var finalDamage = damageable.TakeDamage(damageRecord);
+ var finalDamage = CDamageable.TakeDamage(damageRecord);
DamageTaken?.Invoke(this, finalDamage);
return finalDamage;
}
public void ReduceHealth(IDamageable source, DamageRecord damageRecord)
{
- if (CHealth is not IHealthable healthable) return;
- healthable.ReduceHealth(source, damageRecord);
- HealthChanged?.Invoke(this, healthable.CurrentHealth);
+ if (CHealth is null) return;
+ CHealth.ReduceHealth(source, damageRecord);
+ HealthChanged?.Invoke(this, CHealth.CurrentHealth);
}
public void Kill(IHealthable source)
@@ -145,13 +147,13 @@ public partial class Enemy : CharacterBody3D,
public void RegisterKnockback(IDamageable source, DamageRecord damageRecord)
{
- if (CKnockback is not IKnockbackable knockbackable) return;
- knockbackable.RegisterKnockback(source, damageRecord);
+ if (CKnockback is null) return;
+ CKnockback.RegisterKnockback(source, damageRecord);
}
public Vector3 ComputeKnockback()
{
- if (CKnockback is not IKnockbackable knockbackable) return Vector3.Zero;
- return knockbackable.ComputeKnockback();
+ if (CKnockback is null) return Vector3.Zero;
+ return CKnockback.ComputeKnockback();
}
}
diff --git a/scenes/enemies/flying_enemy/flying_enemy.tscn b/scenes/enemies/flying_enemy/flying_enemy.tscn
index b32164b9..9c39874c 100644
--- a/scenes/enemies/flying_enemy/flying_enemy.tscn
+++ b/scenes/enemies/flying_enemy/flying_enemy.tscn
@@ -54,7 +54,7 @@ CDamage = NodePath("CDamageable")
RDamage = ExtResource("2_on7rt")
CKnockback = NodePath("CKnockback")
RKnockback = ExtResource("11_mpa2u")
-CMovement = NodePath("CFlyingMovement")
+CMovement = NodePath("CMovement")
RMovement = ExtResource("4_dejyg")
[node name="CHealth" type="Node" parent="."]
@@ -67,7 +67,7 @@ script = ExtResource("8_uotso")
DamageModifiers = Array[Object]([SubResource("Resource_jnv07"), SubResource("Resource_53j1c")])
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
-[node name="CFlyingMovement" parent="." instance=ExtResource("7_vaeds")]
+[node name="CMovement" parent="." instance=ExtResource("7_vaeds")]
RMovement = SubResource("Resource_on7rt")
TerrainCollision = 256
diff --git a/scenes/enemies/grounded_enemy/grounded_enemy.tscn b/scenes/enemies/grounded_enemy/grounded_enemy.tscn
index e99b94ab..b7a0fb0c 100644
--- a/scenes/enemies/grounded_enemy/grounded_enemy.tscn
+++ b/scenes/enemies/grounded_enemy/grounded_enemy.tscn
@@ -49,7 +49,7 @@ CDamage = NodePath("CDamageable")
RDamage = ExtResource("2_bn56u")
CKnockback = NodePath("CKnockback")
RKnockback = ExtResource("11_8k3xb")
-CMovement = NodePath("CGroundedMovement")
+CMovement = NodePath("CMovement")
RMovement = ExtResource("4_na24f")
[node name="CHealth" type="Node" parent="."]
@@ -62,7 +62,7 @@ script = ExtResource("7_1tw73")
DamageModifiers = Array[Object]([SubResource("Resource_qj0ob")])
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
-[node name="CGroundedMovement" parent="." node_paths=PackedStringArray("WallInFrontRayCast") instance=ExtResource("7_qyswd")]
+[node name="CMovement" parent="." node_paths=PackedStringArray("WallInFrontRayCast") instance=ExtResource("7_qyswd")]
RMovement = SubResource("Resource_6d4gl")
WallInFrontRayCast = NodePath("../WallInFrontRayCast")