XPlor/definitions/cod/fastfile.xscript
njohnson 0fa26e5256 Expand Call of Duty XScript definitions
Add new asset type definitions:
- GfxWorld and related structures (cells, lights, probes)
- Menu system (menudef, itemdef, windowdef, listboxdef)
- Sound system (soundalias, soundfile, speakermap, sndcurve)
- D3D resources (vertex/index buffers)
- Font glyphs and expression entries

Update existing definitions with improved field annotations
and UI display properties.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 16:36:40 -05:00

106 lines
2.6 KiB
Plaintext

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;
}