Files
doom-dm/DoomDeathmatch/src/Component/MVC/Controller/EnemyController.cs
2025-01-06 00:45:28 +03:00

75 lines
2.5 KiB
C#

using DoomDeathmatch.Component.MVC.Model.Enemy;
using DoomDeathmatch.Component.MVC.Model.Enemy.Attack;
using DoomDeathmatch.Component.MVC.View;
using DoomDeathmatch.Component.Util;
namespace DoomDeathmatch.Component.MVC.Controller;
public class EnemyController : Engine.Scene.Component.Component
{
public HealthController HealthController => _healthController;
private GameController _gameController = null!;
private HealthController _healthController = null!;
private EnemyView _enemyView = null!;
private MovementController _movementController = null!;
private AttackBehavior _attackBehavior = null!;
private readonly EnemyData _enemyData;
public EnemyController(EnemyData parEnemyData)
{
_enemyData = parEnemyData;
}
public override void Awake()
{
_gameController = GameObject.Scene!.FindFirstComponent<GameController>()!;
_healthController = GameObject.GetComponent<HealthController>()!;
_enemyView = GameObject.GetComponent<EnemyView>()!;
_movementController = GameObject.GetComponent<MovementController>()!;
ArgumentNullException.ThrowIfNull(_gameController);
ArgumentNullException.ThrowIfNull(_healthController);
ArgumentNullException.ThrowIfNull(_enemyView);
ArgumentNullException.ThrowIfNull(_movementController);
_attackBehavior = _enemyData.AttackBehaviorCreator.Create(this, _gameController.PlayerController.HealthController);
_healthController.SetMaxHealth(_enemyData.BaseHealth);
_healthController.OnDeath += OnDeath;
_enemyView.UpdateView(_enemyData);
_movementController.Speed = _enemyData.BaseSpeed;
}
public override void Start()
{
var billboardComponent = GameObject.GetComponentInChildren<BillboardComponent>();
if (billboardComponent == null)
return;
billboardComponent.Target = _gameController.PlayerController.Camera.GameObject.Transform;
}
public override void Update(double parDeltaTime)
{
var playerPosition = _gameController.PlayerController.GameObject.Transform.Translation;
var enemyPosition = GameObject.Transform.Translation;
var nextPosition = _enemyData.MovementBehavior.GetNextPosition(enemyPosition, playerPosition);
if (enemyPosition != nextPosition)
{
var direction = (nextPosition - enemyPosition).Normalized();
_movementController.ApplyMovement(direction);
}
_attackBehavior.Attack(parDeltaTime);
}
private void OnDeath()
{
GameObject.Scene!.Remove(GameObject);
_gameController.ScoreController.AddScore(_enemyData.BaseScore);
}
}