From 543945f099887dcb2f83bcacc801e900dca6c1a4 Mon Sep 17 00:00:00 2001 From: vickydotbat Date: Fri, 10 Apr 2026 08:43:06 +0200 Subject: [PATCH] Fix type extensions 2 --- internal/erf/erf.go | 20 +++++++++++++++ internal/erf/erf_test.go | 41 ++++++++++++++++++++++++++++++ internal/pipeline/build.go | 8 +++--- internal/pipeline/pipeline_test.go | 2 +- internal/project/project.go | 2 +- internal/topdata/top_package.go | 4 +-- internal/topdata/topdata.go | 4 +-- 7 files changed, 71 insertions(+), 10 deletions(-) diff --git a/internal/erf/erf.go b/internal/erf/erf.go index 1f95df5..622865e 100644 --- a/internal/erf/erf.go +++ b/internal/erf/erf.go @@ -109,9 +109,17 @@ var extensionTypes = map[string]uint16{ "ptt": 0x0812, "ltr": 0x0813, "shd": 0x0815, + "mdb": 0x0816, "mtr": 0x0818, + "jpg": 0x081C, "lod": 0x081E, "png": 0x083E, + "lyt": 0x0BB8, + "vis": 0x0BB9, + "mdx": 0x0BC0, + "wlk": 0x0BCC, + "xml": 0x0BCD, + "gr2": 0x0FA3, } var typeExtensions = map[uint16]string{ @@ -164,9 +172,17 @@ var typeExtensions = map[uint16]string{ 0x0812: "ptt", 0x0813: "ltr", 0x0815: "shd", + 0x0816: "mdb", 0x0818: "mtr", + 0x081C: "jpg", 0x081E: "lod", 0x083E: "png", + 0x0BB8: "lyt", + 0x0BB9: "vis", + 0x0BC0: "mdx", + 0x0BCC: "wlk", + 0x0BCD: "xml", + 0x0FA3: "gr2", } func init() { @@ -337,6 +353,10 @@ func ResourceTypeForExtension(extension string) (uint16, bool) { return resourceType, ok } +func HAKResourceTypeForExtension(extension string) (uint16, bool) { + return ResourceTypeForExtension(extension) +} + func ExtensionForResourceType(resourceType uint16) (string, bool) { extension, ok := typeExtensions[resourceType] return extension, ok diff --git a/internal/erf/erf_test.go b/internal/erf/erf_test.go index e9a2833..6e82b43 100644 --- a/internal/erf/erf_test.go +++ b/internal/erf/erf_test.go @@ -56,3 +56,44 @@ func TestExtensionMappingsKeep2DAAndTLKDistinct(t *testing.T) { t.Fatal("expected 2da and tlk resource types to stay distinct") } } + +func TestHAKResourceTypeForExtensionSupportsPNG(t *testing.T) { + if resourceType, ok := HAKResourceTypeForExtension("png"); !ok || resourceType != 0x083E { + t.Fatalf("expected png to stay valid for HAK generation, got ok=%v type=0x%04X", ok, resourceType) + } + if resourceType, ok := HAKResourceTypeForExtension("2da"); !ok || resourceType != 0x07E1 { + t.Fatalf("expected 2da to stay valid for HAK generation, got ok=%v type=0x%04X", ok, resourceType) + } +} + +func TestExtensionMappingsSupportModernAssetTypes(t *testing.T) { + cases := map[string]uint16{ + "mtr": 0x0818, + "shd": 0x0815, + "txi": 0x07E6, + "jpg": 0x081C, + "mdb": 0x0816, + "lyt": 0x0BB8, + "vis": 0x0BB9, + "mdx": 0x0BC0, + "xml": 0x0BCD, + "wlk": 0x0BCC, + "gr2": 0x0FA3, + } + for ext, wantType := range cases { + gotType, ok := ResourceTypeForExtension(ext) + if !ok { + t.Fatalf("expected %s to resolve to a resource type", ext) + } + if gotType != wantType { + t.Fatalf("expected %s type 0x%04X, got 0x%04X", ext, wantType, gotType) + } + gotExt, ok := ExtensionForResourceType(wantType) + if !ok { + t.Fatalf("expected type 0x%04X to resolve back to an extension", wantType) + } + if gotExt != ext { + t.Fatalf("expected type 0x%04X to resolve to %s, got %s", wantType, ext, gotExt) + } + } +} diff --git a/internal/pipeline/build.go b/internal/pipeline/build.go index edc8b9d..ad6d6c7 100644 --- a/internal/pipeline/build.go +++ b/internal/pipeline/build.go @@ -526,9 +526,9 @@ func resourceFromJSON(path string, moduleHakOrder []string) (erf.Resource, error func pathResource(path string) (erf.Resource, error) { extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".") - resourceType, ok := erf.ResourceTypeForExtension(extension) + resourceType, ok := erf.HAKResourceTypeForExtension(extension) if !ok { - return erf.Resource{}, fmt.Errorf("unsupported resource extension %q", filepath.Ext(path)) + return erf.Resource{}, fmt.Errorf("unsupported HAK resource extension %q", filepath.Ext(path)) } name := strings.ToLower(strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))) info, err := os.Stat(path) @@ -545,9 +545,9 @@ func pathResource(path string) (erf.Resource, error) { func rawResource(path string) (erf.Resource, error) { extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".") - resourceType, ok := erf.ResourceTypeForExtension(extension) + resourceType, ok := erf.HAKResourceTypeForExtension(extension) if !ok { - return erf.Resource{}, fmt.Errorf("unsupported resource extension %q", filepath.Ext(path)) + return erf.Resource{}, fmt.Errorf("unsupported HAK resource extension %q", filepath.Ext(path)) } name := strings.ToLower(strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))) data, err := os.ReadFile(path) diff --git a/internal/pipeline/pipeline_test.go b/internal/pipeline/pipeline_test.go index c7a1f1f..db6505a 100644 --- a/internal/pipeline/pipeline_test.go +++ b/internal/pipeline/pipeline_test.go @@ -473,7 +473,7 @@ func TestBuildBuildsTopPackageAndInjectsHAKList(t *testing.T) { "rows": [{"id": 0, "Label": "TEST_LABEL"}] } `) - mustWriteFile(t, filepath.Join(root, "topdata", "assets", "gui", "testicon.tga"), "icon-data") + mustWriteFile(t, filepath.Join(root, "topdata", "assets", "gui", "testicon.png"), "icon-data") p, err := project.Load(root) if err != nil { diff --git a/internal/project/project.go b/internal/project/project.go index ee2413c..af2e0bb 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -19,7 +19,7 @@ var SourceExtensions = []string{ } var AssetExtensions = []string{ - ".2da", ".bik", ".bmp", ".dds", ".dwk", ".itp", ".jpg", ".lod", ".lyt", ".mdl", ".mdx", ".mtr", ".plt", ".png", ".pwk", ".set", ".shd", ".tga", ".txi", ".uti", ".vis", ".wav", ".wok", + ".2da", ".bik", ".bmp", ".dds", ".dwk", ".gr2", ".itp", ".jpg", ".lod", ".lyt", ".mdb", ".mdl", ".mdx", ".mtr", ".plt", ".png", ".pwk", ".set", ".shd", ".tga", ".txi", ".uti", ".vis", ".wav", ".wlk", ".wok", ".xml", } type Project struct { diff --git a/internal/topdata/top_package.go b/internal/topdata/top_package.go index 2600050..375928b 100644 --- a/internal/topdata/top_package.go +++ b/internal/topdata/top_package.go @@ -156,9 +156,9 @@ func collectTopPackageResources(p *project.Project, compiled2DADir string) ([]er func topPackageResourceFromPath(path string) (erf.Resource, error) { extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".") - resourceType, ok := erf.ResourceTypeForExtension(extension) + resourceType, ok := erf.HAKResourceTypeForExtension(extension) if !ok { - return erf.Resource{}, fmt.Errorf("unsupported top package resource extension %q", filepath.Ext(path)) + return erf.Resource{}, fmt.Errorf("unsupported top package HAK resource extension %q", filepath.Ext(path)) } info, err := os.Stat(path) if err != nil { diff --git a/internal/topdata/topdata.go b/internal/topdata/topdata.go index a02257a..4aae042 100644 --- a/internal/topdata/topdata.go +++ b/internal/topdata/topdata.go @@ -988,11 +988,11 @@ func validateTopPackageAssets(sourceDir, dataDir string, report *ValidationRepor } base := strings.ToLower(strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))) ext := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".") - if _, ok := erf.ResourceTypeForExtension(ext); !ok { + if _, ok := erf.HAKResourceTypeForExtension(ext); !ok { report.Diagnostics = append(report.Diagnostics, Diagnostic{ Severity: SeverityError, Path: path, - Message: fmt.Sprintf("unsupported topdata asset resource extension %q", filepath.Ext(path)), + Message: fmt.Sprintf("unsupported topdata asset HAK resource extension %q", filepath.Ext(path)), }) return nil }