Replace selectable name sets with a country that owns names and climate presets.

Create picks a country; climate is rolled from the school seed and stored. Old Slavic saves lift as Russia.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 02:55:13 +03:00
co-authored by Cursor
parent 450495f666
commit 1b66c89cd7
58 changed files with 902 additions and 477 deletions
@@ -0,0 +1,81 @@
namespace HSchool.Content.Tests;
public class CountryDefTests
{
private readonly CatalogLoader _loader = new();
[Fact]
public void VanillaCore_LoadsRussiaAndClimatePresets()
{
var root = Path.Combine(AppContext.BaseDirectory, "vanilla");
var catalog = _loader.Load([CatalogLoader.CorePackId], PackDocuments.FromDirectory(CatalogLoader.CorePackId, root));
Assert.True(catalog.Countries.ContainsKey("Russia"));
Assert.False(catalog.Countries.ContainsKey("Slavic"));
var russia = catalog.Countries["Russia"];
Assert.Equal(
["RussianLanguage", "BelarusianLanguage", "UkrainianLanguage"],
russia.Names.Spoken);
Assert.Equal(0.6f, russia.Names.RelatedLanguageChance);
Assert.Equal(40, russia.Names.RelatedLanguageMax);
Assert.True(russia.Names.MaleGiven.Count >= 20);
Assert.Equal(["TemperateContinental", "ContinentalCold"], russia.ClimatePresets);
Assert.True(catalog.ClimatePresets.ContainsKey("TemperateContinental"));
Assert.True(catalog.ClimatePresets.ContainsKey("ContinentalCold"));
Assert.Equal("Россия", catalog.Label("ru", russia));
Assert.Equal("Russia", catalog.Label("en", russia));
}
[Fact]
public void CountryWithoutNames_FailsTheCatalog()
{
var ex = Assert.Throws<ContentLoadException>(() => _loader.Load(
[CatalogLoader.CorePackId],
[
PackDocuments.Def(
CatalogLoader.CorePackId,
"climates",
"temperate",
"""{ "defName": "TemperateContinental" }"""),
PackDocuments.Def(
CatalogLoader.CorePackId,
"countries",
"ghost",
"""{ "defName": "GhostLand", "climatePresets": ["TemperateContinental"] }"""),
]));
Assert.Contains("GhostLand", ex.Message, StringComparison.Ordinal);
Assert.Contains("names", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void CountryWithUnknownPreset_FailsTheCatalog()
{
var ex = Assert.Throws<ContentLoadException>(() => _loader.Load(
[CatalogLoader.CorePackId],
[
PackDocuments.Def(
CatalogLoader.CorePackId,
"climates",
"temperate",
"""{ "defName": "TemperateContinental" }"""),
PackDocuments.Def(
CatalogLoader.CorePackId,
"countries",
"ghost",
"""
{
"defName": "GhostLand",
"climatePresets": ["NoSuchClimate"],
"names": {
"maleGiven": [{ "form": "Иван" }],
"femaleGiven": [{ "form": "Анна", "declension": "a" }],
"surnames": [{ "male": "Иванов", "female": "Иванова" }]
}
}
"""),
]));
Assert.Contains("NoSuchClimate", ex.Message, StringComparison.Ordinal);
}
}
@@ -40,12 +40,12 @@ public class ExamplePackTests
Assert.True(catalog.Traits.ContainsKey("ExampleEarlyRiser"));
Assert.True(catalog.Traits.ContainsKey("ExampleNightOwl"));
Assert.True(catalog.NameSets.ContainsKey("ExampleNames"));
Assert.True(catalog.Countries.ContainsKey("ExampleNames"));
Assert.True(catalog.Rooms.ContainsKey("ExampleStore"));
Assert.Equal("Кладовая", catalog.Label("ru", catalog.Rooms["ExampleStore"]));
Assert.Equal("Storeroom", catalog.Label("en", catalog.Rooms["ExampleStore"]));
Assert.Equal("Примерные имена", catalog.Label("ru", catalog.NameSets["ExampleNames"]));
Assert.Equal(["RussianLanguage"], catalog.NameSets["ExampleNames"].Spoken.ToArray());
Assert.Equal("Примерные имена", catalog.Label("ru", catalog.Countries["ExampleNames"]));
Assert.Equal(["RussianLanguage"], catalog.Countries["ExampleNames"].Names.Spoken.ToArray());
Assert.True(catalog.Rooms.ContainsKey("PrincipalsOffice"));
Assert.Equal("Кабинет директора", catalog.Label("ru", catalog.Rooms["PrincipalsOffice"]));
}
+31 -20
View File
@@ -25,15 +25,15 @@ public class PeopleDefTests
Assert.Equal(0.4f, catalog.Skills["English"].AdultChance);
Assert.Equal(
["RussianLanguage", "BelarusianLanguage", "UkrainianLanguage"],
catalog.NameSets["Slavic"].Spoken);
Assert.Equal(0.6f, catalog.NameSets["Slavic"].RelatedLanguageChance);
Assert.Equal(40, catalog.NameSets["Slavic"].RelatedLanguageMax);
catalog.Countries["Russia"].Names.Spoken);
Assert.Equal(0.6f, catalog.Countries["Russia"].Names.RelatedLanguageChance);
Assert.Equal(40, catalog.Countries["Russia"].Names.RelatedLanguageMax);
Assert.Contains(catalog.Subjects["ForeignLanguage"].Skills, share => share.Skill == "English");
Assert.False(catalog.Skills.ContainsKey("ForeignLanguage"));
Assert.True(catalog.NameSets.ContainsKey("Slavic"));
Assert.True(catalog.NameSets["Slavic"].MaleGiven.Count >= 20);
Assert.Equal("Славянский", catalog.Label("ru", catalog.NameSets["Slavic"]));
Assert.Equal("Slavic", catalog.Label("en", catalog.NameSets["Slavic"]));
Assert.True(catalog.Countries.ContainsKey("Russia"));
Assert.True(catalog.Countries["Russia"].Names.MaleGiven.Count >= 20);
Assert.Equal("Россия", catalog.Label("ru", catalog.Countries["Russia"]));
Assert.Equal("Russia", catalog.Label("en", catalog.Countries["Russia"]));
Assert.Equal("Усидчивый", catalog.Label("ru", catalog.Traits["Diligent"]));
Assert.True(catalog.Subjects.ContainsKey("PrimarySchool"));
Assert.NotNull(catalog.StaffingRules);
@@ -213,7 +213,7 @@ public class PeopleDefTests
}
[Fact]
public void ExtraPack_AddsANameSetAndTrait()
public void ExtraPack_AddsACountryAndTrait()
{
var catalog = _loader.Load(
[CatalogLoader.CorePackId, "addon"],
@@ -221,37 +221,48 @@ public class PeopleDefTests
PackDocuments.Def(CatalogLoader.CorePackId, "traits", "kind", """{ "defName": "Kind", "weight": 1 }"""),
PackDocuments.Def(
CatalogLoader.CorePackId,
"namesets",
"slavic",
"climates",
"temperate",
"""{ "defName": "TemperateContinental" }"""),
PackDocuments.Def(
CatalogLoader.CorePackId,
"countries",
"russia",
"""
{
"defName": "Slavic",
"maleGiven": [{ "form": "Иван" }],
"femaleGiven": [{ "form": "Анна", "declension": "a" }],
"surnames": [{ "male": "Иванов", "female": "Иванова" }]
"defName": "Russia",
"climatePresets": ["TemperateContinental"],
"names": {
"maleGiven": [{ "form": "Иван" }],
"femaleGiven": [{ "form": "Анна", "declension": "a" }],
"surnames": [{ "male": "Иванов", "female": "Иванова" }]
}
}
"""),
PackDocuments.Def("addon", "traits", "stoic", """{ "defName": "Stoic", "weight": 3 }"""),
PackDocuments.Def("addon", "traits", "cheerful", """{ "defName": "Cheerful", "weight": 2 }"""),
PackDocuments.Def(
"addon",
"namesets",
"countries",
"nordic",
"""
{
"defName": "Nordic",
"maleGiven": [{ "form": "Lars", "declension": "indeclinable" }],
"femaleGiven": [{ "form": "Ingrid", "declension": "indeclinable" }],
"surnames": [{ "male": "Berg", "female": "Berg", "declension": "indeclinable" }]
"climatePresets": ["TemperateContinental"],
"names": {
"maleGiven": [{ "form": "Lars", "declension": "indeclinable" }],
"femaleGiven": [{ "form": "Ingrid", "declension": "indeclinable" }],
"surnames": [{ "male": "Berg", "female": "Berg", "declension": "indeclinable" }]
}
}
"""),
PackDocuments.Locale("addon", "ru", """{ "Nordic": "Северный", "Stoic": "Стоик", "Cheerful": "Жизнерадостный" }"""),
]);
Assert.True(catalog.NameSets.ContainsKey("Nordic"));
Assert.True(catalog.Countries.ContainsKey("Nordic"));
Assert.True(catalog.Traits.ContainsKey("Stoic"));
Assert.True(catalog.Traits.ContainsKey("Cheerful"));
Assert.Equal("Северный", catalog.Label("ru", catalog.NameSets["Nordic"]));
Assert.Equal("Северный", catalog.Label("ru", catalog.Countries["Nordic"]));
Assert.Equal("Стоик", catalog.Label("ru", catalog.Traits["Stoic"]));
}
}
@@ -113,7 +113,8 @@ public class VanillaCoreTests
keys.AddRange(Names(catalog.Traits.Values));
keys.AddRange(Names(catalog.BodyAttributes.Values));
keys.AddRange(Names(catalog.Needs.Values));
keys.AddRange(Names(catalog.NameSets.Values));
keys.AddRange(Names(catalog.Countries.Values));
keys.AddRange(Names(catalog.ClimatePresets.Values));
keys.AddRange(Names(catalog.Subjects.Values));
keys.AddRange(Names(catalog.Staffing.Values));
keys.AddRange(Names(catalog.DayFrames.Values));