protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map = (Map)parms.target;
            PawnKindDef pawnKindDef;

            if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef))
            {
                return(false);
            }
            IntVec3 intVec;
            IntVec3 near;

            if (!this.TryFindStartAndEndCells(map, out intVec, out near))
            {
                return(false);
            }
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);
            List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    newThing = list[i];
                IntVec3 loc      = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false);
                newThing.health.AddHediff(HediffDef.Named("AA_CrushingEverything"));
                Find.LetterStack.ReceiveLetter("LetterLabelSummitCrab".Translate(), "SummitCrab".Translate(), LetterDefOf.ThreatBig, newThing, null, null);
            }
            LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list);

            return(true);
        }
Esempio n. 2
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map         = (Map)parms.target;
            PawnKindDef pawnKindDef = PawnKindDef.Named("AA_ArcticLion");
            IntVec3     intVec;

            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal))
            {
                return(false);
            }
            List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, 300);
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    pawn = list[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false);
                pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000);
                pawn.health.AddHediff(HediffDef.Named("AA_InvisibleArcticLion"));
            }
            Find.LetterStack.ReceiveLetter("LetterLabelManhuntingArcticLion".Translate(), "ManhuntingArcticLion".Translate(), LetterDefOf.ThreatBig, null, null, null);
            Find.TickManager.slower.SignalForceNormalSpeedShort();

            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!TryFindAnimalKind(map.Tile, out PawnKindDef animalKind))
            {
                return(false);
            }
            if (!TryFindStartAndEndCells(map, out IntVec3 start, out IntVec3 end))
            {
                return(false);
            }
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - start).AngleFlat);
            List <Pawn> list = GenerateAnimals(animalKind, map.Tile);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    newThing = list[i];
                IntVec3 loc      = CellFinder.RandomClosewalkCellNear(start, map, 10);
                GenSpawn.Spawn(newThing, loc, map, rot);
            }
            LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(end, LocomotionUrgency.Walk), map, list);
            string text  = string.Format(def.letterText, animalKind.GetLabelPlural()).CapitalizeFirst();
            string label = string.Format(def.letterLabel, animalKind.GetLabelPlural().CapitalizeFirst());

            Find.LetterStack.ReceiveLetter(label, text, def.letterDef, list[0]);
            return(true);
        }
Esempio n. 4
0
        void TransformShadows(LayerSubMesh mesh)
        {
            if (mesh.uvs.Count == 0)
            {
                return;
            }

            var rot       = Rot4.FromAngleFlat(target);
            var uvs       = mesh.uvs;
            var vertsc    = mesh.verts.Count;
            var origVerts = NoAllocHelpers.ExtractArrayFromListT(mesh.verts);

            Util.ResizeIfNeeded(ref tempVerts, vertsc);

            for (int i = 0; i <= vertsc - 5; i += 5)
            {
                var offset = uvs[i / 10];
                if (offset == Vector3.zero)
                {
                    Array.Copy(origVerts, i, tempVerts, i, 5);
                    continue;
                }

                var r = offset.RotatedBy(rot) - offset;

                tempVerts[i]     = origVerts[i] + r;
                tempVerts[i + 1] = origVerts[i + 1] + r;
                tempVerts[i + 2] = origVerts[i + 2] + r;
                tempVerts[i + 3] = origVerts[i + 3] + r;
                tempVerts[i + 4] = origVerts[i + 4] + r;
            }

            mesh.mesh.SetVertices(tempVerts, vertsc);
        }
Esempio n. 5
0
            public static bool Prefix(Building_Shield __instance)
            {
                var thingsWithinRadius   = new HashSet <Thing>(__instance.ThingsWithinRadius);
                var thingsWithinScanArea = new HashSet <Thing>(__instance.ThingsWithinScanArea);

                foreach (var thing in thingsWithinScanArea)
                {
                    // Try and block projectiles from outside
                    if (thing is ProjectileCE proj && proj.BlockableByShield(__instance))
                    {
                        var launcher = NonPublicFields.CombatExtended.ProjectileCE_launcher.GetValue(proj) as Thing;
                        if (launcher != null && !thingsWithinRadius.Contains(launcher))
                        {
                            var explosiveProj = proj as ProjectileCE_Explosive;
                            // Explosives are handled separately
                            if (explosiveProj == null)
                            {
                                __instance.AbsorbDamage(proj.def.projectile.GetDamageAmount(1), proj.def.projectile.damageDef, proj.ExactRotation.eulerAngles.y);
                            }
                            proj.Position += Rot4.FromAngleFlat((__instance.Position - proj.Position).AngleFlat).Opposite.FacingCell;
                            NonPublicMethods.CombatExtended.ProjectileCE_ImpactSomething(proj);
                            if (explosiveProj != null)
                            {
                                NonPublicMethods.CombatExtended.ProjectileCE_Explosive_Explode(explosiveProj);
                            }
                        }
                    }
                }
                return(false);
            }
Esempio n. 6
0
        void TransformUVs(LayerSubMesh mesh)
        {
            // Fix texture flip
            if (GraphicPrintPatch.matData.TryGetValue(mesh.material, out var matData))
            {
                var fullRot = GenMath.PositiveMod(matData.Item2.AsInt - Rot4.FromAngleFlat(target).AsInt, 4);
                var graphic = matData.Item1;
                var flipped = fullRot == 1 && graphic.EastFlipped || fullRot == 3 && graphic.WestFlipped ? 1 : 0;

                var origUvs = Printer_Plane.defaultUvs;
                var uvsc    = mesh.uvs.Count;

                Util.ResizeIfNeeded(ref tempUVs, uvsc);

                for (int i = 0; i < uvsc; i += 4)
                {
                    tempUVs[i + (3 * flipped & 3)]     = origUvs[0];
                    tempUVs[i + (1 + flipped & 3)]     = origUvs[1];
                    tempUVs[i + (2 + 3 * flipped & 3)] = origUvs[2];
                    tempUVs[i + (3 + flipped & 3)]     = origUvs[3];
                }

                mesh.mesh.SetUVs(tempUVs, uvsc);
            }
        }
Esempio n. 7
0
    protected override bool TryExecuteWorker(IncidentParms parms)
    {
        var map = (Map)parms.target;

        if (!ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out var pawnKindDef))
        {
            return(false);
        }

        if (!RCellFinder.TryFindRandomPawnEntryCell(out var intVec, map, CellFinder.EdgeRoadChance_Animal))
        {
            return(false);
        }

        var list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, parms.points * 0.2f);
        var rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

        for (var i = 0; i < list.Count; i++)
        {
            var deviljho = PawnKindDefOf.Deviljho;
            var pawn     = PawnGenerator.GeneratePawn(deviljho);
            var loc      = CellFinder.RandomClosewalkCellNear(intVec, map, 10);
            GenSpawn.Spawn(pawn, loc, map, rot);
            pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 135000);
        }

        Find.LetterStack.ReceiveLetter("LetterLabelDeviljho".Translate(),
                                       "Deviljholetter".Translate(pawnKindDef.GetLabelPlural()), LetterDefOf.ThreatBig, list[0]);
        Find.TickManager.slower.SignalForceNormalSpeedShort();
        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
        LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
        return(true);
    }
        // Token: 0x0600000E RID: 14 RVA: 0x0000221C File Offset: 0x0000041C
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map   = (Map)parms.target;
            PawnKindDef named = DefDatabase <PawnKindDef> .GetNamed("KillerRabbit", true);

            IntVec3 intVec;
            bool    flag = !RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal, false, null);
            bool    result;

            if (flag)
            {
                result = false;
            }
            else
            {
                List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(named, map.Tile, parms.points * 1f);
                Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn    pawn = list[i];
                    IntVec3 loc  = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                    GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false);
                    pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false);
                    pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000);
                }
                Find.LetterStack.ReceiveLetter(Translator.Translate("LetterLabelManhunterPackArrived"), TranslatorFormattedStringExtensions.Translate("ManhunterPackArrived", named.GetLabelPlural(-1)), LetterDefOf.ThreatBig, list[0], null, null);
                Find.TickManager.slower.SignalForceNormalSpeedShort();
                LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
                LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
                result = true;
            }
            return(result);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map         = (Map)parms.target;
            PawnKindDef pawnKindDef = PawnKindDef.Named("AA_FeraliskClutchMother");
            IntVec3     intVec;

            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal))
            {
                return(false);
            }

            Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            IntVec3 loc2     = CellFinder.RandomClosewalkCellNear(intVec, map, 1, null);
            Pawn    newThing = PawnGenerator.GeneratePawn(pawnKindDef, null);

            newThing.gender = Gender.Female;
            GenSpawn.Spawn(newThing, loc2, map, WipeMode.Vanish);



            Find.LetterStack.ReceiveLetter("LetterLabelFeraliskClutchMother".Translate(), "FeraliskClutchMother".Translate(), LetterDefOf.ThreatBig, newThing, null, null);



            return(true);
        }
Esempio n. 10
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map = (Map)parms.target;
            PawnKindDef pawnKindDef;

            if (!ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out pawnKindDef))
            {
                return(false);
            }
            IntVec3 intVec;

            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal, null))
            {
                return(false);
            }
            List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, parms.points * 1f);
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    pawn = list[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false);
                pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000);
            }
            Find.LetterStack.ReceiveLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(new object[]
            {
                pawnKindDef.GetLabelPlural(-1)
            }), LetterDefOf.ThreatBig, list[0], null, null);
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
            return(true);
        }
Esempio n. 11
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map = (Map)parms.target;
            PawnKindDef pawnKindDef;

            if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef))
            {
                return(false);
            }
            IntVec3 intVec;
            IntVec3 near;

            if (!this.TryFindStartAndEndCells(map, out intVec, out near))
            {
                return(false);
            }
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);
            List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    newThing = list[i];
                IntVec3 loc      = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false);
            }
            LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list);
            string text  = string.Format(this.def.letterText, pawnKindDef.GetLabelPlural(-1)).CapitalizeFirst();
            string label = string.Format(this.def.letterLabel, pawnKindDef.GetLabelPlural(-1).CapitalizeFirst());

            Find.LetterStack.ReceiveLetter(label, text, this.def.letterDef, list[0], null, null);
            return(true);
        }
Esempio n. 12
0
        //public TM_Skyfaller()
        //{
        //    this.innerContainer = new ThingOwner<Thing>(this);
        //}

        //public override void ExposeData()
        //{
        //    base.ExposeData();
        //    Scribe_Deep.Look<ThingOwner>(ref this.innerContainer, "innerContainer", new object[]
        //    {
        //        this
        //    });
        //    Scribe_Values.Look<int>(ref this.ticksToImpact, "ticksToImpact", 0, false);
        //    Scribe_Values.Look<float>(ref this.angle, "angle", 0f, false);
        //    Scribe_Values.Look<float>(ref this.shrapnelDirection, "shrapnelDirection", 0f, false);
        //}

        //public override void PostMake()
        //{
        //    base.PostMake();
        //    if (this.def.skyfaller.MakesShrapnel)
        //    {
        //        this.shrapnelDirection = Rand.Range(0f, 360f);
        //    }
        //}

        public override void SpawnSetup(Map map, bool respawningAfterLoad)
        {
            base.SpawnSetup(map, respawningAfterLoad);
            if (!respawningAfterLoad)
            {
                this.ticksToImpact = this.def.skyfaller.ticksToImpactRange.RandomInRange;
                if (this.def.skyfaller.MakesShrapnel)
                {
                    float num = GenMath.PositiveMod(this.shrapnelDirection, 360f);
                    if (num < 270f && num >= 90f)
                    {
                        this.angle = Rand.Range(0f, 33f);
                    }
                    else
                    {
                        this.angle = Rand.Range(-33f, 0f);
                    }
                }
                else
                {
                    this.angle = -80f;
                }
                if (this.def.rotatable && this.innerContainer.Any)
                {
                    base.Rotation = Rot4.FromAngleFlat(this.angle - 90f);//this.innerContainer[0].Rotation;
                }
            }
        }
Esempio n. 13
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map        = (Map)parms.target;
            PawnKindDef bossKind   = def.pawnKind;
            PawnKindDef animalKind = GetAnimalKind(parms.points, map.Tile);

            if (bossKind == null || animalKind == null || ManhunterPackIncidentUtility.GetAnimalsCount(animalKind, (parms.points * PointsFactor) - bossKind.combatPower) <= 0)
            {
                return(false);
            }
            IntVec3 result = parms.spawnCenter;

            if (!result.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out result, map, CellFinder.EdgeRoadChance_Animal))
            {
                return(false);
            }

            List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(bossKind, map.Tile, bossKind.combatPower, 1);

            list.AddRange(ManhunterPackIncidentUtility.GenerateAnimals(animalKind, map.Tile, (parms.points * PointsFactor) - bossKind.combatPower, parms.pawnCount));
            Rot4 rot = Rot4.FromAngleFlat((map.Center - result).AngleFlat);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    pawn = list[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(result, map, 10);
                QuestUtility.AddQuestTag(GenSpawn.Spawn(pawn, loc, map, rot), parms.questTag);
                pawn.health.AddHediff(HediffDefOf.Scaria);
                pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(AnimalsStayDurationMin, AnimalsStayDurationMax);
            }

            TaggedString labelString = null;

            if (def.letterLabel != null)
            {
                labelString = def.letterLabel;
            }
            else
            {
                labelString = "LetterLabelManhunterPackArrived".Translate();
            }

            TaggedString textString = null;

            if (def.letterText != null)
            {
                textString = def.letterText;
            }
            else
            {
                textString = "ManhunterPackArrived".Translate(animalKind.GetLabelPlural());
            }

            SendStandardLetter(labelString, textString, LetterDefOf.ThreatBig, parms, list[0]);
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
            return(true);
        }
Esempio n. 14
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map        = (Map)parms.target;
            PawnKindDef animalKind = parms.pawnKind;

            if ((animalKind == null && !ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out animalKind)) || ManhunterPackIncidentUtility.GetAnimalsCount(animalKind, parms.points) == 0)
            {
                return(false);
            }
            IntVec3 result = parms.spawnCenter;

            if (!result.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out result, map, CellFinder.EdgeRoadChance_Animal))
            {
                return(false);
            }
            List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals_NewTmp(animalKind, map.Tile, parms.points * 1f, parms.pawnCount);
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - result).AngleFlat);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    pawn = list[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(result, map, 10);
                QuestUtility.AddQuestTag(GenSpawn.Spawn(pawn, loc, map, rot), parms.questTag);
                pawn.health.AddHediff(HediffDefOf.Scaria);
                pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000);
            }
            SendStandardLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(animalKind.GetLabelPlural()), LetterDefOf.ThreatBig, parms, list[0]);
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
            return(true);
        }
Esempio n. 15
0
        private static void SendCaravan(FCEvent evt)
        {
            Map playerHomeMap = Find.World.GetComponent <FactionFC>().TaxMap;

            if (DoDelayCaravanDueToDanger(evt))
            {
                return;
            }

            MakeDeliveryLetterAndMessage(evt);
            List <Pawn> pawns = new List <Pawn>();

            while (evt.goods.Count() > 0)
            {
                Pawn  pawn = PawnGenerator.GeneratePawn(FCPawnGenerator.WorkerOrMilitaryRequest());
                Thing next = evt.goods.First();

                if (pawn.carryTracker.innerContainer.TryAdd(next))
                {
                    evt.goods.Remove(next);
                }

                pawns.Add(pawn);
            }

            PawnsArrivalModeWorker_EdgeWalkIn pawnsArrivalModeWorker = new PawnsArrivalModeWorker_EdgeWalkIn();
            IncidentParms parms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, playerHomeMap);

            parms.spawnRotation = Rot4.FromAngleFlat((((Map)parms.target).Center - parms.spawnCenter).AngleFlat);

            RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, playerHomeMap, CellFinder.EdgeRoadChance_Friendly);

            pawnsArrivalModeWorker.Arrive(pawns, parms);
            LordMaker.MakeNewLord(FCPawnGenerator.WorkerOrMilitaryRequest().Faction, new LordJob_DeliverSupplies(parms.spawnCenter), playerHomeMap, pawns);
        }
        public override bool TryResolveRaidSpawnCenter(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!parms.spawnCenter.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, null))
            {
                return(false);
            }
            parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat);
            return(true);
        }
Esempio n. 17
0
        void TransformVerts(LayerSubMesh mesh)
        {
            var offset  = Rot4.FromAngleFlat(target);
            var offseti = offset.AsInt;

            var uvs       = mesh.uvs;
            var vertsc    = mesh.verts.Count;
            var origVerts = NoAllocHelpers.ExtractArrayFromListT(mesh.verts);

            // Rotate around a center
            if (PrintPlanePatch.plantMats.Contains(mesh.material) ||
                GraphicPrintPatch.graphicSingle.Contains(mesh.material))
            {
                if (uvs.Count * 4 != vertsc)
                {
                    Log.ErrorOnce($"Carousel: Bad material {mesh.material}", mesh.material.GetHashCode());
                    return;
                }

                Util.ResizeIfNeeded(ref tempVerts, vertsc);

                for (int i = 0; i < vertsc; i += 4)
                {
                    // The mesh data lists are only used during mesh building and are otherwise unused
                    // In between mesh rebuilding, Carousel uses the uv list to store object centers for rotation
                    var c = uvs[i / 4];

                    tempVerts[i]     = c + (origVerts[i] - c).RotatedBy(offset);
                    tempVerts[i + 1] = c + (origVerts[i + 1] - c).RotatedBy(offset);
                    tempVerts[i + 2] = c + (origVerts[i + 2] - c).RotatedBy(offset);
                    tempVerts[i + 3] = c + (origVerts[i + 3] - c).RotatedBy(offset);
                }

                mesh.mesh.SetVertices(tempVerts, vertsc);
            }

            // Exchange vertices
            if (GraphicPrintPatch.matData.ContainsKey(mesh.material) ||
                LinkedPrintPatch.linkedMaterials.Contains(mesh.material))
            {
                Util.ResizeIfNeeded(ref tempVerts, vertsc);

                for (int i = 0; i < vertsc; i += 4)
                {
                    tempVerts[i].SetXZY(ref origVerts[i + (offseti & 3)], origVerts[i].y);
                    tempVerts[i + 1].SetXZY(ref origVerts[i + (offseti + 1 & 3)], origVerts[i + 1].y);
                    tempVerts[i + 2].SetXZY(ref origVerts[i + (offseti + 2 & 3)], origVerts[i + 2].y);
                    tempVerts[i + 3].SetXZY(ref origVerts[i + (offseti + 3 & 3)], origVerts[i + 3].y);
                }

                mesh.mesh.SetVertices(tempVerts, vertsc);
            }
        }
Esempio n. 18
0
        // Token: 0x06000029 RID: 41 RVA: 0x00002DD8 File Offset: 0x00000FD8
        internal void JPRotatePilot(Pawn pilot, IntVec3 targCell, out float angle)
        {
            angle = Vector3Utility.AngleToFlat(pilot.Position.ToVector3(), targCell.ToVector3());
            float offsetAngle = angle + 90f;

            if (offsetAngle > 360f)
            {
                offsetAngle -= 360f;
            }
            Rot4 facing = Rot4.FromAngleFlat(offsetAngle);

            pilot.Rotation = facing;
        }
Esempio n. 19
0
        void TransformAtlas(LayerSubMesh mesh, TextureAtlasGroup group)
        {
            var offset   = Rot4.FromAngleFlat(target);
            var offseti  = offset.AsInt;
            var vertsc   = mesh.verts.Count / 5 * 4;
            var uvsc     = mesh.uvs.Count;
            var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts);
            var uvsArr   = NoAllocHelpers.ExtractArrayFromListT(mesh.uvs);

            Util.ResizeIfNeeded(ref tempVerts, vertsc);
            Util.ResizeIfNeeded(ref tempUVs, uvsc);

            for (int i = 0; i < vertsc; i += 4)
            {
                var data = vertsArr[vertsc + i / 4];

                if (data.x == PrintPlanePatch.SPECIAL_X)
                {
                    ExchangeVerts(tempVerts, vertsArr, i, offseti);

                    var rotData  = ((int)data.z & 0b1100) >> 2;
                    var flipData = (int)data.z & 0b0011;

                    var relRot  = GenMath.PositiveMod(rotData - Rot4.FromAngleFlat(target).AsInt, 4);
                    var flipped = relRot == 1 && ((flipData & 1) == 1) || relRot == 3 && ((flipData & 2) == 2) ? 1 : 0;

                    var rotatedMat = GraphicPrintPatch_SetData.intToGraphic[(int)data.y].mats[(rotData + Rot4.FromAngleFlat(-target).AsInt) % 4];
                    Graphic.TryGetTextureAtlasReplacementInfo(rotatedMat, group, false, false, out _, out var uvs, out _);

                    FixUVs(
                        tempUVs,
                        uvs,
                        i,
                        flipped
                        );
                }
                else if (data.x != PrintPlanePatch.EMPTY_X)
                {
                    RotateVerts(tempVerts, vertsArr, i, data, offset);
                    Array.Copy(uvsArr, i, tempUVs, i, 4);
                }
                else
                {
                    Array.Copy(vertsArr, i, tempVerts, i, 4);
                    Array.Copy(uvsArr, i, tempUVs, i, 4);
                }
            }

            mesh.mesh.SetVertices(tempVerts, vertsc);
            mesh.mesh.SetUVs(tempUVs, uvsc);
        }
Esempio n. 20
0
        internal static void RotatePawn(Pawn pawn, IntVec3 targCell, out float angle)
        {
            angle = Vector3Utility.AngleToFlat(pawn.Position.ToVector3(), targCell.ToVector3());
            float num  = angle + 90f;
            bool  flag = num > 360f;

            if (flag)
            {
                num -= 360f;
            }
            Rot4 rotation = Rot4.FromAngleFlat(num);

            pawn.Rotation = rotation;
        }
Esempio n. 21
0
        internal void RotateFlyer(Pawn pawn, IntVec3 targetCell, out float angle)
        {
            angle = pawn.Position.ToVector3().AngleToFlat(targetCell.ToVector3());
            float num  = angle + 90f;
            bool  flag = num > 360f;

            if (flag)
            {
                num -= 360f;
            }
            Rot4 rotation = Rot4.FromAngleFlat(num);

            pawn.Rotation = rotation;
        }
Esempio n. 22
0
        void TransformVerts(LayerSubMesh mesh)
        {
            var offset  = Rot4.FromAngleFlat(target);
            var offseti = offset.AsInt;

            // Rotate around a center
            if (PrintPlanePatch.plantMats.Contains(mesh.material) ||
                GraphicPrintPatch_TransformMats.graphicSingle.Contains(mesh.material))
            {
                var vertsc   = mesh.verts.Count / 5 * 4;
                var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts);

                Util.ResizeIfNeeded(ref tempVerts, vertsc);

                for (int i = 0; i < vertsc; i += 4)
                {
                    // The mesh data lists are only used during mesh building and are otherwise unused.
                    // In between mesh rebuilding, Carousel reuses the lists to recalculate the meshes
                    // but also appends additional information to the end of the vertex list
                    var center = vertsArr[vertsc + i / 4];

                    RotateVerts(tempVerts, vertsArr, i, center, offset);
                }

                mesh.mesh.SetVertices(tempVerts, vertsc);
            }

            // Exchange vertices
            // This doesn't change the set of their values but changes their order
            if (GraphicPrintPatch_TransformMats.exchangeMats.ContainsKey(mesh.material) ||
                LinkedPrintPatch.linkedMaterials.Contains(mesh.material))
            {
                var vertsc   = mesh.verts.Count;
                var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts);

                Util.ResizeIfNeeded(ref tempVerts, vertsc);

                for (int i = 0; i < vertsc; i += 4)
                {
                    ExchangeVerts(tempVerts, vertsArr, i, offseti);
                }

                mesh.mesh.SetVertices(tempVerts, vertsc);
            }
        }
Esempio n. 23
0
        static void HandleRotation(Pawn pawn, ref Rot4?rotOverride)
        {
            var comp   = pawn.Map.CarouselComp();
            var camera = Rot4.FromAngleFlat(-comp.current).AsInt;

            // Conditions from Pawn_RotationTracker.UpdateRotation
            if (!pawn.Destroyed && !pawn.jobs.HandlingFacing && pawn.pather.Moving && pawn.pather.curPath != null && pawn.pather.curPath.NodesLeftCount >= 1)
            {
                var movingRotation = FaceAdjacentCell(pawn.Position, pawn.pather.nextCell, Rot4.FromAngleFlat(-comp.current));
                if (movingRotation != null)
                {
                    rotOverride = new Rot4(movingRotation.Value.AsInt);
                    return;
                }
            }

            rotOverride = new Rot4((rotOverride?.AsInt ?? pawn.Rotation.AsInt) + camera);
        }
        public override bool SubstituionWorkerExecution()
        {
            Map  map = (Map)parms.target;
            Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            for (int i = 0; i < pawnList.Count; i++)
            {
                Pawn    pawn = pawnList[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false);
                pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000);
            }
            Find.LetterStack.ReceiveLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(AnimalType.GetLabelPlural(-1)), LetterDefOf.ThreatBig, pawnList[0], null, null);
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
            return(true);
        }
Esempio n. 25
0
        public override bool SubstituionWorkerExecution()
        {
            Map  map = (Map)parms.target;
            Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            for (int i = 0; i < pawnList.Count; i++)
            {
                Pawn    newThing = pawnList[i];
                IntVec3 loc      = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false);
            }
            LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, pawnList);
            IncidentDef def   = incidentDef;
            string      text  = string.Format(def.letterText, AnimalType.GetLabelPlural(-1)).CapitalizeFirst();
            string      label = string.Format(def.letterLabel, AnimalType.GetLabelPlural(-1).CapitalizeFirst());

            Find.LetterStack.ReceiveLetter(label, text, def.letterDef, pawnList[0], null, null);
            return(true);
        }
Esempio n. 26
0
        void TransformUVs(LayerSubMesh mesh)
        {
            // Fix texture flip
            if (GraphicPrintPatch_TransformMats.exchangeMats.TryGetValue(mesh.material, out var matData))
            {
                var uvsc    = mesh.uvs.Count;
                var graphic = matData.Item1;

                var relRot  = GenMath.PositiveMod(matData.Item2.AsInt - Rot4.FromAngleFlat(target).AsInt, 4);
                var flipped = relRot == 1 && graphic.EastFlipped || relRot == 3 && graphic.WestFlipped ? 1 : 0;

                Util.ResizeIfNeeded(ref tempUVs, uvsc);

                for (int i = 0; i < uvsc; i += 4)
                {
                    FixUVs(tempUVs, Printer_Plane.defaultUvs, i, flipped);
                }

                mesh.mesh.SetUVs(tempUVs, uvsc);
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms) //don't bother asking me what any of this means
        {
            Map     target = (Map)parms.target;
            IntVec3 cell;

            if (!this.TryFindEntryCell(target, out cell))
            {
                return(false);
            }
            PawnKindDef shambler = Skellin_PawnKindDefOf.SkellinShambler;
            int         num1     = Mathf.Clamp(GenMath.RoundRandom(StorytellerUtility.DefaultThreatPointsNow((IIncidentTarget)target) / shambler.combatPower), 2, Rand.RangeInclusive(3, 12));
            int         num2     = Rand.RangeInclusive(90000, 150000);
            IntVec3     result   = IntVec3.Invalid;

            if (!RCellFinder.TryFindRandomCellOutsideColonyNearTheCenterOfTheMap(cell, target, 10f, out result))
            {
                result = IntVec3.Invalid;
            }
            Lord lord = LordMaker.MakeNewLord(null, (LordJob) new LordJob_AssaultColony(null, canTimeoutOrFlee: false, canSteal: false), target); //faction is null, previously Faction.OfAncients - revert if this causes errors
            Pawn pawn = (Pawn)null;

            for (int index = 0; index < num1; ++index)
            {
                IntVec3 loc = CellFinder.RandomClosewalkCellNear(cell, target, 10);
                pawn = GeneratePawn();
                Rot4 rot = Rot4.FromAngleFlat((target.Center - result).AngleFlat);
                GenSpawn.Spawn((Thing)pawn, loc, target, rot);
                pawn.health.AddHediff(Skellin_HediffDefOf.ToxicFever);
                pawn.mindState.mentalStateHandler.TryStartMentalState(Skellin_MentalStateDefOf.SkellinToxic);
                pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + num2;
                lord.AddPawn(pawn);
                if (result.IsValid)
                {
                    pawn.mindState.forcedGotoPosition = CellFinder.RandomClosewalkCellNear(result, target, 10);
                }
            }
            this.SendStandardLetter(parms, (LookTargets)pawn, (NamedArgument[])Array.Empty <NamedArgument>());
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            return(true);
        }
Esempio n. 28
0
        protected virtual bool ResolveRaidSpawnCenter(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (parms.spawnCenter.IsValid)
            {
                return(true);
            }
            if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
            {
                if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop)
                {
                    parms.raidPodOpenDelay = 520;
                    parms.spawnRotation    = Rot4.Random;
                    if (Rand.Value < 0.40000000596046448 && map.listerBuildings.ColonistsHaveBuildingWithPowerOn(ThingDefOf.OrbitalTradeBeacon))
                    {
                        parms.spawnCenter = DropCellFinder.TradeDropSpot(map);
                    }
                    else if (!DropCellFinder.TryFindRaidDropCenterClose(out parms.spawnCenter, map))
                    {
                        parms.raidArrivalMode = PawnsArriveMode.EdgeDrop;
                    }
                }
                if (parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
                {
                    parms.raidPodOpenDelay = 140;
                    parms.spawnCenter      = DropCellFinder.FindRaidDropCenterDistant(map);
                    parms.spawnRotation    = Rot4.Random;
                }
            }
            else
            {
                if (!RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, (Predicate <IntVec3>)null))
                {
                    return(false);
                }
                parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat);
            }
            return(true);
        }
Esempio n. 29
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            ValidateVariables(parms);

            if (!RCellFinder.TryFindRandomPawnEntryCell(out IntVec3 intVec, map, CellFinder.EdgeRoadChance_Animal, null))
            {
                return(false);
            }
            Pawn boss = BossFightUtility.GenerateAnimal(map.Tile, faction, parms.points);
            Rot4 rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            bossLord.AddPawn(boss);

            // so many asthmatic bosses
            boss.health.Reset();
            GenSpawn.Spawn(boss, intVec, map, rot, false);

            Find.LetterStack.ReceiveLetter("Boss Fight", "The birds go silent and the ground trembles below you… BOSS FIGHT INCOMING", LetterDefOf.ThreatBig, boss, null);
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map  map  = (Map)parms.target;
            Pawn pawn = PawnGenerator.GeneratePawn(RWBYDefOf.Grimm_Nuckelavee, FactionUtility.DefaultFactionFrom(RWBYDefOf.Creatures_of_Grimm));

            if (!parms.spawnCenter.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, false, null))
            {
                return(false);
            }
            parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat);
            IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null);

            if (pawn is Pawn_Grimm pawn_Grimm)
            {
                pawn_Grimm.SetNuckelaveeTimer(Rand.RangeInclusive(30000, 60000));
            }
            GenSpawn.Spawn(pawn, loc, map, parms.spawnRotation, WipeMode.Vanish, false);
            string label = "LetterLabelNuckelavee".Translate();
            string text  = "LetterTextNuckelavee".Translate();

            Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.ThreatBig, pawn);
            return(true);
        }