private static void PlayWoundedVoiceSound(DamageInfo dinfo, Pawn pawn)
 {
     if (pawn.Dead)
     {
         return;
     }
     if (dinfo.InstantOldInjury)
     {
         return;
     }
     if (dinfo.Def.externalViolence)
     {
         LifeStageUtility.PlayNearestLifestageSound(pawn, (LifeStageAge ls) => ls.soundWounded);
     }
 }
 private static void PlayWoundedVoiceSound(DamageInfo dinfo, Pawn pawn)
 {
     if (pawn.Dead)
     {
         return;
     }
     if (dinfo.InstantOldInjury)
     {
         return;
     }
     if (dinfo.Def.externalViolence)
     {
         if (DamageWorker_AddInjuryCR.cache1 == null)
         {
             DamageWorker_AddInjuryCR.cache1 = delegate(LifeStageAge ls) { return(ls.soundWounded); };
         }
         LifeStageUtility.PlayNearestLifestageSound(pawn, DamageWorker_AddInjuryCR.cache1);
     }
 }
Ejemplo n.º 3
0
 public static new void PlayWoundedVoiceSound(DamageInfo dinfo, Pawn pawn)
 {
     if (pawn.Dead)
     {
         return;
     }
     if (dinfo.InstantPermanentInjury)
     {
         return;
     }
     if (!pawn.SpawnedOrAnyParentSpawned)
     {
         return;
     }
     if (dinfo.Def.ExternalViolenceFor(pawn))
     {
         LifeStageUtility.PlayNearestLifestageSound(pawn, (LifeStageAge ls) => ls.soundWounded, 1f);
     }
 }
Ejemplo n.º 4
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //--Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() called");
            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            duration              = (int)(2500.0f * Rand.Range(0.50f, 0.90f));
            ticks_between_hearts  = Rand.RangeInclusive(70, 130);
            ticks_between_hits    = Rand.Range(xxx.config.min_ticks_between_hits, xxx.config.max_ticks_between_hits);
            ticks_between_thrusts = 100;

            if (xxx.is_bloodlust(pawn))
            {
                ticks_between_hits = (int)(ticks_between_hits * 0.75);
            }
            if (xxx.is_brawler(pawn))
            {
                ticks_between_hits = (int)(ticks_between_hits * 0.90);
            }

            //this.FailOn (() => (!animal.health.capacities.CanBeAwake) || (!comfort_prisoners.is_designated (animal)));
            // Fail if someone else reserves the prisoner before the pawn arrives or colonist can't reach animal
            this.FailOn(() => !pawn.CanReserveAndReach(animal, PathEndMode.Touch, Danger.Deadly));
            this.FailOn(() => animal.HostileTo(pawn));
            this.FailOnDespawnedNullOrForbidden(target_animal);
            this.FailOn(() => pawn.Drafted);
            yield return(Toils_Reserve.Reserve(target_animal, 1, 0));

            //Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() - moving towards animal");
            yield return(Toils_Goto.GotoThing(target_animal, PathEndMode.Touch));

            yield return(Toils_Interpersonal.WaitToBeAbleToInteract(pawn));

            yield return(Toils_Interpersonal.GotoInteractablePosition(target_animal));

            if (xxx.is_kind(pawn) ||
                (xxx.CTIsActive && xxx.has_traits(pawn) && pawn.story.traits.HasTrait(TraitDef.Named("RCT_AnimalLover"))))
            {
                yield return(TalkToAnimal(pawn, animal));

                yield return(TalkToAnimal(pawn, animal));
            }
            if (Rand.Chance(0.6f))
            {
                yield return(TalkToAnimal(pawn, animal));
            }
            yield return(Toils_Goto.GotoThing(target_animal, PathEndMode.OnCell));

            SexUtility.RapeAttemptAlert(pawn, animal);

            Toil rape = new Toil();

            rape.initAction = delegate
            {
                //--Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() - reserving animal");

                //--Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() - Setting animal job driver");
                if (!(animal.jobs.curDriver is JobDriver_GettinRaped dri))
                {
                    //wild animals may flee or attack
                    if (pawn.Faction != animal.Faction && animal.RaceProps.wildness > Rand.Range(0.22f, 1.0f) &&
                        !(pawn.TicksPerMoveCardinal < (animal.TicksPerMoveCardinal / 2) && !animal.Downed && xxx.is_not_dying(animal)))
                    {
                        animal.jobs.StopAll();                         // Wake up if sleeping.

                        float aggro = animal.kindDef.RaceProps.manhunterOnTameFailChance;
                        if (animal.kindDef.RaceProps.predator)
                        {
                            aggro += 0.2f;
                        }
                        else
                        {
                            aggro -= 0.1f;
                        }

                        if (Rand.Chance(aggro) && animal.CanSee(pawn))
                        {
                            animal.rotationTracker.FaceTarget(pawn);
                            LifeStageUtility.PlayNearestLifestageSound(animal, (ls) => ls.soundAngry, 1.4f);
                            MoteMaker.ThrowMetaIcon(animal.Position, animal.Map, ThingDefOf.Mote_IncapIcon);
                            MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_ColonistFleeing);                             //red '!'
                            animal.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Manhunter);
                            if (animal.kindDef.RaceProps.herdAnimal && Rand.Chance(0.2f))
                            {                             // 20% chance of turning the whole herd hostile...
                                List <Pawn> packmates = animal.Map.mapPawns.AllPawnsSpawned.Where(x =>
                                                                                                  x != animal && x.def == animal.def && x.Faction == animal.Faction &&
                                                                                                  x.Position.InHorDistOf(animal.Position, 24f) && x.CanSee(animal)).ToList();

                                foreach (Pawn packmate in packmates)
                                {
                                    packmate.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Manhunter);
                                }
                            }
                            Messages.Message(pawn.Name.ToStringShort + " is being attacked by " + xxx.get_pawnname(animal) + ".", pawn, MessageTypeDefOf.ThreatSmall);
                        }
                        else
                        {
                            MoteMaker.ThrowMetaIcon(animal.Position, animal.Map, ThingDefOf.Mote_ColonistFleeing);
                            LifeStageUtility.PlayNearestLifestageSound(animal, (ls) => ls.soundCall);
                            animal.mindState.StartFleeingBecauseOfPawnAction(pawn);
                            animal.mindState.mentalStateHandler.TryStartMentalState(DefDatabase <MentalStateDef> .GetNamed("PanicFlee"));
                        }
                        pawn.jobs.EndCurrentJob(JobCondition.Incompletable);
                    }
                    else
                    {
                        Job gettin_bred = new Job(xxx.gettin_bred, pawn, animal);
                        animal.jobs.StartJob(gettin_bred, JobCondition.InterruptForced, null, true);
                        (animal.jobs.curDriver as JobDriver_GettinRaped)?.increase_time(duration);
                    }
                }
Ejemplo n.º 5
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //--Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() called");

            setup_ticks();

            //this.FailOn (() => (!Partner.health.capacities.CanBeAwake) || (!comfort_prisoners.is_designated (Partner)));
            // Fail if someone else reserves the prisoner before the pawn arrives or colonist can't reach animal
            this.FailOn(() => !pawn.CanReserveAndReach(Partner, PathEndMode.Touch, Danger.Deadly));
            this.FailOn(() => Partner.HostileTo(pawn));
            this.FailOnDespawnedNullOrForbidden(iTarget);
            this.FailOn(() => pawn.Drafted);

            yield return(Toils_Reserve.Reserve(iTarget, 1, 0));

            //Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() - moving towards animal");
            yield return(Toils_Goto.GotoThing(iTarget, PathEndMode.Touch));

            yield return(Toils_Interpersonal.WaitToBeAbleToInteract(pawn));

            yield return(Toils_Interpersonal.GotoInteractablePosition(iTarget));

            if (xxx.is_kind(pawn) ||
                (xxx.CTIsActive && xxx.has_traits(pawn) && pawn.story.traits.HasTrait(TraitDef.Named("RCT_AnimalLover"))))
            {
                yield return(TalkToAnimal(pawn, Partner));

                yield return(TalkToAnimal(pawn, Partner));
            }

            if (Rand.Chance(0.6f))
            {
                yield return(TalkToAnimal(pawn, Partner));
            }

            yield return(Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell));

            SexUtility.RapeTargetAlert(pawn, Partner);

            Toil rape = new Toil();

            rape.defaultCompleteMode = ToilCompleteMode.Delay;
            rape.defaultDuration     = duration;
            rape.handlingFacing      = true;
            rape.initAction          = delegate
            {
                //--Log.Message("[RJW] JobDriver_BestialityForMale::MakeNewToils() - Setting animal job driver");
                if (!(Partner.jobs.curDriver is JobDriver_SexBaseRecieverRaped dri))
                {
                    //wild animals may flee or attack
                    if (pawn.Faction != Partner.Faction && Partner.RaceProps.wildness > Rand.Range(0.22f, 1.0f) &&
                        !(pawn.TicksPerMoveCardinal < (Partner.TicksPerMoveCardinal / 2) && !Partner.Downed && xxx.is_not_dying(Partner)))
                    {
                        Partner.jobs.StopAll();                         // Wake up if sleeping.

                        float aggro = Partner.kindDef.RaceProps.manhunterOnTameFailChance;
                        if (Partner.kindDef.RaceProps.predator)
                        {
                            aggro += 0.2f;
                        }
                        else
                        {
                            aggro -= 0.1f;
                        }

                        if (Rand.Chance(aggro) && Partner.CanSee(pawn))
                        {
                            Partner.rotationTracker.FaceTarget(pawn);
                            LifeStageUtility.PlayNearestLifestageSound(Partner, (ls) => ls.soundAngry, 1.4f);
                            ThrowMetaIcon(Partner.Position, Partner.Map, ThingDefOf.Mote_IncapIcon);
                            ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_ColonistFleeing);                             //red '!'
                            Partner.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Manhunter);
                            if (Partner.kindDef.RaceProps.herdAnimal && Rand.Chance(0.2f))
                            {                             // 20% chance of turning the whole herd hostile...
                                List <Pawn> packmates = Partner.Map.mapPawns.AllPawnsSpawned.Where(x =>
                                                                                                   x != Partner && x.def == Partner.def && x.Faction == Partner.Faction &&
                                                                                                   x.Position.InHorDistOf(Partner.Position, 24f) && x.CanSee(Partner)).ToList();

                                foreach (Pawn packmate in packmates)
                                {
                                    packmate.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Manhunter);
                                }
                            }
                            Messages.Message(pawn.Name.ToStringShort + " is being attacked by " + xxx.get_pawnname(Partner) + ".", pawn, MessageTypeDefOf.ThreatSmall);
                        }
                        else
                        {
                            ThrowMetaIcon(Partner.Position, Partner.Map, ThingDefOf.Mote_ColonistFleeing);
                            LifeStageUtility.PlayNearestLifestageSound(Partner, (ls) => ls.soundCall);
                            Partner.mindState.StartFleeingBecauseOfPawnAction(pawn);
                            Partner.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.PanicFlee);
                        }
                        pawn.jobs.EndCurrentJob(JobCondition.Incompletable);
                    }
                    else
                    {
                        Job gettin_bred = JobMaker.MakeJob(xxx.gettin_bred, pawn, Partner);
                        Partner.jobs.StartJob(gettin_bred, JobCondition.InterruptForced, null, true);
                        (Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped)?.increase_time(ticks_left);
                        Start();
                    }
                }