Fix ambassador walk animations to only move while moving arms, fix attack animation hitboxes for them too

Make Chinthe check for safe landing zone before teleporting behind player
Adjust size of Palan/Agni/Shield
This commit is contained in:
2026-03-04 19:26:45 -08:00
parent 70f9807b6c
commit 2c26d6f548
12 changed files with 971 additions and 635 deletions

View File

@@ -3,6 +3,7 @@ using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
using Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
@@ -70,7 +71,9 @@ public partial class Chinthe : Enemy2D, IHaveEngagePlayerBehavior, IHaveFollowBe
var dot = _player.GlobalBasis.Z.Dot(GlobalBasis.Z);
var currentDirection = GlobalBasis.Z.Normalized();
var amountToTeleportBy = dot > 0 ? 5 : -5;
GlobalPosition = GlobalPosition + new Vector3(amountToTeleportBy * targetPosition.X, 0, amountToTeleportBy * targetPosition.Z);
var target = GlobalPosition + new Vector3(amountToTeleportBy * targetPosition.X, 0, amountToTeleportBy * targetPosition.Z);
var safeSpot = NavigationServer3D.MapGetClosestPoint(NavigationServer3D.GetMaps().Single(), target);
GlobalPosition = new Vector3(safeSpot.X, 0, safeSpot.Z);
ResetPhysicsInterpolation();
}

View File

@@ -25,8 +25,8 @@ public partial class Ambassador : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye
FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
PatrolBehavior.OnVelocityComputed += OnAmbassadorVelocityComputed;
FollowBehavior.OnVelocityComputed += OnAmbassadorVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
@@ -37,6 +37,7 @@ public partial class Ambassador : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye
public void OnResolved()
{
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
_enemyLogic.Input(new EnemyLogic.Input.Move());
}
public override void PerformAction()
@@ -46,4 +47,22 @@ public partial class Ambassador : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
options[(int)selection].Invoke();
}
public override void _Process(double delta)
{
}
public void OnAmbassadorVelocityComputed(Vector3 safeVelocity)
{
Velocity = safeVelocity;
if (Velocity.Length() > 0.15f)
EnemyModelView.PlayWalkAnimation();
else
EnemyModelView.PlayIdleAnimation();
LookAtTarget(safeVelocity);
if (((EnemyModelView)EnemyModelView).CanMove)
MoveAndSlide();
}
}

View File

@@ -1169,6 +1169,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.0333333),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_o5mvi"]
resource_name = "idle_back"
@@ -1252,6 +1264,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_7j3of"]
resource_name = "idle_front"
@@ -1335,6 +1359,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_a705x"]
resource_name = "idle_left"
@@ -1418,6 +1454,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_vm8m6"]
resource_name = "idle_right"
@@ -1501,6 +1549,18 @@ tracks/2/keys = {
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_u0g5s"]
resource_name = "primary_attack"
@@ -2073,6 +2133,7 @@ collision_mask = 64
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.189337, 0.217529, -1.45579)
shape = SubResource("BoxShape3D_53wuj")
disabled = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true

View File

@@ -1184,6 +1184,18 @@ tracks/3/keys = {
"update": 1,
"values": [true]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:CanMove")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_o5mvi"]
resource_name = "idle_back"
@@ -1267,6 +1279,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_7j3of"]
resource_name = "idle_front"
@@ -1350,6 +1374,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_a705x"]
resource_name = "idle_left"
@@ -1433,6 +1469,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_vm8m6"]
resource_name = "idle_right"
@@ -1516,6 +1564,18 @@ tracks/2/keys = {
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_u0g5s"]
resource_name = "primary_attack"
@@ -1983,6 +2043,7 @@ states/Idle/position = Vector2(375, 100)
states/Walking/node = ExtResource("266_0cp06")
states/Walking/position = Vector2(652, 100)
transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_oceba"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_yqco6"), "Walking", "Idle", SubResource("AnimationNodeStateMachineTransition_ikyxn"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_2y5m2"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_dyptf"), "Walking", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_7vwa6"), "Idle", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_i3uxw"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_ig6n6"), "Secondary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_8fqp0")]
graph_offset = Vector2(-132, 68)
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_a8qtn")

View File

@@ -1173,6 +1173,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_o5mvi"]
resource_name = "idle_back"
@@ -1256,6 +1268,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_7j3of"]
resource_name = "idle_front"
@@ -1339,6 +1363,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_a705x"]
resource_name = "idle_left"
@@ -1422,6 +1458,18 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_vm8m6"]
resource_name = "idle_right"
@@ -1505,6 +1553,18 @@ tracks/2/keys = {
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".:CanMove")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.333333, 0.916667, 1.25, 1.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [false, true, false, true, false]
}
[sub_resource type="Animation" id="Animation_u0g5s"]
resource_name = "primary_attack"
@@ -1561,6 +1621,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_s5aqg"]
resource_name = "primary_attack_back"
@@ -1617,6 +1689,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_fmw6u"]
resource_name = "primary_attack_left"
@@ -1673,6 +1757,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_psv15"]
resource_name = "primary_attack_right"
@@ -1729,6 +1825,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_5y02v"]
resource_name = "secondary_attack"
@@ -1785,6 +1893,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_tlm8w"]
resource_name = "secondary_attack_back"
@@ -1841,6 +1961,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_m347f"]
resource_name = "secondary_attack_left"
@@ -1897,6 +2029,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_xe0e6"]
resource_name = "secondary_attack_right"
@@ -1953,6 +2097,18 @@ tracks/3/keys = {
"times": PackedFloat32Array(0)
}
tracks/3/use_blend = true
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Hitbox/CollisionShape3D:disabled")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.583333, 0.75),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_x0ep5"]
_data = {

View File

@@ -2126,7 +2126,8 @@ EnemyLoreInfo = SubResource("Resource_f45wt")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0250915, 1.985, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0250915, 2.95966, 0)
pixel_size = 0.015
billboard = 2
texture_filter = 0
render_priority = 100

View File

@@ -516,25 +516,17 @@ _data = {
script = ExtResource("1_mm1vd")
[node name="Bullet" type="Node3D" parent="."]
visible = false
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="Bullet"]
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, 0, 0, 0)
visible = false
offset = Vector2(0, 150)
sprite_frames = SubResource("SpriteFrames_brsyt")
autoplay = "default"
frame_progress = 0.347379
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.547908)
[node name="AnimatedSprite3D3" type="AnimatedSprite3D" parent="Bullet"]
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, -0.110128, 0, 0)
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, -0.0494268, 0, 0)
offset = Vector2(0, 150)
sprite_frames = SubResource("SpriteFrames_brsyt")
autoplay = "default"
frame_progress = 0.365901
[node name="AnimatedSprite3D2" type="AnimatedSprite3D" parent="Bullet"]
transform = Transform3D(0.23, 0, 1.00536e-08, 1.00536e-08, 4.39458e-16, -0.23, 0, 0.23, 4.39458e-16, -0.0667875, 0.0385479, 0)
transform = Transform3D(0.23, 0, 1.00536e-08, 1.00536e-08, 4.39458e-16, -0.23, 0, 0.23, 4.39458e-16, -0.0599805, -0.0069199, 0)
offset = Vector2(0, 150)
sprite_frames = SubResource("SpriteFrames_brsyt")
autoplay = "default"
@@ -554,7 +546,7 @@ shape = SubResource("SphereShape3D_kct8n")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Bullet"]
unique_name_in_owner = true
root_node = NodePath("../AnimatedSprite3D")
root_node = NodePath("")
libraries = {
&"": SubResource("AnimationLibrary_q8n6h")
}

View File

@@ -493,17 +493,11 @@ _data = {
script = ExtResource("1_k72x7")
[node name="Bullet" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 35)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.42531)
visible = false
[node name="AnimatedSprite3D2" type="AnimatedSprite3D" parent="Bullet"]
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, 0, 0, 0)
offset = Vector2(0, 150)
sprite_frames = SubResource("SpriteFrames_aistn")
autoplay = "default"
[node name="AnimatedSprite3D3" type="AnimatedSprite3D" parent="Bullet"]
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, -0.110128, 0, 0)
transform = Transform3D(4.3946e-16, -1.00536e-08, -0.23, -0.23, -1.00536e-08, -2.06464e-21, -1.00536e-08, 0.23, -1.00536e-08, -0.0569987, 0.0446073, 0)
offset = Vector2(0, 150)
sprite_frames = SubResource("SpriteFrames_aistn")
autoplay = "default"

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=585 format=3 uid="uid://bochx2nfql67q"]
[gd_scene load_steps=584 format=3 uid="uid://bochx2nfql67q"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_h8pla"]
[ext_resource type="Texture2D" uid="uid://clwj6yknpw74n" path="res://src/enemy/enemy_types/12. Shield of Heaven/animations/New/Idle Back/0001.png" id="2_2eclh"]
@@ -2168,6 +2168,18 @@ tracks/3/keys = {
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Attack 1 VFX:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_xt8vr"]
resource_name = "idle_back"
@@ -2564,8 +2576,8 @@ tracks/4/path = NodePath("VFX Animation Player")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": PackedStringArray("[stop]", "ATTACK VFX", "[stop]"),
"times": PackedFloat32Array(0, 0.666667, 1.66667)
"clips": PackedStringArray("ATTACK VFX"),
"times": PackedFloat32Array(0.666667)
}
tracks/5/type = "audio"
tracks/5/imported = false
@@ -3141,49 +3153,13 @@ states/Idle/node = ExtResource("166_yh3w6")
states/Idle/position = Vector2(359, 100)
"states/Primary Attack/node" = ExtResource("167_fab8g")
"states/Primary Attack/position" = Vector2(359, 263)
"states/Secondary Attack/node" = SubResource("AnimationNodeAnimation_j5so5")
"states/Secondary Attack/position" = Vector2(687, 263)
states/Walking/node = ExtResource("169_w7rrw")
states/Walking/position = Vector2(687, 100)
states/secondary_attack/node = SubResource("AnimationNodeAnimation_j5so5")
states/secondary_attack/position = Vector2(687, 263)
transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_y7ljc"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_08dxp"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_yk2s3"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_mb5pg"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_olfsm"), "Walking", "Idle", SubResource("AnimationNodeStateMachineTransition_f1vvk"), "Idle", "secondary_attack", SubResource("AnimationNodeStateMachineTransition_0pum8"), "Walking", "secondary_attack", SubResource("AnimationNodeStateMachineTransition_vwlpl"), "secondary_attack", "Idle", SubResource("AnimationNodeStateMachineTransition_l1ir8")]
transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_y7ljc"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_08dxp"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_yk2s3"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_mb5pg"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_olfsm"), "Walking", "Idle", SubResource("AnimationNodeStateMachineTransition_f1vvk"), "Idle", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_0pum8"), "Walking", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_vwlpl"), "Secondary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_l1ir8")]
graph_offset = Vector2(-16, 68)
[sub_resource type="Animation" id="Animation_v8s5q"]
resource_name = "ATTACK VFX"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(-5.96046e-08, 0.966667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 29]
}
[sub_resource type="Animation" id="Animation_jd3bx"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_yuosm"]
_data = {
&"ATTACK VFX": SubResource("Animation_v8s5q"),
&"RESET": SubResource("Animation_jd3bx")
}
[sub_resource type="AtlasTexture" id="AtlasTexture_iv5px"]
atlas = ExtResource("381_moqrm")
region = Rect2(0, 0, 512, 512)
@@ -3398,15 +3374,73 @@ animations = [{
"speed": 24.0
}]
[sub_resource type="SpriteFrames" id="SpriteFrames_lgwan"]
[sub_resource type="Animation" id="Animation_v8s5q"]
resource_name = "ATTACK VFX"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(-5.96046e-08, 0.966667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 29]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".:animation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
[sub_resource type="Animation" id="Animation_jd3bx"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".:animation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_yuosm"]
_data = {
&"ATTACK VFX": SubResource("Animation_v8s5q"),
&"RESET": SubResource("Animation_jd3bx")
}
[node name="EnemyModelView" type="Node3D"]
script = ExtResource("1_h8pla")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.70362, 0)
pixel_size = 0.005
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 2.56856, 0)
pixel_size = 0.007
billboard = 2
alpha_cut = 1
texture_filter = 0
@@ -3460,22 +3494,19 @@ process_mode = 3
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0455525, 0)
bus = &"SFX"
[node name="VFX Animation Player" type="AnimationPlayer" parent="."]
root_node = NodePath("Attack 1 VFX")
libraries = {
&"": SubResource("AnimationLibrary_yuosm")
}
[node name="Attack 1 VFX" type="AnimatedSprite3D" parent="VFX Animation Player"]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 1.14695, 0.733219)
[node name="Attack 1 VFX" type="AnimatedSprite3D" parent="."]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 2.01189, 0.733219)
modulate = Color(1, 1, 1, 0.788235)
pixel_size = 0.007
billboard = 1
texture_filter = 0
sprite_frames = SubResource("SpriteFrames_ie7uh")
[node name="Attack 2 VFX" type="AnimatedSprite3D" parent="VFX Animation Player"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2.74915, 0)
sprite_frames = SubResource("SpriteFrames_lgwan")
[node name="VFX Animation Player" type="AnimationPlayer" parent="."]
root_node = NodePath("../Attack 1 VFX")
libraries = {
&"": SubResource("AnimationLibrary_yuosm")
}
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true

View File

@@ -1,6 +1,8 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
using Zennysoft.Game.Ma;
@@ -9,6 +11,11 @@ public partial class ShieldOfHeaven : Enemy2D, IHavePatrolBehavior, IHaveEngageP
{
public override void _Notification(int what) => this.Notify(what);
[Export] private float PrimaryAttackChance { get; set; } = 0.75f;
[Export] private float SecondaryAttackChance { get; set; } = 0.25f;
[Node] public NavigationAgent3D NavigationAgent { get; set; }
[Node] public PatrolBehavior PatrolBehavior { get; set; } = default!;
[Node] public FollowBehavior FollowBehavior { get; set; } = default!;
@@ -16,6 +23,7 @@ public partial class ShieldOfHeaven : Enemy2D, IHavePatrolBehavior, IHaveEngageP
[Node] public Area3D PlayerDetector { get; set; } = default!;
public void OnReady()
{
FollowBehavior.Init(NavigationAgent);
@@ -39,4 +47,12 @@ public partial class ShieldOfHeaven : Enemy2D, IHavePatrolBehavior, IHaveEngageP
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
}
public override void PerformAction()
{
var rng = new RandomNumberGenerator();
var options = new List<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
options[(int)selection].Invoke();
}
}

View File

@@ -34,12 +34,12 @@ script = ExtResource("1_oxa5b")
[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, 1.1154, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.71346, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.1154, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.71346, 0)
collision_layer = 2
collision_mask = 2
@@ -55,7 +55,7 @@ collision_mask = 3
[node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1154, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71346, 0)
collision_layer = 0
collision_mask = 34
@@ -63,7 +63,7 @@ collision_mask = 34
shape = SubResource("CylinderShape3D_d5a6t")
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1154, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71346, 0)
collision_layer = 2048
collision_mask = 0
@@ -75,7 +75,7 @@ unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.110944, 0)
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1154, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71346, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("4_jvpqg")]
unique_name_in_owner = true
@@ -94,7 +94,7 @@ avoidance_enabled = true
radius = 1.0
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1154, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71346, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true