private bool TryConvertOnePawnToSmallTrader(List <Pawn> pawns, Faction faction) { Pawn pawn = pawns.RandomElement <Pawn>(); Lord lord = pawn.GetLord(); pawn.mindState.wantsToTradeWithColony = true; PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true); TraderKindDef traderKindDef = IncidentWorker_SoraGoodseller.SoraTraderKindDef; pawn.trader.traderKind = traderKindDef; pawn.inventory.DestroyAll(DestroyMode.Vanish); foreach (Thing current in this.GenerateTraderThings(traderKindDef)) { Pawn pawn2 = current as Pawn; if (pawn2 != null) { if (pawn2.Faction != pawn.Faction) { pawn2.SetFaction(pawn.Faction, null); } IntVec3 loc = CellFinder.RandomClosewalkCellNear(pawn.Position, 5); GenSpawn.Spawn(pawn2, loc); lord.AddPawn(pawn2); } else if (!pawn.inventory.container.TryAdd(current)) { current.Destroy(DestroyMode.Vanish); } } if (!pawn.inventory.container.Any((Thing x) => x.def.IsNutritionGivingIngestible && x.def.ingestible.preferability >= FoodPreferability.MealAwful)) { PawnInventoryGenerator.GiveRandomFood(pawn); } return(true); }
private bool TryConvertOnePawnToSmallTrader(Pawn pawn, Faction faction, Map map) { Lord lord = pawn.GetLord(); pawn.mindState.wantsToTradeWithColony = true; PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true); TraderKindDef traderKindDef = DefOfs.C_TraderKindDefs.Visitor_IoM_Wanderer; pawn.trader.traderKind = traderKindDef; pawn.inventory.DestroyAll(DestroyMode.Vanish); foreach (Thing current in TraderStockGenerator.GenerateTraderThings(traderKindDef, map)) { Pawn pawn2 = current as Pawn; if (pawn2 != null) { if (pawn2.Faction != pawn.Faction) { pawn2.SetFaction(pawn.Faction, null); } IntVec3 loc = CellFinder.RandomClosewalkCellNear(pawn.Position, map, 5); GenSpawn.Spawn(pawn2, loc, map); lord.AddPawn(pawn2); } else if (!pawn.inventory.innerContainer.TryAdd(current, true)) { current.Destroy(DestroyMode.Vanish); } } PawnInventoryGenerator.GiveRandomFood(pawn); return(true); }
private bool TryConvertOnePawnToSmallTrader(List <Pawn> pawns, Faction faction) { if (faction.def.visitorTraderKinds.NullOrEmpty <TraderKindDef>()) { return(false); } Pawn pawn = pawns.RandomElement <Pawn>(); Lord lord = pawn.GetLord(); pawn.mindState.wantsToTradeWithColony = true; PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true); TraderKindDef traderKindDef = faction.def.visitorTraderKinds.RandomElement <TraderKindDef>(); pawn.trader.traderKind = traderKindDef; pawn.inventory.DestroyAll(); foreach (Thing current in TraderStockGenerator.GenerateTraderThings(traderKindDef)) { Pawn pawn2 = current as Pawn; if (pawn2 != null) { if (pawn2.Faction != pawn.Faction) { pawn2.SetFaction(pawn.Faction); } IntVec3 loc = CellFinder.RandomClosewalkCellNear(pawn.Position, 5); GenSpawn.Spawn(pawn2, loc); lord.AddPawn(pawn2); } else if (!pawn.inventory.container.TryAdd(current)) { current.Destroy(); } } if (!pawn.inventory.container.Any((Thing x) => x.def.IsNutritionGivingIngestible && x.def.ingestible.preferability >= FoodPreferability.MealAwful)) { PawnInventoryGenerator.GiveRandomFood(pawn); } CellFinder.RandomClosewalkCellNear(pawn.Position, 5); Thing thing = ThingMaker.MakeThing(ThingDef.Named("VehicleCart")); GenSpawn.Spawn(thing, pawn.Position); Job job = new Job(HaulJobDefOf.Mount); thing.SetFaction(faction); thing.SetForbidden(true); Find.Reservations.ReleaseAllForTarget(thing); job.targetA = thing; pawn.jobs.StartJob(job, JobCondition.InterruptForced); return(true); }
public override void GenerateRect(Stencil s) { s.FillTerrain(GenCity.RandomFloor(s.map)); var pawn = (Pawn)null; if (!s.map.ParentFaction.HostileTo(Faction.OfPlayer)) { pawn = GenCity.SpawnInhabitant(s.Coords(s.RandX / 2, s.RandZ / 2), s.map); var traderKind = DefDatabase <TraderKindDef> .AllDefs.RandomElement(); pawn.mindState.wantsToTradeWithColony = true; PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true); pawn.trader.traderKind = traderKind; pawn.inventory.DestroyAll(); var parms = new ThingSetMakerParams { traderDef = traderKind, tile = s.map.Tile, makingFaction = s.map.ParentFaction, }; foreach (var item in ThingSetMakerDefOf.TraderStock.root.Generate(parms)) { if (!(item is Pawn) && !pawn.inventory.innerContainer.TryAdd(item)) { item.Destroy(); } } PawnInventoryGenerator.GiveRandomFood(pawn); } for (var dir = 0; dir < 4; dir++) { if (s.Chance(standChance)) { var sStand = s.Rotate(dir).Move(Mathf.RoundToInt(s.RandX / 2F), s.MaxZ - s.RandInclusive(0, 2)).Bound(-1, 0, 1, 0); sStand.FillTerrain(GenCity.RandomFloor(s.map, true)); var wallStuff = GenCity.RandomWallStuff(s.map); sStand.Spawn(sStand.MinX - 1, 0, ThingDefOf.Wall, wallStuff); sStand.Spawn(sStand.MaxX + 1, 0, ThingDefOf.Wall, wallStuff); sStand.Expand(1).FillRoof(RoofDefOf.RoofConstructed); // if (pawn != null) { // var itemPos = sStand.Coords(sStand.RandX, sStand.RandZ); // var item = pawn.inventory.innerContainer.FirstOrDefault(); // if (item != null) { // pawn.inventory.innerContainer.TryDrop(item, itemPos, s.map, ThingPlaceMode.Direct, out var result); // item.SetOwnedByCity(true, s.map); // } // } } } }
private bool TryConvertOnePawnToSmallTrader(List <Pawn> pawns, Faction faction, Map map) { if (faction.def.visitorTraderKinds.NullOrEmpty <TraderKindDef>()) { return(false); } Pawn pawn = pawns.RandomElement <Pawn>(); Lord lord = pawn.GetLord(); pawn.mindState.wantsToTradeWithColony = true; PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true); TraderKindDef traderKindDef = faction.def.visitorTraderKinds.RandomElementByWeight((TraderKindDef traderDef) => traderDef.CalculatedCommonality); pawn.trader.traderKind = traderKindDef; pawn.inventory.DestroyAll(DestroyMode.Vanish); ThingSetMakerParams parms = default(ThingSetMakerParams); parms.traderDef = traderKindDef; parms.tile = new int?(map.Tile); parms.makingFaction = faction; foreach (Thing thing in ThingSetMakerDefOf.TraderStock.root.Generate(parms)) { Pawn pawn2 = thing as Pawn; if (pawn2 != null) { if (pawn2.Faction != pawn.Faction) { pawn2.SetFaction(pawn.Faction, null); } IntVec3 loc = CellFinder.RandomClosewalkCellNear(pawn.Position, map, 5, null); GenSpawn.Spawn(pawn2, loc, map, WipeMode.Vanish); lord.AddPawn(pawn2); } else if (!pawn.inventory.innerContainer.TryAdd(thing, true)) { thing.Destroy(DestroyMode.Vanish); } } PawnInventoryGenerator.GiveRandomFood(pawn); return(true); }
private static void GiveItems(IEnumerable <Pawn> visitors) { foreach (var visitor in visitors) { PawnInventoryGenerator.GiveRandomFood(visitor); if (Rand.Value < 0.5f) { visitor.TryGiveBackpack(); } float totalValue = 0; // Money //Log.Message("Goodwill: "+visitor.Faction.ColonyGoodwill); var amountS = Mathf.RoundToInt(Rand.Gaussian(visitor.Faction.PlayerGoodwill, visitor.Faction.PlayerGoodwill) * 2) + Rand.Range(0, 50); if (amountS > Rand.Range(10, 50)) { var money = CreateRandomItem(visitor, ThingDefOf.Silver); money.stackCount = amountS; var spaceFor = visitor.GetInventorySpaceFor(money); if (spaceFor > 0) { money.stackCount = Mathf.Min(spaceFor, amountS); var success = visitor.inventory.GetInnerContainer().TryAdd(money); if (success) { totalValue += money.MarketValue * money.stackCount; } else if (!money.Destroyed) { money.Destroy(); } } } // Items float maxValue = (visitor.Faction.PlayerGoodwill + 10) * Rand.Range(3, 5); float value = maxValue - totalValue; int curCount = 0; while (value > 100 && curCount < 200) { //Log.Message("Total is now " + totalValue + ", space left is " + space); curCount++; bool apparel = Rand.Value < 0.5f; ThingDef thingDef; do { thingDef = GetRandomItem(visitor.Faction.def.techLevel); }while (thingDef != null && apparel && thingDef.IsApparel); if (thingDef == null) { break; } //var amount = Mathf.Min(Mathf.RoundToInt(Mathf.Abs(Rand.Gaussian(1, thingDef.stackLimit/2f))), // thingDef.stackLimit); //if (amount <= 0) continue; var item = CreateRandomItem(visitor, thingDef); //Log.Message(item.Label + " has this value: " + item.MarketValue); if (item.Destroyed) { continue; } if (item.MarketValue >= value) { item.Destroy(); continue; } if (item.MarketValue < 1) { item.Destroy(); continue; } var uniquesAmount = item.TryGetComp <CompQuality>() != null ? 1 : item.def.stackLimit; var maxItems = Mathf.Min(Mathf.FloorToInt(value / item.MarketValue), item.def.stackLimit, uniquesAmount); var minItems = Mathf.Max(1, Mathf.CeilToInt(Rand.Range(50, 100) / item.MarketValue)); if (maxItems < 1 || minItems > maxItems) { item.Destroy(); continue; } //Log.Message("Can fit " + maxItems+" of "+item.Label); item.stackCount = Rand.RangeInclusive(minItems, maxItems); //Log.Message("Added " + item.stackCount + " with a value of " + (item.MarketValue * item.stackCount)); var spaceFor = visitor.GetInventorySpaceFor(item); if (spaceFor > 0) { item.stackCount = Mathf.Min(spaceFor, item.stackCount); var success = visitor.inventory.GetInnerContainer().TryAdd(item); if (success) { totalValue += item.MarketValue * item.stackCount; } else if (!item.Destroyed) { item.Destroy(); } } value = maxValue - totalValue; } } }