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.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(); 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.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; } } }