20 Jul 2008

This commit is contained in:
g-cont 2008-07-20 00:00:00 +04:00 committed by Alibek Omarov
parent 9759bb3d12
commit 5ba3d95bf8
31 changed files with 1329 additions and 829 deletions

View File

@ -71,5 +71,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg
echo Build succeeded!
echo Please wait. Xash is now loading
cd D:\Xash3D\
quake.exe -log -game tmpQuArK -debug -dev 3 +map start
quake.exe -log -game tmpQuArK -debug -dev 3
:done

View File

@ -740,7 +740,7 @@ void UI_Init( void )
prog->error_cmd = VM_Error;
prog->filecrc = PROG_CRC_UIMENU;
PRVM_LoadProgs( GI->uimenu_prog, 0, NULL, UI_NUM_REQFIELDS, ui_reqfields );
PRVM_LoadProgs( va("%s/uimenu.dat", GI->vprogs_dir ), 0, NULL, UI_NUM_REQFIELDS, ui_reqfields );
*prog->time = cls.realtime * 0.001f;
PRVM_ExecuteProgram (prog->globals.ui->m_init, "m_init");

View File

@ -616,7 +616,7 @@ void CL_InitClientProgs( void )
prog->reset_cmd = VM_Cmd_Reset;
prog->error_cmd = VM_Error;
prog->flag |= PRVM_OP_STATE;
PRVM_LoadProgs( GI->client_prog, 0, NULL, CL_NUM_REQFIELDS, cl_reqfields );
PRVM_LoadProgs( va("%s/client.dat", GI->vprogs_dir ), 0, NULL, CL_NUM_REQFIELDS, cl_reqfields );
}
// init some globals

View File

@ -287,6 +287,7 @@ void VM_Cmd_Reset( void );
#define PRVM_AllocString vm->AllocString
#define PRVM_FreeString vm->FreeString
#define VM_Frame vm->Update
#define PRVM_SetProg vm->SetProg
#define PRVM_InitProg vm->InitProg
#define PRVM_ResetProg vm->ResetProg

View File

@ -499,6 +499,7 @@ void Host_Frame( void )
SV_Frame( time ); // server frame
CL_Frame( time ); // client frame
VM_Frame( time ); // vprogs frame
host.framecount++;
}

View File

@ -2470,7 +2470,7 @@ void SV_InitServerProgs( void )
prog->reset_cmd = VM_Cmd_Reset;
prog->error_cmd = VM_Error;
prog->flag |= PRVM_OP_STATE; // enable op_state feature
PRVM_LoadProgs( GI->server_prog, 0, NULL, SV_NUM_REQFIELDS, sv_reqfields );
PRVM_LoadProgs( va("%s/server.dat", GI->vprogs_dir ), 0, NULL, SV_NUM_REQFIELDS, sv_reqfields );
}
PRVM_End;
}

View File

@ -293,13 +293,15 @@ void Cmd_SystemCfg_f( void )
char *f;
size_t len;
f = FS_LoadFile( "system.rc", &len );
if (!f)
// immitate loading normal PE-file
MsgDev(D_NOTE, "Sys_LoadLibrary: Loading %s", "config.dll" );
f = FS_LoadFile( "config.dll", &len );
if( !f )
{
MsgDev( D_WARN, "couldn't exec system.rc\n" );
MsgDev(D_NOTE, " - failed\n");
return;
}
MsgDev(D_INFO, "execing system.rc\n" );
MsgDev(D_NOTE, " - ok\n");
Cbuf_InsertText(f);
Mem_Free(f);
}
@ -370,7 +372,7 @@ Cmd_Args
Returns a single string containing argv(1) to argv(argc()-1)
============
*/
char *Cmd_Args (void)
char *Cmd_Args( void )
{
static char cmd_args[MAX_STRING_CHARS];
int i;

View File

@ -1389,13 +1389,12 @@ void FS_CreateGameInfo( const char *filename )
// make simply gameinfo.txt
com_strncat(buffer, va("// generated by Xash3D\r\r\nbasedir\t\t\"%s\"\n", gs_basedir), MAX_SYSPATH ); // add new string
com_strncat(buffer, va("gamedir\t\t\"%s\"\n", gs_basedir ), MAX_SYSPATH);
com_strncat(buffer, va("title\t\t\"New Game\"\rversion\t\t\"%g\"\rviewmode\t\"firstperson\"\r", XASH_VERSION ), MAX_SYSPATH );
com_strncat(buffer, va("title\t\t\"New Game\"\rversion\t\t\"%g\"\rviewmode\t\t\"firstperson\"\r", XASH_VERSION ), MAX_SYSPATH );
com_strncat(buffer, va("gamemode\t\t\"singleplayer\"\rgamekey\t\t\"%s\"", GI.key), MAX_SYSPATH );
com_strncat(buffer, "\nstartmap\t\t\"newmap\"\n\n", MAX_SYSPATH );
com_strncat(buffer, "// name or each prog (\"\" - ignore to load)", MAX_SYSPATH );
com_strncat(buffer, "\nserver\t\t\"vprogs/server.dat\"", MAX_SYSPATH );
com_strncat(buffer, "\nclient\t\t\"vprogs/client.dat\"", MAX_SYSPATH );
com_strncat(buffer, "\nuimenu\t\t\"vrpogs/uimenu.dat\"", MAX_SYSPATH );
com_strncat(buffer, "// directory for progs binary and source", MAX_SYSPATH );
com_strncat(buffer, "\nvprogsdir\t\t\"vprogs\"", MAX_SYSPATH );
com_strncat(buffer, "\nsourcedir\t\t\"source\"", MAX_SYSPATH );
FS_WriteFile( filename, buffer, com_strlen(buffer));
Mem_Free( buffer );
@ -1465,17 +1464,13 @@ void FS_LoadGameInfo( const char *filename )
if(SC_MatchToken( "singleplayer")) GI.gamemode = 1;
if(SC_MatchToken( "multiplayer")) GI.gamemode = 2;
}
else if(SC_MatchToken( "server"))
else if(SC_MatchToken( "vprogsdir"))
{
com_strcpy(GI.server_prog, SC_GetToken( false ));
com_strcpy(GI.vprogs_dir, SC_GetToken( false ));
}
else if(SC_MatchToken( "client"))
else if(SC_MatchToken( "sourcedir"))
{
com_strcpy(GI.client_prog, SC_GetToken( false ));
}
else if(SC_MatchToken( "uimenu"))
{
com_strcpy(GI.uimenu_prog, SC_GetToken( false ));
com_strcpy(GI.source_dir, SC_GetToken( false ));
}
else if(SC_MatchToken( "gamekey"))
{
@ -1626,7 +1621,7 @@ void FS_Shutdown( void )
FS_UpdateEnvironmentVariables(); // merge working directory
com_strncpy( fs_gamedir, "bin", sizeof(fs_gamedir)); // set write directory for system config
f = FS_Open( "system.rc", "w" );
f = FS_Open( "config.dll", "w" );
if( f )
{
FS_Printf (f, "//=======================================================================\n");
@ -1636,7 +1631,7 @@ void FS_Shutdown( void )
FS_WriteVariables( f );
FS_Close (f);
}
else MsgDev( D_ERROR, "Couldn't write system.rc.\n");
else MsgDev( D_NOTE, "can't update config.dll.\n");
Mem_FreePool(&fs_mempool);
}

View File

@ -191,8 +191,8 @@ char *com_stralloc(const char *s, const char *filename, int fileline)
if(!s) return NULL;
b = _mem_alloc(Sys.stringpool, com_strlen(s) + 1, filename, fileline );
com_strcpy(b, s);
b = _mem_alloc( Sys.stringpool, com_strlen(s) + 1, filename, fileline );
com_strcpy( b, s );
return b;
}

View File

@ -59,7 +59,7 @@
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
#define CVAR_USERINFO 2 // added to userinfo when changed
#define CVAR_SERVERINFO 4 // added to serverinfo when changed
#define CVAR_SYSTEMINFO 8 // don't changed from console, saved into system.rc
#define CVAR_SYSTEMINFO 8 // don't changed from console, saved into config.dll
#define CVAR_INIT 16 // don't allow change from console at all, but can be set from the command line
#define CVAR_LATCH 32 // save changes until server restart
#define CVAR_READ_ONLY 64 // display only, cannot be set by user at all

View File

@ -423,7 +423,8 @@ typedef struct vprogs_exp_s
// compiler functions
void ( *PrepareDAT )( const char *dir, const char *name );
void ( *CompileDAT )( void );
bool ( *DecompileDAT )( void );
bool ( *DecompileDAT )( const char *name );
void ( *Update )( dword time ); // refreshing compile, exec some programs e.t.c
// edict operations
void (*WriteGlobals)( vfile_t *f );

View File

@ -1162,9 +1162,8 @@ typedef struct gameinfo_s
float cpufreq; // cpu frequency in MHz
bool rdtsc; // rdtsc support (profiler stuff)
string server_prog; // path to server.dat
string client_prog; // path to client.dat
string uimenu_prog; // path to uimenu.dat
string vprogs_dir; // default progs directory
string source_dir; // default source directory
char key[MAX_INFO_KEY]; // cd-key info
char TXcommand; // quark command (get rid of this)

7
render/r_opengl.c Normal file
View File

@ -0,0 +1,7 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// r_opengl.c - openg32.dll handler
//=======================================================================
#include "gl_local.h"

View File

@ -47,6 +47,7 @@ convformat_t convert_formats[] =
{"%s.%s", "bsp", ConvBSP}, // Quake1\Half-Life map textures
{"%s.%s", "mus", ConvMID}, // Quake1\Half-Life map textures
{"%s.%s", "snd", ConvSND}, // Quake1\Half-Life map textures
{"%s.%s", "dat", ConvDAT}, // Decompile Quake1 qc-progs
{"%s.%s", "txt", ConvRAW}, // (hidden) Xash-extract scripts
{"%s.%s", "dat", ConvRAW}, // (hidden) Xash-extract progs
{NULL, NULL } // list terminator
@ -69,10 +70,10 @@ bool ConvertResource( const char *filename )
{
if( anyformat || !com.stricmp( ext, format->ext ))
{
com.sprintf (path, format->formatstring, convname, format->ext );
com.sprintf( path, format->formatstring, convname, format->ext );
buffer = FS_LoadFile( path, &filesize );
FS_FileBase( path, basename );
if(buffer && filesize > 0)
if( buffer && filesize > 0 )
{
// this path may contains wadname: wadfile/lumpname
if( format->convfunc( path, buffer, filesize ))
@ -115,7 +116,7 @@ so do it manually
void InitConvertor ( uint funcname, int argc, char **argv )
{
launch_t CreateImglib, CreateVprogs;
string source, gamedir;
string gamedir;
// init pools
basepool = Mem_AllocPool( "Temp" );
@ -137,11 +138,8 @@ void InitConvertor ( uint funcname, int argc, char **argv )
if(!FS_GetParmFromCmdLine("-dir", gamedir ))
com.strncpy( gamedir, ".", sizeof(gamedir));
if(!FS_GetParmFromCmdLine("+dat", source ))
com.strncpy( source, "progs.dat", sizeof(source));
start = Sys_DoubleTime();
PRVM->PrepareDAT( gamedir, source );
PRVM->PrepareDAT( gamedir, "progs.dat" ); // generic name
break;
default:
FS_InitRootDir(".");
@ -208,8 +206,7 @@ void RunConvertor( void )
AddMask( "*.mus" );
break;
case RIPP_QCCDEC:
if(PRVM->DecompileDAT())
numConvertedRes++;
AddMask( "*.dat" );
break;
case RIPP_BSPDEC:
Sys_Break(" not implemented\n");

14
ripper/conv_progs.c Normal file
View File

@ -0,0 +1,14 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// conv_progs.c - convert quakec dat into source
//=======================================================================
#include "ripper.h"
bool ConvDAT( const char *name, char *buffer, int filesize )
{
// let wadlib just extract progs.dat from progs.wad
if( app_name != RIPP_QCCDEC )
return false;
return PRVM->DecompileDAT( name );
}

View File

@ -12,6 +12,9 @@ ConvRAW
*/
bool ConvRAW( const char *name, char *buffer, int filesize )
{
if( app_name == RIPP_QCCDEC )
return false;
FS_WriteFile(va("%s/other/%s", gs_gamedir, name ), buffer, filesize );
Msg("%s\n", name ); // echo to console aboutfile
return true;

View File

@ -56,8 +56,8 @@ LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /opt:nowin98
# ADD LINK32 msvcrt.lib /nologo /dll /profile /machine:I386 /nodefaultlib:"libc.lib" /opt:nowin98
# Begin Custom Build
TargetDir=\XASH3D\src_main\temp\ripper\!release
InputPath=\XASH3D\src_main\temp\ripper\!release\ripper.dll
TargetDir=\Xash3D\src_main\temp\ripper\!release
InputPath=\Xash3D\src_main\temp\ripper\!release\ripper.dll
SOURCE="$(InputPath)"
"D:\Xash3D\bin\ripper.dll" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -93,8 +93,8 @@ LINK32=link.exe
# ADD LINK32 msvcrt.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /pdbtype:sept
# SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build
TargetDir=\XASH3D\src_main\temp\ripper\!debug
InputPath=\XASH3D\src_main\temp\ripper\!debug\ripper.dll
TargetDir=\Xash3D\src_main\temp\ripper\!debug
InputPath=\Xash3D\src_main\temp\ripper\!debug\ripper.dll
SOURCE="$(InputPath)"
"D:\Xash3D\bin\ripper.dll" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -133,6 +133,10 @@ SOURCE=.\conv_pcximage.c
# End Source File
# Begin Source File
SOURCE=.\conv_progs.c
# End Source File
# Begin Source File
SOURCE=.\conv_raw.c
# End Source File
# Begin Source File

View File

@ -17,6 +17,8 @@ extern byte *zonepool;
extern string gs_gamedir;
#define Sys_Error com.error
extern imglib_exp_t *Image;
extern vprogs_exp_t *PRVM;
extern uint app_name;
//=====================================
// convertor modules
@ -37,5 +39,6 @@ bool ConvBSP( const char *name, char *buffer, int filesize ); // Extract texture
bool ConvSND( const char *name, char *buffer, int filesize ); // not implemented
bool ConvMID( const char *name, char *buffer, int filesize ); // Doom1 music files (midi)
bool ConvRAW( const char *name, char *buffer, int filesize ); // write file without converting
bool ConvDAT( const char *name, char *buffer, int filesize ); // quakec progs into source.qc
#endif//BASECONVERTOR_H

View File

@ -11,43 +11,20 @@ fopen
возвращал.
Замеченные баги:
0.
0. viewer íè÷åãî íå ïèøåò â ëîã (ñöóêî)
Отложенные задачи:
1. Поддержка loop для ogg vorbis
2. oggenc в виде отдельной утилиты (с импортом cue points)
3. сохранение в DXTC формат
4. snd encoder для roqlib
5. doom snd extractor (write PCM header 8bit 11kHz, dump data)
Текущие задачи:
0. Имплементация client.dat OK
1. Импорт cg_user.c в client.dat OK
2. Поддержка кастомных мессаг OK
3. Упорядочить svc_ мессаги OK
4. Вырезать все клиентские эффекты OK
5. Создать cl_edict_s OK
6. Отладить новые клиентские энтити OK
7. August 2007-29 OK
8. Отладить демки OK
9. Вернуть пушку в центр экрана OK
10. Исправить отрисовку bbox
11. Исправить текстуры для p_model OK
12. вернуть старый netchan OK
13. вынести поддержку сети в launch.dll OK
14. включить систему системных эвентов OK
15. перенести код от 11.07.08 OK
16. переписать код message OK
17. Исправить сохранялки OK
18. Сжатие сетевых пакетов OK
19. вызов ClientThink из RunFrame OK
20. удалить все лишние функции из com. OK
21. включить external network OK
0. Èñïðàâèòü îòðèñîâêó bbox
1. Íîðìàëüíàÿ ëèíêîâêà OpenGL32.dll
NEW RENDERER
1. Доделать поддержку DXT-форматов OK
2. Нормальная линковка OpenGL32.dll
Список доступных рендереров: Что в них интересного
0. Q3Fusion (Mirrors, Portals)
@ -72,37 +49,7 @@ NEW RENDERER
4. Уменьшить влияние инерции
5. Научить игрока ходить по лестницам
6. Научить игрока лазить по лестницам
7. триггеры реагируют на игрока
8. телепорт игрока
7. òðèããåðû ðåàãèðóþò íà èãðîêà OK
8. òåëåïîðò èãðîêà OK
Список файлов на сервере:
1. Заголовки
server.h - главный заголовок для сервера
sv_game.h - интерфейс между виртуальной машиной и сервером
sv_client.c - игрок на сервере
sv_cmds.c - консольные команды сервера
sv_game.c - ресурсы server.dat
sv_init.c - инициализация сервера
sv_main.c - сервер
sv_world.c - мир на сервере
Alt+Enter для fullscreen
// global todo list
| module | todo num | description |
@IMGLIB 1 переписать сохранение dxtc |
@RIPPER 2 doom sound extractor |
// замеченные баги
1. viewer ничего не пишет в лог (сцуко)
Текущие задачи:
1. Доделать сохранение в dds-формат
2. выкинуть из кода поддержку: PF_INDEXED_24, PF_INDEXED_32, (мертвые форматы)
3. вернуть в код поддержку: PF_ABGR_128F (hdr textures) (Backup-Jul2007-11.rar)
4. Избавится от rgb24flip
Дать четкое определение поддерживаемых форматов:
Alt+Enter äëÿ fullscreen

Binary file not shown.

View File

@ -78,6 +78,7 @@ string_t s_file, s_file2; // filename for function definition
uint locals_start; // for tracking local variables vs temps
uint locals_end; // for tracking local variables vs temps
jmp_buf pr_parse_abort; // longjump with this on parse error
jmp_buf pr_int_error; // longjump with internal error
void PR_ParseDefs (char *classname);
bool qcc_usefulstatement;
int max_breaks;
@ -1547,7 +1548,7 @@ def_t *PR_Statement ( opcode_t *op, def_t *var_a, def_t *var_b, dstatement_t **o
{ // allocate result space
var_c = PR_GetTemp(*op->type_c);
statement->c = var_c->ofs;
if (op->type_b == &type_field)
if( op->type_b == &type_field )
{
var_c->name = var_b->name;
var_c->s_file = var_b->s_file;
@ -6476,7 +6477,7 @@ PR_CompileFile
compiles the 0 terminated text, adding defintions to the pr structure
============
*/
void PR_CompileFile (char *string, char *filename)
void PR_CompileFile( char *string, char *filename )
{
jmp_buf abort_parse;
@ -6484,24 +6485,24 @@ void PR_CompileFile (char *string, char *filename)
PR_ClearGrabMacros();// clear the frame macros
compilingfile = filename;
if (opt_filenames)
if( opt_filenames )
{
pr_file_p = Qalloc(com.strlen(filename)+1);
com.strcpy(pr_file_p, filename);
s_file = pr_file_p - strings;
s_file2 = 0;
}
else s_file = s_file2 = PR_CopyString (filename, opt_noduplicatestrings );
else s_file = s_file2 = PR_CopyString( filename, opt_noduplicatestrings );
pr_file_p = string;
pr_source_line = 0;
PR_NewLine (false);
PR_Lex (); // read first token
PR_NewLine( false );
PR_Lex(); // read first token
// save state
Mem_Copy(&abort_parse, &pr_parse_abort, sizeof(abort_parse));
while (pr_token_type != tt_eof)
while( pr_token_type != tt_eof )
{
if (setjmp(pr_parse_abort))
{
@ -6522,7 +6523,7 @@ void PR_CompileFile (char *string, char *filename)
}
// outside all functions
pr_scope = NULL;
PR_ParseDefs (NULL);
PR_ParseDefs( NULL );
}
PR_GetEntvarsName(); // set entavrs default name e.g. "self"
@ -6546,7 +6547,7 @@ void PR_FinishCompilation( void )
currentchunk = NULL;
// check to make sure all functions prototyped have code
for (d = pr.def_head.next; d; d = d->next)
for( d = pr.def_head.next; d; d = d->next )
{
if (d->type->type == ev_function && !d->scope)// function parms are ok
{
@ -6579,15 +6580,23 @@ void PR_FinishCompilation( void )
pr_scope = NULL;
// compilation failed ?
if(errors)
if( errors )
{
Sys_Break("%s - %i error(s), %i warning(s)\n", progsoutname, pr_total_error_count, pr_warning_count);
string errormsg;
com.sprintf( errormsg, "%s - %i error(s), %i warning(s)\n", progsoutname, pr_total_error_count, pr_warning_count );
if( host_instance == HOST_NORMAL || host_instance == HOST_DEDICATED )
{
PR_Message( errormsg );
prvm_state = comp_error; // abort compilation
longjmp( pr_int_error, 1 );
}
else Sys_Break( errormsg );
return;
}
PR_WriteDAT();
PR_Message ("‘ª®¯¨à®¢ ­® ä ©«®¢: 1.\n\n");// enigma from M$ :)
PR_Message ("%s - %i error(s), %i warning(s)\n", progsoutname, pr_total_error_count, pr_warning_count);
PR_Message( "‘ª®¯¨à®¢ ­® ä ©«®¢: 1.\n\n");// enigma from M$ :)
PR_Message( "%s - %i error(s), %i warning(s)\n", progsoutname, pr_total_error_count, pr_warning_count );
}
/*
@ -6619,9 +6628,11 @@ bool PR_ContinueCompile( void )
return false; // end of compile
}
PR_Message ("%s\n", com_token);
qc_file = QCC_LoadFile (com_token, true );
PR_CompileFile (qc_file, com_token);
PR_Message( "%s\n", com_token );
qc_file = QCC_LoadFile( com_token, true );
if( prvm_state == comp_error )
return false;
PR_CompileFile( qc_file, com_token );
return true;
}
@ -6666,8 +6677,7 @@ void PR_BeginCompilation ( void )
numpr_globals = RESERVED_OFS; // default
freeofs = NULL;
com.sprintf (sourcefilename, "%sprogs.src", sourcedir );
progs_src = QCC_LoadFile( sourcefilename, false );// loading progs.src
progs_src = QCC_LoadFile( "progs.src", false );// loading progs.src
if(!progs_src) progs_src = PR_CreateProgsSRC(); // virtual list
while(*progs_src && *progs_src < ' ') progs_src++;

File diff suppressed because it is too large Load Diff

View File

@ -297,7 +297,7 @@ ddef_t *PRVM_ED_FieldAtOfs (int ofs)
PRVM_ED_FindField
============
*/
ddef_t *PRVM_ED_FindField (const char *name)
ddef_t *PRVM_ED_FindField( const char *name )
{
ddef_t *def;
int i;
@ -358,7 +358,7 @@ PRVM_ValueString
Returns a string describing *data in a type specific manner
=============
*/
char *PRVM_ValueString (etype_t type, prvm_eval_t *val)
char *PRVM_ValueString( etype_t type, prvm_eval_t *val )
{
static char line[MAX_INPUTLINE];
ddef_t *def;
@ -1261,7 +1261,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
if( vm.prog->progs ) Mem_Free( vm.prog->progs ); // release progs file
vm.prog->progs = (dprograms_t *)FS_LoadFile(va("%s", filename ), &filesize);
if (vm.prog->progs == NULL || filesize < (fs_offset_t)sizeof(dprograms_t))
if( vm.prog->progs == NULL || filesize < (fs_offset_t)sizeof(dprograms_t))
PRVM_ERROR("PRVM_LoadProgs: couldn't load %s for %s\n", filename, PRVM_NAME);
MsgDev(D_INFO, "%s programs occupy %iK.\n", PRVM_NAME, filesize/1024);
@ -1315,7 +1315,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
}
// decompress progs if needed
if( vm.prog->progs->blockscompressed & COMP_STATEMENTS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_STATEMENTS )
{
switch(vm.prog->intsize)
{
@ -1336,7 +1336,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
filesize += len - complen - sizeof(int); //merge filesize
}
if( vm.prog->progs->blockscompressed & COMP_DEFS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_DEFS )
{
switch(vm.prog->intsize)
{
@ -1357,7 +1357,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
filesize += len - complen - sizeof(int); //merge filesize
}
if( vm.prog->progs->blockscompressed & COMP_FIELDS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_FIELDS )
{
switch(vm.prog->intsize)
{
@ -1378,7 +1378,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
filesize += len - complen - sizeof(int); //merge filesize
}
if( vm.prog->progs->blockscompressed & COMP_FUNCTIONS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_FUNCTIONS )
{
len = sizeof(dfunction_t) * vm.prog->progs->numfunctions;
complen = LittleLong(*(int*)dfunctions);
@ -1390,7 +1390,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
filesize += len - complen - sizeof(int); //merge filesize
}
if( vm.prog->progs->blockscompressed & COMP_STRINGS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_STRINGS )
{
len = sizeof(char) * vm.prog->progs->numstrings;
complen = LittleLong(*(int*)vm.prog->strings);
@ -1404,7 +1404,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
filesize += len - complen - sizeof(int); //merge filesize
}
if( vm.prog->progs->blockscompressed & COMP_GLOBALS )
if( vm.prog->progs->version >= FPROGS_VERSION && vm.prog->progs->blockscompressed & COMP_GLOBALS )
{
len = sizeof(float) * vm.prog->progs->numglobals;
complen = LittleLong(*(int*)vm.prog->globals.gp);
@ -1418,14 +1418,8 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
if( vm.prog->sources ) // source always are packed
{
int i, numsources = LittleLong(*(int*)vm.prog->sources);
int numsources = LittleLong(*(int*)vm.prog->sources);
includeddatafile_t *src = (includeddatafile_t *)(((int *)vm.prog->sources)+1);
for( i = 0; i < numsources; i++, src++ )
{
Msg("Source: %s\n", src->filename );
Msg("Ofs, size: %d, %d\n", src->ofs, src->size );
}
}
if( vm.prog->linenums && vm.prog->progs->blockscompressed & COMP_LINENUMS )
@ -1521,7 +1515,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
if( PRVM_ED_FindFunction( ed_func[i] ) == 0 )
PRVM_ERROR("%s: %s not found in %s",PRVM_NAME, ed_func[i], filename);
for (i=0 ; i<vm.prog->progs->numglobals ; i++)
for( i = 0; i < vm.prog->progs->numglobals; i++ )
((int *)vm.prog->globals.gp)[i] = LittleLong (((int *)vm.prog->globals.gp)[i]);
// moved edict_size calculation down here, below field adding code
@ -1671,7 +1665,7 @@ void PRVM_LoadProgs( const char *filename, int numedfunc, char **ed_func, int nu
Host_Error("PRVM_LoadProgs: out of bounds global index (statement %d) in %s", i, PRVM_NAME);
break;
default:
MsgDev(D_NOTE, "PRVM_LoadProgs: unknown opcode %d at statement %d in %s\n", st->op, i, PRVM_NAME);
MsgDev(D_WARN, "PRVM_LoadProgs: unknown opcode OP_%s at statement %d in %s\n", pr_opcodes[st->op].opname, i, PRVM_NAME);
break;
}
}

View File

@ -235,7 +235,7 @@ void PRVM_PrintStatement (dstatement_t *s)
Msg("\n");
}
void PRVM_PrintFunctionStatements (const char *name)
void PRVM_PrintFunctionStatements( const char *name )
{
int i, firststatement, endstatement;
mfunction_t *func;

View File

@ -146,9 +146,9 @@ bool PR_UnInclude(void)
return true;
}
type_t *PR_NewType (char *name, int basictype)
type_t *PR_NewType( char *name, int basictype )
{
if (numtypeinfos>= maxtypeinfos) PR_ParseError(ERR_INTERNAL, "Too many types");
if( numtypeinfos >= maxtypeinfos ) PR_ParseError(ERR_INTERNAL, "Too many types");
memset(&qcc_typeinfo[numtypeinfos], 0, sizeof(type_t));
qcc_typeinfo[numtypeinfos].type = basictype;
qcc_typeinfo[numtypeinfos].name = name;
@ -162,7 +162,7 @@ type_t *PR_NewType (char *name, int basictype)
void PR_FindBestInclude( char *newfile, char *currentfile, char *rootpath )
{
char fullname[10248];
char fullname[MAX_SYSPATH];
char *stripfrom;
char *end = fullname;
@ -1914,7 +1914,7 @@ void PR_ParsePrintDef (int type, def_t *def)
PR_ParseError
============
*/
void PR_ParseError (int errortype, char *error, ...)
void PR_ParseError( int errortype, char *error, ... )
{
va_list argptr;
char string[1024];
@ -1926,16 +1926,24 @@ void PR_ParseError (int errortype, char *error, ...)
if( errortype == ERR_INTERNAL )
{
// because sys_error hide message in non-developer mode
Sys_Break( "internal error: %s\n", string );
// but in-game engine replaced Sys_Error with Host_Error and
// we can use it here
if( host_instance == HOST_NORMAL || host_instance == HOST_DEDICATED )
{
PR_Message( "^3Error:^7 %s\n", string );
prvm_state = comp_error; // abort compilation
longjmp( pr_int_error, 1 );
}
else Sys_Break( "internal error: %s\n", string );
}
else
{
PR_Message("%s:%i: error: %s\n", strings + s_file, pr_source_line, string);
longjmp (pr_parse_abort, 1);
longjmp( pr_parse_abort, 1 );
}
}
void PR_ParseErrorPrintDef (int errortype, def_t *def, char *error, ...)
void PR_ParseErrorPrintDef( int errortype, def_t *def, char *error, ... )
{
va_list argptr;
char string[1024];

View File

@ -82,7 +82,17 @@ extern char **com_argv;
typedef uint gofs_t; // offset in global data block
typedef struct function_s function_t;
typedef enum {
typedef enum
{
comp_inactive = 0,
comp_begin,
comp_frame,
comp_done,
comp_error,
} comp_state_t;
typedef enum
{
tt_eof, // end of file reached
tt_name, // an alphanumeric name token
tt_punct, // code punctuation
@ -239,7 +249,7 @@ typedef struct freeoffset_s
typedef struct
{
uint version; //weather we need to mark the progs as a newer version
uint version; // weather we need to mark the progs as a newer version
char *name;
char *opname;
int priority;
@ -250,9 +260,9 @@ typedef struct
ASSOC_RIGHT,
} associative;
struct type_s **type_a;
struct type_s **type_b;
struct type_s **type_c;
type_t **type_a;
type_t **type_b;
type_t **type_c;
} opcode_t;
typedef struct def_s
@ -346,9 +356,12 @@ typedef enum {
WARN_IMAGETOOBIG,
WARN_IGNOREDONLEFT,
// decompiling warns
WARN_UNKNOWNTEMPTYPE, //
ERR_PARSEERRORS, //caused by pr_parseerror being called.
//these are definatly my fault...
// these are definatly my fault...
ERR_INTERNAL,
ERR_TOOCOMPLEX,
ERR_BADOPCODE,
@ -362,7 +375,7 @@ typedef enum {
ERR_CONSTANTTOOLONG,
ERR_TOOMANYFRAMEMACROS,
//limitations, some are imposed by compiler, some arn't.
// limitations, some are imposed by compiler, some arn't.
ERR_TOOMANYGLOBALS,
ERR_TOOMANYGOTOS,
ERR_TOOMANYBREAKS,
@ -373,7 +386,7 @@ typedef enum {
ERR_TOOMANYPARAMETERSVARARGS,
ERR_TOOMANYTOTALPARAMETERS,
//these are probably yours, or qcc being fussy.
// these are probably yours, or qcc being fussy.
ERR_BADEXTENSION,
ERR_BADIMMEDIATETYPE,
ERR_NOOUTPUT,
@ -497,6 +510,9 @@ extern char pr_token[8192];
extern token_type_t pr_token_type;
extern type_t *pr_immediate_type;
extern eval_t pr_immediate;
extern char *basictypenames[];
extern int host_instance;
extern int prvm_state;
extern bool opt_laxcasts;
extern bool opt_ifstring;
@ -530,7 +546,8 @@ extern bool pr_subscopedlocals;
extern bool pr_warning[WARN_MAX];
extern char pr_parm_names[MAX_PARMS + MAX_PARMS_EXTRA][MAX_NAME];
extern def_t *extra_parms[MAX_PARMS_EXTRA];
extern jmp_buf pr_parse_abort; // longjump with this on parse error
extern jmp_buf pr_parse_abort; // longjump with this on parse error
extern jmp_buf pr_int_error; // casued in-game instead of Host_Error
extern int pr_source_line;
extern char *pr_file_p;
extern def_t *pr_scope;
@ -568,7 +585,7 @@ extern int numtemps;
//
void PR_InitCompile( const char *name );
void PR_InitDecompile( const char *name );
bool PRVM_DecompileProgs( void );
bool PRVM_DecompileProgs( const char *name );
//
// pr_utils.c
@ -670,6 +687,7 @@ void PR_FinishCompilation ( void );
//
// pr_decomp.c
//
bool PR_Decompile( void );
void PR_InitTypes( void );
bool PR_Decompile( const char *name );
#endif//PR_LOCAL_H

View File

@ -11,7 +11,7 @@
stdlib_api_t com;
byte *qccpool;
int com_argc;
int com_argc = 0;
char **com_argv;
char v_copyright[1024];
uint MAX_REGS;
@ -48,6 +48,7 @@ int numtypeinfos;
int maxtypeinfos;
int prvm_developer;
int host_instance;
int prvm_state;
vprogs_exp_t vm;
hashtable_t compconstantstable;
@ -250,9 +251,7 @@ void PR_InitDecompile( const char *name )
{
string progsname;
com.strncpy( sourcefilename, name, sizeof(sourcefilename));
FS_FileBase( name, progsname );
PRVM_InitProg( PRVM_DECOMPILED );
vm.prog->reserved_edicts = 1;
@ -266,6 +265,8 @@ void PR_InitDecompile( const char *name )
vm.prog->error_cmd = VM_Error;
vm.prog->flag |= PRVM_OP_STATE; // enable op_state feature
vm.prog->progs_mempool = qccpool;
PR_InitTypes();
}
void PRVM_Init( uint funcname, int argc, char **argv )
@ -291,6 +292,7 @@ void PRVM_Init( uint funcname, int argc, char **argv )
Cmd_AddCommand("prvm_globalset", PRVM_GlobalSet_f, "sets value of a specified global variable in the selected VM (server, client, menu)");
Cmd_AddCommand("prvm_edictset", PRVM_ED_EdictSet_f, "changes value of a specified property of a specified entity in the selected VM (server, client, menu)");
Cmd_AddCommand("prvm_printfunction", PRVM_PrintFunction_f, "prints a disassembly (QuakeC instructions) of the specified function in the selected VM (server, client, menu)");
Cmd_AddCommand("compile", PRVM_Compile_f, "compile specified VM (server, client, menu), changes will take affect after map restart");
// LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others))
prvm_boundscheck = Cvar_Get( "prvm_boundscheck", "0", 0, "enable vm internal boundschecker" );
@ -314,6 +316,8 @@ void PRVM_Shutdown( void )
void PRVM_PrepareProgs( const char *dir, const char *name )
{
int i;
switch( host_instance )
{
case COMP_QCCLIB:
@ -326,7 +330,12 @@ void PRVM_PrepareProgs( const char *dir, const char *name )
break;
case HOST_NORMAL:
case HOST_DEDICATED:
com_argc = Cmd_Argc();
for( i = 0; i < com_argc; i++ )
com_argv[i] = copystring(Cmd_Argv(i));
com.strncpy( sourcedir, name, MAX_SYSPATH );
PR_InitCompile( name );
prvm_state = comp_begin;
break;
default:
Sys_Break("PRVM_PrepareProgs: can't prepare progs for instance %d\n", host_instance );
@ -341,9 +350,52 @@ void PRVM_CompileProgs( void )
PR_FinishCompilation();
}
bool PRVM_DecompileProgs( void )
void PRVM_Frame( dword time )
{
return PR_Decompile();
if(setjmp(pr_int_error))
return;
switch( prvm_state )
{
case comp_begin:
PR_BeginCompilation();
prvm_state = comp_frame;
break;
case comp_frame:
if(PR_ContinueCompile());
else prvm_state = comp_done;
break;
case comp_done:
prvm_state = comp_inactive;
PR_FinishCompilation();
break;
case comp_error:
prvm_state = comp_inactive;
break;
case comp_inactive:
default: return;
}
}
bool PRVM_DecompileProgs( const char *name )
{
return PR_Decompile( name );
}
void PRVM_Compile_f( void )
{
if( Cmd_Argc() < 2)
{
Msg( "Usage: compile <program name> </D=DEFINE> </O<level>> </O<abbrev>>\n");
return;
}
if( prvm_state != comp_inactive )
{
Msg("Compile already in progress, please wait\n" );
return;
}
// engine already known about vprogs and vsource directory
PRVM_PrepareProgs( NULL, Cmd_Argv( 1 ));
}
vprogs_exp_t DLLEXPORT *CreateAPI( stdlib_api_t *input, void *unused )
@ -358,6 +410,7 @@ vprogs_exp_t DLLEXPORT *CreateAPI( stdlib_api_t *input, void *unused )
vm.PrepareDAT = PRVM_PrepareProgs;
vm.CompileDAT = PRVM_CompileProgs;
vm.DecompileDAT = PRVM_DecompileProgs;
vm.Update = PRVM_Frame;
vm.WriteGlobals = PRVM_ED_WriteGlobals;
vm.ParseGlobals = PRVM_ED_ParseGlobals;

View File

@ -371,7 +371,7 @@ PR_WriteProgdefs
write advanced progdefs.h into disk
====================
*/
word PR_WriteProgdefs (char *filename)
word PR_WriteProgdefs( char *filename )
{
char file[PROGDEFS_MAX_SIZE];
char header_name[MAX_QPATH];
@ -516,7 +516,7 @@ word PR_WriteProgdefs (char *filename)
break;
}
ADD2("\n#endif//PROGDEFS_H");
if(ForcedCRC) crc = ForcedCRC;
if( ForcedCRC ) crc = ForcedCRC;
if (FS_CheckParm("-progdefs"))
{
@ -524,7 +524,19 @@ word PR_WriteProgdefs (char *filename)
FS_WriteFile(filename, file, com.strlen(file));
}
switch (crc)
if( host_instance == HOST_NORMAL || host_instance == HOST_DEDICATED )
{
char *path = progsoutname;
string current;
com.strncpy( current, progsoutname, MAX_STRING );
if((path = strstr( current, ".." ))) path += 3; // skip ../
// make sure what progs file will be placed into right directory
com.snprintf( progsoutname, MAX_SYSPATH, "%s/%s", GI->vprogs_dir, path );
}
switch( crc )
{
case 54730:
PR_Message("QuakeWorld unmodified qwprogs.dat\n");
@ -582,6 +594,7 @@ void PR_WriteLNOfile(char *destname)
lno.numstatements = numstatements;
f = FS_Open( filename, "w" );
if( !f ) PR_ParseError( ERR_INTERNAL, "Couldn't open file %s", filename );
FS_Write(f, &lno, sizeof(dlno_t)); // header
FS_Write(f, statement_linenums, numstatements * sizeof(int));
@ -754,14 +767,19 @@ void PR_WriteDAT( void )
strofs = (strofs + 3) & ~3;
PR_Message("Linking...\n");
MsgDev(D_INFO, "%6i strofs (of %i)\n", strofs, MAX_STRINGS);
MsgDev(D_INFO, "%6i numstatements (of %i)\n", numstatements, MAX_STATEMENTS);
MsgDev(D_INFO, "%6i numfunctions (of %i)\n", numfunctions, MAX_FUNCTIONS);
MsgDev(D_INFO, "%6i numglobaldefs (of %i)\n", numglobaldefs, MAX_GLOBALS);
MsgDev(D_INFO, "%6i numfielddefs (%i unique) (of %i)\n", numfielddefs, pr.size_fields, MAX_FIELDS);
MsgDev(D_INFO, "%6i numpr_globals (of %i)\n", numpr_globals, MAX_REGS);
if( host_instance == COMP_QCCLIB )
{
// don't flood into engine console
MsgDev(D_INFO, "%6i strofs (of %i)\n", strofs, MAX_STRINGS);
MsgDev(D_INFO, "%6i numstatements (of %i)\n", numstatements, MAX_STATEMENTS);
MsgDev(D_INFO, "%6i numfunctions (of %i)\n", numfunctions, MAX_FUNCTIONS);
MsgDev(D_INFO, "%6i numglobaldefs (of %i)\n", numglobaldefs, MAX_GLOBALS);
MsgDev(D_INFO, "%6i numfielddefs (%i unique) (of %i)\n", numfielddefs, pr.size_fields, MAX_FIELDS);
MsgDev(D_INFO, "%6i numpr_globals (of %i)\n", numpr_globals, MAX_REGS);
}
f = FS_Open( progsoutname, "wb" );
if( !f ) PR_ParseError( ERR_INTERNAL, "Couldn't open file %s", progsoutname );
FS_Write(f, &progs, sizeof(progs));
FS_Write(f, "\r\n\r\n", 4);
FS_Write(f, v_copyright, com.strlen(v_copyright) + 1);
@ -941,10 +959,11 @@ void PR_WriteDAT( void )
for (i = 0; i < sizeof(progs)/4; i++)((int *)&progs)[i] = LittleLong (((int *)&progs)[i]);
FS_Seek(f, 0, SEEK_SET);
FS_Write(f, &progs, sizeof(progs));
if (asmfile) FS_Close(asmfile);
if( asmfile ) FS_Close(asmfile);
MsgDev(D_INFO, "Writing %s, total size %i bytes\n", progsoutname, progsize );
FS_Close(f);
if( host_instance == COMP_QCCLIB )
MsgDev(D_INFO, "Writing %s, total size %i bytes\n", progsoutname, progsize );
FS_Close( f );
}
/*
@ -991,22 +1010,40 @@ void PR_UnmarshalLocals( void )
if (maxo-ofs) PR_Message("Total of %i marshalled globals\n", maxo-ofs);
}
byte *PR_LoadFile(char *filename, bool crash, int type )
byte *PR_LoadFile( char *filename, bool crash, int type )
{
int length;
int length;
cachedsourcefile_t *newfile;
byte *file = FS_LoadFile( filename, &length );
if (!length)
string fullname;
byte *file;
char *path;
// NOTE: in-game we can't use ../pathes, but root directory always
// ahead over ../pathes, so tranlate path from
// ../common/svc_user.h to source/common/svc_user.h
if( host_instance == HOST_NORMAL || host_instance == HOST_DEDICATED )
{
if(crash) PR_ParseError(ERR_INTERNAL, "Couldn't open file %s", filename);
if((path = strstr( filename, ".." )))
{
path += 2; // skip ..
com.snprintf( fullname, MAX_STRING, "%s%s", GI->source_dir, path );
}
else com.snprintf( fullname, MAX_STRING, "%s/%s/%s", GI->source_dir, sourcedir, filename );
}
else com.strncpy( fullname, filename, MAX_STRING );
file = FS_LoadFile( fullname, &length );
if( !file || !length )
{
if( crash ) PR_ParseError(ERR_INTERNAL, "Couldn't open file %s", filename);
else return NULL;
}
newfile = (cachedsourcefile_t*)Qalloc( sizeof(cachedsourcefile_t) );
newfile = (cachedsourcefile_t*)Qalloc(sizeof(cachedsourcefile_t));
newfile->next = sourcefile;
sourcefile = newfile; // make chain
com.strcpy(sourcefile->filename, filename);
com.strcpy(sourcefile->filename, fullname );
sourcefile->file = file;
sourcefile->type = type;
sourcefile->size = length;
@ -1014,7 +1051,7 @@ byte *PR_LoadFile(char *filename, bool crash, int type )
return sourcefile->file;
}
bool PR_Include(char *filename)
bool PR_Include( char *filename )
{
char *newfile;
char fname[512];
@ -1032,10 +1069,10 @@ bool PR_Include(char *filename)
oldcurrentchunk = currentchunk;
com.strcpy(fname, filename);
newfile = QCC_LoadFile(fname, true );
newfile = QCC_LoadFile( fname, true );
currentchunk = NULL;
pr_file_p = newfile;
PR_CompileFile(newfile, fname);
PR_CompileFile( newfile, fname );
currentchunk = oldcurrentchunk;
compilingfile = ocompilingfile;

View File

@ -90,7 +90,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 msvcrt.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /pdbtype:sept
# ADD LINK32 msvcrtd.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build
TargetDir=\Xash3D\src_main\temp\vprogs\!debug

View File

@ -321,6 +321,7 @@ void PRVM_ED_EdictSet_f( void );
void PRVM_GlobalSet_f( void );
void PRVM_ED_Count_f( void );
void PRVM_Globals_f( void );
void PRVM_Compile_f( void );
void PRVM_Global_f( void );
void PRVM_Fields_f( void );
@ -358,7 +359,7 @@ void PRVM_PrintFunctionStatements (const char *name);
void PRVM_ED_Print(edict_t *ed);
void PRVM_ED_Write (vfile_t *f, edict_t *ed);
const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent);
char *PRVM_ValueString( etype_t type, prvm_eval_t *val );
void PRVM_ED_WriteGlobals (vfile_t *f);
void PRVM_ED_ParseGlobals (const char *data);

View File

@ -1,6 +1,6 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// s_main.c - sound engine
// s_openal.c - openal32.dll handler
//=======================================================================
#include "sound.h"