public CustomPawn CreatePawn() { // TODO: Evaluate //Pawn source = PawnGenerator.GeneratePawn(PawnKindDefOf.Colonist, Faction.OfColony); Pawn source = new Randomizer().GenerateColonist(); source.health = new Pawn_HealthTracker(source); CustomPawn pawn = new CustomPawn(source); pawn.Gender = this.gender; if (age > 0) { pawn.ChronologicalAge = age; pawn.BiologicalAge = age; } if (chronologicalAge > 0) { pawn.ChronologicalAge = chronologicalAge; } if (biologicalAge > 0) { pawn.BiologicalAge = biologicalAge; } pawn.FirstName = this.firstName; pawn.NickName = this.nickName; pawn.LastName = this.lastName; HairDef h = FindHairDef(this.hairDef); if (h != null) { pawn.HairDef = h; } pawn.HeadGraphicPath = this.headGraphicPath; pawn.SetColor(PawnLayers.Hair, hairColor); pawn.SetColor(PawnLayers.HeadType, skinColor); Backstory backstory = FindBackstory(childhood); if (backstory != null) { pawn.Childhood = backstory; } backstory = FindBackstory(adulthood); if (backstory != null) { pawn.Adulthood = backstory; } int traitCount = pawn.Traits.Count(); for (int i = 0; i < traitCount; i++) { pawn.ClearTrait(i); } for (int i = 0; i < traitNames.Count; i++) { string traitName = traitNames[i]; if (i >= traitCount) { break; } Trait trait = FindTrait(traitName, traitDegrees[i]); if (trait != null) { pawn.SetTrait(i, trait); } } for (int i = 0; i < this.skillNames.Count; i++) { string name = this.skillNames[i]; SkillDef def = FindSkillDef(pawn.Pawn, name); if (def == null) { continue; } pawn.currentPassions[def] = this.passions[i]; pawn.SetUnmodifiedSkillLevel(def, this.skillValues[i]); } for (int i = 0; i < PawnLayers.Count; i++) { if (PawnLayers.IsApparelLayer(i)) { pawn.SetSelectedApparel(i, null); pawn.SetSelectedStuff(i, null); } } for (int i = 0; i < this.apparelLayers.Count; i++) { int layer = this.apparelLayers[i]; ThingDef def = DefDatabase <ThingDef> .GetNamedSilentFail(this.apparel[i]); if (def == null) { continue; } ThingDef stuffDef = null; if (!string.IsNullOrEmpty(this.apparelStuff[i])) { stuffDef = DefDatabase <ThingDef> .GetNamedSilentFail(this.apparelStuff[i]); if (stuffDef == null) { continue; } } pawn.SetSelectedApparel(layer, def); pawn.SetSelectedStuff(layer, stuffDef); pawn.SetColor(layer, this.apparelColors[i]); } return(pawn); }
public CustomPawn LoadPawn(SaveRecordPawnV3 record) { // TODO: Ahlpa 14 Evaluate Pawn source = new Randomizer().GenerateColonist(); //Pawn source = PawnGenerator.GeneratePawn(PawnKindDefOf.Colonist, Faction.OfPlayer); CustomPawn pawn = new CustomPawn(source); pawn.Gender = record.gender; if (record.age > 0) { pawn.ChronologicalAge = record.age; pawn.BiologicalAge = record.age; } if (record.chronologicalAge > 0) { pawn.ChronologicalAge = record.chronologicalAge; } if (record.biologicalAge > 0) { pawn.BiologicalAge = record.biologicalAge; } pawn.FirstName = record.firstName; pawn.NickName = record.nickName; pawn.LastName = record.lastName; HairDef h = FindHairDef(record.hairDef); if (h != null) { pawn.HairDef = h; } else { Log.Warning("Could not load hair definition \"" + record.hairDef + "\""); Failed = true; } pawn.HeadGraphicPath = record.headGraphicPath; pawn.SetColor(PawnLayers.Hair, record.hairColor); pawn.SetColor(PawnLayers.HeadType, record.skinColor); Backstory backstory = FindBackstory(record.childhood); if (backstory != null) { pawn.Childhood = backstory; } else { Log.Warning("Could not load childhood backstory definition \"" + record.childhood + "\""); Failed = true; } backstory = FindBackstory(record.adulthood); if (backstory != null) { pawn.Adulthood = backstory; } else { Log.Warning("Could not load adulthood backstory definition \"" + record.adulthood + "\""); Failed = true; } int traitCount = pawn.Traits.Count(); for (int i = 0; i < traitCount; i++) { pawn.ClearTrait(i); } for (int i = 0; i < record.traitNames.Count; i++) { string traitName = record.traitNames[i]; if (i >= traitCount) { break; } Trait trait = FindTrait(traitName, record.traitDegrees[i]); if (trait != null) { pawn.SetTrait(i, trait); } else { Log.Warning("Could not load trait definition \"" + traitName + "\""); Failed = true; } } for (int i = 0; i < record.skillNames.Count; i++) { string name = record.skillNames[i]; SkillDef def = FindSkillDef(pawn.Pawn, name); if (def == null) { Log.Warning("Could not load skill definition \"" + name + "\""); Failed = true; continue; } pawn.currentPassions[def] = record.passions[i]; pawn.originalPassions[def] = record.passions[i]; pawn.SetOriginalSkillLevel(def, record.skillValues[i]); pawn.SetUnmodifiedSkillLevel(def, record.skillValues[i]); } if (record.originalPassions != null && record.originalPassions.Count == record.skillNames.Count) { for (int i = 0; i < record.skillNames.Count; i++) { string name = record.skillNames[i]; SkillDef def = FindSkillDef(pawn.Pawn, name); if (def == null) { Log.Warning("Could not load skill definition \"" + name + "\""); Failed = true; continue; } //pawn.originalPassions[def] = record.originalPassions[i]; } } for (int i = 0; i < PawnLayers.Count; i++) { if (PawnLayers.IsApparelLayer(i)) { pawn.SetSelectedApparel(i, null); pawn.SetSelectedStuff(i, null); } } for (int i = 0; i < record.apparelLayers.Count; i++) { int layer = record.apparelLayers[i]; ThingDef def = DefDatabase <ThingDef> .GetNamedSilentFail(record.apparel[i]); if (def == null) { Log.Warning("Could not load thing definition for apparel \"" + record.apparel[i] + "\""); Failed = true; continue; } ThingDef stuffDef = null; if (!string.IsNullOrEmpty(record.apparelStuff[i])) { stuffDef = DefDatabase <ThingDef> .GetNamedSilentFail(record.apparelStuff[i]); if (stuffDef == null) { Log.Warning("Could not load stuff definition \"" + record.apparelStuff[i] + "\" for apparel \"" + record.apparel[i] + "\""); Failed = true; continue; } } pawn.SetSelectedApparel(layer, def); pawn.SetSelectedStuff(layer, stuffDef); pawn.SetColor(layer, record.apparelColors[i]); } for (int i = 0; i < record.implants.Count; i++) { SaveRecordImplantV3 implantRecord = record.implants[i]; BodyPartRecord bodyPart = PrepareCarefully.Instance.HealthManager.ImplantManager.FindReplaceableBodyPartByName(implantRecord.bodyPart); if (bodyPart == null) { Log.Warning("Could not find replaceable body part definition \"" + implantRecord.bodyPart + "\""); Failed = true; continue; } if (implantRecord.recipe != null) { RecipeDef recipeDef = FindRecipeDef(implantRecord.recipe); if (recipeDef == null) { Log.Warning("Could not find recipe definition \"" + implantRecord.recipe + "\""); Failed = true; continue; } bool found = false; foreach (var p in recipeDef.appliedOnFixedBodyParts) { if (p.defName.Equals(bodyPart.def.defName)) { found = true; break; } } if (!found) { Log.Warning("Body part \"" + bodyPart.def.defName + "\" does not match recipe used to replace it"); Failed = true; continue; } Implant implant = new Implant(); implant.BodyPartRecord = bodyPart; implant.recipe = recipeDef; implant.label = implant.Label; pawn.AddImplant(implant); } } foreach (var injuryRecord in record.injuries) { HediffDef def = DefDatabase <HediffDef> .GetNamedSilentFail(injuryRecord.hediffDef); if (def == null) { Log.Warning("Could not find hediff definition \"" + injuryRecord.hediffDef + "\""); Failed = true; continue; } InjuryOption option = PrepareCarefully.Instance.HealthManager.InjuryManager.FindOptionByHediffDef(def); if (option == null) { Log.Warning("Could not find injury option for \"" + injuryRecord.hediffDef + "\""); Failed = true; continue; } BodyPartRecord bodyPart = null; if (injuryRecord.bodyPart != null) { bodyPart = PrepareCarefully.Instance.HealthManager.FirstBodyPartRecord(injuryRecord.bodyPart); if (bodyPart == null) { Log.Warning("Could not find body part \"" + injuryRecord.bodyPart + "\""); Failed = true; continue; } } Injury injury = new Injury(); injury.Option = option; injury.BodyPartRecord = bodyPart; if (injuryRecord.severity != null) { injury.Severity = injuryRecord.Severity; } pawn.AddInjury(injury); } pawn.RandomInjuries = record.randomInjuries; pawn.RandomRelations = record.randomRelations; pawn.ClearCachedAbilities(); pawn.ClearCachedLifeStage(); return(pawn); }