protected OptionsBodyType InitializeAlienRaceBodyTypes(ThingDef def) { OptionsBodyType result = new OptionsBodyType(); AlienRace alienRace = AlienRaceProvider.GetAlienRace(def); if (alienRace == null) { return(null); } if (alienRace.BodyTypes.Count > 0) { bool containsMale = alienRace.BodyTypes.Contains(BodyTypeDefOf.Male); bool containsFemale = alienRace.BodyTypes.Contains(BodyTypeDefOf.Female); bool containsBothMaleAndFemale = containsMale && containsFemale; foreach (BodyTypeDef type in alienRace.BodyTypes) { if (type != BodyTypeDefOf.Male || !containsBothMaleAndFemale) { result.FemaleBodyTypes.Add(type); } if (type != BodyTypeDefOf.Female || !containsBothMaleAndFemale) { result.MaleBodyTypes.Add(type); } result.NoGenderBodyTypes.Add(type); } } if (result.MaleBodyTypes.Count == 0 && result.FemaleBodyTypes.Count == 0) { result = InitializeNonModdedDefaultHumanlikeBodyTypes(); //if (alienRace.GraphicsPathForBodyTypes != null && !defaultBodyTypesPaths.Contains(alienRace.GraphicsPathForBodyTypes)) { // result = InitializeHumanlikeBodyTypes(); // result.MaleBodyTypes = result.MaleBodyTypes.Where(d => ValidateBodyTypeForAlienRace(alienRace, d)).ToList(); // result.FemaleBodyTypes = result.FemaleBodyTypes.Where(d => ValidateBodyTypeForAlienRace(alienRace, d)).ToList(); //} //else { // result = InitializeNonModdedDefaultHumanlikeBodyTypes(); //} } /* * // TODO: Is this right? * // Was this trying to guard against mod developers only defining male and not female body types? * if (result.MaleBodyTypes.Count == 0 && result.FemaleBodyTypes.Count > 0) { * result.MaleBodyTypes = result.FemaleBodyTypes; * } * else if (result.FemaleBodyTypes.Count == 0 && result.MaleBodyTypes.Count > 0) { * result.FemaleBodyTypes = result.MaleBodyTypes; * } * * if (result.MaleBodyTypes.Count == 0 && result.FemaleBodyTypes.Count == 0) { * result = InitializeHumanlikeBodyTypes(); * } */ return(result); }
protected OptionsHair InitializeHairs(ThingDef raceDef) { AlienRace alienRace = AlienRaceProvider.GetAlienRace(raceDef); if (alienRace == null) { return(HumanlikeHairs); } if (!alienRace.HasHair) { return(noHair); } // If the alien race does not have a limited set of hairs, then we'll try to re-use the humanlike hair options. if (alienRace.HairTags == null) { // If the selection of hairs is the same and the alien race has no custom color generator, then // we can just re-use the humanlike hair options. if (alienRace.HairColors == null) { return(HumanlikeHairs); } // If there is a custom color generator, then we make a copy of the humanlike hair options--preserving // the HairDef lists--but we replace the color list. else { OptionsHair humanHairs = HumanlikeHairs; OptionsHair humanHairsWithColors = new OptionsHair(); humanHairsWithColors.MaleHairs = humanHairs.MaleHairs; humanHairsWithColors.FemaleHairs = humanHairs.FemaleHairs; humanHairsWithColors.NoGenderHairs = humanHairs.NoGenderHairs; humanHairsWithColors.Colors = alienRace.HairColors.ToList(); return(humanHairsWithColors); } } OptionsHair result = new OptionsHair(); foreach (HairDef hairDef in DefDatabase <HairDef> .AllDefs.Where((HairDef def) => { foreach (var tag in def.hairTags) { if (alienRace.HairTags.Contains(tag)) { return(true); } } return(false); })) { result.AddHair(hairDef); } if (alienRace.HairColors != null) { result.Colors = alienRace.HairColors.ToList(); } result.Sort(); return(result); }
public List <PawnLayer> InitializePawnLayers(ThingDef pawnDef, Gender gender) { AlienRace race = PrepareCarefully.Instance.Providers.AlienRaces.GetAlienRace(pawnDef); if (race == null) { return(InitializeDefaultPawnLayers(pawnDef, gender)); } else { return(InitializeAlienPawnLayers(pawnDef, gender, race)); } }
protected OptionsHair InitializeHumanlikeHairs() { HashSet <string> nonHumanHairTags = new HashSet <string>(); IEnumerable <ThingDef> alienRaces = DefDatabase <ThingDef> .AllDefs.Where((ThingDef def) => { return(def.race != null && ProviderAlienRaces.IsAlienRace(def)); }); foreach (var alienRaceDef in alienRaces) { AlienRace alienRace = AlienRaceProvider.GetAlienRace(alienRaceDef); if (alienRace == null) { continue; } if (alienRace.HairTags != null) { foreach (var tag in alienRace.HairTags) { nonHumanHairTags.Add(tag); } } } OptionsHair result = new OptionsHair(); foreach (HairDef hairDef in DefDatabase <HairDef> .AllDefs.Where((HairDef def) => { foreach (var tag in def.hairTags) { if (nonHumanHairTags.Contains(tag)) { return(false); } } return(true); })) { result.AddHair(hairDef); } result.Sort(); // Set up default hair colors result.Colors.Add(new Color(0.2f, 0.2f, 0.2f)); result.Colors.Add(new Color(0.31f, 0.28f, 0.26f)); result.Colors.Add(new Color(0.25f, 0.2f, 0.15f)); result.Colors.Add(new Color(0.3f, 0.2f, 0.1f)); result.Colors.Add(new Color(0.3529412f, 0.227451f, 0.1254902f)); result.Colors.Add(new Color(0.5176471f, 0.3254902f, 0.1843137f)); result.Colors.Add(new Color(0.7568628f, 0.572549f, 0.3333333f)); result.Colors.Add(new Color(0.9294118f, 0.7921569f, 0.6117647f)); return(result); }
protected OptionsHeadType InitializeAlienHeadTypes(ThingDef raceDef) { //Logger.Debug("InitializeAlienHeadTypes(" + raceDef.defName + ")"); AlienRace alienRace = AlienRaceProvider.GetAlienRace(raceDef); OptionsHeadType result = new OptionsHeadType(); if (alienRace == null) { Logger.Warning("Could not initialize head types for alien race, " + raceDef + ", because the race's thing definition was missing"); return(result); } //Logger.Debug("alienRace.GraphicsPathForHeads = " + alienRace.GraphicsPathForHeads); if (alienRace.GraphicsPathForHeads == null) { Logger.Warning("Could not initialize head types for alien race, " + raceDef + ", because no path for head graphics was found."); return(result); } foreach (var crownType in alienRace.CrownTypes) { //Logger.Debug(" - " + crownType); if (alienRace.GenderSpecificHeads) { CustomHeadType maleHead = CreateGenderedAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType, Gender.Male); CustomHeadType femaleHead = CreateGenderedAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType, Gender.Female); if (maleHead != null) { //Logger.Debug(" - MALE: " + maleHead.GraphicPath); result.AddHeadType(maleHead); } if (femaleHead != null) { //Logger.Debug(" - FEMALE: " + femaleHead.GraphicPath); result.AddHeadType(femaleHead); } } else { CustomHeadType head = CreateMultiGenderAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType); if (head != null) { //Logger.Debug(" - MULTIGENDER: " + head.GraphicPath); result.AddHeadType(head); } } } return(result); }
private List <PawnLayerOption> InitializeAlienAddonOptions(AlienRace race, AlienRaceBodyAddon addon) { if (addon.OptionCount == 0) { return(null); } List <PawnLayerOption> result = new List <PawnLayerOption>(); for (int i = 0; i < addon.OptionCount; i++) { PawnLayerOptionAlienAddon option = new PawnLayerOptionAlienAddon(); option.Label = "EdB.PC.Pawn.PawnLayer.AlienAddonOption".Translate(new object[] { i + 1 }); option.Index = i; result.Add(option); } return(result); }
protected OptionsHeadType InitializeAlienHeadTypes(ThingDef raceDef) { AlienRace alienRace = AlienRaceProvider.GetAlienRace(raceDef); OptionsHeadType result = new OptionsHeadType(); if (alienRace == null) { Log.Warning("Prepare Carefully could not initialize head types for alien race, " + raceDef); return(result); } if (alienRace.GraphicsPathForHeads == null) { Log.Warning("Prepare Carefully could not initialize head types for alien race, " + raceDef + ", because no path for head graphics was found."); return(result); } foreach (var crownType in alienRace.CrownTypes) { if (alienRace.GenderSpecificHeads) { CustomHeadType maleHead = CreateGenderedAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType, Gender.Male); CustomHeadType femaleHead = CreateGenderedAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType, Gender.Female); if (maleHead != null) { result.AddHeadType(maleHead); } if (femaleHead != null) { result.AddHeadType(femaleHead); } } else { CustomHeadType head = CreateMultiGenderAlienHeadTypeFromCrownType(alienRace.GraphicsPathForHeads, crownType); if (head != null) { result.AddHeadType(head); } } } return(result); }
protected OptionsApparel InitializeApparel(ThingDef raceDef) { AlienRace alienRace = AlienRaceProvider.GetAlienRace(raceDef); if (alienRace == null) { return(HumanlikeApparel); } // If the alien race does not have a restricted set of apparel, then we'll re-use the // humanlike apparel options. if (!alienRace.RestrictedApparelOnly && alienRace.RestrictedApparel == null) { return(HumanlikeApparel); } OptionsApparel result = new OptionsApparel(); HashSet <string> addedAlready = new HashSet <string>(); if (alienRace.RestrictedApparel != null) { foreach (var defName in alienRace.RestrictedApparel) { AddApparel(result, defName); addedAlready.Add(defName); } } if (!alienRace.RestrictedApparelOnly) { OptionsApparel humanApparel = HumanlikeApparel; foreach (var def in humanApparel.AllApparel) { if (!addedAlready.Contains(def.defName)) { AddApparel(result, def); addedAlready.Add(def.defName); } } } result.Sort(); return(result); }
protected OptionsBodyType InitializeAlienRaceBodyTypes(ThingDef def) { OptionsBodyType result = new OptionsBodyType(); AlienRace alienRace = AlienRaceProvider.GetAlienRace(def); if (alienRace == null) { return(null); } if (alienRace.BodyTypes.Count > 0) { bool containsMale = alienRace.BodyTypes.Contains(BodyTypeDefOf.Male); bool containsFemale = alienRace.BodyTypes.Contains(BodyTypeDefOf.Female); bool containsBothMaleAndFemale = containsMale && containsFemale; foreach (BodyTypeDef type in alienRace.BodyTypes) { if (type != BodyTypeDefOf.Male || !containsBothMaleAndFemale) { result.FemaleBodyTypes.Add(type); } if (type != BodyTypeDefOf.Female || !containsBothMaleAndFemale) { result.MaleBodyTypes.Add(type); } result.NoGenderBodyTypes.Add(type); } } if (result.MaleBodyTypes.Count == 0 && result.FemaleBodyTypes.Count > 0) { result.MaleBodyTypes = result.FemaleBodyTypes; } else if (result.FemaleBodyTypes.Count == 0 && result.MaleBodyTypes.Count > 0) { result.FemaleBodyTypes = result.MaleBodyTypes; } return(result); }
protected OptionsApparel InitializeHumanlikeApparel() { HashSet <string> nonHumanApparel = new HashSet <string>(); IEnumerable <ThingDef> alienRaces = DefDatabase <ThingDef> .AllDefs.Where((ThingDef def) => { return(def.race != null && ProviderAlienRaces.IsAlienRace(def)); }); foreach (var alienRaceDef in alienRaces) { AlienRace alienRace = AlienRaceProvider.GetAlienRace(alienRaceDef); if (alienRace == null) { continue; } if (alienRace.RestrictedApparel != null) { foreach (var defName in alienRace.RestrictedApparel) { nonHumanApparel.Add(defName); } } } OptionsApparel result = new OptionsApparel(); foreach (ThingDef apparelDef in DefDatabase <ThingDef> .AllDefs) { if (apparelDef.apparel == null) { continue; } if (!nonHumanApparel.Contains(apparelDef.defName)) { AddApparel(result, apparelDef); } } result.Sort(); return(result); }
protected AlienRace InitializeAlienRace(ThingDef raceDef) { try { object alienRaceObject = GetFieldValue(raceDef, raceDef, "alienRace"); if (alienRaceObject == null) { return(null); } object generalSettingsObject = GetFieldValue(raceDef, alienRaceObject, "generalSettings"); if (generalSettingsObject == null) { return(null); } object alienPartGeneratorObject = GetFieldValue(raceDef, generalSettingsObject, "alienPartGenerator"); if (alienPartGeneratorObject == null) { return(null); } System.Collections.ICollection graphicPathsCollection = GetFieldValueAsCollection(raceDef, alienRaceObject, "graphicPaths"); if (graphicPathsCollection == null) { return(null); } /* * Logger.Debug("GraphicsPaths for " + raceDef.defName + ":"); * if (graphicPathsCollection.Count > 0) { * foreach (object o in graphicPathsCollection) { * Logger.Debug(" GraphicsPath"); * Logger.Debug(" .body = " + GetFieldValueAsString(raceDef, o, "body")); * Logger.Debug(" .head = " + GetFieldValueAsString(raceDef, o, "head")); * System.Collections.ICollection lifeStagesCollections = GetFieldValueAsCollection(raceDef, o, "lifeStageDefs"); * } * } */ // We have enough to start putting together the result object, so we instantiate it now. AlienRace result = new AlienRace(); result.ThingDef = raceDef; //Logger.Debug("InitializeAlienRace: " + raceDef.defName); // Get the list of body types. System.Collections.ICollection alienBodyTypesCollection = GetFieldValueAsCollection(raceDef, alienPartGeneratorObject, "alienbodytypes"); if (alienBodyTypesCollection == null) { return(null); } List <BodyTypeDef> bodyTypes = new List <BodyTypeDef>(); //Logger.Debug("Body Types for " + raceDef.defName + ":"); if (alienBodyTypesCollection.Count > 0) { foreach (object o in alienBodyTypesCollection) { if (o.GetType() == typeof(BodyTypeDef)) { BodyTypeDef def = o as BodyTypeDef; //Logger.Debug(" - " + def.defName + ", " + def.LabelCap); bodyTypes.Add((BodyTypeDef)o); } } } else { //Logger.Debug(" none"); } result.BodyTypes = bodyTypes; // Determine if the alien races uses gender-specific heads. bool?useGenderedHeads = GetFieldValueAsBool(raceDef, alienPartGeneratorObject, "useGenderedHeads"); if (useGenderedHeads == null) { return(null); } result.GenderSpecificHeads = useGenderedHeads.Value; // Get the list of crown types. System.Collections.ICollection alienCrownTypesCollection = GetFieldValueAsCollection(raceDef, alienPartGeneratorObject, "aliencrowntypes"); if (alienCrownTypesCollection == null) { return(null); } List <string> crownTypes = new List <string>(); //Logger.Debug("Crown Types for " + raceDef.defName + ":"); if (alienCrownTypesCollection.Count > 0) { foreach (object o in alienCrownTypesCollection) { string crownTypeString = o as string; if (crownTypeString != null) { crownTypes.Add(crownTypeString); //Logger.Debug(" " + crownTypeString); } } } result.CrownTypes = crownTypes; // Go through the graphics paths and find the heads path. // TODO: What is this? string graphicsPathForHeads = null; string graphicsPathForBodyTypes = null; foreach (var graphicsPath in graphicPathsCollection) { System.Collections.ICollection lifeStageCollection = GetFieldValueAsCollection(raceDef, graphicsPath, "lifeStageDefs"); if (lifeStageCollection == null || lifeStageCollection.Count == 0) { string headsPath = GetFieldValueAsString(raceDef, graphicsPath, "head"); string bodyTypesPath = GetFieldValueAsString(raceDef, graphicsPath, "body"); if (headsPath != null) { graphicsPathForHeads = headsPath; } if (bodyTypesPath != null) { graphicsPathForBodyTypes = bodyTypesPath; } } } result.GraphicsPathForHeads = graphicsPathForHeads; result.GraphicsPathForBodyTypes = graphicsPathForBodyTypes; // Figure out colors. ColorGenerator primaryGenerator = FindPrimarySkinColorGenerator(raceDef, alienPartGeneratorObject); ColorGenerator secondaryGenerator = FindSecondarySkinColorGenerator(raceDef, alienPartGeneratorObject); result.UseMelaninLevels = true; result.ChangeableColor = true; result.HasSecondaryColor = false; if (primaryGenerator != null) { if (primaryGenerator.GetType().Name != "ColorGenerator_SkinColorMelanin") { if (primaryGenerator != null) { result.UseMelaninLevels = false; result.PrimaryColors = primaryGenerator.GetColorList(); } else { result.PrimaryColors = new List <Color>(); } if (secondaryGenerator != null) { result.HasSecondaryColor = true; result.SecondaryColors = secondaryGenerator.GetColorList(); } else { result.SecondaryColors = new List <Color>(); } } } // Hair properties. object hairSettingsValue = GetFieldValue(raceDef, alienRaceObject, "hairSettings", true); result.HasHair = true; if (hairSettingsValue != null) { bool?hasHair = GetFieldValueAsBool(raceDef, hairSettingsValue, "hasHair"); if (hasHair != null) { result.HasHair = hasHair.Value; } var hairTagCollection = GetFieldValueAsCollection(raceDef, hairSettingsValue, "hairTags"); if (hairTagCollection != null) { var hairTags = new HashSet <string>(); foreach (var o in hairTagCollection) { string tag = o as string; if (tag != null) { hairTags.Add(tag); } } if (hairTags.Count > 0) { result.HairTags = hairTags; } } } ColorGenerator hairColorGenerator = FindPrimaryColorGenerator(raceDef, alienPartGeneratorObject, "hair"); if (hairColorGenerator != null) { result.HairColors = hairColorGenerator.GetColorList(); } else { result.HairColors = null; } // Apparel properties. object restrictionSettingsValue = GetFieldValue(raceDef, alienRaceObject, "raceRestriction", true); result.RestrictedApparelOnly = false; if (restrictionSettingsValue != null) { bool?restrictedApparelOnly = GetFieldValueAsBool(raceDef, restrictionSettingsValue, "onlyUseRaceRestrictedApparel"); if (restrictedApparelOnly != null) { result.RestrictedApparelOnly = restrictedApparelOnly.Value; } var restrictedApparelCollection = GetFieldValueAsCollection(raceDef, restrictionSettingsValue, "apparelList"); if (restrictedApparelCollection != null) { var apparel = new HashSet <string>(); foreach (var o in restrictedApparelCollection) { string defName = o as string; if (defName != null) { apparel.Add(defName); } } if (apparel.Count > 0) { result.RestrictedApparel = apparel; } } } var bodyAddonsCollection = GetFieldValueAsCollection(raceDef, alienPartGeneratorObject, "bodyAddons"); if (bodyAddonsCollection != null) { var addons = new List <AlienRaceBodyAddon>(); int index = -1; foreach (var o in bodyAddonsCollection) { index++; AlienRaceBodyAddon addon = new AlienRaceBodyAddon(); string path = GetFieldValueAsString(raceDef, o, "path"); if (path == null) { Logger.Warning("Failed to get path for body add-on for alien race: " + raceDef.defName); continue; } addon.Path = path; int?variantCount = GetFieldValueAsInt(raceDef, o, "variantCount"); if (variantCount == null) { Logger.Warning("Failed to get variant count for body add-on for alien race: " + raceDef.defName); continue; } addon.OptionCount = variantCount.Value; string name = ParseAddonName(path); if (name == null) { Logger.Warning("Failed to parse a name from its path for body add-on for alien race: " + raceDef.defName); continue; } addon.Name = name; addon.VariantIndex = index; addons.Add(addon); } result.addons = addons; } return(result); } catch (Exception e) { throw new InitializationException("Failed to initialize an alien race: " + raceDef.defName, e); } }
protected override void DrawPanelContent(State state) { base.DrawPanelContent(state); CustomPawn customPawn = state.CurrentPawn; string label = PawnLayers.Label(this.selectedPawnLayer); if (WidgetDropdown.Button(RectLayerSelector, label, true, false, true)) { List <FloatMenuOption> list = new List <FloatMenuOption>(); int layerCount = this.pawnLayerActions.Count; for (int i = 0; i < layerCount; i++) { int pawnLayer = pawnLayers[i]; label = PawnLayers.Label(pawnLayers[i]); list.Add(new FloatMenuOption(label, this.pawnLayerActions[i], MenuOptionPriority.Default, null, null, 0, null, null)); } Find.WindowStack.Add(new FloatMenu(list, null, false)); } GUI.DrawTexture(RectPortrait, Textures.TexturePortraitBackground); customPawn.UpdatePortrait(); DrawPawn(customPawn, RectPortrait); GUI.color = ColorPortraitBorder; Widgets.DrawBox(RectPortrait, 1); GUI.color = Color.white; // Conflict alert if (customPawn.ApparelConflict != null) { GUI.color = Color.white; Rect alertRect = new Rect(RectPortrait.x + 77, RectPortrait.y + 150, 36, 32); GUI.DrawTexture(alertRect, Textures.TextureAlert); TooltipHandler.TipRegion(alertRect, customPawn.ApparelConflict); } // Draw selector field. Rect fieldRect = new Rect(RectPortrait.x, RectPortrait.y + RectPortrait.height + 5, RectPortrait.width, 28); Action previousSelectionAction = null; Action nextSelectionAction = null; Action clickAction = null; OptionsApparel apparelOptions = null; List <ThingDef> apparelList = null; OptionsHair hairOptions = null; List <HairDef> hairList = null; if (this.selectedPawnLayer == PawnLayers.Hair) { hairOptions = PrepareCarefully.Instance.Providers.Hair.GetHairsForRace(customPawn); hairList = hairOptions.GetHairs(customPawn.Gender); } else if (PawnLayers.IsApparelLayer(this.selectedPawnLayer)) { apparelOptions = PrepareCarefully.Instance.Providers.Apparel.GetApparelForRace(customPawn); apparelList = apparelOptions.GetApparel(this.selectedPawnLayer); } if (this.selectedPawnLayer == PawnLayers.HeadType) { int headTypeCount = PrepareCarefully.Instance.Providers.HeadTypes.GetHeadTypes(customPawn).Count(); if (customPawn.HeadType != null && headTypeCount > 1) { previousSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextHead(customPawn, -1); }; nextSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextHead(customPawn, 1); }; } if (customPawn.HeadType != null && headTypeCount > 0) { clickAction = () => { ShowHeadDialog(customPawn); }; } } else if (this.selectedPawnLayer == PawnLayers.BodyType) { if (PrepareCarefully.Instance.Providers.BodyTypes.GetBodyTypesForPawn(customPawn.Pawn).Count > 1) { previousSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextBodyType(customPawn, -1); }; nextSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextBodyType(customPawn, 1); }; } clickAction = () => { ShowBodyTypeDialog(customPawn); }; } else if (this.selectedPawnLayer == PawnLayers.Hair) { if (hairList.Count > 1) { previousSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextHair(customPawn, -1); }; nextSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextHair(customPawn, 1); }; } if (hairList.Count > 0) { clickAction = () => { ShowHairDialog(customPawn); }; } } else { if (apparelList.Count > 1) { previousSelectionAction = () => { SoundDefOf.TickTiny.PlayOneShotOnCamera(); SelectNextApparel(customPawn, -1); }; nextSelectionAction = () => { SelectNextApparel(customPawn, 1); SoundDefOf.TickTiny.PlayOneShotOnCamera(); }; } if (apparelList.Count > 0) { clickAction = () => { ShowApparelDialog(customPawn, this.selectedPawnLayer); }; } } string selectorLabel = PawnLayerLabel.CapitalizeFirst(); if (hairList != null && hairList.Count == 0) { selectorLabel = "EdB.PC.Common.NoOptionAvailable".Translate(); } if (apparelList != null && apparelList.Count == 0) { selectorLabel = "EdB.PC.Common.NoOptionAvailable".Translate(); } DrawFieldSelector(fieldRect, selectorLabel, previousSelectionAction, nextSelectionAction, clickAction); float cursorY = fieldRect.y + 34; // Draw stuff selector for apparel if (PawnLayers.IsApparelLayer(this.selectedPawnLayer)) { ThingDef apparelDef = customPawn.GetSelectedApparel(selectedPawnLayer); if (apparelDef != null && apparelDef.MadeFromStuff) { if (customPawn.GetSelectedStuff(selectedPawnLayer) == null) { Log.Error("Selected stuff for " + PawnLayers.ToApparelLayer(selectedPawnLayer) + " is null"); } Rect stuffFieldRect = new Rect(RectPortrait.x, cursorY, RectPortrait.width, 28); DrawFieldSelector(stuffFieldRect, customPawn.GetSelectedStuff(selectedPawnLayer).LabelCap, () => { ThingDef selected = customPawn.GetSelectedStuff(selectedPawnLayer); int index = this.apparelStuffLookup[apparelDef].FindIndex((ThingDef d) => { return(selected == d); }); index--; if (index < 0) { index = this.apparelStuffLookup[apparelDef].Count - 1; } customPawn.SetSelectedStuff(selectedPawnLayer, apparelStuffLookup[apparelDef][index]); }, () => { ThingDef selected = customPawn.GetSelectedStuff(selectedPawnLayer); int index = this.apparelStuffLookup[apparelDef].FindIndex((ThingDef d) => { return(selected == d); }); index++; if (index >= this.apparelStuffLookup[apparelDef].Count) { index = 0; } customPawn.SetSelectedStuff(selectedPawnLayer, this.apparelStuffLookup[apparelDef][index]); }, () => { ShowApparelStuffDialog(customPawn, this.selectedPawnLayer); } ); cursorY += stuffFieldRect.height; } } cursorY += 8; // Draw Color Selector if (PawnLayers.IsApparelLayer(selectedPawnLayer)) { if (apparelList != null && apparelList.Count > 0) { ThingDef def = customPawn.GetSelectedApparel(selectedPawnLayer); if (def != null && def.HasComp(typeof(CompColorable))) { if (def.MadeFromStuff) { DrawColorSelector(customPawn, cursorY, null); } else { DrawColorSelector(customPawn, cursorY, def.colorGenerator); } } } } else if (selectedPawnLayer == PawnLayers.BodyType || selectedPawnLayer == PawnLayers.HeadType) { AlienRace alienRace = customPawn.AlienRace; if (alienRace == null || alienRace.UseMelaninLevels) { DrawHumanlikeColorSelector(customPawn, cursorY); } else { DrawAlienPawnColorSelector(customPawn, cursorY, alienRace.PrimaryColors, true); } } else if (selectedPawnLayer == PawnLayers.Hair) { if (hairList != null && hairList.Count > 0) { DrawColorSelector(customPawn, cursorY, hairOptions.Colors, true); } } // Random button if (RectButtonRandomize.Contains(Event.current.mousePosition)) { GUI.color = Style.ColorButtonHighlight; } else { GUI.color = Style.ColorButton; } GUI.DrawTexture(RectButtonRandomize, Textures.TextureButtonRandom); if (Widgets.ButtonInvisible(RectButtonRandomize, false)) { SoundDefOf.TickLow.PlayOneShotOnCamera(); RandomizeAppearance(); } // Gender buttons. if (state.CurrentPawn.Pawn.RaceProps != null && state.CurrentPawn.Pawn.RaceProps.hasGenders) { bool genderFemaleSelected = state.CurrentPawn.Gender == Gender.Female; Style.SetGUIColorForButton(RectGenderFemale, genderFemaleSelected); GUI.DrawTexture(RectGenderFemale, Textures.TextureButtonGenderFemale); if (!genderFemaleSelected && Widgets.ButtonInvisible(RectGenderFemale, false)) { SoundDefOf.TickTiny.PlayOneShotOnCamera(); GenderUpdated(Gender.Female); } bool genderMaleSelected = state.CurrentPawn.Gender == Gender.Male; Style.SetGUIColorForButton(RectGenderMale, genderMaleSelected); GUI.DrawTexture(RectGenderMale, Textures.TextureButtonGenderMale); if (!genderMaleSelected && Widgets.ButtonInvisible(RectGenderMale, false)) { SoundDefOf.TickTiny.PlayOneShotOnCamera(); GenderUpdated(Gender.Male); } } GUI.color = Color.white; }
private List <PawnLayer> InitializeAlienPawnLayers(ThingDef pawnDef, Gender gender, AlienRace race) { List <PawnLayer> layers = new List <PawnLayer>() { InitializeHairLayer(pawnDef, gender), InitializeHeadLayer(pawnDef, gender), InitializeBodyLayer(pawnDef, gender), }; if (race.Addons != null) { OptionsHair optionsHair = PrepareCarefully.Instance.Providers.Hair.GetHairsForRace(pawnDef); foreach (var addon in race.Addons) { PawnLayerAlienAddon layer = new PawnLayerAlienAddon(); layer.Name = addon.Name; layer.Label = addon.Name; if (addon.Skin) { layer.Skin = true; } else { layer.Hair = true; layer.ColorSelectorType = ColorSelectorType.RGB; layer.ColorSwatches = optionsHair.Colors; } layer.AlienAddon = addon; layer.Options = InitializeAlienAddonOptions(race, addon); if (layer.Options == null || layer.Options.Count == 1) { continue; } layers.Add(layer); } } layers.AddRange(new PawnLayer[] { pantsLayer, bottomClothingLayer, middleClothingLayer, topClothingLayer, hatLayer, accessoryLayer }); return(layers); }
protected AlienRace InitializeAlienRace(ThingDef raceDef) { object alienRaceObject = GetFieldValue(raceDef, raceDef, "alienRace"); if (alienRaceObject == null) { return(null); } object generalSettingsObject = GetFieldValue(raceDef, alienRaceObject, "generalSettings"); if (generalSettingsObject == null) { return(null); } object alienPartGeneratorObject = GetFieldValue(raceDef, generalSettingsObject, "alienPartGenerator"); if (alienPartGeneratorObject == null) { return(null); } System.Collections.ICollection graphicPathsCollection = GetFieldValueAsCollection(raceDef, alienRaceObject, "graphicPaths"); if (graphicPathsCollection == null) { return(null); } // We have enough to start putting together the result object, so we instantiate it now. AlienRace result = new AlienRace(); // Get the list of body types. System.Collections.ICollection alienBodyTypesCollection = GetFieldValueAsCollection(raceDef, alienPartGeneratorObject, "alienbodytypes"); if (alienBodyTypesCollection == null) { return(null); } List <BodyType> bodyTypes = new List <BodyType>(); if (alienBodyTypesCollection.Count > 0) { foreach (object o in alienBodyTypesCollection) { if (o.GetType() == typeof(BodyType)) { bodyTypes.Add((BodyType)o); } } } result.BodyTypes = bodyTypes; // Determine if the alien races uses gender-specific heads. bool?useGenderedHeads = GetFieldValueAsBool(raceDef, alienPartGeneratorObject, "UseGenderedHeads"); if (useGenderedHeads == null) { return(null); } result.GenderSpecificHeads = useGenderedHeads.Value; // Get the list of crown types. System.Collections.ICollection alienCrownTypesCollection = GetFieldValueAsCollection(raceDef, alienPartGeneratorObject, "aliencrowntypes"); if (alienCrownTypesCollection == null) { return(null); } List <string> crownTypes = new List <string>(); if (alienCrownTypesCollection.Count > 0) { foreach (object o in alienCrownTypesCollection) { string crownTypeString = o as string; if (crownTypeString != null) { crownTypes.Add(crownTypeString); } } } result.CrownTypes = crownTypes; // Go through the graphics paths and find the heads path. string graphicsPathForHeads = null; foreach (var graphicsPath in graphicPathsCollection) { System.Collections.ICollection lifeStageCollection = GetFieldValueAsCollection(raceDef, graphicsPath, "lifeStageDefs"); if (lifeStageCollection == null || lifeStageCollection.Count == 0) { string path = GetFieldValueAsString(raceDef, graphicsPath, "head"); if (path != null) { graphicsPathForHeads = path; break; } } } result.GraphicsPathForHeads = graphicsPathForHeads; // Figure out colors. object primaryColorGeneratorValue = GetFieldValue(raceDef, alienPartGeneratorObject, "alienskincolorgen", true); result.UseMelaninLevels = true; ColorGenerator primaryGenerator = primaryColorGeneratorValue as ColorGenerator; if (primaryGenerator != null) { result.UseMelaninLevels = false; result.PrimaryColors = primaryGenerator.GetColorList(); } else { result.PrimaryColors = new List <Color>(); } object secondaryColorGeneratorValue = GetFieldValue(raceDef, alienPartGeneratorObject, "alienskinsecondcolorgen", true); result.HasSecondaryColor = false; ColorGenerator secondaryGenerator = secondaryColorGeneratorValue as ColorGenerator; if (secondaryGenerator != null) { result.HasSecondaryColor = true; result.SecondaryColors = secondaryGenerator.GetColorList(); } else { result.SecondaryColors = new List <Color>(); } // Hair properties. object hairSettingsValue = GetFieldValue(raceDef, alienRaceObject, "hairSettings", true); result.HasHair = true; if (hairSettingsValue != null) { bool?hasHair = GetFieldValueAsBool(raceDef, hairSettingsValue, "HasHair"); if (hasHair != null) { result.HasHair = hasHair.Value; } var hairTagCollection = GetFieldValueAsCollection(raceDef, hairSettingsValue, "hairTags"); if (hairTagCollection != null) { var hairTags = new HashSet <string>(); foreach (var o in hairTagCollection) { string tag = o as string; if (tag != null) { hairTags.Add(tag); } } if (hairTags.Count > 0) { result.HairTags = hairTags; } } } object hairColorGeneratorValue = GetFieldValue(raceDef, alienPartGeneratorObject, "alienhaircolorgen", true); ColorGenerator hairColorGenerator = hairColorGeneratorValue as ColorGenerator; if (hairColorGenerator != null) { result.HairColors = primaryGenerator.GetColorList(); } else { result.HairColors = null; } // Apparel properties. object restrictionSettingsValue = GetFieldValue(raceDef, alienRaceObject, "raceRestriction", true); result.RestrictedApparelOnly = false; if (restrictionSettingsValue != null) { bool?restrictedApparelOnly = GetFieldValueAsBool(raceDef, restrictionSettingsValue, "onlyUseRaceRestrictedApparel"); if (restrictedApparelOnly != null) { result.RestrictedApparelOnly = restrictedApparelOnly.Value; } var restrictedApparelCollection = GetFieldValueAsCollection(raceDef, restrictionSettingsValue, "apparelList"); if (restrictedApparelCollection != null) { var apparel = new HashSet <string>(); foreach (var o in restrictedApparelCollection) { string defName = o as string; if (defName != null) { apparel.Add(defName); } } if (apparel.Count > 0) { result.RestrictedApparel = apparel; } } } return(result); }