diff --git a/internal/app/app.go b/internal/app/app.go index 99ec2ca..6010b31 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -300,7 +300,8 @@ func runExtract(ctx context) error { return err } - result, err := pipeline.Extract(p) + files := ctx.args[1:] + result, err := pipeline.Extract(p, files...) if err != nil { return err } diff --git a/internal/pipeline/extract.go b/internal/pipeline/extract.go index a752e68..673e1e7 100644 --- a/internal/pipeline/extract.go +++ b/internal/pipeline/extract.go @@ -24,29 +24,37 @@ type ExtractResult struct { Skipped int } -func Extract(p *project.Project) (ExtractResult, error) { - modulePath := filepath.Join(p.BuildDir(), p.Config.Module.ResRef+".mod") - input, err := os.Open(modulePath) - if err != nil { - return ExtractResult{}, fmt.Errorf("open module archive: %w", err) - } - defer input.Close() - - archive, err := erf.Read(input) - if err != nil { - return ExtractResult{}, fmt.Errorf("read module archive: %w", err) - } - +func Extract(p *project.Project, files ...string) (ExtractResult, error) { var result ExtractResult - result.ModulePath = modulePath var failures []error desired := map[string]struct{}{} - written, overwritten, skipped, errs := extractArchiveResources(p, archive, desired) - result.Written += written - result.Overwritten += overwritten - result.Skipped += skipped - failures = append(failures, errs...) + allowed := make(map[string]bool) + for _, f := range files { + allowed[f] = true + } + + shouldExtractMod := len(allowed) == 0 || allowed[p.Config.Module.ResRef+".mod"] + if shouldExtractMod { + modulePath := filepath.Join(p.BuildDir(), p.Config.Module.ResRef+".mod") + input, err := os.Open(modulePath) + if err != nil { + return ExtractResult{}, fmt.Errorf("open module archive: %w", err) + } + defer input.Close() + + archive, err := erf.Read(input) + if err != nil { + return ExtractResult{}, fmt.Errorf("read module archive: %w", err) + } + + result.ModulePath = modulePath + written, overwritten, skipped, errs := extractArchiveResources(p, archive, desired) + result.Written += written + result.Overwritten += overwritten + result.Skipped += skipped + failures = append(failures, errs...) + } hakPaths, err := filepath.Glob(filepath.Join(p.BuildDir(), "*.hak")) if err != nil { @@ -54,6 +62,11 @@ func Extract(p *project.Project) (ExtractResult, error) { } slices.Sort(hakPaths) for _, hakPath := range hakPaths { + filename := filepath.Base(hakPath) + if len(allowed) > 0 && !allowed[filename] { + continue + } + input, err := os.Open(hakPath) if err != nil { failures = append(failures, fmt.Errorf("open hak archive %s: %w", hakPath, err)) diff --git a/nwn-tool b/nwn-tool index 4134cc6..15e2f5c 100755 Binary files a/nwn-tool and b/nwn-tool differ