ActiveProtect/Models/Tank.cs
2024-10-16 11:07:06 +08:00

116 lines
3.4 KiB
C#

using ActiveProtect.SimulationEnvironment;
using System;
namespace ActiveProtect.Models
{
/// <summary>
/// 表示仿真中的坦克
/// </summary>
public class Tank(string id, TankConfig tankConfig, ISimulationManager simulationManager) : SimulationElement(id, tankConfig.InitialPosition, tankConfig.InitialOrientation, simulationManager), ILaserIlluminatable
{
/// <summary>
/// 当前速度(米/秒)
/// </summary>
public double Speed { get; set; } = tankConfig.InitialSpeed;
/// <summary>
/// 最大速度(米/秒)
/// </summary>
public double MaxSpeed { get; private set; } = tankConfig.MaxSpeed;
/// <summary>
/// 最大装甲值
/// </summary>
public double MaxArmor { get; private set; } = tankConfig.MaxArmor;
/// <summary>
/// 当前装甲值
/// </summary>
public double CurrentArmor { get; private set; } = tankConfig.MaxArmor;
/// <summary>
/// 是否被激光照射
/// </summary>
public bool IsIlluminated { get; private set; } = false;
/// <summary>
/// 更新坦克状态
/// </summary>
/// <param name="deltaTime">时间步长(秒)</param>
public override void Update(double deltaTime)
{
if (!IsActive) return;
UpdatePosition(deltaTime);
}
/// <summary>
/// 更新坦克位置
/// </summary>
/// <param name="deltaTime">时间步长(秒)</param>
private void UpdatePosition(double deltaTime)
{
Vector3D direction = Orientation.ToVector();
Vector3D movement = direction * Speed * deltaTime;
Position += movement;
}
/// <summary>
/// 坦克受到伤害
/// </summary>
/// <param name="damage">伤害值</param>
/// <param name="isMissileDamage">是否为导弹造成的伤害</param>
public void TakeDamage(double damage, bool isMissileDamage = false)
{
if (isMissileDamage)
{
damage = CurrentArmor * 0.5;
}
CurrentArmor = Math.Max(0, CurrentArmor - damage);
if (CurrentArmor <= 0)
{
Deactivate();
}
}
/// <summary>
/// 被激光照射
/// </summary>
public void Illuminate()
{
if (!IsIlluminated)
{
IsIlluminated = true;
Console.WriteLine($"坦克 {Id} 被激光照射");
}
}
/// <summary>
/// 停止激光照射
/// </summary>
public void StopIllumination()
{
if (IsIlluminated)
{
IsIlluminated = false;
Console.WriteLine($"坦克 {Id} 激光照射停止");
}
}
/// <summary>
/// 获取坦克状态信息
/// </summary>
/// <returns>坦克状态字符串</returns>
public override string GetStatus()
{
return $"坦克 {Id}:\n" +
$" 位置: {Position}\n" +
$" 速度: {Speed:F2}/{MaxSpeed:F2}\n" +
$" 装甲: {CurrentArmor:F2}/{MaxArmor:F2}\n" +
$" 状态: {(IsActive ? "" : "")}\n" +
$" 激光照射: {(IsIlluminated ? "" : "")}\n";
}
}
}