mirror of
https://github.com/UberGames/RPG-X2.git
synced 2024-11-24 21:32:36 +00:00
1509 lines
46 KiB
C
1509 lines
46 KiB
C
// Copyright (C) 1999-2000 Id Software, Inc.
|
|
//
|
|
//=================================================
|
|
//
|
|
// TiM: Just a reference for my whacky jargon in here
|
|
// Character = the player model as a whole group (ie kulhane )
|
|
// Model = the .model file used to build the character ( ie admiral, cadet etc)
|
|
// Skin = the skinset field in the .model file, dictating which .skins to use (ie red/teal/gold... )
|
|
//
|
|
//=================================================
|
|
#include "ui_local.h"
|
|
|
|
#define MODEL_SELECT "menu/art/opponents_select"
|
|
#define MODEL_SELECTED "menu/art/opponents_selected"
|
|
//#define PIC_ARROW_LEFT "menu/common/arrow_left_16.tga"
|
|
//#define PIC_ARROW_RIGHT "menu/common/arrow_right_16.tga"
|
|
|
|
#define PIC_ARROW_UP "menu/common/arrow_up_16.tga"
|
|
#define PIC_ARROW_DOWN "menu/common/arrow_dn_16.tga"
|
|
|
|
#define LOW_MEMORY (5 * 1024 * 1024)
|
|
|
|
#define MAX_PLAYERNAMELENGTH 21
|
|
|
|
|
|
static void PlayerModel_BuildList( void );
|
|
static void PlayerModel_SetMenuItems( void );
|
|
static void PlayerModel_MenuInit(int menuFrom);
|
|
|
|
static char* playermodel_artlist[] =
|
|
{
|
|
MODEL_SELECT,
|
|
MODEL_SELECTED,
|
|
NULL
|
|
};
|
|
|
|
int s_SkinFilter_Names[] =
|
|
{
|
|
MNT_DEFAULT,
|
|
MNT_BLUE,
|
|
MNT_RED,
|
|
MNT_NONE
|
|
};
|
|
|
|
//#define PLAYERGRID_COLS 4
|
|
//#define PLAYERGRID_ROWS 3
|
|
//#define MAX_MODELSPERPAGE (PLAYERGRID_ROWS*PLAYERGRID_COLS)
|
|
|
|
#define MAX_PLAYERCHARS 256
|
|
#define MAX_PLAYERMODELS 12
|
|
#define MAX_PLAYERSKINS 24
|
|
|
|
#define MAX_MENULISTITEMS 12
|
|
|
|
#define ID_MENUCHAR0 0
|
|
#define ID_MENUCHAR1 1
|
|
#define ID_MENUCHAR2 2
|
|
#define ID_MENUCHAR3 3
|
|
#define ID_MENUCHAR4 4
|
|
#define ID_MENUCHAR5 5
|
|
#define ID_MENUCHAR6 6
|
|
#define ID_MENUCHAR7 7
|
|
#define ID_MENUCHAR8 8
|
|
#define ID_MENUCHAR9 9
|
|
#define ID_MENUCHAR10 10
|
|
#define ID_MENUCHAR11 11
|
|
|
|
//#define ID_PLAYERPIC0 0
|
|
//#define ID_PLAYERPIC1 1
|
|
//#define ID_PLAYERPIC2 2
|
|
//#define ID_PLAYERPIC3 3
|
|
//#define ID_PLAYERPIC4 4
|
|
//#define ID_PLAYERPIC5 5
|
|
//#define ID_PLAYERPIC6 6
|
|
//#define ID_PLAYERPIC7 7
|
|
//#define ID_PLAYERPIC8 8
|
|
//#define ID_PLAYERPIC9 9
|
|
//#define ID_PLAYERPIC10 10
|
|
//#define ID_PLAYERPIC11 11
|
|
//#define ID_PLAYERPIC12 12
|
|
//#define ID_PLAYERPIC13 13
|
|
//#define ID_PLAYERPIC14 14
|
|
//#define ID_PLAYERPIC15 15
|
|
#define ID_UPARROW 100
|
|
#define ID_DNARROW 101
|
|
#define ID_BACK 102
|
|
#define ID_MAINMENU 103
|
|
#define ID_INGAMEMENU 104
|
|
|
|
#define ID_APPLY 105
|
|
|
|
//#define ID_SKINFILTER 112
|
|
|
|
#define ID_SETTINGS 20
|
|
|
|
typedef struct
|
|
{
|
|
menuframework_s menu;
|
|
int prevMenu;
|
|
//menubitmap_s pics[MAX_MODELSPERPAGE];
|
|
//menubitmap_s picbuttons[MAX_MODELSPERPAGE];
|
|
//menubitmap_s framel;
|
|
//menubitmap_s framer;
|
|
//menubitmap_s ports;
|
|
menubitmap_s mainmenu;
|
|
menubitmap_s back;
|
|
menubitmap_s player;
|
|
//menubitmap_s arrows;
|
|
//menubitmap_s left;
|
|
//menubitmap_s right;
|
|
|
|
menubitmap_s charMenu[MAX_MENULISTITEMS];
|
|
|
|
menubitmap_s upArrow;
|
|
menubitmap_s dnArrow;
|
|
|
|
menulist_s charModel;
|
|
menulist_s charSkin;
|
|
|
|
menubitmap_s apply;
|
|
|
|
menubitmap_s data;
|
|
menubitmap_s model;
|
|
|
|
//menulist_s skinfilter;
|
|
|
|
qhandle_t corner_ll_4_4;
|
|
qhandle_t corner_ll_4_18;
|
|
qhandle_t corner_lr_4_18;
|
|
qhandle_t corner_lr_18_4;
|
|
qhandle_t corner_ur_18_18;
|
|
|
|
qhandle_t playerIcon;
|
|
|
|
menutext_s modelname;
|
|
menutext_s skinname;
|
|
menutext_s skinnameviewed;
|
|
menutext_s playername;
|
|
playerInfo_t playerinfo;
|
|
|
|
int numChars;
|
|
char charNames[MAX_PLAYERCHARS][128];
|
|
char* modelNames[MAX_PLAYERMODELS];
|
|
char* skinNames[MAX_PLAYERSKINS];
|
|
|
|
//int modelpage;
|
|
//int numpages;
|
|
char modelData[64];
|
|
char modelName[32];
|
|
|
|
int selectedChar;
|
|
|
|
int scrollOffset;
|
|
} playermodel_t;
|
|
|
|
static playermodel_t s_playermodel;
|
|
|
|
//#define FILTER_DEFAULT 0
|
|
//#define FILTER_RED 1
|
|
//#define FILTER_BLUE 2
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_LoadAvailableModels
|
|
TiM: Loads a list of all the .model
|
|
files there are in a character's directory.
|
|
|
|
NB: In Spin Control menu types, the number
|
|
of elements is calced on init only. Each
|
|
time we refresh this, we'll need to update ourselves.
|
|
=================
|
|
*/
|
|
int PlayerModel_LoadAvailableModels( char* charModels[] ) {
|
|
int i;
|
|
int numFiles;
|
|
char fileList[2048]; //Hopefully, this will never be exceed ROFL
|
|
char* filePtr;
|
|
int fileLen;
|
|
int strLen;
|
|
|
|
//Get our num files
|
|
memset( &fileList, 0, sizeof ( fileList ) );
|
|
numFiles = trap_FS_GetFileList( va( "models/players_rpgx/%s", s_playermodel.charNames[s_playermodel.selectedChar + s_playermodel.scrollOffset] ), ".model", fileList, sizeof(fileList) );
|
|
|
|
if ( !numFiles )
|
|
return 0;
|
|
|
|
//Convert to ptr for easier manip
|
|
filePtr = fileList;
|
|
|
|
//iterate thru all the null terminations in this thing
|
|
for ( i = 0; i < numFiles && i < MAX_PLAYERMODELS; i++, filePtr += fileLen+1 ) {
|
|
fileLen = strlen( filePtr );
|
|
|
|
if ( !fileLen || !filePtr )
|
|
break;
|
|
|
|
charModels[i] = filePtr;
|
|
|
|
//TiM: Strip extension
|
|
strLen = strlen( charModels[i] );
|
|
if ( strLen > 6 && !Q_stricmp( charModels[i] + strLen - 6, ".model" ) ) {
|
|
charModels[i][strLen-6] = '\0';
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
/*
|
|
================
|
|
PlayerModel_LoadAvailableSkins
|
|
TiM: Access our selected .model file and
|
|
fill the skin array with all the skins we found.
|
|
|
|
Hoi... this could get complicated... O_o
|
|
================
|
|
*/
|
|
int PlayerModel_LoadAvailableSkins( char* charSkins[] ) {
|
|
int i=0;
|
|
int fileLen;
|
|
char fileBuffer[2048];
|
|
char* filePtr;
|
|
fileHandle_t f;
|
|
char* filePath;
|
|
char* token;
|
|
|
|
filePath = va( "models/players_rpgx/%s/%s.model",
|
|
s_playermodel.charNames[s_playermodel.selectedChar + s_playermodel.scrollOffset],
|
|
s_playermodel.modelNames[s_playermodel.charModel.curvalue] );
|
|
|
|
//load the .model data into our active buffer
|
|
memset( &fileBuffer, 0, sizeof( fileBuffer ) );
|
|
fileLen = trap_FS_FOpenFile( filePath, &f, FS_READ);
|
|
|
|
if ( fileLen <= 0 ) {
|
|
Com_Printf( S_COLOR_RED "File not found: %s\n", filePath );
|
|
return 0;
|
|
}
|
|
|
|
if ( fileLen > sizeof ( fileBuffer ) ) {
|
|
Com_Printf( S_COLOR_RED "File exceeded maximum size: %s\n", filePath );
|
|
return 0;
|
|
}
|
|
|
|
trap_FS_Read( fileBuffer, sizeof( fileBuffer ), f );
|
|
|
|
if ( !fileBuffer[0] )
|
|
return 0;
|
|
|
|
filePtr = fileBuffer;
|
|
|
|
//Loop thru our buffer 'til we find ourselves the right skin data
|
|
while ( i < MAX_PLAYERSKINS ) {
|
|
|
|
token = COM_Parse( &filePtr );
|
|
if ( !token || !filePtr )
|
|
break;
|
|
|
|
if ( !Q_stricmp( token, "skinName" ) ) {
|
|
if ( COM_ParseString( &filePtr, &token ) ) {
|
|
continue;
|
|
}
|
|
|
|
charSkins[i] = token;
|
|
i++;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_OffsetCharList
|
|
|
|
TiM: Called whenever we scroll the model list.
|
|
So it'll cycle the value of each one up and down.
|
|
==================
|
|
*/
|
|
|
|
void PlayerModel_OffsetCharList( int* offset ) {
|
|
char* buffer; //intermediate value so performing strupr won't pwn our case sensitive data
|
|
int i;
|
|
|
|
if ( *offset < 0 ) {
|
|
*offset = 0;
|
|
}
|
|
|
|
if ( ( s_playermodel.numChars > MAX_MENULISTITEMS) && (*offset > (s_playermodel.numChars - MAX_MENULISTITEMS ) ) ) {
|
|
*offset = (s_playermodel.numChars - MAX_MENULISTITEMS );
|
|
}
|
|
|
|
for ( i = 0; i < MAX_MENULISTITEMS; i++ ) {
|
|
buffer = s_playermodel.charNames[i + *offset];
|
|
|
|
//Com_Printf( "Buffer - %s\n", buffer );
|
|
|
|
if ( !buffer )
|
|
break;
|
|
|
|
s_playermodel.charMenu[i].generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.charMenu[i].textPtr = Q_strupr( buffer );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_UpdateGrid
|
|
=================
|
|
*/
|
|
/*static void PlayerModel_UpdateGrid( void )
|
|
{
|
|
int i;
|
|
int j;
|
|
|
|
j = s_playermodel.modelpage * MAX_MODELSPERPAGE;
|
|
for (i=0; i<PLAYERGRID_ROWS*PLAYERGRID_COLS; i++,j++)
|
|
{
|
|
if (j < s_playermodel.nummodels)
|
|
{
|
|
// model/skin portrait
|
|
s_playermodel.pics[i].generic.name = s_playermodel.modelnames[j];
|
|
s_playermodel.picbuttons[i].generic.flags &= ~QMF_INACTIVE;
|
|
}
|
|
else
|
|
{
|
|
// dead slot
|
|
s_playermodel.pics[i].generic.name = NULL;
|
|
s_playermodel.picbuttons[i].generic.flags |= QMF_INACTIVE;
|
|
}
|
|
|
|
s_playermodel.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
s_playermodel.pics[i].shader = 0;
|
|
s_playermodel.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
|
|
}
|
|
|
|
if (s_playermodel.selectedmodel/MAX_MODELSPERPAGE == s_playermodel.modelpage)
|
|
{
|
|
// set selected model
|
|
i = s_playermodel.selectedmodel % MAX_MODELSPERPAGE;
|
|
|
|
s_playermodel.pics[i].generic.flags |= QMF_HIGHLIGHT;
|
|
s_playermodel.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
|
|
}
|
|
|
|
if (s_playermodel.numpages > 1)
|
|
{
|
|
if (s_playermodel.modelpage > 0)
|
|
{
|
|
s_playermodel.left.generic.flags &= ~QMF_INACTIVE;
|
|
s_playermodel.left.generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
else
|
|
{
|
|
s_playermodel.left.generic.flags |= QMF_INACTIVE | QMF_GRAYED;
|
|
}
|
|
|
|
if (s_playermodel.modelpage < s_playermodel.numpages-1)
|
|
{
|
|
s_playermodel.right.generic.flags &= ~QMF_INACTIVE;
|
|
s_playermodel.right.generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
else
|
|
{
|
|
s_playermodel.right.generic.flags |= QMF_INACTIVE | QMF_GRAYED;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// hide left/right markers
|
|
s_playermodel.left.generic.flags |= QMF_INACTIVE | QMF_GRAYED;
|
|
s_playermodel.right.generic.flags |= QMF_INACTIVE | QMF_GRAYED;
|
|
}
|
|
}*/
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_SpinPlayer
|
|
=================
|
|
*/
|
|
static void PlayerModel_SpinPlayer( void* ptr, int event)
|
|
{
|
|
if ( event == QM_ACTIVATED )
|
|
{
|
|
uis.spinView = qtrue;
|
|
uis.cursorpx = uis.cursorx;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_UpdateModel
|
|
=================
|
|
*/
|
|
static void PlayerModel_UpdateModel( void )
|
|
{
|
|
vec3_t viewangles;
|
|
vec3_t moveangles;
|
|
|
|
memset( &s_playermodel.playerinfo, 0, sizeof(playerInfo_t) );
|
|
|
|
/*if (uis.spinView) {
|
|
// yawDelta = ( uis.cursorx - uis.cursorpx ) + placeHolder / ( uis.frametime / 1000.0f ) ) / 20.0f*/; //5.0f
|
|
|
|
// yaw = AngleNormalize360 ( yawDelta );
|
|
// }
|
|
|
|
viewangles[YAW] = uis.lastYaw;
|
|
viewangles[PITCH] = 0;
|
|
viewangles[ROLL] = 0;
|
|
VectorClear( moveangles );
|
|
|
|
UI_PlayerInfo_SetModel( &s_playermodel.playerinfo, s_playermodel.modelData );
|
|
UI_PlayerInfo_SetInfo( &s_playermodel.playerinfo, BOTH_STAND4, BOTH_STAND4, viewangles, moveangles, WP_COMPRESSION_RIFLE, qfalse );
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_SaveChanges
|
|
=================
|
|
*/
|
|
static void PlayerModel_SaveChanges( void )
|
|
{
|
|
trap_Cvar_Set( "model", s_playermodel.modelData );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_MenuEvent
|
|
=================
|
|
*/
|
|
static void PlayerModel_MenuEvent( void* ptr, int event )
|
|
{
|
|
|
|
if (event != QM_ACTIVATED)
|
|
return;
|
|
|
|
switch (((menucommon_s*)ptr)->id)
|
|
{
|
|
/*case ID_PREVPAGE:
|
|
if (s_playermodel.modelpage > 0)
|
|
{
|
|
s_playermodel.modelpage--;
|
|
PlayerModel_UpdateGrid();
|
|
}
|
|
break;
|
|
|
|
case ID_NEXTPAGE:
|
|
if (s_playermodel.modelpage < s_playermodel.numpages-1)
|
|
{
|
|
s_playermodel.modelpage++;
|
|
PlayerModel_UpdateGrid();
|
|
}
|
|
break;*/
|
|
|
|
case ID_BACK:
|
|
PlayerModel_SaveChanges();
|
|
UI_PopMenu();
|
|
break;
|
|
|
|
case ID_MAINMENU:
|
|
PlayerModel_SaveChanges();
|
|
UI_MainMenu();
|
|
break;
|
|
|
|
case ID_INGAMEMENU:
|
|
PlayerModel_SaveChanges();
|
|
UI_InGameMenu();
|
|
break;
|
|
|
|
case ID_SETTINGS:
|
|
UI_PopMenu();
|
|
PlayerModel_SaveChanges();
|
|
UI_PlayerSettingsMenu(s_playermodel.prevMenu);
|
|
break;
|
|
|
|
case ID_DNARROW:
|
|
s_playermodel.scrollOffset++;
|
|
PlayerModel_OffsetCharList( &s_playermodel.scrollOffset );
|
|
break;
|
|
|
|
case ID_UPARROW:
|
|
s_playermodel.scrollOffset--;
|
|
PlayerModel_OffsetCharList( &s_playermodel.scrollOffset );
|
|
break;
|
|
|
|
case ID_MENUCHAR0:
|
|
case ID_MENUCHAR1:
|
|
case ID_MENUCHAR2:
|
|
case ID_MENUCHAR3:
|
|
case ID_MENUCHAR4:
|
|
case ID_MENUCHAR5:
|
|
case ID_MENUCHAR6:
|
|
case ID_MENUCHAR7:
|
|
case ID_MENUCHAR8:
|
|
case ID_MENUCHAR9:
|
|
case ID_MENUCHAR10:
|
|
case ID_MENUCHAR11:
|
|
s_playermodel.selectedChar = ( ((menucommon_s*)ptr)->id - ID_MENUCHAR0 ) + s_playermodel.scrollOffset;
|
|
|
|
s_playermodel.playerIcon = trap_R_RegisterShaderNoMip( va( "models/players_rpgx/%s/model_icon.jpg", s_playermodel.charNames[s_playermodel.selectedChar] ) );
|
|
break;
|
|
|
|
//case ID_SKINFILTER:
|
|
//PlayerModel_BuildList();
|
|
//PlayerModel_UpdateGrid();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_MenuKey
|
|
=================
|
|
*/
|
|
static sfxHandle_t PlayerModel_MenuKey( int key )
|
|
{
|
|
//menucommon_s* m;
|
|
//int picnum;
|
|
|
|
switch (key)
|
|
{
|
|
/*case K_KP_LEFTARROW:
|
|
case K_LEFTARROW:
|
|
m = Menu_ItemAtCursor(&s_playermodel.menu);
|
|
picnum = m->id - ID_PLAYERPIC0;
|
|
if (picnum >= 0 && picnum <= 15)
|
|
{
|
|
if (picnum > 0)
|
|
{
|
|
Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor-1);
|
|
return (menu_move_sound);
|
|
|
|
}
|
|
else if (s_playermodel.modelpage > 0)
|
|
{
|
|
s_playermodel.modelpage--;
|
|
Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor+15);
|
|
PlayerModel_UpdateGrid();
|
|
return (menu_move_sound);
|
|
}
|
|
else
|
|
return (menu_buzz_sound);
|
|
}
|
|
break;
|
|
|
|
case K_KP_RIGHTARROW:
|
|
case K_RIGHTARROW:
|
|
m = Menu_ItemAtCursor(&s_playermodel.menu);
|
|
picnum = m->id - ID_PLAYERPIC0;
|
|
if (picnum >= 0 && picnum <= 15)
|
|
{
|
|
if ((picnum < 15) && (s_playermodel.modelpage*MAX_MODELSPERPAGE + picnum+1 < s_playermodel.nummodels))
|
|
{
|
|
Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor+1);
|
|
return (menu_move_sound);
|
|
}
|
|
else if ((picnum == 15) && (s_playermodel.modelpage < s_playermodel.numpages-1))
|
|
{
|
|
s_playermodel.modelpage++;
|
|
Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor-15);
|
|
PlayerModel_UpdateGrid();
|
|
return (menu_move_sound);
|
|
}
|
|
else
|
|
return (menu_buzz_sound);
|
|
}
|
|
break;*/
|
|
|
|
case K_MOUSE2:
|
|
case K_ESCAPE:
|
|
PlayerModel_SaveChanges();
|
|
break;
|
|
}
|
|
|
|
return ( Menu_DefaultKey( &s_playermodel.menu, key ) );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_PicEvent
|
|
=================
|
|
*/
|
|
/*static void PlayerModel_PicEvent( void* ptr, int event )
|
|
{
|
|
int modelnum;
|
|
int maxlen;
|
|
char* buffptr;
|
|
char* pdest;
|
|
int i;
|
|
|
|
if (event != QM_ACTIVATED)
|
|
return;
|
|
|
|
for (i=0; i<PLAYERGRID_ROWS*PLAYERGRID_COLS; i++)
|
|
{
|
|
// reset
|
|
s_playermodel.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
s_playermodel.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
|
|
}
|
|
|
|
// set selected
|
|
i = ((menucommon_s*)ptr)->id - ID_PLAYERPIC0;
|
|
s_playermodel.pics[i].generic.flags |= QMF_HIGHLIGHT;
|
|
s_playermodel.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
|
|
// get model and strip icon_
|
|
modelnum = s_playermodel.modelpage*MAX_MODELSPERPAGE + i;
|
|
buffptr = s_playermodel.modelnames[modelnum] + strlen("models/players2/");
|
|
pdest = strstr(buffptr,"icon_");
|
|
if (pdest)
|
|
{
|
|
// track the whole model/skin name
|
|
Q_strncpyz(s_playermodel.modelData,buffptr,pdest-buffptr+1);
|
|
strcat(s_playermodel.modelData,pdest + 5);
|
|
|
|
// seperate the model name
|
|
maxlen = pdest-buffptr;
|
|
if (maxlen > 16)
|
|
maxlen = 16;
|
|
Q_strncpyz( s_playermodel.modelname.string, buffptr, maxlen );
|
|
Q_strupr( s_playermodel.modelname.string );
|
|
|
|
// seperate the skin name
|
|
maxlen = strlen(pdest+5)+1;
|
|
if (maxlen > 16)
|
|
maxlen = 16;
|
|
Q_strncpyz( s_playermodel.skinname.string, pdest+5, maxlen );
|
|
Q_strupr( s_playermodel.skinname.string );
|
|
|
|
s_playermodel.selectedmodel = modelnum;
|
|
|
|
// kef -- make sure something like "chell/nelson" doesn't occur
|
|
if (Q_stricmp( s_playermodel.skinname.string, "red") &&
|
|
Q_stricmp( s_playermodel.skinname.string, "blue") &&
|
|
Q_stricmp( s_playermodel.skinname.string, "black") &&
|
|
Q_stricmp( s_playermodel.skinname.string, "default"))
|
|
{
|
|
// assume something like "chell/nelson" has occurred
|
|
Q_strncpyz( s_playermodel.modelname.string, s_playermodel.skinname.string, strlen(s_playermodel.skinname.string)+1 );
|
|
Q_strncpyz( s_playermodel.skinname.string, "DEFAULT", 8 );
|
|
}
|
|
|
|
// Kind of a hack to display the externalized text
|
|
if (!Q_stricmp( s_playermodel.skinname.string, "red"))
|
|
{
|
|
Q_strncpyz( s_playermodel.skinnameviewed.string, menu_normal_text[MNT_RED], strlen(menu_normal_text[MNT_RED])+1 );
|
|
}
|
|
else if (!Q_stricmp( s_playermodel.skinname.string, "blue"))
|
|
{
|
|
Q_strncpyz( s_playermodel.skinnameviewed.string, menu_normal_text[MNT_BLUE], strlen(menu_normal_text[MNT_BLUE])+1 );
|
|
}
|
|
else if (!Q_stricmp( s_playermodel.skinname.string, "default"))
|
|
{
|
|
Q_strncpyz( s_playermodel.skinnameviewed.string, menu_normal_text[MNT_DEFAULT], strlen(menu_normal_text[MNT_DEFAULT])+1 );
|
|
}
|
|
|
|
if( trap_MemoryRemaining() > LOW_MEMORY ) {
|
|
PlayerModel_UpdateModel();
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_DrawPlayer
|
|
=================
|
|
*/
|
|
static void PlayerModel_DrawPlayer( void *self )
|
|
{
|
|
menubitmap_s* b;
|
|
vec3_t origin = {-15, 0, 0 }; //-3.8
|
|
|
|
b = (menubitmap_s*) self;
|
|
|
|
if( trap_MemoryRemaining() <= LOW_MEMORY ) {
|
|
UI_DrawProportionalString( b->generic.x, b->generic.y + b->height / 2, "LOW MEMORY", UI_LEFT, color_red );
|
|
return;
|
|
}
|
|
|
|
UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, origin, &s_playermodel.playerinfo, uis.realtime/2 );
|
|
}
|
|
|
|
/*void precacheSpecificGroups(char *race_list)
|
|
{
|
|
char current_race_name[125];
|
|
char *s = race_list;
|
|
char *max_place = race_list + strlen(race_list);
|
|
char *marker;
|
|
|
|
|
|
memset(current_race_name, 0, sizeof(current_race_name));
|
|
// look through the list till it's empty
|
|
while (s < max_place)
|
|
{
|
|
marker = s;
|
|
// figure out from where we are where the next ',' or 0 is
|
|
while (*s != ',' && *s != 0)
|
|
{
|
|
s++;
|
|
}
|
|
|
|
// copy just that name
|
|
Q_strncpyz(current_race_name, marker, s-marker+1);
|
|
|
|
// avoid the comma or increment us past the end of the string so we fail the main while loop
|
|
s++;
|
|
|
|
// register the group wins announce sound
|
|
trap_S_RegisterSound( va( "sound/voice/computer/misc/%s_wins.wav",current_race_name ) );
|
|
|
|
// register the blue and red flag images
|
|
trap_R_RegisterShaderNoMip( va( "models/flags/%s_red", current_race_name));
|
|
trap_R_RegisterShaderNoMip( va( "models/flags/%s_blue", current_race_name));
|
|
}
|
|
}*/
|
|
|
|
extern char* BG_RegisterRace( const char *name );
|
|
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_BuildList
|
|
|
|
Heavily modifed by TiM
|
|
All we'll take into account now
|
|
is a valid directory name,
|
|
and that it contains a .model file
|
|
We'll work the rest out later
|
|
=================
|
|
*/
|
|
static void PlayerModel_BuildList( void )
|
|
{
|
|
int numdirs;
|
|
int numfiles;
|
|
char dirlist[8192];
|
|
char filelist[2048];
|
|
//char skinname[64];
|
|
char* dirptr;
|
|
//char* fileptr;
|
|
int i;
|
|
//int j;
|
|
int dirlen;
|
|
//int filelen;
|
|
//qboolean precache;
|
|
|
|
//precache = trap_Cvar_VariableValue("com_buildscript");
|
|
|
|
s_playermodel.selectedChar = 0;
|
|
//s_playermodel.modelpage = 0;
|
|
s_playermodel.numChars = 0;
|
|
|
|
// iterate directory of all player models
|
|
numdirs = trap_FS_GetFileList("models/players_rpgx", "/", dirlist, sizeof(dirlist) );
|
|
dirptr = dirlist;
|
|
|
|
///Com_Printf("%i folders found\n", numdirs );
|
|
|
|
for (i=0; i<numdirs && s_playermodel.numChars < MAX_PLAYERCHARS; i++,dirptr+=dirlen+1)
|
|
{
|
|
numfiles = 0;
|
|
|
|
dirlen = strlen(dirptr);
|
|
|
|
if ( !dirptr ) {
|
|
break;
|
|
}
|
|
|
|
if (dirlen && dirptr[dirlen-1]=='/')
|
|
dirptr[dirlen-1]='\0';
|
|
|
|
//I'm guessing this is for non-PK3'd files
|
|
if (!strcmp(dirptr,".") || !strcmp(dirptr,".."))
|
|
continue;
|
|
|
|
// TiM : Check for .model files. That's all we need
|
|
numfiles = trap_FS_GetFileList( va("models/players_rpgx/%s",dirptr), ".model", filelist, sizeof(filelist) );
|
|
|
|
if ( numfiles > 0 && dirptr[0] ) {
|
|
//Com_Printf( "Hashed %s with %i model files\n", dirptr, numfiles);
|
|
|
|
Q_strncpyz( s_playermodel.charNames[s_playermodel.numChars], dirptr, sizeof( s_playermodel.charNames[s_playermodel.numChars] ) );
|
|
s_playermodel.numChars++;
|
|
}
|
|
|
|
|
|
|
|
//fileptr = filelist;
|
|
//for (j=0; j<numfiles && s_playermodel.nummodels < MAX_PLAYERMODELS;j++,fileptr+=filelen+1)
|
|
//{
|
|
// filelen = strlen(fileptr);
|
|
|
|
// COM_StripExtension(fileptr,skinname);
|
|
|
|
// // look for icon_????
|
|
// if (!Q_stricmpn(skinname,"icon_",5))
|
|
// { //inside here skinname is always "icon_*"
|
|
// if (!precache) {
|
|
// if (s_playermodel.skinfilter.curvalue == 0)
|
|
// {
|
|
// // no nelson/kenn team skins
|
|
// if (Q_stricmp(skinname+5 ,"default"))
|
|
// {
|
|
// continue;
|
|
// }
|
|
// // No red team skins
|
|
// if (!Q_stricmp(skinname+5 ,"red"))
|
|
// {
|
|
// continue;
|
|
// }
|
|
// // No blue team skins
|
|
// if (!Q_stricmp(skinname+5 ,"blue"))
|
|
// {
|
|
// continue;
|
|
// }
|
|
// }
|
|
//
|
|
// if (s_playermodel.skinfilter.curvalue == 1)
|
|
// {
|
|
// // Only blue team skins
|
|
// if (Q_stricmp(skinname+5 ,"blue"))
|
|
// {
|
|
// continue;
|
|
// }
|
|
// }
|
|
//
|
|
// if (s_playermodel.skinfilter.curvalue == 2)
|
|
// {
|
|
// // Only blue team skins
|
|
// if (Q_stricmp(skinname+5 ,"red"))
|
|
// {
|
|
// continue;
|
|
// }
|
|
// }
|
|
// }
|
|
// //Com_sprintf( s_playermodel.modelnames[s_playermodel.nummodels++],
|
|
// //sizeof( s_playermodel.modelnames[s_playermodel.nummodels] ),
|
|
// //"models/players2/%s/%s", dirptr, skinname );
|
|
//
|
|
// /*if( precache ) { //per skin type inside a dir
|
|
// if( Q_stricmp( skinname+5, "default" ) == 0 ) { //+5 to skip past "icon_"
|
|
// continue;
|
|
// }
|
|
// if( Q_stricmp( skinname+5, "red" ) == 0 ) {
|
|
// continue;
|
|
// }
|
|
// if( Q_stricmp( skinname+5, "blue" ) == 0 ) {
|
|
// continue;
|
|
// }
|
|
// trap_S_RegisterSound( va( "sound/voice/computer/misc/%s_wins.wav",skinname+5 ) );
|
|
// }*/
|
|
// }
|
|
//}
|
|
|
|
/*if( precache ) { //per modelname (dir)
|
|
trap_S_RegisterSound( va( "sound/voice/computer/misc/%s_wins.wav",dirptr ) );
|
|
trap_S_RegisterSound( va( "sound/voice/computer/misc/%s.wav", dirptr ) );
|
|
precacheSpecificGroups( BG_RegisterRace(va("models/players2/%s/groups.cfg", dirptr)));
|
|
}*/
|
|
}
|
|
|
|
/*s_playermodel.numpages = s_playermodel.nummodels/MAX_MODELSPERPAGE;
|
|
if (s_playermodel.nummodels % MAX_MODELSPERPAGE)
|
|
s_playermodel.numpages++;*/
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_SetMenuItems
|
|
=================
|
|
*/
|
|
static void PlayerModel_SetMenuItems( void )
|
|
{
|
|
int i;
|
|
//int maxlen;
|
|
//char modelskin[64];
|
|
//char* buffptr;
|
|
//char* pdest;
|
|
char* temp;
|
|
char model[64];
|
|
|
|
// name
|
|
trap_Cvar_VariableStringBuffer( "name", s_playermodel.playername.string, MAX_PLAYERNAMELENGTH );
|
|
|
|
// model
|
|
trap_Cvar_VariableStringBuffer( "model", s_playermodel.modelData, 64 );
|
|
|
|
if ( ( temp = strchr( UI_Cvar_VariableString("model"), '/' ) ) == NULL ) {
|
|
Q_strncpyz( s_playermodel.modelName, UI_Cvar_VariableString("model"), sizeof( s_playermodel.modelName ) );
|
|
} else {
|
|
int len;
|
|
//
|
|
len = strlen( temp );
|
|
Q_strncpyz( s_playermodel.modelName, UI_Cvar_VariableString("model"), (len - strlen(temp)) + 1 );
|
|
}
|
|
|
|
// find model in our list
|
|
for (i=0; i<s_playermodel.numChars; i++)
|
|
{
|
|
if ( !Q_stricmp( model, s_playermodel.charNames[i] ) ) {
|
|
s_playermodel.selectedChar = i;
|
|
break;
|
|
}
|
|
|
|
// strip icon_
|
|
/*buffptr = s_playermodel.charnames[i] + strlen("models/players2/");
|
|
pdest = strstr(buffptr,"icon_");
|
|
if (pdest)
|
|
{
|
|
Q_strncpyz(modelskin,buffptr,pdest-buffptr+1);
|
|
strcat(modelskin,pdest + 5);
|
|
}
|
|
else
|
|
continue;
|
|
|
|
if (!Q_stricmp( s_playermodel.modelData, modelskin ))
|
|
{
|
|
// found pic, set selection here
|
|
s_playermodel.selectedmodel = i;
|
|
s_playermodel.modelpage = i/MAX_MODELSPERPAGE;
|
|
|
|
// seperate the model name
|
|
maxlen = pdest-buffptr;
|
|
if (maxlen > 16)
|
|
maxlen = 16;
|
|
Q_strncpyz( s_playermodel.modelname.string, buffptr, maxlen );
|
|
Q_strupr( s_playermodel.modelname.string );
|
|
|
|
// seperate the skin name
|
|
maxlen = strlen(pdest+5)+1;
|
|
if (maxlen > 16)
|
|
maxlen = 16;
|
|
Q_strncpyz( s_playermodel.skinname.string, pdest+5, maxlen );
|
|
Q_strupr( s_playermodel.skinname.string );
|
|
|
|
// kef -- make sure something like "chell/nelson" doesn't occur
|
|
if (Q_stricmp( s_playermodel.skinname.string, "red") &&
|
|
Q_stricmp( s_playermodel.skinname.string, "blue") &&
|
|
Q_stricmp( s_playermodel.skinname.string, "default"))
|
|
{
|
|
// assume something like "chell/nelson" has occurred
|
|
Q_strncpyz( s_playermodel.modelname.string, s_playermodel.skinname.string, strlen(s_playermodel.skinname.string)+1 );
|
|
Q_strncpyz( s_playermodel.skinname.string, "DEFAULT", 8 );
|
|
}
|
|
|
|
break;
|
|
}*/
|
|
}
|
|
|
|
//try to register the current shader icon
|
|
s_playermodel.playerIcon = trap_R_RegisterShaderNoMip( va( "models/players_rpgx/%s/model_icon", s_playermodel.modelName ) );
|
|
|
|
//Huh... guess whatever the hell's in the console, we don't have it on our list
|
|
if ( s_playermodel.selectedChar == -1 ) {
|
|
return;
|
|
}
|
|
|
|
//If we're exceeded the list, update it so we're at the top
|
|
if ( s_playermodel.selectedChar > MAX_MENULISTITEMS ) {
|
|
s_playermodel.scrollOffset = s_playermodel.selectedChar - MAX_MENULISTITEMS;
|
|
PlayerModel_OffsetCharList( &s_playermodel.scrollOffset );
|
|
}
|
|
|
|
//Set the model and skin data
|
|
/*{
|
|
char* buf[24];
|
|
|
|
s_playermodel.charModel.numitems = PlayerModel_LoadAvailableModels( buf );
|
|
s_playermodel.charModel.itemnames = buf;
|
|
|
|
s_playermodel.charSkin.numitems = PlayerModel_LoadAvailableSkins( buf );
|
|
s_playermodel.charSkin.itemnames = buf;
|
|
}*/
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerSettingsMenu_Graphics
|
|
=================
|
|
*/
|
|
void PlayerModelMenu_Graphics (void)
|
|
{
|
|
// Draw the basic screen layout
|
|
UI_MenuFrame2(&s_playermodel.menu);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTBROWN1]);
|
|
UI_DrawHandlePic(30,203, 47, 186, uis.whiteShader); // Middle left line
|
|
|
|
// Frame around model pictures
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
//UI_DrawHandlePic( 114, 50, 8, -32, s_playermodel.corner_ll_4_18); // UL Corner
|
|
//UI_DrawHandlePic( 114, 355, 8, 32, s_playermodel.corner_ll_4_18); // LL Corner
|
|
//UI_DrawHandlePic( 411, 50, 8, -32, s_playermodel.corner_lr_4_18); // UR Corner
|
|
//UI_DrawHandlePic( 411, 355, 8, 32, s_playermodel.corner_lr_4_18); // LR Corner
|
|
//UI_DrawHandlePic( 114, 81, 4, 284, uis.whiteShader); // Left side
|
|
//UI_DrawHandlePic( 414, 81, 4, 284, uis.whiteShader); // Right side
|
|
//UI_DrawHandlePic( 120, 62, 293, 18, uis.whiteShader); // Top
|
|
//UI_DrawHandlePic( 120, 357, 293, 18, uis.whiteShader); // Bottom
|
|
|
|
//TiM - Frame around the models selection list
|
|
UI_DrawHandlePic( 96, 50, 8, -32, s_playermodel.corner_ll_4_18); // UL Corner
|
|
UI_DrawHandlePic( 96, 369, 8, 8, s_playermodel.corner_ll_4_4); // LL Corner
|
|
UI_DrawHandlePic( 238, 62, 32, 32, s_playermodel.corner_ur_18_18); // UR Corner
|
|
UI_DrawHandlePic( 240, 368, 32, 8, s_playermodel.corner_lr_18_4); // LR Corner
|
|
UI_DrawHandlePic( 96, 81, 4, 290, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 242, 87, 18, 18, uis.whiteShader ); //Right Side Up Arrow Button
|
|
UI_DrawHandlePic( 242, 108, 18, 236, uis.whiteShader); // Right side
|
|
UI_DrawHandlePic( 242, 347, 18, 18, uis.whiteShader ); //Right Side Down Button
|
|
UI_DrawHandlePic( 100, 62, 141, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 101, 371, 140, 4, uis.whiteShader); // Bottom
|
|
|
|
//TiM - Fram around the model specific data window
|
|
UI_DrawHandlePic( 265, 50, 8, -32, s_playermodel.corner_ll_4_18); // UL Corner
|
|
UI_DrawHandlePic( 265, 369, 8, 8, s_playermodel.corner_ll_4_4); // LL Corner
|
|
UI_DrawHandlePic( 422, 50, -8, -32, s_playermodel.corner_ll_4_18); // UR Corner
|
|
UI_DrawHandlePic( 422, 369, -8, 8, s_playermodel.corner_ll_4_4); // LR Corner
|
|
UI_DrawHandlePic( 265, 81, 4, 290, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 426, 81, 4, 290, uis.whiteShader); // Right side
|
|
UI_DrawHandlePic( 269, 62, 157, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 269, 371, 157, 4, uis.whiteShader); // Bottom
|
|
|
|
//TiM - Draw the stunningly awesome icon of the character
|
|
UI_DrawHandlePic( 306, 114, 82, 82, uis.whiteShader);
|
|
if ( !s_playermodel.playerIcon ) {
|
|
trap_R_SetColor( colorTable[CT_BLACK] );
|
|
UI_DrawHandlePic( 307, 115, 80, 80, uis.whiteShader );
|
|
UI_DrawProportionalString( 347, 145, "?", UI_BIGFONT|UI_CENTER, colorTable[CT_LTORANGE] );
|
|
}
|
|
else {
|
|
trap_R_SetColor( colorTable[CT_WHITE]);
|
|
UI_DrawHandlePic( 307, 115, 80, 80, s_playermodel.playerIcon );
|
|
}
|
|
|
|
//Model Name along the top
|
|
if ( s_playermodel.modelName[0] )
|
|
{
|
|
char* buf = s_playermodel.modelName;
|
|
|
|
UI_DrawProportionalString( 347, 89, Q_strupr( buf ), UI_SMALLFONT|UI_CENTER,colorTable[CT_DKPURPLE1]);
|
|
}
|
|
|
|
//UI_DrawProportionalString( 220, 362, va("%s %d %s %d",menu_normal_text[MNT_SCREEN],(s_playermodel.modelpage + 1),menu_normal_text[MNT_OF],s_playermodel.numpages),UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
UI_DrawProportionalString( 108, 64, menu_normal_text[MNT_MODELS],UI_SMALLFONT,colorTable[CT_BLACK]); // Top
|
|
|
|
trap_R_SetColor( colorTable[CT_DKGREY2]);
|
|
UI_DrawHandlePic( 439, 79, 151, 295, uis.whiteShader); // Background
|
|
|
|
// Frame around player model
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
UI_DrawHandlePic( 435, 50, 8, -32, s_playermodel.corner_ll_4_18); // UL Corner
|
|
UI_DrawHandlePic( 435, 369, 8, 8, s_playermodel.corner_ll_4_4); // LL Corner
|
|
UI_DrawHandlePic( 440, 62, 150, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 435, 79, 4, 295, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 440, 371, 150, 4, uis.whiteShader); // Bottom
|
|
|
|
// Left rounded ends for buttons
|
|
trap_R_SetColor( colorTable[s_playermodel.mainmenu.color]);
|
|
UI_DrawHandlePic(s_playermodel.mainmenu.generic.x - 14, s_playermodel.mainmenu.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_playermodel.back.color]);
|
|
UI_DrawHandlePic(s_playermodel.back.generic.x - 14, s_playermodel.back.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_playermodel.data.color]);
|
|
UI_DrawHandlePic(s_playermodel.data.generic.x - 14, s_playermodel.data.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_playermodel.model.color]);
|
|
UI_DrawHandlePic(s_playermodel.model.generic.x - 14, s_playermodel.model.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
|
|
UI_DrawProportionalString( 74, 28, "881",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 150, "2445",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 206, "600",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 395, "3-44",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerSettings_MenuDraw
|
|
=================
|
|
*/
|
|
static void PlayerModel_MenuDraw (void)
|
|
{
|
|
PlayerModelMenu_Graphics();
|
|
|
|
Menu_Draw( &s_playermodel.menu );
|
|
}
|
|
/*
|
|
=================
|
|
PlayerModel_MenuInit
|
|
=================
|
|
*/
|
|
static void PlayerModel_MenuInit(int menuFrom)
|
|
{
|
|
int i;
|
|
//int j;
|
|
//int k;
|
|
int x;
|
|
int y;
|
|
static char playername[32];
|
|
static char modelname[32];
|
|
static char skinname[32];
|
|
static char skinnameviewed[32];
|
|
|
|
// zero set all our globals
|
|
memset( &s_playermodel, 0 ,sizeof(playermodel_t) );
|
|
|
|
s_playermodel.prevMenu = menuFrom;
|
|
|
|
//TiM : Model Spin view
|
|
uis.spinView = qfalse;
|
|
uis.lastYaw = 150;
|
|
|
|
PlayerModel_Cache();
|
|
|
|
// set initial states
|
|
PlayerModel_BuildList();
|
|
|
|
PlayerModel_SetMenuItems();
|
|
|
|
s_playermodel.menu.key = PlayerModel_MenuKey;
|
|
s_playermodel.menu.wrapAround = qtrue;
|
|
s_playermodel.menu.fullscreen = qtrue;
|
|
s_playermodel.menu.draw = PlayerModel_MenuDraw;
|
|
s_playermodel.menu.descX = MENU_DESC_X;
|
|
s_playermodel.menu.descY = MENU_DESC_Y;
|
|
s_playermodel.menu.titleX = MENU_TITLE_X;
|
|
s_playermodel.menu.titleY = MENU_TITLE_Y;
|
|
s_playermodel.menu.titleI = MNT_CHANGEPLAYER_TITLE;
|
|
s_playermodel.menu.footNoteEnum = MNT_CHANGEPLAYER;
|
|
|
|
s_playermodel.mainmenu.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.mainmenu.generic.x = 110;
|
|
s_playermodel.mainmenu.generic.y = 391;
|
|
s_playermodel.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_playermodel.mainmenu.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playermodel.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playermodel.mainmenu.color = CT_DKPURPLE1;
|
|
s_playermodel.mainmenu.color2 = CT_LTPURPLE1;
|
|
|
|
if (!ingameFlag)
|
|
{
|
|
s_playermodel.mainmenu.textEnum = MBT_MAINMENU;
|
|
s_playermodel.mainmenu.generic.id = ID_MAINMENU;
|
|
}
|
|
else
|
|
{
|
|
s_playermodel.mainmenu.textEnum = MBT_INGAMEMENU;
|
|
s_playermodel.mainmenu.generic.id = ID_INGAMEMENU;
|
|
}
|
|
|
|
s_playermodel.mainmenu.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.mainmenu.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playermodel.mainmenu.textcolor = CT_BLACK;
|
|
s_playermodel.mainmenu.textcolor2 = CT_WHITE;
|
|
|
|
s_playermodel.back.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_playermodel.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.back.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.back.generic.id = ID_BACK;
|
|
s_playermodel.back.generic.x = 110;
|
|
s_playermodel.back.generic.y = 415;
|
|
s_playermodel.back.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playermodel.back.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playermodel.back.color = CT_DKPURPLE1;
|
|
s_playermodel.back.color2 = CT_LTPURPLE1;
|
|
s_playermodel.back.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.back.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playermodel.back.textEnum = MBT_BACK;
|
|
s_playermodel.back.generic.id = ID_BACK;
|
|
s_playermodel.back.textcolor = CT_BLACK;
|
|
s_playermodel.back.textcolor2 = CT_WHITE;
|
|
|
|
s_playermodel.data.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.data.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_playermodel.data.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.data.generic.id = ID_SETTINGS;
|
|
s_playermodel.data.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.data.generic.x = 482;
|
|
s_playermodel.data.generic.y = 391;
|
|
s_playermodel.data.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playermodel.data.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playermodel.data.color = CT_DKPURPLE1;
|
|
s_playermodel.data.color2 = CT_LTPURPLE1;
|
|
s_playermodel.data.textX = 5;
|
|
s_playermodel.data.textY = 2;
|
|
s_playermodel.data.textEnum = MBT_PLAYERDATA;
|
|
s_playermodel.data.textcolor = CT_BLACK;
|
|
s_playermodel.data.textcolor2 = CT_WHITE;
|
|
|
|
s_playermodel.model.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.model.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_playermodel.model.generic.flags = QMF_GRAYED;
|
|
s_playermodel.model.generic.x = 482;
|
|
s_playermodel.model.generic.y = 415;
|
|
s_playermodel.model.width = MENU_BUTTON_MED_WIDTH;
|
|
s_playermodel.model.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_playermodel.model.color = CT_DKPURPLE1;
|
|
s_playermodel.model.color2 = CT_LTPURPLE1;
|
|
s_playermodel.model.textX = 5;
|
|
s_playermodel.model.textY = 2;
|
|
s_playermodel.model.textEnum = MBT_CHANGEMODEL;
|
|
s_playermodel.model.textcolor = CT_BLACK;
|
|
s_playermodel.model.textcolor2 = CT_WHITE;
|
|
|
|
|
|
//y = 88;
|
|
x = 107;
|
|
y = 85;
|
|
|
|
for (i=0; i < MAX_MENULISTITEMS; i++ ) {
|
|
s_playermodel.charMenu[i].generic.type = MTYPE_BITMAP;
|
|
s_playermodel.charMenu[i].generic.flags = QMF_INACTIVE | QMF_HIDDEN;
|
|
s_playermodel.charMenu[i].generic.x = x;
|
|
s_playermodel.charMenu[i].generic.y = y;
|
|
s_playermodel.charMenu[i].generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.charMenu[i].generic.id = ID_MENUCHAR0+i;
|
|
s_playermodel.charMenu[i].width = 129;
|
|
s_playermodel.charMenu[i].height = 16;
|
|
s_playermodel.charMenu[i].color = CT_DKPURPLE1;
|
|
s_playermodel.charMenu[i].color2 = CT_LTPURPLE1;
|
|
s_playermodel.charMenu[i].textPtr = NULL;
|
|
s_playermodel.charMenu[i].textX = 4;
|
|
s_playermodel.charMenu[i].textY = 1;
|
|
s_playermodel.charMenu[i].textcolor = CT_DKGOLD1;
|
|
s_playermodel.charMenu[i].textcolor2 = CT_LTGOLD1;
|
|
s_playermodel.charMenu[i].textStyle = UI_SMALLFONT;
|
|
|
|
y += 24;
|
|
}
|
|
|
|
/*for (i=0,k=0; i<PLAYERGRID_ROWS; i++)
|
|
{
|
|
x = 129;
|
|
for (j=0; j<PLAYERGRID_COLS; j++,k++)
|
|
{
|
|
s_playermodel.pics[k].generic.type = MTYPE_BITMAP;
|
|
s_playermodel.pics[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
|
|
s_playermodel.pics[k].generic.x = x;
|
|
s_playermodel.pics[k].generic.y = y;
|
|
s_playermodel.pics[k].width = 66;
|
|
s_playermodel.pics[k].height = 66;
|
|
s_playermodel.pics[k].focuspic = MODEL_SELECTED;
|
|
s_playermodel.pics[k].focuscolor = colorTable[CT_WHITE];
|
|
|
|
s_playermodel.picbuttons[k].generic.type = MTYPE_BITMAP;
|
|
s_playermodel.picbuttons[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_NODEFAULTINIT|QMF_PULSEIFFOCUS;
|
|
s_playermodel.picbuttons[k].generic.id = ID_PLAYERPIC0+k;
|
|
s_playermodel.picbuttons[k].generic.callback = PlayerModel_PicEvent;
|
|
s_playermodel.picbuttons[k].generic.x = x - 16;
|
|
s_playermodel.picbuttons[k].generic.y = y - 16;
|
|
s_playermodel.picbuttons[k].generic.left = x;
|
|
s_playermodel.picbuttons[k].generic.top = y;
|
|
s_playermodel.picbuttons[k].generic.right = x + 64;
|
|
s_playermodel.picbuttons[k].generic.bottom = y + 64;
|
|
s_playermodel.picbuttons[k].width = 128;
|
|
s_playermodel.picbuttons[k].height = 128;
|
|
s_playermodel.picbuttons[k].focuspic = MODEL_SELECT;
|
|
s_playermodel.picbuttons[k].focuscolor = colorTable[CT_WHITE];
|
|
|
|
x += 64+6;
|
|
}
|
|
y += 64+8;
|
|
}*/
|
|
|
|
s_playermodel.playername.generic.type = MTYPE_PTEXT;
|
|
s_playermodel.playername.generic.flags = QMF_INACTIVE;
|
|
s_playermodel.playername.generic.x = 444;
|
|
s_playermodel.playername.generic.y = 63;
|
|
s_playermodel.playername.string = playername;
|
|
s_playermodel.playername.style = UI_SMALLFONT;
|
|
s_playermodel.playername.color = colorTable[CT_BLACK];
|
|
|
|
s_playermodel.modelname.generic.type = MTYPE_PTEXT;
|
|
s_playermodel.modelname.generic.flags = QMF_INACTIVE;
|
|
s_playermodel.modelname.generic.x = 121;
|
|
s_playermodel.modelname.generic.y = 338;
|
|
s_playermodel.modelname.string = modelname;
|
|
s_playermodel.modelname.style = UI_LEFT;
|
|
s_playermodel.modelname.color = colorTable[CT_LTBLUE1];
|
|
|
|
s_playermodel.skinname.generic.type = MTYPE_PTEXT;
|
|
s_playermodel.skinname.generic.flags = QMF_INACTIVE;
|
|
s_playermodel.skinname.generic.x = 323;
|
|
s_playermodel.skinname.generic.y = 338;
|
|
s_playermodel.skinname.string = skinname;
|
|
s_playermodel.skinname.style = UI_RIGHT;
|
|
s_playermodel.skinname.color = colorTable[CT_LTBLUE1];
|
|
|
|
/*s_playermodel.skinnameviewed.generic.type = MTYPE_PTEXT;
|
|
s_playermodel.skinnameviewed.generic.flags = QMF_INACTIVE;
|
|
s_playermodel.skinnameviewed.generic.x = 323;
|
|
s_playermodel.skinnameviewed.generic.y = 338;
|
|
s_playermodel.skinnameviewed.string = skinnameviewed;
|
|
s_playermodel.skinnameviewed.style = UI_RIGHT;
|
|
s_playermodel.skinnameviewed.color = colorTable[CT_LTBLUE1];*/
|
|
|
|
s_playermodel.player.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.player.generic.flags = QMF_SILENT;
|
|
s_playermodel.player.generic.ownerdraw = PlayerModel_DrawPlayer;
|
|
s_playermodel.player.generic.callback = PlayerModel_SpinPlayer;
|
|
s_playermodel.player.generic.x = 439; //400
|
|
s_playermodel.player.generic.y = 80; //20
|
|
s_playermodel.player.width = 151; //32*7.3
|
|
s_playermodel.player.height = 291; //56*7.3
|
|
|
|
s_playermodel.upArrow.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.upArrow.generic.name = PIC_ARROW_UP;
|
|
s_playermodel.upArrow.generic.flags = QMF_GRAYED | QMF_INACTIVE;
|
|
s_playermodel.upArrow.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.upArrow.generic.id = ID_UPARROW;
|
|
s_playermodel.upArrow.generic.x = 243;
|
|
s_playermodel.upArrow.generic.y = 89;
|
|
s_playermodel.upArrow.width = 16;
|
|
s_playermodel.upArrow.height = 16;
|
|
s_playermodel.upArrow.color = CT_DKPURPLE1;
|
|
s_playermodel.upArrow.color2 = CT_LTPURPLE1;
|
|
s_playermodel.upArrow.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.upArrow.textY = MENU_BUTTON_TEXT_Y;
|
|
//s_playermodel.upArrow.textEnum = MBT_PREVPAGE;
|
|
s_playermodel.upArrow.textcolor = CT_BLACK;
|
|
s_playermodel.upArrow.textcolor2 = CT_WHITE;
|
|
|
|
s_playermodel.dnArrow.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.dnArrow.generic.name = PIC_ARROW_DOWN;
|
|
s_playermodel.dnArrow.generic.flags = QMF_GRAYED | QMF_INACTIVE;
|
|
s_playermodel.dnArrow.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.dnArrow.generic.id = ID_DNARROW;
|
|
s_playermodel.dnArrow.generic.x = 243;
|
|
s_playermodel.dnArrow.generic.y = 349;
|
|
s_playermodel.dnArrow.width = 16;
|
|
s_playermodel.dnArrow.height = 16;
|
|
s_playermodel.dnArrow.color = CT_DKPURPLE1;
|
|
s_playermodel.dnArrow.color2 = CT_LTPURPLE1;
|
|
s_playermodel.dnArrow.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.dnArrow.textY = MENU_BUTTON_TEXT_Y;
|
|
//s_playermodel.dnArrow.textEnum = MBT_NEXTPAGE;
|
|
s_playermodel.dnArrow.textcolor = CT_BLACK;
|
|
s_playermodel.dnArrow.textcolor2 = CT_WHITE;
|
|
|
|
s_playermodel.charModel.generic.type = MTYPE_SPINCONTROL;
|
|
s_playermodel.charModel.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
//s_playermodel.charModel.generic.id = ID_CLASS;
|
|
//s_playermodel.charModel.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.charModel.generic.x = 291;//134;
|
|
s_playermodel.charModel.generic.y = 209;//207;
|
|
s_playermodel.charModel.textEnum = MBT_CHARMODEL;
|
|
s_playermodel.charModel.textcolor = CT_BLACK;
|
|
s_playermodel.charModel.textcolor2 = CT_WHITE;
|
|
s_playermodel.charModel.color = CT_DKPURPLE1;
|
|
s_playermodel.charModel.color2 = CT_LTPURPLE1;
|
|
s_playermodel.charModel.width = 60;//80;
|
|
s_playermodel.charModel.textX = 56;
|
|
s_playermodel.charModel.textY = 2;
|
|
s_playermodel.charModel.textFlags = UI_CENTER;
|
|
s_playermodel.charModel.listX = 347;
|
|
s_playermodel.charModel.listY = 233;
|
|
s_playermodel.charModel.listFlags = UI_CENTER;
|
|
//s_playermodel.charModel.itemnames = s_playermodel.modelNames;
|
|
|
|
s_playermodel.charSkin.generic.type = MTYPE_SPINCONTROL;
|
|
s_playermodel.charSkin.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
//s_playermodel.charSkin.generic.id = ID_CLASS;
|
|
//s_playermodel.charSkin.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.charSkin.generic.x = 291;//134;
|
|
s_playermodel.charSkin.generic.y = 266;//207;
|
|
s_playermodel.charSkin.textEnum = MBT_CHARSKIN;
|
|
s_playermodel.charSkin.textcolor = CT_BLACK;
|
|
s_playermodel.charSkin.textcolor2 = CT_WHITE;
|
|
s_playermodel.charSkin.color = CT_DKPURPLE1;
|
|
s_playermodel.charSkin.color2 = CT_LTPURPLE1;
|
|
s_playermodel.charSkin.width = 60;//80;
|
|
s_playermodel.charSkin.textX = 56;
|
|
s_playermodel.charSkin.textY = 2;
|
|
s_playermodel.charSkin.textFlags = UI_CENTER;
|
|
s_playermodel.charSkin.listX = 347;
|
|
s_playermodel.charSkin.listY = 291;
|
|
s_playermodel.charSkin.listFlags = UI_CENTER;
|
|
//s_playermodel.charSkin.itemnames = s_playermodel.skinNames;
|
|
|
|
s_playermodel.apply.generic.type = MTYPE_BITMAP;
|
|
s_playermodel.apply.generic.name = GRAPHIC_SQUARE;
|
|
s_playermodel.apply.generic.flags = QMF_GRAYED | QMF_INACTIVE;
|
|
s_playermodel.apply.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.apply.generic.id = ID_APPLY;
|
|
s_playermodel.apply.generic.x = 281;
|
|
s_playermodel.apply.generic.y = 321;
|
|
s_playermodel.apply.width = 132;
|
|
s_playermodel.apply.height = 39;
|
|
s_playermodel.apply.color = CT_DKPURPLE1;
|
|
s_playermodel.apply.color2 = CT_LTPURPLE1;
|
|
s_playermodel.apply.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.apply.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playermodel.apply.textEnum = MBT_VIDEOAPPLYCHANGES;
|
|
s_playermodel.apply.textcolor = CT_BLACK;
|
|
s_playermodel.apply.textcolor2 = CT_WHITE;
|
|
|
|
/*s_playermodel.skinfilter.generic.type = MTYPE_SPINCONTROL;
|
|
s_playermodel.skinfilter.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.skinfilter.generic.x = 190;
|
|
s_playermodel.skinfilter.generic.y = 311;
|
|
s_playermodel.skinfilter.generic.id = ID_SKINFILTER;
|
|
s_playermodel.skinfilter.generic.callback = PlayerModel_MenuEvent;
|
|
s_playermodel.skinfilter.textEnum = MBT_GROUPFILTER;
|
|
s_playermodel.skinfilter.textcolor = CT_BLACK;
|
|
s_playermodel.skinfilter.textcolor2 = CT_WHITE;
|
|
s_playermodel.skinfilter.color = CT_DKPURPLE1;
|
|
s_playermodel.skinfilter.color2 = CT_LTPURPLE1;
|
|
s_playermodel.skinfilter.textX = MENU_BUTTON_TEXT_X;
|
|
s_playermodel.skinfilter.textY = MENU_BUTTON_TEXT_Y;
|
|
s_playermodel.skinfilter.listnames = s_SkinFilter_Names;*/
|
|
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.model );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.data );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.player );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.playername );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.modelname );
|
|
//Menu_AddItem( &s_playermodel.menu, &s_playermodel.skinfilter );
|
|
|
|
/*for (i=0; i<MAX_MODELSPERPAGE; i++)
|
|
{
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.pics[i] );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.picbuttons[i] );
|
|
}*/
|
|
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.upArrow );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.dnArrow );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.charModel );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.charSkin );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.apply );
|
|
|
|
for (i=0; i < MAX_MENULISTITEMS; i++ ) {
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.charMenu[i] );
|
|
}
|
|
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.back );
|
|
Menu_AddItem( &s_playermodel.menu, &s_playermodel.mainmenu );
|
|
|
|
PlayerModel_OffsetCharList( &s_playermodel.scrollOffset );
|
|
|
|
if ( s_playermodel.numChars > MAX_MENULISTITEMS ) {
|
|
s_playermodel.upArrow.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_playermodel.dnArrow.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
}
|
|
|
|
// update user interface
|
|
//PlayerModel_UpdateGrid();
|
|
PlayerModel_UpdateModel();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_Cache
|
|
=================
|
|
*/
|
|
void PlayerModel_Cache( void )
|
|
{
|
|
//int i;
|
|
|
|
s_playermodel.corner_ll_4_4 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_4_4");
|
|
s_playermodel.corner_ll_4_18 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_4_18");
|
|
s_playermodel.corner_lr_4_18 = trap_R_RegisterShaderNoMip("menu/common/corner_lr_4_18");
|
|
s_playermodel.corner_lr_18_4 = trap_R_RegisterShaderNoMip("menu/common/corner_lr_18_4");
|
|
s_playermodel.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);
|
|
|
|
/*for( i = 0; playermodel_artlist[i]; i++ )
|
|
{
|
|
trap_R_RegisterShaderNoMip( playermodel_artlist[i] );
|
|
}*/
|
|
|
|
//PlayerModel_BuildList();
|
|
|
|
/*for( i = 0; i < s_playermodel.nummodels; i++ )
|
|
{
|
|
trap_R_RegisterShaderNoMip( s_playermodel.modelnames[i] );
|
|
}*/
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerModel_Cache
|
|
=================
|
|
*/
|
|
void UI_PlayerModelMenu(int menuFrom)
|
|
{
|
|
PlayerModel_MenuInit(menuFrom);
|
|
|
|
UI_PushMenu( &s_playermodel.menu );
|
|
|
|
//Menu_SetCursorToItem( &s_playermodel.menu, &s_playermodel.pics[s_playermodel.selectedmodel % MAX_MODELSPERPAGE] );
|
|
}
|
|
|
|
|