diff options
-rw-r--r-- | assets/ui/menudef.h | 340 | ||||
-rw-r--r-- | src/qcommon/parse.c | 156 |
2 files changed, 341 insertions, 155 deletions
diff --git a/assets/ui/menudef.h b/assets/ui/menudef.h index 116bc590..e834910d 100644 --- a/assets/ui/menudef.h +++ b/assets/ui/menudef.h @@ -1,86 +1,113 @@ #ifndef MENUDEF_H #define MENUDEF_H -#define ITEM_TYPE_TEXT 0 // simple text -#define ITEM_TYPE_BUTTON 1 // button, basically text with a border -#define ITEM_TYPE_RADIOBUTTON 2 // toggle button, may be grouped -#define ITEM_TYPE_CHECKBOX 3 // check box -#define ITEM_TYPE_EDITFIELD 4 // editable text, associated with a cvar -#define ITEM_TYPE_COMBO 5 // drop down list -#define ITEM_TYPE_LISTBOX 6 // scrollable list -#define ITEM_TYPE_MODEL 7 // model -#define ITEM_TYPE_OWNERDRAW 8 // owner draw, name specs what it is -#define ITEM_TYPE_NUMERICFIELD 9 // editable text, associated with a cvar -#define ITEM_TYPE_SLIDER 10 // mouse speed, volume, etc. -#define ITEM_TYPE_YESNO 11 // yes no cvar setting -#define ITEM_TYPE_MULTI 12 // multiple list setting, enumerated -#define ITEM_TYPE_BIND 13 // multiple list setting, enumerated - -#define ALIGN_LEFT 0 // left alignment -#define ALIGN_CENTER 1 // center alignment -#define ALIGN_RIGHT 2 // right alignment -#define ASPECT_NONE 3 // no aspect compensation - -#define VALIGN_BOTTOM 0 // bottom alignment -#define VALIGN_CENTER 1 // center alignment -#define VALIGN_TOP 2 // top alignment - -#define ITEM_TEXTSTYLE_NORMAL 0 // normal text -#define ITEM_TEXTSTYLE_BLINK 1 // fast blinking -#define ITEM_TEXTSTYLE_PULSE 2 // slow pulsing -#define ITEM_TEXTSTYLE_SHADOWED 3 // drop shadow ( need a color for this ) -#define ITEM_TEXTSTYLE_OUTLINED 4 // drop shadow ( need a color for this ) -#define ITEM_TEXTSTYLE_OUTLINESHADOWED 5 // drop shadow ( need a color for this ) -#define ITEM_TEXTSTYLE_SHADOWEDMORE 6 // drop shadow ( need a color for this ) -#define ITEM_TEXTSTYLE_NEON 7 // drop shadow ( need a color for this ) - -#define WINDOW_BORDER_NONE 0 // no border -#define WINDOW_BORDER_FULL 1 // full border based on border color ( single pixel ) -#define WINDOW_BORDER_HORZ 2 // horizontal borders only -#define WINDOW_BORDER_VERT 3 // vertical borders only -#define WINDOW_BORDER_KCGRADIENT 4 // horizontal border using the gradient bars - -#define WINDOW_STYLE_EMPTY 0 // no background -#define WINDOW_STYLE_FILLED 1 // filled with background color -#define WINDOW_STYLE_GRADIENT 2 // gradient bar based on background color -#define WINDOW_STYLE_SHADER 3 // gradient bar based on background color -#define WINDOW_STYLE_TEAMCOLOR 4 // team color -#define WINDOW_STYLE_CINEMATIC 5 // cinematic +enum +{ + ITEM_TYPE_TEXT, // simple text + ITEM_TYPE_BUTTON, // button, basically text with a border + ITEM_TYPE_RADIOBUTTON, // toggle button, may be grouped + ITEM_TYPE_CHECKBOX, // check box + ITEM_TYPE_EDITFIELD, // editable text, associated with a cvar + ITEM_TYPE_COMBO, // drop down list + ITEM_TYPE_LISTBOX, // scrollable list + ITEM_TYPE_MODEL, // model + ITEM_TYPE_OWNERDRAW, // owner draw, has an associated ownerdraw number + ITEM_TYPE_NUMERICFIELD, // editable text, associated with a cvar + ITEM_TYPE_SLIDER, // mouse speed, volume, etc. + ITEM_TYPE_YESNO, // boolean cvar setting + ITEM_TYPE_MULTI, // multiple list setting, enumerated + ITEM_TYPE_BIND // keyboard control configuration +}; + +enum +{ + ALIGN_LEFT, // left alignment + ALIGN_CENTER, // center alignment + ALIGN_RIGHT, // right alignment + ASPECT_NONE // no aspect compensation +}; + +enum +{ + VALIGN_BOTTOM, // bottom alignment + VALIGN_CENTER, // center alignment + VALIGN_TOP // top alignment +}; + +enum +{ + ITEM_TEXTSTYLE_NORMAL, // normal text + ITEM_TEXTSTYLE_BLINK, // fast blinking + ITEM_TEXTSTYLE_PULSE, // slow pulsing + ITEM_TEXTSTYLE_SHADOWED, // drop shadow (need a color for this) + ITEM_TEXTSTYLE_OUTLINED, // apparently unimplemented + ITEM_TEXTSTYLE_OUTLINESHADOWED, // apparently unimplemented + ITEM_TEXTSTYLE_SHADOWEDMORE, // drop shadow (need a color for this) + ITEM_TEXTSTYLE_NEON // glow (need a color for this) +}; + +enum +{ + WINDOW_BORDER_NONE, // no border + WINDOW_BORDER_FULL, // full border based on border color (single pixel) + WINDOW_BORDER_HORZ, // horizontal borders only + WINDOW_BORDER_VERT, // vertical borders only + WINDOW_BORDER_KCGRADIENT // horizontal border using the gradient bars +}; + +enum +{ + WINDOW_STYLE_EMPTY, // no background + WINDOW_STYLE_FILLED, // filled with background color + WINDOW_STYLE_GRADIENT, // gradient bar based on background color + WINDOW_STYLE_SHADER, // use background shader + WINDOW_STYLE_TEAMCOLOR, // team color + WINDOW_STYLE_CINEMATIC // cinematic +}; #define MENU_TRUE 1 // uh.. true #define MENU_FALSE 0 // and false -#define HUD_VERTICAL 0 -#define HUD_HORIZONTAL 1 +enum +{ + HUD_VERTICAL, + HUD_HORIZONTAL +}; // list box element types -#define LISTBOX_TEXT 0 -#define LISTBOX_IMAGE 1 +enum +{ + LISTBOX_TEXT, + LISTBOX_IMAGE +}; // list feeders -#define FEEDER_SERVERS 1 // servers -#define FEEDER_MAPS 2 // all maps available, in graphic format -#define FEEDER_ALIENTEAM_LIST 3 // red team members -#define FEEDER_HUMANTEAM_LIST 4 // blue team members -#define FEEDER_PLAYER_LIST 5 // players -#define FEEDER_TEAM_LIST 6 // team members for team voting -#define FEEDER_MODS 7 // team members for team voting -#define FEEDER_DEMOS 8 // team members for team voting -#define FEEDER_SERVERSTATUS 9 // server status -#define FEEDER_FINDPLAYER 10 // find player -#define FEEDER_CINEMATICS 11 // cinematics - -#define FEEDER_TREMTEAMS 12 // teams -#define FEEDER_TREMALIENCLASSES 13 // alien classes -#define FEEDER_TREMHUMANITEMS 14 // human items -#define FEEDER_TREMHUMANARMOURYBUY 15 // human buy -#define FEEDER_TREMHUMANARMOURYSELL 16 // human sell -#define FEEDER_TREMALIENUPGRADE 17 // alien upgrade -#define FEEDER_TREMALIENBUILD 18 // alien buildables -#define FEEDER_TREMHUMANBUILD 19 // human buildables -#define FEEDER_IGNORE_LIST 20 // ignored players -#define FEEDER_HELP_LIST 21 // help topics -#define FEEDER_RESOLUTIONS 22 // display resolutions +enum +{ + FEEDER_SERVERS, // servers + FEEDER_MAPS, // all maps available, in graphic format + FEEDER_ALIENTEAM_LIST, // alien team members + FEEDER_HUMANTEAM_LIST, // human team members + FEEDER_TEAM_LIST, // team members for team voting + FEEDER_PLAYER_LIST, // players + FEEDER_MODS, // list of available mods + FEEDER_DEMOS, // list of available demo files + FEEDER_SERVERSTATUS, // server status + FEEDER_FINDPLAYER, // find player + FEEDER_CINEMATICS, // cinematics + + FEEDER_TREMTEAMS, // teams + FEEDER_TREMALIENCLASSES, // alien classes + FEEDER_TREMHUMANITEMS, // human items + FEEDER_TREMHUMANARMOURYBUY, // human buy + FEEDER_TREMHUMANARMOURYSELL, // human sell + FEEDER_TREMALIENUPGRADE, // alien upgrade + FEEDER_TREMALIENBUILD, // alien buildables + FEEDER_TREMHUMANBUILD, // human buildables + FEEDER_IGNORE_LIST, // ignored players + FEEDER_HELP_LIST, // help topics + FEEDER_RESOLUTIONS // display resolutions +}; // display flags #define UI_SHOW_FAVORITESERVERS 0x00000001 @@ -94,90 +121,93 @@ #define UI_SHOW_NOTSPECTATING 0x00000040 // owner draw types -#define CG_PLAYER_HEALTH 0 -#define CG_PLAYER_HEALTH_CROSS 1 -#define CG_PLAYER_AMMO_VALUE 2 -#define CG_PLAYER_CLIPS_VALUE 3 -#define CG_PLAYER_BUILD_TIMER 4 -#define CG_PLAYER_CREDITS_VALUE 7 -#define CG_PLAYER_CREDITS_VALUE_NOPAD 9 -#define CG_PLAYER_STAMINA 10 -#define CG_PLAYER_STAMINA_1 11 -#define CG_PLAYER_STAMINA_2 12 -#define CG_PLAYER_STAMINA_3 13 -#define CG_PLAYER_STAMINA_4 14 -#define CG_PLAYER_STAMINA_BOLT 15 -#define CG_PLAYER_BOOST_BOLT 16 -#define CG_PLAYER_CLIPS_RING 17 -#define CG_PLAYER_BUILD_TIMER_RING 18 -#define CG_PLAYER_SELECT 19 -#define CG_PLAYER_SELECTTEXT 20 -#define CG_PLAYER_WEAPONICON 21 -#define CG_PLAYER_WALLCLIMBING 22 -#define CG_PLAYER_BOOSTED 23 -#define CG_PLAYER_POISON_BARBS 24 -#define CG_PLAYER_ALIEN_SENSE 25 -#define CG_PLAYER_HUMAN_SCANNER 26 -#define CG_PLAYER_USABLE_BUILDABLE 27 -#define CG_KILLER 28 -#define CG_SPECTATORS 29 -#define CG_FOLLOW 30 +enum +{ + CG_PLAYER_HEALTH, + CG_PLAYER_HEALTH_CROSS, + CG_PLAYER_AMMO_VALUE, + CG_PLAYER_CLIPS_VALUE, + CG_PLAYER_BUILD_TIMER, + CG_PLAYER_CREDITS_VALUE, + CG_PLAYER_CREDITS_VALUE_NOPAD, + CG_PLAYER_STAMINA, + CG_PLAYER_STAMINA_1, + CG_PLAYER_STAMINA_2, + CG_PLAYER_STAMINA_3, + CG_PLAYER_STAMINA_4, + CG_PLAYER_STAMINA_BOLT, + CG_PLAYER_BOOST_BOLT, + CG_PLAYER_CLIPS_RING, + CG_PLAYER_BUILD_TIMER_RING, + CG_PLAYER_SELECT, + CG_PLAYER_SELECTTEXT, + CG_PLAYER_WEAPONICON, + CG_PLAYER_WALLCLIMBING, + CG_PLAYER_BOOSTED, + CG_PLAYER_POISON_BARBS, + CG_PLAYER_ALIEN_SENSE, + CG_PLAYER_HUMAN_SCANNER, + CG_PLAYER_USABLE_BUILDABLE, + CG_PLAYER_CHARGE_BAR_BG, + CG_PLAYER_CHARGE_BAR, + CG_PLAYER_CROSSHAIR, + CG_PLAYER_LOCATION, + CG_PLAYER_CREDITS_FRACTION, + + CG_KILLER, + CG_SPECTATORS, + CG_FOLLOW, // loading screen -#define CG_LOAD_LEVELSHOT 31 -#define CG_LOAD_MEDIA 32 -#define CG_LOAD_MEDIA_LABEL 33 -#define CG_LOAD_BUILDABLES 34 -#define CG_LOAD_BUILDABLES_LABEL 35 -#define CG_LOAD_CHARMODEL 36 -#define CG_LOAD_CHARMODEL_LABEL 37 -#define CG_LOAD_OVERALL 38 -#define CG_LOAD_LEVELNAME 39 -#define CG_LOAD_MOTD 40 -#define CG_LOAD_HOSTNAME 41 - -#define CG_FPS 42 -#define CG_FPS_FIXED 43 -#define CG_TIMER 44 -#define CG_TIMER_MINS 45 -#define CG_TIMER_SECS 46 -#define CG_SNAPSHOT 47 -#define CG_LAGOMETER 48 -#define CG_PLAYER_CROSSHAIRNAMES 49 -#define CG_STAGE_REPORT_TEXT 50 -#define CG_ALIENS_SCORE_LABEL 51 -#define CG_HUMANS_SCORE_LABEL 52 -#define CG_DEMO_PLAYBACK 53 -#define CG_DEMO_RECORDING 54 - -#define CG_CONSOLE 55 -#define CG_TUTORIAL 56 -#define CG_CLOCK 57 - -#define UI_NETSOURCE 58 -#define UI_NETMAPPREVIEW 59 -#define UI_NETMAPCINEMATIC 60 -#define UI_SERVERREFRESHDATE 61 -#define UI_SERVERMOTD 62 -#define UI_GLINFO 63 -#define UI_KEYBINDSTATUS 64 -#define UI_SELECTEDMAPPREVIEW 65 -#define UI_SELECTEDMAPNAME 66 - -#define UI_TEAMINFOPANE 67 -#define UI_ACLASSINFOPANE 68 -#define UI_AUPGRADEINFOPANE 69 -#define UI_HITEMINFOPANE 70 -#define UI_HBUYINFOPANE 71 -#define UI_HSELLINFOPANE 72 -#define UI_ABUILDINFOPANE 73 -#define UI_HBUILDINFOPANE 74 -#define UI_HELPINFOPANE 75 - -#define CG_PLAYER_CHARGE_BAR_BG 76 -#define CG_PLAYER_CHARGE_BAR 77 -#define CG_PLAYER_CROSSHAIR 78 -#define CG_PLAYER_LOCATION 79 -#define CG_PLAYER_CREDITS_FRACTION 80 + CG_LOAD_LEVELSHOT, + CG_LOAD_MEDIA, + CG_LOAD_MEDIA_LABEL, + CG_LOAD_BUILDABLES, + CG_LOAD_BUILDABLES_LABEL, + CG_LOAD_CHARMODEL, + CG_LOAD_CHARMODEL_LABEL, + CG_LOAD_OVERALL, + CG_LOAD_LEVELNAME, + CG_LOAD_MOTD, + CG_LOAD_HOSTNAME, + + CG_FPS, + CG_FPS_FIXED, + CG_TIMER, + CG_TIMER_MINS, + CG_TIMER_SECS, + CG_SNAPSHOT, + CG_LAGOMETER, + CG_PLAYER_CROSSHAIRNAMES, + CG_STAGE_REPORT_TEXT, + CG_ALIENS_SCORE_LABEL, + CG_HUMANS_SCORE_LABEL, + CG_DEMO_PLAYBACK, + CG_DEMO_RECORDING, + + CG_CONSOLE, + CG_TUTORIAL, + CG_CLOCK, + + UI_NETSOURCE, + UI_NETMAPPREVIEW, + UI_NETMAPCINEMATIC, + UI_SERVERREFRESHDATE, + UI_SERVERMOTD, + UI_GLINFO, + UI_KEYBINDSTATUS, + UI_SELECTEDMAPPREVIEW, + UI_SELECTEDMAPNAME, + + UI_TEAMINFOPANE, + UI_ACLASSINFOPANE, + UI_AUPGRADEINFOPANE, + UI_HITEMINFOPANE, + UI_HBUYINFOPANE, + UI_HSELLINFOPANE, + UI_ABUILDINFOPANE, + UI_HBUILDINFOPANE, + UI_HELPINFOPANE +}; #endif diff --git a/src/qcommon/parse.c b/src/qcommon/parse.c index 9ad5b5fd..783de6eb 100644 --- a/src/qcommon/parse.c +++ b/src/qcommon/parse.c @@ -234,6 +234,8 @@ typedef struct directive_s #define DEFINEHASHSIZE 1024 static int Parse_ReadToken(source_t *source, token_t *token); +static qboolean Parse_AddDefineToSourceFromString( source_t *source, + char *string ); int numtokens; @@ -3201,6 +3203,141 @@ static void Parse_UnreadToken(source_t *source, token_t *token) /* =============== +Parse_ReadEnumeration + +It is assumed that the 'enum' token has already been consumed +This is fairly basic: it doesn't catch some fairly obvious errors like nested +enums, and enumerated names conflict with #define parameters +=============== +*/ +static qboolean Parse_ReadEnumeration( source_t *source ) +{ + token_t newtoken; + int value; + + if( !Parse_ReadToken( source, &newtoken ) ) + return qfalse; + + if( newtoken.type != TT_PUNCTUATION || newtoken.subtype != P_BRACEOPEN ) + { + Parse_SourceError( source, "Found %s when expecting {\n", + newtoken.string ); + return qfalse; + } + + for( value = 0;; value++ ) + { + token_t name; + + // read the name + if( !Parse_ReadToken( source, &name ) ) + break; + + // it's ok for the enum to end immediately + if( name.type == TT_PUNCTUATION && name.subtype == P_BRACECLOSE ) + { + if( !Parse_ReadToken( source, &name ) ) + break; + + // ignore trailing semicolon + if( name.type != TT_PUNCTUATION || name.subtype != P_SEMICOLON ) + Parse_UnreadToken( source, &name ); + + return qtrue; + } + + // ... but not for it to do anything else + if( name.type != TT_NAME ) + { + Parse_SourceError( source, "Found %s when expecting identifier\n", + name.string ); + return qfalse; + } + + if( !Parse_ReadToken( source, &newtoken ) ) + break; + + if( newtoken.type != TT_PUNCTUATION ) + { + Parse_SourceError( source, "Found %s when expecting , or = or }\n", + newtoken.string ); + return qfalse; + } + + if( newtoken.subtype == P_ASSIGN ) + { + int neg = 1; + + if( !Parse_ReadToken( source, &newtoken ) ) + break; + + // Parse_ReadToken doesn't seem to read negative numbers, so we do it + // ourselves + if( newtoken.type == TT_PUNCTUATION && newtoken.subtype == P_SUB ) + { + neg = -1; + + // the next token should be the number + if( !Parse_ReadToken( source, &newtoken ) ) + break; + } + + if( newtoken.type != TT_NUMBER || !( newtoken.subtype & TT_INTEGER ) ) + { + Parse_SourceError( source, "Found %s when expecting integer\n", + newtoken.string ); + return qfalse; + } + + // this is somewhat silly, but cheap to check + if( neg == -1 && ( newtoken.subtype & TT_UNSIGNED ) ) + { + Parse_SourceWarning( source, "Value in enumeration is negative and " + "unsigned\n" ); + } + + // set the new define value + value = newtoken.intvalue * neg; + + if( !Parse_ReadToken( source, &newtoken ) ) + break; + } + + if( newtoken.type != TT_PUNCTUATION || ( newtoken.subtype != P_COMMA && + newtoken.subtype != P_BRACECLOSE ) ) + { + Parse_SourceError( source, "Found %s when expecting , or }\n", + newtoken.string ); + return qfalse; + } + + if( !Parse_AddDefineToSourceFromString( source, va( "%s %d\n", name.string, + value ) ) ) + { + Parse_SourceWarning( source, "Couldn't add define to source: %s = %d\n", + name.string, value ); + return qfalse; + } + + if( newtoken.subtype == P_BRACECLOSE ) + { + if( !Parse_ReadToken( source, &name ) ) + break; + + // ignore trailing semicolon + if( name.type != TT_PUNCTUATION || name.subtype != P_SEMICOLON ) + Parse_UnreadToken( source, &name ); + + return qtrue; + } + } + + // got here if a ReadToken returned false + return qfalse; +} + +/* +=============== Parse_ReadToken =============== */ @@ -3228,6 +3365,12 @@ static int Parse_ReadToken(source_t *source, token_t *token) continue; } } + if( token->type == TT_NAME && !Q_stricmp( token->string, "enum" ) ) + { + if( !Parse_ReadEnumeration( source ) ) + return qfalse; + continue; + } // recursively concatenate strings that are behind each other still resolving defines if (token->type == TT_STRING) { @@ -3323,6 +3466,19 @@ static define_t *Parse_DefineFromString(char *string) /* =============== +Parse_AddDefineToSourceFromString +=============== +*/ +static qboolean Parse_AddDefineToSourceFromString( source_t *source, + char *string ) +{ + Parse_PushScript( source, Parse_LoadScriptMemory( string, strlen( string ), + "*extern" ) ); + return Parse_Directive_define( source ); +} + +/* +=============== Parse_AddGlobalDefine add a globals define that will be added to all opened sources |