Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
            }
        }
Пример #4
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
            }
        }
Пример #12
0
        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;
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }