using System; using System.Collections.Generic; using System.IO; using System.Linq; using AcDream.Bake; // acdream-bake: offline CLI producing a versioned pak file containing every // ObjectMeshData the client's decode workers would otherwise produce at // runtime (GfxObj / Setup / EnvCell mesh+texture payloads). // // Thin arg-parsing shell over BakeRunner (the real pipeline lives there so // the dat-gated byte-reproducibility test can drive it directly). // // Plan: docs/superpowers/plans/2026-07-05-mp1b-pak-and-bake.md, Task 5. string? datDir = null; string? outPath = null; HashSet? idFilter = null; HashSet? landblockFilter = null; int threads = Environment.ProcessorCount; for (int i = 0; i < args.Length; i++) { switch (args[i]) { case "--dat-dir": datDir = args.ElementAtOrDefault(++i); break; case "--out": outPath = args.ElementAtOrDefault(++i); break; case "--ids": idFilter = ParseHexList(args.ElementAtOrDefault(++i)); break; case "--landblocks": landblockFilter = ParseHexList(args.ElementAtOrDefault(++i)); break; case "--threads": if (int.TryParse(args.ElementAtOrDefault(++i), out var t) && t > 0) threads = t; break; default: Console.Error.WriteLine($"unrecognized argument: {args[i]}"); return 2; } } if (string.IsNullOrWhiteSpace(datDir)) { Console.Error.WriteLine("usage: acdream-bake --dat-dir [--out ] [--ids 0xId,0xId,...] [--landblocks 0xId,...] [--threads ]"); return 2; } if (!Directory.Exists(datDir)) { Console.Error.WriteLine($"error: directory not found: {datDir}"); return 2; } outPath ??= Path.Combine(datDir, "acdream.pak"); return BakeRunner.Run(new BakeOptions { DatDir = datDir, OutPath = outPath, IdFilter = idFilter, LandblockFilter = landblockFilter, Threads = threads, }); static HashSet ParseHexList(string? raw) { var result = new HashSet(); if (string.IsNullOrWhiteSpace(raw)) return result; foreach (var token in raw.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) { var hex = token.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? token[2..] : token; if (uint.TryParse(hex, System.Globalization.NumberStyles.HexNumber, null, out var value)) { result.Add(value); } else { Console.Error.WriteLine($"warning: could not parse id '{token}' — skipped"); } } return result; }