type fastfile [root, display="Fast File"] byteorder LE { criteria { // Simplified: just check file extension for now require _ext == "ff"; } // Read header bytes needed for detection company_s = ascii(bytesat(0, 2)); filetype_s = ascii(bytesat(2, 2)); signage_s = ascii(bytesat(4, 1)); magic_s = ascii(bytesat(5, 3)); version_i = u32at(8); // Detect game based on header signature detected_game = "UNKNOWN"; if (company_s == "IW" && filetype_s == "ff") { detected_game = "COD4"; } if (company_s == "Ta" && filetype_s == "ff") { detected_game = "COD8"; } // Read platform field (byte 12-16) platform_u32 = u32at(12); // Detect platform based on version and platform field detected_platform = "UNKNOWN"; if (version_i == 5) { detected_platform = "PC"; } if (version_i == 6) { detected_platform = "XBOX360"; } if (version_i == 12) { detected_platform = "PS3"; } if (version_i == 14) { detected_platform = "WII"; } if (version_i > 276 && version_i < 1000) { if (platform_u32 == 0) { detected_platform = "PC"; } if (platform_u32 == 1) { detected_platform = "XBOX360"; } if (platform_u32 == 2) { detected_platform = "PS3"; } if (platform_u32 == 3) { detected_platform = "WII"; } if (platform_u32 == 4) { detected_platform = "WIIU"; } } // Set globals early so they're available for all parsing set_global("game", detected_game); set_global("platform", detected_platform); set_global("version", version_i); set_global("company", company_s); // ---- UI fields ---- company_s = company_s [ui, readonly, display="Company"]; filetype_s = filetype_s [ui, readonly, display="File Type"]; is_unsigned = (signage_s == "u") [ui, readonly, display="Is Unsigned"]; magic_s = magic_s [ui, readonly, display="Magic"]; version_i = version_i [ui, readonly, display="Version"]; game_s = detected_game [ui, readonly, display="Game"]; platform_s = detected_platform [ui, readonly, display="Platform"]; platform_u32 = platform_u32 [ui, readonly, display="Platform ID"]; if (version_i == 5) { byteorder LE; } else { byteorder BE; } seek(0); u16 company_u16; u16 file_type_u16; u8 u_char; u8 v1; u8 v0a; u8 v0b; u32 platform_u32; // Read and decompress zone file compressed_zone = read(EOF); decompressed_zone = compressed_zone |> zlib; // Export decompressed zone file FIRST (before parsing) write_file(_basename + ".zone", decompressed_zone); // Then parse the zone structure zonefile = decompressed_zone |> parse zonefile; }