mirror of
https://github.com/UberGames/rpgxEF.git
synced 2024-11-10 07:11:34 +00:00
a39565b783
... not quite content with where the project files lie but it is ok for now. ... compiling works fine so far (only tested mingw32 right now)
1578 lines
53 KiB
C
1578 lines
53 KiB
C
/*
|
|
======================================================
|
|
|
|
RPG-X Emotes Window
|
|
By TiM
|
|
14-5-2006
|
|
|
|
This menu is designed to allow players to choose emotes
|
|
they want their characters to play ingame.
|
|
|
|
======================================================
|
|
*/
|
|
|
|
#include "ui_local.h"
|
|
|
|
#define ID_RECENT 1
|
|
#define ID_FAVORITES 2
|
|
#define ID_VIEWALL 3
|
|
#define ID_SITTING 4
|
|
#define ID_CONSOLE 5
|
|
#define ID_GESTURE 6
|
|
#define ID_FULLBODY 7
|
|
#define ID_INJURED 8
|
|
#define ID_MISC 9
|
|
|
|
#define ID_MAINMENU 15
|
|
|
|
#define ID_BIND_EMOTE 16
|
|
#define ID_FAV_EMOTE 17
|
|
#define ID_DO_EMOTE 18
|
|
|
|
#define ID_LIST_UP 20
|
|
#define ID_LIST_DN 21
|
|
#define ID_SCROLLBAR 22
|
|
|
|
#define ID_EMOTELIST1 101
|
|
#define ID_EMOTELIST2 102
|
|
#define ID_EMOTELIST3 103
|
|
#define ID_EMOTELIST4 104
|
|
#define ID_EMOTELIST5 105
|
|
#define ID_EMOTELIST6 106
|
|
#define ID_EMOTELIST7 107
|
|
#define ID_EMOTELIST8 108
|
|
#define ID_EMOTELIST9 109
|
|
#define ID_EMOTELIST10 110
|
|
#define ID_EMOTELIST11 111
|
|
#define ID_EMOTELIST12 112
|
|
|
|
#define PIC_ARROW_UP "menu/common/arrow_up_16.tga"
|
|
#define PIC_ARROW_DOWN "menu/common/arrow_dn_16.tga"
|
|
|
|
#define MAX_MENULISTITEMS 12
|
|
|
|
#define MIN_SCROLLHEIGHT 8
|
|
#define MAX_SCROLLRANGE 198
|
|
#define MAX_SCROLLTOP 204
|
|
|
|
#define FAV_CVAR "ui_favoriteEmote"
|
|
|
|
#define LOW_MEMORY (5 * 1024 * 1024)
|
|
|
|
//Defined here so the PlayerModel APIs can handle them :)
|
|
static void PlayerEmotes_FillEmotesArray( int emoteCategory );
|
|
|
|
static void PlayerEmotes_UpdateScrollBar( menuaction_s *bar );
|
|
static void PlayerEmotes_SetupScrollBar( menuaction_s *bar );
|
|
|
|
//Un-necessary, emoteNum can be derived from
|
|
//the order in the list
|
|
/*typedef struct {
|
|
char emoteNameUpr[16];
|
|
|
|
int emoteNum;
|
|
} listEmote_t;*/
|
|
|
|
//TiM - data necessary for a scroll bar
|
|
typedef struct
|
|
{
|
|
qboolean mouseDown;
|
|
qboolean doubleStep;
|
|
|
|
int yStart;
|
|
} scrollData_t;
|
|
|
|
typedef struct {
|
|
menuframework_s menu;
|
|
|
|
//main buttons
|
|
menubitmap_s recentFilter;
|
|
menubitmap_s favoritesFilter;
|
|
menubitmap_s viewAllFilter;
|
|
menubitmap_s sittingFilter;
|
|
menubitmap_s consoleFilter;
|
|
menubitmap_s gestureFilter;
|
|
menubitmap_s fullMotionFilter;
|
|
menubitmap_s injuredFilter;
|
|
menubitmap_s miscFilter;
|
|
|
|
menubitmap_s mainMenu; //Return to game ( or main menu )
|
|
|
|
//menu arrows
|
|
menubitmap_s upArrow;
|
|
menubitmap_s dnArrow;
|
|
menuaction_s scrollBar;
|
|
|
|
//emote parameters list
|
|
char emoteTitle[26]; //Emote name displayed at the top
|
|
menufield_s modelOffset; //button used to enter in modeloffset data
|
|
|
|
menuaction_s emoteBind; //keybind(s) for this emote
|
|
int bindValue; //ASCII index of the key this emote is bound to
|
|
qboolean keyBindActive; //True while the code is waiting for the user to enter a new emote bind
|
|
|
|
menubitmap_s addFav; //Add Favorites Button
|
|
menubitmap_s playEmote; //Play Emote Button
|
|
|
|
int selectedEmote;
|
|
int favvedEmote; //the cvar index this emote is favved at
|
|
|
|
//playermodel rendering variables
|
|
menubitmap_s playerMdl;
|
|
char playerModel[MAX_QPATH];
|
|
playerInfo_t playerInfo;
|
|
vec3_t viewAngles;
|
|
vec3_t moveAngles;
|
|
|
|
//graphics definitions
|
|
qhandle_t corner_ll_4_18;
|
|
qhandle_t corner_ll_4_4;
|
|
qhandle_t corner_ur_18_18;
|
|
qhandle_t corner_lr_18_4;
|
|
qhandle_t corner_lr_4_18;
|
|
|
|
//active emotes storage definitions
|
|
int emoteListOffset; //offset that is incremented/decremented by the arrow tools
|
|
int numEmotes; //number of emotes in main list
|
|
menubitmap_s emotesMenu[MAX_MENULISTITEMS]; //buttons to display the active emote set
|
|
char emoteNames[MAX_MENULISTITEMS][25]; //local store for the emotes name
|
|
int mainEmotesList[175]; //the primary emote list, reset each time a new category is picked
|
|
|
|
int prevOffset; //Save the modeloffset so as to execute the command when we leave teh menu if changed
|
|
|
|
int currentMenu; //Save the current menu... we need this to refresh the fav menu if need be
|
|
|
|
//ie this menu was called via the console ( ie a key bind instead of from the main menu)
|
|
qboolean fromConsole;
|
|
|
|
scrollData_t scrollData; //TiM - Scroll data
|
|
} playerEmotes_t;
|
|
|
|
playerEmotes_t s_playerEmotes;
|
|
|
|
/*
|
|
=================
|
|
Player_SpinPlayer
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_SpinPlayer( void* ptr, int event)
|
|
{
|
|
if ( event == QM_ACTIVATED )
|
|
{
|
|
uis.spinView = qtrue;
|
|
uis.cursorpx = uis.cursorx;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
Player_InitModel
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_InitModel( void )
|
|
{
|
|
memset( &s_playerEmotes.playerInfo, 0, sizeof(playerInfo_t) );
|
|
|
|
UI_PlayerInfo_SetModel( &s_playerEmotes.playerInfo, UI_Cvar_VariableString( "model" ) );
|
|
|
|
//Player_UpdateModel( ANIM_IDLE );
|
|
VectorClear( s_playerEmotes.viewAngles );
|
|
VectorClear( s_playerEmotes.moveAngles );
|
|
s_playerEmotes.viewAngles[YAW] = uis.lastYaw;
|
|
s_playerEmotes.viewAngles[PITCH] = 0;
|
|
s_playerEmotes.viewAngles[ROLL] = 0;
|
|
s_playerEmotes.moveAngles[YAW] = 0; //s_main.playerViewangles[YAW];
|
|
|
|
UI_PlayerInfo_SetInfo( &s_playerEmotes.playerInfo,
|
|
BOTH_STAND1,
|
|
BOTH_STAND1,
|
|
s_playerEmotes.viewAngles,
|
|
s_playerEmotes.moveAngles,
|
|
WP_0,
|
|
trap_Cvar_VariableValue( "height" ),
|
|
trap_Cvar_VariableValue( "weight" ),
|
|
qfalse );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
Player_DrawPlayer
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_DrawPlayer( void ) //*self )
|
|
{
|
|
vec3_t origin = {-20, 5, -4 };//{ 0, 3.8, 0};
|
|
char buf[MAX_QPATH];
|
|
|
|
if( trap_MemoryRemaining() <= LOW_MEMORY ) {
|
|
UI_DrawProportionalString( s_playerEmotes.playerMdl.generic.x, s_playerEmotes.playerMdl.generic.y + s_playerEmotes.playerMdl.height / 2, "LOW MEMORY", UI_LEFT, color_red );
|
|
return;
|
|
}
|
|
|
|
trap_Cvar_VariableStringBuffer( "model", buf, sizeof( buf ) );
|
|
|
|
//if model is changed in the console
|
|
if ( Q_stricmp( buf, s_playerEmotes.playerInfo.modelName ) ) {
|
|
UI_PlayerInfo_SetModel( &s_playerEmotes.playerInfo, buf);
|
|
|
|
s_playerEmotes.viewAngles[YAW] = uis.lastYaw; //yaw
|
|
|
|
UI_PlayerInfo_SetInfo( &s_playerEmotes.playerInfo, BOTH_STAND1, BOTH_STAND1, s_playerEmotes.viewAngles, vec3_origin, WP_0, trap_Cvar_VariableValue( "height" ), trap_Cvar_VariableValue( "weight" ), qfalse );
|
|
|
|
//reload the menu just in case
|
|
PlayerEmotes_FillEmotesArray( s_playerEmotes.currentMenu );
|
|
}
|
|
|
|
UI_DrawPlayer( s_playerEmotes.playerMdl.generic.x, s_playerEmotes.playerMdl.generic.y, s_playerEmotes.playerMdl.width, s_playerEmotes.playerMdl.height, origin, &s_playerEmotes.playerInfo, uis.realtime );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
Player_DoEmote
|
|
TiM: Called to make the
|
|
player model onscreen
|
|
do the emote animation
|
|
=================
|
|
*/
|
|
static void Player_DoEmote( int emoteNum ) {
|
|
emoteList_t *emote;
|
|
int torsoAnim = BOTH_STAND1;
|
|
int legsAnim = BOTH_STAND1;
|
|
int legsTimer = 0;
|
|
int torsoTimer = 0;
|
|
|
|
emote = &bg_emoteList[ emoteNum ];
|
|
|
|
//Com_Printf( S_COLOR_RED "Emote num: %i, Enum: %i, Legs time: %i\n", emoteNum, emote->enumName );
|
|
|
|
if ( !emote )
|
|
return;
|
|
|
|
if ( emote->bodyFlags & EMOTE_LOWER )
|
|
{
|
|
legsAnim = emote->enumName;
|
|
|
|
if ( emote->enumLoop > 0 )
|
|
s_playerEmotes.playerInfo.lowerLoopEmote = emote->enumLoop;
|
|
else
|
|
s_playerEmotes.playerInfo.lowerLoopEmote = 0;
|
|
}
|
|
|
|
if ( emote->bodyFlags & EMOTE_UPPER )
|
|
{
|
|
torsoAnim = emote->enumName;
|
|
|
|
if ( emote->enumLoop > 0 )
|
|
s_playerEmotes.playerInfo.upperLoopEmote = emote->enumLoop;
|
|
else
|
|
s_playerEmotes.playerInfo.upperLoopEmote = 0;
|
|
}
|
|
|
|
if ( !(emote->animFlags & EMOTE_LOOP_LOWER) ) {
|
|
legsTimer = s_playerEmotes.playerInfo.animations[ emote->enumName ].numFrames * s_playerEmotes.playerInfo.animations[ emote->enumName ].frameLerp;
|
|
s_playerEmotes.playerInfo.lowerEmoting = qtrue;
|
|
}
|
|
|
|
if ( !(emote->animFlags & EMOTE_LOOP_UPPER) ) {
|
|
torsoTimer = s_playerEmotes.playerInfo.animations[ emote->enumName ].numFrames * s_playerEmotes.playerInfo.animations[ emote->enumName ].frameLerp;
|
|
s_playerEmotes.playerInfo.upperEmoting = qtrue;
|
|
}
|
|
|
|
s_playerEmotes.playerInfo.legsAnimationTimer = legsTimer;
|
|
s_playerEmotes.playerInfo.torsoAnimationTimer = torsoTimer;
|
|
|
|
s_playerEmotes.viewAngles[YAW] = uis.lastYaw;
|
|
UI_PlayerInfo_SetInfo( &s_playerEmotes.playerInfo, legsAnim, torsoAnim, s_playerEmotes.viewAngles, vec3_origin, WP_0, trap_Cvar_VariableValue( "height" ), trap_Cvar_VariableValue( "weight" ), qfalse );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_BuildEmotesList
|
|
TiM: Fills in the main menu list
|
|
from the main emote array.
|
|
Called upon new list defines as
|
|
well as when the arrow key is clicked
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_BuildEmotesList( int *emoteListOffset )
|
|
{
|
|
int i;
|
|
int offset;
|
|
|
|
//clamp the offset value
|
|
if ( *emoteListOffset < 0 ) {
|
|
*emoteListOffset = 0;
|
|
return;
|
|
}
|
|
|
|
if ( s_playerEmotes.numEmotes > MAX_MENULISTITEMS && *emoteListOffset > s_playerEmotes.numEmotes - MAX_MENULISTITEMS ) {
|
|
*emoteListOffset = s_playerEmotes.numEmotes - MAX_MENULISTITEMS;
|
|
return;
|
|
}
|
|
|
|
//clear all of the previous list data
|
|
memset( &s_playerEmotes.emoteNames, 0, sizeof( s_playerEmotes.emoteNames ) );
|
|
|
|
//populate the list
|
|
for ( i = 0; i < MAX_MENULISTITEMS; i++ ) {
|
|
offset = *emoteListOffset + i;
|
|
|
|
//if there's no data (ie there are no emotes this far),
|
|
//make the button hidden and continue
|
|
if ( i > s_playerEmotes.numEmotes || s_playerEmotes.mainEmotesList[offset] == -1 || s_playerEmotes.mainEmotesList[offset] >= bg_numEmotes ) {
|
|
s_playerEmotes.emotesMenu[i].generic.flags = ( QMF_INACTIVE | QMF_HIDDEN );
|
|
s_playerEmotes.emotesMenu[i].textPtr = NULL;
|
|
continue;
|
|
}
|
|
|
|
Q_strncpyz( s_playerEmotes.emoteNames[i], bg_emoteList[ s_playerEmotes.mainEmotesList[offset] ].name, sizeof( s_playerEmotes.emoteNames[i] ) );
|
|
Q_strupr( s_playerEmotes.emoteNames[i] );
|
|
|
|
s_playerEmotes.emotesMenu[i].generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.emotesMenu[i].textPtr = s_playerEmotes.emoteNames[i];
|
|
}
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_FillEmotesArray
|
|
TiM: Called when a new category
|
|
button is pressed. It flushes the
|
|
main list of emotes, and re-populates it with the
|
|
new category. Then it reloads the main list
|
|
with these new emotes
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_FillEmotesArray( int emoteCategory ) {
|
|
int i;
|
|
emoteList_t *emote;
|
|
|
|
//reset the list and counting data
|
|
//NB: -1 instead of 0 since 0 is a valid emote
|
|
for ( i = 0; i < 175; i++ ) {
|
|
s_playerEmotes.mainEmotesList[i] = -1;
|
|
}
|
|
s_playerEmotes.numEmotes = 0;
|
|
|
|
s_playerEmotes.currentMenu = emoteCategory;
|
|
|
|
//The first few categories are pre-set
|
|
//so we'll manually handle those
|
|
switch ( emoteCategory )
|
|
{
|
|
//this one's a kicker ROFL
|
|
case ID_VIEWALL:
|
|
for ( i = 0; i < bg_numEmotes; i++ ) {
|
|
//TiM: Make sure we don't include emote stubs. No point
|
|
emote = &bg_emoteList[ i ];
|
|
if ( !emote || (emote->enumName >= 0 && emote->enumName < MAX_ANIMATIONS && s_playerEmotes.playerInfo.animations[ emote->enumName ].numFrames < 0) || !emote->name[0] )
|
|
continue;
|
|
|
|
s_playerEmotes.mainEmotesList[ s_playerEmotes.numEmotes ] = i;
|
|
s_playerEmotes.numEmotes++;
|
|
}
|
|
|
|
break;
|
|
//Console stored emote lists
|
|
case ID_RECENT:
|
|
case ID_FAVORITES:
|
|
{
|
|
char consoleName[25];
|
|
char fullName[32];
|
|
char cvarValue[5];
|
|
int emoteNum;
|
|
|
|
//favorites and recent are basically the same, so with a quick condition here,
|
|
//we can re-use the same code for both :)
|
|
if ( emoteCategory == ID_RECENT )
|
|
Q_strncpyz( consoleName, "ui_recentEmote", sizeof( consoleName ) );
|
|
else
|
|
Q_strncpyz( consoleName, FAV_CVAR, sizeof( consoleName ) );
|
|
|
|
//reversed so the thing that was added last is displayed first :)
|
|
for ( i = NUM_CVAR_STORES; i > 0; i-- ) {
|
|
Com_sprintf( fullName, sizeof( fullName ), "%s%i", consoleName, i );
|
|
|
|
//even tho we are loading int values from these CVARs, we'll be handling them like strings at first.
|
|
//reason being, "0" is a valid emote number, "" isn't
|
|
trap_Cvar_VariableStringBuffer( fullName, cvarValue, sizeof( cvarValue ) );
|
|
|
|
if ( !cvarValue[0] || !Q_stricmp( cvarValue, "-1" ) )
|
|
continue;
|
|
|
|
emoteNum = atoi( cvarValue );
|
|
|
|
//error check the int
|
|
if ( emoteNum >= bg_numEmotes || emoteNum < 0 ) {
|
|
continue;
|
|
}
|
|
|
|
//TiM: Make sure we don't include emote stubs. No point
|
|
emote = &bg_emoteList[ emoteNum ];
|
|
if ( !emote || (emote->enumName >= 0 && emote->enumName < MAX_ANIMATIONS && s_playerEmotes.playerInfo.animations[ emote->enumName ].numFrames < 0) )
|
|
continue;
|
|
|
|
//add to the list
|
|
s_playerEmotes.mainEmotesList[s_playerEmotes.numEmotes] = emoteNum;
|
|
s_playerEmotes.numEmotes++;
|
|
}
|
|
}
|
|
break;
|
|
|
|
//specific per-category emotes
|
|
case ID_SITTING:
|
|
case ID_CONSOLE:
|
|
case ID_GESTURE:
|
|
case ID_FULLBODY:
|
|
case ID_INJURED:
|
|
case ID_MISC:
|
|
{
|
|
int emoteIndex;
|
|
|
|
//find out the actual ID we need from that lot up there
|
|
//lol a case in a case
|
|
switch ( emoteCategory ) {
|
|
case ID_SITTING:
|
|
emoteIndex = TYPE_SITTING;
|
|
break;
|
|
case ID_CONSOLE:
|
|
emoteIndex = TYPE_CONSOLE;
|
|
break;
|
|
case ID_GESTURE:
|
|
emoteIndex = TYPE_GESTURE;
|
|
break;
|
|
case ID_FULLBODY:
|
|
emoteIndex = TYPE_FULLBODY;
|
|
break;
|
|
case ID_INJURED:
|
|
emoteIndex = TYPE_INJURED;
|
|
break;
|
|
case ID_MISC:
|
|
emoteIndex = TYPE_MISC;
|
|
break;
|
|
default:
|
|
emoteIndex = TYPE_NONE;
|
|
break;
|
|
}
|
|
|
|
if ( emoteIndex < 0 ) {
|
|
break;
|
|
}
|
|
|
|
//loop thru all the emotes, and add any that have a matching Index
|
|
for ( i = 0; i < bg_numEmotes; i++ ) {
|
|
//TiM: Make sure we don't include emote stubs. No point
|
|
emote = &bg_emoteList[ i ];
|
|
if ( !emote || (emote->enumName >= 0 && emote->enumName < MAX_ANIMATIONS && s_playerEmotes.playerInfo.animations[ emote->enumName ].numFrames < 0) )
|
|
continue;
|
|
|
|
if ( bg_emoteList[i].emoteType == emoteIndex ) {
|
|
s_playerEmotes.mainEmotesList[s_playerEmotes.numEmotes] = i;
|
|
s_playerEmotes.numEmotes++;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
//if the number of emotes exceeded our displayable total, then activate the arrow buttons
|
|
if ( s_playerEmotes.numEmotes > MAX_MENULISTITEMS ) {
|
|
s_playerEmotes.upArrow.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.dnArrow.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
}
|
|
|
|
s_playerEmotes.emoteListOffset = 0;
|
|
PlayerEmotes_BuildEmotesList( &s_playerEmotes.emoteListOffset );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_HandleNewEmote
|
|
TiM: An emotes button was pressed
|
|
Now to handle the tonnes of button
|
|
checks n' stuff
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_HandleNewEmote( int buttonId ) {
|
|
int i;
|
|
int buttonPressed = buttonId - 100; //offset by 100 so they wouldn't get in the way
|
|
char binding[256];
|
|
|
|
//get emote from stored list
|
|
s_playerEmotes.selectedEmote = s_playerEmotes.mainEmotesList[ buttonPressed + s_playerEmotes.emoteListOffset - 1 ];
|
|
|
|
Q_strncpyz( s_playerEmotes.emoteTitle, bg_emoteList[ s_playerEmotes.selectedEmote ].name, sizeof( s_playerEmotes.emoteTitle ) );
|
|
Q_strupr( s_playerEmotes.emoteTitle );
|
|
|
|
//search for binds for this emote
|
|
s_playerEmotes.bindValue = -1;
|
|
for ( i=0; i<256; i++ ){
|
|
trap_Key_GetBindingBuf( i, binding, sizeof( binding ) );
|
|
|
|
if ( *binding == 0 )
|
|
continue;
|
|
|
|
if ( strstr( binding, bg_emoteList[ s_playerEmotes.selectedEmote ].name ) ) {
|
|
s_playerEmotes.bindValue = i;
|
|
break;
|
|
}
|
|
}
|
|
s_playerEmotes.emoteBind.generic.flags = QMF_CENTER_JUSTIFY | QMF_HIGHLIGHT_IF_FOCUS;
|
|
|
|
//check for favorites
|
|
s_playerEmotes.favvedEmote = 0;
|
|
for ( i = 1; i <= NUM_CVAR_STORES; i++ ) {
|
|
if ( (int)trap_Cvar_VariableValue( va( FAV_CVAR "%i", i ) ) == s_playerEmotes.selectedEmote ) {
|
|
s_playerEmotes.favvedEmote = i;
|
|
s_playerEmotes.addFav.textEnum = MBT_KILL_FAV_EMOTE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//set button title either way
|
|
if ( !s_playerEmotes.favvedEmote ) {
|
|
s_playerEmotes.addFav.textEnum = MBT_FAV_EMOTE;
|
|
}
|
|
|
|
//either way, make the fav button active
|
|
if ( (s_playerEmotes.addFav.generic.flags & QMF_INACTIVE) )
|
|
{
|
|
s_playerEmotes.addFav.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
}
|
|
|
|
//make our player character do teh emote
|
|
Player_DoEmote( s_playerEmotes.selectedEmote );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_HandleFav
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_HandleFav( void ) {
|
|
int i;
|
|
char* cvar;
|
|
|
|
|
|
//safety net lol
|
|
if ( s_playerEmotes.selectedEmote < 0 )
|
|
return;
|
|
|
|
//this emote's been favved, so I guess we're unfaving it now
|
|
if ( s_playerEmotes.favvedEmote > 0 ) {
|
|
cvar = va( FAV_CVAR "%i", s_playerEmotes.favvedEmote );
|
|
|
|
//double chack. make sure that we've got the right emote
|
|
if ( (int)trap_Cvar_VariableValue( cvar ) == s_playerEmotes.selectedEmote ) {
|
|
//okay, all good. unfave it
|
|
trap_Cvar_Set( cvar, "-1" );
|
|
|
|
//shuffle all the other favorites up the list
|
|
for ( i = s_playerEmotes.favvedEmote + 1; i <= NUM_CVAR_STORES; i++ ) {
|
|
if ( (int)trap_Cvar_VariableValue( va( FAV_CVAR "%i", i - 1 ) ) == -1 ) {
|
|
//set the previous CVAR, the value of this CVAR regardless if it's -1 or not
|
|
trap_Cvar_SetValue( va( FAV_CVAR "%i", i - 1 ), (int)trap_Cvar_VariableValue( va( FAV_CVAR "%i", i ) ) );
|
|
|
|
//and then flush out this CVAR
|
|
trap_Cvar_Set( va( FAV_CVAR "%i", i ), "-1" );
|
|
}
|
|
}
|
|
|
|
// if fav menu, refresh the list, else just change teh button
|
|
if ( s_playerEmotes.currentMenu == ID_FAVORITES )
|
|
PlayerEmotes_FillEmotesArray( ID_FAVORITES );
|
|
|
|
s_playerEmotes.favvedEmote = 0;
|
|
s_playerEmotes.addFav.textEnum = MBT_FAV_EMOTE;
|
|
}
|
|
}
|
|
else { //alraedy unfavved! Let's fav it!
|
|
//search for the first unfavved slot we can
|
|
|
|
for ( i = 1; i <= NUM_CVAR_STORES; i++ ) {
|
|
|
|
cvar = va( FAV_CVAR "%i", i );
|
|
if ( (int)trap_Cvar_VariableValue( cvar ) == -1 ) {
|
|
//found a slot
|
|
trap_Cvar_SetValue( cvar, s_playerEmotes.selectedEmote );
|
|
s_playerEmotes.favvedEmote = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//aw damn, no slots were found
|
|
if ( s_playerEmotes.favvedEmote == 0 ) {
|
|
//okay... so we're going to push the top one off, and shuffle the rest up
|
|
for ( i = 2; i <= NUM_CVAR_STORES; i++ ) {
|
|
cvar = va( FAV_CVAR "%i", i-1 );
|
|
trap_Cvar_SetValue( cvar, (int)trap_Cvar_VariableValue( va( FAV_CVAR"%i", i ) ) );
|
|
|
|
if ( i == NUM_CVAR_STORES ) {
|
|
trap_Cvar_SetValue( va( FAV_CVAR"%i", i ), s_playerEmotes.selectedEmote );
|
|
s_playerEmotes.favvedEmote = NUM_CVAR_STORES;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( s_playerEmotes.currentMenu == ID_FAVORITES )
|
|
PlayerEmotes_FillEmotesArray( ID_FAVORITES );
|
|
else {
|
|
s_playerEmotes.addFav.textEnum = MBT_KILL_FAV_EMOTE;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_ExecuteOffset
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_ExecuteOffset( void ) {
|
|
int offset;
|
|
|
|
offset = atoi( s_playerEmotes.modelOffset.field.buffer );
|
|
|
|
if ( offset != s_playerEmotes.prevOffset )
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "modelOffset %i\n", offset ) );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_Event
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_Event( void* ptr, int event ) {
|
|
|
|
if ( event != QM_ACTIVATED )
|
|
return;
|
|
|
|
s_playerEmotes.keyBindActive = qfalse;
|
|
|
|
switch ( ((menucommon_s *)ptr)->id ) {
|
|
//Fav button hit
|
|
case ID_FAV_EMOTE:
|
|
PlayerEmotes_HandleFav();
|
|
break;
|
|
|
|
//emote button pressed
|
|
case ID_EMOTELIST1:
|
|
case ID_EMOTELIST2:
|
|
case ID_EMOTELIST3:
|
|
case ID_EMOTELIST4:
|
|
case ID_EMOTELIST5:
|
|
case ID_EMOTELIST6:
|
|
case ID_EMOTELIST7:
|
|
case ID_EMOTELIST8:
|
|
case ID_EMOTELIST9:
|
|
case ID_EMOTELIST10:
|
|
case ID_EMOTELIST11:
|
|
case ID_EMOTELIST12:
|
|
PlayerEmotes_HandleNewEmote( ((menucommon_s *)ptr)->id );
|
|
break;
|
|
|
|
//any of the main buttons
|
|
case ID_RECENT:
|
|
case ID_FAVORITES:
|
|
case ID_VIEWALL:
|
|
case ID_SITTING:
|
|
case ID_CONSOLE:
|
|
case ID_GESTURE:
|
|
case ID_FULLBODY:
|
|
case ID_INJURED:
|
|
case ID_MISC:
|
|
PlayerEmotes_FillEmotesArray( ((menucommon_s *)ptr)->id );
|
|
PlayerEmotes_SetupScrollBar( &s_playerEmotes.scrollBar );
|
|
break;
|
|
|
|
case ID_BIND_EMOTE:
|
|
s_playerEmotes.keyBindActive = qtrue;
|
|
break;
|
|
|
|
case ID_DO_EMOTE:
|
|
PlayerEmotes_ExecuteOffset();
|
|
if ( s_playerEmotes.selectedEmote >= 0 )
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "emote %s\n", bg_emoteList[s_playerEmotes.selectedEmote].name ) );
|
|
|
|
UI_ForceMenuOff();
|
|
break;
|
|
|
|
case ID_LIST_UP:
|
|
s_playerEmotes.emoteListOffset--;
|
|
PlayerEmotes_BuildEmotesList( &s_playerEmotes.emoteListOffset );
|
|
PlayerEmotes_UpdateScrollBar( &s_playerEmotes.scrollBar );
|
|
break;
|
|
case ID_LIST_DN:
|
|
s_playerEmotes.emoteListOffset++;
|
|
PlayerEmotes_BuildEmotesList( &s_playerEmotes.emoteListOffset );
|
|
PlayerEmotes_UpdateScrollBar( &s_playerEmotes.scrollBar );
|
|
break;
|
|
case ID_MAINMENU:
|
|
UI_PopMenu();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_Draw
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_Draw( void ) {
|
|
UI_MenuFrame( &s_playerEmotes.menu );
|
|
|
|
//Left side LCARS bars
|
|
trap_R_SetColor( colorTable[CT_LTGOLD1]);
|
|
UI_DrawHandlePic(30,203, 47, 70, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTBROWN1]);
|
|
UI_DrawHandlePic(30,276, 47, 78, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKRED1]);
|
|
UI_DrawHandlePic(30,357, 47, 32, uis.whiteShader);
|
|
|
|
//LCARS Numbers
|
|
UI_DrawProportionalString( 74, 66, "6154",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 84, "67144",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 188, "31456",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
UI_DrawProportionalString( 74, 206, "914344",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 279, "41634",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 360, "23513",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
UI_DrawProportionalString( 74, 395, "56123",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
UI_DrawProportionalString( 584, 142, "2112",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
//Lines for player model frame
|
|
trap_R_SetColor( colorTable[CT_LTBLUE1]);
|
|
UI_DrawHandlePic( 444, 228, 165, 1, uis.whiteShader); //81
|
|
UI_DrawHandlePic( 446, 293, 161, 1, uis.whiteShader); //83
|
|
UI_DrawHandlePic( 444, 365, 165, 1, uis.whiteShader); //81
|
|
|
|
UI_DrawHandlePic( 499, 162, 1, 266, uis.whiteShader); //136
|
|
UI_DrawHandlePic( 548, 162, 1, 266, uis.whiteShader); //136
|
|
|
|
//Draw Player
|
|
PlayerEmotes_DrawPlayer();
|
|
|
|
//Left Bracket around model picture
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(444,158, 16, 16, uis.graphicBracket1CornerLU); //81
|
|
UI_DrawHandlePic(444,174, 8, 94, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
UI_DrawHandlePic(444,271, 8, 11, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
UI_DrawHandlePic(446,285, 6, 21, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
UI_DrawHandlePic(444,310, 8, 11, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(444,324, 8, 94, uis.whiteShader);
|
|
UI_DrawHandlePic(444,418, 16, -16, uis.graphicBracket1CornerLU); //LD
|
|
|
|
//Right Bracket around model picture
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(593,158, -16, 16, uis.graphicBracket1CornerLU); //230
|
|
UI_DrawHandlePic(601,174, 8, 94, uis.whiteShader); //238
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
UI_DrawHandlePic(601,271, 8, 11, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
UI_DrawHandlePic(601,285, 6, 21, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
UI_DrawHandlePic(601,310, 8, 11, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(601,324, 8, 94, uis.whiteShader);
|
|
UI_DrawHandlePic(593,418, -16, -16, uis.graphicBracket1CornerLU); //375 //RD
|
|
|
|
//Frame around the emotes selection list
|
|
UI_DrawHandlePic( 85, 146, 8, -32, s_playerEmotes.corner_ll_4_18); // UL Corner
|
|
UI_DrawHandlePic( 85, 427, 8, 8, s_playerEmotes.corner_ll_4_4); // LL Corner
|
|
UI_DrawHandlePic( 237, 158, 32, 32, s_playerEmotes.corner_ur_18_18); // UR Corner
|
|
UI_DrawHandlePic( 239, 426, 32, 8, s_playerEmotes.corner_lr_18_4); // LR Corner
|
|
UI_DrawHandlePic( 85, 177, 4, 252, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 241, 183, 18, 18, uis.whiteShader ); //Right Side Up Arrow Button
|
|
//UI_DrawHandlePic( 241, 204, 18, 198, uis.whiteShader); // Right side
|
|
if ( s_playerEmotes.scrollBar.generic.flags & QMF_HIDDEN )
|
|
{
|
|
UI_DrawHandlePic( 241, 204, 18, 198, uis.whiteShader); // Right side
|
|
}
|
|
else
|
|
{
|
|
if ( s_playerEmotes.scrollBar.generic.y > MAX_SCROLLTOP + 4 )
|
|
UI_DrawHandlePic( 241, 204, 18, s_playerEmotes.scrollBar.generic.y - MAX_SCROLLTOP - 3, uis.whiteShader);
|
|
if ( s_playerEmotes.scrollBar.generic.bottom + 3 < 402 ) //343
|
|
UI_DrawHandlePic( 241, s_playerEmotes.scrollBar.generic.bottom + 3, 18, 402 - 3 - s_playerEmotes.scrollBar.generic.bottom, uis.whiteShader);
|
|
}
|
|
|
|
UI_DrawHandlePic( 241, 405, 18, 18, uis.whiteShader ); //Right Side Down Button
|
|
UI_DrawHandlePic( 89, 158, 151, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 90, 429, 150, 4, uis.whiteShader); // Bottom
|
|
|
|
//Frame around the specific emote parameters
|
|
UI_DrawHandlePic( 263, 146, 8, -32, s_playerEmotes.corner_ll_4_18); // UL Corner
|
|
UI_DrawHandlePic( 263, 427, 8, 8, s_playerEmotes.corner_ll_4_4); // LL Corner
|
|
UI_DrawHandlePic( 432, 146, -8, -32, s_playerEmotes.corner_ll_4_18); // UR Corner
|
|
UI_DrawHandlePic( 432, 427, -8, 8, s_playerEmotes.corner_ll_4_4); // LR Corner
|
|
UI_DrawHandlePic( 263, 178, 4, 249, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 436, 178, 4, 249, uis.whiteShader); // Right side
|
|
UI_DrawHandlePic( 267, 158, 166, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 267, 429, 168, 4, uis.whiteShader); // Bottom
|
|
|
|
//Emote Name / "Select an Emote"
|
|
{
|
|
char text[32];
|
|
|
|
if ( s_playerEmotes.selectedEmote < 0 )
|
|
Q_strncpyz( text, menu_normal_text[MNT_CHOOSEEMOTE], sizeof( text ) );
|
|
else
|
|
Q_strncpyz( text, s_playerEmotes.emoteTitle, sizeof( text ) );
|
|
|
|
UI_DrawProportionalString( 351, 189, text, UI_CENTER|UI_SMALLFONT, colorTable[CT_LTGOLD1] );
|
|
}
|
|
|
|
//Emote List Text
|
|
UI_DrawProportionalString( 92, 160, menu_normal_text[ MNT_EMOTELIST ], UI_SMALLFONT, colorTable[CT_BLACK] );
|
|
|
|
//Emote Parameters Text
|
|
UI_DrawProportionalString( 351, 160, menu_normal_text[ MNT_EMOTEPARAM ], UI_CENTER | UI_SMALLFONT, colorTable[CT_BLACK] );
|
|
|
|
//set the relevant enum for the binds button
|
|
if ( s_playerEmotes.keyBindActive )
|
|
s_playerEmotes.emoteBind.textEnum = MBT_PRESS_KEY;
|
|
else
|
|
s_playerEmotes.emoteBind.textEnum = MBT_KEY_BIND;
|
|
|
|
if ( s_playerEmotes.selectedEmote < 0 )
|
|
s_playerEmotes.playEmote.textEnum = MBT_CHANGE_OFFSET;
|
|
else
|
|
s_playerEmotes.playEmote.textEnum = MBT_DO_EMOTE;
|
|
|
|
Menu_Draw( &s_playerEmotes.menu );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_DrawBinding
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_DrawBinding( void *self ) {
|
|
qboolean focus;
|
|
menuaction_s *action;
|
|
int x,y;
|
|
int bind;
|
|
char name[20];
|
|
int buttonColor;
|
|
int textColor;
|
|
int width;
|
|
|
|
action = (menuaction_s *)self;
|
|
|
|
x = action->generic.x;
|
|
y = action->generic.y;
|
|
|
|
focus = ( Menu_ItemAtCursor( action->generic.parent ) == action );
|
|
|
|
bind = s_playerEmotes.bindValue;
|
|
|
|
//Get bind name
|
|
if ( bind <= 0 || bind >=256 ) {
|
|
Q_strncpyz( name, "???", sizeof( name ) );
|
|
}
|
|
else {
|
|
trap_Key_KeynumToStringBuf( bind, name, sizeof( name ) );
|
|
Q_strupr( name );
|
|
}
|
|
|
|
//get relevant colors
|
|
if ( focus ) {
|
|
buttonColor = CT_LTPURPLE1;
|
|
textColor = CT_WHITE;
|
|
}
|
|
else {
|
|
buttonColor = CT_DKPURPLE1;
|
|
textColor = CT_BLACK;
|
|
}
|
|
|
|
if ( focus ) {
|
|
if ( menu_button_text[action->textEnum][1] ) {
|
|
UI_DrawProportionalString( action->generic.parent->descX, action->generic.parent->descY, menu_button_text[action->textEnum][1], UI_LEFT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
}
|
|
}
|
|
|
|
width = action->width;
|
|
|
|
if ( !width ) {
|
|
if ( menu_button_text[action->textEnum][0] )
|
|
width = 19 + (SMALLCHAR_WIDTH * strlen(menu_button_text[action->textEnum][0])) + 19;
|
|
else
|
|
width = 19 + (SMALLCHAR_WIDTH * 11) + 19;
|
|
}
|
|
|
|
if ( action->generic.flags & QMF_GRAYED )
|
|
trap_R_SetColor( colorMdGrey );
|
|
else
|
|
trap_R_SetColor( colorTable[buttonColor] );
|
|
|
|
UI_DrawHandlePic( x - (width>>1), y, 19, 19, uis.graphicButtonLeftEnd);
|
|
UI_DrawHandlePic( x + (width>>1) - 19, y, -19, 19, uis.graphicButtonLeftEnd); //right
|
|
UI_DrawHandlePic( ( x - (width>>1)) + 11, y, width - 24, 19, uis.whiteShader);
|
|
trap_R_SetColor( NULL );
|
|
|
|
//button text
|
|
if ( strlen( menu_button_text[action->textEnum][0] ) ) {
|
|
UI_DrawProportionalString( x + action->textX, y + action->textY, menu_button_text[action->textEnum][0], UI_CENTER | UI_SMALLFONT, colorTable[textColor] );
|
|
}
|
|
|
|
//bind text
|
|
if ( action->generic.flags & QMF_GRAYED )
|
|
textColor = CT_DKGREY;
|
|
else
|
|
textColor = CT_WHITE;
|
|
UI_DrawProportionalString( x + action->textX, y + action->textY + MENU_BUTTON_MED_HEIGHT + 4, name, UI_CENTER | UI_SMALLFONT, colorTable[textColor] );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerEmotes_DrawScrollBar
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_DrawScrollBar( void *self )
|
|
{
|
|
qboolean focus;
|
|
menuaction_s *bar;
|
|
int *y;
|
|
int color;
|
|
int newY;
|
|
int dif;
|
|
|
|
bar = (menuaction_s *)self;
|
|
|
|
focus = ( Menu_ItemAtCursor( bar->generic.parent ) == bar );
|
|
|
|
if ( focus )
|
|
color = bar->color2;
|
|
else
|
|
color = bar->color;
|
|
|
|
trap_R_SetColor( colorTable[ color ] );
|
|
UI_DrawHandlePic( bar->generic.x, bar->generic.y, bar->width, bar->height, uis.whiteShader);
|
|
trap_R_SetColor( NULL );
|
|
|
|
if ( !s_playerEmotes.scrollData.mouseDown )
|
|
return;
|
|
|
|
if ( !trap_Key_IsDown( K_MOUSE1 ) )
|
|
{
|
|
s_playerEmotes.scrollData.mouseDown = qfalse;
|
|
uis.activemenu->noNewSelecting = qfalse;
|
|
return;
|
|
}
|
|
|
|
if ( uis.cursory == s_playerEmotes.scrollData.yStart )
|
|
return;
|
|
|
|
y = &bar->generic.y;
|
|
|
|
newY = *y + (uis.cursory - s_playerEmotes.scrollData.yStart);
|
|
|
|
if ( newY+bar->height > MAX_SCROLLTOP + MAX_SCROLLRANGE )
|
|
newY = (MAX_SCROLLTOP + MAX_SCROLLRANGE) - bar->height;
|
|
|
|
if ( newY < MAX_SCROLLTOP )
|
|
newY = MAX_SCROLLTOP;
|
|
|
|
dif = newY - *y;
|
|
|
|
s_playerEmotes.emoteListOffset += dif * (s_playerEmotes.scrollData.doubleStep ? 2 : 1);
|
|
PlayerEmotes_BuildEmotesList( &s_playerEmotes.emoteListOffset );
|
|
|
|
*y = newY;
|
|
bar->generic.top = *y;
|
|
bar->generic.bottom = *y + bar->height;
|
|
|
|
s_playerEmotes.scrollData.yStart = uis.cursory;
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerEmotes_SetupScrollBar
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_SetupScrollBar( menuaction_s *bar )
|
|
{
|
|
int height;
|
|
|
|
//first make sure it's worth enabling this at all
|
|
if ( s_playerEmotes.numEmotes <= MAX_MENULISTITEMS )
|
|
{
|
|
bar->generic.flags = QMF_INACTIVE | QMF_HIDDEN;
|
|
return;
|
|
}
|
|
|
|
//show the bar
|
|
bar->generic.flags &= ~(QMF_INACTIVE | QMF_HIDDEN);
|
|
|
|
//calculate the necessary height of the bar
|
|
//by default, assume 1 pixel per offset
|
|
height = ( MAX_SCROLLRANGE ) - ( s_playerEmotes.numEmotes - MAX_MENULISTITEMS );
|
|
|
|
//ensure box doesn't get too small
|
|
if ( height < MIN_SCROLLHEIGHT )
|
|
{
|
|
//double the step in that case
|
|
//a bit hacky, but no need for 3 since the limit isn't that high
|
|
height = ( MAX_SCROLLRANGE ) - ( s_playerEmotes.numEmotes * 0.5 - MAX_MENULISTITEMS );
|
|
s_playerEmotes.scrollData.doubleStep = qtrue;
|
|
}
|
|
else
|
|
{
|
|
s_playerEmotes.scrollData.doubleStep = qfalse;
|
|
}
|
|
|
|
//reset to top
|
|
bar->generic.y = bar->generic.top = MAX_SCROLLTOP;
|
|
|
|
bar->height = height;
|
|
bar->generic.bottom = bar->generic.y + height;
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerEmotes_UpdateScrollBar
|
|
=================
|
|
*/
|
|
static void PlayerEmotes_UpdateScrollBar( menuaction_s *bar )
|
|
{
|
|
bar->generic.y = MAX_SCROLLTOP + s_playerEmotes.emoteListOffset*(s_playerEmotes.scrollData.doubleStep ? 0.5 : 1);
|
|
bar->generic.top = bar->generic.y;
|
|
bar->generic.bottom = bar->generic.top + bar->height;
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_KeyEvent
|
|
===============
|
|
*/
|
|
static sfxHandle_t PlayerEmotes_KeyEvent ( int key ) {
|
|
menucommon_s *s;
|
|
int i;
|
|
char command[256];
|
|
int emoteId;
|
|
|
|
s = (menucommon_s *)Menu_ItemAtCursor( &s_playerEmotes.menu );
|
|
|
|
if ( s_playerEmotes.keyBindActive ) {
|
|
if (key & K_CHAR_FLAG)
|
|
goto end;
|
|
|
|
if ( key < 1 || key > 256 )
|
|
goto end;
|
|
|
|
switch ( key ) {
|
|
case K_ESCAPE:
|
|
s_playerEmotes.keyBindActive = qfalse;
|
|
return (menu_out_sound);
|
|
case '`':
|
|
goto end;
|
|
break;
|
|
}
|
|
|
|
//unbind this emote from anything else
|
|
for ( i = 1; i < 256; i++ ) {
|
|
trap_Key_GetBindingBuf( i, command, 256 );
|
|
|
|
if ( !Q_stricmp( command, va( "emote %s", bg_emoteList[s_playerEmotes.selectedEmote].name ) ) ) {
|
|
trap_Key_SetBinding( i, "" );
|
|
}
|
|
}
|
|
|
|
//set the new command
|
|
trap_Key_SetBinding( key, va( "emote %s", bg_emoteList[s_playerEmotes.selectedEmote].name ) );
|
|
s_playerEmotes.bindValue = key;
|
|
|
|
s_playerEmotes.keyBindActive = qfalse;
|
|
|
|
return ( menu_out_sound );
|
|
}
|
|
else {
|
|
//unbind the current key
|
|
if ( s->id == ID_BIND_EMOTE ) {
|
|
switch ( key ) {
|
|
case K_BACKSPACE:
|
|
case K_DEL:
|
|
case K_KP_DEL:
|
|
|
|
for ( i = 1; i < 256; i++ ) {
|
|
trap_Key_GetBindingBuf( i, command, 256 );
|
|
|
|
if ( !Q_stricmp( command, va( "emote %s", bg_emoteList[s_playerEmotes.selectedEmote].name ) ) ) {
|
|
trap_Key_SetBinding( i, "" );
|
|
s_playerEmotes.bindValue = -1;
|
|
}
|
|
}
|
|
return ( menu_out_sound );
|
|
}
|
|
}
|
|
}
|
|
|
|
//TiM - scroll bar
|
|
if ( key == K_MOUSE1 && Menu_ItemAtCursor( &s_playerEmotes.menu ) == &s_playerEmotes.scrollBar )
|
|
{
|
|
uis.activemenu->noNewSelecting = qtrue;
|
|
s_playerEmotes.scrollData.mouseDown = qtrue;
|
|
s_playerEmotes.scrollData.yStart = uis.cursory;
|
|
}
|
|
|
|
if ( key == K_MOUSE2 && ( s->id >= ID_EMOTELIST1 && s->id <= ID_EMOTELIST12 ) ) {
|
|
PlayerEmotes_ExecuteOffset();
|
|
|
|
emoteId = s_playerEmotes.mainEmotesList[ ((s->id - 100)-1)+s_playerEmotes.emoteListOffset ];
|
|
|
|
if ( emoteId >= 0 && emoteId < bg_numEmotes ) {
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait 5;emote %s\n", bg_emoteList[emoteId].name ) );
|
|
|
|
UI_ForceMenuOff();
|
|
return menu_out_sound;
|
|
}
|
|
}
|
|
|
|
end:
|
|
return ( Menu_DefaultKey( &s_playerEmotes.menu, key ) );
|
|
}
|
|
|
|
void UI_PlayerEmotes_Cache( void ) {
|
|
|
|
s_playerEmotes.corner_ll_4_4 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_4_4");
|
|
s_playerEmotes.corner_ll_4_18 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_4_18");
|
|
s_playerEmotes.corner_lr_4_18 = trap_R_RegisterShaderNoMip("menu/common/corner_lr_4_18");
|
|
s_playerEmotes.corner_lr_18_4 = trap_R_RegisterShaderNoMip("menu/common/corner_lr_18_4");
|
|
s_playerEmotes.corner_ur_18_18 = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_18");
|
|
|
|
trap_R_RegisterShaderNoMip(PIC_ARROW_UP);
|
|
trap_R_RegisterShaderNoMip(PIC_ARROW_DOWN);
|
|
}
|
|
|
|
/*
|
|
===============
|
|
PlayerEmotes_Init
|
|
===============
|
|
*/
|
|
static void PlayerEmotes_Init( void ) {
|
|
int x, y;
|
|
int i;
|
|
qboolean showRecent = qfalse;
|
|
|
|
UI_PlayerEmotes_Cache();
|
|
|
|
uis.spinView = qfalse;
|
|
uis.lastYaw = 160;
|
|
|
|
PlayerEmotes_InitModel();
|
|
|
|
s_playerEmotes.menu.wrapAround = qtrue;
|
|
s_playerEmotes.menu.fullscreen = qtrue;
|
|
s_playerEmotes.menu.draw = PlayerEmotes_Draw;
|
|
s_playerEmotes.menu.descX = MENU_DESC_X;
|
|
s_playerEmotes.menu.descY = MENU_DESC_Y;
|
|
s_playerEmotes.menu.titleX = MENU_TITLE_X;
|
|
s_playerEmotes.menu.titleY = MENU_TITLE_Y;
|
|
s_playerEmotes.menu.footNoteEnum = MNT_EMOTES;
|
|
s_playerEmotes.menu.titleI = MNT_EMOTES_MENU;
|
|
s_playerEmotes.menu.key = PlayerEmotes_KeyEvent;
|
|
|
|
x = 119;
|
|
y = 57;
|
|
s_playerEmotes.recentFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.recentFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.recentFilter.generic.x = x;
|
|
s_playerEmotes.recentFilter.generic.y = y;
|
|
s_playerEmotes.recentFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.recentFilter.generic.id = ID_RECENT;
|
|
s_playerEmotes.recentFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.recentFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.recentFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.recentFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.recentFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.recentFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.recentFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.recentFilter.textEnum = MBT_RECENT_FILTER;
|
|
s_playerEmotes.recentFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.recentFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.favoritesFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.favoritesFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.favoritesFilter.generic.x = x;
|
|
s_playerEmotes.favoritesFilter.generic.y = y;
|
|
s_playerEmotes.favoritesFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.favoritesFilter.generic.id = ID_FAVORITES;
|
|
s_playerEmotes.favoritesFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.favoritesFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.favoritesFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.favoritesFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.favoritesFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.favoritesFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.favoritesFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.favoritesFilter.textEnum = MBT_FAV_FILTER;
|
|
s_playerEmotes.favoritesFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.favoritesFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.viewAllFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.viewAllFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.viewAllFilter.generic.x = x;
|
|
s_playerEmotes.viewAllFilter.generic.y = y;
|
|
s_playerEmotes.viewAllFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.viewAllFilter.generic.id = ID_VIEWALL;
|
|
s_playerEmotes.viewAllFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.viewAllFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.viewAllFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.viewAllFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.viewAllFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.viewAllFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.viewAllFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.viewAllFilter.textEnum = MBT_ALL_FILTER;
|
|
s_playerEmotes.viewAllFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.viewAllFilter.textcolor2 = CT_WHITE;
|
|
|
|
y = 57;
|
|
x += 153;
|
|
s_playerEmotes.sittingFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.sittingFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.sittingFilter.generic.x = x;
|
|
s_playerEmotes.sittingFilter.generic.y = y;
|
|
s_playerEmotes.sittingFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.sittingFilter.generic.id = ID_SITTING;
|
|
s_playerEmotes.sittingFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.sittingFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.sittingFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.sittingFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.sittingFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.sittingFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.sittingFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.sittingFilter.textEnum = MBT_SITTING_FILTER;
|
|
s_playerEmotes.sittingFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.sittingFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.consoleFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.consoleFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.consoleFilter.generic.x = x;
|
|
s_playerEmotes.consoleFilter.generic.y = y;
|
|
s_playerEmotes.consoleFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.consoleFilter.generic.id = ID_CONSOLE;
|
|
s_playerEmotes.consoleFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.consoleFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.consoleFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.consoleFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.consoleFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.consoleFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.consoleFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.consoleFilter.textEnum = MBT_CONSOLE_FILTER;
|
|
s_playerEmotes.consoleFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.consoleFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.gestureFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.gestureFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.gestureFilter.generic.x = x;
|
|
s_playerEmotes.gestureFilter.generic.y = y;
|
|
s_playerEmotes.gestureFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.gestureFilter.generic.id = ID_GESTURE;
|
|
s_playerEmotes.gestureFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.gestureFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.gestureFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.gestureFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.gestureFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.gestureFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.gestureFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.gestureFilter.textEnum = MBT_GESTURE_FILTER;
|
|
s_playerEmotes.gestureFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.gestureFilter.textcolor2 = CT_WHITE;
|
|
|
|
x += 153;
|
|
y = 57;
|
|
s_playerEmotes.fullMotionFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.fullMotionFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.fullMotionFilter.generic.x = x;
|
|
s_playerEmotes.fullMotionFilter.generic.y = y;
|
|
s_playerEmotes.fullMotionFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.fullMotionFilter.generic.id = ID_FULLBODY;
|
|
s_playerEmotes.fullMotionFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.fullMotionFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.fullMotionFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.fullMotionFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.fullMotionFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.fullMotionFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.fullMotionFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.fullMotionFilter.textEnum = MBT_FULLMOTION_FILTER;
|
|
s_playerEmotes.fullMotionFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.fullMotionFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.injuredFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.injuredFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.injuredFilter.generic.x = x;
|
|
s_playerEmotes.injuredFilter.generic.y = y;
|
|
s_playerEmotes.injuredFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.injuredFilter.generic.id = ID_INJURED;
|
|
s_playerEmotes.injuredFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.injuredFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.injuredFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.injuredFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.injuredFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.injuredFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.injuredFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.injuredFilter.textEnum = MBT_INJURED_FILTER;
|
|
s_playerEmotes.injuredFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.injuredFilter.textcolor2 = CT_WHITE;
|
|
|
|
y += 25;
|
|
s_playerEmotes.miscFilter.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.miscFilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.miscFilter.generic.x = x;
|
|
s_playerEmotes.miscFilter.generic.y = y;
|
|
s_playerEmotes.miscFilter.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.miscFilter.generic.id = ID_MISC;
|
|
s_playerEmotes.miscFilter.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.miscFilter.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.miscFilter.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.miscFilter.color = CT_DKPURPLE1;
|
|
s_playerEmotes.miscFilter.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.miscFilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.miscFilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.miscFilter.textEnum = MBT_MISC_FILTER;
|
|
s_playerEmotes.miscFilter.textcolor = CT_BLACK;
|
|
s_playerEmotes.miscFilter.textcolor2 = CT_WHITE;
|
|
|
|
x = 90;
|
|
y = 179;
|
|
for (i = 0; i < MAX_MENULISTITEMS; i++ ) {
|
|
s_playerEmotes.emotesMenu[i].generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.emotesMenu[i].generic.flags = QMF_INACTIVE | QMF_HIDDEN;
|
|
s_playerEmotes.emotesMenu[i].generic.x = x;
|
|
s_playerEmotes.emotesMenu[i].generic.y = y;
|
|
s_playerEmotes.emotesMenu[i].generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.emotesMenu[i].generic.id = ID_EMOTELIST1+i;
|
|
s_playerEmotes.emotesMenu[i].width = 129;
|
|
s_playerEmotes.emotesMenu[i].height = 16;
|
|
s_playerEmotes.emotesMenu[i].color = CT_DKPURPLE1;
|
|
s_playerEmotes.emotesMenu[i].color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.emotesMenu[i].textPtr = NULL;
|
|
s_playerEmotes.emotesMenu[i].textX = 4;
|
|
s_playerEmotes.emotesMenu[i].textY = 1;
|
|
s_playerEmotes.emotesMenu[i].textcolor = CT_DKGOLD1;
|
|
s_playerEmotes.emotesMenu[i].textcolor2 = CT_LTGOLD1;
|
|
s_playerEmotes.emotesMenu[i].textStyle = UI_SMALLFONT;
|
|
|
|
y += 21;
|
|
}
|
|
|
|
s_playerEmotes.upArrow.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.upArrow.generic.flags = QMF_INACTIVE | QMF_GRAYED;
|
|
s_playerEmotes.upArrow.generic.x = 242;
|
|
s_playerEmotes.upArrow.generic.y = 185;
|
|
s_playerEmotes.upArrow.generic.name = PIC_ARROW_UP;
|
|
s_playerEmotes.upArrow.generic.id = ID_LIST_UP;
|
|
s_playerEmotes.upArrow.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.upArrow.width = 16;
|
|
s_playerEmotes.upArrow.height = 16;
|
|
s_playerEmotes.upArrow.color = CT_DKPURPLE1;
|
|
s_playerEmotes.upArrow.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.upArrow.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.upArrow.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.upArrow.textcolor = CT_BLACK;
|
|
s_playerEmotes.upArrow.textcolor2 = CT_WHITE;
|
|
|
|
s_playerEmotes.dnArrow.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.dnArrow.generic.flags = QMF_INACTIVE | QMF_GRAYED;
|
|
s_playerEmotes.dnArrow.generic.x = 242;
|
|
s_playerEmotes.dnArrow.generic.y = 407;
|
|
s_playerEmotes.dnArrow.generic.name = PIC_ARROW_DOWN;
|
|
s_playerEmotes.dnArrow.generic.id = ID_LIST_DN;
|
|
s_playerEmotes.dnArrow.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.dnArrow.width = 16;
|
|
s_playerEmotes.dnArrow.height = 16;
|
|
s_playerEmotes.dnArrow.color = CT_DKPURPLE1;
|
|
s_playerEmotes.dnArrow.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.dnArrow.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.dnArrow.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.dnArrow.textcolor = CT_BLACK;
|
|
s_playerEmotes.dnArrow.textcolor2 = CT_WHITE;
|
|
|
|
s_playerEmotes.mainMenu.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.mainMenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.mainMenu.generic.x = 482;
|
|
s_playerEmotes.mainMenu.generic.y = 136;
|
|
s_playerEmotes.mainMenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_playerEmotes.mainMenu.generic.id = ID_MAINMENU;
|
|
s_playerEmotes.mainMenu.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.mainMenu.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playerEmotes.mainMenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playerEmotes.mainMenu.color = CT_DKPURPLE1;
|
|
s_playerEmotes.mainMenu.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.mainMenu.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.mainMenu.textY = MENU_BUTTON_TEXT_Y;
|
|
if ( !ingameFlag || !s_playerEmotes.fromConsole)
|
|
s_playerEmotes.mainMenu.textEnum = MBT_MAINMENU;
|
|
else
|
|
s_playerEmotes.mainMenu.textEnum = MBT_INGAMERESUME;
|
|
s_playerEmotes.mainMenu.textcolor = CT_BLACK;
|
|
s_playerEmotes.mainMenu.textcolor2 = CT_WHITE;
|
|
|
|
s_playerEmotes.modelOffset.generic.type = MTYPE_FIELD;
|
|
s_playerEmotes.modelOffset.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.modelOffset.generic.x = 351;
|
|
s_playerEmotes.modelOffset.generic.y = 225;
|
|
s_playerEmotes.modelOffset.generic.name = menu_normal_text[ MNT_MODELOFFSET ]; //TiM : This var was untouched from Q3, so I've modded it for RPG-X functionality
|
|
s_playerEmotes.modelOffset.field.widthInChars = 14;
|
|
s_playerEmotes.modelOffset.field.maxchars = 5;
|
|
s_playerEmotes.modelOffset.field.titleEnum = MBT_MODEL_OFFSET;
|
|
s_playerEmotes.modelOffset.field.textcolor = CT_WHITE; //CT_DKGOLD1
|
|
s_playerEmotes.modelOffset.field.textcolor2 = CT_WHITE; //CT_DKGOLD1
|
|
s_playerEmotes.modelOffset.field.style = UI_CENTER | UI_SMALLFONT; //Due to Raven's hacky nature, and my exploiting it therefore, SMALLFONT MUST accompany CENTER
|
|
|
|
s_playerEmotes.emoteBind.generic.type = MTYPE_ACTION;
|
|
s_playerEmotes.emoteBind.generic.flags = QMF_CENTER_JUSTIFY | QMF_GRAYED | QMF_INACTIVE;
|
|
s_playerEmotes.emoteBind.generic.x = 351;
|
|
s_playerEmotes.emoteBind.generic.y = 291;
|
|
s_playerEmotes.emoteBind.generic.id = ID_BIND_EMOTE;
|
|
s_playerEmotes.emoteBind.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.emoteBind.generic.ownerdraw = PlayerEmotes_DrawBinding;
|
|
s_playerEmotes.emoteBind.textEnum = MBT_KEY_BIND;
|
|
s_playerEmotes.emoteBind.width = 133;
|
|
s_playerEmotes.emoteBind.height = 39;
|
|
s_playerEmotes.emoteBind.textY = 2;
|
|
|
|
s_playerEmotes.addFav.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.addFav.generic.flags = QMF_GRAYED | QMF_INACTIVE;
|
|
s_playerEmotes.addFav.generic.x = 273;
|
|
s_playerEmotes.addFav.generic.y = 355;
|
|
s_playerEmotes.addFav.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.addFav.generic.id = ID_FAV_EMOTE;
|
|
s_playerEmotes.addFav.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.addFav.width = 157;
|
|
s_playerEmotes.addFav.height = 19;
|
|
s_playerEmotes.addFav.color = CT_DKPURPLE1;
|
|
s_playerEmotes.addFav.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.addFav.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.addFav.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.addFav.textEnum = MBT_FAV_EMOTE;
|
|
s_playerEmotes.addFav.textcolor = CT_BLACK;
|
|
s_playerEmotes.addFav.textcolor2 = CT_WHITE;
|
|
|
|
s_playerEmotes.playEmote.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.playEmote.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playerEmotes.playEmote.generic.x = 273;
|
|
s_playerEmotes.playEmote.generic.y = 381;
|
|
s_playerEmotes.playEmote.generic.name = GRAPHIC_SQUARE;
|
|
s_playerEmotes.playEmote.generic.id = ID_DO_EMOTE;
|
|
s_playerEmotes.playEmote.generic.callback = PlayerEmotes_Event;
|
|
s_playerEmotes.playEmote.width = 157;
|
|
s_playerEmotes.playEmote.height = 43;
|
|
s_playerEmotes.playEmote.color = CT_DKPURPLE1;
|
|
s_playerEmotes.playEmote.color2 = CT_LTPURPLE1;
|
|
s_playerEmotes.playEmote.textX = MENU_BUTTON_TEXT_X;
|
|
s_playerEmotes.playEmote.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playerEmotes.playEmote.textEnum = MBT_DO_EMOTE;
|
|
s_playerEmotes.playEmote.textcolor = CT_BLACK;
|
|
s_playerEmotes.playEmote.textcolor2 = CT_WHITE;
|
|
|
|
//Spinbox for player model
|
|
s_playerEmotes.playerMdl.generic.type = MTYPE_BITMAP;
|
|
s_playerEmotes.playerMdl.generic.flags = QMF_SILENT; //INACTIVE
|
|
s_playerEmotes.playerMdl.generic.callback = PlayerEmotes_SpinPlayer;
|
|
s_playerEmotes.playerMdl.generic.x = 82+363; //440 //25
|
|
s_playerEmotes.playerMdl.generic.y = 158; //95
|
|
s_playerEmotes.playerMdl.width = 164; //32*6.6 //211.2 //246.2
|
|
s_playerEmotes.playerMdl.height = 276; //56*6.6 //369.6 //404.6
|
|
|
|
s_playerEmotes.scrollBar.generic.type = MTYPE_ACTION;
|
|
s_playerEmotes.scrollBar.generic.flags = QMF_INACTIVE | QMF_HIDDEN;
|
|
s_playerEmotes.scrollBar.generic.x = 241;
|
|
s_playerEmotes.scrollBar.generic.y = 204;
|
|
s_playerEmotes.scrollBar.generic.id = ID_SCROLLBAR;
|
|
s_playerEmotes.scrollBar.generic.ownerdraw = PlayerEmotes_DrawScrollBar;
|
|
s_playerEmotes.scrollBar.width = 18;
|
|
s_playerEmotes.scrollBar.height = MIN_SCROLLHEIGHT;
|
|
s_playerEmotes.scrollBar.color = CT_DKPURPLE1;
|
|
s_playerEmotes.scrollBar.color2 = CT_LTPURPLE1;
|
|
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.recentFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.favoritesFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.viewAllFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.sittingFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.consoleFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.gestureFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.fullMotionFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.injuredFilter );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.miscFilter );
|
|
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.upArrow );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.scrollBar );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.dnArrow );
|
|
|
|
for (i = 0; i < MAX_MENULISTITEMS; i++ ) {
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.emotesMenu[i] );
|
|
}
|
|
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.modelOffset );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.emoteBind );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.addFav );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.playEmote );
|
|
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.playerMdl );
|
|
Menu_AddItem( &s_playerEmotes.menu, &s_playerEmotes.mainMenu );
|
|
|
|
//Emote data initialization
|
|
//trap_Cvar_VariableStringBuffer( "modelOffset", modelOffset, sizeof( modelOffset ) );
|
|
s_playerEmotes.prevOffset = (int)trap_Cvar_VariableValue("modelOffset");
|
|
Q_strncpyz( s_playerEmotes.modelOffset.field.buffer, va("%i", s_playerEmotes.prevOffset), s_playerEmotes.modelOffset.field.maxchars );
|
|
|
|
s_playerEmotes.selectedEmote = -1;
|
|
|
|
//cheesy hack, but it works. if there's nothing in the recent array, do display all
|
|
for ( i = 1; i <= NUM_CVAR_STORES; i++ ) {
|
|
if ( (int)trap_Cvar_VariableValue( va( "ui_recentEmote%i", i ) ) >= 0 ) {
|
|
showRecent = qtrue;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !showRecent ) {
|
|
Menu_SetCursorToItem( &s_playerEmotes.menu, &s_playerEmotes.viewAllFilter );
|
|
PlayerEmotes_FillEmotesArray( ID_VIEWALL );
|
|
}
|
|
else {
|
|
Menu_SetCursorToItem( &s_playerEmotes.menu, &s_playerEmotes.recentFilter );
|
|
PlayerEmotes_FillEmotesArray( ID_RECENT );
|
|
}
|
|
|
|
PlayerEmotes_SetupScrollBar( &s_playerEmotes.scrollBar );
|
|
PlayerEmotes_UpdateScrollBar( &s_playerEmotes.scrollBar );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
UI_EmotesMenu
|
|
===============
|
|
*/
|
|
void UI_EmotesMenu( qboolean fromConsole ) {
|
|
memset( &s_playerEmotes, 0, sizeof( s_playerEmotes ) );
|
|
|
|
s_playerEmotes.fromConsole = fromConsole;
|
|
PlayerEmotes_Init();
|
|
|
|
ingameFlag = qtrue;
|
|
Mouse_Show();
|
|
|
|
UI_PushMenu( &s_playerEmotes.menu );
|
|
}
|