private void ScatterBlueprintAt(IntVec3 loc, Map map, MapGeneratorBlueprintDef blueprint, ref ThingDef wallStuff, HashSet <IntVec3> listOfUsedCells) { CellRect mapRect = new CellRect(loc.x, loc.z, blueprint.size.x, blueprint.size.z); mapRect.ClipInsideMap(map); // if mapRect was clipped -> the blueprint doesn't fit inside the map... if (mapRect.Width != blueprint.size.x || mapRect.Height != blueprint.size.z) { return; } // Check if we will build on a usedCell bool usedCellFound = false; foreach (IntVec3 cell in mapRect.Cells) { if (listOfUsedCells != null && listOfUsedCells.Contains(cell)) { usedCellFound = true; break; } } if (usedCellFound) { return; } // Don't do anything, if there is an cryosleep casket at the building site foreach (IntVec3 current in mapRect.Cells) { List <Thing> list = map.thingGrid.ThingsListAt(current); for (int i = 0; i < list.Count; i++) { if (list[i].def == ThingDefOf.AncientCryptosleepCasket) { return; } } // Don't do anything if there is a pawn (mechanoid? insect?) here foreach (Pawn pawn in map.mapPawns.AllPawnsSpawned) { if (pawn != null && pawn.Spawned && pawn.Position == current) { return; } } usedSpots.Add(current); // prevent the base scatterer to use this spot usedCells.Add(current); usedCells_lastChange = DateTime.UtcNow; } // Remove this blueprints map cells from the unfogging list List <IntVec3> rootsToUnfog = Verse.MapGenerator.rootsToUnfog; foreach (IntVec3 cell in mapRect.Cells) { if (rootsToUnfog != null && rootsToUnfog.Contains(cell)) { rootsToUnfog.Remove(cell); } } // If a building material is defined, use this if (blueprint.buildingMaterial != null) { wallStuff = blueprint.buildingMaterial; } int w = 0; while (true) { w++; if (w > 100) { break; } // Make all buildings from the same random stuff -- In BaseGen use faction, in MapGen use null! if (wallStuff == null) { wallStuff = BaseGenUtility.RandomCheapWallStuff(null, true); // BaseGenUtility.RandomCheapWallStuff(faction, true); } //If not specified, don't use wood or leather if (blueprint.buildingMaterial != null || (!wallStuff.defName.ToLower().Contains("wood") && !wallStuff.defName.ToLower().Contains("leather"))) { break; } } MakeBlueprintRoom(mapRect, map, blueprint, wallStuff); if (blueprint.createTrigger) { int nextSignalTagID = Find.UniqueIDsManager.GetNextSignalTagID(); string signalTag = "unfogTriggerSignal-" + nextSignalTagID; SignalAction_Letter signalAction_Letter = (SignalAction_Letter)ThingMaker.MakeThing(ThingDefOf.SignalAction_Letter, null); signalAction_Letter.signalTag = signalTag; if (blueprint.TriggerLetterMessageText != null) { if (blueprint.TriggerLetterLabel != null) { signalAction_Letter.letter = LetterMaker.MakeLetter(blueprint.TriggerLetterLabel.Translate(), blueprint.TriggerLetterMessageText.Translate(), blueprint.TriggerLetterDef, new GlobalTargetInfo(mapRect.CenterCell, map, false)); } else { signalAction_Letter.letter = LetterMaker.MakeLetter("", blueprint.TriggerLetterMessageText.Translate(), blueprint.TriggerLetterDef, new GlobalTargetInfo(mapRect.CenterCell, map)); } GenSpawn.Spawn(signalAction_Letter, mapRect.CenterCell, map); } RectTrigger_UnfogArea rectTrigger = (RectTrigger_UnfogArea)ThingMaker.MakeThing(ThingDef.Named("RectTrigger_UnfogArea"), null); rectTrigger.signalTag = signalTag; rectTrigger.destroyIfUnfogged = true; rectTrigger.Rect = mapRect; GenSpawn.Spawn(rectTrigger, mapRect.CenterCell, map); } }
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; } } } } }
//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); }
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 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)); } }
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); }
private static void SpawnAnimalCorpsesMaker(IntVec3 position) { Thing animalCorpsesGenerator = ThingMaker.MakeThing(Util_CaveBiome.AnimalCorpsesGeneratorDef); GenSpawn.Spawn(animalCorpsesGenerator, position); }
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); }
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; }
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; }
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); }
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 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; } } } }
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); }
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); }
public void MakeGun() { this.gun = ThingMaker.MakeThing(this.def.building.turretGunDef, null); UpdateGunVerbs(); //Log.Message($"Created gun: {gun}"); }
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); }
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); }
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; } } } } } } }
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); }
// 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); }
/// <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); }
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; } } } } }
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); }
// 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); } } } })); }
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); }
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; } } }
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; } }
// Fill the cell private void TrySetCellAs(IntVec3 c, Map map, ThingDef thingDef, Rot4 thingRot, ThingDef stuffDef = null, TerrainDef terrainDef = null, PawnKindDef pawnKindDef = null, ThingDef itemDef = null, MapGeneratorBlueprintDef blueprint = null) { //Note: Here is no functionality to clear the cell by design, because it is possible to place items that are larger than 1x1 // Check the cell information if (c == null || !c.InBounds(map)) { Log.Warning("GenStep_CreateBlueprint: Invalid Target-Cell: cell is null or out of bounds."); return; } // only continue to do work if here isn't anything indestructable List <Thing> thingList = c.GetThingList(map); for (int i = 0; i < thingList.Count; i++) { if (!thingList[i].def.destroyable) { return; } } // 1st step - work with the Terrain if (terrainDef != null) { map.terrainGrid.SetTerrain(c, terrainDef); } else if (terrainDef == null && thingDef != null && stuffDef != null) { map.terrainGrid.SetTerrain(c, this.CorrespondingTileDef(stuffDef)); } // 2nd step - work with the Thing (Buildings) if (thingDef != null) { ThingDef stuffDef1 = stuffDef; if (!thingDef.MadeFromStuff) { stuffDef1 = null; } Thing newThing = ThingMaker.MakeThing(thingDef, stuffDef1); if (thingRot == null || thingRot == Rot4.Invalid) { GenSpawn.Spawn(newThing, c, map); } else { GenSpawn.Spawn(newThing, c, map, thingRot); } CompGatherSpot compGathering = newThing.TryGetComp <CompGatherSpot>(); if (compGathering != null) { compGathering.Active = false; } } // The following needs blueprint data to work if (blueprint == null) { return; } // 3rd step - work with the Item //if (itemDef != null) // && blueprint.itemSpawnChance / 100 > Rand.Value) if (itemDef != null && blueprint.itemSpawnChance / 100 > Rand.Value) { ThingDef stuffDef2; if (itemDef.IsApparel) { if (!DefDatabase <ThingDef> .AllDefs.Where <ThingDef>(t => t.IsStuff && t.stuffProps != null && t.stuffProps.categories != null && t.stuffProps.categories.Contains(StuffCategoryDefOf.Fabric)) .TryRandomElement(out stuffDef2)) { stuffDef2 = DefDatabase <ThingDef> .GetNamedSilentFail("Synthread"); } } else { List <string> stuffPossibles = new List <string>() { "Steel", "Steel", "Steel", "Steel", "Silver", "Gold", "Jade", "Plasteel" }; stuffDef2 = DefDatabase <ThingDef> .GetNamedSilentFail(stuffPossibles.RandomElement()); } if (!itemDef.MadeFromStuff) { stuffDef2 = null; } Thing newItem = TryGetTreasure(itemDef, stuffDef2); newItem = GenSpawn.Spawn(newItem, c, map); // Don't forget to set the items to forbidden! if (newItem.TryGetComp <CompForbiddable>() != null) { newItem.SetForbidden(true, false); } // If it is a hive, it needs to be deactivated Hive newHive = newItem as Hive; if (newHive != null) { newHive.active = false; } } // 4th step - work with the Pawn if (pawnKindDef != null && blueprint.pawnSpawnChance / 100 > Rand.Value) { if (this.faction == null) { this.faction = Find.FactionManager.FirstFactionOfDef(blueprint.factionDef); } float pointsForRaid = map.IncidentPointsRandomFactorRange.RandomInRange; // still null - find a valid faction. if (this.faction == null) { switch (blueprint.factionSelection) { case FactionSelection.friendly: faction = (from fac in Find.FactionManager.AllFactions where !fac.HostileTo(Faction.OfPlayer) && fac.PlayerGoodwill > 0 && !(fac == Faction.OfPlayer) select fac) .RandomElementByWeight((Faction fac) => 101 - fac.def.RaidCommonalityFromPoints(pointsForRaid)); if (faction == null) { faction = Find.FactionManager.AllFactions.RandomElementByWeight((Faction fac) => fac.def.RaidCommonalityFromPoints(pointsForRaid)); } break; case FactionSelection.hostile: faction = (from fac in Find.FactionManager.AllFactions where fac.HostileTo(Faction.OfPlayer) select fac) .RandomElementByWeight((Faction fac) => 101 - fac.def.RaidCommonalityFromPoints(pointsForRaid)); if (faction == null) { faction = Faction.OfMechanoids; } break; case FactionSelection.none: faction = Find.FactionManager.AllFactions .RandomElementByWeight((Faction fac) => fac.def.RaidCommonalityFromPoints(pointsForRaid)); if (faction == null) { faction = Faction.OfMechanoids; } break; } } Pawn pawn = PawnGenerator.GeneratePawn(pawnKindDef, faction); pawn.mindState.Active = false; pawn = GenSpawn.Spawn(pawn, c, map) as Pawn; if (pawn != null) { if (allSpawnedPawns == null) { allSpawnedPawns = new List <Pawn>(); } allSpawnedPawns.Add(pawn); } } }