128 lines
3.5 KiB
C#
128 lines
3.5 KiB
C#
using System;
|
|
using XRL.UI;
|
|
using XRL.World.Capabilities;
|
|
using XRL.World.Parts;
|
|
using XRL.World.Parts.Mutation;
|
|
|
|
// this is 95% copy/pasted from decompiled vanilla HeightenedHearingEffect
|
|
// only thing added was a reference to the implant because it has the part rather than the implantee
|
|
namespace XRL.World.Effects
|
|
{
|
|
[Serializable]
|
|
public class CyberneticHeightenedHearingEffect : Effect
|
|
{
|
|
public bool Identified;
|
|
public int Level = 1;
|
|
public GameObject Listener;
|
|
public GameObject Implant;
|
|
|
|
public CyberneticHeightenedHearingEffect() => this.Duration = 1;
|
|
|
|
public CyberneticHeightenedHearingEffect(int Level, GameObject Listener, GameObject Implant)
|
|
: this()
|
|
{
|
|
this.Level = Level;
|
|
this.Listener = Listener;
|
|
this.Implant = Implant;
|
|
}
|
|
|
|
public override int GetEffectType() => 2048;
|
|
|
|
public override bool SameAs(Effect e) => false;
|
|
|
|
public override string GetDescription() => (string)null;
|
|
|
|
public override bool WantEvent(int ID, int cascade) => base.WantEvent(ID, cascade) || ID == SingletonEvent<EndTurnEvent>.ID || ID == EnteringCellEvent.ID;
|
|
|
|
public override bool HandleEvent(AfterPlayerBodyChangeEvent E)
|
|
{
|
|
this.CheckListen();
|
|
return base.HandleEvent(E);
|
|
}
|
|
|
|
public override bool HandleEvent(EndTurnEvent E)
|
|
{
|
|
this.CheckListen();
|
|
return base.HandleEvent(E);
|
|
}
|
|
|
|
public override bool HandleEvent(EnteringCellEvent E)
|
|
{
|
|
this.CheckListen();
|
|
return base.HandleEvent(E);
|
|
}
|
|
|
|
private bool BadListener()
|
|
{
|
|
this.Listener = (GameObject)null;
|
|
this.Object?.RemoveEffect((Effect)this);
|
|
return true;
|
|
}
|
|
|
|
public bool CheckListen()
|
|
{
|
|
if (!GameObject.Validate(this.Object))
|
|
return true;
|
|
if (!GameObject.Validate(ref this.Listener) || !this.Listener.IsPlayer())
|
|
return this.BadListener();
|
|
CyberneticsHearingAid part = this.Listener.GetPart<CyberneticsHearingAid>();
|
|
if (part == null || part.Level <= 0)
|
|
return this.BadListener();
|
|
if (!(Implant.GetPart("CyberneticsHearingAid") is CyberneticsHearingAid otherpart))
|
|
return this.BadListener();
|
|
int num = this.Object.DistanceTo(this.Listener);
|
|
if (num > part.GetRadius())
|
|
return this.BadListener();
|
|
if (this.Identified || this.Object.CurrentCell == null)
|
|
return true;
|
|
if (((int)((double)(100 + 10 * this.Level) / Math.Pow((double)(num + 9), 2.0) * 100.0)).in100())
|
|
{
|
|
this.Identified = true;
|
|
if (this.Listener.IsPlayer())
|
|
AutoAct.CheckHostileInterrupt();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public override bool Apply(GameObject Object)
|
|
{
|
|
this.CheckListen();
|
|
return true;
|
|
}
|
|
|
|
public override void RegisterActive(GameObject Object, IEventRegistrar Registrar) => Registrar.Register((IEventSource)The.Game, (IEventHandler)this, PooledEvent<AfterPlayerBodyChangeEvent>.ID);
|
|
|
|
public bool HeardAndNotSeen(GameObject obj)
|
|
{
|
|
if (obj == null)
|
|
return false;
|
|
if (!obj.IsVisible())
|
|
return true;
|
|
Cell currentCell = obj.CurrentCell;
|
|
return currentCell != null && (!currentCell.IsLit() || !currentCell.IsExplored());
|
|
}
|
|
|
|
public override bool FinalRender(RenderEvent E, bool bAlt)
|
|
{
|
|
if (!this.HeardAndNotSeen(this.Object) || !this.Object.CanHypersensesDetect())
|
|
return true;
|
|
E.Tile = (string)null;
|
|
if (this.Identified)
|
|
{
|
|
E.HighestLayer = 0;
|
|
E.NoWake = true;
|
|
this.Object.ComponentRender(E);
|
|
E.RenderString = this.Object.Render.RenderString;
|
|
if (Options.UseTiles)
|
|
E.Tile = this.Object.Render.Tile;
|
|
}
|
|
else
|
|
E.RenderString = "?";
|
|
E.ColorString = "&K";
|
|
E.DetailColor = "K";
|
|
E.CustomDraw = true;
|
|
return false;
|
|
}
|
|
}
|
|
}
|