Refactor stats
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Godot;
|
||||
using System;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using Zennysoft.Game.Implementation.Components;
|
||||
using Zennysoft.Ma.Adapter;
|
||||
using Zennysoft.Ma.Adapter.Entity;
|
||||
|
||||
@@ -26,11 +26,11 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
|
||||
[Dependency] protected IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
|
||||
#endregion
|
||||
|
||||
public HealthComponent HealthComponent { get; private set; }
|
||||
public IHealthComponent HealthComponent { get; private set; }
|
||||
|
||||
public AttackComponent AttackComponent { get; private set; }
|
||||
public IAttackComponent AttackComponent { get; private set; }
|
||||
|
||||
public DefenseComponent DefenseComponent { get; private set; }
|
||||
public IDefenseComponent DefenseComponent { get; private set; }
|
||||
|
||||
public virtual IEnemyModelView EnemyModelView { get; set; } = default!;
|
||||
|
||||
@@ -118,36 +118,6 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
|
||||
|
||||
}
|
||||
|
||||
public void SetTarget(Vector3 targetPosition) => TargetPosition = targetPosition;
|
||||
|
||||
public virtual void SetEnemyPosition(Vector3 newPosition)
|
||||
{
|
||||
GlobalPosition = newPosition;
|
||||
|
||||
if (this is IHavePatrolBehavior patrolEnemy)
|
||||
patrolEnemy.PatrolBehavior.HomePosition = GlobalPosition;
|
||||
|
||||
_enemyLogic.Input(new EnemyLogic.Input.Reset());
|
||||
}
|
||||
|
||||
public void LookAtTarget(Vector3 targetPosition)
|
||||
{
|
||||
var lookDirection = GlobalPosition - targetPosition;
|
||||
if (lookDirection != GlobalPosition)
|
||||
LookAt(new Vector3(lookDirection.X, GlobalPosition.Y, lookDirection.Z), Vector3.Up);
|
||||
}
|
||||
|
||||
public virtual void TakeDamage(int damage)
|
||||
{
|
||||
GD.Print($"Enemy Hit for {damage} damage.");
|
||||
HealthComponent.Damage(damage);
|
||||
}
|
||||
|
||||
private void EnemyModelView_HitPlayer(object sender, System.EventArgs e)
|
||||
{
|
||||
_player.TakeDamage(new Damage(AttackComponent.TotalAttack, ElementType.None, false, false, false));
|
||||
}
|
||||
|
||||
public virtual void TakeHit()
|
||||
{
|
||||
_enemyLogic.Input(new EnemyLogic.Input.Alert());
|
||||
@@ -181,4 +151,37 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
|
||||
_enemyLogic.Stop();
|
||||
EnemyBinding.Dispose();
|
||||
}
|
||||
|
||||
public virtual void MoveEnemyToNewRoom(IDungeonRoom newRoom)
|
||||
{
|
||||
if (newRoom is MonsterRoom monsterRoom)
|
||||
{
|
||||
var spawnPoints = monsterRoom.EnemySpawnPoints.GetChildren().OfType<Marker3D>().ToList();
|
||||
var spawnPointsGodotCollection = new Godot.Collections.Array<Marker3D>(spawnPoints);
|
||||
var randomSpawnPoint = spawnPointsGodotCollection.PickRandom();
|
||||
|
||||
GlobalPosition = randomSpawnPoint.GlobalPosition;
|
||||
|
||||
if (this is IHavePatrolBehavior patrolEnemy)
|
||||
patrolEnemy.PatrolBehavior.HomePosition = GlobalPosition;
|
||||
|
||||
_enemyLogic.Input(new EnemyLogic.Input.Reset());
|
||||
}
|
||||
|
||||
throw new NotImplementedException($"Only {nameof(MonsterRoom)} types are currently supported.");
|
||||
}
|
||||
|
||||
protected void LookAtTarget(Vector3 targetPosition)
|
||||
{
|
||||
var lookDirection = GlobalPosition - targetPosition;
|
||||
if (lookDirection != GlobalPosition)
|
||||
LookAt(new Vector3(lookDirection.X, GlobalPosition.Y, lookDirection.Z), Vector3.Up);
|
||||
}
|
||||
|
||||
protected void SetTarget(Vector3 targetPosition) => TargetPosition = targetPosition;
|
||||
|
||||
private void EnemyModelView_HitPlayer(object sender, System.EventArgs e)
|
||||
{
|
||||
_player.TakeDamage(new Damage(AttackComponent.TotalAttack, ElementType.None, false, false, false));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user