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)); }
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; }
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); } } }
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); }
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() )); }
public HumanoidCharacterAppearance WithMarkings(MarkingsSet newMarkings) { return(new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings)); }