Menu Asset (MW3): Difference between revisions

From COD Engine Research
Created page with "__NOTOC__ Category:Assets Category:MW3 <source lang="cpp"> struct expression_s; struct statement_s; struct localVar_t { int dvar; char *dvarName; }; struct localDa..."
 
No edit summary
 
(6 intermediate revisions by 3 users not shown)
Line 2: Line 2:
[[Category:Assets]]
[[Category:Assets]]
[[Category:MW3]]
[[Category:MW3]]
[[Category:Ghosts]]
This asset remains to share almost the exact same structure on Ghosts and Advanced Warfare most likely because they both now use lua files for their user interface instead.
<source lang="cpp">
<source lang="cpp">
struct expression_s;
struct MenuEventHandlerSet;
struct statement_s;
struct Statement_s;


struct localVar_t
struct UIFunctionList
{
{
int dvar;
  int totalFunctions;
char *dvarName;
  Statement_s **functions;
};
};


struct localData_t
struct StaticDvar
{
{
int numExpressions;
  dvar_t *dvar;
expression_s **expressions;
  char *dvarName;
int numStaticVars;
localVar_t **staticVars;
int numStrings;
char **strings;
};
};


enum expDataType
struct StaticDvarList
{
{
VAL_INT = 0x0,
  int numStaticDvars;
VAL_FLOAT = 0x1,
  StaticDvar **staticDvars;
VAL_STRING = 0x2,
VAL_EXPRESSION = 0x3,
};
};


struct OperationStruct
struct StringList
{
{
operationEnum op;
  int totalStrings;
int unknown;
  const char **strings;
};
};


union operandInternalDataUnion
struct ExpressionSupportingData
{
{
int intVal;
  UIFunctionList uifunctions;
float floatVal;
  StaticDvarList staticDvarList;
const char *string;
  StringList uiStrings;
expression_s *expression;
};
};


enum expDataType
{
  VAL_INT = 0x0,
  VAL_FLOAT = 0x1,
  VAL_STRING = 0x2,
  NUM_INTERNAL_DATATYPES = 0x3,
  VAL_FUNCTION = 0x3,
  NUM_DATATYPES = 0x4,
};
struct ExpressionString
{
  const char *string;
};
union operandInternalDataUnion
{
  int intVal;
  float floatVal;
  ExpressionString stringVal;
  Statement_s *function;
};
#pragma pack(push, 1)
struct Operand
struct Operand
{
{
#if !defined(IW6) && !defined(S1) //Not Ghosts and Not AW
expDataType dataType;
expDataType dataType;
#endif
operandInternalDataUnion internals;
operandInternalDataUnion internals;
#if defined(IW6) || defined(S1) // Ghosts or AW
expDataType dataType;
#endif
};
};
#pragma pack(pop)


struct entryInternalData
union entryInternalData
{
{
OperationStruct op;
  operationEnum op;
Operand operand;
  Operand operand;
};
};


struct expressionEntry
struct expressionEntry
{
{
int type;
#if !defined(IW6) && !defined(S1) //Not Ghosts and Not AW
entryInternalData data;
  int type;
#endif
  entryInternalData data;
#if defined(IW6) || defined(S1) // Ghosts or Advanced Warfare
  int type;
#endif
};
};


struct expression_s // 0x50
struct ExpressionPersistentState
{
{
int numEntries;
  int flags;
expressionEntry *entries;
  int playerDataKey[4];
localData_t *loadFrom;
  int lastExecuteTime[4];
char unknown[0x44]; // ?
  Operand lastResult[4];
};
};


struct dvarExpression_t
struct Statement_s
{
{
char *dvarName;
  int numEntries;
expression_s *expression;
  expressionEntry *entries;
  ExpressionSupportingData *supportingData;
  ExpressionPersistentState persistentState;
};
};


struct statementExpression_t
struct SetLocalVarData
{
{
statement_s *statement;
  const char *localVarName;
expression_s *expression; // loads this first
  Statement_s *expression;
};
};


union statementInternalDataUnion // 4
struct ConditionalScript
{
{
char *data;
  MenuEventHandlerSet *eventHandlerSet;
statementExpression_t *statementExpression;
  Statement_s *eventExpression; // loads this first
statement_s *statement;
};
dvarExpression_t *dvarExpression;
 
union EventData
{
  const char *unconditionalScript;
  ConditionalScript *conditionalScript;
  MenuEventHandlerSet *elseScript;
  SetLocalVarData *setLocalVarData;
};
};


#pragma pack(push, 4)
#pragma pack(push, 4)
struct statementEntry // 8
struct MenuEventHandler
{
{
statementInternalDataUnion data;
  EventData eventData;
char type;
  char eventType;
};
};
#pragma pack(pop)
#pragma pack(pop)


struct statement_s // 8
struct MenuEventHandlerSet
{
{
int numEntries;
  int eventHandlerCount;
statementEntry **entry;
  MenuEventHandler **eventHandlers;
};
};


struct ItemKeyHandler
struct ItemKeyHandler
{
{
int key;
  int key;
statement_s *action;
  MenuEventHandlerSet *action;
ItemKeyHandler *next;
  ItemKeyHandler *next;
};
};


Line 114: Line 152:
struct rectDef_s
struct rectDef_s
{
{
float x;
  float x;
float y;
  float y;
float w;
  float w;
float h;
  float h;
char horzAlign;
  char horzAlign;
char vertAlign;
  char vertAlign;
};
};
#pragma pack(pop)
#pragma pack(pop)
typedef rectDef_s Rectangle;


// sizeof = 0xB0
// sizeof = 0xB0
struct windowDef_t
struct windowDef_t
{
{
const char *name; // 0x00
  const char *name;
Rectangle rect;
  rectDef_s rect;
Rectangle rectClient;
  rectDef_s rectClient;
char *group; // 0x2C
  const char *group;
int style;
  int style;
int border;
  int border;
int ownerDraw;
  int ownerDraw;
int ownerDrawFlags;
  int ownerDrawFlags;
float borderSize;
  float borderSize;
int staticFlags;
  int staticFlags;
int dynamicFlags[4];
#ifdef PC
int nextTime;
  int dynamicFlags[1];
vec4_t foreColor;
#else
vec4_t backColor;
  int dynamicFlags[4];
vec4_t borderColor;
#endif
vec4_t outlineColor;
  int nextTime;
vec4_t disableColor;
  float foreColor[4];
Material *background; // 0xAC
  float backColor[4];
  float borderColor[4];
  float outlineColor[4];
  float disableColor[4];
  Material *background;
};
 
enum ItemFloatExpressionTarget
{
  ITEM_FLOATEXP_TGT_RECT_X = 0x0,
  ITEM_FLOATEXP_TGT_RECT_Y = 0x1,
  ITEM_FLOATEXP_TGT_RECT_W = 0x2,
  ITEM_FLOATEXP_TGT_RECT_H = 0x3,
  ITEM_FLOATEXP_TGT_FORECOLOR_R = 0x4,
  ITEM_FLOATEXP_TGT_FORECOLOR_G = 0x5,
  ITEM_FLOATEXP_TGT_FORECOLOR_B = 0x6,
  ITEM_FLOATEXP_TGT_FORECOLOR_RGB = 0x7,
  ITEM_FLOATEXP_TGT_FORECOLOR_A = 0x8,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_R = 0x9,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_G = 0xA,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_B = 0xB,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_RGB = 0xC,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_A = 0xD,
  ITEM_FLOATEXP_TGT_BACKCOLOR_R = 0xE,
  ITEM_FLOATEXP_TGT_BACKCOLOR_G = 0xF,
  ITEM_FLOATEXP_TGT_BACKCOLOR_B = 0x10,
  ITEM_FLOATEXP_TGT_BACKCOLOR_RGB = 0x11,
  ITEM_FLOATEXP_TGT_BACKCOLOR_A = 0x12,
  ITEM_FLOATEXP_TGT__COUNT = 0x13,
};
};


struct component_t
struct ItemFloatExpression
{
{
int type;
  ItemFloatExpressionTarget target;
expression_s *expressions;
  Statement_s *expression;
};
};


struct editFieldDef_s  
struct editFieldDef_s
{
{
float minVal;
  float minVal;
float maxVal;
  float maxVal;
float defVal;
  float stepVal;
float range;
  float range;
int maxChars;
  int maxChars;
int maxCharsGotoNext;
  int maxCharsGotoNext;
int maxPaintChars;
  int maxPaintChars;
int paintOffset;
  int paintOffset;
};
};


struct multiDef_s // 0x188
struct multiDef_s
{
{
const char *dvarList[32];
  const char *dvarList[32];
const char *dvarStr[32];
  const char *dvarStr[32];
float dvarValue[32];
  float dvarValue[32];
int count;  
  int count;
int strDef;
  int strDef;
};
};


struct listBoxDef_s // 0x1DC
struct columnInfo_s
{
{
char unknown1[0x1B4];
  int xpos;
statement_s *doubleClick;
  int ypos;
char unknown2[0x1C];
  int width;
Material *selectIcon;
  int height;
expression_s *expression;
  int maxChars;
  int alignment;
};
};


struct newsTicker_s
// TODO: 4 bytes missing somewhere
struct listBoxDef_s
{
{
int textSource;
#ifdef PC
int speed;
  int startPos[1];
int spacing;
  int endPos[1];
#else
  int startPos[4];
  int endPos[4];
#endif
  int drawPadding;
  float elementWidth;
  float elementHeight;
  int elementStyle;
  int numColumns;
  columnInfo_s columnInfo[16];
  MenuEventHandlerSet *onDoubleClick;
  int notselectable;
  int noScrollBars;
  int usePaging;
  float selectBorder[4];
  Material *selectIcon;
  Statement_s *elementHeightExp;
};
 
struct newsTickerDef_s
{
  int feedId;
  int speed;
  int spacing;
};
 
struct textScrollDef_s
{
  int startTime;
};
};


union itemDefData_t
union itemDefData_t
{
{
listBoxDef_s *listBox;
  listBoxDef_s *listBox;
editFieldDef_s *editField;
  editFieldDef_s *editField;
newsTicker_s *newsTicker;
  multiDef_s *multi;
multiDef_s *multiDef;
  const char *enumDvarName;
const char *enumDvarName;
  newsTickerDef_s *ticker;
int *textScroll;
  textScrollDef_s *scroll;
void *data;
  void *data;
};
 
struct itemDef_t
{
  windowDef_t window;
#ifdef PC
  rectDef_s textRect[1];
#else
  rectDef_s textRect[4];
#endif
  int type;
  int dataType;
  int alignment;
  int fontEnum;
  int textAlignMode;
  float textalignx;
  float textaligny;
  float textscale;
  int textStyle;
  int gameMsgWindowIndex;
  int gameMsgWindowMode;
  const char *text;
  int itemFlags;
  menuDef_t *parent;
  MenuEventHandlerSet *mouseEnterText;
  MenuEventHandlerSet *mouseExitText;
  MenuEventHandlerSet *mouseEnter;
  MenuEventHandlerSet *mouseExit;
  MenuEventHandlerSet *action;
  MenuEventHandlerSet *accept;
  MenuEventHandlerSet *onFocus;
  MenuEventHandlerSet *hasFocus;
  MenuEventHandlerSet *leaveFocus;
  const char *dvar;
  const char *dvarTest;
  ItemKeyHandler *onKey;
  const char *enableDvar;
  const char *localVar;
  int dvarFlags;
  snd_alias_list_t *focusSound;
  float special;
#ifdef PC
  int cursorPos[1];
#else
  int cursorPos[4];
#endif
  itemDefData_t typeData;
  int floatExpressionCount;
  ItemFloatExpression *floatExpressions;
  Statement_s *visibleExp;
  Statement_s *disabledExp;
  Statement_s *textExp;
  Statement_s *materialExp;
  float glowColor[4];
  bool decayActive;
  int fxBirthTime;
  int fxLetterTime;
  int fxDecayStartTime;
  int fxDecayDuration;
  int lastSoundPlayedTime;
  Statement_s *textAlignYExp;
};
};


struct itemDef_t // 0x1D4
struct menuTransition
{
{
windowDef_t window;
  int transitionType;
const char *text;
  int startTime;
int textSaveGameInfo;
  float startVal;
menuDef_t *parent;
  float endVal;
statement_s *mouseEnterText;
  float time;
statement_s *mouseExitText;
  int endTriggerType;
statement_s *mouseEnter;
statement_s *mouseExit;
statement_s *action;
statement_s *accept;
statement_s *onFocus;
statement_s *leaveFocus;
statement_s *unknown9;
const char *dvar;
const char *dvarTest;
ItemKeyHandler *onKey;
const char *unknown12;
const char *unknown13;
int dvarFlags;
snd_alias_list_t *focusSound;
float special;
int cursorPos[4];
itemDefData_t typeData;
int numComponents;
component_t *components;
expression_s *visibleExp;
expression_s *disabledExp;
expression_s *textExp;
expression_s *materialExp;
char unknown[0x28];
expression_s *unknown24;
};
};


// sizeof = 0x200
struct menuData_t
struct menuData_t  
{
{
int fullscreen;
  int fullScreen;
int fadeCycle;
  int fadeCycle;
float fadeClamp;
  float fadeClamp;
float fadeAmount;
  float fadeAmount;
float fadeInAmount;
  float fadeInAmount;
float blurRadius;
  float blurRadius;
statement_s *onOpen;
  MenuEventHandlerSet *onOpen;
statement_s *onRequestClose; // loaded after onClose?
  MenuEventHandlerSet *onCloseRequest;
statement_s *onClose;
  MenuEventHandlerSet *onClose;
statement_s *onEsc;
  MenuEventHandlerSet *onESC;
statement_s *unknown5;
  MenuEventHandlerSet *onFocusDueToClose;
ItemKeyHandler *onKey;
  ItemKeyHandler *onKey;
expression_s *visibleExp;
  Statement_s *visibleExp;
const char *allowedBinding;
  const char *allowedBinding;
const char *soundName;
  const char *soundName;
vec4_t focusColor;
  float focusColor[4];
expression_s *unknown6;
  Statement_s *rectXExp;
expression_s *unknown7;
  Statement_s *rectYExp;
expression_s *unknown8;
  Statement_s *rectWExp;
expression_s *unknown9;
  Statement_s *rectHExp;
expression_s *unknown10;
  Statement_s *openSoundExp;
expression_s *unknown11;
  Statement_s *closeSoundExp;
expression_s *unknown12;
  Statement_s *soundLoopExp;
int cursorItems[4];
#ifdef PC
localData_t *localData; // loaded first
  int cursorItem[1];
#else
  int cursorItem[4];
#endif
  menuTransition scaleTransition[1];
  menuTransition alphaTransition[1];
  menuTransition xTransition[1];
  menuTransition yTransition[1];
  ExpressionSupportingData *expressionData;
  char priority;
};
};


// sizeof = 0xBC
struct menuDef_t
struct menuDef_t  
{
{
menuData_t *menuStruct;
  menuData_t *data;
windowDef_t window;
  windowDef_t window;
int itemCount;
  int itemCount;
itemDef_t **items;
  itemDef_t **items;
};
};
</source>
</source>

Latest revision as of 01:15, 22 January 2015

This asset remains to share almost the exact same structure on Ghosts and Advanced Warfare most likely because they both now use lua files for their user interface instead.

struct MenuEventHandlerSet;
struct Statement_s;

struct UIFunctionList
{
  int totalFunctions;
  Statement_s **functions;
};

struct StaticDvar
{
  dvar_t *dvar;
  char *dvarName;
};

struct StaticDvarList
{
  int numStaticDvars;
  StaticDvar **staticDvars;
};

struct StringList
{
  int totalStrings;
  const char **strings;
};

struct ExpressionSupportingData
{
  UIFunctionList uifunctions;
  StaticDvarList staticDvarList;
  StringList uiStrings;
};

enum expDataType
{
  VAL_INT = 0x0,
  VAL_FLOAT = 0x1,
  VAL_STRING = 0x2,
  NUM_INTERNAL_DATATYPES = 0x3,
  VAL_FUNCTION = 0x3,
  NUM_DATATYPES = 0x4,
};

struct ExpressionString
{
  const char *string;
};

union operandInternalDataUnion
{
  int intVal;
  float floatVal;
  ExpressionString stringVal;
  Statement_s *function;
};

#pragma pack(push, 1)
struct Operand
{
#if !defined(IW6) && !defined(S1) //Not Ghosts and Not AW
	expDataType dataType;
#endif
	operandInternalDataUnion internals;
#if defined(IW6) || defined(S1) // Ghosts or AW
	expDataType dataType;
#endif
};
#pragma pack(pop)

union entryInternalData
{
  operationEnum op;
  Operand operand;
};

struct expressionEntry
{
#if !defined(IW6) && !defined(S1) //Not Ghosts and Not AW
  int type;
#endif
  entryInternalData data;
#if defined(IW6) || defined(S1) // Ghosts or Advanced Warfare
  int type;
#endif
};

struct ExpressionPersistentState
{
  int flags;
  int playerDataKey[4];
  int lastExecuteTime[4];
  Operand lastResult[4];
};

struct Statement_s
{
  int numEntries;
  expressionEntry *entries;
  ExpressionSupportingData *supportingData;
  ExpressionPersistentState persistentState;
};

struct SetLocalVarData
{
  const char *localVarName;
  Statement_s *expression;
};

struct ConditionalScript
{
  MenuEventHandlerSet *eventHandlerSet;
  Statement_s *eventExpression; // loads this first
};

union EventData
{
  const char *unconditionalScript;
  ConditionalScript *conditionalScript;
  MenuEventHandlerSet *elseScript;
  SetLocalVarData *setLocalVarData;
};

#pragma pack(push, 4)
struct MenuEventHandler
{
  EventData eventData;
  char eventType;
};
#pragma pack(pop)

struct MenuEventHandlerSet
{
  int eventHandlerCount;
  MenuEventHandler **eventHandlers;
};

struct ItemKeyHandler
{
  int key;
  MenuEventHandlerSet *action;
  ItemKeyHandler *next;
};

#pragma pack(push, 4)
struct rectDef_s
{
  float x;
  float y;
  float w;
  float h;
  char horzAlign;
  char vertAlign;
};
#pragma pack(pop)

// sizeof = 0xB0
struct windowDef_t
{
  const char *name;
  rectDef_s rect;
  rectDef_s rectClient;
  const char *group;
  int style;
  int border;
  int ownerDraw;
  int ownerDrawFlags;
  float borderSize;
  int staticFlags;
#ifdef PC
  int dynamicFlags[1];
#else
  int dynamicFlags[4];
#endif
  int nextTime;
  float foreColor[4];
  float backColor[4];
  float borderColor[4];
  float outlineColor[4];
  float disableColor[4];
  Material *background;
};

enum ItemFloatExpressionTarget
{
  ITEM_FLOATEXP_TGT_RECT_X = 0x0,
  ITEM_FLOATEXP_TGT_RECT_Y = 0x1,
  ITEM_FLOATEXP_TGT_RECT_W = 0x2,
  ITEM_FLOATEXP_TGT_RECT_H = 0x3,
  ITEM_FLOATEXP_TGT_FORECOLOR_R = 0x4,
  ITEM_FLOATEXP_TGT_FORECOLOR_G = 0x5,
  ITEM_FLOATEXP_TGT_FORECOLOR_B = 0x6,
  ITEM_FLOATEXP_TGT_FORECOLOR_RGB = 0x7,
  ITEM_FLOATEXP_TGT_FORECOLOR_A = 0x8,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_R = 0x9,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_G = 0xA,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_B = 0xB,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_RGB = 0xC,
  ITEM_FLOATEXP_TGT_GLOWCOLOR_A = 0xD,
  ITEM_FLOATEXP_TGT_BACKCOLOR_R = 0xE,
  ITEM_FLOATEXP_TGT_BACKCOLOR_G = 0xF,
  ITEM_FLOATEXP_TGT_BACKCOLOR_B = 0x10,
  ITEM_FLOATEXP_TGT_BACKCOLOR_RGB = 0x11,
  ITEM_FLOATEXP_TGT_BACKCOLOR_A = 0x12,
  ITEM_FLOATEXP_TGT__COUNT = 0x13,
};

struct ItemFloatExpression
{
  ItemFloatExpressionTarget target;
  Statement_s *expression;
};

struct editFieldDef_s
{
  float minVal;
  float maxVal;
  float stepVal;
  float range;
  int maxChars;
  int maxCharsGotoNext;
  int maxPaintChars;
  int paintOffset;
};

struct multiDef_s
{
  const char *dvarList[32];
  const char *dvarStr[32];
  float dvarValue[32];
  int count;
  int strDef;
};

struct columnInfo_s
{
  int xpos;
  int ypos;
  int width;
  int height;
  int maxChars;
  int alignment;
};

// TODO: 4 bytes missing somewhere
struct listBoxDef_s
{
#ifdef PC
  int startPos[1];
  int endPos[1];
#else
  int startPos[4];
  int endPos[4];
#endif
  int drawPadding;
  float elementWidth;
  float elementHeight;
  int elementStyle;
  int numColumns;
  columnInfo_s columnInfo[16];
  MenuEventHandlerSet *onDoubleClick;
  int notselectable;
  int noScrollBars;
  int usePaging;
  float selectBorder[4];
  Material *selectIcon;
  Statement_s *elementHeightExp;
};

struct newsTickerDef_s
{
  int feedId;
  int speed;
  int spacing;
};

struct textScrollDef_s
{
  int startTime;
};

union itemDefData_t
{
  listBoxDef_s *listBox;
  editFieldDef_s *editField;
  multiDef_s *multi;
  const char *enumDvarName;
  newsTickerDef_s *ticker;
  textScrollDef_s *scroll;
  void *data;
};

struct itemDef_t
{
  windowDef_t window;
#ifdef PC
  rectDef_s textRect[1];
#else
  rectDef_s textRect[4];
#endif
  int type;
  int dataType;
  int alignment;
  int fontEnum;
  int textAlignMode;
  float textalignx;
  float textaligny;
  float textscale;
  int textStyle;
  int gameMsgWindowIndex;
  int gameMsgWindowMode;
  const char *text;
  int itemFlags;
  menuDef_t *parent;
  MenuEventHandlerSet *mouseEnterText;
  MenuEventHandlerSet *mouseExitText;
  MenuEventHandlerSet *mouseEnter;
  MenuEventHandlerSet *mouseExit;
  MenuEventHandlerSet *action;
  MenuEventHandlerSet *accept;
  MenuEventHandlerSet *onFocus;
  MenuEventHandlerSet *hasFocus;
  MenuEventHandlerSet *leaveFocus;
  const char *dvar;
  const char *dvarTest;
  ItemKeyHandler *onKey;
  const char *enableDvar;
  const char *localVar;
  int dvarFlags;
  snd_alias_list_t *focusSound;
  float special;
#ifdef PC
  int cursorPos[1];
#else
  int cursorPos[4];
#endif
  itemDefData_t typeData;
  int floatExpressionCount;
  ItemFloatExpression *floatExpressions;
  Statement_s *visibleExp;
  Statement_s *disabledExp;
  Statement_s *textExp;
  Statement_s *materialExp;
  float glowColor[4];
  bool decayActive;
  int fxBirthTime;
  int fxLetterTime;
  int fxDecayStartTime;
  int fxDecayDuration;
  int lastSoundPlayedTime;
  Statement_s *textAlignYExp;
};

struct menuTransition
{
  int transitionType;
  int startTime;
  float startVal;
  float endVal;
  float time;
  int endTriggerType;
};

struct menuData_t
{
  int fullScreen;
  int fadeCycle;
  float fadeClamp;
  float fadeAmount;
  float fadeInAmount;
  float blurRadius;
  MenuEventHandlerSet *onOpen;
  MenuEventHandlerSet *onCloseRequest;
  MenuEventHandlerSet *onClose;
  MenuEventHandlerSet *onESC;
  MenuEventHandlerSet *onFocusDueToClose;
  ItemKeyHandler *onKey;
  Statement_s *visibleExp;
  const char *allowedBinding;
  const char *soundName;
  float focusColor[4];
  Statement_s *rectXExp;
  Statement_s *rectYExp;
  Statement_s *rectWExp;
  Statement_s *rectHExp;
  Statement_s *openSoundExp;
  Statement_s *closeSoundExp;
  Statement_s *soundLoopExp;
#ifdef PC
  int cursorItem[1];
#else
  int cursorItem[4];
#endif
  menuTransition scaleTransition[1];
  menuTransition alphaTransition[1];
  menuTransition xTransition[1];
  menuTransition yTransition[1];
  ExpressionSupportingData *expressionData;
  char priority;
};

struct menuDef_t
{
  menuData_t *data;
  windowDef_t window;
  int itemCount;
  itemDef_t **items;
};