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

119 lines
4.4 KiB
C#

using ActiveProtect.SimulationEnvironment;
using System;
namespace ActiveProtect.Models
{
/// <summary>
/// 激光半主动制导导弹类,继承自基础导弹类
/// </summary>
public class LaserSemiActiveGuidedMissile : Missile
{
/// <summary>
/// 激光锁定距离(米)
/// </summary>
private const double LaserLockDistance = 1500;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="id">导弹ID</param>
/// <param name="missileConfig">导弹配置</param>
/// <param name="simulationManager">仿真管理器</param>
public LaserSemiActiveGuidedMissile(
string id,
MissileConfig missileConfig,
ISimulationManager simulationManager)
: base(id, missileConfig, simulationManager)
{
Type = MissileType.LaserSemiActiveGuidance;
simulationManager.SubscribeToEvent<LaserIlluminationEvent>(OnLaserIllumination);
simulationManager.SubscribeToEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
/// <summary>
/// 更新导弹的制导状态
/// </summary>
protected override void UpdateGuidanceStatus()
{
bool previousHasGuidance = HasGuidance;
if (SimulationManager.GetEntityById(TargetId) is ILaserIlluminatable target)
{
bool isIlluminated = target.IsIlluminated;
bool isWithinRange = DistanceToTarget <= LaserLockDistance;
HasGuidance = isIlluminated && isWithinRange;
Console.WriteLine($"激光半主动制导导弹 {Id} 状态更新:");
Console.WriteLine($" 目标 {TargetId} 是否被照射: {isIlluminated}");
Console.WriteLine($" 距离目标: {DistanceToTarget:F2} m (最大锁定距离: {LaserLockDistance} m)");
Console.WriteLine($" 是否在锁定范围内: {isWithinRange}");
Console.WriteLine($" 引导状态: {(HasGuidance ? "" : "")}");
if (!HasGuidance && previousHasGuidance)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 失去引导");
LastKnownVelocity = Velocity;
}
else if (HasGuidance && !previousHasGuidance)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 获得引导");
}
}
else
{
HasGuidance = false;
Console.WriteLine($"激光半主动制导导弹 {Id} 无法找到目标 {TargetId}");
}
base.UpdateGuidanceStatus();
}
/// <summary>
/// 处理激光照射事件
/// </summary>
/// <param name="evt">激光照射事件</param>
private void OnLaserIllumination(LaserIlluminationEvent evt)
{
if (evt.TargetId == TargetId)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 检测到目标 {TargetId} 被激光照射");
UpdateGuidanceStatus();
}
}
/// <summary>
/// 处理激光照射停止事件
/// </summary>
/// <param name="evt">激光照射停止事件</param>
private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt)
{
if (evt.TargetId == TargetId)
{
Console.WriteLine($"激光半主动制导导弹 {Id} 检测到目标 {TargetId} 激光照射停止");
UpdateGuidanceStatus();
}
}
/// <summary>
/// 获取导弹状态信息
/// </summary>
/// <returns>状态信息字符串</returns>
public override string GetStatus()
{
string baseStatus = base.GetStatus().Replace("导弹", "激光半主动制导导弹");
string additionalStatus = $"\n 激光引导: {(HasGuidance ? "" : "")}";
return baseStatus + additionalStatus;
}
/// <summary>
/// 停用导弹
/// </summary>
protected override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<LaserIlluminationEvent>(OnLaserIllumination);
SimulationManager.UnsubscribeFromEvent<LaserIlluminationStopEvent>(OnLaserIlluminationStop);
}
}
}