private void FoundAnomaly()
        {
            int min = AnomalyDistanceMin;
            int max = AnomalyDistanceMax;

            int tile2 = base.parent.Tile;
            int tile  = default(int);

            if (!TryFindNewAnomalyTile(out tile, min, max, false, true, tile2))
            {
                return;
            }

            Site site;
            bool spacerUsable = false;

            List <SitePartDef> siteParts = new List <SitePartDef>();

            if (Rand.Chance(Props.chanceForNoSitePart))
            {
                siteParts.Add(GetRandomSiteCoreDef());

                site         = SiteMaker.TryMakeSite(siteParts, tile, false, null, true);
                spacerUsable = true;
            }
            else
            {
                siteParts.Add(GetRandomSiteCoreDef());
                siteParts.AddRange(GetRandomSitePartDefs);
                site = SiteMaker.TryMakeSite(siteParts, tile, true, null, false);
            }

            //// if spacerUsable -> 35% chance that the faction is spacer
            //if (site != null && spacerUsable && Rand.Chance(0.35f))
            //{
            //    Faction spacerFaction = null;
            //    if ((from x in Find.FactionManager.AllFactionsListForReading
            //         where x.def == FactionDefOf.Ancients || x.def == FactionDefOf.AncientsHostile
            //         select x).TryRandomElement(out spacerFaction))
            //        site.SetFaction(spacerFaction);
            //}

            if (site != null)
            {
                // Try to add a railgun :)
                Thing    railgun    = null;
                ThingDef railgunDef = DefDatabase <ThingDef> .GetNamedSilentFail(railgunDefName);

                if (railgunDef != null &&
                    site.Faction != null && site.Faction.def.techLevel >= TechLevel.Industrial &&
                    Rand.Value < 0.10)
                {
                    railgun = ThingMaker.MakeThing(railgunDef);
                }


                List <Thing> items = null;
                // Improved Sensors -> Add Items
                if (HasImprovedSensors)
                {
                    ItemStashContentsComp itemStash = site.GetComponent <ItemStashContentsComp>();
                    if (itemStash != null && siteParts.Contains(DefDatabase <SitePartDef> .GetNamedSilentFail(defName_ItemStash)))
                    {
                        items = GenerateItems(site.Faction, StorytellerUtility.DefaultSiteThreatPointsNow());
                        itemStash.contents.TryAddRangeOrTransfer(items);

                        if (railgun != null)
                        {
                            itemStash.contents.TryAdd(railgun);
                        }
                    }
                }

                //site.Tile = tile;

                // Add a site timeout ???
                site.GetComponent <TimeoutComp>().StartTimeout(Rand.RangeInclusive(15, 60) * 60000);

                Find.WorldObjects.Add(site);
                Find.LetterStack.ReceiveLetter("TacticalComputer_LetterLabel_AnomalyFound".Translate(), "TacticalComputer_Message_AnomalyFound".Translate(), LetterDefOf.PositiveEvent, site);
            }
        }
        //public static AIPawn GeneratePawn(PawnKindDef kindDef, Faction faction, Map map, Gender gender = Gender.Female, int tries = 0)
        public static AIPawn GenerateAIPawn(ref PawnGenerationRequest request, Map map, int tries = 0)
        {
            BackstoryHelper.AddNewBackstoriesToDatabase(); // First add the new backstories to the database

            //Log.Error("0");

            AIPawn pawnAI = (AIPawn)ThingMaker.MakeThing(request.KindDef.race, null);

            //Log.Error("1");
            GetXMLData(pawnAI);

            //request.EnsureNonNullFaction();

            pawnAI.kindDef = request.KindDef;
            pawnAI.SetFactionDirect(request.Faction);

            PawnComponentsUtility.CreateInitialComponents(pawnAI);

            //Log.Error("2");

            // Needs to be set because of not flesh user
            if (pawnAI.ownership == null)
            {
                pawnAI.ownership = new Pawn_Ownership(pawnAI);
            }

            pawnAI.relations = new Pawn_RelationsTracker(pawnAI);
            pawnAI.guest     = new Pawn_GuestTracker(pawnAI);

            pawnAI.guilt     = new Pawn_GuiltTracker(pawnAI);
            pawnAI.royalty   = new Pawn_RoyaltyTracker(pawnAI);
            pawnAI.abilities = new Pawn_AbilityTracker(pawnAI);
            pawnAI.relations = new Pawn_RelationsTracker(pawnAI);

            if (request.FixedGender.HasValue)
            {
                pawnAI.gender = request.FixedGender.Value;
            }
            else if (pawnAI.RaceProps.hasGenders)
            {
                if (Rand.Value < 0.5f)
                {
                    pawnAI.gender = Gender.Male;
                }
                else
                {
                    pawnAI.gender = Gender.Female;
                }
            }
            else
            {
                pawnAI.gender = Gender.Female;
            }

            SetBirthday(pawnAI);
            pawnAI.needs.SetInitialLevels();


            //Log.Error("3");

            AIPawnGenerator.GenerateInitialHediffs(pawnAI);


            if (pawnAI.RaceProps.Humanlike)
            {
                pawnAI.story.melanin   = 0.1f;
                pawnAI.story.crownType = CrownType.Average;
                pawnAI.story.hairColor = PawnHairColors.RandomHairColor(pawnAI.story.SkinColor, pawnAI.ageTracker.AgeBiologicalYears);

                pawnAI.story.childhood = GetBackstory();
                //pawnAI.story.adulthood = GetBackstory();

                string headGraphicPath = GraphicDatabaseHeadRecords.GetHeadRandom(pawnAI.gender, pawnAI.story.SkinColor, pawnAI.story.crownType, false).GraphicPath;
                // With this Reflection you can access a private variable! Here: The private string "headGraphicPath" is set
                System.Reflection.FieldInfo fi = typeof(Pawn_StoryTracker).GetField("headGraphicPath", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                fi.SetValue(pawnAI.story, headGraphicPath);

                pawnAI.story.hairDef = GetHair();

                pawnAI.story.bodyType = ((pawnAI.gender != Gender.Female) ? BodyTypeDefOf.Male : BodyTypeDefOf.Female);

                MakeSkillsFromBackstory(pawnAI);
                GiveTraitsTo(pawnAI);

                if (pawnAI.workSettings != null && (request.Faction == Faction.OfPlayer))
                {
                    pawnAI.workSettings.EnableAndInitialize();
                }
            }

            if (pawnAI.RaceProps.ToolUser)
            {
                GenerateBaseApparel(pawnAI);
            }

            pawnAI.Name = GetName(pawnAI.def, map);

            pawnAI.royalty = null;

            //Log.Error("4");
            //PawnGenerationRequest request = new PawnGenerationRequest(pawnAI.kindDef , Faction.OfPlayer, PawnGenerationContext.All, true, true, false,false, false, false, 0, false, false, false,null, 0,0, pawnAI.gender, null, null);

            //PawnInventoryGenerator.GenerateInventoryFor(pawnAI, request);

            if (!pawnAI.Dead)
            {
                return(pawnAI);
            }

            if (tries < 10)
            {
                return(GenerateAIPawn(ref request, map, tries + 1));
            }

            return(null);
        }
Exemple #3
0
        private static Pawn TryGenerateNewNakedPawn(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements)
        {
            error = null;
            Pawn pawn = (Pawn)ThingMaker.MakeThing(request.KindDef.race, null);

            pawnsBeingGenerated.Add(new PawnGenerationStatus(pawn, null));
            Pawn result;

            try
            {
                pawn.kindDef = request.KindDef;
                pawn.SetFactionDirect(request.Faction);
                PawnComponentsUtility.CreateInitialComponents(pawn);
                if (request.FixedGender.HasValue)
                {
                    pawn.gender = request.FixedGender.Value;
                }
                else if (pawn.RaceProps.hasGenders)
                {
                    if (Rand.Value < 0.5f)
                    {
                        pawn.gender = Gender.Male;
                    }
                    else
                    {
                        pawn.gender = Gender.Female;
                    }
                }
                else
                {
                    pawn.gender = Gender.None;
                }
                GenerateRandomAge(pawn, request);
                pawn.needs.SetInitialLevels();
                if (!request.Newborn && request.CanGeneratePawnRelations)
                {
                    GeneratePawnRelations(pawn, ref request);
                }
                if (pawn.RaceProps.Humanlike)
                {
                    /*****Logging*****/
                    //Log.Message("(pawn.RaceProps.Humanlike) true. line 313");
                    /*****Logging*****/
                    pawn.story.melanin   = ((!request.FixedMelanin.HasValue) ? PawnSkinColors.RandomMelanin() : request.FixedMelanin.Value);
                    pawn.story.crownType = ((Rand.Value >= 0.5f) ? CrownType.Narrow : CrownType.Average);
                    pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears);
                    ProPawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName);
                    pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, request.Faction.def);
                    GenerateTraits(pawn, request);
                    GenerateBodyType(pawn);
                    GenerateSkills(pawn);
                }
                GenerateInitialHediffs(pawn, request);
                if (pawn.workSettings != null && request.Faction.IsPlayer)
                {
                    pawn.workSettings.EnableAndInitialize();
                }
                if (request.Faction != null && pawn.RaceProps.Animal)
                {
                    pawn.GenerateNecessaryName();
                }
                if (!request.AllowDead && (pawn.Dead || pawn.Destroyed))
                {
                    DiscardGeneratedPawn(pawn);
                    error  = "Generated dead pawn.";
                    result = null;
                }
                else if (!request.AllowDowned && pawn.Downed)
                {
                    DiscardGeneratedPawn(pawn);
                    error  = "Generated downed pawn.";
                    result = null;
                }
                else if (request.MustBeCapableOfViolence && ((pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) || !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)))
                {
                    DiscardGeneratedPawn(pawn);
                    error  = "Generated pawn incapable of violence.";
                    result = null;
                }
                else if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && !Find.Scenario.AllowPlayerStartingPawn(pawn))
                {
                    DiscardGeneratedPawn(pawn);
                    error  = "Generated pawn doesn't meet scenario requirements.";
                    result = null;
                }
                else if (request.Validator != null && !request.Validator(pawn))
                {
                    DiscardGeneratedPawn(pawn);
                    error  = "Generated pawn didn't pass validator check.";
                    result = null;
                }
                else
                {
                    for (int i = 0; i < pawnsBeingGenerated.Count - 1; i++)
                    {
                        if (pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime == null)
                        {
                            pawnsBeingGenerated[i] = new PawnGenerationStatus(pawnsBeingGenerated[i].Pawn, new List <Pawn>());
                        }
                        pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime.Add(pawn);
                    }
                    result = pawn;
                }
            }
            finally
            {
                pawnsBeingGenerated.RemoveLast <PawnGenerationStatus>();
            }
            return(result);
        }
Exemple #4
0
        public static Thing TrySpawnThingAt(ThingDef thingDef,
                                            ThingDef stuffDef,
                                            IntVec3 position,
                                            bool rotated,
                                            Rot4 rotation,
                                            ref OG_OutpostData outpostData,
                                            bool destroyThings    = false,
                                            bool replaceStructure = false)
        {
            if (destroyThings)
            {
                List <Thing> thingList = position.GetThingList();
                for (int j = thingList.Count - 1; j >= 0; j--)
                {
                    thingList[j].Destroy(DestroyMode.Vanish);
                }
            }
            Building building = position.GetEdifice();

            if (building != null)
            {
                if (replaceStructure)
                {
                    if (outpostData.outpostThingList.Contains(building))
                    {
                        outpostData.outpostThingList.Remove(building);
                    }
                    building.Destroy(DestroyMode.Vanish);
                }
                else
                {
                    return(null);
                }
            }
            Thing thing = ThingMaker.MakeThing(thingDef, stuffDef);

            outpostData.outpostThingList.Add(thing);
            thing.SetFaction(OG_Util.FactionOfMiningCo);
            if (rotated && thingDef.rotatable)
            {
                return(GenSpawn.Spawn(thing, position, rotation));
            }
            else
            {
                if ((thingDef == ThingDef.Named("TableShort")) ||
                    (thingDef == ThingDef.Named("MultiAnalyzer")))
                {
                    if (rotation == Rot4.East)
                    {
                        position += new IntVec3(0, 0, -1);
                    }
                    else if (rotation == Rot4.South)
                    {
                        position += new IntVec3(-1, 0, -1);
                    }
                    else if (rotation == Rot4.West)
                    {
                        position += new IntVec3(-1, 0, 0);
                    }
                }
                return(GenSpawn.Spawn(thing, position));
            }
        }
Exemple #5
0
        public override void GenerateForces(Map map, ResolveParams rp, ScatterOptions options)
        {
            if (options == null)
            {
                return;
            }

            int   addedTriggers = 0;
            float ratio         = 10;
            float remainingCost = options.uncoveredCost * (Rand.Value + 0.5f); //cost estimation as seen by other factions

            Debug.Log(Debug.ForceGen, "Running battle royale force generation with remaining cost of {0} (while uncovered is {1})", remainingCost, options.uncoveredCost);

            float initialCost = remainingCost;

            int triggersAbsoluteMaximum = 100;

            while (remainingCost > 0)
            {
                IntVec3 mapLocation = rp.rect.RandomCell;
                if (!mapLocation.InBounds(map))
                {
                    continue;
                }

                ThingDef    raidTriggerDef = ThingDef.Named("RaidTrigger");
                RaidTrigger trigger        = ThingMaker.MakeThing(raidTriggerDef) as RaidTrigger;

                if (options.allowFriendlyRaids)
                {
                    if (Rand.Chance(0.2f))
                    {
                        trigger.faction = Find.FactionManager.RandomNonHostileFaction();
                    }
                    else
                    {
                        trigger.faction = Find.FactionManager.RandomEnemyFaction();
                    }
                }
                else
                {
                    trigger.faction = Find.FactionManager.RandomEnemyFaction();
                }

                int   raidMaxPoints = (int)(remainingCost / ratio);
                float raidValue     = Math.Abs(Rand.Gaussian()) * raidMaxPoints + Rand.Value * raidMaxPoints + 250.0f;
                if (raidValue > 10000)
                {
                    raidValue = Rand.Range(8000, 11000);                    //sanity cap. against some beta-poly bases.
                }
                remainingCost -= raidValue * ratio;

                trigger.value = ScalePointsToDifficulty(raidValue);

                GenSpawn.Spawn(trigger, mapLocation, map);
                Debug.Log(Debug.ForceGen, "Spawned trigger at {0}, {1} for {2} points, autofiring after {3} rare ticks", mapLocation.x, mapLocation.z, trigger.value, 0);
                addedTriggers++;

                options.uncoveredCost = Math.Abs(remainingCost);

                if (addedTriggers > triggersAbsoluteMaximum)
                {
                    if (remainingCost < initialCost * 0.2f)
                    {
                        if (Rand.Chance(0.1f))
                        {
                            if (remainingCost > 100000)
                            {
                                remainingCost = Rand.Range(80000, 110000);
                            }
                            return;
                        }
                    }
                }
            }
        }
Exemple #6
0
        private static void SpawnAnimalCorpsesMaker(IntVec3 position)
        {
            Thing animalCorpsesGenerator = ThingMaker.MakeThing(Util_CaveBiome.AnimalCorpsesGeneratorDef);

            GenSpawn.Spawn(animalCorpsesGenerator, position);
        }
        protected override void RunInt()
        {
            if (!ModLister.RoyaltyInstalled)
            {
                Log.ErrorOnce("Shuttle crash rescue is a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it. See rules on the Ludeon forum for more info.", 8811221);
                return;
            }
            Quest quest       = QuestGen.quest;
            Slate slate       = QuestGen.slate;
            Map   map         = QuestGen_Get.GetMap();
            float questPoints = slate.Get("points", 0f);

            slate.Set("map", map);
            slate.Set("rescueDelay", 20000);
            slate.Set("leaveDelay", 30000);
            slate.Set("rescueShuttleAfterRaidDelay", 10000);
            int max  = Mathf.FloorToInt(MaxCiviliansByPointsCurve.Evaluate(questPoints));
            int num  = Rand.Range(1, max);
            int max2 = Mathf.FloorToInt(MaxSoldiersByPointsCurve.Evaluate(questPoints));
            int num2 = Rand.Range(1, max2);

            TryFindEnemyFaction(out var enemyFaction);
            Thing crashedShuttle = ThingMaker.MakeThing(ThingDefOf.ShuttleCrashed);

            TryFindShuttleCrashPosition(map, Faction.Empire, crashedShuttle.def.size, out var shuttleCrashPosition);
            List <Pawn> civilians = new List <Pawn>();
            List <Pawn> list      = new List <Pawn>();

            for (int i = 0; i < num - 1; i++)
            {
                Pawn pawn = quest.GetPawn(CivilianPawnParams);
                civilians.Add(pawn);
                list.Add(pawn);
            }
            Quest quest2 = quest;

            QuestGen_Pawns.GetPawnParms parms = new QuestGen_Pawns.GetPawnParms
            {
                mustBeOfFaction = Faction.Empire,
                canGeneratePawn = true,
                mustBeWorldPawn = true,
                seniorityRange  = new FloatRange(100f, MaxAskerSeniorityByPointsCurve.Evaluate(questPoints)),
                mustHaveRoyalTitleInCurrentFaction = true
            };
            Pawn asker = quest2.GetPawn(parms);

            civilians.Add(asker);
            PawnKindDef mustBeOfKind = new PawnKindDef[3]
            {
                PawnKindDefOf.Empire_Fighter_Trooper,
                PawnKindDefOf.Empire_Fighter_Janissary,
                PawnKindDefOf.Empire_Fighter_Cataphract
            }.RandomElement();
            List <Pawn> soldiers = new List <Pawn>();

            for (int j = 0; j < num2; j++)
            {
                Quest quest3 = quest;
                parms = new QuestGen_Pawns.GetPawnParms
                {
                    mustBeOfFaction = Faction.Empire,
                    canGeneratePawn = true,
                    mustBeOfKind    = mustBeOfKind,
                    mustBeWorldPawn = true
                };
                Pawn pawn2 = quest3.GetPawn(parms);
                soldiers.Add(pawn2);
            }
            List <Pawn> allPassengers = new List <Pawn>();

            allPassengers.AddRange(soldiers);
            allPassengers.AddRange(civilians);
            quest.BiocodeWeapons(allPassengers);
            Thing rescueShuttle = QuestGen_Shuttle.GenerateShuttle(Faction.Empire, allPassengers, null, acceptColonists: false, onlyAcceptColonists: false, onlyAcceptHealthy: false, -1, dropEverythingIfUnsatisfied: false, leaveImmediatelyWhenSatisfied: true, dropEverythingOnArrival: false, stayAfterDroppedEverythingOnArrival: false, null, null, -1, null, permitShuttle: false, hideControls: true, allPassengers.Cast <Thing>().ToList());

            quest.Delay(120, delegate
            {
                quest.Letter(LetterDefOf.NegativeEvent, null, null, null, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, label: "LetterLabelShuttleCrashed".Translate(), text: "LetterTextShuttleCrashed".Translate(), lookTargets: Gen.YieldSingle(crashedShuttle));
                quest.SpawnSkyfaller(map, ThingDefOf.ShuttleCrashing, Gen.YieldSingle(crashedShuttle), Faction.OfPlayer, shuttleCrashPosition);
                quest.DropPods(map.Parent, allPassengers, null, null, null, null, dropSpot: shuttleCrashPosition, sendStandardLetter: false);
                quest.DefendPoint(map.Parent, shuttleCrashPosition, soldiers, Faction.Empire, null, null, 12f, isCaravanSendable: false, addFleeToil: false);
                IntVec3 position = shuttleCrashPosition + IntVec3.South;
                quest.WaitForEscort(map.Parent, civilians, Faction.Empire, position, null, addFleeToil: false);
                string inSignal4 = QuestGenUtility.HardcodedSignalWithQuestID("rescueShuttle.Spawned");
                quest.ExitOnShuttle(map.Parent, allPassengers, Faction.Empire, rescueShuttle, inSignal4, addFleeToil: false);
                quest.SendShuttleAwayOnCleanup(rescueShuttle);
                quest.ShuttleDelay(20000, civilians, delegate
                {
                    quest.Letter(LetterDefOf.NeutralEvent, null, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, Gen.YieldSingle(rescueShuttle), filterDeadPawnsFromLookTargets: false, "[rescueShuttleArrivedLetterText]", null, "[rescueShuttleArrivedLetterLabel]");
                    quest.SpawnSkyfaller(map, ThingDefOf.ShuttleIncoming, Gen.YieldSingle(rescueShuttle), Faction.Empire, null, null, lookForSafeSpot: false, tryLandInShipLandingZone: false, crashedShuttle);
                    quest.ShuttleLeaveDelay(rescueShuttle, 30000, null, null, null, delegate
                    {
                        quest.SendShuttleAway(rescueShuttle);
                        quest.End(QuestEndOutcome.Fail, 0, null, null, QuestPart.SignalListenMode.OngoingOnly, sendStandardLetter: true);
                    });
                }, null, null, alert: true);
                IntVec3 walkIntSpot = default(IntVec3);
                TryFindRaidWalkInPosition(map, shuttleCrashPosition, out walkIntSpot);
                float soldiersTotalCombatPower = 0f;
                for (int k = 0; k < soldiers.Count; k++)
                {
                    soldiersTotalCombatPower += soldiers[k].kindDef.combatPower;
                }
                quest.Delay(10000, delegate
                {
                    List <Pawn> list2 = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms
                    {
                        faction   = enemyFaction,
                        groupKind = PawnGroupKindDefOf.Combat,
                        points    = (questPoints + soldiersTotalCombatPower) * 0.37f,
                        tile      = map.Tile
                    }).ToList();
                    for (int l = 0; l < list2.Count; l++)
                    {
                        Find.WorldPawns.PassToWorld(list2[l]);
                        QuestGen.AddToGeneratedPawns(list2[l]);
                    }
                    QuestPart_PawnsArrive questPart_PawnsArrive = new QuestPart_PawnsArrive();
                    questPart_PawnsArrive.pawns.AddRange(list2);
                    questPart_PawnsArrive.arrivalMode        = PawnsArrivalModeDefOf.EdgeWalkIn;
                    questPart_PawnsArrive.joinPlayer         = false;
                    questPart_PawnsArrive.mapParent          = map.Parent;
                    questPart_PawnsArrive.spawnNear          = walkIntSpot;
                    questPart_PawnsArrive.inSignal           = QuestGen.slate.Get <string>("inSignal");
                    questPart_PawnsArrive.sendStandardLetter = false;
                    quest.AddPart(questPart_PawnsArrive);
                    quest.AssaultThings(map.Parent, list2, enemyFaction, allPassengers, null, null, excludeFromLookTargets: true);
                    quest.Letter(LetterDefOf.ThreatBig, null, null, enemyFaction, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, list2, filterDeadPawnsFromLookTargets: false, "[raidArrivedLetterText]", null, "[raidArrivedLetterLabel]");
                }, null, null, null, reactivatable: false, null, null, isQuestTimeout: false, null, null, "RaidDelay");
            });
            string text  = QuestGenUtility.HardcodedSignalWithQuestID("rescueShuttle.SentSatisfied");
            string text2 = QuestGenUtility.HardcodedSignalWithQuestID("rescueShuttle.SentUnsatisfied");

            string[] inSignalsShuttleSent = new string[2]
            {
                text,
                text2
            };
            string text3    = QuestGenUtility.HardcodedSignalWithQuestID("rescueShuttle.Destroyed");
            string inSignal = QuestGenUtility.HardcodedSignalWithQuestID("asker.Destroyed");

            quest.GoodwillChangeShuttleSentThings(Faction.Empire, list, -5, null, inSignalsShuttleSent, text3, "GoodwillChangeReason_CiviliansLost".Translate(), canSendMessage: true, canSendHostilityLetter: false, QuestPart.SignalListenMode.Always);
            quest.GoodwillChangeShuttleSentThings(Faction.Empire, Gen.YieldSingle(asker), -10, null, inSignalsShuttleSent, text3, "GoodwillChangeReason_CommanderLost".Translate(), canSendMessage: true, canSendHostilityLetter: false, QuestPart.SignalListenMode.Always);
            quest.Leave(allPassengers, "", sendStandardLetter: false);
            quest.Letter(LetterDefOf.PositiveEvent, text, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, null, filterDeadPawnsFromLookTargets: false, "[questCompletedSuccessLetterText]", null, "[questCompletedSuccessLetterLabel]");
            string questSuccess = QuestGen.GenerateNewSignal("QuestSuccess");

            quest.SignalPass(delegate
            {
                RewardsGeneratorParams rewardsGeneratorParams = default(RewardsGeneratorParams);
                rewardsGeneratorParams.rewardValue            = questPoints;
                rewardsGeneratorParams.allowGoodwill          = true;
                rewardsGeneratorParams.allowRoyalFavor        = true;
                RewardsGeneratorParams parms2 = rewardsGeneratorParams;
                quest.GiveRewards(parms2, null, null, null, null, null, null, null, null, addCampLootReward: false, asker, addShuttleLootReward: true);
                QuestGen_End.End(quest, QuestEndOutcome.Success);
            }, questSuccess);
            quest.SignalPass(null, text, questSuccess);
            quest.AnyOnTransporter(allPassengers, rescueShuttle, delegate
            {
                quest.AnyOnTransporter(Gen.YieldSingle(asker), rescueShuttle, delegate
                {
                    quest.Letter(LetterDefOf.PositiveEvent, null, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, null, filterDeadPawnsFromLookTargets: false, "[questCompletedCiviliansLostSuccessLetterText]", null, "[questCompletedCiviliansLostSuccessLetterLabel]");
                    quest.SignalPass(null, null, questSuccess);
                }, delegate
                {
                    quest.Letter(LetterDefOf.NegativeEvent, null, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, null, filterDeadPawnsFromLookTargets: false, "[askerLostLetterText]", null, "[askerLostLetterLabel]");
                    QuestGen_End.End(quest, QuestEndOutcome.Fail);
                });
            }, delegate
            {
                quest.Letter(LetterDefOf.NegativeEvent, null, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, null, filterDeadPawnsFromLookTargets: false, "[allLostLetterText]", null, "[allLostLetterLabel]");
                QuestGen_End.End(quest, QuestEndOutcome.Fail);
            }, text2);
            quest.Letter(LetterDefOf.NegativeEvent, inSignal, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, Gen.YieldSingle(asker), filterDeadPawnsFromLookTargets: false, "[askerDiedLetterText]", null, "[askerDiedLetterLabel]");
            quest.End(QuestEndOutcome.Fail, 0, null, inSignal);
            quest.Letter(LetterDefOf.NegativeEvent, text3, null, Faction.Empire, null, useColonistsFromCaravanArg: false, QuestPart.SignalListenMode.OngoingOnly, Gen.YieldSingle(rescueShuttle), filterDeadPawnsFromLookTargets: false, "[shuttleDestroyedLetterText]", null, "[shuttleDestroyedLetterLabel]");
            quest.End(QuestEndOutcome.Fail, 0, null, text3);
            quest.End(QuestEndOutcome.Fail, 0, null, QuestGenUtility.HardcodedSignalWithQuestID("asker.LeftMap"), QuestPart.SignalListenMode.OngoingOnly, sendStandardLetter: true);
            string inSignal2 = QuestGenUtility.HardcodedSignalWithQuestID("askerFaction.BecameHostileToPlayer");

            quest.End(QuestEndOutcome.Fail, 0, null, inSignal2, QuestPart.SignalListenMode.OngoingOnly, sendStandardLetter: true);
            quest.End(QuestEndOutcome.InvalidPreAcceptance, 0, null, inSignal2, QuestPart.SignalListenMode.NotYetAcceptedOnly);
            slate.Set("asker", asker);
            slate.Set("askerFaction", asker.Faction);
            slate.Set("enemyFaction", enemyFaction);
            slate.Set("soldiers", soldiers);
            slate.Set("civilians", civilians);
            slate.Set("civilianCountMinusOne", civilians.Count - 1);
            slate.Set("rescueShuttle", rescueShuttle);
        }
        public static Pawn DoGeneratePawnFromSource(Pawn sourcePawn, bool isBerserk = true, bool oathOfHastur = false)
        {
            PawnKindDef pawnKindDef   = sourcePawn.kindDef;
            Faction     factionDirect = isBerserk ? Find.FactionManager.FirstFactionOfDef(FactionDefOf.SpacerHostile) : Faction.OfPlayer;
            Pawn        pawn          = (Pawn)ThingMaker.MakeThing(pawnKindDef.race, null);

            try
            {
                pawn.kindDef = pawnKindDef;
                pawn.SetFactionDirect(factionDirect);
                PawnComponentsUtility.CreateInitialComponents(pawn);
                pawn.gender = sourcePawn.gender;
                pawn.ageTracker.AgeBiologicalTicks    = sourcePawn.ageTracker.AgeBiologicalTicks;
                pawn.ageTracker.AgeChronologicalTicks = sourcePawn.ageTracker.AgeChronologicalTicks;
                pawn.workSettings = new Pawn_WorkSettings(pawn);
                if (pawn.workSettings != null && sourcePawn.Faction.IsPlayer)
                {
                    pawn.workSettings.EnableAndInitialize();
                }

                pawn.needs.SetInitialLevels();
                //Add hediffs?
                //Add relationships?
                if (pawn.RaceProps.Humanlike)
                {
                    pawn.story.melanin   = sourcePawn.story.melanin;
                    pawn.story.crownType = sourcePawn.story.crownType;
                    pawn.story.hairColor = sourcePawn.story.hairColor;
                    pawn.story.childhood = sourcePawn.story.childhood;
                    pawn.story.adulthood = sourcePawn.story.adulthood;
                    pawn.story.bodyType  = sourcePawn.story.bodyType;
                    pawn.story.hairDef   = sourcePawn.story.hairDef;
                    foreach (Trait current in sourcePawn.story.traits.allTraits)
                    {
                        pawn.story.traits.GainTrait(current);
                    }

                    SkillFixer(pawn, sourcePawn);
                    RelationshipFixer(pawn, sourcePawn);
                    AddedPartFixer(pawn, sourcePawn);
                    //pawn.story.GenerateSkillsFromBackstory();
                    NameTriple nameTriple = sourcePawn.Name as NameTriple;
                    //if (!oathOfHastur)
                    //{
                    //    pawn.Name = new NameTriple(nameTriple.First, string.Concat(new string[]
                    //        {
                    //        "* ",
                    //        Translator.Translate("Reanimated"),
                    //        " ",
                    //        nameTriple.Nick,
                    //        " *"
                    //        }), nameTriple.Last);
                    //}
                    pawn.Name = nameTriple;
                }
                string headGraphicPath = sourcePawn.story.HeadGraphicPath;
                typeof(Pawn_StoryTracker).GetField("headGraphicPath", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pawn.story, headGraphicPath);
                GenerateApparelFromSource(pawn, sourcePawn);
                PawnGenerationRequest con = new PawnGenerationRequest();
                PawnInventoryGenerator.GenerateInventoryFor(pawn, con);
                if (isBerserk)
                {
                    pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Berserk);
                }
                //Log.Message(pawn.NameStringShort);
                return(pawn);
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
                //Cthulhu.Utility.DebugReport(e.ToString());
            }
            return(null);
        }
Exemple #9
0
        public static void GenerateMediumRoomBarn(IntVec3 areaSouthWestOrigin, int zoneAbs, int zoneOrd, Rot4 rotation, ref OG_OutpostData outpostData)
        {
            IntVec3 origin        = Zone.GetZoneOrigin(areaSouthWestOrigin, zoneAbs, zoneOrd);
            IntVec3 rotatedOrigin = Zone.GetZoneRotatedOrigin(areaSouthWestOrigin, zoneAbs, zoneOrd, rotation);

            OG_Common.GenerateEmptyRoomAt(rotatedOrigin + new IntVec3(1, 0, 1).RotatedBy(rotation), 9, 9, rotation, TerrainDefOf.Concrete, TerrainDefOf.Soil, ref outpostData);

            // Generate animal feed room.
            for (int xOffset = 2; xOffset <= 4; xOffset++)
            {
                OG_Common.TrySpawnWallAt(rotatedOrigin + new IntVec3(xOffset, 0, 5).RotatedBy(rotation), ref outpostData);
            }
            for (int zOffset = 2; zOffset <= 5; zOffset++)
            {
                OG_Common.TrySpawnWallAt(rotatedOrigin + new IntVec3(4, 0, zOffset).RotatedBy(rotation), ref outpostData);
            }
            IntVec3 doorPosition = rotatedOrigin + new IntVec3(4, 0, 3).RotatedBy(rotation);

            OG_Common.SpawnDoorAt(doorPosition, ref outpostData);
            Find.TerrainGrid.SetTerrain(doorPosition, TerrainDef.Named("PavedTile"));
            for (int xOffset = 2; xOffset <= 3; xOffset++)
            {
                for (int zOffset = 2; zOffset <= 4; zOffset++)
                {
                    IntVec3 fridgeCell = rotatedOrigin + new IntVec3(xOffset, 0, zOffset).RotatedBy(rotation);
                    Find.TerrainGrid.SetTerrain(fridgeCell, TerrainDef.Named("SterileTile"));
                    if ((zOffset == 2) || (zOffset == 4))
                    {
                        Thing hayStack = ThingMaker.MakeThing(ThingDef.Named("Hay"));
                        hayStack.stackCount = ThingDef.Named("Hay").stackLimit;
                        GenSpawn.Spawn(hayStack, fridgeCell);
                    }
                }
            }
            // Spawn animal beds.
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(2, 0, 6).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(2, 0, 8).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(4, 0, 8).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);

            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(6, 0, 8).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(8, 0, 8).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(8, 0, 6).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);

            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(8, 0, 4).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(8, 0, 2).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);
            OG_Common.TrySpawnThingAt(ThingDef.Named("AnimalBed"), ThingDef.Named("Cloth"), rotatedOrigin + new IntVec3(6, 0, 2).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData);

            // Spawn lamp, heater and coolers.
            OG_Common.TrySpawnLampAt(rotatedOrigin + new IntVec3(6, 0, 5).RotatedBy(rotation), Color.white, ref outpostData);
            OG_Common.TrySpawnHeaterAt(rotatedOrigin + new IntVec3(8, 0, 5).RotatedBy(rotation), ref outpostData);
            Building_Cooler cooler = OG_Common.SpawnCoolerAt(rotatedOrigin + new IntVec3(1, 0, 3).RotatedBy(rotation), new Rot4(Rot4.West.AsInt + rotation.AsInt), ref outpostData);

            cooler.compTempControl.targetTemperature = 5f;

            // Spawn vertical alley and doors.
            for (int zOffset = 0; zOffset <= 10; zOffset++)
            {
                Find.TerrainGrid.SetTerrain(rotatedOrigin + new IntVec3(5, 0, zOffset).RotatedBy(rotation), TerrainDef.Named("PavedTile"));
            }
            OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(5, 0, 1).RotatedBy(rotation), ref outpostData);
            OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(5, 0, 9).RotatedBy(rotation), ref outpostData);
        }
Exemple #10
0
 public override void SpawnSetup()
 {
     base.SpawnSetup();
     this.gun = (Equipment)ThingMaker.MakeThing(this.def.building.turretGunDef, null);
 }
        //public static bool Zombify(ReanimatedPawn pawn)
        //{
        //    if (pawn.Drawer == null)
        //    {
        //        return false;
        //    }
        //    if (pawn.Drawer.renderer == null)
        //    {
        //        return false;
        //    }
        //    if (pawn.Drawer.renderer.graphics == null)
        //    {
        //        return false;
        //    }
        //    if (!pawn.Drawer.renderer.graphics.AllResolved)
        //    {
        //        pawn.Drawer.renderer.graphics.ResolveAllGraphics();
        //    }
        //    if (pawn.Drawer.renderer.graphics.headGraphic == null)
        //    {
        //        return false;
        //    }
        //    if (pawn.Drawer.renderer.graphics.nakedGraphic == null)
        //    {
        //        return false;
        //    }
        //    if (pawn.Drawer.renderer.graphics.headGraphic.path == null)
        //    {
        //        return false;
        //    }
        //    if (pawn.Drawer.renderer.graphics.nakedGraphic.path == null)
        //    {
        //        return false;
        //    }
        //    GiveZombieSkinEffect(pawn);
        //    return true;
        //}

        // Credit goes to Justin C for the Zombie Apocalypse code.
        // Taken from Verse.ZombieMod_Utility
        public static Pawn GenerateClonePawnFromSource(Pawn sourcePawn)
        {
            PawnKindDef pawnKindDef   = PawnKindDef.Named("ReanimatedCorpse");
            Faction     factionDirect = Find.FactionManager.FirstFactionOfDef(FactionDefOf.SpacerHostile);
            Pawn        pawn          = (Pawn)ThingMaker.MakeThing(pawnKindDef.race, null);

            pawn.kindDef = pawnKindDef;
            pawn.SetFactionDirect(factionDirect);
            pawn.pather     = new Pawn_PathFollower(pawn);
            pawn.ageTracker = new Pawn_AgeTracker(pawn);
            pawn.health     = new Pawn_HealthTracker(pawn);
            pawn.jobs       = new Pawn_JobTracker(pawn);
            pawn.mindState  = new Pawn_MindState(pawn);
            pawn.filth      = new Pawn_FilthTracker(pawn);
            pawn.needs      = new Pawn_NeedsTracker(pawn);
            pawn.stances    = new Pawn_StanceTracker(pawn);
            pawn.natives    = new Pawn_NativeVerbs(pawn);
            PawnComponentsUtility.CreateInitialComponents(pawn);
            if (pawn.RaceProps.ToolUser)
            {
                pawn.equipment    = new Pawn_EquipmentTracker(pawn);
                pawn.carryTracker = new Pawn_CarryTracker(pawn);
                pawn.apparel      = new Pawn_ApparelTracker(pawn);
                pawn.inventory    = new Pawn_InventoryTracker(pawn);
            }
            if (pawn.RaceProps.Humanlike)
            {
                pawn.ownership    = new Pawn_Ownership(pawn);
                pawn.skills       = new Pawn_SkillTracker(pawn);
                pawn.relations    = new Pawn_RelationsTracker(pawn);
                pawn.story        = new Pawn_StoryTracker(pawn);
                pawn.workSettings = new Pawn_WorkSettings(pawn);
            }
            if (pawn.RaceProps.intelligence <= Intelligence.ToolUser)
            {
                pawn.caller = new Pawn_CallTracker(pawn);
            }
            //pawn.gender = Gender.None;
            pawn.gender = sourcePawn.gender;
            //Cthulhu.Utility.GenerateRandomAge(pawn, pawn.Map);
            pawn.ageTracker.AgeBiologicalTicks = sourcePawn.ageTracker.AgeBiologicalTicks;
            pawn.ageTracker.BirthAbsTicks      = sourcePawn.ageTracker.BirthAbsTicks;

            pawn.needs.SetInitialLevels();
            if (pawn.RaceProps.Humanlike)
            {
                string headGraphicPath = sourcePawn.story.HeadGraphicPath;
                typeof(Pawn_StoryTracker).GetField("headGraphicPath", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pawn.story, headGraphicPath);
                pawn.story.melanin   = sourcePawn.story.melanin;
                pawn.story.crownType = sourcePawn.story.crownType;
                pawn.story.hairColor = sourcePawn.story.hairColor;
                NameTriple name = sourcePawn.Name as NameTriple;
                pawn.Name            = name;
                pawn.story.childhood = sourcePawn.story.childhood;
                pawn.story.adulthood = sourcePawn.story.adulthood;
                pawn.story.hairDef   = sourcePawn.story.hairDef;
                foreach (Trait current in sourcePawn.story.traits.allTraits)
                {
                    pawn.story.traits.GainTrait(current);
                }
                //pawn.story.GenerateSkillsFromBackstory();
            }
            GenerateApparelFromSource(pawn, sourcePawn);
            PawnGenerationRequest con = new PawnGenerationRequest();

            PawnInventoryGenerator.GenerateInventoryFor(pawn, con);
            Graphic nakedBodyGraphic = GraphicGetter_NakedHumanlike.GetNakedBodyGraphic(sourcePawn.story.bodyType, ShaderDatabase.CutoutSkin, sourcePawn.story.SkinColor);
            Graphic headGraphic      = GraphicDatabase.Get <Graphic_Multi>(sourcePawn.story.HeadGraphicPath, ShaderDatabase.CutoutSkin, Vector2.one, sourcePawn.story.SkinColor);
            Graphic hairGraphic      = GraphicDatabase.Get <Graphic_Multi>(sourcePawn.story.hairDef.texPath, ShaderDatabase.Cutout, Vector2.one, sourcePawn.story.hairColor);

            pawn.Drawer.renderer.graphics.headGraphic  = headGraphic;
            pawn.Drawer.renderer.graphics.nakedGraphic = nakedBodyGraphic;
            pawn.Drawer.renderer.graphics.hairGraphic  = hairGraphic;
            return(pawn);
        }
Exemple #12
0
        public static IEnumerable <Thing> ButcherCorpseProducts(Corpse corpse, Pawn butcher)
        {
            bool flag  = corpse.def.butcherProducts != null;
            bool flag6 = flag;

            if (flag6)
            {
                IEnumerator <Thing> enumerator = corpse.InnerPawn.ButcherProducts(butcher, 1f).GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        Thing thing2 = enumerator.Current;
                        yield return(thing2);
                    }
                }
                finally
                {
                    enumerator.Dispose();
                }
                enumerator = null;
                enumerator = null;
            }
            else
            {
                bool isFlesh = corpse.InnerPawn.RaceProps.IsFlesh;
                bool flag7   = isFlesh;
                if (flag7)
                {
                    FilthMaker.TryMakeFilth(butcher.Position, butcher.Map, ThingDefOf.Filth_Blood, corpse.InnerPawn.LabelCap, 1);
                }
            }
            bool flag2 = corpse.InnerPawn.RaceProps.meatDef != null;
            bool flag8 = flag2;

            if (flag8)
            {
                FilthMaker.TryMakeFilth(butcher.Position, butcher.Map, ThingDefOf.Filth_Blood, corpse.InnerPawn.LabelCap, 1);
                int num = GenMath.RoundRandom(StatExtension.GetStatValue(corpse.InnerPawn, StatDefOf.MeatAmount, true) * 0f);
            }
            bool flag3 = corpse.InnerPawn.def.race.leatherDef != null;
            bool flag9 = flag3;

            if (flag9)
            {
                int  num2   = GenMath.RoundRandom(StatExtension.GetStatValue(corpse.InnerPawn, StatDefOf.LeatherAmount, true) * 0f);
                bool flag4  = num2 > 0;
                bool flag10 = flag4;
                if (flag10)
                {
                    Thing thing  = ThingMaker.MakeThing(corpse.InnerPawn.def.race.leatherDef, null);
                    bool  flag5  = thing != null;
                    bool  flag11 = flag5;
                    if (flag11)
                    {
                        thing.stackCount = num2;
                        yield return(thing);
                    }
                    thing = null;
                    thing = null;
                }
            }
            yield break;
        }
Exemple #13
0
        public void doMapSpawns()
        {
            if (map.Biome.defName.Contains("AB_"))
            {
                foreach (SpecialSpawnsDef element in DefDatabase <SpecialSpawnsDef> .AllDefs.Where(element => element.allowedBiome == map.Biome.defName))
                {
                    IEnumerable <IntVec3> tmpTerrain = map.AllCells.InRandomOrder();


                    int extraGeneration = 0;
                    foreach (string biome in element.biomesWithExtraGeneration)
                    {
                        if (map.Biome.defName == biome)
                        {
                            extraGeneration = element.extraGeneration;
                        }
                    }

                    bool canSpawn = true;
                    if (spawnCounter == 0)
                    {
                        spawnCounter = Rand.RangeInclusive(element.numberToSpawn.min, element.numberToSpawn.max) + extraGeneration;
                        //Log.Message(spawnCounter.ToString());
                    }
                    foreach (IntVec3 c in tmpTerrain)
                    {
                        TerrainDef terrain = c.GetTerrain(map);


                        bool flagAllowed = true;
                        foreach (string allowed in element.terrainValidationAllowed)
                        {
                            if (terrain.defName == allowed)
                            {
                                break;
                            }
                            else
                            {
                                flagAllowed = false;
                            }
                        }
                        bool flagDisallowed = true;
                        foreach (string notAllowed in element.terrainValidationDisallowed)
                        {
                            if (terrain.HasTag(notAllowed))
                            {
                                flagDisallowed = false;
                                break;
                            }
                        }
                        bool flagWater = true;
                        if (!element.allowOnWater && terrain.IsWater)
                        {
                            flagWater = false;
                        }
                        bool flagCenter = true;
                        if (element.findCellsOutsideColony)
                        {
                            if (!OutOfCenter(c, map, 60))
                            {
                                flagCenter = false;
                            }
                        }
                        canSpawn = flagAllowed & flagDisallowed & flagWater & flagCenter;
                        if (canSpawn)
                        {
                            // Log.Message("Sucesful c was " + c.ToString());
                            Thing    thing        = (Thing)ThingMaker.MakeThing(element.thingDef, null);
                            CellRect occupiedRect = GenAdj.OccupiedRect(c, thing.Rotation, thing.def.Size);
                            if (occupiedRect.InBounds(map))
                            {
                                // Log.Message("Prior to " + element.defName + " .Spawncounter was " + spawnCounter);
                                GenSpawn.Spawn(thing, c, map);
                                spawnCounter--;
                                // Log.Message("Spawning " + element.defName + " .Spawncounter was " + spawnCounter);
                            }
                        }
                        if (canSpawn && spawnCounter <= 0)
                        {
                            //Log.Message("Spawn counter is " + spawnCounter + " So I'm getting out");
                            spawnCounter = 0;
                            break;
                        }
                    }
                }
            }



            this.verifyFirstTime = false;
        }
Exemple #14
0
        private bool TryAffectThing(Thing thing, ref float breakingPowerRemaining)
        {
            if (thing.def == null || thing.Map == null)
            {
                return(false);
            }
            var map      = thing.Map;
            var affected = false;

            if (thing.def.mineable)
            {
                var rockBuildingDef = thing.def.building;
                if (rockBuildingDef == null)
                {
                    return(false);
                }
                if (rockBuildingDef.isResourceRock)
                {
                    // resource rocks
                    breakingPowerRemaining -= thing.HitPoints * MiningProps.resourceBreakingCost;
                    DamageResourceHolder(thing, MiningProps.resourceBreakingYield);
                    thing.Destroy(DestroyMode.KillFinalize);
                    affected = true;
                }
                else if (rockBuildingDef.isNaturalRock)
                {
                    // stone
                    breakingPowerRemaining -= thing.HitPoints;
                    thing.Destroy();
                    affected = true;
                    if (thing.def.filthLeaving != null)
                    {
                        FilthMaker.MakeFilth(thing.Position, map, thing.def.filthLeaving, Rand.RangeInclusive(1, 3));
                    }
                    if (rockBuildingDef.mineableThing != null && Rand.Value < MiningProps.rockChunkChance)
                    {
                        var rockDrop = ThingMaker.MakeThing(rockBuildingDef.mineableThing);
                        if (rockDrop.def.stackLimit == 1)
                        {
                            rockDrop.stackCount = 1;
                        }
                        else
                        {
                            rockDrop.stackCount = Mathf.CeilToInt(rockBuildingDef.mineableYield);
                        }
                        GenPlace.TryPlaceThing(rockDrop, thing.Position, map, ThingPlaceMode.Direct);
                    }
                }
                else
                {
                    // all other mineables
                    breakingPowerRemaining -= thing.HitPoints;
                    thing.Destroy(DestroyMode.KillFinalize);
                    affected = true;
                }
            }
            else if (thing.def.plant != null && thing.def.plant.IsTree)
            {
                // trees
                breakingPowerRemaining -= thing.HitPoints * MiningProps.woodBreakingCost;
                var tree = (Plant)thing;
                DamageResourceHolder(tree, MiningProps.woodBreakingYield);
                var yeild = tree.YieldNow();
                tree.PlantCollected();
                if (yeild > 0)
                {
                    var wood = ThingMaker.MakeThing(thing.def.plant.harvestedThingDef);
                    wood.stackCount = yeild;
                    GenPlace.TryPlaceThing(wood, thing.Position, map, ThingPlaceMode.Direct);
                }
            }
            return(affected);
        }
        public List <Thing> GenerateMeteoriteComposition(int radius)
        {
            List <Thing> meteoriteComposition = new List <Thing>();

            meteoriteComposition.Clear();
            int      compositionCount = GenRadial.RadialCellsAround(caster.Position, radius, false).Count();
            int      rnd      = Rand.RangeInclusive(0, 4);
            ThingDef thingDef = null;

            try
            {
                switch (rnd)
                {
                case 0:
                    thingDef = ThingDef.Named("Sandstone");
                    break;

                case 1:
                    thingDef = ThingDef.Named("Granite");
                    break;

                case 2:
                    thingDef = ThingDef.Named("Limestone");
                    break;

                case 3:
                    thingDef = ThingDef.Named("Slate");
                    break;

                case 4:
                    thingDef = ThingDef.Named("Marble");
                    break;
                }
            }
            catch
            {
                //if someone took these out...
                IEnumerable <ThingDef> enumerable = from def in DefDatabase <ThingDef> .AllDefs
                                                    where def.thingCategories != null && def.thingCategories.Contains(ThingCategoryDefOf.StoneChunks)
                                                    select def;
                thingDef = enumerable.RandomElement();
            }

            ThingDef preciousThingDef = null;

            try
            {
                rnd = Rand.RangeInclusive(0, 5);
                switch (rnd)
                {
                case 0:
                    preciousThingDef = ThingDef.Named("MineableSilver");
                    break;

                case 1:
                    preciousThingDef = ThingDef.Named("MineableGold");
                    break;

                case 2:
                    preciousThingDef = ThingDef.Named("MineableUranium");
                    break;

                case 3:
                    preciousThingDef = ThingDef.Named("MineablePlasteel");
                    break;

                case 4:
                    preciousThingDef = ThingDef.Named("MineableJade");
                    break;

                case 5:
                    preciousThingDef = ThingDef.Named("MineableComponentsIndustrial");
                    break;
                }
            }
            catch
            {
                //if someone took these out...
                IEnumerable <ThingDef> enumerable = from def in DefDatabase <ThingDef> .AllDefs
                                                    where def.mineable
                                                    select def;
                thingDef = enumerable.RandomElement();
            }

            for (int i = 0; i < compositionCount; i++)
            {
                Thing tmpThing = null;
                if (i == compositionCount - 1)
                {
                    tmpThing = ThingMaker.MakeThing(preciousThingDef, null);
                }
                else if (i > compositionCount - 9)
                {
                    if (Rand.Chance(.15f * verVal))
                    {
                        tmpThing = ThingMaker.MakeThing(preciousThingDef, null);
                    }
                    else
                    {
                        tmpThing = ThingMaker.MakeThing(thingDef, null);
                    }
                }
                else
                {
                    if (Rand.Chance(.05f))
                    {
                        tmpThing = ThingMaker.MakeThing(ThingDef.Named("MineableSteel"), null);
                    }
                    else
                    {
                        tmpThing = ThingMaker.MakeThing(thingDef, null);
                    }
                }
                meteoriteComposition.Add(tmpThing);
            }

            return(meteoriteComposition);
        }
        public override void Generate(Map map, GenStepParams parms)
        {
            List <ThingDef> sources = (from x in DefDatabase <ThingDef> .AllDefsListForReading
                                       where x.category == ThingCategory.Plant && x.GetCompProperties <CompProperties_WaterPlant>() != null &&
                                       x.GetCompProperties <CompProperties_WaterPlant>().allowedBiomes.Contains(map.Biome.defName)
                                       select x).ToList();

            if (sources == null || sources.Count == 0)
            {
                return;
            }
            foreach (IntVec3 c in map.AllCells)
            {
                ThingDef source = sources[Rand.RangeInclusive(0, sources.Count - 1)];
                if (c.GetEdifice(map) == null && c.GetCover(map) == null && c.GetFirstBuilding(map) == null)
                {
                    if (source.GetCompProperties <CompProperties_WaterPlant>().allowedTiles.Contains(c.GetTerrain(map)))
                    {
                        if (Rand.Chance(source.GetCompProperties <CompProperties_WaterPlant>().spawnChance))
                        {
                            Plant plant = (Plant)ThingMaker.MakeThing(source, null);
                            plant.Growth = Rand.Range(0.07f, 1f);
                            if (plant.def.plant.LimitedLifespan)
                            {
                                plant.Age = Rand.Range(0, Mathf.Max(plant.def.plant.LifespanTicks - 50, 0));
                            }
                            GenSpawn.Spawn(plant, c, map);
                        }
                    }
                    else
                    {
                        if (source.GetCompProperties <CompProperties_WaterPlant>().growNearWater)
                        {
                            bool flag = false;
                            for (int i = c.x - 1; i < c.x + 2; i++)
                            {
                                for (int j = c.z - 1; j < c.z + 2; j++)
                                {
                                    IntVec3 temp = new IntVec3(i, 0, j);
                                    if (temp.InBounds(map) && source.GetCompProperties <CompProperties_WaterPlant>().allowedTiles.Contains(temp.GetTerrain(map)) && !isWater(temp, map) && !(temp.GetTerrain(map).defName == "Marsh"))
                                    {
                                        if (Rand.Chance(source.GetCompProperties <CompProperties_WaterPlant>().spawnChance))
                                        {
                                            Plant plant = (Plant)ThingMaker.MakeThing(source, null);
                                            plant.Growth = Rand.Range(0.07f, 1f);
                                            if (plant.def.plant.LimitedLifespan)
                                            {
                                                plant.Age = Rand.Range(0, Mathf.Max(plant.def.plant.LifespanTicks - 50, 0));
                                            }
                                            GenSpawn.Spawn(plant, c, map);
                                            flag = true;
                                        }
                                    }
                                    if (flag)
                                    {
                                        break;
                                    }
                                }
                                if (flag)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        public Thing Make()
        {
            /*QLog.Warning(QLog.Ctx.Thing, "v----------  ----------v");
            *  QLog.Message(QLog.Ctx.Thing, "Executing Storage.Make(). Thing is:");
            *  QLog.Message(QLog.Ctx.Thing, this.thing.Label);
            *  QLog.Message(QLog.Ctx.Thing, this.thing.Stuff.ToStringSafe());
            *  QLog.Message(QLog.Ctx.Thing, this.thing.TryGetComp<CompQuality>()?.Quality.GetLabel());
            *  QLog.Warning(QLog.Ctx.Thing, "^----------  ----------^");*/
            if (this.thing is Corpse corpseThing)
            {
                var corpse = ThingMaker.MakeThing(corpseThing.InnerPawn.RaceProps.corpseDef) as Corpse;
                corpseThing.GetDirectlyHeldThings().TryTransferToContainer(corpseThing.InnerPawn, corpse.GetDirectlyHeldThings());

                return(corpse);
            }

            if (this.thing is UnfinishedThing unfinishedThing)
            {
                /*QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: Identified Unfinished Thing:");
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: UnfinishedThing: " + this.thing.Label);
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: Setting Work Left to: " + unfinishedThing.workLeft);
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: Setting Creator to: " + unfinishedThing.Creator);*/

                UnfinishedThing unfinished = ThingMaker.MakeThing(unfinishedThing.def, this.stuff) as UnfinishedThing;
                unfinished.workLeft = unfinishedThing.workLeft;
                unfinished.Creator  = unfinishedThing.Creator;

                /*QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: Set Work Left to: " + unfinished.workLeft);
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make() isUnfinishedThing: Set Creator to: " + unfinished.Creator);*/

                return(unfinished);
            }



            Thing       thing      = ThingMaker.MakeThing(this.def, this.stuff);
            CompQuality newQuality = ThingCompUtility.TryGetComp <CompQuality>(thing);
            CompQuality oldQuality = this.thing.TryGetComp <CompQuality>();



            if ((oldQuality?.Quality != null) && (newQuality?.Quality != null) && (newQuality.Quality != oldQuality.Quality))
            {
                /*QLog.Message(QLog.Ctx.Thing, "QThing.Make(): Quality gleaned from original thing:");
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make(): CompQuality: " + this.thing.TryGetComp<CompQuality>()?.Quality.GetLabel());
                 *
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make(): Quality assigned to new thing:");
                 * QLog.Message(QLog.Ctx.Thing, "QThing.Make(): CompQuality: " + thing.TryGetComp<CompQuality>()?.Quality.GetLabel());*/

                thing.TryGetComp <CompQuality>().SetQuality(oldQuality.Quality, ArtGenerationContext.Colony);
            }



            thing.HitPoints  = this.hitPoints;
            thing.stackCount = this.stackCount;

            /*QLog.Message(QLog.Ctx.Thing, "New Thing is:");
             * QLog.Message(QLog.Ctx.Thing, thing.def.defName);
             * QLog.Message(QLog.Ctx.Thing, thing.Stuff.ToStringSafe());
             * QLog.Message(QLog.Ctx.Thing, thing.TryGetComp<CompQuality>()?.Quality.GetLabel());*/

            return(thing);
        }
Exemple #18
0
        // Token: 0x06000038 RID: 56 RVA: 0x000030B0 File Offset: 0x000012B0
        public Pawn FromRealmPawn(RealmData realmData)
        {
            var named = DefDatabase <PawnKindDef> .GetNamed(kindDefName);

            var pawn = (Pawn)ThingMaker.MakeThing(named.race);

            foreach (var pawn2 in Find.WorldPawns.ForcefullyKeptPawns)
            {
                var   health = pawn2.health;
                float?num;
                if (health == null)
                {
                    num = null;
                }
                else
                {
                    var hediffSet = health.hediffSet;
                    if (hediffSet == null)
                    {
                        num = null;
                    }
                    else
                    {
                        var firstHediffOfDef = hediffSet.GetFirstHediffOfDef(PhiHediffDefOf.Phi_Key);
                        num = firstHediffOfDef != null ? new float?(firstHediffOfDef.Severity) : null;
                    }
                }

                var   num2 = num ?? -1f;
                var   list = hediffs;
                float?num3;
                if (list == null)
                {
                    num3 = null;
                }
                else
                {
                    var realmHediff = list.First(h => h.hediffDefName == PhiHediffDefOf.Phi_Key.defName);
                    num3 = realmHediff != null ? new float?(realmHediff.severity) : null;
                }

                if (num2 != num3)
                {
                    continue;
                }

                pawn = pawn2;
                break;
            }

            pawn.kindDef = named;
            pawn.SetFactionDirect(Faction.OfPlayer);
            PawnComponentsUtility.CreateInitialComponents(pawn);
            var pawnName = pawn.Name;

            switch (name.Length)
            {
            case 1:
                pawnName = new NameSingle(name[0]);
                break;

            case 2:
                pawnName = new NameTriple(name[0], name[1], name[1]);
                break;

            case 3:
                pawnName = new NameTriple(name[0], name[1], name[2]);
                break;
            }

            pawn.Name   = pawnName;
            pawn.gender = gender;
            pawn.ageTracker.AgeBiologicalTicks    = ageBiologicalTicks;
            pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks;
            var story = pawn.story;

            if (story != null)
            {
                story.melanin   = melanin;
                story.crownType = crownType;
                story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]);
                if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood))
                {
                    throw new Exception($"Couldn't find backstory '{childhoodKey}'");
                }

                if (!string.IsNullOrEmpty(adulthoodKey) &&
                    !BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood))
                {
                    throw new Exception($"Couldn't find backstory '{adulthoodKey}'");
                }

                story.bodyType = DefDatabase <BodyTypeDef> .GetNamed(bodyTypeDefName);

                story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName);

                story.traits.allTraits.Clear();
                foreach (var realmTrait in traits)
                {
                    var named2 = DefDatabase <TraitDef> .GetNamed(realmTrait.traitDefName);

                    story.traits.GainTrait(new Trait(named2, realmTrait.degree));
                }
            }

            if (skills != null)
            {
                using var enumerator3 = skills.AsEnumerable().GetEnumerator();
                while (enumerator3.MoveNext())
                {
                    var item2    = enumerator3.Current;
                    var skillDef = DefDatabase <SkillDef> .AllDefs.First(def => def.label == item2?.skillDefLabel);

                    var skill = pawn.skills.GetSkill(skillDef);
                    if (item2 == null)
                    {
                        continue;
                    }

                    skill.Level   = item2.level;
                    skill.passion = item2.passion;
                }
            }

            var workSettings = pawn.workSettings;

            workSettings?.EnableAndInitialize();

            if (apparels != null)
            {
                var pawn_ApparelTracker = new Pawn_ApparelTracker(pawn);
                foreach (var realmThing in apparels)
                {
                    var apparel = (Apparel)realmData.FromRealmThing(realmThing);
                    pawn_ApparelTracker.Wear(apparel);
                }
            }

            if (equipments != null)
            {
                var pawn_EquipmentTracker = new Pawn_EquipmentTracker(pawn);
                foreach (var realmThing2 in equipments)
                {
                    var newEq = (ThingWithComps)realmData.FromRealmThing(realmThing2);
                    pawn_EquipmentTracker.AddEquipment(newEq);
                }
            }

            if (inventory != null)
            {
                var pawn_InventoryTracker = pawn.inventory;
                foreach (var realmThing3 in inventory)
                {
                    var item = realmData.FromRealmThing(realmThing3);
                    pawn_InventoryTracker.innerContainer.TryAdd(item);
                }
            }

            if (hediffs == null)
            {
                Log.Warning("RealmHediffs is null in received colonist");
            }

            foreach (var realmHediff2 in hediffs ?? new List <RealmHediff>())
            {
                var named3 = DefDatabase <HediffDef> .GetNamed(realmHediff2.hediffDefName);

                BodyPartRecord part = null;
                if (realmHediff2.bodyPartIndex != -1)
                {
                    part = pawn.RaceProps.body.GetPartAtIndex(realmHediff2.bodyPartIndex);
                }

                pawn.health.AddHediff(named3, part);
                var hediff = pawn.health.hediffSet.hediffs.Last();
                hediff.source = realmHediff2.sourceDefName == null
                    ? null
                    : DefDatabase <ThingDef> .GetNamedSilentFail(realmHediff2.sourceDefName);

                hediff.ageTicks = realmHediff2.ageTicks;
                hediff.Severity = realmHediff2.severity;
                if (float.IsNaN(realmHediff2.immunity) || pawn.health.immunity.ImmunityRecordExists(named3))
                {
                    continue;
                }

                var immunity = pawn.health.immunity;
                immunity.GetType().GetMethod("TryAddImmunityRecord", BindingFlags.Instance | BindingFlags.NonPublic)
                .Invoke(immunity, new object[]
                {
                    named3
                });
                immunity.GetImmunityRecord(named3).immunity = realmHediff2.immunity;
            }

            if (training != null)
            {
                pawn.training = new Pawn_TrainingTracker(pawn);
                foreach (var realmTrainingRecord in training)
                {
                    var named4 = DefDatabase <TrainableDef> .GetNamed(realmTrainingRecord.trainingDefLabel);

                    if (realmTrainingRecord.wanted)
                    {
                        pawn.training.SetWantedRecursive(named4, false);
                    }

                    if (realmTrainingRecord.learned)
                    {
                        pawn.training.Train(named4, null, true);
                    }
                }
            }

            var field = pawn.health.GetType().GetField("healthState", BindingFlags.Instance | BindingFlags.NonPublic);

            if (field == null)
            {
                Log.Error("Unable to find healthState field");
            }
            else
            {
                field.SetValue(pawn.health, healthState);
            }

            if (workPriorities == null)
            {
                return(pawn);
            }

            foreach (var keyValuePair in workPriorities ?? new Dictionary <string, int>())
            {
                var namedSilentFail = DefDatabase <WorkTypeDef> .GetNamedSilentFail(keyValuePair.Key);

                if (namedSilentFail == null)
                {
                    Log.Warning($"Ignoring unknown workType: {keyValuePair.Key}");
                }
                else
                {
                    pawn.workSettings.SetPriority(namedSilentFail, keyValuePair.Value);
                }
            }

            return(pawn);
        }
Exemple #19
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.OnCell));


            Toil God = new Toil();

            God.initAction = delegate { AnnoyingOrange = workmax; };
            God.tickAction = delegate
            {
                if (AnnoyingOrange <= 0)
                {
                    this.ReadyForNextToil();
                }
                else
                {
                    AnnoyingOrange--;
                }
            };
            God.defaultCompleteMode = ToilCompleteMode.Never;
            God.WithProgressBar(TargetIndex.A, () => 1f - (float)AnnoyingOrange / workmax);
            yield return(God);

            Toil LOL = new Toil();

            LOL.initAction = delegate
            {
                List <ThingDef> LowlevelTreasures = new List <ThingDef>()
                {
                    ThingDefOf.Silver,
                    ThingDefOf.Steel,
                };
                List <ThingDef> MiddlelevelTreasures = new List <ThingDef>()
                {
                    DefDatabase <ThingDef> .AllDefs.ToList()
                    .FindAll(x =>
                             x.IsRangedWeapon && x.BaseMarketValue < 659 && x.graphicData != null).RandomElement(),
                    ThingDefOf.Gold,
                };
                MiddlelevelTreasures.AddRange(LowlevelTreasures);
                List <ThingDef> HighevelTreasures = new List <ThingDef>()
                {
                    ThingDefOf.Plasteel,

                    DefDatabase <ThingDef> .AllDefs.ToList()
                    .FindAll(x =>
                             x.IsRangedWeapon && x.BaseMarketValue < 1000 && x.graphicData != null).RandomElement(),
                };

                Thing DerpderdiDerpDerp = null;    // = ThingMaker.MakeThing(Treasures.RandomElement());
                if (pawn.skills.skills.FirstOrDefault(x => x.def.defName == "Swimming")
                    is SkillRecord swimming)
                {
                    if (swimming.Level < 8)
                    {
                        DerpderdiDerpDerp = ThingMaker.MakeThing(LowlevelTreasures.RandomElement());
                    }
                    else if (swimming.Level < 15)
                    {
                        DerpderdiDerpDerp = ThingMaker.MakeThing(MiddlelevelTreasures.RandomElement());
                    }
                    else if (swimming.Level < 21)
                    {
                        DerpderdiDerpDerp = ThingMaker.MakeThing(HighevelTreasures.RandomElement());
                    }
                }
                GenPlace.TryPlaceThing(DerpderdiDerpDerp, TargetLocA, GetActor().Map, ThingPlaceMode.Near);
            };
            LOL.WithProgressBarToilDelay(TargetIndex.A, workmax);
            yield return(LOL);
        }
        private void leaveLoot()
        {
            float leaveSomething = Rand.Value;

            if (leaveSomething < 0.001f)
            {
                float         leaveWhat = Rand.Value;
                List <string> allowed   = new List <string>();
                if (leaveWhat > 0.1f)
                {
                    //leave trash;
                    allowed = new List <string>
                    {
                        "Filth_Slime",
                        "TKKN_FilthShells",
                        "TKKN_FilthPuddle",
                        "TKKN_FilthSeaweed",
                        "TKKN_FilthDriftwood",
                        "TKKN_Sculpture_Shell",
                        "Kibble",
                        "EggRoeFertilized",
                        "EggRoeUnfertilized",
                    };
                }
                else if (leaveWhat > 0.05f)
                {
                    //leave resource;
                    allowed = new List <string>
                    {
                        "Steel",
                        "Cloth",
                        "WoodLog",
                        "Synthread",
                        "Hyperweave",
                        "Kibble",
                        "SimpleProstheticLeg",
                        "MedicineIndustrial",
                        "ComponentIndustrial",
                        "Neutroamine",
                        "Chemfuel",
                        "MealSurvivalPack",
                        "Pemmican",
                    };
                }
                else if (leaveWhat > 0.03f)
                {
                    // leave treasure.
                    allowed = new List <string>
                    {
                        "Silver",
                        "Plasteel",
                        "Gold",
                        "Uranium",
                        "Jade",
                        "Heart",
                        "Lung",
                        "BionicEye",
                        "ScytherBlade",
                        "ElephantTusk",
                    };

                    string text = "TKKN_NPS_TreasureWashedUpText".Translate();
                    Messages.Message(text, MessageTypeDefOf.NeutralEvent);
                }
                else if (leaveWhat > 0.02f)
                {
                    //leave ultrarare
                    allowed = new List <string>
                    {
                        "AIPersonaCore",
                        "MechSerumHealer",
                        "MechSerumNeurotrainer",
                        "ComponentSpacer",
                        "MedicineUltratech",
                        "ThrumboHorn",
                    };
                    string text = "TKKN_NPS_UltraRareWashedUpText".Translate();
                    Messages.Message(text, MessageTypeDefOf.NeutralEvent);
                }
                if (allowed.Count > 0)
                {
                    int   leaveWhat2 = Rand.Range(1, allowed.Count) - 1;
                    Thing loot       = ThingMaker.MakeThing(ThingDef.Named(allowed[leaveWhat2]), null);
                    if (loot != null)
                    {
                        GenSpawn.Spawn(loot, location, this.map);
                    }
                    else
                    {
                        //	Log.Error(allowed[leaveWhat2]);
                    }
                }
            }
            else

            //grow water and shore plants:
            if (leaveSomething < 0.002f && location.GetPlant(map) == null && location.GetCover(this.map) == null)
            {
                List <ThingDef> plants = this.map.Biome.AllWildPlants;
                for (int i = plants.Count - 1; i >= 0; i--)
                {
                    //spawn some water plants:
                    ThingDef plantDef = plants[i];
                    if (plantDef.HasModExtension <ThingWeatherReaction>())
                    {
                        TerrainDef           terrain      = currentTerrain;
                        ThingWeatherReaction thingWeather = plantDef.GetModExtension <ThingWeatherReaction>();
                        List <TerrainDef>    okTerrains   = thingWeather.allowedTerrains;
                        if (okTerrains != null && okTerrains.Contains <TerrainDef>(currentTerrain))
                        {
                            Plant plant = (Plant)ThingMaker.MakeThing(plantDef, null);
                            plant.Growth = Rand.Range(0.07f, 1f);
                            if (plant.def.plant.LimitedLifespan)
                            {
                                plant.Age = Rand.Range(0, Mathf.Max(plant.def.plant.LifespanTicks - 50, 0));
                            }
                            GenSpawn.Spawn(plant, location, map);
                            break;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Throw a fish mote. So cute! :-)
        /// </summary>
        public Mote ThrowFishMote()
        {
            if (!this.Position.ShouldSpawnMotesAt(this.Map) || this.Map.moteCounter.Saturated)
            {
                return(null);
            }

            bool     startFromLeft = Rand.Chance(0.5f);
            ThingDef moteDef       = null;

            if (this.speciesDef == Util_FishIndustry.MashgonPawnKindDef)
            {
                if (startFromLeft)
                {
                    moteDef = Util_FishIndustry.MoteFishMashgonEastDef;
                }
                else
                {
                    moteDef = Util_FishIndustry.MoteFishMashgonWestDef;
                }
            }
            else if (this.speciesDef == Util_FishIndustry.BluebladePawnKindDef)
            {
                if (startFromLeft)
                {
                    moteDef = Util_FishIndustry.MoteFishBluebladeEastDef;
                }
                else
                {
                    moteDef = Util_FishIndustry.MoteFishBluebladeWestDef;
                }
            }
            else if (this.speciesDef == Util_FishIndustry.TailteethPawnKindDef)
            {
                if (startFromLeft)
                {
                    moteDef = Util_FishIndustry.MoteFishTailteethEastDef;
                }
                else
                {
                    moteDef = Util_FishIndustry.MoteFishTailteethWestDef;
                }
            }
            MoteThrown moteThrown = (MoteThrown)ThingMaker.MakeThing(moteDef, null);

            moteThrown.Scale = Mathf.Lerp(0.2f, 0.6f, (float)this.breedingProgressInTicks / (float)this.breedingDurationInTicks);
            Vector3 moteStartPosition = this.Position.ToVector3Shifted();

            moteThrown.exactRotation = Rand.Range(0f, 45f); // Texture rotation.
            if (startFromLeft)
            {
                // From left to right.
                moteStartPosition += 0.8f * Vector3Utility.HorizontalVectorFromAngle(270f + moteThrown.exactRotation);
                moteThrown.SetVelocity(90f + moteThrown.exactRotation, 0.25f);
            }
            else
            {
                // From east to west.
                moteStartPosition += 0.8f * Vector3Utility.HorizontalVectorFromAngle(90f + moteThrown.exactRotation);
                moteThrown.SetVelocity(270f + moteThrown.exactRotation, 0.25f);
            }
            moteThrown.exactPosition = moteStartPosition;
            GenSpawn.Spawn(moteThrown, this.Position, this.Map);
            return(moteThrown);
        }
        // Token: 0x06000062 RID: 98 RVA: 0x00004944 File Offset: 0x00002B44
        private static void Postfix(ref Toil __result, ref JobDriver_PlantCut __instance)
        {
            var unused = __instance.pawn.Map;
            var actor  = __instance.pawn;

            __result.initAction = (Action)Delegate.Combine(__result.initAction, new Action(delegate
            {
                var plant = (Plant)actor.jobs.curJob.GetTarget(TargetIndex.A).Thing;
                AYPlantUtility.AddYield(actor, plant);
                if (plant.def.defName == "Plant_AYGinkgoBiloba")
                {
                    var skillRatio = 0.5f;
                    if (actor.skills != null)
                    {
                        skillRatio = (actor.skills.GetSkill(SkillDefOf.Plants).levelInt + 5) / (float)20;
                        if (skillRatio > 1f)
                        {
                            skillRatio = 1f;
                        }

                        if (skillRatio < 0.5f)
                        {
                            skillRatio = 0.5f;
                        }
                    }

                    var thing        = ThingMaker.MakeThing(ThingDef.Named("AYGinkgoLeaves"));
                    var num          = plant.def.plant.harvestYield * 2f * plant.Growth * skillRatio;
                    num              = AdjustYield(num);
                    thing.stackCount = checked ((int)num);
                    if (thing.stackCount > 0)
                    {
                        GenPlace.TryPlaceThing(thing, actor.Position, actor.Map, ThingPlaceMode.Near);
                    }
                }
                else if (plant.def.defName == "BurnedTree")
                {
                    var skillRatio2 = 0.5f;
                    var actor2      = actor;
                    if (actor2.skills != null)
                    {
                        skillRatio2 = (actor.skills.GetSkill(SkillDefOf.Plants).levelInt + 5) / (float)20;
                        if (skillRatio2 > 1f)
                        {
                            skillRatio2 = 1f;
                        }

                        if (skillRatio2 < 0.5f)
                        {
                            skillRatio2 = 0.5f;
                        }
                    }

                    var def      = ThingDef.Named("AYCharcoal");
                    var defTwo   = ThingDef.Named("AYWoodAshes");
                    var thingOne = ThingMaker.MakeThing(def);
                    var thingTwo = ThingMaker.MakeThing(defTwo);
                    var numOne   = 10f * skillRatio2;
                    var numTwo   = 20f * skillRatio2;
                    numOne       = AdjustYield(numOne);
                    numTwo       = AdjustYield(numTwo);
                    checked
                    {
                        thingOne.stackCount = (int)numOne;
                        thingTwo.stackCount = (int)numTwo;
                        if (thingOne.stackCount > 0)
                        {
                            GenPlace.TryPlaceThing(thingOne, actor.Position, actor.Map, ThingPlaceMode.Near);
                        }

                        if (thingTwo.stackCount > 0)
                        {
                            GenPlace.TryPlaceThing(thingTwo, actor.Position, actor.Map, ThingPlaceMode.Near);
                        }
                    }
                }
            }));
        }
Exemple #23
0
        protected ThingEntry CreateThingEntry(ThingDef def, ThingDef stuffDef, Gender gender, ThingType type)
        {
            double baseCost = costs.GetBaseThingCost(def, stuffDef);

            if (baseCost == 0)
            {
                return(null);
            }
            int stackSize = CalculateStackCount(def, baseCost);

            ThingEntry result = new ThingEntry();

            result.type      = type;
            result.def       = def;
            result.stuffDef  = stuffDef;
            result.stackSize = stackSize;
            result.cost      = costs.CalculateStackCost(def, stuffDef, baseCost);
            result.stacks    = true;
            result.gear      = false;
            result.animal    = false;
            if (def.MadeFromStuff && stuffDef != null)
            {
                if (stuffDef.stuffProps.allowColorGenerators && (def.colorGenerator != null || def.colorGeneratorInTraderStock != null))
                {
                    if (def.colorGenerator != null)
                    {
                        result.color = def.colorGenerator.NewRandomizedColor();
                    }
                    else if (def.colorGeneratorInTraderStock != null)
                    {
                        result.color = def.colorGeneratorInTraderStock.NewRandomizedColor();
                    }
                }
                else
                {
                    result.color = stuffDef.stuffProps.color;
                }
            }
            else
            {
                if (def.graphicData != null)
                {
                    result.color = def.graphicData.color;
                }
                else
                {
                    result.color = Color.white;
                }
            }
            if (def.apparel != null)
            {
                result.stacks = false;
                result.gear   = true;
            }
            if (def.weaponTags != null && def.weaponTags.Count > 0)
            {
                result.stacks = false;
                result.gear   = true;
            }

            if (def.thingCategories != null)
            {
                if (def.thingCategories.SingleOrDefault((ThingCategoryDef d) =>
                {
                    return(d.defName == "FoodMeals");
                }) != null)
                {
                    result.gear = true;
                }
                if (def.thingCategories.SingleOrDefault((ThingCategoryDef d) =>
                {
                    return(d.defName == "Medicine");
                }) != null)
                {
                    result.gear = true;
                }
            }

            if (def.defName == "Apparel_PersonalShield")
            {
                result.hideFromPortrait = true;
            }

            if (def.race != null && def.race.Animal)
            {
                result.animal = true;
                result.gender = gender;
                try
                {
                    Pawn pawn = CreatePawn(def, stuffDef, gender);
                    if (pawn == null)
                    {
                        return(null);
                    }
                    else
                    {
                        result.thing   = pawn;
                        result.pawnDef = pawn.kindDef;
                    }
                }
                catch (Exception e)
                {
                    Log.Warning("Failed to create a pawn for animal thing entry: " + def.defName);
                    //Log.Message("  Exception message: " + e);
                    return(null);
                }
            }

            if (result.thing == null)
            {
                result.thing = ThingMaker.MakeThing(def, stuffDef);
            }
            return(result);
        }
Exemple #24
0
        public override IEnumerable <Gizmo> GetWornGizmos()
        {
            //  base.GetWornGizmos();
            if (Find.Selector.SingleSelectedThing != base.Wearer)
            {
                yield break;
            }

            //tanya
            if (base.Wearer.kindDef.defName == "ra2_AlliedTanya")
            {
                yield return new Command_Action
                       {
                           icon          = ContentFinder <Texture2D> .Get(!tanyaHandWeapon()?DefDatabase <ThingDef> .GetNamed("ra2_Gun_Tanya", true).graphicData.texPath : DefDatabase <ThingDef> .GetNamed("ra2_TanyaC4Bomb", true).graphicData.texPath, true),
                           defaultLabel  = "TanyaChangeWeapon".Translate(),
                           activateSound = DefDatabase <SoundDef> .GetNamed("ra2_tanya_select", true),
                           action        = delegate
                           {
                               Pawn_EquipmentTracker pe = base.Wearer.equipment;
                               ThingDef tempDef         = DefDatabase <ThingDef> .GetNamed(tanyaHandWeapon()? "ra2_TanyaC4Bomb" : "ra2_Gun_Tanya", true);

                               pe.Remove(pe.Primary);
                               pe.AddEquipment((ThingWithComps)ThingMaker.MakeThing(tempDef));
                           }
                       }
            }
            ;

            //chrono
            TargetingParameters tp = new TargetingParameters();

            tp.canTargetBuildings = false;
            tp.canTargetFires     = false;
            tp.canTargetLocations = true;
            tp.canTargetPawns     = false;
            tp.canTargetSelf      = false;


            if (base.Wearer.kindDef.defName == "ra2_AlliedChrono")
            {
                yield return new Command_TargetPlus
                       {
                           icon            = ContentFinder <Texture2D> .Get("ra2/Things/Misc/ChTeleport", true),
                           defaultLabel    = "ChronoTeleport".Translate(),
                           activateSound   = DefDatabase <SoundDef> .GetNamed("ra2_Chrono_select", true),
                           targetingParams = tp,
                           hotKey          = KeyBindingDefOf.Misc4,
                           disabled        = !base.Wearer.drafter.Drafted || base.Wearer.stances.stunner.Stunned,
                           aimIcon         = ContentFinder <Texture2D> .Get("ra2/Things/Misc/ChTeleport", true),
                           action          = delegate(LocalTargetInfo target)
                           {
                               Pawn casterPawn = base.Wearer;
                               Map  map        = base.Wearer.Map;

                               IEnumerable <Thing> thi = map.thingGrid.ThingsAt(target.Cell);
                               foreach (Thing th in thi)
                               {
                                   if (th is Building)
                                   {
                                       Messages.Message("ChronoNotToBuild".Translate(), MessageTypeDefOf.RejectInput);
                                       return;
                                   }
                               }

                               MoteMaker.ThrowExplosionCell(target.Cell, map, ThingDefOf.Mote_ExplosionFlash, new UnityEngine.Color(1, 1, 1));
                               // MoteMaker.ThrowExplosionCell(target.Cell, map, ThingDefOf.Mote_ExplosionFlash, new UnityEngine.Color(1,1,1));
                               for (int asd = 0; asd < 60; asd++)
                               {
                                   MoteMaker.ThrowExplosionCell(casterPawn.Position, map, ThingDefOf.Mote_ExplosionFlash, new UnityEngine.Color(1f - asd * 0.1f, asd * 0.1f, 1f - asd * 0.05f));
                               }


                               double dist = Math.Sqrt(Math.Pow(casterPawn.Position.x - target.Cell.x, 2) + Math.Pow(casterPawn.Position.z - target.Cell.z, 2));

                               if (dist < 20)
                               {
                                   dist = 20;
                               }


                               ThingSelectionUtility.SelectNextColonist();
                               base.Wearer.DeSpawn(DestroyMode.Vanish);
                               GenSpawn.Spawn(casterPawn, target.Cell, map, WipeMode.Vanish);
                               casterPawn.drafter.Drafted = true;
                               ThingSelectionUtility.SelectPreviousColonist();
                               SoundStarter.PlayOneShot(DefDatabase <SoundDef> .GetNamed("ra2_Chrono_move", true), casterPawn);
                               SoundStarter.PlayOneShotOnCamera(DefDatabase <SoundDef> .GetNamed("ra2_Chrono_movesay", true));

                               DamageInfo dinfo = new DamageInfo(DamageDefOf.Stun, (int)(dist * 0.1), -1, 1, null, null, base.Wearer.equipment.Primary.def, DamageInfo.SourceCategory.ThingOrUnknown, casterPawn);
                               casterPawn.TakeDamage(dinfo);
                               // Log.Warning(target+"VV");
                           }
                       }
            }
            ;

            //yuri
            bool isYuri = false;

            if (this.Wearer != null)
            {
                Pawn pawn = this.Wearer;

                if (pawn.kindDef.defName.EqualsIgnoreCase("ra2_yuriyuri"))
                {
                    isYuri = true;
                }
            }

            if (isYuri)
            {
                bool canCast = this.ticks <= 0 && this.Wearer.drafter.Drafted && !this.Wearer.stances.stunner.Stunned;
                yield return(new Command_YuriAction
                {
                    defaultLabel = "YuriExpTitle".Translate(),
                    icon = ContentFinder <Texture2D> .Get("ra2/Things/Misc/yuriExpIcon", true),
                    disabled = !canCast,
                    caster = this.Wearer,
                    hotKey = KeyBindingDefOf.Misc4,
                    action = delegate
                    {
                        Pawn pawn = this.Wearer;
                        DamageDef df = DefDatabase <DamageDef> .GetNamed("YuriExp", true);

                        foreach (IntVec3 cell in CellsAround(pawn.Position, pawn.Map, 7))
                        {
                            // if (!cell.IsValid) continue;
                            List <Thing> list = (pawn.Map.thingGrid.ThingsListAt(cell));
                            try
                            {
                                if (list.Count < 1)
                                {
                                    continue;
                                }
                                for (int i = 0; i < list.Count; i++)
                                {
                                    Pawn p;
                                    if ((p = (list[i] as Pawn)) != null)
                                    {
                                        if (p.kindDef.defName.EqualsIgnoreCase("ra2_yuriyuri"))
                                        {
                                            continue;
                                        }
                                        if (p.RaceProps.IsFlesh)
                                        {
                                            {
                                                p.Kill(new DamageInfo(df, 0, 0, -1, null, null, null, DamageInfo.SourceCategory.ThingOrUnknown, null), null);
                                            }

                                            if (!(p.Faction == Faction.OfPlayer && p.kindDef.defName.StartsWith("ra2_")))
                                            {
                                                p.Corpse.Kill(null);
                                            }
                                        }
                                    }
                                }
                            }
                            catch (Exception e) { Log.Warning(e + "233"); }
                        }

                        pawn.stances.stunner.StunFor(120, null);
                        this.ticks = 300;
                        GenExplosion.DoExplosion(pawn.Position, pawn.Map, 7f, df, pawn, 0, -1, null, null, null, null, null, 0, 1, false, null, 0, 1, 0, false);
                    }
                });
            }



            yield break;
        }
    }
}
        public override void Resolve(ResolveParams rp)
        {
            ThingDef ship_Beam = ThingDefOf.Ship_Beam;
            Map      map       = BaseGen.globalSettings.map;

            if (!rp.thingRot.HasValue && !rp.thrustAxis.HasValue)
            {
                rp.thrustAxis = new Rot4?(Rot4.Random);
                rp.thingRot   = rp.thrustAxis;
            }
            IntVec2 invalid  = IntVec2.Invalid;
            IntVec2 invalid2 = IntVec2.Invalid;
            IntVec2 toIntVec = rp.thingRot.Value.FacingCell.ToIntVec2;
            int     num      = 0;

            while (true)
            {
                if (rp.thingRot.Value.IsHorizontal)
                {
                    int newZ = Rand.Range(rp.rect.minZ + 1, rp.rect.maxZ - 2);
                    invalid  = new IntVec2((!(rp.thingRot.Value == Rot4.East)) ? rp.rect.maxX : rp.rect.minX, newZ);
                    invalid2 = new IntVec2((!(rp.thingRot.Value == Rot4.East)) ? rp.rect.minX : rp.rect.maxX, newZ);
                }
                else
                {
                    int newX = Rand.Range(rp.rect.minX + 1, rp.rect.maxX - 2);
                    invalid  = new IntVec2(newX, (!(rp.thingRot.Value == Rot4.North)) ? rp.rect.maxZ : rp.rect.minZ);
                    invalid2 = new IntVec2(newX, (!(rp.thingRot.Value == Rot4.North)) ? rp.rect.minZ : rp.rect.maxZ);
                }
                bool?allowPlacementOffEdge = rp.allowPlacementOffEdge;
                if (!allowPlacementOffEdge.HasValue || allowPlacementOffEdge.Value)
                {
                    break;
                }
                if ((invalid - toIntVec).ToIntVec3.GetThingList(map).Any((Thing thing) => thing.def == ThingDefOf.Ship_Beam))
                {
                    break;
                }
                if (num == 20)
                {
                    return;
                }
                num++;
            }
            int magnitudeManhattan = (invalid - invalid2).MagnitudeManhattan;

            if ((invalid - invalid2).Magnitude < (float)ship_Beam.Size.z)
            {
                return;
            }
            int num3;
            int num4;

            do
            {
                bool?allowPlacementOffEdge2 = rp.allowPlacementOffEdge;
                int  arg_2DA_0 = (allowPlacementOffEdge2.HasValue && !allowPlacementOffEdge2.Value) ? 0 : Rand.Range(0, 7);
                int  num2      = Rand.Range(0, 7);
                num3 = 0;
                num2 = 0;
                num4 = (magnitudeManhattan - num3 - num2) / ship_Beam.Size.z;
            }while (num4 <= 0);
            IntVec2 a = invalid + toIntVec * (num3 + ship_Beam.Size.z / 2 - 1);
            Thing   t = null;

            for (int i = 0; i < num4; i++)
            {
                Thing thing2 = ThingMaker.MakeThing(ship_Beam, null);
                thing2.SetFaction(rp.faction, null);
                t  = GenSpawn.Spawn(thing2, a.ToIntVec3, map, rp.thingRot.Value, false);
                a += toIntVec * ship_Beam.Size.z;
            }
            bool?allowPlacementOffEdge3 = rp.allowPlacementOffEdge;

            if (!allowPlacementOffEdge3.HasValue || allowPlacementOffEdge3.Value)
            {
                BaseGen.symbolStack.Push("ship_populate", rp);
            }
            CellRect rect;
            Rot4     value;
            CellRect rect2;
            Rot4     value2;

            if (rp.thingRot.Value.IsHorizontal)
            {
                rect       = rp.rect;
                rect.minZ  = t.OccupiedRect().maxZ + 1;
                value      = Rot4.North;
                rect2      = rp.rect;
                rect2.maxZ = t.OccupiedRect().minZ - 1;
                value2     = Rot4.South;
            }
            else
            {
                rect       = rp.rect;
                rect.maxX  = t.OccupiedRect().minX - 1;
                value      = Rot4.West;
                rect2      = rp.rect;
                rect2.minX = t.OccupiedRect().maxX + 1;
                value2     = Rot4.East;
            }
            bool?allowPlacementOffEdge4 = rp.allowPlacementOffEdge;

            if (!allowPlacementOffEdge4.HasValue || allowPlacementOffEdge4.Value || Rand.Value < 0.3f)
            {
                ResolveParams resolveParams = rp;
                resolveParams.rect     = rect;
                resolveParams.thingRot = new Rot4?(value);
                resolveParams.allowPlacementOffEdge = new bool?(false);
                BaseGen.symbolStack.Push("ship_spine", resolveParams);
            }
            bool?allowPlacementOffEdge5 = rp.allowPlacementOffEdge;

            if (!allowPlacementOffEdge5.HasValue || allowPlacementOffEdge5.Value || Rand.Value < 0.3f)
            {
                ResolveParams resolveParams2 = rp;
                resolveParams2.rect     = rect2;
                resolveParams2.thingRot = new Rot4?(value2);
                resolveParams2.allowPlacementOffEdge = new bool?(false);
                BaseGen.symbolStack.Push("ship_spine", resolveParams2);
            }
            ResolveParams resolveParams3 = rp;

            resolveParams3.floorDef = TerrainDefOf.Concrete;
            BaseGen.symbolStack.Push("floor", resolveParams3);
        }
Exemple #26
0
        public void MakeSmallRoom(IntVec3 pos, Map map)
        {
            /////////////
            /// W W W W W
            /// W F F F W
            /// W F S F W
            /// W F F F W
            /// W D W W W
            /////////////

            var innerCircle = new List <IntVec3>
            {
                new IntVec3(pos.x - 1, pos.y, pos.z - 1),
                new IntVec3(pos.x - 1, pos.y, pos.z),
                new IntVec3(pos.x - 1, pos.y, pos.z + 1),
                new IntVec3(pos.x, pos.y, pos.z - 1),
                new IntVec3(pos.x, pos.y, pos.z),
                new IntVec3(pos.x, pos.y, pos.z + 1),
                new IntVec3(pos.x + 1, pos.y, pos.z - 1),
                new IntVec3(pos.x + 1, pos.y, pos.z),
                new IntVec3(pos.x + 1, pos.y, pos.z + 1),
            };

            var outerCircle = new List <IntVec3>
            {
                new IntVec3(pos.x - 2, pos.y, pos.z + 2),
                new IntVec3(pos.x - 2, pos.y, pos.z + 1),
                new IntVec3(pos.x - 2, pos.y, pos.z),
                new IntVec3(pos.x - 2, pos.y, pos.z - 1),
                new IntVec3(pos.x - 2, pos.y, pos.z - 2),


                new IntVec3(pos.x - 1, pos.y, pos.z + 2),
                new IntVec3(pos.x - 1, pos.y, pos.z - 2),
                new IntVec3(pos.x, pos.y, pos.z + 2),
                new IntVec3(pos.x, pos.y, pos.z - 2),
                new IntVec3(pos.x + 1, pos.y, pos.z + 2),
                new IntVec3(pos.x + 1, pos.y, pos.z - 2),



                new IntVec3(pos.x + 2, pos.y, pos.z + 2),
                new IntVec3(pos.x + 2, pos.y, pos.z + 1),
                new IntVec3(pos.x + 2, pos.y, pos.z),
                new IntVec3(pos.x + 2, pos.y, pos.z - 1),
                new IntVec3(pos.x + 2, pos.y, pos.z - 2),
            };

            foreach (IntVec3 innerCell in innerCircle)
            {
                if (innerCell.IsValid)
                {
                    ClearSpot(innerCell, map);
                    map.terrainGrid.SetTerrain(innerCell, TerrainDefOf.WoodPlankFloor);
                }
            }



            var doorLoc = new IntVec3(pos.x, pos.y, pos.z - 2);

            foreach (IntVec3 outerCell in outerCircle)
            {
                if (outerCell.IsValid)
                {
                    ClearSpot(outerCell, map);
                    map.terrainGrid.SetTerrain(outerCell, TerrainDefOf.WoodPlankFloor);
                    Thing thing;
                    if (outerCell != doorLoc)
                    {
                        thing = ThingMaker.MakeThing(ThingDefOf.Wall, ThingDefOf.WoodLog);
                    }
                    else
                    {
                        thing = ThingMaker.MakeThing(ThingDefOf.Door, ThingDefOf.WoodLog);
                    }
                    GenPlace.TryPlaceThing(thing, outerCell, map, ThingPlaceMode.Direct);
                }
            }

            var stairsDown = ThingMaker.MakeThing(ThingDef.Named("RE_StairsDown"), ThingDefOf.WoodLog);

            GenPlace.TryPlaceThing(stairsDown, pos, map, ThingPlaceMode.Direct);
        }
        protected override void Impact(Thing hitThing)
        {
            if (!this.initialized)
            {
                base.Impact(hitThing);
                this.initialized = true;
                this.BF          = new List <BloodFire>();
                this.BF.Clear();
                ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef();
                Pawn pawn = this.launcher as Pawn;
                CompAbilityUserMagic comp = pawn.GetComp <CompAbilityUserMagic>();
                MagicPowerSkill      bpwr = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_BloodGift.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_BloodGift_pwr");
                MagicPowerSkill      pwr  = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_IgniteBlood.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_IgniteBlood_pwr");
                MagicPowerSkill      ver  = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_IgniteBlood.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_IgniteBlood_ver");
                pwrVal = pwr.level;
                verVal = ver.level;
                if (pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless))
                {
                    MightPowerSkill mpwr = pawn.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Mimic.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Mimic_pwr");
                    MightPowerSkill mver = pawn.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Mimic.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Mimic_ver");
                    pwrVal = mpwr.level;
                    verVal = mver.level;
                }
                this.arcaneDmg   = comp.arcaneDmg;
                this.arcaneDmg  *= (1 + (.1f * bpwr.level));
                this.spreadRate -= 2 * verVal;
                if (settingsRef.AIHardMode && !pawn.IsColonist)
                {
                    pwrVal = 3;
                    verVal = 3;
                }
                this.bloodTypes = new List <ThingDef>();
                this.bloodTypes.Clear();
                if (settingsRef.unrestrictedBloodTypes)
                {
                    this.pawnBloodDef = pawn.RaceProps.BloodDef;
                    this.bloodTypes   = TM_Calc.GetAllRaceBloodTypes();
                }
                else
                {
                    this.pawnBloodDef = ThingDefOf.Filth_Blood;
                    this.bloodTypes.Add(this.pawnBloodDef);
                }

                List <IntVec3> cellList = GenRadial.RadialCellsAround(base.Position, this.def.projectile.explosionRadius, true).ToList();

                Filth filth = (Filth)ThingMaker.MakeThing(this.pawnBloodDef);
                GenSpawn.Spawn(filth, base.Position, pawn.Map);
                //FilthMaker.MakeFilth(base.Position, this.Map, ThingDefOf.Filth_Blood, 1);
                for (int i = 0; i < 30; i++)
                {
                    IntVec3 randomCell = cellList.RandomElement();
                    if (randomCell.IsValid && randomCell.InBounds(pawn.Map) && !randomCell.Fogged(pawn.Map) && randomCell.Walkable(pawn.Map))
                    {
                        //FilthMaker.MakeFilth(randomCell, this.Map, ThingDefOf.Filth_Blood, 1);
                        //Log.Message("creating blood at " + randomCell);
                        Filth filth2 = (Filth)ThingMaker.MakeThing(this.pawnBloodDef);
                        GenSpawn.Spawn(filth2, randomCell, pawn.Map);
                    }
                }
                this.BF.Add(new BloodFire(base.Position, 0));
            }

            if (this.age > 0 && Find.TickManager.TicksGame % this.spreadRate == 0)
            {
                BurnBloodAtCell();
                FindNearbyBloodCells();
            }

            if (this.BF.Count <= 0)
            {
                this.age = this.duration;
            }
        }
 public void MakeGun()
 {
     this.gun = ThingMaker.MakeThing(this.def.building.turretGunDef, null);
     UpdateGunVerbs();
     //Log.Message($"Created gun: {gun}");
 }
Exemple #29
0
        /*static PawnShieldGenerator()
         * {
         *  //Initialise all shields.
         *  Reset();
         * }*/

        /// <summary>
        /// Tries to generate a shield for the pawn.
        /// </summary>
        /// <param name="pawn"></param>
        /// <param name="request"></param>
        public static void TryGenerateShieldFor(Pawn pawn, PawnGenerationRequest request)
        {
            //Shield stuff.
            ShieldPawnGeneratorProperties generatorProps =
                request.KindDef?.GetModExtension <ShieldPawnGeneratorProperties>();

            //Abort early if there is no mention at all of shield properties.
            if (generatorProps == null)
            {
                return;
            }

            workingShields = new List <ThingStuffPair>();

            //Initial filtering
            if (generatorProps.shieldTags == null || generatorProps.shieldTags?.Count == 0)
            {
                Log.Warning("PawnShields :: XML element shieldTags is null or empty for " + request.KindDef.defName);
                return;
            }

            if (!(pawn?.RaceProps?.ToolUser ?? false))
            {
                Log.Warning("PawnShields :: " + request.KindDef.defName +
                            " is not a ToolUser or Humanlike in RaceProps.");
                return;
            }
            if (!(pawn.health?.capacities?.CapableOf(PawnCapacityDefOf.Manipulation) ?? false))
            {
                Log.Warning("PawnShields :: " + request.KindDef.defName + " is not capable of manipulation.");
                return;
            }
            if (pawn.story != null && ((bool)pawn?.WorkTagIsDisabled(WorkTags.Violent)))
            {
                return;
            }

            var   generatorPropsShieldMoney = generatorProps.shieldMoney;
            float randomInRange             = generatorPropsShieldMoney.RandomInRange;

            if (allShieldPairs != null && allShieldPairs?.Count > 0)
            {
                foreach (var w in allShieldPairs)
                {
                    if (w.Price <= randomInRange)
                    {
                        if (!w.thing.weaponTags.NullOrEmpty())
                        {
                            if (generatorProps.shieldTags.Any(tag =>
                                                              (w.thing.weaponTags.Contains(tag))))
                            {
                                if (w.thing.generateAllowChance >= 1f ||
                                    Rand.ValueSeeded(pawn.thingIDNumber ^ 28554824) <= w.thing.generateAllowChance)
                                {
                                    workingShields.Add(w);
                                }
                            }
                        }
                    }
                }
            }
            if (workingShields == null || workingShields?.Count == 0)
            {
                Log.Warning("No working shields found for " + pawn.Label + "::" + pawn.KindLabel);
                return;
            }

            if (workingShields.TryRandomElementByWeight(w => w.Commonality * w.Price, out var thingStuffPair))
            {
                ThingWithComps thingWithComps =
                    (ThingWithComps)ThingMaker.MakeThing(thingStuffPair.thing, thingStuffPair.stuff);
                PawnGenerator.PostProcessGeneratedGear(thingWithComps, pawn);
                pawn.equipment?.AddEquipment(thingWithComps);
                //Log.Message(pawn.Label + " added shield " + thingWithComps.Label);
            }
        }
Exemple #30
0
        public override void TickRare()
        {
            base.TickRare();

            if (!compPowerTrader.PowerOn)
            {
                return;
            }

            // 電源ON、故障無し、稼働時間範囲内の時
            if (InputWaterNet == null)
            {
                return;
            }

            // 設備の置かれた部屋
            var room = Position.GetRoom(Map);

            // 部屋内もしくは隣接した火災
            var fireList = room.ContainedAndAdjacentThings.Where(t => t is Fire);

            // 水やり範囲
            var cells = GenRadial.RadialCellsAround(Position, def.specialDisplayRadius, true);

            // 消火範囲内の部屋内火災or隣接火災
            var targetFireList = fireList.Where(t => cells.Contains(t.Position));

            // 範囲内に火災があれば全域に水を撒く
            var enumerable = targetFireList as Thing[] ?? targetFireList.ToArray();

            if (enumerable.Length < 1)
            {
                return;
            }
            {
                // 部屋内の水やり範囲
                var roomCells = cells.Where(c => c.GetRoom(Map) == room);

                var targetFireCells = enumerable.Select(t => t.Position);

                var wateringCells = roomCells.Union(targetFireCells);

                // 水が足りているかチェック
                var useWaterVolume = UseWaterVolumePerOne * wateringCells.Count();

                if (!(InputWaterNet.StoredWaterVolumeForFaucet >= useWaterVolume))
                {
                    return;
                }
                {
                    var wateringComp = Map.GetComponent <MapComponent_Watering>();

                    InputWaterNet.DrawWaterVolumeForFaucet(useWaterVolume);

                    foreach (var fire in enumerable)
                    {
                        // 消火効果(仮)
                        fire.TakeDamage(new DamageInfo(DamageDefOf.Extinguish, ExtinguishPower));
                    }

                    foreach (var c in wateringCells)
                    {
                        // 水やりエフェクト(仮)
                        var mote = (MoteThrown)ThingMaker.MakeThing(MizuDef.Mote_SprinklerWater);

                        // mote.Scale = 1f;
                        // mote.rotationRate = (float)(Rand.Chance(0.5f) ? -30 : 30);
                        mote.exactPosition = c.ToVector3Shifted();
                        GenSpawn.Spawn(mote, c, Map);

                        // 水やり効果
                        if (!(Map.terrainGrid.TerrainAt(Map.cellIndices.CellToIndex(c)).fertility >= 0.01f))
                        {
                            continue;
                        }

                        wateringComp.Add(Map.cellIndices.CellToIndex(c), 1);
                        Map.mapDrawer.SectionAt(c).dirtyFlags = MapMeshFlag.Terrain;
                    }
                }
            }
        }