Files
h-school/src/HSchool.Content/PackPaths.cs
T
Leonid Pershin 2d633411e4 Add DiseaseDef diseases with weather vectors and excused absence.
Vanilla ships several diseases whose stages drive lesson gain, stay-home
rolls, and illness attendance; cold/rain/snow raise onset via BehaviorDef scale.
2026-08-21 13:28:57 +03:00

153 lines
4.8 KiB
C#

namespace HSchool.Content;
internal static class PackPaths
{
public static string Normalize(string relativePath) => relativePath.Replace('\\', '/').TrimStart('/');
public static bool IsJsonc(string relativePath)
{
var path = Normalize(relativePath);
return path.EndsWith(".jsonc", StringComparison.OrdinalIgnoreCase)
|| path.EndsWith(".json", StringComparison.OrdinalIgnoreCase);
}
public static bool TryGetDefKind(string relativePath, out DefKind kind)
{
kind = default;
var parts = Normalize(relativePath).Split('/');
if (parts.Length < 3 || !parts[0].Equals("defs", StringComparison.OrdinalIgnoreCase))
{
return false;
}
return TryMapFolder(parts[1], out kind);
}
public static bool IsPatch(string relativePath)
{
var path = Normalize(relativePath);
return path.StartsWith("patches/", StringComparison.OrdinalIgnoreCase) && IsJsonc(path);
}
public static bool TryGetLocaleLanguage(string relativePath, out string language)
{
language = string.Empty;
var path = Normalize(relativePath);
if (!path.StartsWith("localizations/", StringComparison.OrdinalIgnoreCase) || !IsJsonc(path))
{
return false;
}
var file = Path.GetFileNameWithoutExtension(path);
if (file.Equals("ru", StringComparison.OrdinalIgnoreCase))
{
language = "ru";
return true;
}
if (file.Equals("en", StringComparison.OrdinalIgnoreCase))
{
language = "en";
return true;
}
return false;
}
public static bool IsDefaultMap(string relativePath) =>
Normalize(relativePath).Equals("maps/default.jsonc", StringComparison.OrdinalIgnoreCase)
|| Normalize(relativePath).Equals("maps/default.json", StringComparison.OrdinalIgnoreCase);
public static bool IsManifest(string relativePath)
{
var path = Normalize(relativePath);
return path.Equals("pack.jsonc", StringComparison.OrdinalIgnoreCase)
|| path.Equals("pack.json", StringComparison.OrdinalIgnoreCase);
}
private static bool TryMapFolder(string folder, out DefKind kind)
{
switch (folder.ToLowerInvariant())
{
case "actions":
kind = DefKind.Action;
return true;
case "things":
kind = DefKind.Thing;
return true;
case "positions":
kind = DefKind.Position;
return true;
case "works":
kind = DefKind.Work;
return true;
case "rooms":
kind = DefKind.Room;
return true;
case "buildings":
kind = DefKind.Building;
return true;
case "floors":
kind = DefKind.Floor;
return true;
case "territories":
kind = DefKind.Territory;
return true;
case "skills":
kind = DefKind.Skill;
return true;
case "traits":
kind = DefKind.Trait;
return true;
case "bodies":
kind = DefKind.BodyAttribute;
return true;
case "needs":
kind = DefKind.Need;
return true;
case "countries":
kind = DefKind.Country;
return true;
case "climates":
kind = DefKind.ClimatePreset;
return true;
case "subjects":
kind = DefKind.Subject;
return true;
case "staffing":
kind = DefKind.Staffing;
return true;
case "dayframe":
kind = DefKind.DayFrame;
return true;
case "holidays":
kind = DefKind.Holiday;
return true;
case "behavior":
kind = DefKind.Behavior;
return true;
case "colors":
kind = DefKind.Color;
return true;
case "topics":
kind = DefKind.Topic;
return true;
case "orientations":
kind = DefKind.Orientation;
return true;
case "affinity":
kind = DefKind.AffinityRules;
return true;
case "events":
kind = DefKind.Event;
return true;
case "diseases":
kind = DefKind.Disease;
return true;
default:
kind = default;
return false;
}
}
}