private void ResolveCannons() { if (!this.Pawn.Drafted && this.broadsideFire.Count > 0) { foreach (SPTuples.SPTuple <Stack <int>, CannonHandler> side in broadsideFire) { side.Second.reloading = true; } this.broadsideFire.Clear(); } if (this.broadsideFire.Count > 0) { for (int i = 0; i < this.broadsideFire.Count; i++) { SPTuples.SPTuple <Stack <int>, CannonHandler> side = broadsideFire[i]; side.Second.reloading = false; int tick = broadsideFire[i].Third; if (broadsideFire[i].Third % side.Second.TicksPerShot == 0) { this.FireCannonBroadside(side.Second, side.First.Pop()); } tick++; broadsideFire[i].Third = tick; if (!side.First.Any()) { side.Second.reloading = true; broadsideFire.RemoveAt(i); } } } }
private void ResetVoices() { this.VoicesActive = false; this.voicesCycle = 0; this.voiceAttempted = null; this.targetHunted = null; this.targetLured = false; }
public override void CompTickRare() { base.CompTickRare(); if (this.Pawn.CurJobDef == JobDefOf.PredatorHunt && this.WithinVoiceRange(this.Pawn.CurJob.targetA.Thing.Position) && !this.VoicesActive && voiceAttempted is null && !this.TargetLured) { targetHunted = this.Pawn?.CurJob?.targetA.Thing as Pawn; if (this.TooCloseToVoice()) { goto Block_TooClose; } this.VoicesActive = true; List <Pawn> pawnsToMimic = new List <Pawn>(); foreach (Pawn p in this.targetHunted.MapHeld.mapPawns.AllPawnsSpawned) { if (p.RaceProps.Humanlike && p != targetHunted && targetHunted.relations.everSeenByPlayer) { pawnsToMimic.Add(p); } } Pawn randomVoice = pawnsToMimic.Count > 0 ? pawnsToMimic.RandomElement() : null; voiceAttempted = new SPTuples.SPTuple <Pawn, bool, Pawn>(targetHunted, false, randomVoice); } if (this.VoicesActive && voiceAttempted?.First != null && !voiceAttempted.Second) { if (this.TooFarToVoice()) { this.ResetVoices(); return; } voicesCycle++; if (voicesCycle >= 4) { this.VoicesActive = false; voiceAttempted.Second = true; int chanceToLure = (int)Mathf.Lerp(0f, 50f, ((voiceAttempted.Third != null ? this.targetHunted.relations.OpinionOf(voiceAttempted.Third) : 0) + 100) / 200f); //Log.Message(chanceToLure + "%"); //chanceToLure *= 999; if (chanceToLure > Rand.Range(0, 100)) { this.targetLured = true; this.targetHunted.jobs.TryTakeOrderedJob(new Job(JobDefOf.GotoWander, this.Pawn.Position), JobTag.InMentalState); this.StartMentalStateSpecificPos(this.targetHunted, this.Pawn.Position); } } } Block_TooClose :; if (this.targetHunted != null && (this.targetHunted.Dead || this.targetHunted != this.Pawn?.CurJob?.targetA.Thing as Pawn)) { this.ResetVoices(); } }
/*public override void PostDraw() * { * foreach(CannonHandler cannon in this.Cannons) * { * if(cannon.CannonTexture != null) * { * Graphic graphic = GhostUtility.GhostGraphicFor(cannon.CannonTexture, ) * } * } * }*/ public override IEnumerable <Gizmo> CompGetGizmosExtra() { if (this.Pawn.Drafted) { if (this.cannons != null && this.cannons.Count > 0) { if (this.cannons.Any(x => x.weaponType == WeaponType.Broadside)) { if (this.cannons.Any(x => x.weaponLocation == WeaponLocation.Port)) { foreach (CannonHandler cannon in this.cannons.Where(x => x.weaponLocation == WeaponLocation.Port)) { Command_CooldownAction portSideCannons = new Command_CooldownAction(); portSideCannons.cannon = cannon; portSideCannons.comp = this; portSideCannons.defaultLabel = "CannonLabel".Translate(cannon.label); portSideCannons.icon = TexCommandShips.BroadsideCannon_Port; portSideCannons.action = delegate() { SPTuples.SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuples.SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; portSideCannons.hotKey = KeyBindingDefOf.Misc4; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { portSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, handler.role.label)); } } yield return(portSideCannons); } } if (this.cannons.Any(x => x.weaponLocation == WeaponLocation.Starboard)) { foreach (CannonHandler cannon in this.cannons.Where(x => x.weaponLocation == WeaponLocation.Starboard)) { Command_CooldownAction starboardSideCannons = new Command_CooldownAction(); starboardSideCannons.cannon = cannon; starboardSideCannons.comp = this; starboardSideCannons.defaultLabel = "CannonLabel".Translate(cannon.label); starboardSideCannons.icon = TexCommandShips.BroadsideCannon_Starboard; starboardSideCannons.action = delegate() { SPTuples.SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuples.SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; starboardSideCannons.hotKey = KeyBindingDefOf.Misc5; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { starboardSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, handler.role.label)); } } yield return(starboardSideCannons); } } Command_SetRange range = new Command_SetRange(); range.defaultLabel = "SetRange".Translate(); range.icon = TexCommand.Attack; range.activeCannons = this.cannons.FindAll(x => x.weaponType == WeaponType.Broadside); range.cannonComp = this; yield return(range); } } } }