42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
namespace NeonSprawl.Server.Game.Factions;
|
|
|
|
/// <summary>Id normalization for faction standing stores (NEO-135).</summary>
|
|
public static class FactionStandingIds
|
|
{
|
|
/// <summary>Trim + lowercase; empty when input is null/whitespace.</summary>
|
|
public static string NormalizePlayerId(string? playerId)
|
|
{
|
|
var trimmed = playerId?.Trim();
|
|
if (string.IsNullOrEmpty(trimmed))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
return trimmed.ToLowerInvariant();
|
|
}
|
|
|
|
/// <summary>Trim; empty when input is null/whitespace. Faction ids stay case-sensitive (catalog ids are lowercase snake).</summary>
|
|
public static string NormalizeFactionId(string? factionId)
|
|
{
|
|
var trimmed = factionId?.Trim();
|
|
return string.IsNullOrEmpty(trimmed) ? string.Empty : trimmed;
|
|
}
|
|
|
|
/// <summary>Composite store key for <paramref name="playerId"/> + <paramref name="factionId"/>.</summary>
|
|
public static string MakeStandingKey(string? playerId, string? factionId)
|
|
{
|
|
var player = NormalizePlayerId(playerId);
|
|
var faction = NormalizeFactionId(factionId);
|
|
if (player.Length == 0 || faction.Length == 0)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
return $"{player}\0{faction}";
|
|
}
|
|
|
|
/// <summary>Clamps <paramref name="standing"/> to the faction definition band.</summary>
|
|
public static int ClampStanding(int standing, FactionDefRow definition) =>
|
|
Math.Clamp(standing, definition.MinStanding, definition.MaxStanding);
|
|
}
|