Various enemy debugging stuff

This commit is contained in:
2025-04-10 02:10:49 -07:00
parent 753ba60f0f
commit 078bfb9e45
15 changed files with 909 additions and 789 deletions

View File

@@ -37,7 +37,7 @@ public partial class BossTypeA : Enemy, IHasPrimaryAttack, IHasSecondaryAttack,
_attackTimer.Start();
}
public new void OnPhysicsProcess(double delta)
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));

View File

@@ -31,7 +31,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
[Export] protected EnemyStatResource _enemyStatResource { get; set; } = default!;
[Export]
protected float _movementSpeed = 2f;
protected float _movementSpeed = 0.5f;
#endregion
#region Node Dependencies
@@ -48,11 +48,13 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
public AutoProp<double> CurrentHP { get; set; }
public string EnemyName;
private float _knockbackStrength = 0.0f;
private Vector3 _knockbackDirection = Vector3.Zero;
private IDamageCalculator _damageCalculator;
private DamageCalculator _damageCalculator;
#region Godot methods
public void Setup()
@@ -98,7 +100,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
_enemyModelView.SetCurrentDirection(GlobalBasis, -_player.CurrentBasis.Z);
if (_enemyModelView is EnemyModelView2D enemyModelView2D)
if (_enemyModelView is EnemyModelView2D)
{
if (_enemyLogic.Value is EnemyLogic.State.Patrolling or EnemyLogic.State.FollowPlayer)
_enemyModelView.PlayWalkAnimation();
@@ -119,8 +121,8 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
public virtual void Move(Vector3 velocity)
{
_knockbackStrength = _knockbackStrength * 0.9f;
Velocity = velocity + (_knockbackDirection * _knockbackStrength);
_knockbackStrength *= 0.9f;
Velocity = velocity * _movementSpeed + (_knockbackDirection * _knockbackStrength);
MoveAndSlide();
}
@@ -162,6 +164,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
public virtual void Die()
{
SetProcess(false);
_movementSpeed = 0;
CurrentHP.OnNext(0);
_enemyLogic.Input(new EnemyLogic.Input.EnemyDefeated());
_collisionShape.SetDeferred("disabled", true);

View File

@@ -1,6 +1,8 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Godot;
using System.Linq;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
@@ -173,14 +175,23 @@ public partial class EnemyModelView2D : Node3D, IEnemyModelView
private void LoadShader(string shaderPath)
{
var shader = GD.Load<Shader>(shaderPath);
AnimatedSprite.Material = new ShaderMaterial();
var shaderMaterial = (ShaderMaterial)AnimatedSprite.Material;
shaderMaterial.Shader = shader;
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
sprite.Material = new ShaderMaterial();
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.Shader = shader;
}
}
private void SetShaderValue(float shaderValue)
{
var shaderMaterial = (ShaderMaterial)AnimatedSprite.Material;
shaderMaterial.SetShaderParameter("progress", shaderValue);
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.SetShaderParameter("progress", shaderValue);
}
}
}

View File

@@ -1,9 +1,3 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://x2bv1q51mcjq"]
[ext_resource type="Shader" path="res://src/vfx/shaders/PixelMelt.gdshader" id="1_fbp5a"]
[gd_resource type="ShaderMaterial" format=3 uid="uid://x2bv1q51mcjq"]
[resource]
shader = ExtResource("1_fbp5a")
shader_parameter/progress = 0.0
shader_parameter/meltiness = 1.0
shader_parameter/reverse = false

View File

@@ -26,7 +26,7 @@ public partial class FilthEater : Enemy, IHasPrimaryAttack, IHasSecondaryAttack,
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public new void OnPhysicsProcess(double delta)
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));

View File

@@ -1,12 +1,13 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using Zennysoft.Game.Abstractions;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class Chariot : Enemy, IHasPrimaryAttack, ICanActivate
public partial class Chariot : Enemy, IHasPrimaryAttack, ICanActivate, ICanPatrol
{
[Export]
public ElementType PrimaryAttackElementalType { get; set; } = ElementType.None;
@@ -15,18 +16,52 @@ public partial class Chariot : Enemy, IHasPrimaryAttack, ICanActivate
[Node] public ChariotModelView EnemyModelView { get; set; } = default;
[Node] private INavigationAgentClient _navigationAgentClient { get; set; } = default!;
private bool _activated = false;
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 4f)
_enemyLogic.Input(new EnemyLogic.Input.StartAttacking());
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) > 45f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) > 25f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
if (_activated)
_movementSpeed = 0;
_navigationAgentClient.CalculateVelocity(GlobalPosition, true);
base._PhysicsProcess(delta);
}
public override void _Process(double delta)
{
if (CurrentHP.Value <= 0)
return;
var lookDir = GlobalPosition + Velocity;
if (!lookDir.IsEqualApprox(GlobalPosition))
LookAt(lookDir, Vector3.Up, true);
_enemyModelView.SetCurrentDirection(GlobalBasis, -_player.CurrentBasis.Z);
if (_enemyModelView is EnemyModelView2D && !_activated)
{
if (Velocity > Vector3.Zero)
_enemyModelView.PlayWalkAnimation();
else
_enemyModelView.PlayIdleAnimation();
}
}
public override void Die()
{
_navigationAgentClient.Stop();
base.Die();
}
public override void TakeAction()
@@ -40,6 +75,21 @@ public partial class Chariot : Enemy, IHasPrimaryAttack, ICanActivate
public void Activate()
{
if (_activated)
return;
EnemyModelView.Activate();
_activated = true;
}
public override void SetTarget(Vector3 target) => _navigationAgentClient.SetTarget(target);
public void Patrol()
{
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomizedSpot = new Vector3(rng.RandfRange(-5.0f, 5.0f), 0, rng.RandfRange(-5.0f, 5.0f));
_enemyLogic.Input(new EnemyLogic.Input.PatrolToRandomSpot(GlobalPosition + randomizedSpot));
_enemyLogic.Input(new EnemyLogic.Input.StartPatrol());
}
}

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=8 format=3 uid="uid://dlw5cvutvypxn"]
[gd_scene load_steps=9 format=3 uid="uid://dlw5cvutvypxn"]
[ext_resource type="Script" uid="uid://djx5x5bhkku85" path="res://src/enemy/enemy_types/06. chariot/Chariot.cs" id="1_hqeyd"]
[ext_resource type="Script" uid="uid://dnkmr0eq1sij0" path="res://src/enemy/EnemyStatResource.cs" id="2_77bk6"]
[ext_resource type="PackedScene" uid="uid://dcm53j3rncxdm" path="res://src/enemy/enemy_types/06. chariot/ChariotModelView.tscn" id="3_q1q0f"]
[ext_resource type="PackedScene" uid="uid://pbnsngx5jvrh" path="res://src/enemy/NavigationAgentClient.tscn" id="4_mdd1w"]
[sub_resource type="Resource" id="Resource_dvne1"]
script = ExtResource("2_77bk6")
@@ -35,7 +36,7 @@ radius = 1.20703
[node name="Chariot" type="CharacterBody3D"]
process_mode = 1
collision_layer = 10
collision_mask = 11
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_x = true
script = ExtResource("1_hqeyd")
@@ -46,10 +47,10 @@ unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="NavAgent" type="NavigationAgent3D" parent="."]
[node name="Navigation" type="Node3D" parent="."]
[node name="NavigationAgentClient" parent="Navigation" instance=ExtResource("4_mdd1w")]
unique_name_in_owner = true
avoidance_enabled = true
debug_path_custom_color = Color(1, 0, 0, 1)
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
@@ -61,16 +62,6 @@ collision_mask = 2
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -2)
shape = SubResource("CylinderShape3D_jbgmx")
[node name="PatrolTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 10.0
autostart = true
[node name="AttackTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 0.8
autostart = true
[node name="Collision" type="Area3D" parent="."]
collision_layer = 2048
collision_mask = 0
@@ -84,3 +75,15 @@ transform = Transform3D(0.999848, 0, 0.0174524, 0, 1, 0, -0.0174524, 0, 0.999848
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
[node name="Timers" type="Node" parent="."]
[node name="PatrolTimer" type="Timer" parent="Timers"]
unique_name_in_owner = true
wait_time = 10.0
autostart = true
[node name="AttackTimer" type="Timer" parent="Timers"]
unique_name_in_owner = true
wait_time = 0.8
autostart = true

File diff suppressed because one or more lines are too long

View File

@@ -33,6 +33,7 @@ axis_lock_angular_z = true
motion_mode = 1
script = ExtResource("1_vw2ww")
_enemyStatResource = ExtResource("2_d665t")
_movementSpeed = 2.0
[node name="NavigationAgentClient" parent="." instance=ExtResource("3_d665t")]
unique_name_in_owner = true

View File

@@ -30,7 +30,7 @@ public partial class ShieldOfHeaven : Enemy, IHasPrimaryAttack, IHasSecondaryAtt
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public new void OnPhysicsProcess(double delta)
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));

View File

@@ -1,27 +1,10 @@
[gd_scene load_steps=8 format=3 uid="uid://5s7c4dsb1wwk"]
[ext_resource type="Script" uid="uid://cjdivu0v1kfhy" path="res://src/enemy/enemy_types/12. Shield of Heaven/ShieldOfHeaven.cs" id="1_ips1f"]
[ext_resource type="Script" uid="uid://dnkmr0eq1sij0" path="res://src/enemy/EnemyStatResource.cs" id="2_oxa5b"]
[ext_resource type="Resource" uid="uid://c5fgcsruq5gx6" path="res://src/enemy/enemy_types/12. Shield of Heaven/ShieldOfHeavenStats.tres" id="2_oxa5b"]
[ext_resource type="PackedScene" uid="uid://pbnsngx5jvrh" path="res://src/enemy/NavigationAgentClient.tscn" id="3_d5a6t"]
[ext_resource type="PackedScene" uid="uid://drkaq6grim1fb" path="res://src/enemy/enemy_types/12. Shield of Heaven/ShieldModelView.tscn" id="3_r2swr"]
[sub_resource type="Resource" id="Resource_r2swr"]
script = ExtResource("2_oxa5b")
CurrentHP = 100.0
MaximumHP = 100
CurrentAttack = 10
CurrentDefense = 10
MaxAttack = 10
MaxDefense = 10
ExpFromDefeat = 0
Luck = 0.05
_telluricResistance = 0.0
_aeolicResistance = 0.0
_hydricResistance = 0.0
_igneousResistance = 0.0
_ferrumResistance = 0.0
DropsSoulGemChance = 0.75
metadata/_custom_type_script = "uid://dnkmr0eq1sij0"
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 0.226425
height = 2.02807
@@ -40,19 +23,15 @@ collision_mask = 11
axis_lock_linear_y = true
axis_lock_angular_x = true
script = ExtResource("1_ips1f")
_enemyStatResource = SubResource("Resource_r2swr")
_enemyStatResource = ExtResource("2_oxa5b")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="NavAgent" type="NavigationAgent3D" parent="."]
[node name="NavigationAgentClient" parent="." instance=ExtResource("3_d5a6t")]
unique_name_in_owner = true
path_max_distance = 3.01
simplify_path = true
avoidance_enabled = true
radius = 2.0
debug_path_custom_color = Color(1, 0, 0, 1)
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true

View File

@@ -13,7 +13,7 @@ public partial class GoldSproingy : Enemy
SetPhysicsProcess(true);
}
public new void OnPhysicsProcess(double delta)
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
}

View File

@@ -36,8 +36,8 @@ public partial class EnemyLogic
var enemy = Get<IEnemy>();
if (enemy is IHasRangedAttack rangedAttacker)
rangedAttacker.RangedAttack();
if (enemy is Chinthe chinthe)
chinthe.Activate();
if (enemy is ICanActivate canActivate)
canActivate.Activate();
return To<FollowPlayer>();
}
}