29 Jun 2008

This commit is contained in:
g-cont 2008-06-29 00:00:00 +04:00 committed by Alibek Omarov
parent d8eb784740
commit 123d64195c
38 changed files with 3268 additions and 7095 deletions

View File

@ -26,7 +26,7 @@ common\roqlib
engine\
engine\client\
engine\server\
engine\uimenu\
engine\network\
launch\
launch\xash\
launch\bsplib\

View File

@ -1224,7 +1224,7 @@ bool CIN_PlayCinematic( const char *arg, int x, int y, int w, int h, int systemB
cinTable.status = FMV_PLAY;
cls.state = ca_cinematic;
M_ForceMenuOff();
UI_HideMenu();
Con_Close();
return true;
}

View File

@ -96,7 +96,7 @@ void CL_LevelShot_f( void )
char checkname[MAX_OSPATH];
// check for exist
com.sprintf( checkname, "graphics/background/%s.tga", cl.configstrings[CS_NAME] );
com.sprintf( checkname, "gfx/background/%s.tga", cl.configstrings[CS_NAME] );
if(!FS_FileExists( checkname )) re->ScrShot( checkname, true );
else Msg("levelshot for this map already created\nFirst remove old image if you wants do it again\n" );
}

View File

@ -57,12 +57,12 @@ void Con_ToggleConsole_f (void)
if (cls.key_dest == key_console)
{
M_ForceMenuOff();
UI_HideMenu();
Cvar_SetValue("paused", 0 );
}
else
{
M_ForceMenuOff();
UI_HideMenu();
cls.key_dest = key_console;
if(Cvar_VariableValue ("maxclients") == 1 && Host_ServerState())
@ -84,7 +84,7 @@ void Con_ToggleChat_f (void)
{
if (cls.state == ca_active)
{
M_ForceMenuOff();
UI_HideMenu();
cls.key_dest = key_game;
}
}

View File

@ -1135,10 +1135,10 @@ void Key_Event(int key, bool down, uint time)
break;
case key_game:
case key_console:
M_Menu_Main_f();
UI_ShowMenu();
break;
case key_menu:
M_Keydown( key );
UI_KeyEvent( key );
break;
default:
MsgWarn("Key_Event: bad cls.key_dest\n");
@ -1168,7 +1168,7 @@ void Key_Event(int key, bool down, uint time)
}
else if(cls.key_dest == key_menu)
{
M_Keydown( key );
UI_KeyEvent( key );
}
else if(cls.key_dest == key_console)
{
@ -1178,11 +1178,11 @@ void Key_Event(int key, bool down, uint time)
{
// send the bound action
kb = keys[key].binding;
if ( !kb )
if( !kb )
{
if (key >= 200) Msg("%s is unbound, use controls menu to set.\n", Key_KeynumToString(key));
if (key >= 200) Msg( "%s is unbound, use controls menu to set.\n", Key_KeynumToString(key));
}
else if (kb[0] == '+')
else if( kb[0] == '+' )
{
int i;
char button[1024], *buttonPtr;

View File

@ -389,7 +389,7 @@ Sends a disconnect message to the server
This is also called on Host_Error, so it shouldn't cause any errors
=====================
*/
void CL_Disconnect (void)
void CL_Disconnect( void )
{
byte final[32];
@ -397,7 +397,7 @@ void CL_Disconnect (void)
return;
VectorClear (cl.refdef.blend);
M_ForceMenuOff ();
UI_HideMenu();
cls.connect_time = 0;
@ -539,23 +539,6 @@ void CL_Reconnect_f (void)
}
}
/*
=================
CL_ParseStatusMessage
Handle a reply from a ping
=================
*/
void CL_ParseStatusMessage (void)
{
char *s;
s = MSG_ReadString(&net_message);
Msg ("%s\n", s);
M_AddToServerList (net_from, s);
}
/*
===================
CL_StatusLocal_f
@ -721,6 +704,23 @@ bool CL_ParseServerStatus( char *adr, char *info )
return true;
}
/*
=================
CL_ParseStatusMessage
Handle a reply from a ping
=================
*/
void CL_ParseStatusMessage (void)
{
char *s;
s = MSG_ReadString(&net_message);
Msg ("%s\n", s);
CL_ParseServerStatus( NET_AdrToString(net_from), s );
}
/*
=================
CL_ConnectionlessPacket
@ -1145,8 +1145,8 @@ void CL_RequestNextDownload (void)
{
int n = precache_check++ - ENV_CNT - 1;
if (n & 1) com.sprintf(fn, "textures/env_skybox/%s.dds", cl.configstrings[CS_SKY] ); // cubemap pack
else com.sprintf(fn, "textures/env_skybox/%s%s.tga", cl.configstrings[CS_SKY], env_suf[n/2]);
if (n & 1) com.sprintf(fn, "gfx/env/%s.dds", cl.configstrings[CS_SKY] ); // cubemap pack
else com.sprintf(fn, "gfx/env/%s%s.tga", cl.configstrings[CS_SKY], env_suf[n/2]);
if (!CL_CheckOrDownloadFile(fn)) return; // started a download
}
}
@ -1550,8 +1550,7 @@ void CL_Init( void )
net_message.data = net_message_buffer;
net_message.maxsize = sizeof(net_message_buffer);
M_Init ();
UI_Init();
SCR_Init();
CL_InitLocal();
}

View File

@ -1,9 +1,140 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// ui_cmds.c - ui menu builtins
// cl_menu.c - progs user interface
//=======================================================================
#include "uimenu.h"
#include "common.h"
#include "client.h"
#include "ui_edict.h"
#include "builtin.h"
// progs menu
#define UI_MAX_EDICTS (1 << 12) // should be enough for a menu
bool ui_active = false;
static float credits_start_time;
static float credits_fade_time;
static float credits_show_time;
static const char **credits;
static char *creditsIndex[2048];
static char *creditsBuffer;
static uint credit_numlines;
static bool credits_active;
void UI_KeyEvent( int key )
{
const char *ascii = Key_KeynumToString(key);
PRVM_Begin;
PRVM_SetProg( PRVM_MENUPROG );
// set time
*prog->time = cls.realtime;
// setup args
PRVM_G_FLOAT(OFS_PARM0) = key;
PRVM_G_INT(OFS_PARM1) = PRVM_SetEngineString(ascii);
PRVM_ExecuteProgram (prog->globals.ui->m_keydown, "QC function m_keydown is missing");
PRVM_End;
}
void UI_Draw( void )
{
if( !ui_active || cls.key_dest != key_menu )
return;
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_draw, "QC function m_draw is missing");
UI_DrawCredits(); // display game credits
PRVM_End;
}
void UI_DrawCredits( void )
{
int i, x, y;
float *color;
float white_color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
if( !credits_active ) return;
y = SCREEN_HEIGHT - (( cls.realtime - credits_start_time ) * 32.0f );
// draw the credits
for ( i = 0; i < credit_numlines && credits[i]; i++, y += 20 )
{
// skip not visible lines, but always draw end line
if( y <= -16 && i != credit_numlines - 1) continue;
x = ( SCREEN_WIDTH - BIGCHAR_WIDTH * com.cstrlen( credits[i] ))/2;
if((y < (SCREEN_HEIGHT - BIGCHAR_HEIGHT) / 2) && i == credit_numlines - 1)
{
if(!credits_fade_time) credits_fade_time = cls.realtime;
color = CG_FadeColor( credits_fade_time, credits_show_time );
if( color ) SCR_DrawStringExt( x, (SCREEN_HEIGHT - BIGCHAR_HEIGHT)/2, 16, 16, credits[i], color, true );
}
else SCR_DrawStringExt( x, y, 16, 16, credits[i], white_color, false );
}
if( y < 0 && !color )
{
credits_active = false; // end of credits
// let menu progs known about credits state
PRVM_ExecuteProgram( prog->globals.ui->m_endofcredits, "QC function m_endofcredits is missing");
}
}
void UI_ShowMenu( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
ui_active = true;
PRVM_ExecuteProgram (prog->globals.ui->m_show, "QC function m_toggle is missing");
PRVM_End;
}
void UI_HideMenu( void )
{
cls.key_dest = key_game;
Key_ClearStates();
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
ui_active = false;
prog->globals.ui->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_hide, "QC function m_toggle is missing");
PRVM_End;
}
void UI_Shutdown( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
//*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_shutdown, "QC function m_shutdown is missing");
// reset key_dest
cls.key_dest = key_game;
// AK not using this cause Im not sure whether this is useful at all instead :
PRVM_ResetProg();
PRVM_End;
}
/*
=========
@ -38,14 +169,14 @@ string ReadComment( float savenum )
void PF_readcomment( void )
{
int savenum;
static string comment[32];
string comment;
if(!VM_ValidateArgs( "ReadComment", 1 ))
return;
savenum = (int)PRVM_G_FLOAT(OFS_PARM0);
SV_ReadComment( comment[savenum], savenum );
PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString( comment[savenum] );
SV_ReadComment( comment, savenum );
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString( comment );
}
/*
@ -82,7 +213,7 @@ string ServerInfo( float num )
*/
void PF_getserverinfo( void )
{
static string serverinfo[MAX_SERVERS];
string serverinfo;
serverinfo_t *s;
int i;
@ -97,8 +228,8 @@ void PF_getserverinfo( void )
s = &cls.serverlist[i];
if( s && s->hostname && s->maxplayers > 1 ) // ignore singleplayer servers
{
com.snprintf( serverinfo[i], MAX_STRING, "%s %15s %7i/%i %7i\n", s->hostname, s->mapname, s->numplayers, s->maxplayers, s->ping );
PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString( serverinfo[i] );
com.snprintf( serverinfo, MAX_STRING, "%s %15s %7i/%i %7i\n", s->hostname, s->mapname, s->numplayers, s->maxplayers, s->ping );
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString( serverinfo );
}
}
}
@ -114,7 +245,7 @@ int mapcount = 0;
void PF_getmapslist( void )
{
static char mapstring[MAX_INPUTLINE];
char mapstring[MAX_INPUTLINE];
if(!VM_ValidateArgs( "GetMapsList", 0 ))
return;
@ -140,7 +271,7 @@ void PF_getmapslist( void )
while(Com_TryToken()); // skip other stuff
mapcount++;
}
PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString( mapstring );
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString( mapstring );
}
/*
@ -186,8 +317,8 @@ string substring( string s, float start, float length )
*/
void PF_substring( void )
{
static string tempstring;
int i, start, length;
string tempstring;
const char *s;
if(!VM_ValidateArgs( "substring", 3 ))
@ -203,7 +334,7 @@ void PF_substring( void )
tempstring[i] = *s;
tempstring[i] = 0;
PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString( tempstring );
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString( tempstring );
}
/*
@ -456,6 +587,70 @@ void PF_drawfill( void )
SCR_FillRect( pos[0], pos[1], size[0], size[1], GetRGBA( rgb[0], rgb[1], rgb[2], alpha ));
}
/*
=========
PF_drawmodel
void drawmodel( vector pos, vector size, string model, vector origin, vector angles, float sequence )
=========
*/
void PF_drawmodel( void )
{
float *size, *pos, *origin, *angles;
const char *modname;
refdef_t refdef;
int sequence;
static float frame;
entity_t entity;
if(!VM_ValidateArgs( "drawmodel", 4 ))
return;
pos = PRVM_G_VECTOR(OFS_PARM0);
size = PRVM_G_VECTOR(OFS_PARM1);
modname = PRVM_G_STRING(OFS_PARM2);
origin = PRVM_G_VECTOR(OFS_PARM3);
angles = PRVM_G_VECTOR(OFS_PARM4);
sequence = (int)PRVM_G_FLOAT(OFS_PARM5);
VM_ValidateString(PRVM_G_STRING(OFS_PARM2));
memset( &entity, 0, sizeof( entity ));
memset( &refdef, 0, sizeof( refdef ) );
SCR_AdjustSize( &pos[0], &pos[1], &size[0], &size[1] );
refdef.x = pos[0];
refdef.y = pos[1];
refdef.width = size[0];
refdef.height = size[1];
refdef.fov_x = 50;
refdef.fov_y = V_CalcFov( refdef.fov_x, refdef.width, refdef.height );
refdef.time = cls.realtime;
entity.model = re->RegisterModel( (char *)modname );
entity.flags = RF_FULLBRIGHT;
VectorCopy( origin, entity.origin );
VectorCopy( entity.origin, entity.oldorigin );
VectorCopy( angles, entity.angles );
entity.frame = frame += 0.7f;//FXIME
entity.sequence = sequence;
entity.prev.frame = 0;
entity.backlerp = 0.0;
entity.controller[0] = 90.0;
entity.controller[1] = 90.0;
entity.controller[2] = 180.0;
entity.controller[3] = 180.0;
refdef.areabits = 0;
refdef.num_entities = 1;
refdef.entities = &entity;
refdef.lightstyles = 0;
refdef.rdflags = RDF_NOWORLDMODEL;
re->RenderFrame( &refdef );
re->EndFrame();
}
/*
=========
PF_getimagesize
@ -554,7 +749,7 @@ PF_testfunction
float testfunction( string function_name )
=========
*/
void PF_testfunction(void)
void PF_testfunction( void )
{
mfunction_t *func;
const char *s;
@ -563,7 +758,6 @@ void PF_testfunction(void)
return;
s = PRVM_G_STRING(OFS_PARM0);
if(!s) PRVM_ERROR("PF_testfunction: null string !");
VM_ValidateString( s );
func = PRVM_ED_FindFunction( s );
@ -572,6 +766,121 @@ void PF_testfunction(void)
else PRVM_G_FLOAT(OFS_RETURN) = false;
}
/*
=========
PF_loadcredits
void loadcredits( string filename )
=========
*/
void PF_loadcredits( void )
{
uint count;
char *p;
const char *s;
if(!VM_ValidateArgs( "loadcredits", 1 ))
return;
s = PRVM_G_STRING(OFS_PARM0);
VM_ValidateString( s );
if(!creditsBuffer)
{
// load credits if needed
creditsBuffer = FS_LoadFile( s, &count );
if( count )
{
if(creditsBuffer[count - 1] != '\n' && creditsBuffer[count - 1] != '\r')
{
creditsBuffer = Mem_Realloc( zonepool, creditsBuffer, count + 2 );
com.strncpy( creditsBuffer + count, "\r", 1 ); // add terminator
count += 2;
}
p = creditsBuffer;
for( credit_numlines = 0; credit_numlines < 2048; credit_numlines++)
{
creditsIndex[credit_numlines] = p;
while( *p != '\r' && *p != '\n')
{
p++;
if( --count == 0 ) break;
}
if( *p == '\r' )
{
*p++ = 0;
if (--count == 0) break;
}
*p++ = 0;
if (--count == 0) break;
}
creditsIndex[++credit_numlines] = 0;
credits = creditsIndex;
}
else
{
// use built-in credits
credits = xash_credits;
credit_numlines = (sizeof(xash_credits) / sizeof(xash_credits[0])) - 1; // skip term
}
}
credits_active = false;
}
/*
=========
PF_runcredits
void runcredits( void )
=========
*/
void PF_runcredits( void )
{
if(!VM_ValidateArgs( "runcredits", 0 ))
return;
// run credits
credits_start_time = cls.realtime;
credits_show_time = bound(0.1f, (float)com.strlen(credits[credit_numlines - 1]), 12.0f );
credits_fade_time = 0.0f;
credits_active = true;
}
/*
=========
PF_stopcredits
void stopcredits( void )
=========
*/
void PF_stopcredits( void )
{
if(!VM_ValidateArgs( "stopcredits", 0 ))
return;
// stop credits
credits_active = false;
}
/*
=========
PF_creditsactive
void creditsactive( void )
=========
*/
void PF_creditsactive( void )
{
if(!VM_ValidateArgs( "creditsactive", 0 ))
return;
// check state
if( credits_active )
PRVM_G_FLOAT(OFS_RETURN) = 1;
else PRVM_G_FLOAT(OFS_RETURN) = 0;
}
prvm_builtin_t vm_ui_builtins[] =
{
NULL, // #0 (leave blank as default, but can include easter egg )
@ -682,17 +991,47 @@ PF_drawcharacter, // #111 float drawchar( vector pos, float char, vector scale
PF_drawstring, // #112 float drawstring( vector pos, string text, vector scale, vector rgb, float alpha )
PF_drawpic, // #113 float drawpic( vector pos, string pic, vector size, vector rgb, float alpha )
PF_drawfill, // #114 void drawfill( vector pos, vector size, vector rgb, float alpha )
PF_getimagesize, // #115 vector getimagesize( string pic )
PF_setkeydest, // #116 void setkeydest( float dest )
PF_callfunction, // #117 void callfunction( ..., string function_name )
PF_testfunction, // #118 float testfunction( string function_name )
PF_newgame, // #119 void NewGame( void )
PF_readcomment, // #120 string ReadComment( float savenum )
PF_joinserver, // #121 float JoinServer( float num )
PF_getserverinfo, // #122 string ServerInfo( float num )
PF_getmapslist, // #123 string GetMapsList( void )
PF_getmapscount, // #124 float GetMapsCount( void )
PF_newserver, // #125 void NewServer( string mapname )
PF_drawmodel, // #115 void drawmodel( vector pos, vector size, string model, vector origin, vector angles, float sequence )
PF_getimagesize, // #116 vector getimagesize( string pic )
PF_setkeydest, // #117 void setkeydest( float dest )
PF_callfunction, // #118 void callfunction( ..., string function_name )
PF_testfunction, // #119 float testfunction( string function_name )
PF_newgame, // #120 void NewGame( void )
PF_readcomment, // #121 string ReadComment( float savenum )
PF_joinserver, // #122 float JoinServer( float num )
PF_getserverinfo, // #123 string ServerInfo( float num )
PF_getmapslist, // #124 string GetMapsList( void )
PF_getmapscount, // #125 float GetMapsCount( void )
PF_newserver, // #126 void NewServer( string mapname )
PF_loadcredits, // #127 void loadcredits( string filename )
PF_runcredits, // #128 void runcredits( void )
PF_stopcredits, // #129 void stopcredits( void )
PF_creditsactive, // #130 float creditsactive( void )
VM_EdictError, // #131 void objerror( string s )
};
const int vm_ui_numbuiltins = sizeof(vm_ui_builtins) / sizeof(prvm_builtin_t);
const int vm_ui_numbuiltins = sizeof(vm_ui_builtins) / sizeof(prvm_builtin_t);
void UI_Init( void )
{
PRVM_Begin;
PRVM_InitProg( PRVM_MENUPROG );
prog->progs_mempool = Mem_AllocPool( "Uimenu Progs" );
prog->builtins = vm_ui_builtins;
prog->numbuiltins = vm_ui_numbuiltins;
prog->edictprivate_size = sizeof(ui_edict_t);
prog->limit_edicts = UI_MAX_EDICTS;
prog->name = "uimenu";
prog->num_edicts = 1;
prog->loadintoworld = false;
prog->init_cmd = VM_Cmd_Init;
prog->reset_cmd = VM_Cmd_Reset;
prog->error_cmd = VM_Error;
PRVM_LoadProgs( GI->uimenu_prog, 0, NULL, UI_NUM_REQFIELDS, ui_reqfields );
*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_init, "QC function m_init is missing");
PRVM_End;
}

View File

@ -381,11 +381,9 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
{
com.sprintf (model_filename, "models/players/gordon/player.mdl");
com.sprintf (weapon_filename, "models/weapons/w_glock.mdl");
com.strcpy (ci->iconname, "hud/i_fixme");
ci->model = re->RegisterModel (model_filename);
memset(ci->weaponmodel, 0, sizeof(ci->weaponmodel));
ci->weaponmodel[0] = re->RegisterModel (weapon_filename);
ci->icon = re->RegisterPic (ci->iconname);
}
else
{
@ -426,17 +424,12 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
ci->weaponmodel[i] = re->RegisterModel(weapon_filename);
if (!cl_vwep->value) break; // only one when vwep is off
}
// icon file
strcpy (ci->iconname, "hud/i_fixme");
ci->icon = re->RegisterPic (ci->iconname);
}
// must have loaded all data types to be valud
if (!ci->skin || !ci->icon || !ci->model || !ci->weaponmodel[0])
if (!ci->skin || !ci->model || !ci->weaponmodel[0])
{
ci->skin = NULL;
ci->icon = NULL;
ci->model = NULL;
ci->weaponmodel[0] = NULL;
return;

View File

@ -257,7 +257,7 @@ void SCR_DrawNet( void )
if (cls.netchan.outgoing_sequence - cls.netchan.incoming_acknowledged < CMD_BACKUP-1)
return;
SCR_DrawPic( scr_vrect.x+64, scr_vrect.y, 48, 48, "hud/net" );
SCR_DrawPic( scr_vrect.x+64, scr_vrect.y, 48, 48, "common/net" );
}
void SCR_DrawFPS( void )

View File

@ -289,7 +289,7 @@ void CL_PrepRefresh( void )
// get splash name
Cvar_Set( "cl_levelshot_name", va("background/%s.tga", cl.configstrings[CS_NAME]));
if(!FS_FileExists(va("graphics/%s", Cvar_VariableString("cl_levelshot_name"))))
if(!FS_FileExists(va("gfx/%s", Cvar_VariableString("cl_levelshot_name"))))
{
Cvar_Set("cl_levelshot_name", "common/black");
cl.make_levelshot = true; // make levelshot
@ -379,10 +379,10 @@ void CL_PrepRefresh( void )
/*
====================
CalcFov
V_CalcFov
====================
*/
float CalcFov( float fov_x, float width, float height )
float V_CalcFov( float fov_x, float width, float height )
{
float fov_y, x, rad = 360.0f * M_PI;
@ -474,7 +474,7 @@ void V_RenderView( void )
cl.refdef.y = scr_vrect.y;
cl.refdef.width = scr_vrect.width;
cl.refdef.height = scr_vrect.height;
cl.refdef.fov_y = CalcFov (cl.refdef.fov_x, cl.refdef.width, cl.refdef.height);
cl.refdef.fov_y = V_CalcFov (cl.refdef.fov_x, cl.refdef.width, cl.refdef.height);
cl.refdef.time = cls.realtime; // render use realtime now
cl.refdef.areabits = cl.frame.areabits;
@ -537,7 +537,7 @@ void V_PostRender( void )
SCR_DrawNet();
SCR_DrawFPS();
Con_DrawConsole();
M_Draw();
UI_Draw();
re->EndFrame();
}

View File

@ -110,8 +110,6 @@ typedef struct
char name[MAX_QPATH];
char cinfo[MAX_QPATH];
image_t *skin;
image_t *icon;
char iconname[MAX_QPATH];
model_t *model;
model_t *weaponmodel[MAX_CLIENTWEAPONMODELS];
} clientinfo_t;
@ -638,6 +636,7 @@ void V_AddEntity (entity_t *ent);
void V_AddParticle (vec3_t org, int color, float alpha);
void V_AddLight (vec3_t org, float intensity, float r, float g, float b);
void V_AddLightStyle (int style, float r, float g, float b);
float V_CalcFov( float fov_x, float width, float height );
//
// cl_tent.c
@ -673,16 +672,6 @@ void CL_EntityEvent (entity_state_t *ent);
void CL_TrapParticles (entity_t *ent);
void CL_StudioEvent ( mstudioevent_t *event, entity_t *ent );
//
// menus
//
void M_Init (void);
void M_Keydown (int key);
void M_Draw (void);
void M_Menu_Main_f (void);
void M_ForceMenuOff (void);
void M_AddToServerList (netadr_t adr, char *info);
//
// cl_pred.c
//
@ -715,6 +704,21 @@ extern field_t historyEditLines[COMMAND_HISTORY];
extern field_t g_consoleField;
extern field_t chatField;
//
// cl_keys.c
//
extern bool ui_active;
extern const int vm_ui_numbuiltins;
extern prvm_builtin_t vm_ui_builtins[];
void UI_Init( void );
void UI_DrawCredits( void );
void UI_KeyEvent( int key );
void UI_ShowMenu( void );
void UI_HideMenu( void );
void UI_Shutdown( void );
void UI_Draw( void );
//
// cl_keys.c
//

View File

@ -10,22 +10,24 @@ struct ui_globalvars_s
int pad[28];
int pev;
func_t m_init;
func_t m_shutdown;
func_t m_keydown;
func_t m_draw;
func_t m_show;
func_t m_draw;
func_t m_hide;
func_t m_endofcredits;
func_t m_keydown;
func_t m_shutdown;
float time;
};
struct ui_entvars_s
{
string_t type;
string_t parent;
string_t name;
string_t parent;
string_t type;
int _parent;
int _child;
int _next;
int _prev;
int _child;
};
struct ui_edict_s
@ -65,40 +67,40 @@ static fields_t ui_reqfields[] =
{38, 6, "_action"},
{39, 6, "_draw"},
{40, 6, "_key"},
{41, 3, "color"},
{44, 2, "alpha"},
{45, 2, "drawflag"},
{46, 1, "link"},
{47, 1, "picture"},
{48, 3, "pos"},
{51, 3, "size"},
{54, 1, "text"},
{55, 3, "font_size"},
{58, 2, "alignment"},
{59, 1, "picture_selected"},
{60, 1, "picture_pressed"},
{61, 1, "sound_selected"},
{62, 1, "sound_pressed"},
{63, 3, "color_selected"},
{66, 3, "color_pressed"},
{69, 2, "alpha_selected"},
{70, 2, "alpha_pressed"},
{71, 2, "drawflag_selected"},
{72, 2, "drawflag_pressed"},
{73, 2, "_press_time"},
{74, 2, "hold_pressed"},
{75, 2, "_button_state"},
{76, 2, "style"},
{77, 1, "picture_bar"},
{78, 1, "sound_changed"},
{79, 2, "min_value"},
{80, 2, "max_value"},
{81, 2, "value"},
{82, 2, "step"},
{83, 3, "slider_size"},
{86, 6, "slidermove"},
{87, 6, "switchchange"},
{88, 1, "cvarname"},
{41, 2, "savecount"},
{42, 2, "save_valid"},
{43, 3, "color"},
{46, 2, "alpha"},
{47, 1, "link"},
{48, 1, "picture"},
{49, 3, "pos"},
{52, 3, "size"},
{55, 1, "text"},
{56, 3, "font_size"},
{59, 2, "alignment"},
{60, 1, "picture_selected"},
{61, 1, "picture_pressed"},
{62, 1, "sound_selected"},
{63, 1, "sound_pressed"},
{64, 3, "color_selected"},
{67, 3, "color_pressed"},
{70, 2, "alpha_selected"},
{71, 2, "alpha_pressed"},
{72, 2, "_press_time"},
{73, 2, "hold_pressed"},
{74, 2, "_button_state"},
{75, 2, "style"},
{76, 1, "picture_bar"},
{77, 1, "sound_changed"},
{78, 2, "min_value"},
{79, 2, "max_value"},
{80, 2, "value"},
{81, 2, "step"},
{82, 3, "slider_size"},
{85, 6, "slidermove"},
{86, 6, "switchchange"},
{87, 1, "cvarname"},
{88, 1, "cvarstring"},
{89, 2, "cvartype"},
{90, 4, "_link"},
{91, 2, "maxlen"},

View File

@ -1764,7 +1764,7 @@ bool Cmd_GetFontList( const char *s, char *completedname, int length )
string matchbuf;
int i, numfonts;
t = FS_Search(va("graphics/fonts/%s*.dds", s ), true);
t = FS_Search(va("gfx/fonts/%s*.dds", s ), true);
if(!t) return false;
FS_FileBase(t->filenames[0], matchbuf );

View File

@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /I "./" /I "uimenu" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /I "./" /I "network" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@ -80,7 +80,7 @@ SOURCE="$(InputPath)"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "uimenu" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /FD /c
# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "network" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
@ -154,6 +154,10 @@ SOURCE=.\client\cl_main.c
# End Source File
# Begin Source File
SOURCE=.\client\cl_menu.c
# End Source File
# Begin Source File
SOURCE=.\client\cl_newfx.c
# End Source File
# Begin Source File
@ -194,23 +198,15 @@ SOURCE=.\host.c
# End Source File
# Begin Source File
SOURCE=.\uimenu\menu.c
SOURCE=.\network\net_chan.c
# End Source File
# Begin Source File
SOURCE=.\net_chan.c
SOURCE=.\network\net_msg.c
# End Source File
# Begin Source File
SOURCE=.\net_msg.c
# End Source File
# Begin Source File
SOURCE=.\net_wins.c
# End Source File
# Begin Source File
SOURCE=.\uimenu\qmenu.c
SOURCE=.\network\net_wins.c
# End Source File
# Begin Source File
@ -260,14 +256,6 @@ SOURCE=.\server\sv_user.c
SOURCE=.\server\sv_world.c
# End Source File
# Begin Source File
SOURCE=.\uimenu\ui_cmds.c
# End Source File
# Begin Source File
SOURCE=.\uimenu\ui_main.c
# End Source File
# End Group
# Begin Group "Header Files"
@ -290,19 +278,11 @@ SOURCE=.\common.h
# End Source File
# Begin Source File
SOURCE=.\common\const.h
# End Source File
# Begin Source File
SOURCE=.\engine.h
# End Source File
# Begin Source File
SOURCE=.\net_msg.h
# End Source File
# Begin Source File
SOURCE=.\uimenu\qmenu.h
SOURCE=.\network\net_msg.h
# End Source File
# Begin Source File
@ -314,11 +294,7 @@ SOURCE=.\server\server.h
# End Source File
# Begin Source File
SOURCE=.\uimenu\uimenu.h
# End Source File
# Begin Source File
SOURCE=.\vm_cmds.h
SOURCE=.\client\ui_edict.h
# End Source File
# End Group
# End Target

View File

@ -255,7 +255,6 @@ void SV_CalcViewOffset (edict_t *ent)
void SV_SetStats (edict_t *ent)
{
ent->priv.sv->client->ps.stats[STAT_HEALTH_ICON] = SV_ImageIndex("hud/i_health");
ent->priv.sv->client->ps.stats[STAT_HEALTH] = ent->progs.sv->health;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,546 +0,0 @@
/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "uimenu.h"
static void Action_DoEnter( menuaction_s *a );
static void Action_Draw( menuaction_s *a );
static void Menu_DrawStatusBar( const char *string );
static void Menulist_DoEnter( menulist_s *l );
static void MenuList_Draw( menulist_s *l );
static void Separator_Draw( menuseparator_s *s );
static void Slider_DoSlide( menuslider_s *s, int dir );
static void Slider_Draw( menuslider_s *s );
static void SpinControl_DoEnter( menulist_s *s );
static void SpinControl_Draw( menulist_s *s );
static void SpinControl_DoSlide( menulist_s *s, int dir );
#define RCOLUMN_OFFSET 16
#define LCOLUMN_OFFSET -16
void Action_DoEnter( menuaction_s *a )
{
if ( a->generic.callback )
a->generic.callback( a );
}
void Action_Draw( menuaction_s *a )
{
if ( a->generic.flags & QMF_LEFT_JUSTIFY )
{
if ( a->generic.flags & QMF_GRAYED )
Menu_DrawStringDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
else Menu_DrawString( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
}
else
{
if ( a->generic.flags & QMF_GRAYED )
Menu_DrawStringR2LDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
else Menu_DrawStringR2L( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
}
if ( a->generic.ownerdraw ) a->generic.ownerdraw( a );
}
bool Field_DoEnter( menufield_s *f )
{
if ( f->generic.callback )
{
f->generic.callback( f );
return true;
}
return false;
}
void QField_Draw( menufield_s *f )
{
int i;
char tempbuffer[128] = "";
if ( f->generic.name )
Menu_DrawStringR2LDark( f->generic.x + f->generic.parent->x + LCOLUMN_OFFSET, f->generic.y + f->generic.parent->y, f->generic.name );
strncpy( tempbuffer, f->field.buffer + f->field.scroll, f->field.widthInChars );
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y - 4, 18 );
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y + 4, 24 );
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 24 + f->field.widthInChars * 8, f->generic.y + f->generic.parent->y - 4, 20 );
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 24 + f->field.widthInChars * 8, f->generic.y + f->generic.parent->y + 4, 26 );
for ( i = 0; i < f->field.widthInChars; i++ )
{
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y - 4, 19 );
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y + 4, 25 );
}
Menu_DrawString( f->generic.x + f->generic.parent->x + 24, f->generic.y + f->generic.parent->y, tempbuffer );
if( Menu_ItemAtCursor( f->generic.parent ) == f )
{
int offset;
if ( f->field.scroll ) offset = f->field.widthInChars;
else offset = f->field.cursor;
if ((( int )( cls.realtime * 4.0f )) & 1 )
{
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8, f->generic.y + f->generic.parent->y, 11 );
}
else
{
SCR_DrawSmallChar( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8, f->generic.y + f->generic.parent->y, ' ' );
}
}
}
bool Field_Key( menufield_s *f, int key )
{
// ignore these keys
switch ( key )
{
case K_KP_DOWNARROW:
case K_DOWNARROW:
case K_KP_UPARROW:
case K_UPARROW:
case K_KP_ENTER:
case K_ENTER:
case K_TAB:
case K_ESCAPE:
return false;
}
if( key < 127 && !Key_IsDown(K_CTRL))
{
// pass to the normal editline routine
if(!isdigit( key ) && ( f->generic.flags & QMF_NUMBERSONLY ))
return false; // numbers only
else Field_CharEvent( &f->field, key );
}
else Field_KeyDownEvent( &f->field, key ); // system symbols
return true;
}
void Menu_AddItem( menuframework_s *menu, void *item )
{
if ( menu->nitems == 0 )
menu->nslots = 0;
if ( menu->nitems < MAXMENUITEMS )
{
menu->items[menu->nitems] = item;
( ( menucommon_s * ) menu->items[menu->nitems] )->parent = menu;
menu->nitems++;
}
menu->nslots = Menu_TallySlots( menu );
}
/*
** Menu_AdjustCursor
**
** This function takes the given menu, the direction, and attempts
** to adjust the menu's cursor so that it's at the next available
** slot.
*/
void Menu_AdjustCursor( menuframework_s *m, int dir )
{
menucommon_s *citem;
/*
** see if it's in a valid spot
*/
if ( m->cursor >= 0 && m->cursor < m->nitems )
{
if(( citem = Menu_ItemAtCursor( m ) ) != 0 )
{
if ( citem->type != MTYPE_SEPARATOR )
return;
}
}
/*
** it's not in a valid spot, so crawl in the direction indicated until we
** find a valid spot
*/
if ( dir == 1 )
{
while ( 1 )
{
citem = Menu_ItemAtCursor( m );
if ( citem )
if ( citem->type != MTYPE_SEPARATOR )
break;
m->cursor += dir;
if ( m->cursor >= m->nitems )
m->cursor = 0;
}
}
else
{
while ( 1 )
{
citem = Menu_ItemAtCursor( m );
if ( citem && citem->type != MTYPE_SEPARATOR )
break;
m->cursor += dir;
if ( m->cursor < 0 ) m->cursor = m->nitems - 1;
}
}
}
void Menu_Center( menuframework_s *menu )
{
int height;
height = (( menucommon_s * ) menu->items[menu->nitems-1])->y;
height += 17;
menu->y = (scr_height->integer - height) / 2;
}
void Menu_Draw( menuframework_s *menu )
{
int i;
menucommon_s *item;
/*
** draw contents
*/
for ( i = 0; i < menu->nitems; i++ )
{
switch ((( menucommon_s * )menu->items[i] )->type )
{
case MTYPE_FIELD:
QField_Draw( ( menufield_s * ) menu->items[i] );
break;
case MTYPE_SLIDER:
Slider_Draw( ( menuslider_s * ) menu->items[i] );
break;
case MTYPE_LIST:
MenuList_Draw( ( menulist_s * ) menu->items[i] );
break;
case MTYPE_SPINCONTROL:
SpinControl_Draw( ( menulist_s * ) menu->items[i] );
break;
case MTYPE_ACTION:
Action_Draw( ( menuaction_s * ) menu->items[i] );
break;
case MTYPE_SEPARATOR:
Separator_Draw( ( menuseparator_s * ) menu->items[i] );
break;
}
}
item = Menu_ItemAtCursor( menu );
if ( item && item->cursordraw )
{
item->cursordraw( item );
}
else if ( menu->cursordraw )
{
menu->cursordraw( menu );
}
else if ( item && item->type != MTYPE_FIELD )
{
if ( item->flags & QMF_LEFT_JUSTIFY )
{
SCR_DrawSmallChar( menu->x + item->x - 24 + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( cls.realtime * 5.0f ) & 1 ) );
}
else
{
SCR_DrawSmallChar( menu->x + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( cls.realtime * 5.0f ) & 1 ) );
}
}
if ( item )
{
if ( item->statusbarfunc )
item->statusbarfunc( ( void * ) item );
else if ( item->statusbar )
Menu_DrawStatusBar( item->statusbar );
else
Menu_DrawStatusBar( menu->statusbar );
}
else
{
Menu_DrawStatusBar( menu->statusbar );
}
}
void Menu_DrawStatusBar( const char *string )
{
if ( string )
{
int col, l = strlen( string );
float y = SCREEN_HEIGHT - SMALLCHAR_HEIGHT;
float maxcol = SCREEN_WIDTH / SMALLCHAR_WIDTH;
SCR_AdjustSize( &maxcol, &y, NULL, NULL );
col = maxcol / 2 - l / 2;
SCR_FillRect( 0, SCREEN_HEIGHT - SMALLCHAR_HEIGHT, SCREEN_WIDTH, SMALLCHAR_HEIGHT, GetRGBA(0.5,0.5,0.5,0.7));
Menu_DrawString( col * SMALLCHAR_WIDTH, y, string );
}
else
{
SCR_FillRect( 0, SCREEN_HEIGHT - SMALLCHAR_HEIGHT, SCREEN_WIDTH, SMALLCHAR_HEIGHT, GetRGBA(0.5,0.5,0.5,0.7));
}
}
void Menu_DrawString( int x, int y, const char *string )
{
int i;
for ( i = 0; i < strlen( string ); i++ )
{
SCR_DrawSmallChar(( x + i * SMALLCHAR_WIDTH ), y, string[i] );
}
}
void Menu_DrawStringDark( int x, int y, const char *string )
{
unsigned i;
for ( i = 0; i < strlen( string ); i++ )
{
SCR_DrawSmallChar( ( x + i*8 ), y, string[i] + 128 );
}
}
void Menu_DrawStringR2L( int x, int y, const char *string )
{
unsigned i;
for ( i = 0; i < strlen( string ); i++ )
{
SCR_DrawSmallChar( ( x - i*8 ), y, string[strlen(string)-i-1] );
}
}
void Menu_DrawStringR2LDark( int x, int y, const char *string )
{
unsigned i;
for ( i = 0; i < strlen( string ); i++ )
{
SCR_DrawSmallChar( ( x - i*8 ), y, string[strlen(string)-i-1]+128 );
}
}
void *Menu_ItemAtCursor( menuframework_s *m )
{
if ( m->cursor < 0 || m->cursor >= m->nitems )
return 0;
return m->items[m->cursor];
}
bool Menu_SelectItem( menuframework_s *s )
{
menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
if ( item )
{
switch ( item->type )
{
case MTYPE_FIELD:
return Field_DoEnter( ( menufield_s * ) item ) ;
case MTYPE_ACTION:
Action_DoEnter( ( menuaction_s * ) item );
return true;
case MTYPE_LIST:
// Menulist_DoEnter( ( menulist_s * ) item );
return false;
case MTYPE_SPINCONTROL:
// SpinControl_DoEnter( ( menulist_s * ) item );
return false;
}
}
return false;
}
void Menu_SetStatusBar( menuframework_s *m, const char *string )
{
m->statusbar = string;
}
void Menu_SlideItem( menuframework_s *s, int dir )
{
menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
if ( item )
{
switch ( item->type )
{
case MTYPE_SLIDER:
Slider_DoSlide( ( menuslider_s * ) item, dir );
break;
case MTYPE_SPINCONTROL:
SpinControl_DoSlide( ( menulist_s * ) item, dir );
break;
}
}
}
int Menu_TallySlots( menuframework_s *menu )
{
int i;
int total = 0;
for ( i = 0; i < menu->nitems; i++ )
{
if ( ( ( menucommon_s * ) menu->items[i] )->type == MTYPE_LIST )
{
int nitems = 0;
const char **n = ( ( menulist_s * ) menu->items[i] )->itemnames;
while (*n)
nitems++, n++;
total += nitems;
}
else
{
total++;
}
}
return total;
}
void Menulist_DoEnter( menulist_s *l )
{
int start;
start = l->generic.y / 17 + 1;
l->curvalue = l->generic.parent->cursor - start;
if ( l->generic.callback )
l->generic.callback( l );
}
void MenuList_Draw( menulist_s *l )
{
const char **n;
int y = 0;
Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y, l->generic.name );
n = l->itemnames;
SCR_FillRect( l->generic.x - 112 + l->generic.parent->x, l->generic.parent->y + l->generic.y + l->curvalue*17 + 17, 128, 10, GetRGBA(0.3f, 0.8f, 1.0f, 1.0f));
while ( *n )
{
Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y + y + 17, *n );
n++;
y += 17;
}
}
void Separator_Draw( menuseparator_s *s )
{
if ( s->generic.name )
Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->generic.name );
}
void Slider_DoSlide( menuslider_s *s, int dir )
{
s->curvalue += dir;
if ( s->curvalue > s->maxvalue )
s->curvalue = s->maxvalue;
else if ( s->curvalue < s->minvalue )
s->curvalue = s->minvalue;
if ( s->generic.callback )
s->generic.callback( s );
}
#define SLIDER_RANGE 10
void Slider_Draw( menuslider_s *s )
{
int i;
Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET,
s->generic.y + s->generic.parent->y,
s->generic.name );
s->range = ( s->curvalue - s->minvalue ) / ( float ) ( s->maxvalue - s->minvalue );
s->range = bound( 0, s->range, 1 );
SCR_DrawSmallChar( s->generic.x + s->generic.parent->x + RCOLUMN_OFFSET, s->generic.y + s->generic.parent->y, 128);
for ( i = 0; i < SLIDER_RANGE; i++ )
SCR_DrawSmallChar( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 129);
SCR_DrawSmallChar( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 130);
SCR_DrawSmallChar(( int )( 8 + RCOLUMN_OFFSET + s->generic.parent->x + s->generic.x + (SLIDER_RANGE-1)*8 * s->range ), s->generic.y + s->generic.parent->y, 131);
}
void SpinControl_DoEnter( menulist_s *s )
{
s->curvalue++;
if ( s->itemnames[s->curvalue] == 0 )
s->curvalue = 0;
if ( s->generic.callback )
s->generic.callback( s );
}
void SpinControl_DoSlide( menulist_s *s, int dir )
{
s->curvalue += dir;
if ( s->curvalue < 0 )
s->curvalue = 0;
else if ( s->itemnames[s->curvalue] == 0 )
s->curvalue--;
if ( s->generic.callback )
s->generic.callback( s );
}
void SpinControl_Draw( menulist_s *s )
{
char buffer[100];
if ( s->generic.name )
{
Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET,
s->generic.y + s->generic.parent->y,
s->generic.name );
}
if ( !strchr( s->itemnames[s->curvalue], '\n' ) )
{
Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->itemnames[s->curvalue] );
}
else
{
strcpy( buffer, s->itemnames[s->curvalue] );
*strchr( buffer, '\n' ) = 0;
Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, buffer );
strcpy( buffer, strchr( s->itemnames[s->curvalue], '\n' ) + 1 );
Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y + 17, buffer );
}
}

View File

@ -1,104 +0,0 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// ui_main.c - progs user interface
//=======================================================================
#include "uimenu.h"
bool ui_active = false;
void UI_KeyEvent( int key )
{
const char *ascii = Key_KeynumToString(key);
PRVM_Begin;
PRVM_SetProg( PRVM_MENUPROG );
// set time
*prog->time = cls.realtime;
// setup args
PRVM_G_FLOAT(OFS_PARM0) = key;
PRVM_G_INT(OFS_PARM1) = PRVM_SetEngineString(ascii);
PRVM_ExecuteProgram (prog->globals.ui->m_keydown, "QC function m_keydown is missing");
PRVM_End;
}
void UI_Draw( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_draw, "QC function m_draw is missing");
PRVM_End;
}
void UI_ShowMenu( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
ui_active = true;
PRVM_ExecuteProgram (prog->globals.ui->m_show, "QC function m_toggle is missing");
PRVM_End;
}
void UI_HideMenu( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
*prog->time = cls.realtime;
ui_active = false;
PRVM_ExecuteProgram (prog->globals.ui->m_hide, "QC function m_toggle is missing");
PRVM_End;
}
void UI_Shutdown( void )
{
PRVM_Begin;
PRVM_SetProg(PRVM_MENUPROG);
// set time
//*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_shutdown, "QC function m_shutdown is missing");
// reset key_dest
cls.key_dest = key_game;
// AK not using this cause Im not sure whether this is useful at all instead :
PRVM_ResetProg();
PRVM_End;
}
void UI_Init( void )
{
PRVM_Begin;
PRVM_InitProg( PRVM_MENUPROG );
prog->progs_mempool = Mem_AllocPool( "Uimenu Progs" );
prog->builtins = vm_ui_builtins;
prog->numbuiltins = vm_ui_numbuiltins;
prog->edictprivate_size = sizeof(ui_edict_t);
prog->limit_edicts = UI_MAX_EDICTS;
prog->name = "uimenu";
prog->num_edicts = 1;
prog->loadintoworld = false;
prog->init_cmd = VM_Cmd_Init;
prog->reset_cmd = VM_Cmd_Reset;
prog->error_cmd = VM_Error;
PRVM_LoadProgs( GI->uimenu_prog, 0, NULL, UI_NUM_REQFIELDS, ui_reqfields );
*prog->time = cls.realtime;
PRVM_ExecuteProgram (prog->globals.ui->m_init, "QC function m_init is missing");
PRVM_End;
}

View File

@ -1,121 +0,0 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// uimenu.h - Xash menu system definition
//=======================================================================
#ifndef UIMENU_H
#define UIMENU_H
#include "common.h"
#include "screen.h"
#include "client.h"
#include "ui_edict.h"
#define MAXMENUITEMS 64
// menu types
#define MTYPE_SLIDER 0
#define MTYPE_LIST 1
#define MTYPE_ACTION 2
#define MTYPE_SPINCONTROL 3
#define MTYPE_SEPARATOR 4
#define MTYPE_FIELD 5
// menu flags
#define QMF_LEFT_JUSTIFY 0x00000001
#define QMF_GRAYED 0x00000002
#define QMF_NUMBERSONLY 0x00000004
typedef struct _tag_menuframework
{
int x, y;
int cursor;
int nitems;
int nslots;
void *items[64];
const char *statusbar;
void (*cursordraw)( struct _tag_menuframework *m );
} menuframework_s;
typedef struct
{
const char *name;
menuframework_s *parent;
int type;
int x, y;
int cursor_offset;
int localdata[4];
uint flags;
const char *statusbar;
void (*callback)( void *self );
void (*statusbarfunc)( void *self );
void (*ownerdraw)( void *self );
void (*cursordraw)( void *self );
} menucommon_s;
typedef struct
{
menucommon_s generic;
field_t field;
} menufield_s;
typedef struct
{
menucommon_s generic;
float minvalue;
float maxvalue;
float curvalue;
float range;
} menuslider_s;
typedef struct
{
menucommon_s generic;
int curvalue;
const char **itemnames;
} menulist_s;
typedef struct
{
menucommon_s generic;
} menuaction_s;
typedef struct
{
menucommon_s generic;
} menuseparator_s;
bool Field_Key( menufield_s *field, int key );
void Menu_AddItem( menuframework_s *menu, void *item );
void Menu_AdjustCursor( menuframework_s *menu, int dir );
void Menu_Center( menuframework_s *menu );
void Menu_Draw( menuframework_s *menu );
void *Menu_ItemAtCursor( menuframework_s *m );
bool Menu_SelectItem( menuframework_s *s );
void Menu_SetStatusBar( menuframework_s *s, const char *string );
void Menu_SlideItem( menuframework_s *s, int dir );
int Menu_TallySlots( menuframework_s *menu );
void M_FindKeysForCommand(char *command, int *keys);
void Menu_DrawString( int, int, const char * );
void Menu_DrawStringDark( int, int, const char * );
void Menu_DrawStringR2L( int, int, const char * );
void Menu_DrawStringR2LDark( int, int, const char * );
// progs menu
#define UI_MAX_EDICTS (1 << 12) // should be enough for a menu
extern bool ui_active;
extern const int vm_ui_numbuiltins;
extern prvm_builtin_t vm_ui_builtins[];
void UI_Init( void );
void UI_KeyEvent( int key );
void UI_ShowMenu( void );
void UI_HideMenu( void );
void UI_Shutdown( void );
void UI_Draw( void );
#endif//UIMENU_H

View File

@ -34,10 +34,10 @@ typedef struct loadformat_s
loadformat_t load_formats[] =
{
{"textures/%s%s.%s", "tga", Image_LoadTGA},
{"textures/%s%s.%s", "dds", Image_LoadDDS},
{"%s%s.%s", "tga", Image_LoadTGA},
{"textures/%s%s.%s", "tga", Image_LoadTGA},
{"%s%s.%s", "dds", Image_LoadDDS},
{"%s%s.%s", "tga", Image_LoadTGA},
{NULL, NULL}
};

54
public/builtin.h Normal file
View File

@ -0,0 +1,54 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// builtin.h - builtin resources
//=======================================================================
#ifndef BUILTIN_H
#define BUILTIN_H
// internal credits
static const char *xash_credits[] =
{
"^3Xash3D",
"",
"^3PROGRAMMING",
"Uncle Mike",
"",
"^3ART",
"Chorus",
"Small Link",
"",
"^3LEVEL DESIGN",
"Scrama",
"Mitoh",
"",
"",
"^3SPECIAL THANKS",
"Chain Studios at all",
"",
"",
"",
"",
"",
"",
"^3MUSIC",
"Dj Existence",
"",
"",
"^3THANKS TO",
"ID Software at all",
"Lord Havoc (Darkplaces Team)",
"Georg Destroy for icon graphics",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"Copyright XashXT Group 2008 (C)",
0
};
#endif//BUILTIN_H

View File

@ -33,7 +33,7 @@ image_t *Draw_FindPic( char *name )
{
string fullname;
byte *buffer = NULL;
long bufsize = 0;
size_t bufsize = 0;
//HACKHACK: use default font
if(stristr(name, "fonts" ))
@ -42,7 +42,7 @@ image_t *Draw_FindPic( char *name )
bufsize = sizeof(def_font);
}
com.snprintf( fullname, MAX_STRING, "graphics/%s", name );
com.snprintf( fullname, MAX_STRING, "gfx/%s", name );
return R_FindImage( fullname, buffer, bufsize, it_pic );
}
@ -136,11 +136,11 @@ void Draw_StretchPic (float x, float y, float w, float h, float s1, float t1, fl
gl = Draw_FindPic( pic );
if(!gl) return;
GL_Bind (gl->texnum[0]);
GL_Bind( gl->texnum[0] );
GL_EnableBlend();
GL_TexEnv( GL_MODULATE );
if(gl_state.draw_color[3] != 1.0f )
if( gl_state.draw_color[3] != 1.0f )
{
GL_DisableAlphaTest();
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

View File

@ -240,6 +240,7 @@ extern cvar_t *r_bloom_fast_sample;
extern cvar_t *r_motionblur_intens;
extern cvar_t *r_motionblur;
extern cvar_t *r_mirroralpha;
extern cvar_t *r_interpolate;
extern cvar_t *gl_nosubimage;
extern cvar_t *gl_bitdepth;

View File

@ -160,6 +160,7 @@ cvar_t *r_height;
cvar_t *r_mode;
cvar_t *r_physbdebug;
cvar_t *r_interpolate;
/*
=================
@ -1011,6 +1012,7 @@ void R_Register( void )
r_minimap = Cvar_Get("r_minimap", "0", CVAR_ARCHIVE );
r_mirroralpha = Cvar_Get( "r_mirroralpha", "0.5", CVAR_ARCHIVE );
r_interpolate = Cvar_Get( "r_interpolate", "0", CVAR_ARCHIVE );
gl_modulate = Cvar_Get ("gl_modulate", "1", CVAR_ARCHIVE );
gl_log = Cvar_Get( "gl_log", "0", 0 );

View File

@ -605,7 +605,7 @@ void R_SetSky (char *name, float rotate, vec3_t axis)
skyrotate = rotate;
VectorCopy(axis, skyaxis);
sprintf(pathname, "env_skybox/%s", skyname);
sprintf(pathname, "gfx/env/%s", skyname);
sky_image = R_FindImage (pathname, NULL, 0, it_sky);
if (!sky_image) sky_image = r_notexture;

View File

@ -1591,6 +1591,8 @@ void R_DrawStudioModel( int passnum )
m_pTextureHeader = m_pRenderModel->thdr;
m_PassNum = passnum;
m_fDoInterp = r_interpolate->integer;
R_StudioSetUpTransform();
// see if the bounding box lets us trivially reject, also sets

View File

@ -39,7 +39,7 @@ convformat_t convert_formats[] =
{"%s.%s", "flt", ConvFLT}, // doom1 textures
{"%s.%s", "flp", ConvFLP}, // doom1 menu pics
{"%s.%s", "mip", ConvMIP}, // Quake1/Half-Life textures
{"%s.%s", "lmp", ConvLMP}, // Quake1/Half-Life graphics
{"%s.%s", "lmp", ConvLMP}, // Quake1/Half-Life gfx
{"%s.%s", "fnt", ConvFNT}, // Half-Life fonts
{"%s.%s", "wal", ConvWAL}, // Quake2 textures
{"%s.%s", "skn", ConvSKN}, // doom1 sprite models

View File

@ -119,26 +119,26 @@ bool ConvPCX( const char *name, char *buffer, int filesize )
FS_FileBase( name, picname );
if(!com.strnicmp("num", picname, 3 ))
com.snprintf( path, MAX_STRING, "graphics/fonts/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/fonts/%s", picname );
else if(!com.strnicmp("anum", picname, 4 ))
com.snprintf( path, MAX_STRING, "graphics/fonts/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/fonts/%s", picname );
else if(!com.strnicmp("conchars", picname, 8 ))
com.snprintf( path, MAX_STRING, "graphics/fonts/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/fonts/%s", picname );
else if(!com.strnicmp("a_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/hud/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/hud/%s", picname );
else if(!com.strnicmp("p_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/hud/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/hud/%s", picname );
else if(!com.strnicmp("k_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/hud/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/hud/%s", picname );
else if(!com.strnicmp("i_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/hud/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/hud/%s", picname );
else if(!com.strnicmp("w_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/hud/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/hud/%s", picname );
else if(!com.strnicmp("m_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/menu/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/menu/%s", picname );
else if(!com.strnicmp("m_", picname, 2 ))
com.snprintf( path, MAX_STRING, "graphics/menu/%s", picname );
else com.snprintf( path, MAX_STRING, "graphics/common/%s", picname );
com.snprintf( path, MAX_STRING, "gfx/menu/%s", picname );
else com.snprintf( path, MAX_STRING, "gfx/common/%s", picname );
if(PCX_ConvertImage( path, buffer, filesize ))
{

View File

@ -141,7 +141,7 @@ bool ConvFLP( const char *name, char *buffer, int filesize )
if( pic )
{
FS_FileBase( name, savedname );
Image->SaveImage(va("%s/graphics/%s.tga", gs_gamedir, savedname ), pic );
Image->SaveImage(va("%s/gfx/%s.tga", gs_gamedir, savedname ), pic );
Image->FreeImage( pic ); // release buffer
Msg("%s.flmp\n", savedname ); // echo to console about current pic
return true;
@ -193,7 +193,7 @@ bool ConvMIP( const char *name, char *buffer, int filesize )
pixels = pic.width * pic.height;
pal = NULL; // clear palette
fin = buffer;
com.snprintf( filepath, MAX_STRING, "%s/graphics/%s.tga", gs_gamedir, savedname );
com.snprintf( filepath, MAX_STRING, "%s/gfx/%s.tga", gs_gamedir, savedname );
}
else if(filesize >= (int)sizeof(mip) + ((pixels * 85)>>6) + sizeof(short) + 768)
{
@ -301,7 +301,7 @@ bool ConvLMP( const char *name, char *buffer, int filesize )
FS_StripExtension((char *)name );
Conv_GetPaletteLMP( pal, LUMP_NORMAL );
Conv_Copy8bitRGBA( fin, pic.buffer, pixels );
Image->SaveImage(va("%s/graphics/%s.tga", gs_gamedir, name ), &pic ); // save converted image
Image->SaveImage(va("%s/gfx/%s.tga", gs_gamedir, name ), &pic ); // save converted image
Mem_Free( pic.buffer ); // release buffer
Msg("%s.lmp\n", name ); // echo to console about current image
@ -389,7 +389,7 @@ bool ConvFNT( const char *name, char *buffer, int filesize )
FS_StripExtension((char *)name );
Conv_Copy8bitRGBA( fin, pic.buffer, pixels );
Image->SaveImage(va("%s/graphics/%s.tga", gs_gamedir, name ), &pic ); // save converted image
Image->SaveImage(va("%s/gfx/%s.tga", gs_gamedir, name ), &pic ); // save converted image
Mem_Free( pic.buffer ); // release buffer
Msg("%s.qfont\n", name ); // echo to console about current font

View File

@ -10,23 +10,21 @@ SprExplorer
fopen завешивает приложение, при попытке создать файл в несуществующей директории. Ну вылетал бы чтоли, или ошибку
возвращал.
Çàìå÷åííûå áàãè:
0.
Отложенные задачи:
1. Поддержка loop для ogg vorbis
2. oggenc в виде отдельной утилиты (с импортом cue points)
3. сохранение в DXTC формат
4. snd encoder äëÿ roqlib
Текущие задачи:
1. Навести порядок в ресурсах
2. Переписать меню для использования внутренних ресурсов
0. Ïðåâðàòèòü host.debug è host.developer â cvars
1. Èìïëåìåíòàöèÿ client.dat
2. Èìïîðò cg_user.c â client.dat
3. Ïîääåðæêà êàñòîìíûõ ìåññàã
0. Полная переработка звукового движка
1. Добавить signon message
2. Вырезать нахрен меню от quake2
3. имплементировать нормальное меню (упорядочить все)
4. Почему ствол скошен от центра?
5. Зеркало доделать
6. физика игрока на ньютоне
7. избавиться от sv.moved_edicts
Физика игрока:
1. Убрать отскоки от стен
@ -62,10 +60,6 @@ Alt+Enter
// замеченные баги
1. viewer ничего не пишет в лог (сцуко)
// из неоконченного
0. snd encoder для roqlib
1. doom snd decoder для snddec
Текущие задачи:
1. Доделать сохранение в dds-формат
2. выкинуть из кода поддержку: PF_INDEXED_24, PF_INDEXED_32, (мертвые форматы)

View File

@ -1,12 +1,11 @@
const unsigned char client_dat[] =
{
const unsigned char client_dat[] = {
0x07, 0x00, 0x00, 0x00, 0x06, 0x1d, 0x00, 0x00, 0xf7, 0x02, 0x00,
0x00, 0x0b, 0x00, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x82, 0x00,
0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x1e,
0x03, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00,
0x10, 0x05, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0xd9, 0x00, 0x00,
0x00, 0x0b, 0x00, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x82, 0x00,
0x00, 0x00, 0x67, 0x06, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x1e,
0x03, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00,
0x10, 0x05, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xda, 0x00, 0x00,
0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x27, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
0x49, 0x44, 0x31, 0x36, 0x0d, 0x0a, 0x0d, 0x0a, 0x54, 0x68, 0x69,
0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20,
@ -70,124 +69,125 @@ const unsigned char client_dat[] =
0x43, 0x56, 0xcb, 0x46, 0x11, 0x33, 0x4e, 0x25, 0x9d, 0xea, 0x7a,
0xf2, 0xaa, 0xda, 0x55, 0x03, 0xf0, 0x1f, 0xb9, 0x8c, 0xe8, 0xd7,
0x27, 0x00, 0x00, 0x00, 0x78, 0xda, 0x63, 0x60, 0x40, 0x05, 0xf2,
0x0c, 0x97, 0x18, 0x58, 0x80, 0xb4, 0x09, 0x43, 0x37, 0x03, 0x31,
0x40, 0x9e, 0xe1, 0x2a, 0xc3, 0x15, 0x20, 0xad, 0x0d, 0x26, 0x11,
0x00, 0x00, 0xa6, 0x44, 0x04, 0x7c, 0x3c, 0x01, 0x00, 0x00, 0x78,
0xda, 0x8d, 0xd5, 0x4b, 0x4e, 0xc2, 0x40, 0x1c, 0xc7, 0xf1, 0x96,
0xca, 0x23, 0x1e, 0xc3, 0x3d, 0x7b, 0x6e, 0xc0, 0x11, 0xbc, 0x81,
0xd7, 0x41, 0x05, 0x11, 0xc2, 0x25, 0x30, 0x01, 0xdf, 0x8a, 0xe0,
0x86, 0x87, 0x6c, 0x78, 0xb9, 0x16, 0x44, 0x54, 0x44, 0x40, 0x74,
0xc3, 0x9b, 0xd2, 0x92, 0x4c, 0x9a, 0x19, 0xfc, 0x4e, 0xd2, 0x64,
0x68, 0x3e, 0xfd, 0xfd, 0x3b, 0x9d, 0x7f, 0x8b, 0xa6, 0xfd, 0x3f,
0x16, 0xab, 0xb1, 0xa3, 0x38, 0xbf, 0x99, 0xcf, 0x15, 0x66, 0x2e,
0x98, 0x19, 0xc8, 0x99, 0x2a, 0x8c, 0x38, 0x26, 0x0a, 0xa3, 0xdb,
0x87, 0x39, 0xc6, 0x20, 0xe7, 0x0f, 0xe4, 0xfc, 0x02, 0x33, 0x02,
0xe6, 0x07, 0x98, 0x21, 0x30, 0x03, 0xb0, 0xae, 0x3e, 0xc8, 0xf9,
0x56, 0x18, 0xc3, 0x34, 0xba, 0xa5, 0x7a, 0x0a, 0xe3, 0x5a, 0x1b,
0x6b, 0xfe, 0x05, 0x6a, 0x75, 0x41, 0xce, 0x27, 0x30, 0x1f, 0x5b,
0x8c, 0x61, 0x58, 0xf3, 0x77, 0xb0, 0xae, 0x0e, 0xa8, 0xf5, 0x06,
0xd6, 0xd5, 0x06, 0x39, 0xaf, 0xa0, 0xe7, 0x5b, 0xa0, 0x56, 0x13,
0x98, 0x17, 0x50, 0xeb, 0x19, 0xf4, 0x4f, 0x03, 0xd4, 0xaa, 0x03,
0x53, 0x03, 0xcf, 0xa7, 0x0c, 0xcc, 0x13, 0xa8, 0x55, 0x02, 0xa6,
0x08, 0x4c, 0x01, 0xdc, 0x4f, 0x1e, 0x98, 0x47, 0x60, 0x72, 0xc0,
0x64, 0x41, 0x3f, 0x3f, 0x80, 0x9c, 0x0c, 0x58, 0xfb, 0x3d, 0x30,
0x77, 0xc0, 0xdc, 0x02, 0x73, 0x03, 0xcc, 0x35, 0x30, 0x57, 0xc0,
0x5c, 0x02, 0x73, 0x01, 0xcc, 0x39, 0x30, 0x69, 0x60, 0x52, 0x60,
0xbf, 0xce, 0xb6, 0xe4, 0xd8, 0x9f, 0x3a, 0x2d, 0x09, 0x4c, 0x02,
0xbc, 0xef, 0x71, 0x60, 0x62, 0xc0, 0x9c, 0x02, 0x13, 0x05, 0xe6,
0x04, 0x98, 0x08, 0x30, 0x61, 0x60, 0x8e, 0x81, 0x39, 0x02, 0xe6,
0x10, 0x98, 0x90, 0xc2, 0xb8, 0xad, 0x77, 0x59, 0x37, 0xec, 0xbd,
0xab, 0x38, 0xf6, 0x52, 0xd6, 0x27, 0x55, 0xe1, 0xf7, 0x9e, 0x22,
0x53, 0x34, 0x7e, 0x89, 0xf1, 0x38, 0x4c, 0x40, 0x62, 0xbc, 0x0e,
0x13, 0x94, 0x18, 0x9f, 0x6d, 0x36, 0x3d, 0xb7, 0x2f, 0xe9, 0xf9,
0x5d, 0xf3, 0x7f, 0x45, 0xb8, 0xe6, 0x40, 0x92, 0xb3, 0x04, 0x2f,
0x4f, 0x1a, 0xac, 0x09, 0x02, 0x00, 0x00, 0x78, 0xda, 0x2d, 0xd1,
0x4b, 0x6c, 0x4c, 0x51, 0x1c, 0xc7, 0xf1, 0xef, 0xdc, 0xb9, 0x95,
0x48, 0x3c, 0x36, 0x16, 0xd2, 0xa0, 0xda, 0xd2, 0xa1, 0xcc, 0x78,
0x4d, 0x5b, 0xda, 0xaa, 0x77, 0x47, 0xb5, 0x74, 0x14, 0x53, 0x86,
0x7a, 0xb6, 0xe3, 0x6d, 0xb4, 0x0c, 0x65, 0x68, 0x6f, 0x69, 0x9b,
0xd1, 0x85, 0x68, 0xba, 0x53, 0x12, 0x49, 0x17, 0x82, 0xc4, 0xa6,
0xc4, 0x42, 0xa2, 0x1b, 0x6c, 0x9a, 0x2e, 0x44, 0xb0, 0x12, 0x22,
0x95, 0x58, 0x34, 0xb1, 0xf1, 0x5a, 0x74, 0xe1, 0x9e, 0xdf, 0xdc,
0xbb, 0xf9, 0xe4, 0x77, 0x7f, 0xb9, 0xe7, 0x7f, 0xce, 0xb9, 0x90,
0x7d, 0x6c, 0x67, 0x0e, 0xad, 0x72, 0x2e, 0x29, 0x39, 0x8f, 0xb4,
0xab, 0xe5, 0xe4, 0xd1, 0x25, 0xe7, 0xd3, 0x2b, 0xf3, 0xb9, 0x23,
0x0b, 0x18, 0x92, 0x85, 0x0c, 0xcb, 0x05, 0xbc, 0x92, 0x0b, 0x79,
0xe7, 0xea, 0x73, 0x8a, 0x18, 0x77, 0xf5, 0x3b, 0x01, 0x26, 0xcc,
0x7b, 0x02, 0xfc, 0x91, 0x8b, 0xb0, 0x7c, 0xc6, 0xc5, 0xcc, 0xf0,
0x99, 0xbe, 0x98, 0x5c, 0xe5, 0x62, 0xf2, 0xe4, 0x12, 0x8a, 0xe4,
0x52, 0x82, 0xea, 0x83, 0x84, 0x95, 0x83, 0x54, 0xca, 0x10, 0xd5,
0x72, 0x19, 0x51, 0xa3, 0xb3, 0x9c, 0xb8, 0x5c, 0x41, 0xb3, 0x5c,
0x49, 0x52, 0xae, 0x22, 0x25, 0xc3, 0xa4, 0x65, 0x09, 0x7d, 0xb2,
0x94, 0x41, 0xad, 0x5b, 0xc6, 0x63, 0xad, 0x53, 0xc6, 0x0b, 0xb9,
0x9a, 0xb7, 0x72, 0x0d, 0x1f, 0xd4, 0x97, 0x33, 0xae, 0x5c, 0xce,
0x5f, 0x59, 0xc1, 0x34, 0xcb, 0x58, 0x49, 0xbe, 0xd1, 0x59, 0x4b,
0xa9, 0xac, 0x22, 0x22, 0xd7, 0x11, 0xb3, 0xcc, 0xbd, 0xad, 0xa7,
0x45, 0x79, 0x03, 0x49, 0xd7, 0x29, 0xce, 0x46, 0xdc, 0xcf, 0x5d,
0x37, 0x51, 0x20, 0x37, 0xbb, 0x27, 0x31, 0x6e, 0x71, 0x27, 0x1a,
0xab, 0x89, 0xc8, 0x08, 0x09, 0xb9, 0x95, 0x46, 0xdd, 0x5b, 0x0d,
0x69, 0xcd, 0xab, 0xa1, 0x47, 0x6e, 0xa3, 0x5f, 0xd6, 0x72, 0xdf,
0x32, 0x7d, 0x1d, 0x8f, 0x94, 0xeb, 0x18, 0x96, 0xdb, 0x19, 0x91,
0x3b, 0x18, 0x55, 0x5f, 0xcf, 0x27, 0xe5, 0x7a, 0xbe, 0xc9, 0x28,
0x3f, 0xe5, 0x4e, 0x26, 0xd5, 0x37, 0x30, 0xd5, 0x6f, 0x72, 0x03,
0xb3, 0xe4, 0x2e, 0xf2, 0xe5, 0x6e, 0x42, 0xae, 0x38, 0x7b, 0xa8,
0x70, 0xcd, 0x21, 0x46, 0xad, 0x6c, 0x24, 0xe6, 0xd9, 0x24, 0xf7,
0x92, 0x90, 0xfb, 0x48, 0xca, 0x38, 0xed, 0x9e, 0x9d, 0x72, 0x3f,
0x19, 0x79, 0x80, 0x7e, 0xd9, 0xc4, 0x3d, 0x8c, 0x07, 0xb9, 0xab,
0x7c, 0x88, 0x21, 0x79, 0x98, 0x27, 0xf2, 0x08, 0xdd, 0x3e, 0xe3,
0x51, 0x9e, 0xf9, 0xb3, 0xbe, 0x94, 0xc7, 0x78, 0x2d, 0x9b, 0x19,
0x93, 0x2d, 0x7c, 0xf4, 0xfc, 0x2a, 0x13, 0x4c, 0xc8, 0xe3, 0xfc,
0x93, 0x27, 0xb0, 0xed, 0xac, 0xd3, 0xe5, 0x49, 0x66, 0xcb, 0x53,
0x14, 0xca, 0xd3, 0x84, 0x3c, 0x4b, 0xe4, 0x19, 0xaa, 0xe4, 0x59,
0x22, 0xf2, 0x1c, 0x51, 0xcf, 0xb8, 0x4c, 0x92, 0x90, 0xe7, 0x69,
0x93, 0xad, 0x74, 0xc8, 0x36, 0x32, 0xf2, 0x02, 0xa3, 0x3a, 0xd7,
0x45, 0x6e, 0x2b, 0xa7, 0x18, 0x90, 0x97, 0xf8, 0x6c, 0x65, 0xfd,
0x21, 0x2f, 0xf3, 0x5b, 0xb6, 0x63, 0x69, 0x9f, 0x57, 0x98, 0xe9,
0x99, 0x2b, 0xaf, 0x12, 0x90, 0x69, 0xc2, 0xf2, 0x1a, 0x83, 0x76,
0xd6, 0x07, 0xf2, 0x3a, 0x0f, 0x65, 0x07, 0x4f, 0x65, 0x27, 0xcf,
0xa5, 0xc3, 0x88, 0xec, 0xe2, 0x8d, 0xbc, 0x41, 0x4a, 0x73, 0x6e,
0x32, 0xa6, 0xdc, 0xcd, 0x7b, 0xd9, 0xc3, 0x17, 0xdb, 0xfc, 0xd7,
0x5e, 0xbe, 0x2b, 0x67, 0xf8, 0x25, 0x6f, 0x31, 0x29, 0xfb, 0xb0,
0x73, 0xe0, 0x3f, 0x26, 0xa4, 0x81, 0x5a, 0x19, 0x01, 0x00, 0x00,
0x78, 0xda, 0x25, 0xcf, 0x3b, 0x2c, 0x83, 0x61, 0x14, 0x87, 0xf1,
0xa7, 0xed, 0x57, 0xd7, 0x56, 0x29, 0xa5, 0xea, 0x56, 0x4a, 0xeb,
0x5a, 0x97, 0xb0, 0x5a, 0x0d, 0x16, 0x93, 0x41, 0x62, 0xed, 0x2a,
0x91, 0x48, 0x4c, 0x2c, 0x86, 0x4e, 0x12, 0xb1, 0x61, 0x90, 0x18,
0x0c, 0x12, 0x13, 0x93, 0xc1, 0xc2, 0x24, 0x9d, 0x24, 0x36, 0x61,
0x34, 0x18, 0x49, 0x0c, 0x06, 0xfd, 0x1e, 0x6f, 0xf2, 0xe5, 0x97,
0xff, 0x39, 0x6f, 0xce, 0x7b, 0x3e, 0xf8, 0x3f, 0xd1, 0xfa, 0xb7,
0x1a, 0x83, 0x18, 0x11, 0xd6, 0x63, 0x61, 0x8e, 0xb0, 0xa9, 0x51,
0x2a, 0x1a, 0x63, 0xcb, 0x7e, 0xc0, 0xae, 0x39, 0x60, 0x5f, 0xe3,
0x54, 0xb5, 0x81, 0x23, 0x6d, 0xe4, 0xcc, 0x79, 0x4d, 0x9c, 0xd4,
0x73, 0x03, 0xcd, 0x5c, 0x58, 0x6f, 0xe1, 0x4a, 0x5b, 0x39, 0x88,
0x84, 0x73, 0x12, 0xdc, 0x98, 0x13, 0xdc, 0x69, 0x92, 0x07, 0x6d,
0xa3, 0xe6, 0x3b, 0x29, 0x5e, 0xcc, 0x29, 0xde, 0xb5, 0x9d, 0x4f,
0xed, 0xe0, 0xc7, 0x7e, 0x9a, 0x20, 0x08, 0x73, 0x9a, 0xa4, 0x76,
0x92, 0xd5, 0x2e, 0x0a, 0x41, 0xd8, 0xcf, 0x50, 0x36, 0x67, 0x58,
0xd2, 0x6e, 0x96, 0xb5, 0x87, 0x15, 0xfb, 0x59, 0xd6, 0xcc, 0x59,
0x36, 0xb4, 0x97, 0x8a, 0xe6, 0xd8, 0xae, 0x1b, 0xa1, 0x8f, 0x3d,
0xed, 0xa7, 0x6a, 0x7d, 0x80, 0x27, 0xff, 0x6b, 0x90, 0x43, 0xf3,
0x10, 0xc7, 0xce, 0xc9, 0xf3, 0x1a, 0x0d, 0x73, 0x9e, 0x0f, 0x1d,
0xe6, 0x5b, 0x47, 0x88, 0xba, 0x67, 0x81, 0x94, 0x7b, 0x17, 0xc8,
0xe9, 0x28, 0x25, 0x1d, 0x63, 0xd1, 0x7e, 0x91, 0x53, 0xe7, 0x15,
0x39, 0xd7, 0x12, 0x97, 0x3a, 0xce, 0xb5, 0x4e, 0x70, 0x5b, 0x37,
0x60, 0x92, 0x7b, 0xf7, 0x99, 0xe2, 0xd1, 0xfa, 0x34, 0x3b, 0xbe,
0x33, 0x43, 0xcd, 0x5c, 0xe6, 0x59, 0x67, 0x79, 0xf3, 0xde, 0x1c,
0x5f, 0xe6, 0x79, 0x7e, 0x75, 0x81, 0x20, 0x0e, 0x7f, 0x2f, 0x5b,
0x27, 0x31, 0xab, 0x00, 0x00, 0x00, 0x78, 0xda, 0xed, 0xd0, 0xd7,
0x4e, 0x42, 0x41, 0x14, 0x05, 0xd0, 0x8b, 0x22, 0x08, 0x2a, 0x16,
0x8a, 0x05, 0x05, 0x14, 0x0b, 0x16, 0x40, 0xac, 0x20, 0x52, 0xec,
0xe5, 0xab, 0xee, 0xa7, 0xb3, 0x24, 0x3c, 0xdc, 0x17, 0x9e, 0x78,
0x22, 0x71, 0xe7, 0xac, 0x49, 0x26, 0x39, 0x99, 0x64, 0x4f, 0x10,
0xfc, 0xe7, 0x2f, 0xef, 0x7c, 0xf0, 0xc9, 0x17, 0xdf, 0xfc, 0xf2,
0x33, 0xc3, 0x9b, 0x31, 0x16, 0x58, 0x24, 0xce, 0x12, 0x09, 0x92,
0x2c, 0x93, 0x22, 0xcd, 0x0a, 0xab, 0xac, 0x91, 0x61, 0x9d, 0x0d,
0x36, 0xd9, 0x22, 0x4b, 0x8e, 0x3c, 0x05, 0xb6, 0xd9, 0x61, 0x97,
0x3d, 0x8a, 0xec, 0x73, 0x40, 0x89, 0x32, 0x15, 0x0e, 0x39, 0xa2,
0xca, 0x31, 0x27, 0x9c, 0x72, 0x46, 0x8d, 0x73, 0x2e, 0xb8, 0xe4,
0x8a, 0x3a, 0x0d, 0x9a, 0x91, 0x0e, 0xd7, 0xb4, 0xb8, 0x99, 0xf3,
0x3e, 0xd1, 0x1e, 0xb7, 0xdc, 0x71, 0xcf, 0x03, 0x8f, 0xe3, 0xa6,
0xe1, 0xc0, 0x31, 0x34, 0x84, 0xc3, 0xb6, 0x4b, 0x87, 0x27, 0xba,
0x3c, 0xd3, 0xa3, 0xcf, 0x64, 0x31, 0x78, 0xe1, 0x95, 0xb7, 0xc9,
0x3f, 0x4c, 0xcb, 0x08, 0x57, 0x9e, 0x12, 0x18
0x0c, 0x97, 0x19, 0x58, 0x80, 0xb4, 0x09, 0x43, 0x37, 0x03, 0x31,
0x40, 0x9e, 0xe1, 0x1a, 0xc3, 0x55, 0x20, 0xad, 0x0d, 0x26, 0x11,
0x00, 0x00, 0xa6, 0xc2, 0x04, 0x80, 0x40, 0x01, 0x00, 0x00, 0x78,
0xda, 0x8d, 0xd5, 0x4f, 0x4e, 0xc2, 0x40, 0x18, 0x87, 0xe1, 0xd6,
0x41, 0x31, 0x1e, 0x83, 0x3d, 0x7b, 0x6e, 0xc0, 0x11, 0xbc, 0x81,
0xd7, 0xe1, 0x8f, 0x20, 0x12, 0x2e, 0x81, 0x09, 0x2a, 0xa0, 0x88,
0xc8, 0x46, 0x05, 0x57, 0xa2, 0x6c, 0x15, 0x44, 0x44, 0x50, 0x11,
0x74, 0x83, 0x0a, 0x58, 0xdb, 0x26, 0x93, 0x66, 0xa6, 0xbe, 0x93,
0x34, 0x99, 0x92, 0x87, 0xdf, 0xc7, 0x30, 0xdf, 0xb4, 0x86, 0xf1,
0xff, 0x58, 0xfc, 0x8e, 0x80, 0xe6, 0x73, 0x77, 0x3e, 0xd7, 0x98,
0xb9, 0x64, 0x7e, 0x40, 0xce, 0xb7, 0xc6, 0xc8, 0xe3, 0x4b, 0x63,
0x4c, 0xe7, 0xb2, 0xc6, 0x0c, 0xe4, 0x7c, 0x82, 0x9c, 0x0f, 0x60,
0xa6, 0xc0, 0x4c, 0x80, 0x79, 0x07, 0x66, 0x0c, 0xd6, 0xf5, 0x06,
0x72, 0x5e, 0x35, 0x46, 0x58, 0xc6, 0xb4, 0xd5, 0x8b, 0xc6, 0xac,
0xfc, 0x19, 0x7b, 0x3e, 0x02, 0xb5, 0x86, 0x20, 0xe7, 0x19, 0x98,
0x81, 0x8f, 0x11, 0xc2, 0x9e, 0x3f, 0x81, 0x75, 0xf5, 0x41, 0xad,
0x47, 0xb0, 0xae, 0x1e, 0xc8, 0x79, 0x00, 0x39, 0x5d, 0x70, 0x2e,
0x3a, 0x20, 0xe7, 0x1e, 0x98, 0x3b, 0x50, 0xab, 0x0d, 0x7a, 0xec,
0x16, 0xd4, 0xba, 0x01, 0xa6, 0x05, 0xfe, 0xc3, 0x2b, 0x60, 0x9a,
0xa0, 0x56, 0x03, 0x98, 0x4b, 0x60, 0x2e, 0xc0, 0xef, 0x39, 0x07,
0xa6, 0x0e, 0xcc, 0x19, 0x30, 0x35, 0xd0, 0xf3, 0xa7, 0x20, 0xa7,
0x0a, 0xd6, 0x7e, 0x02, 0x4c, 0x05, 0x98, 0x63, 0x60, 0x8e, 0x80,
0x29, 0x03, 0x53, 0x02, 0xa6, 0x08, 0xcc, 0x21, 0x30, 0x07, 0xc0,
0xec, 0x03, 0x53, 0x00, 0xfb, 0xb5, 0xe7, 0x93, 0xe3, 0x3c, 0x0e,
0x8d, 0x3c, 0x30, 0x39, 0x70, 0xde, 0xb3, 0xc0, 0xec, 0x02, 0x93,
0x01, 0x66, 0x07, 0x98, 0x34, 0x30, 0x29, 0x60, 0xb6, 0x81, 0x49,
0x02, 0x93, 0x00, 0x26, 0x0e, 0x4c, 0x4c, 0x63, 0x56, 0xed, 0xb3,
0x6c, 0x0a, 0x67, 0xef, 0xae, 0x3d, 0x7b, 0xa9, 0xea, 0x93, 0x96,
0x74, 0x1f, 0xd2, 0x64, 0xca, 0x26, 0xac, 0x30, 0x6b, 0x1e, 0x13,
0x51, 0x98, 0xa0, 0xc7, 0x44, 0x15, 0x66, 0xdd, 0x31, 0x6e, 0xcf,
0x6d, 0x2a, 0x7a, 0x7e, 0xc3, 0x7a, 0xf7, 0x48, 0xdf, 0xd9, 0x52,
0xe4, 0x2c, 0x01, 0x16, 0x16, 0x1e, 0x96, 0x09, 0x02, 0x00, 0x00,
0x78, 0xda, 0x2d, 0xd1, 0x4b, 0x6c, 0x4c, 0x51, 0x1c, 0xc7, 0xf1,
0xef, 0xdc, 0xb9, 0x95, 0x48, 0x3c, 0x36, 0x16, 0xd2, 0xa0, 0xda,
0xd2, 0xa1, 0xcc, 0x78, 0x4d, 0x5b, 0xda, 0xaa, 0x77, 0x47, 0xb5,
0x74, 0x14, 0x53, 0x86, 0x7a, 0xb6, 0xe3, 0x6d, 0xb4, 0x0c, 0x65,
0x68, 0x6f, 0x69, 0x9b, 0xd1, 0x85, 0x68, 0xba, 0x53, 0x12, 0x49,
0x17, 0x82, 0xc4, 0xa6, 0xc4, 0x42, 0xa2, 0x1b, 0x6c, 0x9a, 0x2e,
0x44, 0xb0, 0x12, 0x22, 0x95, 0x58, 0x34, 0xb1, 0xf1, 0x5a, 0x74,
0xe1, 0x9e, 0xdf, 0xdc, 0xbb, 0xf9, 0xe4, 0x77, 0x7f, 0xb9, 0xe7,
0x7f, 0xce, 0xb9, 0x90, 0x7d, 0x6c, 0x67, 0x0e, 0xad, 0x72, 0x2e,
0x29, 0x39, 0x8f, 0xb4, 0xab, 0xe5, 0xe4, 0xd1, 0x25, 0xe7, 0xd3,
0x2b, 0xf3, 0xb9, 0x23, 0x0b, 0x18, 0x92, 0x85, 0x0c, 0xcb, 0x05,
0xbc, 0x92, 0x0b, 0x79, 0xe7, 0xea, 0x73, 0x8a, 0x18, 0x77, 0xf5,
0x3b, 0x01, 0x26, 0xcc, 0x7b, 0x02, 0xfc, 0x91, 0x8b, 0xb0, 0x7c,
0xc6, 0xc5, 0xcc, 0xf0, 0x99, 0xbe, 0x98, 0x5c, 0xe5, 0x62, 0xf2,
0xe4, 0x12, 0x8a, 0xe4, 0x52, 0x82, 0xea, 0x83, 0x84, 0x95, 0x83,
0x54, 0xca, 0x10, 0xd5, 0x72, 0x19, 0x51, 0xa3, 0xb3, 0x9c, 0xb8,
0x5c, 0x41, 0xb3, 0x5c, 0x49, 0x52, 0xae, 0x22, 0x25, 0xc3, 0xa4,
0x65, 0x09, 0x7d, 0xb2, 0x94, 0x41, 0xad, 0x5b, 0xc6, 0x63, 0xad,
0x53, 0xc6, 0x0b, 0xb9, 0x9a, 0xb7, 0x72, 0x0d, 0x1f, 0xd4, 0x97,
0x33, 0xae, 0x5c, 0xce, 0x5f, 0x59, 0xc1, 0x34, 0xcb, 0x58, 0x49,
0xbe, 0xd1, 0x59, 0x4b, 0xa9, 0xac, 0x22, 0x22, 0xd7, 0x11, 0xb3,
0xcc, 0xbd, 0xad, 0xa7, 0x45, 0x79, 0x03, 0x49, 0xd7, 0x29, 0xce,
0x46, 0xdc, 0xcf, 0x5d, 0x37, 0x51, 0x20, 0x37, 0xbb, 0x27, 0x31,
0x6e, 0x71, 0x27, 0x1a, 0xab, 0x89, 0xc8, 0x08, 0x09, 0xb9, 0x95,
0x46, 0xdd, 0x5b, 0x0d, 0x69, 0xcd, 0xab, 0xa1, 0x47, 0x6e, 0xa3,
0x5f, 0xd6, 0x72, 0xdf, 0x32, 0x7d, 0x1d, 0x8f, 0x94, 0xeb, 0x18,
0x96, 0xdb, 0x19, 0x91, 0x3b, 0x18, 0x55, 0x5f, 0xcf, 0x27, 0xe5,
0x7a, 0xbe, 0xc9, 0x28, 0x3f, 0xe5, 0x4e, 0x26, 0xd5, 0x37, 0x30,
0xd5, 0x6f, 0x72, 0x03, 0xb3, 0xe4, 0x2e, 0xf2, 0xe5, 0x6e, 0x42,
0xae, 0x38, 0x7b, 0xa8, 0x70, 0xcd, 0x21, 0x46, 0xad, 0x6c, 0x24,
0xe6, 0xd9, 0x24, 0xf7, 0x92, 0x90, 0xfb, 0x48, 0xca, 0x38, 0xed,
0x9e, 0x9d, 0x72, 0x3f, 0x19, 0x79, 0x80, 0x7e, 0xd9, 0xc4, 0x3d,
0x8c, 0x07, 0xb9, 0xab, 0x7c, 0x88, 0x21, 0x79, 0x98, 0x27, 0xf2,
0x08, 0xdd, 0x3e, 0xe3, 0x51, 0x9e, 0xf9, 0xb3, 0xbe, 0x94, 0xc7,
0x78, 0x2d, 0x9b, 0x19, 0x93, 0x2d, 0x7c, 0xf4, 0xfc, 0x2a, 0x13,
0x4c, 0xc8, 0xe3, 0xfc, 0x93, 0x27, 0xb0, 0xed, 0xac, 0xd3, 0xe5,
0x49, 0x66, 0xcb, 0x53, 0x14, 0xca, 0xd3, 0x84, 0x3c, 0x4b, 0xe4,
0x19, 0xaa, 0xe4, 0x59, 0x22, 0xf2, 0x1c, 0x51, 0xcf, 0xb8, 0x4c,
0x92, 0x90, 0xe7, 0x69, 0x93, 0xad, 0x74, 0xc8, 0x36, 0x32, 0xf2,
0x02, 0xa3, 0x3a, 0xd7, 0x45, 0x6e, 0x2b, 0xa7, 0x18, 0x90, 0x97,
0xf8, 0x6c, 0x65, 0xfd, 0x21, 0x2f, 0xf3, 0x5b, 0xb6, 0x63, 0x69,
0x9f, 0x57, 0x98, 0xe9, 0x99, 0x2b, 0xaf, 0x12, 0x90, 0x69, 0xc2,
0xf2, 0x1a, 0x83, 0x76, 0xd6, 0x07, 0xf2, 0x3a, 0x0f, 0x65, 0x07,
0x4f, 0x65, 0x27, 0xcf, 0xa5, 0xc3, 0x88, 0xec, 0xe2, 0x8d, 0xbc,
0x41, 0x4a, 0x73, 0x6e, 0x32, 0xa6, 0xdc, 0xcd, 0x7b, 0xd9, 0xc3,
0x17, 0xdb, 0xfc, 0xd7, 0x5e, 0xbe, 0x2b, 0x67, 0xf8, 0x25, 0x6f,
0x31, 0x29, 0xfb, 0xb0, 0x73, 0xe0, 0x3f, 0x26, 0xa4, 0x81, 0x5a,
0x19, 0x01, 0x00, 0x00, 0x78, 0xda, 0x25, 0xcf, 0x3b, 0x2c, 0x83,
0x61, 0x14, 0x87, 0xf1, 0xa7, 0xed, 0x57, 0xd7, 0x56, 0x29, 0xa5,
0xea, 0x56, 0x4a, 0xeb, 0x5a, 0x97, 0xb0, 0x5a, 0x0d, 0x16, 0x93,
0x41, 0x62, 0xed, 0x2a, 0x91, 0x48, 0x4c, 0x2c, 0x86, 0x4e, 0x12,
0xb1, 0x61, 0x90, 0x18, 0x0c, 0x12, 0x13, 0x93, 0xc1, 0xc2, 0x24,
0x9d, 0x24, 0x36, 0x61, 0x34, 0x18, 0x49, 0x0c, 0x06, 0xfd, 0x1e,
0x6f, 0xf2, 0xe5, 0x97, 0xff, 0x39, 0x6f, 0xce, 0x7b, 0x3e, 0xf8,
0x3f, 0xd1, 0xfa, 0xb7, 0x1a, 0x83, 0x18, 0x11, 0xd6, 0x63, 0x61,
0x8e, 0xb0, 0xa9, 0x51, 0x2a, 0x1a, 0x63, 0xcb, 0x7e, 0xc0, 0xae,
0x39, 0x60, 0x5f, 0xe3, 0x54, 0xb5, 0x81, 0x23, 0x6d, 0xe4, 0xcc,
0x79, 0x4d, 0x9c, 0xd4, 0x73, 0x03, 0xcd, 0x5c, 0x58, 0x6f, 0xe1,
0x4a, 0x5b, 0x39, 0x88, 0x84, 0x73, 0x12, 0xdc, 0x98, 0x13, 0xdc,
0x69, 0x92, 0x07, 0x6d, 0xa3, 0xe6, 0x3b, 0x29, 0x5e, 0xcc, 0x29,
0xde, 0xb5, 0x9d, 0x4f, 0xed, 0xe0, 0xc7, 0x7e, 0x9a, 0x20, 0x08,
0x73, 0x9a, 0xa4, 0x76, 0x92, 0xd5, 0x2e, 0x0a, 0x41, 0xd8, 0xcf,
0x50, 0x36, 0x67, 0x58, 0xd2, 0x6e, 0x96, 0xb5, 0x87, 0x15, 0xfb,
0x59, 0xd6, 0xcc, 0x59, 0x36, 0xb4, 0x97, 0x8a, 0xe6, 0xd8, 0xae,
0x1b, 0xa1, 0x8f, 0x3d, 0xed, 0xa7, 0x6a, 0x7d, 0x80, 0x27, 0xff,
0x6b, 0x90, 0x43, 0xf3, 0x10, 0xc7, 0xce, 0xc9, 0xf3, 0x1a, 0x0d,
0x73, 0x9e, 0x0f, 0x1d, 0xe6, 0x5b, 0x47, 0x88, 0xba, 0x67, 0x81,
0x94, 0x7b, 0x17, 0xc8, 0xe9, 0x28, 0x25, 0x1d, 0x63, 0xd1, 0x7e,
0x91, 0x53, 0xe7, 0x15, 0x39, 0xd7, 0x12, 0x97, 0x3a, 0xce, 0xb5,
0x4e, 0x70, 0x5b, 0x37, 0x60, 0x92, 0x7b, 0xf7, 0x99, 0xe2, 0xd1,
0xfa, 0x34, 0x3b, 0xbe, 0x33, 0x43, 0xcd, 0x5c, 0xe6, 0x59, 0x67,
0x79, 0xf3, 0xde, 0x1c, 0x5f, 0xe6, 0x79, 0x7e, 0x75, 0x81, 0x20,
0x0e, 0x7f, 0x2f, 0x5b, 0x27, 0x31, 0xab, 0x00, 0x00, 0x00, 0x78,
0xda, 0xed, 0xd0, 0xc7, 0x4e, 0x42, 0x51, 0x14, 0x05, 0xd0, 0x27,
0x58, 0x50, 0x10, 0xec, 0x20, 0x48, 0xb1, 0xf7, 0x0e, 0x88, 0x4a,
0x79, 0x20, 0x52, 0xf4, 0xa7, 0xf8, 0x74, 0x97, 0x86, 0x01, 0x13,
0x46, 0x8c, 0x4c, 0xd8, 0x39, 0xeb, 0x26, 0x37, 0x39, 0xb9, 0xc9,
0xbe, 0x41, 0x30, 0xcf, 0x6f, 0x3e, 0xe9, 0xd1, 0x67, 0xc0, 0x90,
0x6f, 0xbe, 0x66, 0x78, 0x73, 0x81, 0x08, 0x51, 0x16, 0x59, 0x62,
0x99, 0x15, 0x62, 0xac, 0xb2, 0x46, 0x9c, 0x04, 0xeb, 0x24, 0x49,
0xb1, 0xc1, 0x26, 0x5b, 0x6c, 0xb3, 0xc3, 0x2e, 0x7b, 0xa4, 0xc9,
0xb0, 0x4f, 0x96, 0x1c, 0x07, 0xe4, 0x29, 0x50, 0xa4, 0xc4, 0x21,
0x47, 0x1c, 0x73, 0xc2, 0x29, 0x67, 0x9c, 0x73, 0xc1, 0x25, 0x57,
0x5c, 0x73, 0xc3, 0x2d, 0x77, 0xdc, 0x4f, 0x74, 0x78, 0xe0, 0x91,
0xa7, 0x7f, 0xde, 0x67, 0xb2, 0xc7, 0x33, 0x65, 0x2a, 0x54, 0x79,
0xa1, 0xf6, 0xd7, 0x76, 0xd4, 0x72, 0x84, 0x86, 0x51, 0xf8, 0xea,
0xf2, 0xc6, 0x3b, 0x75, 0x1a, 0x34, 0x19, 0x2f, 0x05, 0x6d, 0x3a,
0x7c, 0xd0, 0x1d, 0xff, 0xc5, 0xb4, 0xfc, 0x00, 0xb3, 0x36, 0x12,
0x63
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,7 @@ extern int prvm_developer;
#define PROG_CRC_SERVER 5103
#define PROG_CRC_CLIENT 7430
#define PROG_CRC_UIMENU 36416
#define PROG_CRC_UIMENU 2460
enum op_state
{