q2 fixes mostly

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@900 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2005-03-15 22:51:01 +00:00
parent c324d0a3b8
commit d6f910c10b
12 changed files with 226 additions and 136 deletions

View file

@ -721,7 +721,7 @@ void CL_ParseTEnt (void)
pos[0] = MSG_ReadCoord (); pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord ();
P_TeleportSplash (pos); P_RunParticleEffectType(pos, NULL, 1, pt_teleportsplash);
break; break;
case TE_GUNSHOT: // bullet hitting wall case TE_GUNSHOT: // bullet hitting wall
@ -1269,14 +1269,14 @@ void CLQ2_ParseTEnt (void)
{ {
CL_SmokeAndFlash(pos); CL_SmokeAndFlash(pos);
// impact sound // impact sound (nope, not the same as Q1...)
cnt = rand()&15; cnt = rand()&15;
if (cnt == 1) if (cnt == 1)
Q2S_StartSound (pos, 0, 0, cl_sfx_ric1, 1, ATTN_NORM, 0); Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/ric1.wav"), 1, ATTN_NORM, 0);
else if (cnt == 2) else if (cnt == 2)
Q2S_StartSound (pos, 0, 0, cl_sfx_ric2, 1, ATTN_NORM, 0); Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/ric2.wav"), 1, ATTN_NORM, 0);
else if (cnt == 3) else if (cnt == 3)
Q2S_StartSound (pos, 0, 0, cl_sfx_ric3, 1, ATTN_NORM, 0); Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/ric3.wav"), 1, ATTN_NORM, 0);
} }
break; break;
@ -1290,7 +1290,7 @@ void CLQ2_ParseTEnt (void)
else else
P_RunParticleEffect (pos, dir, 0xb0, 40); P_RunParticleEffect (pos, dir, 0xb0, 40);
//FIXME : replace or remove this sound //FIXME : replace or remove this sound
// Q2S_StartSound (pos, 0, 0, q2cl_sfx_lashit, 1, ATTN_NORM, 0); S_StartSound (-2, 0, S_PrecacheSound ("weapons/lashit.wav"), pos, 1, 1);
break; break;
case Q2TE_SHOTGUN: // bullet hitting wall case Q2TE_SHOTGUN: // bullet hitting wall
@ -1315,6 +1315,13 @@ void CLQ2_ParseTEnt (void)
if (r == Q2SPLASH_SPARKS) if (r == Q2SPLASH_SPARKS)
{ {
r = rand() & 3; r = rand() & 3;
if (r == 1)
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark5.wav"), 1, ATTN_NORM, 0);
else if (r == 2)
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark6.wav"), 1, ATTN_NORM, 0);
else
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark7.wav"), 1, ATTN_NORM, 0);
// if (r == 0) // if (r == 0)
// Q2S_StartSound (pos, 0, 0, cl_sfx_spark5, 1, ATTN_STATIC, 0); // Q2S_StartSound (pos, 0, 0, cl_sfx_spark5, 1, ATTN_STATIC, 0);
// else if (r == 1) // else if (r == 1)
@ -1336,14 +1343,17 @@ void CLQ2_ParseTEnt (void)
case Q2TE_BLUEHYPERBLASTER: case Q2TE_BLUEHYPERBLASTER:
MSG_ReadPos (pos); MSG_ReadPos (pos);
MSG_ReadPos (dir); MSG_ReadPos (dir);
P_BlasterParticles (pos, dir); if (P_RunParticleEffectType(pos, dir, 1, pt_blasterparticles))
P_RunParticleEffect (pos, dir, 0xe0, 40);
break; break;
case Q2TE_BLASTER: // blaster hitting wall case Q2TE_BLASTER: // blaster hitting wall
MSG_ReadPos (pos); MSG_ReadPos (pos);
MSG_ReadDir (dir); MSG_ReadDir (dir);
P_BlasterParticles (pos, dir); if (P_RunParticleEffectType(pos, dir, 1, pt_blasterparticles))
P_RunParticleEffect (pos, dir, 0xe0, 40);
R_AddStain(pos, 0, -5, -10, 20); R_AddStain(pos, 0, -5, -10, 20);
ex = CL_AllocExplosion (); ex = CL_AllocExplosion ();
@ -1364,13 +1374,15 @@ void CLQ2_ParseTEnt (void)
else else
ex->angles[1] = 0; ex->angles[1] = 0;
ex->angles[0]*=-1; ex->angles[0]*=-1;
S_StartSound (-2, 0, S_PrecacheSound ("weapons/lashit.wav"), pos, 1, 1);
break; break;
case Q2TE_RAILTRAIL: // railgun effect case Q2TE_RAILTRAIL: // railgun effect
MSG_ReadPos (pos); MSG_ReadPos (pos);
MSG_ReadPos (pos2); MSG_ReadPos (pos2);
CLQ2_RailTrail (pos, pos2); CLQ2_RailTrail (pos, pos2);
// Q2S_StartSound (pos2, 0, 0, cl_sfx_railg, 1, ATTN_NORM, 0); Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("weapons/railgf1a.wav"), 1, ATTN_NORM, 0);
break; break;
case Q2TE_EXPLOSION2: case Q2TE_EXPLOSION2:
@ -1394,7 +1406,10 @@ void CLQ2_ParseTEnt (void)
} }
// sound // sound
S_StartSound (-2, 0, S_PrecacheSound ("weapons/rocklx1a.wav"), pos, 1, 1); if (type == Q2TE_GRENADE_EXPLOSION_WATER)
S_StartSound (-2, 0, S_PrecacheSound ("weapons/xpld_wat.wav"), pos, 1, 1);
else
S_StartSound (-2, 0, S_PrecacheSound ("weapons/grenlx1a.wav"), pos, 1, 1);
// sprite // sprite
/* /*
@ -1459,7 +1474,9 @@ void CLQ2_ParseTEnt (void)
case Q2TE_EXPLOSION1_NP: // PMM case Q2TE_EXPLOSION1_NP: // PMM
MSG_ReadPos (pos); MSG_ReadPos (pos);
P_ParticleExplosion (pos); // particle effect
if (type != Q2TE_EXPLOSION1_BIG && type != Q2TE_EXPLOSION1_NP)
P_ParticleExplosion (pos);
// light // light
{ {
@ -1475,7 +1492,10 @@ void CLQ2_ParseTEnt (void)
} }
// sound // sound
S_StartSound (-2, 0, S_PrecacheSound ("weapons/rocklx1a.wav"), pos, 1, 1); if (type == Q2TE_ROCKET_EXPLOSION_WATER)
S_StartSound (-2, 0, S_PrecacheSound ("weapons/xpld_wat.wav"), pos, 1, 1);
else
S_StartSound (-2, 0, S_PrecacheSound ("weapons/rocklx1a.wav"), pos, 1, 1);
// sprite // sprite
/* if (!R_ParticleExplosionHeart(pos)) /* if (!R_ParticleExplosionHeart(pos))
@ -1783,13 +1803,17 @@ void CLQ2_ParseTEnt (void)
// CL_Tracker_Explode (pos); // CL_Tracker_Explode (pos);
S_StartSound (pos, 0, 0, cl_sfx_disrexp, 1, ATTN_NORM, 0); S_StartSound (pos, 0, 0, cl_sfx_disrexp, 1, ATTN_NORM, 0);
break; break;
*/
case Q2TE_TELEPORT_EFFECT: case Q2TE_TELEPORT_EFFECT:
case Q2TE_DBALL_GOAL: case Q2TE_DBALL_GOAL:
MSG_ReadPos (&net_message, pos); MSG_ReadPos (pos);
CL_TeleportParticles (pos); if (P_RunParticleEffectType(pos, NULL, 1, pt_teleportsplash))
P_RunParticleEffect(pos, NULL, 7, 768);
// This effect won't match ---
// Color should be 7+(rand()%8)
// not 7&~7+(rand()%8)
break; break;
/*
case Q2TE_WIDOWBEAMOUT: case Q2TE_WIDOWBEAMOUT:
CL_ParseWidow (); CL_ParseWidow ();
break; break;

View file

@ -1,4 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#include "particles.h"
#ifdef Q2CLIENT #ifdef Q2CLIENT
extern cvar_t r_drawviewmodel; extern cvar_t r_drawviewmodel;
@ -104,13 +106,6 @@ void CLQ2_FlyEffect(q2centity_t *ent, vec3_t org){};
void CLQ2_DiminishingTrail(vec3_t oldorg, vec3_t neworg, q2centity_t *ent, unsigned int effects){}; void CLQ2_DiminishingTrail(vec3_t oldorg, vec3_t neworg, q2centity_t *ent, unsigned int effects){};
void CLQ2_BlasterTrail(vec3_t oldorg, vec3_t neworg); void CLQ2_BlasterTrail(vec3_t oldorg, vec3_t neworg);
void CLQ2_BlasterTrail2(vec3_t oldorg, vec3_t neworg){}; void CLQ2_BlasterTrail2(vec3_t oldorg, vec3_t neworg){};
void CLQ2_RocketTrail(vec3_t oldorg, vec3_t neworg, q2centity_t *ent)
{
extern int rt_rocket;
P_ParticleTrail(oldorg, neworg, rt_rocket, &ent->trailstate);
};
#define MAX_Q2EDICTS 1024 #define MAX_Q2EDICTS 1024
@ -1324,7 +1319,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
{ {
if (effects & Q2EF_ROCKET) if (effects & Q2EF_ROCKET)
{ {
CLQ2_RocketTrail (cent->lerp_origin, ent.origin, cent); P_ParticleTrail(cent->lerp_origin, ent.origin, rt_rocket, &cent->trailstate);
V_AddLight (ent.origin, 200, 0.2, 0.2, 0); V_AddLight (ent.origin, 200, 0.2, 0.2, 0);
} }
// PGM - Do not reorder EF_BLASTER and EF_HYPERBLASTER. // PGM - Do not reorder EF_BLASTER and EF_HYPERBLASTER.
@ -1340,7 +1335,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
} }
else else
{ {
CLQ2_BlasterTrail (cent->lerp_origin, ent.origin); P_ParticleTrail(cent->lerp_origin, ent.origin, rt_blastertrail, &cent->trailstate);
V_AddLight (ent.origin, 200, 0.2, 0.2, 0); V_AddLight (ent.origin, 200, 0.2, 0.2, 0);
} }
//PGM //PGM
@ -1354,11 +1349,11 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
} }
else if (effects & Q2EF_GIB) else if (effects & Q2EF_GIB)
{ {
CLQ2_DiminishingTrail (cent->lerp_origin, ent.origin, cent, effects); P_ParticleTrail(cent->lerp_origin, ent.origin, rt_gib, &cent->trailstate);
} }
else if (effects & Q2EF_GRENADE) else if (effects & Q2EF_GRENADE)
{ {
CLQ2_DiminishingTrail (cent->lerp_origin, ent.origin, cent, effects); P_ParticleTrail(cent->lerp_origin, ent.origin, rt_grenade, &cent->trailstate);
} }
else if (effects & Q2EF_FLIES) else if (effects & Q2EF_FLIES)
{ {
@ -1455,7 +1450,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
{ {
if (effects & Q2EF_ANIM_ALLFAST) if (effects & Q2EF_ANIM_ALLFAST)
{ {
CLQ2_BlasterTrail (cent->lerp_origin, ent.origin); P_ParticleTrail(cent->lerp_origin, ent.origin, rt_blastertrail, &cent->trailstate);
} }
V_AddLight (ent.origin, 130, 0.2, 0.1, 0.1); V_AddLight (ent.origin, 130, 0.2, 0.1, 0.1);
} }

View file

@ -437,7 +437,7 @@ menupicture_t *MC_AddCenterPicture(menu_t *menu, int y, char *picname)
menupicture_t *MC_AddCursor(menu_t *menu, int x, int y) menupicture_t *MC_AddCursor(menu_t *menu, int x, int y)
{ {
int q1, h2, q2; int mgt;
menupicture_t *n = Z_Malloc(sizeof(menupicture_t)); menupicture_t *n = Z_Malloc(sizeof(menupicture_t));
n->common.type = mt_menudot; n->common.type = mt_menudot;
n->common.iszone = true; n->common.iszone = true;
@ -448,17 +448,15 @@ menupicture_t *MC_AddCursor(menu_t *menu, int x, int y)
menu->options = (menuoption_t *)n; menu->options = (menuoption_t *)n;
q1 = COM_FDepthFile("gfx/menudot1.lmp", true); mgt = M_GameType();
h2 = COM_FDepthFile("gfx/menu/menudot1.lmp", true); if (mgt == MGT_QUAKE2)
q2 = COM_FDepthFile("pics/m_cursor1.pcx", true);
if (q2 < h2 && q2 < q1)
{ //AND QUAKE 2 WINS!!! { //AND QUAKE 2 WINS!!!
menudotstyle = "m_cursor%i"; menudotstyle = "m_cursor%i";
mindot = 0; mindot = 0;
maxdots = 15; maxdots = 15;
dotofs=0; dotofs=0;
} }
else if (h2 < q1) else if (mgt == MGT_HEXEN2)
{ //AND THE WINNER IS HEXEN 2!!! { //AND THE WINNER IS HEXEN 2!!!
menudotstyle = "gfx/menu/menudot%i.lmp"; menudotstyle = "gfx/menu/menudot%i.lmp";
mindot = 1; mindot = 1;
@ -1276,7 +1274,6 @@ qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos.
return false; return false;
} }
void M_Menu_Main_f (void) void M_Menu_Main_f (void)
{ {
extern cvar_t m_helpismedia; extern cvar_t m_helpismedia;
@ -1284,7 +1281,7 @@ void M_Menu_Main_f (void)
menu_t *mainm; menu_t *mainm;
mpic_t *p; mpic_t *p;
int q1, q2, h2; int mgt;
SCR_EndLoadingPlaque(); //just in case... SCR_EndLoadingPlaque(); //just in case...
@ -1319,10 +1316,8 @@ void M_Menu_Main_f (void)
} }
*/ */
q1 = COM_FDepthFile("gfx/mainmenu.lmp", true); mgt = M_GameType();
q2 = COM_FDepthFile("pics/m_main.pcx", true); if (mgt == MGT_QUAKE2) //quake2 main menu.
h2 = COM_FDepthFile("gfx/menu/title0.lmp", true);
if (q2 < q1 && q2 < h2) //quake2 main menu.
{ {
if (Draw_SafeCachePic("pics/m_main_game")) if (Draw_SafeCachePic("pics/m_main_game"))
{ {
@ -1355,7 +1350,7 @@ void M_Menu_Main_f (void)
} }
return; return;
} }
else if (h2 < q1) else if (mgt == MGT_HEXEN2)
{ {
m_state = m_complex; m_state = m_complex;
key_dest = key_menu; key_dest = key_menu;

View file

@ -13,23 +13,45 @@ void M_Menu_MultiPlayer_f (void)
menubutton_t *b; menubutton_t *b;
menu_t *menu; menu_t *menu;
mpic_t *p; mpic_t *p;
int mgt;
p = Draw_SafeCachePic("gfx/mp_menu.lmp"); p = NULL;
key_dest = key_menu; key_dest = key_menu;
m_state = m_complex; m_state = m_complex;
m_entersound = true; m_entersound = true;
mgt = M_GameType();
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
if (p) if (mgt == MGT_QUAKE2)
{ {
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp"); MC_AddCenterPicture(menu, 4, "pics/m_banner_multiplayer");
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
MC_AddPicture(menu, 72, 32, "gfx/mp_menu.lmp"); menu->selecteditem = (menuoption_t*)
MC_AddConsoleCommand (menu, 64, 40, "Join network server", "menu_slist\n");
MC_AddConsoleCommand (menu, 64, 48, "Start network server", "menu_newmulti\n");
MC_AddConsoleCommand (menu, 64, 56, "Player setup", "menu_setup\n");
MC_AddConsoleCommand (menu, 64, 64, "Demos", "menu_demo\n");
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 48, 40, NULL, false);
return;
}
else if (mgt == MGT_HEXEN2)
{
}
else
{
p = Draw_SafeCachePic("gfx/mp_menu.lmp");
if (p)
{
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
MC_AddPicture(menu, 72, 32, "gfx/mp_menu.lmp");
}
} }
b = MC_AddConsoleCommand(menu, 72, 32, "", "menu_slist\n"); b = MC_AddConsoleCommand(menu, 72, 32, "", "menu_slist\n");
menu->selecteditem = (menuoption_t*)b; menu->selecteditem = (menuoption_t*)b;
b->common.height = 20; b->common.height = 20;
b->common.width = p?p->width:320; b->common.width = p?p->width:320;
@ -345,6 +367,7 @@ void M_Menu_GameOptions_f (void)
newmultimenu_t *info; newmultimenu_t *info;
menu_t *menu; menu_t *menu;
int y = 40; int y = 40;
int mgt;
int players; int players;
key_dest = key_menu; key_dest = key_menu;
@ -353,10 +376,22 @@ void M_Menu_GameOptions_f (void)
menu = M_CreateMenu(sizeof(newmultimenu_t)); menu = M_CreateMenu(sizeof(newmultimenu_t));
info = menu->data; info = menu->data;
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
mgt = M_GameType();
if (mgt == MGT_QUAKE2)
{
MC_AddCenterPicture(menu, 4, "pics/m_banner_start_server");
y += 8;
}
else if (mgt == MGT_HEXEN2)
{
}
else
{
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp");
}
// MC_AddPicture(menu, 72, 32, ("gfx/mp_menu.lmp") ); // MC_AddPicture(menu, 72, 32, ("gfx/mp_menu.lmp") );
@ -383,10 +418,11 @@ void M_Menu_GameOptions_f (void)
y+=8; y+=8;
MC_AddSlider (menu, 64-7*8, y, "Extra edict support", &pr_maxedicts, 512, 2047);y+=8; MC_AddSlider (menu, 64-7*8, y, "Extra edict support", &pr_maxedicts, 512, 2047);y+=8;
y+=8; y+=8;
info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "start");y+=16; if (mgt == MGT_QUAKE2)
info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "start");y+=16; info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "base1");
else
info->mapnameedit = MC_AddEdit (menu, 64, y, " map", "start");
y += 16;
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 54, 32, NULL, false); menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 54, 32, NULL, false);

View file

@ -35,7 +35,7 @@ qboolean M_Options_InvertMouse (union menuoption_s *option, chk_set_t set)
//options menu. //options menu.
void M_Menu_Options_f (void) void M_Menu_Options_f (void)
{ {
int q1, q2, h2; int mgt;
extern cvar_t cl_standardchat; extern cvar_t cl_standardchat;
#ifdef _WIN32 #ifdef _WIN32
extern qboolean vid_isfullscreen; extern qboolean vid_isfullscreen;
@ -49,13 +49,13 @@ void M_Menu_Options_f (void)
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
q1 = COM_FDepthFile("gfx/menudot1.lmp", true); mgt = M_GameType();
h2 = COM_FDepthFile("gfx/menu/menudot1.lmp", true); if (mgt == MGT_QUAKE2)
q2 = COM_FDepthFile("pics/m_cursor1.lmp", true);
if (q2 < h2 && q2 < q1)
{ //q2... { //q2...
MC_AddCenterPicture(menu, 4, "pics/m_banner_options");
y += 32;
} }
else if (h2 < q1) else if (mgt == MGT_HEXEN2)
{ //h2 { //h2
MC_AddPicture(menu, 16, 0, "gfx/menu/hplaque.lmp"); MC_AddPicture(menu, 16, 0, "gfx/menu/hplaque.lmp");
MC_AddCenterPicture(menu, 0, "gfx/menu/title3.lmp"); MC_AddCenterPicture(menu, 0, "gfx/menu/title3.lmp");
@ -67,10 +67,6 @@ void M_Menu_Options_f (void)
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp"); MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
} }
menu->selecteditem = (union menuoption_s *) menu->selecteditem = (union menuoption_s *)
MC_AddConsoleCommand(menu, 16, y, " Customize controls", "menu_keys\n"); y+=8; MC_AddConsoleCommand(menu, 16, y, " Customize controls", "menu_keys\n"); y+=8;
MC_AddConsoleCommand(menu, 16, y, " Go to console", "toggleconsole\nplay misc/menu2.wav\n"); y+=8; MC_AddConsoleCommand(menu, 16, y, " Go to console", "toggleconsole\nplay misc/menu2.wav\n"); y+=8;
@ -229,6 +225,7 @@ void M_Menu_Audio_f (void)
{ {
int y = 32; int y = 32;
menu_t *menu; menu_t *menu;
int mgt;
extern cvar_t nosound, precache, snd_leftisright, snd_khz, snd_eax, snd_speakers, ambient_level; extern cvar_t nosound, precache, snd_leftisright, snd_khz, snd_eax, snd_speakers, ambient_level;
static const char *soundqualityoptions[] = { static const char *soundqualityoptions[] = {
@ -267,16 +264,24 @@ void M_Menu_Audio_f (void)
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp"); mgt = M_GameType();
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
if (mgt == MGT_QUAKE2)
{
MC_AddCenterPicture(menu, 4, "pics/m_banner_options");
y += 32;
}
else if (mgt == MGT_HEXEN2)
{
}
else
{
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
}
menu->selecteditem = (union menuoption_s *) menu->selecteditem = (union menuoption_s *)
MC_AddSlider(menu, 16, y, " CD Music Volume", &bgmvolume, 0, 1);y+=8; MC_AddSlider(menu, 16, y, " CD Music Volume", &bgmvolume, 0, 1);y+=8;
MC_AddSlider(menu, 16, y, " Sound Volume", &volume, 0, 1);y+=8; MC_AddSlider(menu, 16, y, " Sound Volume", &volume, 0, 1);y+=8;
MC_AddSlider(menu, 16, y, " Ambient Volume", &ambient_level, 0, 1);y+=8; MC_AddSlider(menu, 16, y, " Ambient Volume", &ambient_level, 0, 1);y+=8;
@ -289,7 +294,6 @@ void M_Menu_Audio_f (void)
MC_AddCvarCombo(menu, 16, y, " Sound speed", &snd_khz, soundqualityoptions, soundqualityvalues);y+=8; MC_AddCvarCombo(menu, 16, y, " Sound speed", &snd_khz, soundqualityoptions, soundqualityvalues);y+=8;
MC_AddConsoleCommand(menu, 16, y, " Restart sound", "snd_restart\n");y+=8; MC_AddConsoleCommand(menu, 16, y, " Restart sound", "snd_restart\n");y+=8;
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 200, 32, NULL, false); menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 200, 32, NULL, false);
} }
@ -306,6 +310,7 @@ void M_Menu_Particles_f (void)
{ {
int y = 32; int y = 32;
menu_t *menu; menu_t *menu;
int mgt;
extern cvar_t r_bouncysparks, r_part_rain, gl_part_torch, gl_part_flame, gl_part_trifansparks; extern cvar_t r_bouncysparks, r_part_rain, gl_part_torch, gl_part_flame, gl_part_trifansparks;
static const char *r_part_rain_options[] = { static const char *r_part_rain_options[] = {
@ -341,9 +346,21 @@ void M_Menu_Particles_f (void)
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp"); mgt = M_GameType();
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
if (mgt == MGT_QUAKE2)
{
MC_AddCenterPicture(menu, 4, "pics/m_banner_options");
y += 32;
}
else if (mgt == MGT_HEXEN2)
{
}
else
{
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
}
menu->selecteditem = (union menuoption_s *) menu->selecteditem = (union menuoption_s *)
@ -369,6 +386,7 @@ void M_Menu_FPS_f (void)
{ {
int y = 32; int y = 32;
menu_t *menu; menu_t *menu;
int mgt;
#ifdef RGLQUAKE #ifdef RGLQUAKE
extern cvar_t gl_compress, gl_waterripples, gl_detail, gl_bump, r_flashblend; extern cvar_t gl_compress, gl_waterripples, gl_detail, gl_bump, r_flashblend;
#endif #endif
@ -383,12 +401,21 @@ void M_Menu_FPS_f (void)
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp"); mgt = M_GameType();
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
if (mgt == MGT_QUAKE2)
{
MC_AddCenterPicture(menu, 4, "pics/m_banner_options");
y += 32;
}
else if (mgt == MGT_HEXEN2)
{
}
else
{
MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp");
MC_AddCenterPicture(menu, 4, "gfx/p_option.lmp");
}
menu->selecteditem = (union menuoption_s *) menu->selecteditem = (union menuoption_s *)

View file

@ -149,7 +149,7 @@ void M_Menu_Load_f (void)
void M_Menu_SinglePlayer_f (void) void M_Menu_SinglePlayer_f (void)
{ {
int q1, q2, h2; int mgt;
menubutton_t *b; menubutton_t *b;
menu_t *menu; menu_t *menu;
mpic_t *p; mpic_t *p;
@ -158,14 +158,12 @@ void M_Menu_SinglePlayer_f (void)
m_state = m_complex; m_state = m_complex;
m_entersound = true; m_entersound = true;
q1 = COM_FDepthFile("gfx/sp_menu.lmp", true); mgt = M_GameType();
h2 = COM_FDepthFile("gfx/menu/title2.lmp", true); if (mgt == MGT_QUAKE2)
q2 = COM_FDepthFile("pics/m_banner_game.pcx", true);
if (q2 < h2 && q2 < q1)
{ //q2... { //q2...
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
MC_AddCenterPicture(menu, 4, "m_banner_game"); MC_AddCenterPicture(menu, 4, "pics/m_banner_game");
menu->selecteditem = (menuoption_t*) menu->selecteditem = (menuoption_t*)
MC_AddConsoleCommand (menu, 64, 40, "Easy", "skill 0;deathmatch 0; coop 0;newgame\n"); MC_AddConsoleCommand (menu, 64, 40, "Easy", "skill 0;deathmatch 0; coop 0;newgame\n");
@ -174,9 +172,11 @@ void M_Menu_SinglePlayer_f (void)
MC_AddConsoleCommand (menu, 64, 72, "Load Game", "menu_load\n"); MC_AddConsoleCommand (menu, 64, 72, "Load Game", "menu_load\n");
MC_AddConsoleCommand (menu, 64, 80, "Save Game", "menu_save\n"); MC_AddConsoleCommand (menu, 64, 80, "Save Game", "menu_save\n");
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 48, 40, NULL, false);
return; return;
} }
else if (h2 < q1) else if (mgt == MGT_HEXEN2)
{ //h2 { //h2
menu = M_CreateMenu(0); menu = M_CreateMenu(0);
MC_AddPicture(menu, 16, 0, "gfx/menu/hplaque.lmp"); MC_AddPicture(menu, 16, 0, "gfx/menu/hplaque.lmp");

View file

@ -1051,5 +1051,26 @@ void M_Keyup (int key)
} }
} }
// Generic function to choose which game menu to draw
int M_GameType (void)
{
int q1, h2, q2;
q1 = COM_FDepthFile("gfx/sp_menu.lmp", true);
h2 = COM_FDepthFile("gfx/menu/title2.lmp", true);
q2 = COM_FDepthFile("pics/m_banner_game.pcx", true);
if (q2 < h2 && q2 < q1)
{ //AND QUAKE 2 WINS!!!
return MGT_QUAKE2;
}
else if (h2 < q1)
{ //AND THE WINNER IS HEXEN 2!!!
return MGT_HEXEN2;
}
//QUAKE 1 WINS BY DEFAULT!
return MGT_QUAKE1;
}

View file

@ -363,3 +363,8 @@ qboolean MP_Toggle(void);
void MP_Draw(void); void MP_Draw(void);
void MP_Keydown(int key); void MP_Keydown(int key);
void MP_Keyup(int key); void MP_Keyup(int key);
#define MGT_QUAKE1 0
#define MGT_HEXEN2 1
#define MGT_QUAKE2 2
int M_GameType(void);

View file

@ -83,6 +83,7 @@ void Master_AddMaster (char *address, int type, char *description)
if (!NET_StringToAdr(address, &adr)) if (!NET_StringToAdr(address, &adr))
{ {
Con_Printf("Failed to resolve address \"%s\"\n", address); Con_Printf("Failed to resolve address \"%s\"\n", address);
return;
} }
/* /*
if (type == MT_SINGLEQW || type == MT_SINGLENQ || type == MT_SINGLEQ2) //single servers are added to the serverlist as well as the masters list if (type == MT_SINGLEQW || type == MT_SINGLENQ || type == MT_SINGLEQ2) //single servers are added to the serverlist as well as the masters list
@ -504,7 +505,7 @@ void MasterInfo_Request(master_t *mast)
break; break;
#ifdef Q2CLIENT #ifdef Q2CLIENT
case MT_MASTERQ2: case MT_MASTERQ2:
if (COM_FDepthFile("pics/colormap.pcx", true)!=0x7fffffff) //only query this master if we expect to be able to load it's maps. if (COM_FDepthFile("pics/colormap.pcx", true)!=0x7fffffff)
NET_SendPollPacket (6, "query", mast->adr); NET_SendPollPacket (6, "query", mast->adr);
break; break;
#endif #endif

View file

@ -66,6 +66,8 @@ int rt_blastertrail,
rt_railtrail, rt_railtrail,
rt_bubbletrail, rt_bubbletrail,
rt_rocket, rt_rocket,
rt_grenade,
rt_gib,
rt_lightning1, rt_lightning1,
rt_lightning2, rt_lightning2,
rt_lightning3; rt_lightning3;
@ -809,13 +811,13 @@ void P_DefaultTrail (model_t *model)
model->particletrail = rt_rocket;//q2 models do this without flags. model->particletrail = rt_rocket;//q2 models do this without flags.
break; break;
case 2: case 2:
model->particletrail = P_AllocateParticleType("t_grenade"); model->particletrail = rt_grenade;
break; break;
case 3: case 3:
model->particletrail = P_AllocateParticleType("t_altrocket"); model->particletrail = P_AllocateParticleType("t_altrocket");
break; break;
case 4: case 4:
model->particletrail = P_AllocateParticleType("t_gib"); model->particletrail = rt_gib;
break; break;
case 5: case 5:
model->particletrail = P_AllocateParticleType("t_zomgib"); model->particletrail = P_AllocateParticleType("t_zomgib");
@ -834,12 +836,12 @@ void P_DefaultTrail (model_t *model)
else if (model->flags & EF_GRENADE) else if (model->flags & EF_GRENADE)
{ {
if (r_grenadetrail.value) if (r_grenadetrail.value)
model->particletrail = P_AllocateParticleType("t_grenade"); model->particletrail = rt_grenade;
else else
model->particletrail = P_AllocateParticleType("t_null"); model->particletrail = P_AllocateParticleType("t_null");
} }
else if (model->flags & EF_GIB) else if (model->flags & EF_GIB)
model->particletrail = P_AllocateParticleType("t_gib"); model->particletrail = rt_gib;
else if (model->flags & EF_TRACER) else if (model->flags & EF_TRACER)
model->particletrail = P_AllocateParticleType("t_tracer"); model->particletrail = P_AllocateParticleType("t_tracer");
else if (model->flags & EF_ZOMGIB) else if (model->flags & EF_ZOMGIB)
@ -1004,28 +1006,32 @@ void P_InitParticles (void)
pt_gunshot = P_AllocateParticleType("te_gunshot"); pt_gunshot = P_AllocateParticleType("te_gunshot");
pt_lavasplash = P_AllocateParticleType("te_lavasplash"); pt_lavasplash = P_AllocateParticleType("te_lavasplash");
pt_teleportsplash = P_AllocateParticleType("te_teleportsplash"); pt_teleportsplash = P_AllocateParticleType("te_teleportsplash");
rt_blastertrail = P_AllocateParticleType("t_blastertrail"); pt_superbullet = P_AllocateParticleType("te_superbullet");
pt_bullet = P_AllocateParticleType("te_bullet");
pt_blasterparticles = P_AllocateParticleType("te_blasterparticles"); pt_blasterparticles = P_AllocateParticleType("te_blasterparticles");
pt_wizspike = P_AllocateParticleType("te_wizspike"); pt_wizspike = P_AllocateParticleType("te_wizspike");
pt_knightspike = P_AllocateParticleType("te_knightspike"); pt_knightspike = P_AllocateParticleType("te_knightspike");
pt_spike = P_AllocateParticleType("te_spike"); pt_spike = P_AllocateParticleType("te_spike");
pt_superspike = P_AllocateParticleType("te_superspike"); pt_superspike = P_AllocateParticleType("te_superspike");
rt_railtrail = P_AllocateParticleType("t_railtrail"); rt_railtrail = P_AllocateParticleType("t_railtrail");
rt_blastertrail = P_AllocateParticleType("t_blastertrail");
rt_bubbletrail = P_AllocateParticleType("t_bubbletrail"); rt_bubbletrail = P_AllocateParticleType("t_bubbletrail");
rt_rocket = P_AllocateParticleType("t_rocket"); rt_rocket = P_AllocateParticleType("t_rocket");
rt_grenade = P_AllocateParticleType("t_grenade");
rt_gib = P_AllocateParticleType("t_gib");
rt_lightning1 = P_AllocateParticleType("t_lightning1"); rt_lightning1 = P_AllocateParticleType("t_lightning1");
rt_lightning2 = P_AllocateParticleType("t_lightning2"); rt_lightning2 = P_AllocateParticleType("t_lightning2");
rt_lightning3 = P_AllocateParticleType("t_lightning3"); rt_lightning3 = P_AllocateParticleType("t_lightning3");
pt_superbullet = P_AllocateParticleType("te_superbullet");
pt_bullet = P_AllocateParticleType("te_bullet");
pe_default = P_AllocateParticleType("pe_default");
pe_size2 = P_AllocateParticleType("pe_size2");
pe_size3 = P_AllocateParticleType("pe_size3");
pt_spark = P_AllocateParticleType("pe_spark"); pt_spark = P_AllocateParticleType("pe_spark");
pt_plasma = P_AllocateParticleType("pe_plasma"); pt_plasma = P_AllocateParticleType("pe_plasma");
pe_default = P_AllocateParticleType("pe_default");
pe_size2 = P_AllocateParticleType("pe_size2");
pe_size3 = P_AllocateParticleType("pe_size3");
} }
@ -1858,43 +1864,25 @@ void P_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count)
{ {
int ptype; int ptype;
#if 0
if (color == 73)
{ //blood
P_RunParticleEffectType(org, dir, count, pt_blood);
return;
}
if (color == 225)
{ //lightning blood //a brighter red...
P_RunParticleEffectType(org, dir, count, pt_lightningblood);
return;
}
if (color == 0)
{ //lightning blood
P_RunParticleEffectType(org, dir, count, pt_gunshot);
return;
}
#endif
ptype = P_FindParticleType(va("pe_%i", color)); ptype = P_FindParticleType(va("pe_%i", color));
if (P_RunParticleEffectType(org, dir, count, ptype)) if (P_RunParticleEffectType(org, dir, count, ptype))
{ {
color &= ~0x7;
if (count > 130 && part_type[pe_size3].loaded) if (count > 130 && part_type[pe_size3].loaded)
{ {
part_type[pe_size3].colorindex = color & ~0x7; part_type[pe_size3].colorindex = color;
part_type[pe_size3].colorrand = 8; part_type[pe_size3].colorrand = 8;
P_RunParticleEffectType(org, dir, count, pe_size3); P_RunParticleEffectType(org, dir, count, pe_size3);
return; return;
} }
if (count > 20 && part_type[pe_size2].loaded) if (count > 20 && part_type[pe_size2].loaded)
{ {
part_type[pe_size2].colorindex = color & ~0x7; part_type[pe_size2].colorindex = color;
part_type[pe_size2].colorrand = 8; part_type[pe_size2].colorrand = 8;
P_RunParticleEffectType(org, dir, count, pe_size2); P_RunParticleEffectType(org, dir, count, pe_size2);
return; return;
} }
part_type[pe_default].colorindex = color & ~0x7; part_type[pe_default].colorindex = color;
part_type[pe_default].colorrand = 8; part_type[pe_default].colorrand = 8;
P_RunParticleEffectType(org, dir, count, pe_default); P_RunParticleEffectType(org, dir, count, pe_default);
return; return;
@ -2041,19 +2029,10 @@ R_TeleportSplash
=============== ===============
*/ */
void P_TeleportSplash (vec3_t org)
{
P_RunParticleEffectType(org, NULL, 1, pt_teleportsplash);
}
void CLQ2_BlasterTrail (vec3_t start, vec3_t end) void CLQ2_BlasterTrail (vec3_t start, vec3_t end)
{ {
P_ParticleTrail(start, end, rt_blastertrail, NULL); P_ParticleTrail(start, end, rt_blastertrail, NULL);
} }
void P_BlasterParticles (vec3_t start, vec3_t dir)
{
P_RunParticleEffectType(start, dir, 1, pt_blasterparticles);
}
void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up) void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up)
{ {

View file

@ -280,7 +280,6 @@ void CLQ2_FlyEffect(struct q2centity_s *ent, vec3_t org);
void CLQ2_DiminishingTrail(vec3_t oldorg, vec3_t neworg, struct q2centity_s *ent, unsigned int effects); void CLQ2_DiminishingTrail(vec3_t oldorg, vec3_t neworg, struct q2centity_s *ent, unsigned int effects);
void CLQ2_BlasterTrail(vec3_t oldorg, vec3_t neworg); void CLQ2_BlasterTrail(vec3_t oldorg, vec3_t neworg);
void CLQ2_BlasterTrail2(vec3_t oldorg, vec3_t neworg); void CLQ2_BlasterTrail2(vec3_t oldorg, vec3_t neworg);
void CLQ2_RocketTrail(vec3_t oldorg, vec3_t neworg, struct q2centity_s *ent);
void WritePCXfile (char *filename, qbyte *data, int width, int height, int rowbytes, qbyte *palette, qboolean upload); //data is 8bit. void WritePCXfile (char *filename, qbyte *data, int width, int height, int rowbytes, qbyte *palette, qboolean upload); //data is 8bit.
qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height); qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height);

View file

@ -23,6 +23,17 @@ extern int pt_explosion,
pt_superbullet, pt_superbullet,
pe_default; pe_default;
extern int rt_blastertrail,
rt_railtrail,
rt_bubbletrail,
rt_rocket,
rt_grenade,
rt_gib,
rt_lightning1,
rt_lightning2,
rt_lightning3;
/*
extern int rt_rocket_trail, extern int rt_rocket_trail,
rt_smoke, rt_smoke,
rt_blood, rt_blood,
@ -44,6 +55,7 @@ extern int rt_rocket_trail,
rt_blastertrail, rt_blastertrail,
rt_railtrail, rt_railtrail,
rt_bubbletrail; rt_bubbletrail;
*/
// !!! if this is changed, it must be changed in d_ifacea.h too !!! // !!! if this is changed, it must be changed in d_ifacea.h too !!!
typedef struct particle_s typedef struct particle_s
@ -98,8 +110,10 @@ int P_AllocateParticleType(char *name);
void P_SkyTri(float *v1, float *v2, float *v3, struct msurface_s *surf); void P_SkyTri(float *v1, float *v2, float *v3, struct msurface_s *surf);
//wierd effects // default particle effect
void P_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count); //aka: the particle builtin. void P_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count); //aka: the particle builtin.
//wierd effects
void P_RunParticleEffect2 (vec3_t org, vec3_t dmin, vec3_t dmax, int color, int effect, int count); //these three are needed for hexen2. void P_RunParticleEffect2 (vec3_t org, vec3_t dmin, vec3_t dmax, int color, int effect, int count); //these three are needed for hexen2.
void P_RunParticleEffect3 (vec3_t org, vec3_t box, int color, int effect, int count); void P_RunParticleEffect3 (vec3_t org, vec3_t box, int color, int effect, int count);
void P_RunParticleEffect4 (vec3_t org, float radius, int color, int effect, int count); void P_RunParticleEffect4 (vec3_t org, float radius, int color, int effect, int count);
@ -108,16 +122,10 @@ void P_DarkFieldParticles (float *org, qbyte colour);
void P_EntityParticles (float *org, qbyte colour, float *radius); //nq's EF_BRIGHTFIELD void P_EntityParticles (float *org, qbyte colour, float *radius); //nq's EF_BRIGHTFIELD
void P_TorchEffect (vec3_t pos, int type); //particles centered around a model, called every frame for those models. void P_TorchEffect (vec3_t pos, int type); //particles centered around a model, called every frame for those models.
//functions that spawn trails (basically just pass throughs)
void P_BlasterParticles (vec3_t org, vec3_t dir);
//functions that spawn point effects (basically just pass throughs) //functions that spawn point effects (basically just pass throughs)
void P_BlobExplosion (vec3_t org); //tarbaby explosion or TF emp. void P_BlobExplosion (vec3_t org); //tarbaby explosion or TF emp.
void P_ParticleExplosion (vec3_t org); //rocket explosion (sprite is allocated seperatly :( ) void P_ParticleExplosion (vec3_t org); //rocket explosion (sprite is allocated seperatly :( )
void P_LavaSplash (vec3_t org); //cthon dying, or a gas grenade. void P_LavaSplash (vec3_t org); //cthon dying, or a gas grenade.
void P_TeleportSplash (vec3_t org); //teleporter effect.
typedef struct { typedef struct {
float lastdist; float lastdist;