Sex restriction for markings (#19894)

* Add sex restriction to markings

* Apply to existing systems
This commit is contained in:
Morb
2023-09-19 23:56:10 +03:00
committed by GitHub
parent 1b2fd313a0
commit 835bde4c6e
13 changed files with 169 additions and 20 deletions

View File

@@ -66,6 +66,74 @@ namespace Content.Shared.Humanoid.Markings
{
continue;
}
res.Add(key, marking);
}
return res;
}
/// <summary>
/// Markings by category and sex.
/// </summary>
/// <param name="category"></param>
/// <param name="sex"></param>
/// <remarks>
/// This is done per category, as enumerating over every single marking by species isn't useful.
/// Please make a pull request if you find a use case for that behavior.
/// </remarks>
/// <returns></returns>
public IReadOnlyDictionary<string, MarkingPrototype> MarkingsByCategoryAndSex(MarkingCategories category,
Sex sex)
{
var res = new Dictionary<string, MarkingPrototype>();
foreach (var (key, marking) in MarkingsByCategory(category))
{
if (marking.SexRestriction != null && marking.SexRestriction != sex)
{
continue;
}
res.Add(key, marking);
}
return res;
}
/// <summary>
/// Markings by category, species and sex.
/// </summary>
/// <param name="category"></param>
/// <param name="species"></param>
/// <param name="sex"></param>
/// <remarks>
/// This is done per category, as enumerating over every single marking by species isn't useful.
/// Please make a pull request if you find a use case for that behavior.
/// </remarks>
/// <returns></returns>
public IReadOnlyDictionary<string, MarkingPrototype> MarkingsByCategoryAndSpeciesAndSex(MarkingCategories category,
string species, Sex sex)
{
var speciesProto = _prototypeManager.Index<SpeciesPrototype>(species);
var onlyWhitelisted = _prototypeManager.Index<MarkingPointsPrototype>(speciesProto.MarkingPoints).OnlyWhitelisted;
var res = new Dictionary<string, MarkingPrototype>();
foreach (var (key, marking) in MarkingsByCategory(category))
{
if (onlyWhitelisted && marking.SpeciesRestrictions == null)
{
continue;
}
if (marking.SpeciesRestrictions != null && !marking.SpeciesRestrictions.Contains(species))
{
continue;
}
if (marking.SexRestriction != null && marking.SexRestriction != sex)
{
continue;
}
res.Add(key, marking);
}
@@ -84,8 +152,9 @@ namespace Content.Shared.Humanoid.Markings
/// <param name="marking"></param>
/// <param name="category"></param>
/// <param name="species"></param>
/// <param name="sex"></param>
/// <returns></returns>
public bool IsValidMarking(Marking marking, MarkingCategories category, string species)
public bool IsValidMarking(Marking marking, MarkingCategories category, string species, Sex sex)
{
if (!TryGetMarking(marking, out var proto))
{
@@ -93,7 +162,8 @@ namespace Content.Shared.Humanoid.Markings
}
if (proto.MarkingCategory != category ||
proto.SpeciesRestrictions != null && !proto.SpeciesRestrictions.Contains(species))
proto.SpeciesRestrictions != null && !proto.SpeciesRestrictions.Contains(species) ||
proto.SexRestriction != null && proto.SexRestriction != sex)
{
return false;
}
@@ -121,7 +191,7 @@ namespace Content.Shared.Humanoid.Markings
}
}
public bool CanBeApplied(string species, Marking marking, IPrototypeManager? prototypeManager = null)
public bool CanBeApplied(string species, Sex sex, Marking marking, IPrototypeManager? prototypeManager = null)
{
IoCManager.Resolve(ref prototypeManager);
@@ -143,10 +213,16 @@ namespace Content.Shared.Humanoid.Markings
{
return false;
}
if (prototype.SexRestriction != null && prototype.SexRestriction != sex)
{
return false;
}
return true;
}
public bool CanBeApplied(string species, MarkingPrototype prototype, IPrototypeManager? prototypeManager = null)
public bool CanBeApplied(string species, Sex sex, MarkingPrototype prototype, IPrototypeManager? prototypeManager = null)
{
IoCManager.Resolve(ref prototypeManager);
@@ -163,6 +239,12 @@ namespace Content.Shared.Humanoid.Markings
{
return false;
}
if (prototype.SexRestriction != null && prototype.SexRestriction != sex)
{
return false;
}
return true;
}
@@ -181,7 +263,7 @@ namespace Content.Shared.Humanoid.Markings
alpha = 1f;
return false;
}
alpha = sprite.LayerAlpha;
return true;
}