Add elemental VFX when hitting enemies (2D only currently)

This commit is contained in:
2026-04-23 01:04:02 -07:00
parent 65a78f9871
commit 89da483448
46 changed files with 46974 additions and 755 deletions
@@ -9,13 +9,13 @@ public interface IHealthComponent : IEntityComponent
public IAutoProp<int> MaximumHP { get; } public IAutoProp<int> MaximumHP { get; }
public event Action? HealthReachedZero; public event Action? HealthReachedZero;
public event Action? DamageTaken; public event Action<ElementType>? DamageTaken;
public bool AtFullHealth { get; } public bool AtFullHealth { get; }
public void Heal(int healAmount); public void Heal(int healAmount);
public void Damage(int damageAmount); public void Damage(int damageAmount, ElementType elementType);
public void SetCurrentHealth(int health); public void SetCurrentHealth(int health);
@@ -16,7 +16,7 @@ public class HealthComponent : IHealthComponent
private readonly AutoProp<int> _maximumHP; private readonly AutoProp<int> _maximumHP;
public event Action? HealthReachedZero; public event Action? HealthReachedZero;
public event Action? DamageTaken; public event Action<ElementType>? DamageTaken;
public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value; public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value;
@@ -44,7 +44,7 @@ public class HealthComponent : IHealthComponent
_currentHP.OnNext(cappedAmount); _currentHP.OnNext(cappedAmount);
} }
public void Damage(int damageAmount) public void Damage(int damageAmount, ElementType elementType)
{ {
if (CurrentHP.Value <= 0) if (CurrentHP.Value <= 0)
return; return;
@@ -55,7 +55,7 @@ public class HealthComponent : IHealthComponent
if (cappedAmount == 0) if (cappedAmount == 0)
HealthReachedZero?.Invoke(); HealthReachedZero?.Invoke();
else else
DamageTaken?.Invoke(); DamageTaken?.Invoke(elementType);
} }
public void SetCurrentHealth(int health) public void SetCurrentHealth(int health)
@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://cgk17d8erskht" uid="uid://cgk17d8erskht"
path="res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr" path="res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_ocean.ogg" source_file="res://src/audio/AMB/amb_ocean.ogg"
dest_files=["res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr"] dest_files=["res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"]
[params] [params]
+4 -3
View File
@@ -169,8 +169,9 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
} }
public virtual void TakeHit() public virtual void TakeHit(ElementType damageElementType)
{ {
EnemyModelView.PlayElementalDamageAnimation(damageElementType);
_enemyLogic.Input(new EnemyLogic.Input.Alert()); _enemyLogic.Input(new EnemyLogic.Input.Alert());
EnemyModelView.PlayHitAnimation(); EnemyModelView.PlayHitAnimation();
_hitSFX.Play(); _hitSFX.Play();
@@ -281,8 +282,8 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
private void _rustTimer_Timeout() private void _rustTimer_Timeout()
{ {
HealthComponent.Damage(3); HealthComponent.Damage(3, ElementType.Ferrum);
TakeHit(); TakeHit(ElementType.Ferrum);
} }
private void _rustDuration_Timeout() private void _rustDuration_Timeout()
@@ -134,4 +134,6 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView
AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop(); AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop();
AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished; AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished;
} }
public abstract void PlayElementalDamageAnimation(ElementType elementType);
} }
@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq; using System.Linq;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))] [Meta(typeof(IAutoNode))]
@@ -17,6 +18,15 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
[Node] public AnimationPlayer AnimationPlayer { get; set; } = default!; [Node] public AnimationPlayer AnimationPlayer { get; set; } = default!;
[Node] public AnimationPlayer FlameHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer RustHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer HolyHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer WindHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer WaterHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer CurseHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer EarthHitAnimation { get; set; } = default!;
[ExportGroup("Enemy Model Properties")] [ExportGroup("Enemy Model Properties")]
[Export(PropertyHint.Range, "0.0, 1.0")] [Export(PropertyHint.Range, "0.0, 1.0")]
private float _upperThreshold { get; set; } = 0.5f; private float _upperThreshold { get; set; } = 0.5f;
@@ -56,6 +66,47 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f); tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f);
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
if (elementType == ElementType.Igneous)
{
if (FlameHitAnimation.IsPlaying())
FlameHitAnimation.Stop();
FlameHitAnimation.Play("FireHit");
}
else if (elementType == ElementType.Holy)
{
if (HolyHitAnimation.IsPlaying())
HolyHitAnimation.Stop();
HolyHitAnimation.Play("HolyHit");
}
else if (elementType == ElementType.Aeolic)
{
if (WindHitAnimation.IsPlaying())
WindHitAnimation.Stop();
WindHitAnimation.Play("WindHit");
}
else if (elementType == ElementType.Curse)
{
if (CurseHitAnimation.IsPlaying())
CurseHitAnimation.Stop();
CurseHitAnimation.Play("CurseHit");
}
else if (elementType == ElementType.Hydric)
{
if (WaterHitAnimation.IsPlaying())
WaterHitAnimation.Stop();
WaterHitAnimation.Play("WaterHit");
}
else if (elementType == ElementType.Telluric)
{
if (EarthHitAnimation.IsPlaying())
EarthHitAnimation.Stop();
EarthHitAnimation.Play("EarthHit");
}
}
private EnemyDirection GetEnemyDirection( private EnemyDirection GetEnemyDirection(
Basis enemyBasis, Basis enemyBasis,
Vector3 cameraDirection, Vector3 cameraDirection,
@@ -1,6 +1,7 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -59,4 +60,9 @@ public partial class EnemyModelView3D : EnemyModelView
{ {
MeshInstance.Transparency = transparencyAmount; MeshInstance.Transparency = transparencyAmount;
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
}
} }
@@ -27,6 +27,8 @@ public interface IEnemyModelView : INode3D
public void PlayDeathAnimation(); public void PlayDeathAnimation();
public void PlayElementalDamageAnimation(ElementType elementType);
public double ViewerSize { get; } public double ViewerSize { get; }
public AttackData AttackData { get; set; } public AttackData AttackData { get; set; }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
[gd_scene load_steps=621 format=3 uid="uid://g84hcmgo3gtl"] [gd_scene load_steps=627 format=3 uid="uid://g84hcmgo3gtl"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_oh25a"] [ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_oh25a"]
[ext_resource type="Texture2D" uid="uid://nps7rrvkgews" path="res://src/enemy/enemy_types/04. sara/animations/IDLE+MOVE/FRONT/0001.png" id="2_8j76g"] [ext_resource type="Texture2D" uid="uid://nps7rrvkgews" path="res://src/enemy/enemy_types/04. sara/animations/IDLE+MOVE/FRONT/0001.png" id="2_8j76g"]
@@ -1442,6 +1442,9 @@ region = Rect2(3072, 512, 512, 512)
animations = [{ animations = [{
"frames": [{ "frames": [{
"duration": 1.0, "duration": 1.0,
"texture": null
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_slhg2") "texture": SubResource("AtlasTexture_slhg2")
}, { }, {
"duration": 1.0, "duration": 1.0,
@@ -4507,13 +4510,69 @@ _data = {
&"RESET": SubResource("Animation_8wlnr") &"RESET": SubResource("Animation_8wlnr")
} }
[sub_resource type="Animation" id="Animation_6shfu"] [sub_resource type="Animation" id="Animation_30xy4"]
resource_name = "Fire Damage" resource_name = "CurseHit"
length = 1.33334 length = 1.56667
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:animation") tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.56667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 47]
}
[sub_resource type="Animation" id="Animation_3pm1j"]
resource_name = "EarthHit"
length = 1.46667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"EARTH DAMAGE"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.46667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 44]
}
[sub_resource type="Animation" id="Animation_6shfu"]
resource_name = "Fire Damage"
length = 2.93334
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:animation")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -4525,7 +4584,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:frame") tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:frame")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -4537,7 +4596,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:modulate") tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:modulate")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -4546,13 +4605,65 @@ tracks/2/keys = {
"update": 0, "update": 0,
"values": [Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056)] "values": [Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056)]
} }
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 2.93333),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [88, 88]
}
[sub_resource type="Animation" id="Animation_f5cjs"]
resource_name = "HolyHit"
length = 0.700003
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"HOLY"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.7),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 21]
}
[sub_resource type="Animation" id="Animation_cftgd"] [sub_resource type="Animation" id="Animation_cftgd"]
length = 0.001 length = 0.001
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:modulate") tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:modulate")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -4564,7 +4675,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:frame") tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:frame")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -4576,7 +4687,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:animation") tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:animation")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -4585,11 +4696,295 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [&"Flame Damage"] "values": [&"Flame Damage"]
} }
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [88]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:animation")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"HOLY"]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:frame")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:animation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [50]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:animation")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:frame")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [29]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:animation")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER"]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:frame")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [51]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:animation")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:frame")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [47]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:animation")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:frame")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_0tqwp"]
resource_name = "RustActivate"
length = 1.46667
step = 0.0166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.46667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 88]
}
[sub_resource type="Animation" id="Animation_q5dfb"]
resource_name = "WaterHit"
length = 1.7
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 29]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:animation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER"]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:frame")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 1.7),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 51]
}
[sub_resource type="Animation" id="Animation_godpv"]
resource_name = "WindHit"
length = 0.833335
step = 0.0166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.833333),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 50]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0tqwp"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_0tqwp"]
_data = { _data = {
&"Fire Damage": SubResource("Animation_6shfu"), &"CurseHit": SubResource("Animation_30xy4"),
&"RESET": SubResource("Animation_cftgd") &"EarthHit": SubResource("Animation_3pm1j"),
&"FireHit": SubResource("Animation_6shfu"),
&"HolyHit": SubResource("Animation_f5cjs"),
&"RESET": SubResource("Animation_cftgd"),
&"RustActivate": SubResource("Animation_0tqwp"),
&"WaterHit": SubResource("Animation_q5dfb"),
&"WindHit": SubResource("Animation_godpv")
} }
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
@@ -4625,66 +5020,59 @@ position = Vector2(400, 400)
sprite_frames = SubResource("SpriteFrames_sobol") sprite_frames = SubResource("SpriteFrames_sobol")
animation = &"idle_front" animation = &"idle_front"
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.54, 1.54) scale = Vector2(1.54, 1.54)
sprite_frames = SubResource("SpriteFrames_s0t7i") sprite_frames = SubResource("SpriteFrames_s0t7i")
frame = 88 frame = 88
frame_progress = 1.0
[node name="Holy Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Holy Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(0.675, 0.675) scale = Vector2(0.675, 0.675)
sprite_frames = SubResource("SpriteFrames_jy23v") sprite_frames = SubResource("SpriteFrames_jy23v")
animation = &"HOLY" animation = &"HOLY"
frame = 20
frame_progress = 1.0
[node name="Wind Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Wind Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.445, 1.445) scale = Vector2(1.445, 1.445)
sprite_frames = SubResource("SpriteFrames_olmld") sprite_frames = SubResource("SpriteFrames_olmld")
frame = 50 frame = 50
frame_progress = 1.0
[node name="Flame Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Flame Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(3.445, 3.445) scale = Vector2(3.445, 3.445)
sprite_frames = SubResource("SpriteFrames_a23f0") sprite_frames = SubResource("SpriteFrames_a23f0")
animation = &"Flame Damage" animation = &"Flame Damage"
frame = 40 frame = 40
[node name="Water Hit Layer 1 Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Water Hit Layer 1 Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.215, 2.215) scale = Vector2(2.215, 2.215)
sprite_frames = SubResource("SpriteFrames_bsjfy") sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE" animation = &"WATER DAMAGE"
frame = 29 frame = 29
frame_progress = 1.0
[node name="Water Hit Layer 2Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Water Hit Layer 2Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.105, 0.895) scale = Vector2(1.105, 0.895)
sprite_frames = SubResource("SpriteFrames_cht2c") sprite_frames = SubResource("SpriteFrames_cht2c")
animation = &"WATER" animation = &"WATER"
frame = 51 frame = 51
frame_progress = 1.0
[node name="Curse Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Curse Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.78, 2.78) scale = Vector2(2.78, 2.78)
sprite_frames = SubResource("SpriteFrames_v3crq") sprite_frames = SubResource("SpriteFrames_v3crq")
frame = 47 frame = 47
frame_progress = 1.0
[node name="Earth Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Earth Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.005, 2.005) scale = Vector2(2.005, 2.005)
sprite_frames = SubResource("SpriteFrames_bsjfy") sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE" animation = &"WATER DAMAGE"
frame = 29
frame_progress = 1.0
[node name="Hitbox" type="Area3D" parent="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@@ -4731,8 +5119,53 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.72758, 0)
autoplay = true autoplay = true
bus = &"SFX" bus = &"SFX"
[node name="Flame Animation Player" type="AnimationPlayer" parent="."] [node name="VFXAnimations" type="Node" parent="."]
root_node = NodePath("../Secondary Animation Player")
[node name="FlameHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="RustHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="HolyHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="WindHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="WaterHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="CurseHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="EarthHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = { libraries = {
&"": SubResource("AnimationLibrary_0tqwp") &"": SubResource("AnimationLibrary_0tqwp")
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -55,6 +55,11 @@ public partial class DemonWallArm : EnemyModelView
} }
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
}
public void OnExitTree() public void OnExitTree()
{ {
Hitbox.AreaEntered -= Hitbox_AreaEntered; Hitbox.AreaEntered -= Hitbox_AreaEntered;
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -879,7 +879,7 @@ public partial class Game : Node3D, IGame
private void RustTimeout() private void RustTimeout()
{ {
_player.HealthComponent.Damage(3); _player.HealthComponent.Damage(3, ElementType.Ferrum);
} }
private void RustWoreOff() => _player.StatusEffectComponent.Rust.OnNext(false); private void RustWoreOff() => _player.StatusEffectComponent.Rust.OnNext(false);
+2 -2
View File
@@ -100,7 +100,7 @@ public class EffectService
foreach (var enemy in currentEnemies) foreach (var enemy in currentEnemies)
{ {
var absorbAmount = enemy.HealthComponent.CurrentHP.Value * 0.25; var absorbAmount = enemy.HealthComponent.CurrentHP.Value * 0.25;
enemy.HealthComponent.Damage((int)absorbAmount); enemy.HealthComponent.Damage((int)absorbAmount, ElementType.None);
hpToAbsorb += absorbAmount; hpToAbsorb += absorbAmount;
enemy.OnAbsorb(); enemy.OnAbsorb();
} }
@@ -118,7 +118,7 @@ public class EffectService
foreach (var enemy in currentEnemies) foreach (var enemy in currentEnemies)
{ {
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, elementType);
} }
} }
+1 -1
View File
@@ -38,7 +38,7 @@ public partial class SetItem : RigidBody3D
if (area.GetOwner() is ExplodableWall wall) if (area.GetOwner() is ExplodableWall wall)
wall.Demolish(); wall.Demolish();
if (area.GetOwner() is IEnemy enemy) if (area.GetOwner() is IEnemy enemy)
enemy.HealthComponent.Damage(10); enemy.HealthComponent.Damage(10, ElementType.Igneous);
} }
public async void Set() public async void Set()
@@ -148,14 +148,14 @@ public partial class ThrownItem : RigidBody3D, IThrownItem
break; break;
default: default:
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(usableItem.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(usableItem.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, ElementType.None);
break; break;
} }
} }
else else
{ {
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(ItemThatIsThrown.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(ItemThatIsThrown.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, ElementType.None);
} }
} }
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bl4xempufmgr5" uid="uid://bl4xempufmgr5"
path.bptc="res://.godot/imported/PALM OF HEAVEN.PNG-35554a412a9c4bc09647efa86e6b581e.bptc.ctex" path.bptc="res://.godot/imported/palm of heaven.png-8afcb54f797720ff29f3c00c68c0f579.bptc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://src/items/weapons/textures/PALM OF HEAVEN.PNG" source_file="res://src/items/weapons/textures/palm of heaven.png"
dest_files=["res://.godot/imported/PALM OF HEAVEN.PNG-35554a412a9c4bc09647efa86e6b581e.bptc.ctex"] dest_files=["res://.godot/imported/palm of heaven.png-8afcb54f797720ff29f3c00c68c0f579.bptc.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cp0er3xxxjkr5" uid="uid://cp0er3xxxjkr5"
path="res://.godot/imported/a2-puer_AREA_2_MAIN_222STONE.png-139f243ac630853348798dfe584da1e0.ctex" path="res://.godot/imported/A2-Puer_AREA_2_MAIN_222STONE.png-992459ef9849c39922a9b9e0c7774a4a.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_AREA_2_MAIN_222STONE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_AREA_2_MAIN_222STONE.png"
dest_files=["res://.godot/imported/a2-puer_AREA_2_MAIN_222STONE.png-139f243ac630853348798dfe584da1e0.ctex"] dest_files=["res://.godot/imported/A2-Puer_AREA_2_MAIN_222STONE.png-992459ef9849c39922a9b9e0c7774a4a.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://5r16swvuqjjg" uid="uid://5r16swvuqjjg"
path="res://.godot/imported/a2-puer_AREA_2_MAIN_STONE.png-986249227e569ea1e40b4825b7f05c47.ctex" path="res://.godot/imported/A2-Puer_AREA_2_MAIN_STONE.png-2267bd7e464cdc2e03c8954de01941bf.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_AREA_2_MAIN_STONE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_AREA_2_MAIN_STONE.png"
dest_files=["res://.godot/imported/a2-puer_AREA_2_MAIN_STONE.png-986249227e569ea1e40b4825b7f05c47.ctex"] dest_files=["res://.godot/imported/A2-Puer_AREA_2_MAIN_STONE.png-2267bd7e464cdc2e03c8954de01941bf.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cvnpxln2mmtkp" uid="uid://cvnpxln2mmtkp"
path="res://.godot/imported/a2-puer_COLUMN_WHITE.png-0b80d510851319464b2ef729d8868892.ctex" path="res://.godot/imported/A2-Puer_COLUMN_WHITE.png-18037c22b966bb159d05cb7acac1bc53.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_COLUMN_WHITE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_COLUMN_WHITE.png"
dest_files=["res://.godot/imported/a2-puer_COLUMN_WHITE.png-0b80d510851319464b2ef729d8868892.ctex"] dest_files=["res://.godot/imported/A2-Puer_COLUMN_WHITE.png-18037c22b966bb159d05cb7acac1bc53.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://tjtjbktl51kd" uid="uid://tjtjbktl51kd"
path="res://.godot/imported/a2-puer_GREENBIT.png-e1ed395f917a2fe57ed6288185af0729.ctex" path="res://.godot/imported/A2-Puer_GREENBIT.png-40a9ca6a0efc569a5f329f19b3c3e572.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_GREENBIT.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_GREENBIT.png"
dest_files=["res://.godot/imported/a2-puer_GREENBIT.png-e1ed395f917a2fe57ed6288185af0729.ctex"] dest_files=["res://.godot/imported/A2-Puer_GREENBIT.png-40a9ca6a0efc569a5f329f19b3c3e572.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dqfdyguq83bhs" uid="uid://dqfdyguq83bhs"
path="res://.godot/imported/a2-puer_M13_14.png-ed8b29b0af1c2b973bfaee62e57cab14.ctex" path="res://.godot/imported/A2-Puer_M13_14.png-e781478f15895763a566a64ff37db311.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_M13_14.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_M13_14.png"
dest_files=["res://.godot/imported/a2-puer_M13_14.png-ed8b29b0af1c2b973bfaee62e57cab14.ctex"] dest_files=["res://.godot/imported/A2-Puer_M13_14.png-e781478f15895763a566a64ff37db311.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dorqwrqy03rim" uid="uid://dorqwrqy03rim"
path="res://.godot/imported/a2-puer_M13_49.png-86429b5a3cd80a9159f32ded99a631bc.ctex" path="res://.godot/imported/A2-Puer_M13_49.png-44faadb5ae300e9ecea145cfe1949536.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_M13_49.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_M13_49.png"
dest_files=["res://.godot/imported/a2-puer_M13_49.png-86429b5a3cd80a9159f32ded99a631bc.ctex"] dest_files=["res://.godot/imported/A2-Puer_M13_49.png-44faadb5ae300e9ecea145cfe1949536.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://nl3bwenfa8fi" uid="uid://nl3bwenfa8fi"
path="res://.godot/imported/a2-puer_RUBBLE_1.png-c7185e2aad2613007d1951f1515ef882.ctex" path="res://.godot/imported/A2-Puer_RUBBLE_1.png-72d7ff861d1df58d800502546da8d607.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_RUBBLE_1.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_RUBBLE_1.png"
dest_files=["res://.godot/imported/a2-puer_RUBBLE_1.png-c7185e2aad2613007d1951f1515ef882.ctex"] dest_files=["res://.godot/imported/A2-Puer_RUBBLE_1.png-72d7ff861d1df58d800502546da8d607.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://0p6suo7fpxum" uid="uid://0p6suo7fpxum"
path="res://.godot/imported/a2-puer_STUCCO_DECAL_BIG.png-882b477f490f6ddbf5bffb3a6f8904e1.ctex" path="res://.godot/imported/A2-Puer_STUCCO_DECAL_BIG.png-015d9f8dd06372231a1f422979d3604e.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_STUCCO_DECAL_BIG.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_STUCCO_DECAL_BIG.png"
dest_files=["res://.godot/imported/a2-puer_STUCCO_DECAL_BIG.png-882b477f490f6ddbf5bffb3a6f8904e1.ctex"] dest_files=["res://.godot/imported/A2-Puer_STUCCO_DECAL_BIG.png-015d9f8dd06372231a1f422979d3604e.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://ct3mkni0v0y3g" uid="uid://ct3mkni0v0y3g"
path="res://.godot/imported/a2-puer_Tile 4.png-9d089a32db3fc38a0c5dee6cdb6d3495.ctex" path="res://.godot/imported/A2-Puer_Tile 4.png-0cfd085ec5fcea35eb2d1373e4717f77.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_Tile 4.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_Tile 4.png"
dest_files=["res://.godot/imported/a2-puer_Tile 4.png-9d089a32db3fc38a0c5dee6cdb6d3495.ctex"] dest_files=["res://.godot/imported/A2-Puer_Tile 4.png-0cfd085ec5fcea35eb2d1373e4717f77.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://b40fbcriycpp5" uid="uid://b40fbcriycpp5"
path="res://.godot/imported/a2-puer_imag2esnormal.jpg-d6e063b2785344af34fa3bb45d47aa2f.ctex" path="res://.godot/imported/A2-Puer_imag2esnormal.jpg-be023c8af9ff59eedfb3ede232c75195.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_imag2esnormal.jpg" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_imag2esnormal.jpg"
dest_files=["res://.godot/imported/a2-puer_imag2esnormal.jpg-d6e063b2785344af34fa3bb45d47aa2f.ctex"] dest_files=["res://.godot/imported/A2-Puer_imag2esnormal.jpg-be023c8af9ff59eedfb3ede232c75195.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://b25r6gysyhu3e" uid="uid://b25r6gysyhu3e"
path="res://.godot/imported/a2-puer_inner_rock2.png-943622742770f7b55d1e40645d07d057.ctex" path="res://.godot/imported/A2-Puer_inner_rock2.png-7c99975de214e5dddd3507f87212b910.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_inner_rock2.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_inner_rock2.png"
dest_files=["res://.godot/imported/a2-puer_inner_rock2.png-943622742770f7b55d1e40645d07d057.ctex"] dest_files=["res://.godot/imported/A2-Puer_inner_rock2.png-7c99975de214e5dddd3507f87212b910.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cw4hq3kofjowa" uid="uid://cw4hq3kofjowa"
path="res://.godot/imported/a2-puer_lime_hand_relief.png-85b73e808337e8b8841453cbda0e78cd.ctex" path="res://.godot/imported/A2-Puer_lime_hand_relief.png-825857ea33249fe0361c829ba37bbfdb.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_lime_hand_relief.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_lime_hand_relief.png"
dest_files=["res://.godot/imported/a2-puer_lime_hand_relief.png-85b73e808337e8b8841453cbda0e78cd.ctex"] dest_files=["res://.godot/imported/A2-Puer_lime_hand_relief.png-825857ea33249fe0361c829ba37bbfdb.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bqrsde28o867s" uid="uid://bqrsde28o867s"
path="res://.godot/imported/a2-puer_mother_GREEN.png-7bb7d8dd57027953ba1e08ed0c256c8b.ctex" path="res://.godot/imported/A2-Puer_mother_GREEN.png-ba1f3d21981ed19fc5cc87868e04808c.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_mother_GREEN.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_mother_GREEN.png"
dest_files=["res://.godot/imported/a2-puer_mother_GREEN.png-7bb7d8dd57027953ba1e08ed0c256c8b.ctex"] dest_files=["res://.godot/imported/A2-Puer_mother_GREEN.png-ba1f3d21981ed19fc5cc87868e04808c.ctex"]
[params] [params]
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://4aq3a26dliyg" uid="uid://4aq3a26dliyg"
path="res://.godot/imported/a2-puer_swirled_column _AREA222.png-6f90c188eae5b7e81110f39984d5d43f.ctex" path="res://.godot/imported/A2-Puer_swirled_column _AREA222.png-4842b180cffdbc0274ecb9cbbbbc8221.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_swirled_column _AREA222.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_swirled_column _AREA222.png"
dest_files=["res://.godot/imported/a2-puer_swirled_column _AREA222.png-6f90c188eae5b7e81110f39984d5d43f.ctex"] dest_files=["res://.godot/imported/A2-Puer_swirled_column _AREA222.png-4842b180cffdbc0274ecb9cbbbbc8221.ctex"]
[params] [params]
+1 -1
View File
@@ -53,7 +53,7 @@ public partial class Npc : Node3D
_isInDialogueZone = true; _isInDialogueZone = true;
} }
public override void _UnhandledInput(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone) if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{ {
+3 -3
View File
@@ -269,7 +269,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
_camera3D.AddShake(1.0f); _camera3D.AddShake(1.0f);
TakeDamageAnimationPlayer.Play("take_damage"); TakeDamageAnimationPlayer.Play("take_damage");
var damageReceived = DamageCalculator.CalculateDamage(damage, TotalDefense, EquipmentComponent.ElementalResistance); var damageReceived = DamageCalculator.CalculateDamage(damage, TotalDefense, EquipmentComponent.ElementalResistance);
HealthComponent.Damage(damageReceived); HealthComponent.Damage(damageReceived, damage.ElementType);
SfxDatabase.Instance.Play(SoundEffect.TakeDamage); SfxDatabase.Instance.Play(SoundEffect.TakeDamage);
if (EquipmentComponent.EquippedArmor.Value.ArmorTag == ArmorTag.DegradeOnHit) if (EquipmentComponent.EquippedArmor.Value.ArmorTag == ArmorTag.DegradeOnHit)
@@ -851,7 +851,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
VTComponent.Reduce(1); VTComponent.Reduce(1);
} }
else else
HealthComponent.Damage(1); HealthComponent.Damage(1, ElementType.None);
} }
private void Hitbox_AreaEntered(Area3D area) private void Hitbox_AreaEntered(Area3D area)
@@ -875,7 +875,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
var baseAttack = new AttackData(totalDamage, weapon.WeaponElement, weapon.WeaponTag == WeaponTag.IgnoreDefense, weapon.WeaponTag == WeaponTag.IgnoreAffinity); var baseAttack = new AttackData(totalDamage, weapon.WeaponElement, weapon.WeaponTag == WeaponTag.IgnoreDefense, weapon.WeaponTag == WeaponTag.IgnoreAffinity);
var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, weapon.WeaponElement);
if (weapon.WeaponTag == WeaponTag.Knockback && enemy is IKnockbackable knockbackable) if (weapon.WeaponTag == WeaponTag.Knockback && enemy is IKnockbackable knockbackable)
knockbackable.Knockback(0.3f, -CurrentBasis.Z.Normalized()); knockbackable.Knockback(0.3f, -CurrentBasis.Z.Normalized());
@@ -36,7 +36,7 @@ public partial class PlayerProjectile : RigidBody3D
{ {
var projectileDamage = new AttackData(AttackData.Damage, AttackData.ElementType, false, false); var projectileDamage = new AttackData(AttackData.Damage, AttackData.ElementType, false, false);
var damageDealt = DamageCalculator.CalculateDamage(projectileDamage, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(projectileDamage, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, AttackData.ElementType);
CallDeferred(MethodName.QueueFree); CallDeferred(MethodName.QueueFree);
} }
} }