97 lines
3.1 KiB
C#
97 lines
3.1 KiB
C#
using RimWorld;
|
||
using Verse;
|
||
|
||
namespace WulaFallenEmpire
|
||
{
|
||
public class CompFlyOverCooldown : ThingComp
|
||
{
|
||
public CompProperties_FlyOverCooldown Props => (CompProperties_FlyOverCooldown)props;
|
||
|
||
// 冷却结束的tick
|
||
private int cooldownEndTick = -1;
|
||
|
||
// 是否在冷却中
|
||
public bool IsOnCooldown => Find.TickManager.TicksGame < cooldownEndTick;
|
||
|
||
// 剩余冷却时间(ticks)
|
||
public int CooldownTicksRemaining => IsOnCooldown ? cooldownEndTick - Find.TickManager.TicksGame : 0;
|
||
|
||
// 冷却进度(0-1)
|
||
public float CooldownProgress
|
||
{
|
||
get
|
||
{
|
||
if (!IsOnCooldown) return 0f;
|
||
int totalCooldown = cooldownEndTick - (cooldownEndTick - Props.baseCooldownTicks);
|
||
return 1f - ((float)CooldownTicksRemaining / Props.baseCooldownTicks);
|
||
}
|
||
}
|
||
|
||
public override void PostExposeData()
|
||
{
|
||
base.PostExposeData();
|
||
Scribe_Values.Look(ref cooldownEndTick, "cooldownEndTick", -1);
|
||
}
|
||
|
||
// 开始冷却
|
||
public void StartCooldown(int cooldownTicks = -1)
|
||
{
|
||
int actualCooldown = cooldownTicks > 0 ? cooldownTicks : Props.baseCooldownTicks;
|
||
cooldownEndTick = Find.TickManager.TicksGame + actualCooldown;
|
||
|
||
Log.Message($"[FlyOverCooldown] Cooldown started for {actualCooldown} ticks, ends at tick {cooldownEndTick}");
|
||
}
|
||
|
||
// 强制结束冷却
|
||
public void EndCooldown()
|
||
{
|
||
cooldownEndTick = -1;
|
||
}
|
||
|
||
// 获取冷却状态描述
|
||
public string GetCooldownStatus()
|
||
{
|
||
if (!IsOnCooldown)
|
||
return "WULA_FlyOverCooldown.Ready".Translate();
|
||
|
||
return "WULA_FlyOverCooldown.CooldownRemaining".Translate(CooldownTicksRemaining.ToStringTicksToPeriod());
|
||
}
|
||
|
||
public override void CompTick()
|
||
{
|
||
base.CompTick();
|
||
|
||
// 可以在这里添加冷却期间的视觉效果或逻辑
|
||
if (IsOnCooldown && Find.TickManager.TicksGame % 60 == 0) // 每60ticks检查一次
|
||
{
|
||
// 可选:在冷却期间添加一些视觉效果
|
||
if (Rand.MTBEventOccurs(10f, 1f, 1f))
|
||
{
|
||
FleckMaker.ThrowMetaIcon(parent.Position, parent.Map, FleckDefOf.SleepZ);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 在检视面板中显示冷却信息
|
||
public override string CompInspectStringExtra()
|
||
{
|
||
if (IsOnCooldown)
|
||
{
|
||
return "WULA_FlyOverCooldown.BombardmentFacilityStatus".Translate(GetCooldownStatus());
|
||
}
|
||
return "WULA_FlyOverCooldown.BombardmentFacilityReady".Translate();
|
||
}
|
||
}
|
||
|
||
public class CompProperties_FlyOverCooldown : CompProperties
|
||
{
|
||
// 基础冷却时间(ticks)
|
||
public int baseCooldownTicks = 60000; // 默认1天
|
||
|
||
public CompProperties_FlyOverCooldown()
|
||
{
|
||
compClass = typeof(CompFlyOverCooldown);
|
||
}
|
||
}
|
||
}
|