custom palette taxonomy
ci / ci (pull_request) Successful in 3m11s

This commit is contained in:
2026-07-22 16:54:56 +00:00
committed by archvillainette
parent b058846e16
commit ff9424c8c3
4 changed files with 211 additions and 6 deletions
+107
View File
@@ -15,6 +15,7 @@ import (
"time"
"git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/erf"
"git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/gff"
"git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project"
)
@@ -2396,6 +2397,58 @@ func TestBuildUsesNativeModeForInlineTLKAndWritesState(t *testing.T) {
}
}
func TestBuildNativeCompilesStandaloneTLKStrings(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "feat"))
mkdirAll(t, filepath.Join(root, "topdata", "tlk"))
writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n")
writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{
"output": "feat.2da",
"columns": ["LABEL", "FEAT", "DESCRIPTION"],
"rows": [{
"id": 0,
"key": "feat:test",
"LABEL": "TEST_LABEL",
"FEAT": {"tlk": {"key": "feat:test.name", "text": "Test Feat"}},
"DESCRIPTION": "****"
}]
}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "tlk", "custom.tlk.yml"), `schema: sow-topdata/tlk/v1
base_strref: 16777216
strings:
- key: palette.creatures.npcs
text: NPCs
id: 50
`)
result, err := BuildNative(testProject(root), nil)
if err != nil {
t.Fatalf("BuildNative failed: %v", err)
}
stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile))
if err != nil {
t.Fatalf("read tlk state: %v", err)
}
var state tlkStateDocument
if err := json.Unmarshal(stateRaw, &state); err != nil {
t.Fatalf("parse tlk state: %v", err)
}
mapping, ok := state.Entries["palette.creatures.npcs"]
if !ok || mapping.Retired {
t.Fatalf("expected active standalone TLK mapping, got %#v", mapping)
}
if got := state.Entries["feat:test.name"].ID; got != 0 || mapping.ID != 50 {
t.Fatalf("standalone strings must keep pinned ids without shifting dataset refs, got dataset=%d standalone=%d", got, mapping.ID)
}
tlkRaw, err := os.ReadFile(filepath.Join(result.OutputTLKDir, defaultTLKName))
if err != nil {
t.Fatalf("read compiled tlk: %v", err)
}
if !bytes.Contains(tlkRaw, []byte("NPCs")) {
t.Fatalf("compiled TLK does not contain standalone text")
}
}
func TestBuildPreservesTLKStateAcrossTextChanges(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "skills"))
@@ -9354,6 +9407,60 @@ func TestBuildAndPackageIncludesCompiled2DAAndTopAssets(t *testing.T) {
}
}
func TestBuildAndPackageCompilesITPJSONAssets(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust"))
mkdirAll(t, filepath.Join(root, "topdata", "assets", "palette"))
writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n")
writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{
"output": "repadjust.2da",
"columns": ["Label"],
"rows": [{"id": 0, "Label": "TEST_LABEL"}]
}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "assets", "palette", "creaturepal.itp.json"), `{
"file_type": "ITP ",
"file_version": "V3.2",
"root": {
"struct_type": 4294967295,
"fields": [
{"label": "MAIN", "type": "List", "value": []},
{"label": "RESTYPE", "type": "Word", "value": 2027},
{"label": "NEXT_USEABLE_ID", "type": "Byte", "value": 51}
]
}
}`+"\n")
proj := testProject(root)
proj.Config.TopData.ReferenceBuilder = ""
result, err := BuildAndPackage(proj, nil)
if err != nil {
t.Fatalf("BuildAndPackage failed: %v", err)
}
input, err := os.Open(result.OutputHAKPath)
if err != nil {
t.Fatalf("open hak: %v", err)
}
defer input.Close()
archive, err := erf.Read(input)
if err != nil {
t.Fatalf("read hak: %v", err)
}
for _, resource := range archive.Resources {
if resource.Name != "creaturepal" || resource.Type != 0x07EE {
continue
}
document, err := gff.Read(bytes.NewReader(resource.Data))
if err != nil {
t.Fatalf("read compiled ITP: %v", err)
}
if document.FileType != "ITP " || document.FileVersion != "V3.2" {
t.Fatalf("unexpected compiled ITP header: %#v", document)
}
return
}
t.Fatalf("expected creaturepal.itp in top package")
}
func TestCollectTopPackageResourcesRejectsDuplicateTopAssetKeys(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, ".cache", "2da"))