61 lines
2 KiB
C#
61 lines
2 KiB
C#
|
|
using MessagePack;
|
||
|
|
using Newtonsoft.Json;
|
||
|
|
|
||
|
|
// A coolant dump that becomes a vapour cloud: the first time it runs it vents one cloud around its venter,
|
||
|
|
// drifting with the venter's velocity. Radius, Opacity and Lifetime are evaluated through the host, so role
|
||
|
|
// quality applies as for any other stat. Later runs vent nothing.
|
||
|
|
[Inspectable, MessagePackObject, JsonObject(MemberSerialization.OptIn), RuntimeInspectable]
|
||
|
|
public class VapourDumpData : BehaviorData
|
||
|
|
{
|
||
|
|
[Inspectable, JsonProperty("radius"), Key(1), RuntimeInspectable]
|
||
|
|
public PerformanceStat Radius = new PerformanceStat();
|
||
|
|
|
||
|
|
// How much of a sight line's signal a fresh cloud removes, in [0, 1].
|
||
|
|
[Inspectable, JsonProperty("opacity"), Key(2), RuntimeInspectable]
|
||
|
|
public PerformanceStat Opacity = new PerformanceStat();
|
||
|
|
|
||
|
|
// Seconds from venting until the cloud has faded away and is removed.
|
||
|
|
[Inspectable, JsonProperty("lifetime"), Key(3), RuntimeInspectable]
|
||
|
|
public PerformanceStat Lifetime = new PerformanceStat();
|
||
|
|
|
||
|
|
public override Behavior CreateInstance(EquippedItem item)
|
||
|
|
{
|
||
|
|
return new VapourDump(this, item);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override Behavior CreateInstance(ConsumableItemEffect item)
|
||
|
|
{
|
||
|
|
return new VapourDump(this, item);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public class VapourDump : Behavior
|
||
|
|
{
|
||
|
|
private VapourDumpData _data;
|
||
|
|
private bool _vented;
|
||
|
|
|
||
|
|
public VapourDump(VapourDumpData data, EquippedItem item) : base(data, item)
|
||
|
|
{
|
||
|
|
_data = data;
|
||
|
|
}
|
||
|
|
|
||
|
|
public VapourDump(VapourDumpData data, ConsumableItemEffect item) : base(data, item)
|
||
|
|
{
|
||
|
|
_data = data;
|
||
|
|
}
|
||
|
|
|
||
|
|
public override bool Execute(float dt)
|
||
|
|
{
|
||
|
|
if (_vented) return true;
|
||
|
|
_vented = true;
|
||
|
|
Entity.Zone.Vent(new VapourCloud
|
||
|
|
{
|
||
|
|
Body = new KinematicBody { Position = Entity.Position.xz, Velocity = Entity.Velocity },
|
||
|
|
Radius = Evaluate(_data.Radius),
|
||
|
|
Opacity = Evaluate(_data.Opacity),
|
||
|
|
Lifetime = Evaluate(_data.Lifetime),
|
||
|
|
Venter = Entity
|
||
|
|
});
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|