package main import ( "flag" "fmt" "log" "path/filepath" "ur.gs/chaos-gate/internal/data" "ur.gs/chaos-gate/internal/maps" ) var ( gamePath = flag.String("game-path", "./orig", "Path to a WH40K: Chaos Gate installation") ) func main() { flag.Parse() loadData() loadObj() loadMapsFrom("Maps") loadMapsFrom("MultiMaps") } func loadData() { dataPath := filepath.Join(*gamePath, "Data") accountingPath := filepath.Join(dataPath, "Accounting.dat") genericDataPath := filepath.Join(dataPath, "GenericData.dat") aniObDefPath := filepath.Join(dataPath, "AniObDef.dat") log.Printf("Loading %s...", accountingPath) accounting, err := data.LoadAccounting(accountingPath) if err != nil { log.Fatalf("Failed to parse %s: %s", accountingPath, err) } log.Printf("%s: %+v", accountingPath, accounting) log.Printf("Loading %s...", aniObDefPath) animated, err := data.LoadAnimatedObjectDefinitions(aniObDefPath) if err != nil { log.Fatalf("Failed to parse %s: %s", genericDataPath, err) } log.Printf("%s: %+v", aniObDefPath, animated) log.Printf("Loading %s...", genericDataPath) genericData, err := data.LoadGeneric(genericDataPath) if err != nil { log.Fatalf("Failed to parse %s: %s", genericDataPath, err) } log.Printf("%s: %+v", genericDataPath, genericData) } func loadObj() { objDataPath := filepath.Join(*gamePath, "Obj") // TODO: Obj/cpiece.rec isn't loaded by this. Do we need it? How do we know? log.Printf("Loading %s...", objDataPath) objects, err := data.LoadObjects(objDataPath) if err != nil { log.Fatalf("Failed to parse %s: %s", objDataPath, err) } inspect := "c_webs" inspect_obj := inspect + ".obj" log.Printf("Objects in %s:", objDataPath) for key, obj := range objects { if key != inspect_obj { continue } log.Printf( "\t%s\t%d frames\t%d bytes", key, obj.ObjectHeader.NumFrames, obj.ObjectHeader.FrameDataSize, ) } log.Printf("%s: %#v", inspect, objects[inspect_obj]) for i, frame := range objects[inspect_obj].Frames { numPixels := frame.Width * frame.Height log.Printf("frame %d: w=%d h=%d sz=%d w*h=%d bpp=%v", i, frame.Width, frame.Height, frame.PixelSize, numPixels, float64(frame.PixelSize)/float64(numPixels)) } } func loadMapsFrom(part string) { mapsPath := filepath.Join(*gamePath, part) log.Printf("Loading maps from %s", mapsPath) gameMaps, err := maps.LoadGameMaps(mapsPath) if err != nil { log.Fatalf("Failed to parse %s/*.{MAP,txt} as game maps: %v", mapsPath, err) } log.Printf("Maps in %s:", mapsPath) for key, gameMap := range gameMaps { hdr := gameMap.Header fmt.Printf( " * `%s`: IsCampaignMap=%v W=%v:%v L=%v:%v SetName=%s\n", key, hdr.IsCampaignMap, hdr.MinWidth, hdr.MaxWidth, hdr.MinLength, hdr.MaxLength, string(hdr.SetName[:]), ) } }