Eden pillar rotation finally works i'm going to die now

This commit is contained in:
2025-02-27 01:40:59 -08:00
parent cfa79f262f
commit 77aa58f88e
27 changed files with 289 additions and 133 deletions

View File

@@ -11,7 +11,7 @@ config_version=5
[application]
config/name="GameJamDungeon"
run/main_scene="uid://d1gjaijijd5ot"
run/main_scene="uid://bc1sp6xwe0j65"
config/features=PackedStringArray("4.4", "C#", "GL Compatibility")
boot_splash/show_image=false

View File

@@ -23,7 +23,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
[Dependency] IGameEventDepot GameEventDepot => this.DependOn<IGameEventDepot>();
[Dependency] protected IPlayer Player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
[Dependency] protected IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
#endregion
#region Exports
@@ -59,7 +59,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
_enemyLogic = new EnemyLogic();
_enemyLogic.Set(_enemyStatResource);
_enemyLogic.Set(this as IEnemy);
_enemyLogic.Set(Player);
_enemyLogic.Set(_player);
}
public void OnResolved()
@@ -95,7 +95,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
var isWalking = _enemyLogic.Value is EnemyLogic.State.Patrolling or EnemyLogic.State.FollowPlayer;
if (_enemyModelView is EnemyModelView2D enemyModelView2D)
enemyModelView2D.RotateModel(GlobalTransform.Basis, -Player.CurrentBasis.Z, isWalking);
enemyModelView2D.RotateModel(GlobalTransform.Basis, -_player.CurrentBasis.Z, isWalking);
}
#endregion
@@ -135,8 +135,8 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
_enemyModelView.PlayHitAnimation();
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
if (Player.EquippedWeapon.Value.WeaponTags.Contains(WeaponTag.SelfDamage))
Player.Stats.SetCurrentHP(Player.Stats.CurrentHP.Value - 5);
if (_player.EquippedWeapon.Value.WeaponTags.Contains(WeaponTag.SelfDamage))
_player.Stats.SetCurrentHP(_player.Stats.CurrentHP.Value - 5);
}
}
@@ -170,17 +170,17 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
private void OnAttackTimeout()
{
if (GlobalPosition.DistanceTo(Player.CurrentPosition) > 5f)
{
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
return;
}
//if (GlobalPosition.DistanceTo(_player.CurrentPosition) > 5f)
//{
// _enemyLogic.Input(new EnemyLogic.Input.Alerted());
// return;
//}
var rng = new RandomNumberGenerator();
rng.Randomize();
_enemyLogic.Input(new EnemyLogic.Input.AttackTimer());
_attackTimer.Stop();
_attackTimer.WaitTime = rng.RandfRange(2f, 5.0f);
//_attackTimer.WaitTime = rng.RandfRange(2f, 5.0f);
_attackTimer.Start();
}
@@ -189,8 +189,8 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
var overlappingBodies = _lineOfSight.GetOverlappingBodies();
foreach (var _ in overlappingBodies)
{
if (_raycast.GlobalPosition != Player.CurrentPosition)
_raycast.LookAt(Player.CurrentPosition, Vector3.Up);
if (_raycast.GlobalPosition != _player.CurrentPosition)
_raycast.LookAt(_player.CurrentPosition, Vector3.Up);
_raycast.ForceRaycastUpdate();
if (_raycast.IsColliding())
{

View File

@@ -24,8 +24,6 @@ public partial class EnemyModelView3D : Node3D, IEnemyModelView
[Export] public EnemyLoreInfo EnemyLoreInfo { get; set; } = default!;
[Node] public IHitbox Hitbox { get; set; } = default!;
[Node] private MeshInstance3D _meshInstance { get; set; } = default!;
[Node] private AnimationPlayer _animationPlayer { get; set; } = default!;
@@ -36,6 +34,7 @@ public partial class EnemyModelView3D : Node3D, IEnemyModelView
public void PlayPrimaryAttackAnimation()
{
_animationPlayer.Play(PRIMARY_ATTACK);
}
public void PlaySecondaryAttackAnimation()

View File

@@ -14,6 +14,4 @@ public interface IEnemyModelView : INode3D
public void PlayHitAnimation();
public void PlayDeathAnimation();
public IHitbox Hitbox { get; }
}

View File

@@ -20,18 +20,18 @@ public partial class Sproingy : Enemy, IHasPrimaryAttack, ICanPatrol
public void OnReady()
{
SetPhysicsProcess(true);
_enemyModelView.Hitbox.AreaEntered += Hitbox_AreaEntered;
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 3.5f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 3.5f)
_enemyLogic.Input(new EnemyLogic.Input.StartAttacking());
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) > 30f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) > 30f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 5f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
_navigationAgentClient.CalculateVelocity(GlobalPosition);

View File

@@ -18,18 +18,18 @@ public partial class Michael : Enemy, IHasPrimaryAttack, ICanPatrol
public void OnReady()
{
SetPhysicsProcess(true);
_enemyModelView.Hitbox.AreaEntered += Hitbox_AreaEntered;
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 3f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 3f)
_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) > 45f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 3f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 3f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
_navigationAgentClient.CalculateVelocity(GlobalPosition);

View File

@@ -22,18 +22,18 @@ public partial class FilthEater : Enemy, IHasPrimaryAttack, IHasSecondaryAttack,
public void OnReady()
{
SetPhysicsProcess(true);
_enemyModelView.Hitbox.AreaEntered += Hitbox_AreaEntered;
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 2.5f)
_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) > 45f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 2.5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
}

View File

@@ -23,18 +23,18 @@ public partial class Ballos : Enemy, IHasPrimaryAttack, IHasSecondaryAttack
public void OnReady()
{
SetPhysicsProcess(true);
_enemyModelView.Hitbox.AreaEntered += Hitbox_AreaEntered;
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 2.5f)
_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) > 45f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 2.5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
}

View File

@@ -16,11 +16,11 @@ public partial class Chariot : Enemy, IHasPrimaryAttack
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 2.5f)
_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) > 45f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 2.5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
}

View File

@@ -17,18 +17,18 @@ public partial class Chinte : Enemy, IHasPrimaryAttack
public void OnReady()
{
SetPhysicsProcess(true);
_enemyModelView.Hitbox.AreaEntered += Hitbox_AreaEntered;
((EnemyModelView2D)_enemyModelView).Hitbox.AreaEntered += Hitbox_AreaEntered;
}
public void OnPhysicsProcess(double delta)
{
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(Player.CurrentPosition) < 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 2.5f)
_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) > 45f)
_enemyLogic.Input(new EnemyLogic.Input.LostPlayer());
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(Player.CurrentPosition) > 2.5f)
if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 2.5f)
_enemyLogic.Input(new EnemyLogic.Input.Alerted());
}

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=7 format=3 uid="uid://cmvimr0pvsgqy"]
[gd_scene load_steps=15 format=3 uid="uid://cmvimr0pvsgqy"]
[ext_resource type="Script" uid="uid://d2m7esc5ypl7y" path="res://src/enemy/enemy_types/10. Eden Pillar/EdenPillar.cs" id="1_p8jc1"]
[ext_resource type="Resource" uid="uid://dj10m1aktmu6j" path="res://src/enemy/enemy_types/10. Eden Pillar/EdenPillar.tres" id="2_nveg0"]
[ext_resource type="PackedScene" uid="uid://cktycana6xxtp" path="res://src/enemy/enemy_types/10. Eden Pillar/EdenPillarModelView.tscn" id="3_o285m"]
[ext_resource type="Script" uid="uid://6edayafleq8y" path="res://src/hitbox/Hitbox.cs" id="4_5fako"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_p8jc1"]
height = 3.08643
@@ -16,6 +17,33 @@ radius = 0.202148
height = 3.98828
radius = 0.886719
[sub_resource type="BoxShape3D" id="BoxShape3D_xqm7x"]
size = Vector3(3.7605, 2.43953, 12.6547)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5fako"]
albedo_color = Color(1, 0, 0, 1)
[sub_resource type="CylinderMesh" id="CylinderMesh_xqm7x"]
material = SubResource("StandardMaterial3D_5fako")
top_radius = 0.25
bottom_radius = 0.25
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p8jc1"]
albedo_color = Color(0, 0, 1, 1)
[sub_resource type="CylinderMesh" id="CylinderMesh_nveg0"]
material = SubResource("StandardMaterial3D_p8jc1")
top_radius = 0.25
bottom_radius = 0.25
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_iu5yw"]
albedo_color = Color(0, 1, 0, 1)
[sub_resource type="CylinderMesh" id="CylinderMesh_nc31c"]
material = SubResource("StandardMaterial3D_iu5yw")
top_radius = 0.25
bottom_radius = 0.25
[node name="Eden Pillar" type="CharacterBody3D"]
collision_layer = 10
collision_mask = 3
@@ -33,7 +61,7 @@ transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0, 0, 0)
[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, 0, 0)
transform = Transform3D(-1, 0, -1.50996e-07, 0, 1, 0, 1.50996e-07, 0, -1, 0, 0, 0)
collision_layer = 2
collision_mask = 2
@@ -43,14 +71,9 @@ shape = SubResource("CylinderShape3D_nveg0")
[node name="AttackTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 0.8
wait_time = 10.0
autostart = true
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
target_position = Vector3(0, 0, -5)
collision_mask = 3
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.832948, 0)
collision_layer = 2048
@@ -59,3 +82,65 @@ collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.321487, 0)
shape = SubResource("CylinderShape3D_o285m")
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
target_position = Vector3(0, 1, 3)
collision_mask = 3
[node name="PrimaryHitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.152949, 0, 13.6635)
collision_layer = 64
collision_mask = 64
script = ExtResource("4_5fako")
[node name="CollisionShape3D" type="CollisionShape3D" parent="PrimaryHitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0939882, 1.15479, -6.78312)
shape = SubResource("BoxShape3D_xqm7x")
disabled = true
[node name="MeshInstance3D" type="MeshInstance3D" parent="PrimaryHitbox"]
transform = Transform3D(0.998663, 0.0516911, -2.25949e-09, 0, -4.37114e-08, -1, -0.0516911, 0.998663, -4.3653e-08, 0.176435, 0, -12.0372)
mesh = SubResource("CylinderMesh_xqm7x")
[node name="SecondaryHitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-0.529919, 0, 0.848048, 0, 1, 0, -0.848048, 0, -0.529919, -1.2426, 0, -6.37338)
collision_layer = 64
collision_mask = 64
script = ExtResource("4_5fako")
[node name="CollisionShape3D" type="CollisionShape3D" parent="SecondaryHitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.1241, 1.15479, 3.09662)
shape = SubResource("BoxShape3D_xqm7x")
disabled = true
[node name="MeshInstance3D" type="MeshInstance3D" parent="SecondaryHitbox"]
transform = Transform3D(0.991132, -0.132879, 5.80834e-09, 0, -4.37114e-08, -1, 0.132879, 0.991132, -4.33238e-08, -6.30106, 0, -0.622331)
mesh = SubResource("CylinderMesh_nveg0")
[node name="TertiaryHitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-0.529919, 0, -0.848048, 0, 1, 0, 0.848048, 0, -0.529919, 1.50517, 0, -7.06323)
collision_layer = 64
collision_mask = 64
script = ExtResource("4_5fako")
[node name="CollisionShape3D" type="CollisionShape3D" parent="TertiaryHitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.81698, 1.15479, 3.06516)
shape = SubResource("BoxShape3D_xqm7x")
disabled = true
[node name="MeshInstance3D" type="MeshInstance3D" parent="TertiaryHitbox"]
transform = Transform3D(0.995479, 0.0949771, -4.15158e-09, 0, -4.37114e-08, -1, -0.0949771, 0.995479, -4.35138e-08, 6.95263, 0, -1.22368)
mesh = SubResource("CylinderMesh_nc31c")
[node name="RayCast3D2" type="RayCast3D" parent="."]
target_position = Vector3(3, 1, -1.85)
[node name="RayCast3D" type="RayCast3D" parent="."]
target_position = Vector3(-3, 1, -1.85)
[node name="Rotation" type="Node3D" parent="."]
unique_name_in_owner = true

View File

@@ -1,16 +1,89 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Collections.Generic;
using System;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public partial class EdenPillar : Enemy
public partial class EdenPillar : Enemy, IHasPrimaryAttack, IHasSecondaryAttack, IHasTertiaryAttack
{
public override void _Notification(int what) => this.Notify(what);
[Export] public ElementType PrimaryAttackElementalType { get; set; } = ElementType.None;
[Export] public double PrimaryAttackElementalDamageBonus { get; set; } = 1.15f;
[Export] public ElementType SecondaryAttackElementalType { get; set; } = ElementType.None;
[Export] public double SecondaryAttackElementalDamageBonus { get; set; } = 1.15f;
[Export] public ElementType TertiaryAttackElementalType { get; set; } = ElementType.None;
[Export] public double TertiaryAttackElementalDamageBonus { get; set; } = 1.15f;
[Node] private IHitbox _primaryHitbox { get; set; } = default!;
[Node] private IHitbox _secondaryHitbox { get; set; } = default!;
[Node] private IHitbox _tertiaryHitbox { get; set; } = default!;
[Node] private Node3D _rotation { get; set; } = default!;
private float _primaryAngle = 0;
private float _secondaryAngle = -122;
private float _tertiaryAngle = 122;
private float _targetAngle;
public override void _PhysicsProcess(double delta)
{
RotateY(0.01f);
_enemyLogic.Input(new EnemyLogic.Input.PhysicsTick(delta));
_enemyLogic.Input(new EnemyLogic.Input.StartAttacking());
}
public override void _Process(double delta)
{
Basis = Basis.Slerp(_rotation.Basis, 0.003f).Orthonormalized();
}
public override void TakeAction()
{
var rng = new RandomNumberGenerator();
var options = new List<Action>() { PrimaryAttack, SecondaryAttack, TertiaryAttack };
var selection = rng.RandWeighted([1, 1, 1]);
options[(int)selection].Invoke();
}
public void PrimaryAttack()
{
var target = new Vector3(_player.CurrentPosition.X, Position.Y, _player.CurrentPosition.Z);
_rotation.LookAt(target, Vector3.Up, true);
_rotation.RotateY(Rotation.Y + Mathf.DegToRad(_primaryAngle));
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => RotateTowardsPlayer(x)), Rotation.Y, _rotation.Rotation.Y, 5f);
//tweener.TweenCallback(Callable.From(QueueFree));
}
public void SecondaryAttack()
{
var target = new Vector3(_player.CurrentPosition.X, Position.Y, _player.CurrentPosition.Z);
_rotation.LookAt(target, Vector3.Up, true);
_rotation.RotateY(Rotation.Y + Mathf.DegToRad(_secondaryAngle));
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => RotateTowardsPlayer(x)), Rotation.Y, _rotation.Rotation.Y, 5f);
//tweener.TweenCallback(Callable.From(QueueFree));
}
public void TertiaryAttack()
{
var target = new Vector3(_player.CurrentPosition.X, Position.Y, _player.CurrentPosition.Z);
_rotation.LookAt(target, Vector3.Up, true);
_rotation.RotateY(Rotation.Y + Mathf.DegToRad(_tertiaryAngle));
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => RotateTowardsPlayer(x)), Rotation.Y, _rotation.Rotation.Y, 5f);
//tweener.TweenCallback(Callable.From(QueueFree));
}
private void RotateTowardsPlayer(float angle) => Rotation = new Vector3(Rotation.X, angle, Rotation.Z);
}

View File

@@ -1,13 +1,12 @@
[gd_scene load_steps=21 format=4 uid="uid://cktycana6xxtp"]
[gd_scene load_steps=20 format=4 uid="uid://cktycana6xxtp"]
[ext_resource type="Texture2D" uid="uid://cvst7yhbw0sxt" path="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg" id="1_1kpl1"]
[ext_resource type="Texture2D" uid="uid://cvst7yhbw0sxt" path="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg" id="1_1kpl1"]
[ext_resource type="Script" uid="uid://ckv5dmrw6pvn6" path="res://src/enemy/EnemyModelView3D.cs" id="1_11eq8"]
[ext_resource type="Texture2D" uid="uid://bnbveonobhyhc" path="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_cannon_edge.png" id="2_11eq8"]
[ext_resource type="Texture2D" uid="uid://bnbveonobhyhc" path="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_cannon_edge.png" id="2_11eq8"]
[ext_resource type="Material" uid="uid://brwu51ylevbmg" path="res://src/enemy/enemy_types/14. horse_head/BossHit.tres" id="2_xf2ga"]
[ext_resource type="Texture2D" uid="uid://by7k6crx6fmpv" path="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_floral_single_tile.jpg" id="3_oxjs8"]
[ext_resource type="Texture2D" uid="uid://cc1tenm6p3pca" path="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg" id="4_xf2ga"]
[ext_resource type="Texture2D" uid="uid://bydfevqfagpq8" path="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_concrete_0025_height_1k.png" id="5_qhmtu"]
[ext_resource type="Script" uid="uid://6edayafleq8y" path="res://src/hitbox/Hitbox.cs" id="7_oxjs8"]
[ext_resource type="Texture2D" uid="uid://by7k6crx6fmpv" path="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_floral_single_tile.jpg" id="3_oxjs8"]
[ext_resource type="Texture2D" uid="uid://cc1tenm6p3pca" path="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg" id="4_xf2ga"]
[ext_resource type="Texture2D" uid="uid://bydfevqfagpq8" path="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_concrete_0025_height_1k.png" id="5_qhmtu"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_drix8"]
resource_name = "DARKER"
@@ -164,50 +163,6 @@ _surfaces = [{
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_pocxj")
[sub_resource type="BoxShape3D" id="BoxShape3D_xf2ga"]
size = Vector3(3.7605, 2.43953, 12.6547)
[sub_resource type="Animation" id="Animation_xf2ga"]
resource_name = "take_damage"
length = 0.250008
step = 0.0833333
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MeshInstance:material_override")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.25),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [ExtResource("2_xf2ga"), null]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MeshInstance:material_override:transparency")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [1]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MeshInstance:transparency")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [0.0, 0.9, 0.25]
}
[sub_resource type="Animation" id="Animation_qhmtu"]
length = 0.001
tracks/0/type = "value"
@@ -275,10 +230,55 @@ tracks/1/keys = {
"values": [ExtResource("2_xf2ga")]
}
[sub_resource type="Animation" id="Animation_6jr7s"]
resource_name = "primary_attack"
[sub_resource type="Animation" id="Animation_xf2ga"]
resource_name = "take_damage"
length = 0.250008
step = 0.0833333
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MeshInstance:material_override")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.25),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [ExtResource("2_xf2ga"), null]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MeshInstance:material_override:transparency")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [1]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MeshInstance:transparency")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.25),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [0.0, 0.9, 0.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_mi284"]
_data = {
&"RESET": SubResource("Animation_qhmtu"),
&"defeated": SubResource("Animation_mi284"),
&"primary_attack": SubResource("Animation_6jr7s"),
&"take_damage": SubResource("Animation_xf2ga")
}
@@ -291,18 +291,6 @@ transform = Transform3D(0, 0.629497, 0.347758, -0.719167, 0, 0, 0, -0.347758, 0.
mesh = SubResource("ArrayMesh_8pgwy")
skeleton = NodePath("")
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 0, 0)
collision_layer = 64
collision_mask = 64
script = ExtResource("7_oxjs8")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0939882, 1.15479, -6.78312)
shape = SubResource("BoxShape3D_xf2ga")
disabled = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {

View File

@@ -4,12 +4,12 @@ importer="scene"
importer_version=1
type="PackedScene"
uid="uid://di0p6rdjw2s85"
path="res://.godot/imported/PILLAR EXPORT 1.glb-f4cad65c662305d7fc7f74d6d8dc0d91.scn"
path="res://.godot/imported/PILLAR EXPORT 1.glb-bfc66d3e7255967f66430f576d8b93e9.scn"
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1.glb"
dest_files=["res://.godot/imported/PILLAR EXPORT 1.glb-f4cad65c662305d7fc7f74d6d8dc0d91.scn"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1.glb"
dest_files=["res://.godot/imported/PILLAR EXPORT 1.glb-bfc66d3e7255967f66430f576d8b93e9.scn"]
[params]

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cc1tenm6p3pca"
path="res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg-aa28fe0566a79d119654f832bf3e37d4.ctex"
path="res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg-b04caaa035d892b20005582a84f66a7c.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg-aa28fe0566a79d119654f832bf3e37d4.ctex"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE.jpg-b04caaa035d892b20005582a84f66a7c.ctex"]
[params]

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cvst7yhbw0sxt"
path="res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg-5c45444ccb116de4c008645c049b0b78.ctex"
path="res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg-961cb4e5bb059cbbe822fd03e92f4ac1.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg-5c45444ccb116de4c008645c049b0b78.ctex"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_ENEMY_PILLAR_TEXTURE2.jpg-961cb4e5bb059cbbe822fd03e92f4ac1.ctex"]
[params]

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bnbveonobhyhc"
path="res://.godot/imported/PILLAR EXPORT 1_cannon_edge.png-343d7b79ad9b59f7ef6322df0839c74b.ctex"
path="res://.godot/imported/PILLAR EXPORT 1_cannon_edge.png-8166f53353cf4e8c82155041cf1b8cb2.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_cannon_edge.png"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_cannon_edge.png-343d7b79ad9b59f7ef6322df0839c74b.ctex"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_cannon_edge.png"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_cannon_edge.png-8166f53353cf4e8c82155041cf1b8cb2.ctex"]
[params]

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bydfevqfagpq8"
path="res://.godot/imported/PILLAR EXPORT 1_concrete_0025_height_1k.png-7f51b894f446c48349eafaa8099a658b.ctex"
path="res://.godot/imported/PILLAR EXPORT 1_concrete_0025_height_1k.png-5a41398d7db4f20158b5fd0bbc70089e.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_concrete_0025_height_1k.png"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_concrete_0025_height_1k.png-7f51b894f446c48349eafaa8099a658b.ctex"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_concrete_0025_height_1k.png"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_concrete_0025_height_1k.png-5a41398d7db4f20158b5fd0bbc70089e.ctex"]
[params]

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://by7k6crx6fmpv"
path="res://.godot/imported/PILLAR EXPORT 1_floral_single_tile.jpg-2fce40a9051df851bf70ffcf3a567f61.ctex"
path="res://.godot/imported/PILLAR EXPORT 1_floral_single_tile.jpg-c308c1c93330c1fa72f0499d913bf50c.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/PILLAR EXPORT 1_floral_single_tile.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_floral_single_tile.jpg-2fce40a9051df851bf70ffcf3a567f61.ctex"]
source_file="res://src/enemy/enemy_types/10. Eden Pillar/model/PILLAR EXPORT 1_floral_single_tile.jpg"
dest_files=["res://.godot/imported/PILLAR EXPORT 1_floral_single_tile.jpg-c308c1c93330c1fa72f0499d913bf50c.ctex"]
[params]

View File

@@ -1,10 +1,11 @@
[gd_scene load_steps=13 format=3 uid="uid://bc1sp6xwe0j65"]
[gd_scene load_steps=14 format=3 uid="uid://bc1sp6xwe0j65"]
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_0ecnn"]
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_cxmwa"]
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Set A/03. Antechamber A.tscn" id="3_gkkr3"]
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/Set A/08. BasinRoom.tscn" id="8_5rblf"]
[ext_resource type="PackedScene" uid="uid://cmvimr0pvsgqy" path="res://src/enemy/enemy_types/10. Eden Pillar/Eden Pillar.tscn" id="10_atq1f"]
[ext_resource type="PackedScene" uid="uid://cfecvvav8kkp6" path="res://src/player/Player.tscn" id="11_sdyti"]
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="12_aw26s"]
[ext_resource type="PackedScene" uid="uid://cihbmyo0ltq4m" path="res://src/map/dungeon/scenes/Set A/19. Floor Exit A.tscn" id="12_n02rw"]
[ext_resource type="PackedScene" uid="uid://bksq62muhk3h5" path="res://src/enemy/enemy_types/01. sproingy/Sproingy.tscn" id="13_kwaga"]
@@ -176,3 +177,6 @@ EnemyList = Array[PackedScene]([ExtResource("13_kwaga"), ExtResource("14_gkkr3")
[node name="Eden Pillar" parent="." instance=ExtResource("10_atq1f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.7976, -1.33866, 30.3232)
[node name="Player" parent="." instance=ExtResource("11_sdyti")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.6846, -1.648, 32.5604)

View File

@@ -16,6 +16,15 @@ public interface IHasSecondaryAttack
public void SecondaryAttack();
}
public interface IHasTertiaryAttack
{
public ElementType TertiaryAttackElementalType { set; }
public double TertiaryAttackElementalDamageBonus { set; }
public void TertiaryAttack();
}
public interface IHasPrimarySkill
{
public void PrimarySkill();