public SaveRecordPawnV3(CustomPawn pawn) { this.gender = pawn.Gender; this.adulthood = pawn.Adulthood.uniqueSaveKey; this.childhood = pawn.Childhood.uniqueSaveKey; this.skinColor = pawn.SkinColor; this.hairDef = pawn.HairDef.defName; this.hairColor = pawn.GetColor(PawnLayers.Hair); this.headGraphicPath = pawn.HeadGraphicPath; this.firstName = pawn.FirstName; this.nickName = pawn.NickName; this.lastName = pawn.LastName; this.age = 0; this.biologicalAge = pawn.BiologicalAge; this.chronologicalAge = pawn.ChronologicalAge; foreach (var trait in pawn.Traits) { if (trait != null) { this.traitNames.Add(trait.def.defName); this.traitDegrees.Add(trait.Degree); } } foreach (var skill in pawn.Pawn.skills.skills) { this.skillNames.Add(skill.def.defName); this.skillValues.Add(pawn.GetUnmodifiedSkillLevel(skill.def)); this.passions.Add(pawn.currentPassions[skill.def]); this.originalPassions.Add(pawn.originalPassions[skill.def]); } for (int layer = 0; layer < PawnLayers.Count; layer++) { ThingDef thingDef = pawn.GetAcceptedApparel(layer); ThingDef stuffDef = pawn.GetSelectedStuff(layer); Color color = pawn.GetColor(layer); if (thingDef != null) { this.apparelLayers.Add(layer); this.apparel.Add(thingDef.defName); this.apparelStuff.Add(stuffDef != null ? stuffDef.defName : ""); this.apparelColors.Add(color); } } this.randomInjuries = pawn.RandomInjuries; foreach (Implant implant in pawn.Implants) { this.implants.Add(new SaveRecordImplantV3(implant)); } foreach (Injury injury in pawn.Injuries) { this.injuries.Add(new SaveRecordInjuryV3(injury)); } }
public SaveRecordPawnV4(CustomPawn pawn) { this.id = pawn.Id; this.thingDef = pawn.Pawn.def.defName; this.type = pawn.Type.ToString(); if (pawn.Type == CustomPawnType.World && pawn.Faction != null) { this.faction = new SaveRecordFactionV4(); this.faction.def = pawn.Faction.Def != null ? pawn.Faction.Def.defName : null; this.faction.index = pawn.Faction.Index; this.faction.leader = pawn.Faction.Leader; } this.pawnKindDef = pawn.OriginalKindDef != null ? pawn.OriginalKindDef.defName : pawn.Pawn.kindDef.defName; this.originalFactionDef = pawn.OriginalFactionDef != null ? pawn.OriginalFactionDef.defName : null; this.gender = pawn.Gender; if (pawn.Adulthood != null) { this.adulthood = pawn.Adulthood.identifier; } else { this.adulthood = pawn.LastSelectedAdulthoodBackstory?.identifier; } this.childhood = pawn.Childhood.identifier; this.skinColor = pawn.Pawn.story.SkinColor; this.melanin = pawn.Pawn.story.melanin; this.hairDef = pawn.HairDef.defName; this.hairColor = pawn.Pawn.story.hairColor; this.headGraphicPath = pawn.HeadGraphicPath; this.bodyType = pawn.BodyType.defName; this.firstName = pawn.FirstName; this.nickName = pawn.NickName; this.lastName = pawn.LastName; this.age = 0; this.biologicalAge = pawn.BiologicalAge; this.chronologicalAge = pawn.ChronologicalAge; foreach (var trait in pawn.Traits) { if (trait != null) { this.traitNames.Add(trait.def.defName); this.traitDegrees.Add(trait.Degree); } } foreach (var skill in pawn.Pawn.skills.skills) { SaveRecordSkillV4 skillRecord = new SaveRecordSkillV4(); skillRecord.name = skill.def.defName; skillRecord.value = pawn.GetUnmodifiedSkillLevel(skill.def); skillRecord.passion = pawn.currentPassions[skill.def]; this.skills.Add(skillRecord); } foreach (var layer in PrepareCarefully.Instance.Providers.PawnLayers.GetLayersForPawn(pawn)) { if (layer.Apparel) { ThingDef apparelThingDef = pawn.GetAcceptedApparel(layer); Color color = pawn.GetColor(layer); if (apparelThingDef != null) { ThingDef apparelStuffDef = pawn.GetSelectedStuff(layer); SaveRecordApparelV4 apparelRecord = new SaveRecordApparelV4(); apparelRecord.layer = layer.Name; apparelRecord.apparel = apparelThingDef.defName; apparelRecord.stuff = apparelStuffDef != null ? apparelStuffDef.defName : ""; apparelRecord.color = color; this.apparel.Add(apparelRecord); } } } OptionsHealth healthOptions = PrepareCarefully.Instance.Providers.Health.GetOptions(pawn); foreach (Implant implant in pawn.Implants) { var saveRecord = new SaveRecordImplantV3(implant); if (implant.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(implant.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.implants.Add(saveRecord); } foreach (Injury injury in pawn.Injuries) { var saveRecord = new SaveRecordInjuryV3(injury); if (injury.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(injury.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.injuries.Add(saveRecord); } ThingComp alienComp = ProviderAlienRaces.FindAlienCompForPawn(pawn.Pawn); if (alienComp != null) { alien = new SaveRecordAlienV4(); alien.crownType = ProviderAlienRaces.GetCrownTypeFromComp(alienComp); alien.skinColor = ProviderAlienRaces.GetSkinColorFromComp(alienComp); alien.skinColorSecond = ProviderAlienRaces.GetSkinColorSecondFromComp(alienComp); alien.hairColorSecond = ProviderAlienRaces.GetHairColorSecondFromComp(alienComp); } }
public void CalculatePawnCost(ColonistCostDetails cost, CustomPawn pawn) { cost.Clear(); cost.name = pawn.NickName; // Start with the market value plus a bit of a mark-up. cost.marketValue = pawn.Pawn.MarketValue; cost.marketValue += 300; // Calculate passion cost. Each passion above 8 makes all passions // cost more. Minor passion counts as one passion. Major passion // counts as 3. double skillCount = pawn.currentPassions.Keys.Count(); double passionLevelCount = 0; double passionLevelCost = 20; double passionateSkillCount = 0; foreach (SkillDef def in pawn.currentPassions.Keys) { Passion passion = pawn.currentPassions[def]; int level = pawn.GetSkillLevel(def); if (passion == Passion.Major) { passionLevelCount += 3.0; passionateSkillCount += 1.0; } else if (passion == Passion.Minor) { passionLevelCount += 1.0; passionateSkillCount += 1.0; } } double levelCost = passionLevelCost; if (passionLevelCount > 8) { double penalty = passionLevelCount - 8; levelCost += penalty * 0.4; } cost.marketValue += levelCost * passionLevelCount; // Calculate trait cost. if (pawn.TraitCount > Constraints.MaxVanillaTraits) { int extraTraitCount = pawn.TraitCount - Constraints.MaxVanillaTraits; double extraTraitCost = 100; for (int i = 0; i < extraTraitCount; i++) { cost.marketValue += extraTraitCost; extraTraitCost = Math.Ceiling(extraTraitCost * 2.5); } } // Calculate cost of worn apparel. for (int layer = 0; layer < PawnLayers.Count; layer++) { if (PawnLayers.IsApparelLayer(layer)) { var def = pawn.GetAcceptedApparel(layer); if (def == null) { continue; } EquipmentKey key = new EquipmentKey(); key.ThingDef = def; key.StuffDef = pawn.GetSelectedStuff(layer); EquipmentRecord record = PrepareCarefully.Instance.EquipmentDatabase.Find(key); if (record == null) { continue; } EquipmentSelection selection = new EquipmentSelection(record, 1); double c = CalculateEquipmentCost(selection); if (def != null) { // TODO: Discounted materials should be based on the faction, not hard-coded. // TODO: Should we continue with the discounting? if (key.StuffDef != null) { if (key.StuffDef.defName == "Synthread") { if (freeApparel.Contains(key.ThingDef.defName)) { c = 0; } else if (cheapApparel.Contains(key.ThingDef.defName)) { c = c * 0.15d; } } } } cost.apparel += c; } } // Calculate cost for any materials needed for implants. OptionsHealth healthOptions = PrepareCarefully.Instance.Providers.Health.GetOptions(pawn); foreach (Implant option in pawn.Implants) { // Check if there are any ancestor parts that override the selection. UniqueBodyPart uniquePart = healthOptions.FindBodyPartsForRecord(option.BodyPartRecord); if (uniquePart == null) { Log.Warning("Prepare Carefully could not find body part record when computing the cost of an implant: " + option.BodyPartRecord.def.defName); continue; } if (pawn.AtLeastOneImplantedPart(uniquePart.Ancestors.Select((UniqueBodyPart p) => { return(p.Record); }))) { continue; } // Figure out the cost of the part replacement based on its recipe's ingredients. if (option.recipe != null) { RecipeDef def = option.recipe; foreach (IngredientCount amount in def.ingredients) { int count = 0; double totalCost = 0; bool skip = false; foreach (ThingDef ingredientDef in amount.filter.AllowedThingDefs) { if (ingredientDef == ThingDefOf.Medicine) { skip = true; break; } count++; EquipmentRecord entry = PrepareCarefully.Instance.EquipmentDatabase[new EquipmentKey(ingredientDef, null)]; if (entry != null) { totalCost += entry.cost * (double)amount.GetBaseCount(); } } if (skip || count == 0) { continue; } cost.bionics += (int)(totalCost / (double)count); } } } cost.apparel = Math.Ceiling(cost.apparel); cost.bionics = Math.Ceiling(cost.bionics); // Use a multiplier to balance pawn cost vs. equipment cost. // Disabled for now. cost.Multiply(1.0); cost.ComputeTotal(); }
public void CalculatePawnCost(ColonistCostDetails cost, CustomPawn pawn) { cost.Clear(); cost.name = pawn.NickName; // Start with the market value plus a bit of a mark-up. cost.marketValue = pawn.Pawn.MarketValue; cost.marketValue += 300; // Reduce cost if random injuries have been chosen. if (pawn.RandomInjuries) { float ageMultiplier = pawn.BiologicalAge; if (ageMultiplier > 100) { ageMultiplier = 100; } float injuryValue = Mathf.Pow(ageMultiplier, 1.177455f); injuryValue = injuryValue / 10f; injuryValue = Mathf.Floor(injuryValue) * 10f; cost.marketValue -= injuryValue; } // Calculate passion cost. Each passion above 8 makes all passions // cost more. Minor passion counts as one passion. Major passion // counts as 3. double skillCount = pawn.currentPassions.Keys.Count(); double passionLevelCount = 0; double passionLevelCost = 20; double passionateSkillCount = 0; foreach (SkillDef def in pawn.currentPassions.Keys) { Passion passion = pawn.currentPassions[def]; int level = pawn.GetSkillLevel(def); if (passion == Passion.Major) { passionLevelCount += 3.0; passionateSkillCount += 1.0; } else if (passion == Passion.Minor) { passionLevelCount += 1.0; passionateSkillCount += 1.0; } } double levelCost = passionLevelCost; if (passionLevelCount > 8) { double penalty = passionLevelCount - 8; levelCost += penalty * 0.4; } cost.marketValue += levelCost * passionLevelCount; // Calculat cost of worn apparel. for (int layer = 0; layer < PawnLayers.Count; layer++) { if (PawnLayers.IsApparelLayer(layer)) { var def = pawn.GetAcceptedApparel(layer); SelectedEquipment customPawn = new SelectedEquipment(); customPawn.def = def; customPawn.count = 1; if (def != null) { var stuff = pawn.GetSelectedStuff(layer); customPawn.stuffDef = stuff; } double c = CalculateEquipmentCost(customPawn); if (def != null) { if (customPawn.stuffDef != null) { if (customPawn.stuffDef.defName == "Synthread") { if (freeApparel.Contains(customPawn.def.defName)) { c = 0; } else if (cheapApparel.Contains(customPawn.def.defName)) { c = c * 0.15d; } } } } cost.apparel += c; } } // Calculate cost for any materials needed for implants. foreach (Implant option in pawn.Implants) { // Check if there are any ancestor parts that override the selection. if (PrepareCarefully.Instance.HealthManager.ImplantManager.AncestorIsImplant(pawn, option.BodyPartRecord)) { continue; } // Figure out the cost of the part replacement based on its recipe's ingredients. if (option.recipe != null) { RecipeDef def = option.recipe; foreach (IngredientCount amount in def.ingredients) { int count = 0; double totalCost = 0; bool skip = false; foreach (ThingDef ingredientDef in amount.filter.AllowedThingDefs) { if (ingredientDef == ThingDefOf.Medicine) { skip = true; break; } count++; EquipmentDatabaseEntry entry = PrepareCarefully.Instance.EquipmentEntries[new EquipmentKey(ingredientDef, null)]; if (entry != null) { totalCost += entry.cost * (double)amount.GetBaseCount(); } } if (skip || count == 0) { continue; } cost.bionics += (int)(totalCost / (double)count); } } } cost.apparel = Math.Ceiling(cost.apparel); cost.bionics = Math.Ceiling(cost.bionics); // Use a multiplier to balance pawn cost vs. equipment cost. // Disabled for now. cost.Multiply(1.0); cost.ComputeTotal(); }
public SaveRecordPawnV5(CustomPawn pawn) { this.id = pawn.Id; this.thingDef = pawn.Pawn.def.defName; this.type = pawn.Type.ToString(); if (pawn.Type == CustomPawnType.World && pawn.Faction != null) { this.faction = new SaveRecordFactionV4() { def = pawn.Faction?.Def?.defName, index = pawn.Faction.Index, leader = pawn.Faction.Leader }; } this.pawnKindDef = pawn.OriginalKindDef?.defName ?? pawn.Pawn.kindDef.defName; this.originalFactionDef = pawn.OriginalFactionDef?.defName; this.gender = pawn.Gender; this.adulthood = pawn.Adulthood?.identifier ?? pawn.LastSelectedAdulthoodBackstory?.identifier; this.childhood = pawn.Childhood?.identifier; this.skinColor = pawn.Pawn.story.SkinColor; this.melanin = pawn.Pawn.story.melanin; this.hairDef = pawn.HairDef.defName; this.hairColor = pawn.Pawn.story.hairColor; this.headGraphicPath = pawn.HeadGraphicPath; this.bodyType = pawn.BodyType.defName; this.firstName = pawn.FirstName; this.nickName = pawn.NickName; this.lastName = pawn.LastName; this.age = 0; this.biologicalAge = pawn.BiologicalAge; this.chronologicalAge = pawn.ChronologicalAge; foreach (var trait in pawn.Traits) { if (trait != null) { this.traits.Add(new SaveRecordTraitV5() { def = trait.def.defName, degree = trait.Degree }); } } foreach (var skill in pawn.Pawn.skills.skills) { this.skills.Add(new SaveRecordSkillV4() { name = skill.def.defName, value = pawn.GetUnmodifiedSkillLevel(skill.def), passion = pawn.currentPassions[skill.def] }); } foreach (var layer in PrepareCarefully.Instance.Providers.PawnLayers.GetLayersForPawn(pawn)) { if (layer.Apparel) { ThingDef apparelThingDef = pawn.GetAcceptedApparel(layer); Color color = pawn.GetColor(layer); if (apparelThingDef != null) { ThingDef apparelStuffDef = pawn.GetSelectedStuff(layer); this.apparel.Add(new SaveRecordApparelV4() { layer = layer.Name, apparel = apparelThingDef.defName, stuff = apparelStuffDef?.defName ?? "", color = color }); } } } OptionsHealth healthOptions = PrepareCarefully.Instance.Providers.Health.GetOptions(pawn); foreach (Implant implant in pawn.Implants) { var saveRecord = new SaveRecordImplantV3(implant); if (implant.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(implant.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.implants.Add(saveRecord); } foreach (Injury injury in pawn.Injuries) { var saveRecord = new SaveRecordInjuryV3(injury); if (injury.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(injury.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.injuries.Add(saveRecord); } pawnCompsSaver = new PawnCompsSaver(pawn.Pawn, DefaultPawnCompRules.RulesForSaving); }
public SaveRecordPawnV3(CustomPawn pawn) { this.id = pawn.Id; this.thingDef = pawn.Pawn.def.defName; this.pawnKindDef = pawn.Pawn.kindDef.defName; this.gender = pawn.Gender; if (pawn.Adulthood != null) { this.adulthood = pawn.Adulthood.identifier; } else { this.adulthood = pawn.LastSelectedAdulthoodBackstory.identifier; } this.childhood = pawn.Childhood.identifier; this.skinColor = pawn.Pawn.story.SkinColor; this.melanin = pawn.Pawn.story.melanin; this.hairDef = pawn.HairDef.defName; this.hairColor = pawn.GetColor(PawnLayers.Hair); this.headGraphicPath = pawn.HeadGraphicPath; this.bodyType = Enum.GetName(typeof(BodyType), pawn.BodyType); this.firstName = pawn.FirstName; this.nickName = pawn.NickName; this.lastName = pawn.LastName; this.age = 0; this.biologicalAge = pawn.BiologicalAge; this.chronologicalAge = pawn.ChronologicalAge; foreach (var trait in pawn.Traits) { if (trait != null) { this.traitNames.Add(trait.def.defName); this.traitDegrees.Add(trait.Degree); } } foreach (var skill in pawn.Pawn.skills.skills) { this.skillNames.Add(skill.def.defName); this.skillValues.Add(pawn.GetUnmodifiedSkillLevel(skill.def)); this.passions.Add(pawn.currentPassions[skill.def]); this.originalPassions.Add(pawn.originalPassions[skill.def]); } for (int layer = 0; layer < PawnLayers.Count; layer++) { ThingDef apparelThingDef = pawn.GetAcceptedApparel(layer); ThingDef apparelStuffDef = pawn.GetSelectedStuff(layer); Color color = pawn.GetColor(layer); if (apparelThingDef != null) { this.apparelLayers.Add(layer); this.apparel.Add(apparelThingDef.defName); this.apparelStuff.Add(apparelStuffDef != null ? apparelStuffDef.defName : ""); this.apparelColors.Add(color); } } OptionsHealth healthOptions = PrepareCarefully.Instance.Providers.Health.GetOptions(pawn); foreach (Implant implant in pawn.Implants) { var saveRecord = new SaveRecordImplantV3(implant); if (implant.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(implant.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.implants.Add(saveRecord); } foreach (Injury injury in pawn.Injuries) { var saveRecord = new SaveRecordInjuryV3(injury); if (injury.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(injury.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.injuries.Add(saveRecord); } }