Asset-owned topdata

This commit is contained in:
2026-05-23 00:29:04 +02:00
parent 82bd075ae4
commit 44e6fab372
4 changed files with 168 additions and 4 deletions
+118
View File
@@ -2398,6 +2398,124 @@ func TestBuildHAKsGeneratesParts2DAAssetsFromLocalModels(t *testing.T) {
}
}
func TestBuildHAKsPackagesStaticGeneratedTopDataByConfiguredRoot(t *testing.T) {
root := t.TempDir()
mustMkdir(t, filepath.Join(root, "src"))
mustMkdir(t, filepath.Join(root, "assets"))
mustMkdir(t, filepath.Join(root, "topdata", "data", "tailmodel"))
mustMkdir(t, filepath.Join(root, "topdata", "data", "skyboxes"))
mustMkdir(t, filepath.Join(root, "build"))
mustWriteFile(t, filepath.Join(root, "nwn-tool.json"), `{
"module": {
"name": "Test Module",
"resref": "testmod",
"hak_order": ["group:sow_part", "group:sow_envi"]
},
"paths": {
"source": "src",
"assets": "assets",
"build": "build"
},
"generated_assets": {
"topdata_2da": [
{
"id": "part_topdata",
"source": "topdata",
"output": "{paths.cache}/generated-assets/part-topdata-2da",
"include_datasets": ["tailmodel"],
"package_root": "part"
},
{
"id": "envi_topdata",
"source": "topdata",
"output": "{paths.cache}/generated-assets/envi-topdata-2da",
"include_datasets": ["skyboxes"],
"package_root": "envi"
}
]
},
"haks": [
{
"name": "sow_part",
"priority": 1,
"max_bytes": 0,
"split": false,
"include": ["part/**"]
},
{
"name": "sow_envi",
"priority": 2,
"max_bytes": 0,
"split": false,
"include": ["envi/**"]
}
]
}
`)
mustWriteFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "base.json"), `{
"output": "tailmodel.2da",
"columns": ["LABEL", "MODEL", "ENVMAP"],
"rows": [
{"id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"},
{"id": 1, "LABEL": "Lizard", "MODEL": "c_tailliz", "ENVMAP": "default"}
]
}
`)
mustWriteFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "base.json"), `{
"output": "skyboxes.2da",
"columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"],
"rows": [
{"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"},
{"id": 1, "LABEL": "Grass_Clear", "STRING_REF": "****", "CYCLICAL": "1", "DAWN": "Skyda_001", "DAY": "Sky_001", "DUSK": "Skyd_001", "NIGHT": "Skyn_001"}
]
}
`)
p, err := project.Load(root)
if err != nil {
t.Fatalf("load project: %v", err)
}
if err := p.ValidateLayout(); err != nil {
t.Fatalf("validate layout: %v", err)
}
if err := p.Scan(); err != nil {
t.Fatalf("scan: %v", err)
}
result, err := BuildHAKs(p)
if err != nil {
t.Fatalf("build haks: %v", err)
}
if len(result.HAKPaths) != 2 {
t.Fatalf("expected two HAKs, got %#v", result.HAKPaths)
}
raw, err := os.ReadFile(filepath.Join(root, "build", "haks.json"))
if err != nil {
t.Fatalf("read haks manifest: %v", err)
}
manifestText := string(raw)
for _, want := range []string{
`"part/tailmodel.2da"`,
`"envi/skyboxes.2da"`,
} {
if !strings.Contains(manifestText, want) {
t.Fatalf("expected generated static 2da asset %q in manifest, got:\n%s", want, manifestText)
}
}
if strings.Contains(manifestText, `"part/skyboxes.2da"`) || strings.Contains(manifestText, `"envi/tailmodel.2da"`) {
t.Fatalf("expected generated static 2da assets to follow configured package roots, got:\n%s", manifestText)
}
for _, generated := range []string{
filepath.Join(root, ".cache", "generated-assets", "part-topdata-2da", "tailmodel.2da"),
filepath.Join(root, ".cache", "generated-assets", "envi-topdata-2da", "skyboxes.2da"),
} {
if _, err := os.Stat(generated); err != nil {
t.Fatalf("expected generated 2da %s: %v", generated, err)
}
}
}
func TestBuildHAKsRejectsTLKBackedGeneratedParts2DAAssets(t *testing.T) {
root := t.TempDir()
mustMkdir(t, filepath.Join(root, "src"))