Exemple #1
0
        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);
                    }
                }
            }
        }
Exemple #2
0
 private void ResetVoices()
 {
     this.VoicesActive   = false;
     this.voicesCycle    = 0;
     this.voiceAttempted = null;
     this.targetHunted   = null;
     this.targetLured    = false;
 }
Exemple #3
0
        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();
            }
        }
Exemple #4
0
        /*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);
                    }
                }
            }
        }