Index: ChangeLog =================================================================== --- ChangeLog (revision 0) +++ ChangeLog (revision 10) @@ -0,0 +1,17 @@ +2006-04-08 Thilo Schulz + - Added a bit of verboseness to the init_tonextint() function. + +2006-04-04 Thilo Schulz + - Fixed a bug where the renderer shows certain weapon fire to go + through the upper half of a forcefield. + +2006-03-17 Thilo Schulz + - Added Makefile based build system for UNIXoid environments. + - New function for rounding floats to the next integer introduced + that yields the same behaviour on all platforms. + - SnapVector macro changed to use the new rounding method. It will + make the movement work similarly on all platforms. + - Fixed 64bit safety when compiling to shared objects. + - Modified the random number generators to discard the first 17 bits + to emulate the behaviour of the VM generators. + - Fixed a few compiler warnings/errors. Index: game/g_syscalls.c =================================================================== --- game/g_syscalls.c (revision 1) +++ game/g_syscalls.c (revision 10) @@ -5,10 +5,10 @@ // this file is only included when building a dll // g_syscalls.asm is included instead when building a qvm -static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; +static intptr_t (QDECL *syscall)( intptr_t arg, ... ) = (intptr_t (QDECL *)( intptr_t, ...))-1; -void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { +void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { syscall = syscallptr; } Index: game/q_math.c =================================================================== --- game/q_math.c (revision 1) +++ game/q_math.c (revision 10) @@ -3,6 +3,7 @@ // q_math.c -- stateless support routines that are included in each code module #include "q_shared.h" +int nonansicast = 0; vec3_t vec3_origin = {0,0,0}; vec3_t axisDefault[3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; @@ -1340,7 +1341,7 @@ */ float flrandom(float min, float max) { - return ((rand() * (max - min)) / 32768.0F) + min; + return (((rand() & 0x7FFF) * (max - min)) / 32768.0F) + min; } /* @@ -1350,7 +1351,7 @@ int irandom(int min, int max) { max++; //so it can round down - return ((rand() * (max - min)) >> 15) + min; + return (((rand() & 0x7FFF) * (max - min)) >> 15) + min; } @@ -1372,3 +1373,38 @@ vect[1] /= 8191.0; vect[2] /= 8191.0; } + +// Rounds the argument to the next integer. Used by SnapVector. +void init_tonextint(qboolean verbose) +{ + float decimal = 0.9; + + nonansicast = (int) decimal; + + if(verbose) + { + if(nonansicast) + Com_Printf("Float to int casting behaviour: round to next int\n"); + else + Com_Printf("Float to int casting behaviour: ISO compliant\n"); + } +} + +float tonextint(float x) +{ + int casted; + float rest; + + if(nonansicast) + return (int) x; + + casted = (int) x; + rest = x - (float) casted; + + if(rest >= 0.5f) + return casted+1; + else if(rest <= -0.5f) + return casted - 1; + else + return casted; +} Index: game/g_active.c =================================================================== --- game/g_active.c (revision 1) +++ game/g_active.c (revision 10) @@ -1159,7 +1159,7 @@ if (xaxis) { VectorSet(ent->r.mins, -halfWidth, -SHIELD_HALFTHICKNESS, -(height>>1)); - VectorSet(ent->r.maxs, halfWidth, SHIELD_HALFTHICKNESS, height>>1); + VectorSet(ent->r.maxs, halfWidth, SHIELD_HALFTHICKNESS, height); } else { Index: game/g_main.c =================================================================== --- game/g_main.c (revision 1) +++ game/g_main.c (revision 10) @@ -192,7 +192,7 @@ This MUST be the very first function compiled into the .q3vm file ================ */ -int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { +intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { switch ( command ) { case GAME_INIT: G_InitGame( arg0, arg1, arg2 ); @@ -201,7 +201,7 @@ G_ShutdownGame( arg0 ); return 0; case GAME_CLIENT_CONNECT: - return (int)ClientConnect( arg0, arg1, arg2 ); + return (intptr_t)ClientConnect( arg0, arg1, arg2 ); case GAME_CLIENT_THINK: ClientThink( arg0 ); return 0; @@ -493,6 +493,7 @@ G_Printf ("gamename: %s\n", GAMEVERSION); G_Printf ("gamedate: %s\n", __DATE__); + init_tonextint(qtrue); srand( randomSeed ); noJoinLimit = 0;//allow players to join the game still Index: game/Makefile =================================================================== --- game/Makefile (revision 0) +++ game/Makefile (revision 10) @@ -0,0 +1,119 @@ +default: qvm +qvm: build_qvm +so: build_so + +# bins for building VMs (you need all q3lcc, q3rcc, q3cpp and q3asm in the same dir.) +Q3LCC = ../../bin/q3lcc +Q3ASM = ../../bin/q3asm + +# compiler to use for building shared objects +CC = gcc + +# cflags for the VM compiler +VMCFLAGS = $(CFLAGS) -DQ3_VM +# cflags for the compiler +SOCFLAGS = $(CFLAGS) -g3 -ggdb3 -fPIC + +ARCH=$(shell uname -m | sed -e s/i.86/i386/) + +OBJ = \ + g_main.o \ + ai_chat.o \ + ai_cmd.o \ + ai_dmnet.o \ + ai_dmq3.o \ + ai_main.o \ + ai_team.o \ + bg_misc.o \ + bg_pmove.o \ + bg_slidemove.o \ + g_active.o \ + g_arenas.o \ + g_bot.o \ + g_breakable.o \ + g_client.o \ + g_cmds.o \ + g_combat.o \ + g_fx.o \ + g_items.o \ + g_log.o \ + g_mem.o \ + g_misc.o \ + g_missile.o \ + g_mover.o \ + g_session.o \ + g_spawn.o \ + g_svcmds.o \ + g_target.o \ + g_team.o \ + g_trigger.o \ + g_turrets.o \ + g_usable.o \ + g_utils.o \ + g_weapon.o \ + q_math.o \ + q_shared.o \ + +SOOBJ = \ + g_syscalls.o \ + +QVMOBJ = \ + bg_lib.o \ + +DO_VMCC = $(Q3LCC) $(VMCFLAGS) -o $@ -c $< +DO_SOCC = $(CC) $(SOCFLAGS) -o $@ -c $< + +build_qvm: DO_CC=$(DO_VMCC) +build_so: DO_CC=$(DO_SOCC) + +ai_chat.o : ai_chat.c; $(DO_CC) +ai_cmd.o : ai_cmd.c; $(DO_CC) +ai_dmnet.o : ai_dmnet.c; $(DO_CC) +ai_dmq3.o : ai_dmq3.c; $(DO_CC) +ai_main.o : ai_main.c; $(DO_CC) +ai_team.o : ai_team.c; $(DO_CC) +bg_misc.o : bg_misc.c; $(DO_CC) +bg_pmove.o : bg_pmove.c; $(DO_CC) +bg_slidemove.o : bg_slidemove.c; $(DO_CC) +g_active.o : g_active.c; $(DO_CC) +g_arenas.o : g_arenas.c; $(DO_CC) +g_bot.o : g_bot.c; $(DO_CC) +g_breakable.o : g_breakable.c; $(DO_CC) +g_client.o : g_client.c; $(DO_CC) +g_cmds.o : g_cmds.c; $(DO_CC) +g_combat.o : g_combat.c; $(DO_CC) +g_fx.o : g_fx.c; $(DO_CC) +g_items.o : g_items.c; $(DO_CC) +g_log.o : g_log.c; $(DO_CC) +g_main.o : g_main.c; $(DO_CC) +g_mem.o : g_mem.c; $(DO_CC) +g_misc.o : g_misc.c; $(DO_CC) +g_missile.o : g_missile.c; $(DO_CC) +g_mover.o : g_mover.c; $(DO_CC) +g_session.o : g_session.c; $(DO_CC) +g_spawn.o : g_spawn.c; $(DO_CC) +g_svcmds.o : g_svcmds.c; $(DO_CC) +g_target.o : g_target.c; $(DO_CC) +g_team.o : g_team.c; $(DO_CC) +g_trigger.o : g_trigger.c; $(DO_CC) +g_turrets.o : g_turrets.c; $(DO_CC) +g_usable.o : g_usable.c; $(DO_CC) +g_utils.o : g_utils.c; $(DO_CC) +g_weapon.o : g_weapon.c; $(DO_CC) +q_math.o : q_math.c; $(DO_CC) +q_shared.o : q_shared.c; $(DO_CC) + +g_syscalls.o : g_syscalls.c; $(DO_CC) + +bg_lib.o : bg_lib.c; $(DO_CC) + +build_qvm: $(OBJ) $(QVMOBJ) + $(Q3ASM) -vq3 -o qagame.qvm $(OBJ) $(QVMOBJ) g_syscalls.asm + cp *.qvm ../../baseef/vm/ + +build_so: $(OBJ) $(SOOBJ) + $(CC) -shared -Wl,--export-dynamic,-soname,qagame$(ARCH).so -o qagame$(ARCH).so $(OBJ) $(SOOBJ) + cp *.so ../../baseef/ + +clean: + rm -f *.o *.qvm *.so Index: game/ai_dmq3.c =================================================================== --- game/ai_dmq3.c (revision 1) +++ game/ai_dmq3.c (revision 10) @@ -2285,7 +2285,7 @@ #ifdef OBSTACLEDEBUG ClientName(bs->client, netname, sizeof(netname)); BotAI_Print(PRT_MESSAGE, "%s: I'm blocked by model %d\n", netname, entinfo.modelindex); -#endif OBSTACLEDEBUG +#endif //if blocked by a bsp model and the bot wants to activate it if possible if (entinfo.modelindex > 0 && entinfo.modelindex <= max_bspmodelindex && activate) { //find the bsp entity which should be activated in order to remove @@ -2295,14 +2295,14 @@ strcpy(classname, ""); #ifdef OBSTACLEDEBUG BotAI_Print(PRT_MESSAGE, "%s: can't find activator for blocking entity\n", ClientName(bs->client, netname, sizeof(netname))); -#endif //OBSTACLEDEBUG +#endif } else { trap_AAS_ValueForBSPEpairKey(ent, "classname", classname, sizeof(classname)); #ifdef OBSTACLEDEBUG ClientName(bs->client, netname, sizeof(netname)); BotAI_Print(PRT_MESSAGE, "%s: I should activate %s\n", netname, classname); -#endif OBSTACLEDEBUG +#endif } if (!strcmp(classname, "func_button")) { //create a bot goal towards the button Index: game/q_shared.h =================================================================== --- game/q_shared.h (revision 1) +++ game/q_shared.h (revision 10) @@ -74,6 +74,16 @@ #endif +// Needed for mods compiled in 64 bit shared objects. +#ifdef Q3_VM + typedef int intptr_t; +#else + #ifdef _MSC_VER + #include + #else + #include + #endif +#endif // this is the define for determining if we have an asm version of a C function #if (defined _M_IX86 || defined __i386__) && !defined __sun__ && !defined __LCC__ @@ -526,8 +536,11 @@ #define VectorSet(v, x, y, z) ((v)[0]=(x), (v)[1]=(y), (v)[2]=(z)) #define Vector4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3]) -#define SnapVector(v) {v[0]=(int)v[0];v[1]=(int)v[1];v[2]=(int)v[2];} +extern void init_tonextint(qboolean verbose); +extern float tonextint(float x); +#define SnapVector(v) {v[0] = tonextint(v[0]); v[1] = tonextint(v[1]); v[2]= tonextint(v[2]);} + // just in case you do't want to use the macros vec_t _DotProduct( const vec3_t v1, const vec3_t v2 ); void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out ); Index: game/bg_lib.h =================================================================== --- game/bg_lib.h (revision 1) +++ game/bg_lib.h (revision 10) @@ -3,6 +3,8 @@ // This file is NOT included on native builds +#ifdef Q3_VM + typedef int size_t; typedef char * va_list; @@ -67,3 +69,4 @@ int abs( int n ); double fabs( double x ); +#endif // Q3_VM Index: cgame/Makefile =================================================================== --- cgame/Makefile (revision 0) +++ cgame/Makefile (revision 10) @@ -0,0 +1,122 @@ +default: qvm +qvm: build_qvm +so: build_so + +# bins for building VMs (you need all q3lcc, q3rcc, q3cpp and q3asm in the same dir.) +Q3LCC = ../../bin/q3lcc +Q3ASM = ../../bin/q3asm + +# compiler to use for building shared objects +CC = gcc + +# cflags for the VM compiler +VMCFLAGS = $(CFLAGS) -DQ3_VM +# cflags for the compiler +SOCFLAGS = $(CFLAGS) -g3 -ggdb3 -fPIC + +ARCH=$(shell uname -m | sed -e s/i.86/i386/) + +OBJ = \ + cg_main.o \ + cg_consolecmds.o \ + cg_draw.o \ + cg_drawtools.o \ + cg_effects.o \ + cg_ents.o \ + cg_env.o \ + cg_event.o \ + cg_info.o \ + cg_localents.o \ + cg_marks.o \ + cg_players.o \ + cg_playerstate.o \ + cg_predict.o \ + cg_scoreboard.o \ + cg_screenfx.o \ + cg_servercmds.o \ + cg_snapshot.o \ + cg_view.o \ + cg_weapons.o \ + fx_borg.o \ + fx_compression.o \ + fx_dreadnought.o \ + fx_grenade.o \ + fx_imod.o \ + fx_item.o \ + fx_lib.o \ + fx_misc.o \ + fx_phaser.o \ + fx_quantum.o \ + fx_scavenger.o \ + fx_stasis.o \ + fx_tetrion.o \ + fx_transporter.o \ + + +OBJDEP = \ + ../game/q_shared.o \ + ../game/q_math.o \ + ../game/bg_misc.o \ + ../game/bg_pmove.o \ + ../game/bg_slidemove.o \ + +SOOBJ = \ + cg_syscalls.o \ + +QVMOBJ = \ + ../game/bg_lib.o \ + +DO_VMCC = $(Q3LCC) $(VMCFLAGS) -o $@ -c $< +DO_SOCC = $(CC) $(SOCFLAGS) -o $@ -c $< + +build_qvm: DO_CC=$(DO_VMCC) +build_so: DO_CC=$(DO_SOCC) + +cg_consolecmds.o : cg_consolecmds.c; $(DO_CC) +cg_draw.o : cg_draw.c; $(DO_CC) +cg_drawtools.o : cg_drawtools.c; $(DO_CC) +cg_effects.o : cg_effects.c; $(DO_CC) +cg_ents.o : cg_ents.c; $(DO_CC) +cg_env.o : cg_env.c; $(DO_CC) +cg_event.o : cg_event.c; $(DO_CC) +cg_info.o : cg_info.c; $(DO_CC) +cg_localents.o : cg_localents.c; $(DO_CC) +cg_main.o : cg_main.c; $(DO_CC) +cg_marks.o : cg_marks.c; $(DO_CC) +cg_players.o : cg_players.c; $(DO_CC) +cg_playerstate.o : cg_playerstate.c; $(DO_CC) +cg_predict.o : cg_predict.c; $(DO_CC) +cg_scoreboard.o : cg_scoreboard.c; $(DO_CC) +cg_screenfx.o : cg_screenfx.c; $(DO_CC) +cg_servercmds.o : cg_servercmds.c; $(DO_CC) +cg_snapshot.o : cg_snapshot.c; $(DO_CC) +cg_view.o : cg_view.c; $(DO_CC) +cg_weapons.o : cg_weapons.c; $(DO_CC) +fx_borg.o : fx_borg.c; $(DO_CC) +fx_compression.o : fx_compression.c; $(DO_CC) +fx_dreadnought.o : fx_dreadnought.c; $(DO_CC) +fx_grenade.o : fx_grenade.c; $(DO_CC) +fx_imod.o : fx_imod.c; $(DO_CC) +fx_item.o : fx_item.c; $(DO_CC) +fx_lib.o : fx_lib.c; $(DO_CC) +fx_misc.o : fx_misc.c; $(DO_CC) +fx_phaser.o : fx_phaser.c; $(DO_CC) +fx_quantum.o : fx_quantum.c; $(DO_CC) +fx_scavenger.o : fx_scavenger.c; $(DO_CC) +fx_stasis.o : fx_stasis.c; $(DO_CC) +fx_tetrion.o : fx_tetrion.c; $(DO_CC) +fx_transporter.o : fx_transporter.c; $(DO_CC) + +cg_syscalls.o : cg_syscalls.c; $(DO_CC) + + +build_qvm: $(OBJ) $(QVMOBJ) + $(Q3ASM) -vq3 -o cgame.qvm $(OBJ) $(OBJDEP) $(QVMOBJ) cg_syscalls.asm + cp *.qvm ../../baseef/vm/ + +build_so: $(OBJ) $(SOOBJ) + $(CC) -shared -Wl,--export-dynamic,-soname,cgame$(ARCH).so -o cgame$(ARCH).so $(OBJ) $(OBJDEP) $(SOOBJ) + cp *.so ../../baseef/ + +clean: + rm -f *.o *.qvm *.so Index: cgame/cg_syscalls.c =================================================================== --- cgame/cg_syscalls.c (revision 1) +++ cgame/cg_syscalls.c (revision 10) @@ -4,10 +4,10 @@ // cg_syscalls.asm is included instead when building a qvm #include "cg_local.h" -static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; +static intptr_t (QDECL *syscall)( intptr_t arg, ... ) = (intptr_t (QDECL *)( intptr_t, ...))-1; -void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { +void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { syscall = syscallptr; } Index: cgame/cg_main.c =================================================================== --- cgame/cg_main.c (revision 1) +++ cgame/cg_main.c (revision 10) @@ -20,7 +20,7 @@ This must be the very first function compiled into the .q3vm file ================ */ -int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { +intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { switch ( command ) { case CG_INIT: CG_Init( arg0, arg1 ); @@ -1088,6 +1088,8 @@ memset( cg_weapons, 0, sizeof(cg_weapons) ); memset( cg_items, 0, sizeof(cg_items) ); + init_tonextint(qfalse); + cgs.processedSnapshotNum = serverMessageNum; cgs.serverCommandSequence = serverCommandSequence; Index: Makefile =================================================================== --- Makefile (revision 0) +++ Makefile (revision 10) @@ -0,0 +1,16 @@ +default: build + +build_qvm: + $(MAKE) -C game build_qvm + $(MAKE) -C cgame build_qvm + $(MAKE) -C ui build_qvm + +build_so: + $(MAKE) -C game build_so + $(MAKE) -C cgame build_so + $(MAKE) -C ui build_so + +clean: + $(MAKE) -C game clean + $(MAKE) -C cgame clean + $(MAKE) -C ui clean Index: ui/ui_atoms.c =================================================================== --- ui/ui_atoms.c (revision 1) +++ ui/ui_atoms.c (revision 10) @@ -1276,6 +1276,8 @@ */ void UI_Init( void ) { + init_tonextint(qfalse); + UI_RegisterCvars(); UI_LoadMenuText(); Index: ui/ui_main.c =================================================================== --- ui/ui_main.c (revision 1) +++ ui/ui_main.c (revision 10) @@ -20,7 +20,7 @@ This must be the very first function compiled into the .qvm file ================ */ -int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { +intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ) { switch ( command ) { case UI_GETAPIVERSION: return UI_API_VERSION; Index: ui/ui_spreset.c =================================================================== --- ui/ui_spreset.c (revision 1) +++ ui/ui_spreset.c (revision 10) @@ -121,9 +121,9 @@ Reset_Cache(); - n1 = UI_ProportionalStringWidth( "YES/NO" ); - n2 = UI_ProportionalStringWidth( "YES" ) + PROP_GAP_WIDTH; - n3 = UI_ProportionalStringWidth( "/" ) + PROP_GAP_WIDTH; + n1 = UI_ProportionalStringWidth( "YES/NO", UI_BIGFONT); + n2 = UI_ProportionalStringWidth( "YES", UI_BIGFONT) + PROP_GAP_WIDTH; + n3 = UI_ProportionalStringWidth( "/", UI_BIGFONT) + PROP_GAP_WIDTH; l1 = 320 - ( n1 / 2 ); l2 = l1 + n2; l3 = l2 + n3; Index: ui/Makefile =================================================================== --- ui/Makefile (revision 0) +++ ui/Makefile (revision 10) @@ -0,0 +1,124 @@ +default: qvm +qvm: build_qvm +so: build_so + +# bins for building VMs (you need all q3lcc, q3rcc, q3cpp and q3asm in the same dir.) +Q3LCC = ../../bin/q3lcc +Q3ASM = ../../bin/q3asm + +# compiler to use for building shared objects +CC = gcc + +# cflags for the VM compiler +VMCFLAGS = $(CFLAGS) -DQ3_VM +# cflags for the compiler +SOCFLAGS = $(CFLAGS) -g3 -ggdb3 -fPIC + +ARCH=$(shell uname -m | sed -e s/i.86/i386/) + +OBJ = \ + ui_main.o \ + ui_addbots.o \ + ui_atoms.o \ + ui_cdkey.o \ + ui_confirm.o \ + ui_connect.o \ + ui_controls2.o \ + ui_cvars.o \ + ui_demo2.o \ + ui_fonts.o \ + ui_gameinfo.o \ + ui_ingame.o \ + ui_menu.o \ + ui_mfield.o \ + ui_mods.o \ + ui_network.o \ + ui_playermodel.o \ + ui_players.o \ + ui_playersettings.o \ + ui_preferences.o \ + ui_qmenu.o \ + ui_removebots.o \ + ui_serverinfo.o \ + ui_servers2.o \ + ui_sound.o \ + ui_sparena.o \ + ui_specifyserver.o \ + ui_splevel.o \ + ui_sppostgame.o \ + ui_spreset.o \ + ui_spskill.o \ + ui_startserver.o \ + ui_team.o \ + ui_teamorders.o \ + ui_video.o \ + + +OBJDEP = \ + ../game/q_shared.o \ + ../game/q_math.o \ + ../game/bg_misc.o \ + +SOOBJ = \ + ui_syscalls.o \ + +QVMOBJ = \ + ../game/bg_lib.o \ + +DO_VMCC = $(Q3LCC) $(VMCFLAGS) -o $@ -c $< +DO_SOCC = $(CC) $(SOCFLAGS) -o $@ -c $< + +build_qvm: DO_CC=$(DO_VMCC) +build_so: DO_CC=$(DO_SOCC) + +cg_consolecmds.o : cg_consolecmds.c; $(DO_CC) + +ui_addbots.o : ui_addbots.c; $(DO_CC) +ui_atoms.o : ui_atoms.c; $(DO_CC) +ui_cdkey.o : ui_cdkey.c; $(DO_CC) +ui_confirm.o : ui_confirm.c; $(DO_CC) +ui_connect.o : ui_connect.c; $(DO_CC) +ui_controls2.o : ui_controls2.c; $(DO_CC) +ui_cvars.o : ui_cvars.c; $(DO_CC) +ui_demo2.o : ui_demo2.c; $(DO_CC) +ui_fonts.o : ui_fonts.c; $(DO_CC) +ui_gameinfo.o : ui_gameinfo.c; $(DO_CC) +ui_ingame.o : ui_ingame.c; $(DO_CC) +ui_main.o : ui_main.c; $(DO_CC) +ui_menu.o : ui_menu.c; $(DO_CC) +ui_mfield.o : ui_mfield.c; $(DO_CC) +ui_mods.o : ui_mods.c; $(DO_CC) +ui_network.o : ui_network.c; $(DO_CC) +ui_playermodel.o : ui_playermodel.c; $(DO_CC) +ui_players.o : ui_players.c; $(DO_CC) +ui_playersettings.o : ui_playersettings.c; $(DO_CC) +ui_preferences.o : ui_preferences.c; $(DO_CC) +ui_qmenu.o : ui_qmenu.c; $(DO_CC) +ui_removebots.o : ui_removebots.c; $(DO_CC) +ui_serverinfo.o : ui_serverinfo.c; $(DO_CC) +ui_servers2.o : ui_servers2.c; $(DO_CC) +ui_sound.o : ui_sound.c; $(DO_CC) +ui_sparena.o : ui_sparena.c; $(DO_CC) +ui_specifyserver.o : ui_specifyserver.c; $(DO_CC) +ui_splevel.o : ui_splevel.c; $(DO_CC) +ui_sppostgame.o : ui_sppostgame.c; $(DO_CC) +ui_spreset.o : ui_spreset.c; $(DO_CC) +ui_spskill.o : ui_spskill.c; $(DO_CC) +ui_startserver.o : ui_startserver.c; $(DO_CC) +ui_team.o : ui_team.c; $(DO_CC) +ui_teamorders.o : ui_teamorders.c; $(DO_CC) +ui_video.o : ui_video.c; $(DO_CC) + +ui_syscalls.o : ui_syscalls.c; $(DO_CC) + + +build_qvm: $(OBJ) $(QVMOBJ) + $(Q3ASM) -vq3 -o ui.qvm $(OBJ) $(OBJDEP) $(QVMOBJ) ui_syscalls.asm + cp *.qvm ../../baseef/vm/ + +build_so: $(OBJ) $(SOOBJ) + $(CC) -shared -Wl,--export-dynamic,-soname,ui$(ARCH).so -o ui$(ARCH).so $(OBJ) $(OBJDEP) $(SOOBJ) + cp *.so ../../baseef/ + +clean: + rm -f *.o *.qvm *.so Index: ui/ui_syscalls.c =================================================================== --- ui/ui_syscalls.c (revision 1) +++ ui/ui_syscalls.c (revision 10) @@ -5,9 +5,9 @@ // this file is only included when building a dll // syscalls.asm is included instead when building a qvm -static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; +static intptr_t (QDECL *syscall)( intptr_t arg, ... ) = (intptr_t (QDECL *)( intptr_t, ...))-1; -void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { +void dllEntry( intptr_t (QDECL *syscallptr)( intptr_t arg,... ) ) { syscall = syscallptr; } Index: README.txt =================================================================== --- README.txt (revision 0) +++ README.txt (revision 10) @@ -0,0 +1,71 @@ +The Star Trek Voyager: Elite Force codebase project + +This project is meant to be a stable codebase with obvious bugs that +Ravensoft left in there removed and a few new features added. + +This project was originally started because my modification of the Quake3 +engine to run EF turned out to be a bit problematic. The SnapVector macro +yields slightly different results in the virtual machine interpreter of the +newer quake3 compared to the older quake3 eliteforce is based off. +As a result, you cannot jump as high as you could if you set com_maxfps to +some magic values like 74, 85, 125 etc.. +To get the same movement as with the original EliteForce in these new engine +releases the multiplayer VM code must be modified to emulate the old +behaviour. +So my goal is that every active player and every server will install these +modifications to allow for smooth movement on both, servers using the new +engine release and for good motion prediction on the client side. I realize +it may well be that this never happens as getting people to install new pak +files would be a major undertaking. I thought, if I attempt to do so in the +first place, I can as well try to get in a few improvements as long as they +don't change gameplay. I am not trying to insert new weapons, models, +gametypes etc... + +A few todos: + - Ignoring text messages from players that are a nuisance + - Unlagged code (can be switched on/off with a cvar) + +If you have made changes that do *not* change gameplay as mentioned above +and you think it really improves EliteForce, feel free to send the patches +to: arny@ats.s.bawue.de +If your code is reasonably clean, I will definitely add it to the +repository! + +Now for the using of this code: +I have left all non-C files from Ravensoft intact. This means, you should +probably be able to build this release under windows like you build the +original EF source released by raven. +For users on unixoid environments, I have included a few Makefiles that make +the job of building easier. The Makefiles are designed to work under Linux +so if you use another OS you may need to edit the three Makefiles included +in the game, cgame and ui directories to make this build properly. + +There are two different types of builds, namely the shared library and the +building of QVMs. +Building the shared objects only requires typing in "make so" +in the main directory where this README resides. If you have a working gcc +installation, this is all you need to do. The rest is being handled by the +Makefiles and in the end you should have three resulting files in the baseef +directory. +Building QVMs is easy, too. You need a few special bins, though, namely +q3lcc, q3rcc, q3cpp and q3asm. They can be found when building Quake3 from +icculus.org: http://icculus.org/quake3/ +Get the source code, compile it (you may want to only build the dedicated +server if you have no OpenGL support... consult the README in their project +on how this works). When compilation is done, the four required binaries can +be found in code/tools/. Copy the files to the bin/ directory that is in the +same dir with this README. +Now just do: "make qvm" in this dir and all QVMs should be in baseef/vm/. + +Careful when compiling both, QVMs and shared objects. gcc and the q3lcc +compiler produce incompatible output. +Make sure to run "make clean" before you change from QVM to shared objects +and vice versa. + +And last but not least: I already installed a mechanism to produce a pak +file that only works if you have zip installed. +make pak +will result in all three QVMs being packed into pak4.pk3 in baseef :) +Rename it as you see fit. + + - Thilo Schulz, 16.03.2006 Index: Makefile =================================================================== --- Makefile (revision 0) +++ Makefile (revision 10) @@ -0,0 +1,17 @@ +default: qvm +qvm: build_qvm +so: build_so + +ZIP = zip + +build_qvm: + $(MAKE) -C Code-DM build_qvm +build_so: + $(MAKE) -C Code-DM build_so + +clean: + $(MAKE) -C Code-DM clean + rm -f baseef/*.so baseef/*.pk3 baseef/vm/*.qvm + +pak: qvm + cd baseef && rm -f pak4.pk3 && $(ZIP) -r pak4.pk3 vm/*