// Game: Modern Warfare 2 (IW4)
game IW4;

// Game Assets
asset PhysPreset ASSET_TYPE_PHYSPRESET;
asset PhysCollmap ASSET_TYPE_PHYSCOLLMAP;
asset XAnimParts ASSET_TYPE_XANIMPARTS;
asset XModel ASSET_TYPE_XMODEL;
asset Material ASSET_TYPE_MATERIAL;
asset MaterialPixelShader ASSET_TYPE_PIXELSHADER;
asset MaterialVertexShader ASSET_TYPE_VERTEXSHADER;
asset MaterialVertexDeclaration ASSET_TYPE_VERTEXDECL;
asset MaterialTechniqueSet ASSET_TYPE_TECHNIQUE_SET;
asset GfxImage ASSET_TYPE_IMAGE;
asset snd_alias_list_t ASSET_TYPE_SOUND;
asset SndCurve ASSET_TYPE_SOUND_CURVE;
asset LoadedSound ASSET_TYPE_LOADED_SOUND;
// asset clipMap_t ASSET_TYPE_CLIPMAP_MP;
// asset ComWorld ASSET_TYPE_COMWORLD;
// asset GameWorldSp ASSET_TYPE_GAMEWORLD_SP;
// asset GameWorldMp ASSET_TYPE_GAMEWORLD_MP;
// asset MapEnts ASSET_TYPE_MAP_ENTS;
// asset FxWorld ASSET_TYPE_FXWORLD;
// asset GfxWorld ASSET_TYPE_GFXWORLD;
// asset GfxLightDef ASSET_TYPE_LIGHT_DEF;
// asset Font_s ASSET_TYPE_FONT;
asset MenuList ASSET_TYPE_MENULIST;
asset menuDef_t ASSET_TYPE_MENU;
asset LocalizeEntry ASSET_TYPE_LOCALIZE_ENTRY;
// asset WeaponCompleteDef ASSET_TYPE_WEAPON;
// asset SndDriverGlobals ASSET_TYPE_SNDDRIVER_GLOBALS;
// asset FxEffectDef ASSET_TYPE_FX;
// asset FxImpactTable ASSET_TYPE_IMPACT_FX;
asset RawFile ASSET_TYPE_RAWFILE;
asset StringTable ASSET_TYPE_STRINGTABLE;
// asset LeaderboardDef ASSET_TYPE_LEADERBOARD;
// asset StructuredDataDefSet ASSET_TYPE_STRUCTURED_DATA_DEF;
// asset TracerDef ASSET_TYPE_TRACER;
// asset VehicleDef ASSET_TYPE_VEHICLE;
// asset AddonMapEnts ASSET_TYPE_ADDON_MAP_ENTS;

// Setup blocks
block temp    XFILE_BLOCK_TEMP              default;
block normal  XFILE_BLOCK_PHYSICAL;
block runtime XFILE_BLOCK_RUNTIME           default;
block normal  XFILE_BLOCK_VIRTUAL           default;
block normal  XFILE_BLOCK_LARGE;
block normal  XFILE_BLOCK_CALLBACK;
block normal  XFILE_BLOCK_VERTEX;
block normal  XFILE_BLOCK_INDEX;

// =========================================
// PhysPreset
// =========================================
use PhysPreset;
set string name;
set name name;
set string sndAliasPrefix;
block normal  XFILE_BLOCK_INDEX;

// =========================================
// PhysCollmap
// =========================================
use PhysCollmap;
set string name;
set name name;
set count geoms count;

// PhysGeomInfo
use PhysGeomInfo;
set count brushWrapper 1;

// BrushWrapper
use BrushWrapper;
set reusable planes;
set count planes brush::numsides;

// cbrushWrapper_t
use cbrushWrapper_t;
set count sides numsides;
set count baseAdjacentSide BrushWrapper::totalEdgeCount;

// cbrushside_t
use cbrushside_t;
set reusable plane;
set count plane 1;

// =========================================
// XAnimParts
// =========================================
use XAnimParts;
set string name;
set name name;
set scriptstring names;
set count names boneCount[9];
set count notify notifyCount;
set count deltaPart 1;
set count dataByte dataByteCount;
set count dataShort dataShortCount;
set count dataInt dataIntCount;
set count randomDataShort randomDataShortCount;
set count randomDataByte randomDataByteCount;
set count randomDataInt randomDataIntCount;
set count indices::_1 indexCount;
set count indices::_2 indexCount;
set condition indices::_1 numframes < 256;
set condition indices::data never;
reorder:
    name
    names
    notify
    deltaPart
    dataByte
    dataShort
    dataInt
    randomDataShort
    randomDataByte
    randomDataInt
    indices;

// XAnimNotifyInfo
set scriptstring XAnimNotifyInfo::name;

// XAnimDeltaPart
use XAnimDeltaPart;
set count trans 1;
set count quat2 1;
set count quat 1;

// XAnimPartTrans
use XAnimPartTrans;
set condition u::frames size > 0;
set condition u::frames::indices::_1 XAnimParts::numframes < 256;
set arraysize u::frames::indices::_1 size + 1;
set arraysize u::frames::indices::_2 size + 1;
set condition u::frames::frames::_1 smallTrans;
set count u::frames::frames::_1 size + 1;
set count u::frames::frames::_2 size + 1;

// XAnimPartTransFrames
reorder XAnimPartTransFrames:
    indices
    frames;

// XAnimDeltaPartQuat2
use XAnimDeltaPartQuat2;
set condition u::frames size > 0;
set condition u::frames::indices::_1 XAnimParts::numframes < 256;
set arraysize u::frames::indices::_1 size + 1;
set arraysize u::frames::indices::_2 size + 1;
set count u::frames::frames size + 1;

// XAnimDeltaPartQuatDataFrames2
reorder XAnimDeltaPartQuatDataFrames2:
    indices
    frames;

// XAnimDeltaPartQuat
use XAnimDeltaPartQuat;
set condition u::frames size > 0;
set condition u::frames::indices::_1 XAnimParts::numframes < 256;
set arraysize u::frames::indices::_1 size + 1;
set arraysize u::frames::indices::_2 size + 1;
set count u::frames::frames size + 1;

// XAnimDeltaPartQuatDataFrames
reorder XAnimDeltaPartQuatDataFrames:
    indices
    frames;

// =========================================
// XModel
// =========================================
use XModel;
set string name;
set name name;
set scriptstring boneNames;
set reusable boneNames;
set count boneNames numBones;
set reusable parentList;
set count parentList numBones - numRootBones;
set reusable quats;
set count quats numBones - numRootBones;
set reusable trans;
set count trans numBones - numRootBones;
set reusable partClassification;
set count partClassification numBones;
set reusable baseMat;
set count baseMat numBones;
set count materialHandles numsurfs;
set count collSurfs numCollSurfs;
set count boneInfo numBones;

// XModelLodInfo
use XModelLodInfo;
set block modelSurfs XFILE_BLOCK_TEMP;
set reusable modelSurfs;
set condition surfs never;

// XModelSurfs
use XModelSurfs;
set string name;
set count surfs XModelLodInfo::numsurfs; // No this is not a mistake. This is how the game does it.

// XSurface
use XSurface;
set reusable verts0;
set block verts0 XFILE_BLOCK_VERTEX;
set count verts0 vertCount;
set reusable vertList;
set count vertList vertListCount;
set reusable triIndices;
set block triIndices XFILE_BLOCK_INDEX;
set count triIndices triCount;
reorder:
    zoneHandle
    vertInfo
    verts0
    vertList
    triIndices;

// XSurfaceVertexInfo
use XSurfaceVertexInfo;
set reusable vertsBlend;
set count vertsBlend vertCount[0] 
						+ 3 * vertCount[1] 
						+ 5 * vertCount[2]
						+ 7 * vertCount[3];

// XRigidVertList
set reusable XRigidVertList::collisionTree;

// XSurfaceCollisionTree
use XSurfaceCollisionTree;
set count nodes nodeCount;
set count leafs leafCount;

// XModelCollSurf_s
set count XModelCollSurf_s::collTris numCollTris;

// =========================================
// Material
// =========================================
use Material;
set string info::name;
set name info::name;
set reusable textureTable;
set count textureTable textureCount;
set reusable constantTable;
set count constantTable constantCount;
set reusable stateBitsTable;
set count stateBitsTable stateBitsCount;

// MaterialTextureDef
use MaterialTextureDef;
set condition u::water semantic == TS_WATER_MAP;
set reusable u::water;

// water_t
use water_t;
set count H0 N * M;
set count wTerm N * M;

// =========================================
// MaterialTechniqueSet
// =========================================
use MaterialTechniqueSet;
set string name;
set name name;
set condition remappedTechniqueSet never;
set reusable techniques;

// MaterialTechnique
use MaterialTechnique;
set string name;
set arraysize passArray passCount;
reorder:
    passArray
    name;

// MaterialPass
use MaterialPass;
set count args perPrimArgCount + perObjArgCount + stableArgCount;

// MaterialShaderArgument
use MaterialShaderArgument;
set condition u::literalConst type == MTL_ARG_LITERAL_VERTEX_CONST 
|| type == MTL_ARG_LITERAL_PIXEL_CONST;
set reusable u::literalConst;

// =========================================
// MaterialVertexDeclaration
// =========================================
use MaterialVertexDeclaration;
set string name;
set name name;

// MaterialVertexStreamRouting
set condition MaterialVertexStreamRouting::decl never;

// =========================================
// MaterialVertexShader
// =========================================
use MaterialVertexShader;
set string name;
set name name;

// GfxVertexShaderLoadDef
set count GfxVertexShaderLoadDef::program programSize;

// MaterialVertexShaderProgram
set condition MaterialVertexShaderProgram::vs never;

// =========================================
// MaterialPixelShader
// =========================================
use MaterialPixelShader;
set string name;
set name name;

// GfxPixelShaderLoadDef
set count GfxPixelShaderLoadDef::program programSize;

// MaterialPixelShaderProgram
set condition MaterialPixelShaderProgram::ps never;

// =========================================
// GfxImage
// =========================================
use GfxImage;
set action OnImageLoaded(GfxImage);
set string name;
set name name;
reorder:
    name
    texture;

// GfxTexture
use GfxTexture;
set reusable loadDef;
set block loadDef XFILE_BLOCK_TEMP;
set condition texture never;

// GfxImageLoadDef
use GfxImageLoadDef;
set action LoadImageData(GfxImageLoadDef, GfxImage);
set arraysize data resourceSize;

// =========================================
// snd_alias_list_t
// =========================================
use snd_alias_list_t;
set string aliasName;
set name aliasName;
set reusable head;
set count head count;

// snd_alias_t
use snd_alias_t;
set string aliasName;
set string subtitle;
set string secondaryAliasName;
set string chainAliasName;
set string mixerGroup;
set reusable soundFile;
set reusable speakerMap;

// SoundFile
set condition SoundFile::u::loadSnd type == SAT_LOADED;

// SpeakerMap
set string SpeakerMap::name;

// StreamedSound
use StreamedSound;
set string dir;
set string name;

// =========================================
// SndCurve
// =========================================
use SndCurve;
set string filename;
set name filename;

// =========================================
// LoadedSound
// =========================================
use LoadedSound;
set string name;
set name name;

// MssSound
use MssSound;
set block data XFILE_BLOCK_TEMP;
set reusable data;
set count data info::data_len;
set condition info::data_ptr never;
set condition info::initial_ptr never;
set action SetSoundData(MssSound);

// =========================================
// LocalizeEntry
// =========================================
use LocalizeEntry;
set string name;
set name name;
set string value;

// =========================================
// MenuList
// =========================================
use MenuList;
set string name;
set name name;
set count menus menuCount;

// =========================================
// menuDef_t
// =========================================
use menuDef_t;
set string window::name;
set name window::name;
set string font;
set reusable visibleExp;
set string allowedBinding;
set string soundName;
set reusable rectXExp;
set reusable rectYExp;
set reusable rectWExp;
set reusable rectHExp;
set reusable openSoundExp;
set reusable closeSoundExp;
set count items itemCount;
set reusable expressionData;
reorder:
    expressionData
    window
    font
    onOpen
    onClose
    onCloseRequest
    onESC
    onKey
    visibleExp
    allowedBinding
    soundName
    rectXExp
    rectYExp
    rectWExp
    rectHExp
    openSoundExp
    closeSoundExp
    items;

// windowDef_t
use windowDef_t;
set string name;
set string group;

// MenuEventHandlerSet
set count MenuEventHandlerSet::eventHandlers eventHandlerCount;

// MenuEventHandler
use MenuEventHandler;
set string eventData::unconditionalScript;
set condition eventData::unconditionalScript eventType == EVENT_UNCONDITIONAL;
set condition eventData::conditionalScript eventType == EVENT_IF;
set condition eventData::elseScript eventType == EVENT_ELSE;
set condition eventData::setLocalVarData eventType == EVENT_SET_LOCAL_VAR_BOOL
    || eventType == EVENT_SET_LOCAL_VAR_INT
    || eventType == EVENT_SET_LOCAL_VAR_FLOAT
    || eventType == EVENT_SET_LOCAL_VAR_STRING;

// ConditionalScript
use ConditionalScript;
set reusable eventExpression;
reorder:
    eventExpression
    eventHandlerSet;

// SetLocalVarData
use SetLocalVarData;
set string localVarName;
set reusable expression;

// Statement_s
use Statement_s;
set count entries numEntries;
set reusable supportingData;
set condition lastResult never;

// expressionEntry
set condition expressionEntry::data::operand type == EET_OPERAND;

// Operand
use Operand;
set reusable internals::function;
set condition internals::intVal dataType == VAL_INT;
set condition internals::floatVal dataType == VAL_FLOAT;
set condition internals::stringVal dataType == VAL_STRING;
set condition internals::function dataType == VAL_FUNCTION;

// ExpressionString
set string ExpressionString::string;

// itemDef_s
use itemDef_s;
set string text;
set condition parent never;
set string dvar;
set string dvarTest;
set string enableDvar;
set string localVar;
set count floatExpressions floatExpressionCount;
set reusable visibleExp;
set reusable disabledExp;
set reusable textExp;
set reusable materialExp;

// itemDefData_t
use itemDefData_t;
set string enumDvarName;
set condition data never;
set condition listBox itemDef_s::type == 6;
set condition editField itemDef_s::type == 0
    || itemDef_s::type == 4
    || itemDef_s::type == 9
    || itemDef_s::type == 10
    || itemDef_s::type == 11
    || itemDef_s::type == 14
    || itemDef_s::type == 16
    || itemDef_s::type == 17
    || itemDef_s::type == 18
    || itemDef_s::type == 22
    || itemDef_s::type == 23;
set condition multi itemDef_s::type == 12;
set condition enumDvarName itemDef_s::type == 13;
set condition ticker itemDef_s::type == 20;
set condition scroll itemDef_s::type == 21;

// multiDef_s
use multiDef_s;
set string dvarList;
set string dvarStr;

// ItemFloatExpression
set reusable ItemFloatExpression::expression;

// UIFunctionList
use UIFunctionList;
set count functions totalFunctions;
set reusable functions; // This statement makes both the array of pointers and the pointers in the array reusable. only the second one is correct however this shouldn't be a problem with vanilla fastfiles.

// StaticDvarList
set count StaticDvarList::staticDvars numStaticDvars;

// StaticDvar
use StaticDvar;
set condition dvar never;
set string dvarName;

// StringList
use StringList;
set count strings totalStrings;
set string strings;

// =========================================
// RawFile
// =========================================
use RawFile;
set string name;
set name name;
set condition data::compressedBuffer compressedLen > 0;
set count data::compressedBuffer compressedLen;
set count data::buffer len + 1;

// =========================================
// StringTable
// =========================================
use StringTable;
set string name;
set name name;
set count values columnCount * rowCount;

// StringTableCell
set string StringTableCell::string;

// EOF