163 lines
6.8 KiB
C#
163 lines
6.8 KiB
C#
using RimWorld;
|
||
using Verse;
|
||
using RimWorld.Planet;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
|
||
namespace WulaFallenEmpire
|
||
{
|
||
public class CompProperties_AircraftStrike : CompProperties_AbilityEffect
|
||
{
|
||
public ThingDef requiredAircraftType; // 需要的战机类型
|
||
public int aircraftCooldownTicks = 60000; // 战机冷却时间(默认1天)
|
||
public int aircraftsPerUse = 1; // 每次使用消耗的战机数量
|
||
|
||
public CompProperties_AircraftStrike()
|
||
{
|
||
compClass = typeof(CompAbilityEffect_AircraftStrike);
|
||
}
|
||
}
|
||
|
||
public class CompAbilityEffect_AircraftStrike : CompAbilityEffect
|
||
{
|
||
public new CompProperties_AircraftStrike Props => (CompProperties_AircraftStrike)props;
|
||
|
||
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
|
||
{
|
||
base.Apply(target, dest);
|
||
|
||
// 获取全局战机管理器
|
||
WorldComponent_AircraftManager aircraftManager = Find.World.GetComponent<WorldComponent_AircraftManager>();
|
||
|
||
if (aircraftManager == null)
|
||
{
|
||
Log.Error("AircraftManagerNotFound".Translate());
|
||
return;
|
||
}
|
||
|
||
// 检查并消耗战机
|
||
if (aircraftManager.TryUseAircraft(Props.requiredAircraftType, Props.aircraftsPerUse, parent.pawn.Faction, Props.aircraftCooldownTicks))
|
||
{
|
||
// 成功消耗战机,发送消息
|
||
Messages.Message("AircraftStrikeInitiated".Translate(Props.requiredAircraftType.LabelCap), MessageTypeDefOf.PositiveEvent);
|
||
Log.Message("AircraftStrikeSuccess".Translate(Props.aircraftsPerUse, Props.requiredAircraftType.LabelCap));
|
||
}
|
||
else
|
||
{
|
||
Messages.Message("NoAvailableAircraft".Translate(Props.requiredAircraftType.LabelCap), MessageTypeDefOf.NegativeEvent);
|
||
Log.Warning("AircraftStrikeFailed".Translate(Props.requiredAircraftType.LabelCap, parent.pawn.Faction?.Name ?? "UnknownFaction".Translate()));
|
||
}
|
||
}
|
||
|
||
public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest)
|
||
{
|
||
// 检查是否有可用的战机
|
||
WorldComponent_AircraftManager aircraftManager = Find.World.GetComponent<WorldComponent_AircraftManager>();
|
||
|
||
return base.CanApplyOn(target, dest) &&
|
||
aircraftManager != null &&
|
||
aircraftManager.HasAvailableAircraft(Props.requiredAircraftType, Props.aircraftsPerUse, parent.pawn.Faction);
|
||
}
|
||
|
||
public override string ExtraLabelMouseAttachment(LocalTargetInfo target)
|
||
{
|
||
WorldComponent_AircraftManager aircraftManager = Find.World.GetComponent<WorldComponent_AircraftManager>();
|
||
|
||
if (aircraftManager != null)
|
||
{
|
||
int available = aircraftManager.GetAvailableAircraftCount(Props.requiredAircraftType, parent.pawn.Faction);
|
||
int onCooldown = aircraftManager.GetCooldownAircraftCount(Props.requiredAircraftType, parent.pawn.Faction);
|
||
|
||
// 使用符号显示飞机状态
|
||
string availableSymbols = GetAircraftSymbols(available, "◆");
|
||
string cooldownSymbols = GetAircraftSymbols(onCooldown, "◇");
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.AppendLine("AvailableAircraft".Translate(Props.requiredAircraftType.LabelCap, availableSymbols));
|
||
sb.AppendLine("CooldownAircraft".Translate(cooldownSymbols));
|
||
sb.Append("CostPerUse".Translate(Props.aircraftsPerUse));
|
||
|
||
return sb.ToString();
|
||
}
|
||
|
||
return base.ExtraLabelMouseAttachment(target);
|
||
}
|
||
|
||
// 生成飞机符号表示
|
||
private string GetAircraftSymbols(int count, string symbol)
|
||
{
|
||
if (count <= 0) return "—"; // 无飞机时显示破折号
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
int displayCount = count;
|
||
|
||
// 如果数量过多,用数字+符号表示
|
||
if (count > 10)
|
||
{
|
||
return $"{count}{symbol}";
|
||
}
|
||
|
||
// 直接显示符号
|
||
for (int i = 0; i < displayCount; i++)
|
||
{
|
||
sb.Append(symbol);
|
||
}
|
||
|
||
return sb.ToString();
|
||
}
|
||
|
||
public override bool Valid(LocalTargetInfo target, bool throwMessages = false)
|
||
{
|
||
if (!base.Valid(target, throwMessages))
|
||
return false;
|
||
|
||
// 检查战机可用性
|
||
WorldComponent_AircraftManager aircraftManager = Find.World.GetComponent<WorldComponent_AircraftManager>();
|
||
if (aircraftManager == null || !aircraftManager.HasAvailableAircraft(Props.requiredAircraftType, Props.aircraftsPerUse, parent.pawn.Faction))
|
||
{
|
||
if (throwMessages)
|
||
{
|
||
Messages.Message("NoAircraftForStrike".Translate(Props.requiredAircraftType.LabelCap), MessageTypeDefOf.RejectInput);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
// 鼠标悬停时的工具提示
|
||
public override string ExtraTooltipPart()
|
||
{
|
||
WorldComponent_AircraftManager aircraftManager = Find.World.GetComponent<WorldComponent_AircraftManager>();
|
||
|
||
if (aircraftManager != null)
|
||
{
|
||
int available = aircraftManager.GetAvailableAircraftCount(Props.requiredAircraftType, parent.pawn.Faction);
|
||
int onCooldown = aircraftManager.GetCooldownAircraftCount(Props.requiredAircraftType, parent.pawn.Faction);
|
||
int total = available + onCooldown;
|
||
|
||
// 将冷却时间从 tick 转换为小时
|
||
float cooldownHours = TicksToHours(Props.aircraftCooldownTicks);
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.AppendLine("AircraftStatusTooltip".Translate());
|
||
sb.AppendLine("• " + "TotalAircraft".Translate(total));
|
||
sb.AppendLine("• " + "ReadyAircraft".Translate(available));
|
||
sb.AppendLine("• " + "CooldownAircraft".Translate(onCooldown));
|
||
sb.AppendLine("AircraftAbilityDescription".Translate(Props.requiredAircraftType.LabelCap, Props.aircraftsPerUse, cooldownHours.ToString("F1")));
|
||
|
||
return sb.ToString();
|
||
}
|
||
|
||
return base.ExtraTooltipPart();
|
||
}
|
||
|
||
// 将 tick 转换为小时
|
||
private float TicksToHours(int ticks)
|
||
{
|
||
// RimWorld 中 1 小时 = 2500 tick
|
||
return ticks / 2500f;
|
||
}
|
||
}
|
||
}
|