コード例 #1
0
        public static HumanoidCharacterAppearance EnsureValid(HumanoidCharacterAppearance appearance, string species)
        {
            var mgr         = IoCManager.Resolve <SpriteAccessoryManager>();
            var hairStyleId = appearance.HairStyleId;

            if (!mgr.IsValidAccessoryInCategory(hairStyleId, SpriteAccessoryCategories.HumanHair))
            {
                hairStyleId = HairStyles.DefaultHairStyle;
            }

            var facialHairStyleId = appearance.FacialHairStyleId;

            if (!mgr.IsValidAccessoryInCategory(facialHairStyleId, SpriteAccessoryCategories.HumanFacialHair))
            {
                facialHairStyleId = HairStyles.DefaultFacialHairStyle;
            }

            var hairColor       = ClampColor(appearance.HairColor);
            var facialHairColor = ClampColor(appearance.FacialHairColor);
            var eyeColor        = ClampColor(appearance.EyeColor);
            var skinColor       = ClampColor(appearance.SkinColor);

            var validMarkingsSet = MarkingsSet.EnsureValid(appearance.Markings);

            validMarkingsSet = MarkingsSet.FilterSpecies(validMarkingsSet, species);

            return(new HumanoidCharacterAppearance(
                       hairStyleId,
                       hairColor,
                       facialHairStyleId,
                       facialHairColor,
                       eyeColor,
                       skinColor,
                       validMarkingsSet));
        }
コード例 #2
0
 public HumanoidCharacterAppearance(string hairStyleId,
                                    Color hairColor,
                                    string facialHairStyleId,
                                    Color facialHairColor,
                                    Color eyeColor,
                                    Color skinColor,
                                    MarkingsSet markings)
 {
     HairStyleId       = hairStyleId;
     HairColor         = ClampColor(hairColor);
     FacialHairStyleId = facialHairStyleId;
     FacialHairColor   = ClampColor(facialHairColor);
     EyeColor          = ClampColor(eyeColor);
     SkinColor         = ClampColor(skinColor);
     Markings          = markings;
 }
コード例 #3
0
        public void SetActiveMarkings(EntityUid uid, MarkingsSet markingList, MarkingsComponent?markings = null)
        {
            if (!Resolve(uid, ref markings))
            {
                return;
            }

            markings.ActiveMarkings.Clear();

            foreach (HumanoidVisualLayers layer in HumanoidAppearanceSystem.BodyPartLayers)
            {
                markings.ActiveMarkings.Add(layer, new List <Marking>());
            }

            foreach (var marking in markingList)
            {
                if (_markingManager.Markings().TryGetValue(marking.MarkingId, out var markingProto))
                {
                    markings.ActiveMarkings[markingProto.BodyPart].Add(marking);
                }
            }
        }
コード例 #4
0
        public void UpdateMarkings(EntityUid uid, MarkingsComponent markings, SharedHumanoidAppearanceSystem.ChangedHumanoidAppearanceEvent args)
        {
            var appearance = args.Appearance;

            if (!EntityManager.TryGetComponent(uid, out SpriteComponent? sprite))
            {
                return;
            }
            MarkingsSet totalMarkings = new MarkingsSet(appearance.Markings);

            Dictionary <MarkingCategories, MarkingPoints> usedPoints = MarkingPoints.CloneMarkingPointDictionary(markings.LayerPoints);

            var markingsEnumerator = appearance.Markings.GetReverseEnumerator();

            // Reverse ordering
            while (markingsEnumerator.MoveNext())
            {
                var marking = (Marking)markingsEnumerator.Current;
                if (!_markingManager.IsValidMarking(marking, out MarkingPrototype? markingPrototype))
                {
                    continue;
                }

                // if the given marking isn't correctly formed, we need to
                // instead just allocate a new marking based on the old one

                if (marking.MarkingColors.Count != markingPrototype.Sprites.Count)
                {
                    marking = new Marking(marking.MarkingId, markingPrototype.Sprites.Count);
                }

                if (usedPoints.TryGetValue(markingPrototype.MarkingCategory, out MarkingPoints? points))
                {
                    if (points.Points == 0)
                    {
                        continue;
                    }

                    points.Points--;
                }

                if (!sprite.LayerMapTryGet(markingPrototype.BodyPart, out int targetLayer))
                {
                    continue;
                }

                for (int j = 0; j < markingPrototype.Sprites.Count(); j++)
                {
                    var    rsi     = (SpriteSpecifier.Rsi)markingPrototype.Sprites[j];
                    string layerId = $"{markingPrototype.ID}-{rsi.RsiState}";

                    if (sprite.LayerMapTryGet(layerId, out var existingLayer))
                    {
                        sprite.RemoveLayer(existingLayer);
                        sprite.LayerMapRemove(marking.MarkingId);
                    }

                    int layer = sprite.AddLayer(markingPrototype.Sprites[j], targetLayer + j + 1);
                    sprite.LayerMapSet(layerId, layer);
                    if (markingPrototype.FollowSkinColor)
                    {
                        sprite.LayerSetColor(layerId, appearance.SkinColor);
                    }
                    else
                    {
                        sprite.LayerSetColor(layerId, marking.MarkingColors[j]);
                    }
                }
            }

            // for each layer, check if it's required and
            // if the points are greater than zero
            //
            // if so, then we start applying default markings
            // until the point requirement is satisfied -
            // this can also mean that a specific set of markings
            // is applied on top of existing markings
            //
            // All default markings will follow the skin color of
            // the current body.
            foreach (var(layerType, points) in usedPoints)
            {
                if (points.Required && points.Points > 0)
                {
                    while (points.Points > 0)
                    {
                        // this all has to be checked, continues shouldn't occur because
                        // points.Points needs to be subtracted
                        if (points.DefaultMarkings.TryGetValue(points.Points - 1, out var marking) &&
                            _markingManager.Markings().TryGetValue(marking, out var markingPrototype) &&
                            markingPrototype.MarkingCategory == layerType &&     // check if this actually belongs on this layer, too
                            sprite.LayerMapTryGet(markingPrototype.BodyPart, out int targetLayer))
                        {
                            for (int j = 0; j < markingPrototype.Sprites.Count(); j++)
                            {
                                var    rsi     = (SpriteSpecifier.Rsi)markingPrototype.Sprites[j];
                                string layerId = $"{markingPrototype.ID}-{rsi.RsiState}";

                                if (sprite.LayerMapTryGet(layerId, out var existingLayer))
                                {
                                    sprite.RemoveLayer(existingLayer);
                                    sprite.LayerMapRemove(markingPrototype.ID);
                                }

                                int layer = sprite.AddLayer(markingPrototype.Sprites[j], targetLayer + j + 1);
                                sprite.LayerMapSet(layerId, layer);
                                sprite.LayerSetColor(layerId, appearance.SkinColor);
                            }

                            totalMarkings.AddBack(markingPrototype.AsMarking());
                        }

                        points.Points--;
                    }
                }
            }

            SetActiveMarkings(uid, totalMarkings, markings);
        }
コード例 #5
0
        private static HumanoidCharacterProfile ConvertProfiles(Profile profile)
        {
            var jobs   = profile.Jobs.ToDictionary(j => j.JobName, j => (JobPriority)j.Priority);
            var antags = profile.Antags.Select(a => a.AntagName);

            var sex = Sex.Male;

            if (Enum.TryParse <Sex>(profile.Sex, true, out var sexVal))
            {
                sex = sexVal;
            }

            var clothing = ClothingPreference.Jumpsuit;

            if (Enum.TryParse <ClothingPreference>(profile.Clothing, true, out var clothingVal))
            {
                clothing = clothingVal;
            }

            var backpack = BackpackPreference.Backpack;

            if (Enum.TryParse <BackpackPreference>(profile.Backpack, true, out var backpackVal))
            {
                backpack = backpackVal;
            }

            var gender = sex == Sex.Male ? Gender.Male : Gender.Female;

            if (Enum.TryParse <Gender>(profile.Gender, true, out var genderVal))
            {
                gender = genderVal;
            }

            // ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
            var markingsRaw = profile.Markings?.Deserialize <List <string> >();

            List <Marking> markings = new();

            if (markingsRaw != null)
            {
                foreach (var marking in markingsRaw)
                {
                    var parsed = Marking.ParseFromDbString(marking);

                    if (parsed is null)
                    {
                        continue;
                    }

                    markings.Add(parsed);
                }
            }
            var markingsSet = new MarkingsSet(markings);

            return(new HumanoidCharacterProfile(
                       profile.CharacterName,
                       profile.FlavorText,
                       profile.Species,
                       profile.Age,
                       sex,
                       gender,
                       new HumanoidCharacterAppearance
                       (
                           profile.HairName,
                           Color.FromHex(profile.HairColor),
                           profile.FacialHairName,
                           Color.FromHex(profile.FacialHairColor),
                           Color.FromHex(profile.EyeColor),
                           Color.FromHex(profile.SkinColor),
                           markingsSet
                       ),
                       clothing,
                       backpack,
                       jobs,
                       (PreferenceUnavailableMode)profile.PreferenceUnavailable,
                       antags.ToList()
                       ));
        }
コード例 #6
0
 public HumanoidCharacterAppearance WithMarkings(MarkingsSet newMarkings)
 {
     return(new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings));
 }