20 Jul 2008
This commit is contained in:
parent
9759bb3d12
commit
5ba3d95bf8
|
@ -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
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
//=======================================================================
|
||||
// Copyright XashXT Group 2007 ©
|
||||
// r_opengl.c - openg32.dll handler
|
||||
//=======================================================================
|
||||
|
||||
#include "gl_local.h"
|
||||
|
|
@ -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");
|
||||
|
|
|
@ -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 );
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
67
todo.log
67
todo.log
|
@ -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.
|
@ -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++;
|
||||
|
|
1681
vprogs/pr_decomp.c
1681
vprogs/pr_decomp.c
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//=======================================================================
|
||||
// Copyright XashXT Group 2007 ©
|
||||
// s_main.c - sound engine
|
||||
// s_openal.c - openal32.dll handler
|
||||
//=======================================================================
|
||||
|
||||
#include "sound.h"
|
||||
|
|
Reference in New Issue