Cleaning up Makro's WinCVS # files that only jerks use.

This commit is contained in:
Andrew Prosnik 2009-06-06 18:33:19 +00:00
parent 8459270663
commit 9ccb150073
40 changed files with 0 additions and 121162 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,945 +0,0 @@
//-----------------------------------------------------------------------------
//
// $Id: g_spawn.c,v 1.45 2003/08/10 20:13:26 makro Exp $
//
//-----------------------------------------------------------------------------
//
// $Log: g_spawn.c,v $
// Revision 1.45 2003/08/10 20:13:26 makro
// no message
//
// Revision 1.44 2003/04/26 22:33:06 jbravo
// Wratted all calls to G_FreeEnt() to avoid crashing and provide debugging
//
// Revision 1.43 2003/02/27 19:52:34 makro
// dlights
//
// Revision 1.42 2003/01/06 00:23:29 makro
// no message
//
// Revision 1.41 2003/01/05 22:36:50 makro
// Added "inactive" field for entities
// New "target_activate" entity
//
// Revision 1.40 2002/09/01 21:15:08 makro
// Sky portal tweaks
//
// Revision 1.39 2002/08/30 00:00:16 makro
// Sky portals
//
// Revision 1.38 2002/08/25 00:46:52 niceass
// q3f atmosphere
//
// Revision 1.37 2002/07/19 04:29:18 niceass
// typo fix
//
// Revision 1.36 2002/07/13 22:43:59 makro
// Semi-working fog hull, semi-working sky portals (cgame code commented out)
// Basically, semi-working stuff :P
//
// Revision 1.35 2002/06/29 04:15:15 jbravo
// CTF is now CTB. no weapons while the case is in hand other than pistol or knife
//
// Revision 1.34 2002/06/24 05:51:51 jbravo
// CTF mode is now semi working
//
// Revision 1.33 2002/06/21 21:02:07 niceass
// worldspawn laserfog check
//
// Revision 1.32 2002/06/16 20:06:14 jbravo
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
//
// Revision 1.31 2002/06/16 17:38:00 jbravo
// Removed the MISSIONPACK ifdefs and missionpack only code.
//
// Revision 1.30 2002/06/12 11:14:35 makro
// Fixed knives/pistols not spawning bug
//
// Revision 1.29 2002/06/08 11:41:48 makro
// weapon_grenadelauncher = weapon_pistol
//
// Revision 1.28 2002/05/30 21:18:28 makro
// Bots should reload/bandage when roaming around
// Added "pathtarget" key to all the entities
//
// Revision 1.27 2002/05/25 10:40:31 makro
// Loading screen
//
// Revision 1.26 2002/05/23 15:55:25 makro
// Elevators
//
// Revision 1.25 2002/05/11 12:45:25 makro
// Spectators can go through breakables and doors with
// a targetname or health. Bots should crouch more/jump less
// often when attacking at long range
//
// Revision 1.24 2002/05/05 15:18:02 makro
// Fixed some crash bugs. Bot stuff. Triggerable func_statics.
// Made flags only spawn in CTF mode
//
// Revision 1.23 2002/05/04 06:28:58 makro
// no message
//
// Revision 1.22 2002/05/04 01:03:43 makro
// Bots
//
// Revision 1.21 2002/05/02 23:05:25 makro
// Loading screen. Jump kicks. Bot stuff
//
// Revision 1.20 2002/05/02 12:44:58 makro
// Customizable color for the loading screen text. Bot stuff
//
// Revision 1.19 2002/04/30 12:23:35 jbravo
// Warningfix
//
// Revision 1.18 2002/04/30 11:54:37 makro
// Bots rule ! Also, added clips to give all. Maybe some other things
//
// Revision 1.17 2002/04/23 06:01:39 niceass
// pressure stuff
//
// Revision 1.16 2002/04/20 02:34:57 jbravo
// Changed weapon and ammo classnames at Sze's request
//
// Revision 1.15 2002/04/03 15:51:01 jbravo
// Small warning fixes
//
// Revision 1.14 2002/04/03 03:13:16 blaze
// NEW BREAKABLE CODE - will break all old breakables(wont appear in maps)
//
// Revision 1.13 2002/03/31 03:31:24 jbravo
// Compiler warning cleanups
//
// Revision 1.12 2002/03/23 05:17:43 jbravo
// Major cleanup of game -> cgame communication with LCA vars.
//
// Revision 1.11 2002/03/20 22:58:27 blaze
// changed dlight to light_d
//
// Revision 1.10 2002/03/10 21:42:44 blaze
// allow RQ3_weapon_name to map to weapon_name to make radiant work better
//
// Revision 1.9 2002/01/24 14:20:53 jbravo
// Adding func_explosive and a few new surfaceparms
//
// Revision 1.8 2002/01/11 20:20:58 jbravo
// Adding TP to main branch
//
// Revision 1.7 2002/01/11 19:48:30 jbravo
// Formatted the source in non DOS format.
//
// Revision 1.6 2001/12/31 16:28:42 jbravo
// I made a Booboo with the Log tag.
//
//
//-----------------------------------------------------------------------------
// Copyright (C) 1999-2000 Id Software, Inc.
//
#include "g_local.h"
qboolean G_SpawnString(const char *key, const char *defaultString, char **out)
{
int i;
if (!level.spawning) {
*out = (char *) defaultString;
// G_Error( "G_SpawnString() called while not spawning" );
}
for (i = 0; i < level.numSpawnVars; i++) {
if (!Q_stricmp(key, level.spawnVars[i][0])) {
*out = level.spawnVars[i][1];
return qtrue;
}
}
*out = (char *) defaultString;
return qfalse;
}
qboolean G_SpawnFloat(const char *key, const char *defaultString, float *out)
{
char *s;
qboolean present;
present = G_SpawnString(key, defaultString, &s);
*out = atof(s);
return present;
}
qboolean G_SpawnInt(const char *key, const char *defaultString, int *out)
{
char *s;
qboolean present;
present = G_SpawnString(key, defaultString, &s);
*out = atoi(s);
return present;
}
qboolean G_SpawnVector(const char *key, const char *defaultString, float *out)
{
char *s;
qboolean present;
present = G_SpawnString(key, defaultString, &s);
sscanf(s, "%f %f %f", &out[0], &out[1], &out[2]);
return present;
}
//
// fields are needed for spawning from the entity string
//
typedef enum {
F_INT,
F_FLOAT,
F_LSTRING, // string on disk, pointer in memory, TAG_LEVEL
F_GSTRING, // string on disk, pointer in memory, TAG_GAME
F_VECTOR,
F_ANGLEHACK,
F_ENTITY, // index on disk, pointer in memory
F_ITEM, // index on disk, pointer in memory
F_CLIENT, // index on disk, pointer in memory
F_IGNORE
} fieldtype_t;
typedef struct {
char *name;
int ofs;
fieldtype_t type;
int flags;
} field_t;
field_t fields[] = {
{"classname", FOFS(classname), F_LSTRING},
{"origin", FOFS(s.origin), F_VECTOR},
{"model", FOFS(model), F_LSTRING},
{"model2", FOFS(model2), F_LSTRING},
{"spawnflags", FOFS(spawnflags), F_INT},
{"speed", FOFS(speed), F_FLOAT},
{"target", FOFS(target), F_LSTRING},
{"targetname", FOFS(targetname), F_LSTRING},
{"message", FOFS(message), F_LSTRING},
{"team", FOFS(team), F_LSTRING},
{"wait", FOFS(wait), F_FLOAT},
{"random", FOFS(random), F_FLOAT},
{"count", FOFS(count), F_INT},
{"health", FOFS(health), F_INT},
{"light", 0, F_IGNORE},
{"dmg", FOFS(damage), F_INT},
{"angles", FOFS(s.angles), F_VECTOR},
{"angle", FOFS(s.angles), F_ANGLEHACK},
{"targetShaderName", FOFS(targetShaderName), F_LSTRING},
{"targetShaderNewName", FOFS(targetShaderNewName), F_LSTRING},
{"distance", FOFS(distance), F_FLOAT}, // VALKYRIE: for rotating doors
{"targetinactive", FOFS(targetInactive), F_LSTRING}, // Makro - target to be fired when inactive
{"pathtarget", FOFS(pathtarget), F_LSTRING}, // Makro - for func_trains
{"inactive", FOFS(inactive), F_INT}, // Makro - added
{"activatename", FOFS(activatename), F_LSTRING},
{NULL}
};
typedef struct {
char *name;
void (*spawn) (gentity_t * ent);
} spawn_t;
void SP_info_player_start(gentity_t * ent);
void SP_info_player_deathmatch(gentity_t * ent);
void SP_info_player_intermission(gentity_t * ent);
void SP_info_firstplace(gentity_t * ent);
void SP_info_secondplace(gentity_t * ent);
void SP_info_thirdplace(gentity_t * ent);
void SP_info_podium(gentity_t * ent);
void SP_func_plat(gentity_t * ent);
void SP_func_static(gentity_t * ent);
void SP_func_rotating(gentity_t * ent);
void SP_func_bobbing(gentity_t * ent);
void SP_func_pendulum(gentity_t * ent);
void SP_func_button(gentity_t * ent);
void SP_func_door(gentity_t * ent);
void SP_func_train(gentity_t * ent);
void SP_func_timer(gentity_t * self);
void SP_func_breakable(gentity_t * ent); //Blaze: Breakable glass
void SP_func_pressure(gentity_t * ent); //NiceAss: pressure entity
void SP_trigger_always(gentity_t * ent);
void SP_trigger_multiple(gentity_t * ent);
void SP_trigger_push(gentity_t * ent);
void SP_trigger_teleport(gentity_t * ent);
void SP_trigger_hurt(gentity_t * ent);
void SP_target_remove_powerups(gentity_t * ent);
void SP_target_give(gentity_t * ent);
void SP_target_delay(gentity_t * ent);
void SP_target_speaker(gentity_t * ent);
void SP_target_print(gentity_t * ent);
void SP_target_laser(gentity_t * self);
void SP_target_character(gentity_t * ent);
void SP_target_score(gentity_t * ent);
void SP_target_teleporter(gentity_t * ent);
void SP_target_relay(gentity_t * ent);
void SP_target_kill(gentity_t * ent);
//Makro - added
void SP_target_activate(gentity_t * ent);
void SP_target_position(gentity_t * ent);
void SP_target_location(gentity_t * ent);
void SP_target_push(gentity_t * ent);
void SP_light(gentity_t * self);
void SP_dlight(gentity_t * self); // Elder: dlight entity
void SP_info_null(gentity_t * self);
void SP_info_notnull(gentity_t * self);
void SP_info_camp(gentity_t * self);
void SP_path_corner(gentity_t * self);
void SP_misc_teleporter_dest(gentity_t * self);
void SP_misc_model(gentity_t * ent);
void SP_misc_portal_camera(gentity_t * ent);
void SP_misc_portal_surface(gentity_t * ent);
//Makro - sky portals
void SP_misc_sky_portal(gentity_t * ent);
//Blaze: These functions are nolonger here
//void SP_shooter_rocket( gentity_t *ent );
//void SP_shooter_plasma( gentity_t *ent );
//void SP_shooter_grenade( gentity_t *ent );
void SP_team_CTF_redplayer(gentity_t * ent);
void SP_team_CTF_blueplayer(gentity_t * ent);
void SP_team_CTF_redspawn(gentity_t * ent);
void SP_team_CTF_bluespawn(gentity_t * ent);
void SP_func_door_rotating(gentity_t * ent); // VALKYRIE: for rotating doors
// JBravo: SP_item_botroam doesnt really exsist.
// Makro - still, bots are supposed to use these
void SP_item_botroam(gentity_t * ent);
//Blaze: merged func_explosive into func_breakable
// JBravo: adding explosive
//void SP_func_explosive (gentity_t *self);
spawn_t spawns[] = {
// info entities don't do anything at all, but provide positional
// information for things controlled by other processes
{"info_player_start", SP_info_player_start},
{"info_player_deathmatch", SP_info_player_deathmatch},
{"info_player_intermission", SP_info_player_intermission},
{"info_null", SP_info_null},
{"info_notnull", SP_info_notnull}, // use target_position instead
{"info_camp", SP_info_camp},
{"func_plat", SP_func_plat},
{"func_button", SP_func_button},
{"func_door", SP_func_door},
{"func_static", SP_func_static},
{"func_rotating", SP_func_rotating},
{"func_bobbing", SP_func_bobbing},
{"func_pendulum", SP_func_pendulum},
{"func_train", SP_func_train},
{"func_group", SP_info_null},
{"func_timer", SP_func_timer}, // rename trigger_timer?
{"func_breakable", SP_func_breakable}, // Blaze: Breakable glass
{"func_pressure", SP_func_pressure}, // NiceAss: pressure entity
// Triggers are brush objects that cause an effect when contacted
// by a living player, usually involving firing targets.
// While almost everything could be done with
// a single trigger class and different targets, triggered effects
// could not be client side predicted (push and teleport).
{"trigger_always", SP_trigger_always},
{"trigger_multiple", SP_trigger_multiple},
{"trigger_push", SP_trigger_push},
{"trigger_teleport", SP_trigger_teleport},
{"trigger_hurt", SP_trigger_hurt},
// targets perform no action by themselves, but must be triggered
// by another entity
{"target_give", SP_target_give},
{"target_remove_powerups", SP_target_remove_powerups},
{"target_delay", SP_target_delay},
{"target_speaker", SP_target_speaker},
{"target_print", SP_target_print},
{"target_laser", SP_target_laser},
{"target_score", SP_target_score},
{"target_teleporter", SP_target_teleporter},
{"target_relay", SP_target_relay},
{"target_kill", SP_target_kill},
//Makro - added
{"target_activate", SP_target_activate},
{"target_position", SP_target_position},
{"target_location", SP_target_location},
{"target_push", SP_target_push},
{"light", SP_light},
{"func_dlite", SP_dlight}, // Elder: dlight entity
{"light_d", SP_dlight}, //Makro - for compatibility with older maps
{"path_corner", SP_path_corner},
{"misc_teleporter_dest", SP_misc_teleporter_dest},
{"misc_model", SP_misc_model},
{"misc_portal_surface", SP_misc_portal_surface},
{"misc_portal_camera", SP_misc_portal_camera},
//Makro - sky portal !
{"misc_sky_portal", SP_misc_sky_portal},
//Blaze: This removes rocket traps I think
// {"shooter_rocket", SP_shooter_rocket},
// {"shooter_grenade", SP_shooter_grenade},
// {"shooter_plasma", SP_shooter_plasma},
{"team_CTF_redplayer", SP_team_CTF_redplayer},
{"team_CTF_blueplayer", SP_team_CTF_blueplayer},
{"team_CTF_redspawn", SP_team_CTF_redspawn},
{"team_CTF_bluespawn", SP_team_CTF_bluespawn},
{"func_door_rotating", SP_func_door_rotating}, // VALKYRIE: for rotating doors
//Blaze: Merged func_explosive into func_breakable
// {"func_explosive", SP_func_explosive}, // JBravo: for explosive.
{"item_botroam", SP_item_botroam},
{0, 0}
};
// JBravo: Compiler warning shutup
void SP_item_botroam(gentity_t * ent)
{
return;
}
/*
===============
G_CallSpawn
Finds the spawn function for the entity and calls it,
returning qfalse if not found
===============
*/
qboolean G_CallSpawn(gentity_t * ent)
{
spawn_t *s;
gitem_t *item;
if (!ent->classname) {
G_Printf("G_CallSpawn: NULL classname\n");
return qfalse;
}
//Blaze: allow for Reaction specific spawns to be used
//Elder: map Q3DM weapons -> RQ3 weapons
if (!strcmp(ent->classname, "weapon_gauntlet"))
ent->classname = "weapon_knife";
else if (!strcmp(ent->classname, "weapon_machinegun"))
ent->classname = "weapon_pistol";
else if (!strcmp(ent->classname, "weapon_shotgun"))
ent->classname = "weapon_m3";
else if (!strcmp(ent->classname, "weapon_plasmagun"))
ent->classname = "weapon_mp5";
else if (!strcmp(ent->classname, "weapon_rocketlauncher"))
ent->classname = "weapon_handcannon";
else if (!strcmp(ent->classname, "weapon_railgun"))
ent->classname = "weapon_ssg3000";
else if (!strcmp(ent->classname, "weapon_bfg"))
ent->classname = "weapon_m4";
else if (!strcmp(ent->classname, "ammo_grenades"))
ent->classname = "weapon_grenade";
//Makro - this was missing
else if (!strcmp(ent->classname, "weapon_grenadelauncher"))
ent->classname = "weapon_pistol";
//Elder: map Q3DM ammo -> RQ3 ammo
if (!strcmp(ent->classname, "ammo_bullets"))
ent->classname = "ammo_mk23";
else if (!strcmp(ent->classname, "ammo_slugs"))
ent->classname = "ammo_ssg3000";
else if (!strcmp(ent->classname, "ammo_cells"))
ent->classname = "ammo_mp5";
else if (!strcmp(ent->classname, "ammo_bfg"))
ent->classname = "ammo_m4";
else if (!strcmp(ent->classname, "ammo_rockets"))
ent->classname = "ammo_shells";
//Blaze: let us support RQ3_weapon name so radiant works nicer
if (!strcmp(ent->classname, "RQ3weapon_knife"))
ent->classname = "weapon_knife";
else if (!strcmp(ent->classname, "RQ3weapon_pistol"))
ent->classname = "weapon_pistol";
else if (!strcmp(ent->classname, "RQ3weapon_m3"))
ent->classname = "weapon_m3";
else if (!strcmp(ent->classname, "RQ3weapon_mp5"))
ent->classname = "weapon_mp5";
else if (!strcmp(ent->classname, "RQ3weapon_handcannon"))
ent->classname = "weapon_handcannon";
else if (!strcmp(ent->classname, "RQ3weapon_ssg3000"))
ent->classname = "weapon_ssg3000";
else if (!strcmp(ent->classname, "RQ3weapon_m4"))
ent->classname = "weapon_m4";
else if (!strcmp(ent->classname, "RQ3weapon_grenade"))
ent->classname = "weapon_grenade";
// JBravo: Briefcases
else if (!strcmp(ent->classname, "RQ3case_black"))
ent->classname = "team_CTF_blueflag";
else if (!strcmp(ent->classname, "RQ3case_silver"))
ent->classname = "team_CTF_redflag";
//Elder: map Q3DM ammo -> RQ3 ammo
if (!strcmp(ent->classname, "RQ3ammo_mk23"))
ent->classname = "ammo_mk23";
else if (!strcmp(ent->classname, "RQ3ammo_ssg3000"))
ent->classname = "ammo_ssg3000";
else if (!strcmp(ent->classname, "RQ3ammo_mp5"))
ent->classname = "ammo_mp5";
else if (!strcmp(ent->classname, "RQ3ammo_m4"))
ent->classname = "ammo_m4";
else if (!strcmp(ent->classname, "RQ3ammo_shells"))
ent->classname = "ammo_shells";
/*
//Elder: old stuff
if (!strcmp(ent->classname,"weapon_gauntlet")) ent->classname = "weapon_knife";
else if (!strcmp(ent->classname,"weapon_railgun")) ent->classname = "weapon_ssg3000";
else if (!strcmp(ent->classname,"weapon_shotgun")) ent->classname = "weapon_m3";
else if (!strcmp(ent->classname,"weapon_machinegun")) ent->classname = "weapon_mp5";
else if (!strcmp(ent->classname,"weapon_rocketlauncher")) ent->classname = "weapon_handcannon";
else if (!strcmp(ent->classname,"weapon_bfg")) ent->classname = "weapon_m4";
else if (!strcmp(ent->classname,"weapon_grenadelauncher")) ent->classname = "weapon_pistol";
else if (!strcmp(ent->classname,"ammo_grenades")) ent->classname = "weapon_grenade";
*/
// check item spawn functions
// JBravo: No weapons and items on the maps in teamplay
/*
if (g_gametype.integer != GT_TEAMPLAY) {
for ( item=bg_itemlist+1 ; item->classname ; item++ ) {
if ( !strcmp(item->classname, ent->classname) ) {
G_SpawnItem( ent, item );
return qtrue;
}
}
} */
//Makro - new code
for (item = bg_itemlist + 1; item->classname; item++) {
if (!strcmp(item->classname, ent->classname)) {
//only spawn flags in CTF mode
if (item->giType == IT_TEAM && (item->giTag == PW_REDFLAG || item->giTag == PW_BLUEFLAG)) {
// JBravo: no spawning in CTF
if (g_gametype.integer == GT_CTF) {
G_SpawnItem(ent, item);
return qtrue;
}
} else {
if (g_gametype.integer != GT_CTF)
G_SpawnItem(ent, item);
return qtrue;
}
}
}
// check normal spawn functions
for (s = spawns; s->name; s++) {
if (!strcmp(s->name, ent->classname)) {
// found it
s->spawn(ent);
return qtrue;
}
}
// JBravo: getting rid of warnings when the game starts up.
// JBravo: FIXME! This is just supressing the message, not the problem.
if (g_gametype.integer != GT_TEAMPLAY)
G_Printf("%s doesn't have a spawn function\n", ent->classname);
return qfalse;
}
/*
=============
G_NewString
Builds a copy of the string, translating \n to real linefeeds
so message texts can be multi-line
=============
*/
char *G_NewString(const char *string)
{
char *newb, *new_p;
int i, l;
l = strlen(string) + 1;
newb = G_Alloc(l);
new_p = newb;
// turn \n into a real linefeed
for (i = 0; i < l; i++) {
if (string[i] == '\\' && i < l - 1) {
i++;
if (string[i] == 'n') {
*new_p++ = '\n';
} else {
*new_p++ = '\\';
}
} else {
*new_p++ = string[i];
}
}
return newb;
}
/*
===============
G_ParseField
Takes a key/value pair and sets the binary values
in a gentity
===============
*/
void G_ParseField(const char *key, const char *value, gentity_t * ent)
{
field_t *f;
byte *b;
float v;
vec3_t vec;
for (f = fields; f->name; f++) {
if (!Q_stricmp(f->name, key)) {
// found it
b = (byte *) ent;
switch (f->type) {
case F_LSTRING:
*(char **) (b + f->ofs) = G_NewString(value);
break;
case F_VECTOR:
sscanf(value, "%f %f %f", &vec[0], &vec[1], &vec[2]);
((float *) (b + f->ofs))[0] = vec[0];
((float *) (b + f->ofs))[1] = vec[1];
((float *) (b + f->ofs))[2] = vec[2];
break;
case F_INT:
*(int *) (b + f->ofs) = atoi(value);
break;
case F_FLOAT:
*(float *) (b + f->ofs) = atof(value);
break;
case F_ANGLEHACK:
v = atof(value);
((float *) (b + f->ofs))[0] = 0;
((float *) (b + f->ofs))[1] = v;
((float *) (b + f->ofs))[2] = 0;
break;
default:
case F_IGNORE:
break;
}
return;
}
}
}
/*
===================
G_SpawnGEntityFromSpawnVars
Spawn an entity and fill in all of the level fields from
level.spawnVars[], then call the class specfic spawn function
===================
*/
void G_SpawnGEntityFromSpawnVars(void)
{
int i;
gentity_t *ent;
char *s, *value, *gametypeName;
// JBravo: added teamplay
static char *gametypeNames[] =
{ "ffa", "tournament", "single", "team", "teamplay", "ctf", "oneflag", "obelisk", "harvester",
"teamtournament"
};
// get the next free entity
ent = G_Spawn();
for (i = 0; i < level.numSpawnVars; i++) {
G_ParseField(level.spawnVars[i][0], level.spawnVars[i][1], ent);
}
// check for "notsingle" flag
if (g_gametype.integer == GT_SINGLE_PLAYER) {
G_SpawnInt("notsingle", "0", &i);
if (i) {
G_FreeEntity(ent, __LINE__, __FILE__);
return;
}
}
// check for "notteam" flag (GT_FFA, GT_TOURNAMENT, GT_SINGLE_PLAYER)
if (g_gametype.integer >= GT_TEAM) {
G_SpawnInt("notteam", "0", &i);
if (i) {
G_FreeEntity(ent, __LINE__, __FILE__);
return;
}
} else {
G_SpawnInt("notfree", "0", &i);
if (i) {
G_FreeEntity(ent, __LINE__, __FILE__);
return;
}
}
G_SpawnInt("notq3a", "0", &i);
if (i) {
G_FreeEntity(ent, __LINE__, __FILE__);
return;
}
if (G_SpawnString("gametype", NULL, &value)) {
if (g_gametype.integer >= GT_FFA && g_gametype.integer < GT_MAX_GAME_TYPE) {
gametypeName = gametypeNames[g_gametype.integer];
s = strstr(value, gametypeName);
if (!s) {
G_FreeEntity(ent, __LINE__, __FILE__);
return;
}
}
}
// move editor origin to pos
VectorCopy(ent->s.origin, ent->s.pos.trBase);
VectorCopy(ent->s.origin, ent->r.currentOrigin);
// if we didn't get a classname, don't bother spawning anything
if (!G_CallSpawn(ent)) {
G_FreeEntity(ent, __LINE__, __FILE__);
}
//Makro - is the entity in a sky portal ?
if (G_SpawnInt("skyportalent", "0", &i)) {
if (i) {
ent->s.eFlags |= EF_HEADLESS;
}
}
}
/*
====================
G_AddSpawnVarToken
====================
*/
char *G_AddSpawnVarToken(const char *string)
{
int l;
char *dest;
l = strlen(string);
if (level.numSpawnVarChars + l + 1 > MAX_SPAWN_VARS_CHARS) {
G_Error("G_AddSpawnVarToken: MAX_SPAWN_CHARS");
}
dest = level.spawnVarChars + level.numSpawnVarChars;
memcpy(dest, string, l + 1);
level.numSpawnVarChars += l + 1;
return dest;
}
/*
====================
G_ParseSpawnVars
Parses a brace bounded set of key / value pairs out of the
level's entity strings into level.spawnVars[]
This does not actually spawn an entity.
====================
*/
qboolean G_ParseSpawnVars(void)
{
char keyname[MAX_TOKEN_CHARS];
char com_token[MAX_TOKEN_CHARS];
level.numSpawnVars = 0;
level.numSpawnVarChars = 0;
// parse the opening brace
if (!trap_GetEntityToken(com_token, sizeof(com_token))) {
// end of spawn string
return qfalse;
}
if (com_token[0] != '{') {
G_Error("G_ParseSpawnVars: found %s when expecting {", com_token);
}
// go through all the key / value pairs
while (1) {
// parse key
if (!trap_GetEntityToken(keyname, sizeof(keyname))) {
G_Error("G_ParseSpawnVars: EOF without closing brace");
}
if (keyname[0] == '}') {
break;
}
// parse value
if (!trap_GetEntityToken(com_token, sizeof(com_token))) {
G_Error("G_ParseSpawnVars: EOF without closing brace");
}
if (com_token[0] == '}') {
G_Error("G_ParseSpawnVars: closing brace without data");
}
if (level.numSpawnVars == MAX_SPAWN_VARS) {
G_Error("G_ParseSpawnVars: MAX_SPAWN_VARS");
}
level.spawnVars[level.numSpawnVars][0] = G_AddSpawnVarToken(keyname);
level.spawnVars[level.numSpawnVars][1] = G_AddSpawnVarToken(com_token);
level.numSpawnVars++;
}
return qtrue;
}
/*QUAKED worldspawn (0 0 0) ?
Every map should have exactly one worldspawn.
"music" music wav file
"gravity" 800 is default gravity
"message" Text to print during connection process
*/
void SP_worldspawn(void)
{
char *s;
vec3_t color;
//int nodetail = 0;
int i;
char info[MAX_INFO_STRING];
G_SpawnString("classname", "", &s);
if (Q_stricmp(s, "worldspawn")) {
G_Error("SP_worldspawn: The first entity isn't 'worldspawn'");
}
// make some data visible to connecting client
trap_SetConfigstring(CS_GAME_VERSION, GAME_VERSION);
trap_SetConfigstring(CS_LEVEL_START_TIME, va("%i", level.startTime));
G_SpawnString("music", "", &s);
trap_SetConfigstring(CS_MUSIC, s);
G_SpawnString("message", "", &s);
trap_SetConfigstring(CS_MESSAGE, s); // map specific message
/* Makro - no longer
//Makro - color for the loading screen text
G_SpawnVector( "_text_color", "0.75 0.75 0.75", color );
Info_SetValueForKey(info, "r1", va("%f", color[0]));
Info_SetValueForKey(info, "g1", va("%f", color[1]));
Info_SetValueForKey(info, "b1", va("%f", color[2]));
G_SpawnVector( "_text_color2", "1 1 1", color );
Info_SetValueForKey(info, "r2", va("%f", color[0]));
Info_SetValueForKey(info, "g2", va("%f", color[1]));
Info_SetValueForKey(info, "b2", va("%f", color[2]));
//skip detail ?
G_SpawnInt( "nodetail", "0", &nodetail );
Info_SetValueForKey(info, "nodetail", va("%i", nodetail));
//save settings
trap_SetConfigstring( CS_LOADINGSCREEN, info );
*/
//Makro - fog hull
G_SpawnVector("_rq3_fog_color", "0 0 0", color);
memset(info, 0, sizeof(info));
Info_SetValueForKey(info, "r", va("%f", color[0]));
Info_SetValueForKey(info, "g", va("%f", color[1]));
Info_SetValueForKey(info, "b", va("%f", color[2]));
//G_Printf("^4 FOG HULL: %s\n", vtos(color));
trap_SetConfigstring( CS_FOGHULL, info );
trap_SetConfigstring(CS_MOTD, g_motd.string); // message of the day
G_SpawnString("gravity", "800", &s);
trap_Cvar_Set("g_gravity", s);
G_SpawnString("enableDust", "0", &s);
trap_Cvar_Set("g_enableDust", s);
G_SpawnString("enableBreath", "0", &s);
trap_Cvar_Set("g_enableBreath", s);
//Makro - read func_breakable types
if (G_SpawnInt("numbreakabletypes", "0", &i)) {
int j;
for (j=0; j<i && j<RQ3_MAX_BREAKABLES; j++) {
char *type, *force, *lift;
if (!G_SpawnString(va("b%d_type", j), "", &type))
continue;
G_SpawnString(va("b%d_force", j), "7", &force);
G_SpawnString(va("b%d_lift", j), "5", &lift);
info[0] = 0;
Info_SetValueForKey(info, "type", type);
Info_SetValueForKey(info, "velocity", force);
Info_SetValueForKey(info, "jump", lift);
trap_SetConfigstring(CS_BREAKABLES + j, info);
}
}
// q3f atmospheric stuff:
G_SpawnString( "atmosphere", "", &s );
trap_SetConfigstring( CS_ATMOSEFFECT, s ); // Atmospheric effect
G_SpawnString("enableLaserFog", "1", &s);
trap_Cvar_Set("g_enableLaserFog", s);
g_entities[ENTITYNUM_WORLD].s.number = ENTITYNUM_WORLD;
g_entities[ENTITYNUM_WORLD].classname = "worldspawn";
// see if we want a warmup time
trap_SetConfigstring(CS_WARMUP, "");
if (g_restarted.integer) {
trap_Cvar_Set("g_restarted", "0");
level.warmupTime = 0;
} else if (g_doWarmup.integer) { // Turn it on
level.warmupTime = -1;
trap_SetConfigstring(CS_WARMUP, va("%i", level.warmupTime));
G_LogPrintf("Warmup:\n");
}
}
/*
==============
G_SpawnEntitiesFromString
Parses textual entity definitions out of an entstring and spawns gentities.
==============
*/
void G_SpawnEntitiesFromString(void)
{
// allow calls to G_Spawn*()
level.spawning = qtrue;
level.numSpawnVars = 0;
// the worldspawn is not an actual entity, but it still
// has a "spawn" function to perform any global setup
// needed by a level (setting configstrings or cvars, etc)
if (!G_ParseSpawnVars()) {
G_Error("SpawnEntities: no entities");
}
SP_worldspawn();
// parse ents
while (G_ParseSpawnVars()) {
G_SpawnGEntityFromSpawnVars();
}
level.spawning = qfalse; // any future calls to G_Spawn*() will be errors
}

View File

@ -1,874 +0,0 @@
//-----------------------------------------------------------------------------
//
// $Id: g_utils.c,v 1.21 2003/04/26 22:33:07 jbravo Exp $
//
//-----------------------------------------------------------------------------
//
// $Log: g_utils.c,v $
// Revision 1.21 2003/04/26 22:33:07 jbravo
// Wratted all calls to G_FreeEnt() to avoid crashing and provide debugging
//
// Revision 1.20 2003/03/22 20:29:26 jbravo
// wrapping linkent and unlinkent calls
//
// Revision 1.19 2002/08/24 07:58:15 niceass
// moved sanitizestring to g_util
//
// Revision 1.18 2002/08/21 03:42:04 niceass
// move of some vector functions outside of just game
//
// Revision 1.17 2002/07/19 04:28:39 niceass
// no end line fix
//
// Revision 1.16 2002/07/16 04:06:21 niceass
// temporary hack solution for map rotation and ctb
//
// Revision 1.15 2002/07/11 04:26:46 niceass
// new debug function to save a string to a file
//
// Revision 1.14 2002/07/09 03:31:25 niceass
// oops
//
// Revision 1.13 2002/07/09 03:23:14 niceass
// added a alive function
//
// Revision 1.12 2002/06/16 20:06:14 jbravo
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
//
// Revision 1.11 2002/06/06 18:08:01 makro
// Removed pathtarget code for trigger_pushes for now
//
// Revision 1.10 2002/05/23 15:55:25 makro
// Elevators
//
// Revision 1.9 2002/05/20 16:25:48 makro
// Triggerable cameras
//
// Revision 1.8 2002/01/11 20:20:58 jbravo
// Adding TP to main branch
//
// Revision 1.7 2002/01/11 19:48:30 jbravo
// Formatted the source in non DOS format.
//
// Revision 1.6 2001/12/31 16:28:42 jbravo
// I made a Booboo with the Log tag.
//
//
//-----------------------------------------------------------------------------
// Copyright (C) 1999-2000 Id Software, Inc.
//
// g_utils.c -- misc utility functions for game module
#include "g_local.h"
typedef struct {
char oldShader[MAX_QPATH];
char newShader[MAX_QPATH];
float timeOffset;
} shaderRemap_t;
#define MAX_SHADER_REMAPS 128
int remapCount = 0;
shaderRemap_t remappedShaders[MAX_SHADER_REMAPS];
void AddRemap(const char *oldShader, const char *newShader, float timeOffset)
{
int i;
for (i = 0; i < remapCount; i++) {
if (Q_stricmp(oldShader, remappedShaders[i].oldShader) == 0) {
// found it, just update this one
strcpy(remappedShaders[i].newShader, newShader);
remappedShaders[i].timeOffset = timeOffset;
return;
}
}
if (remapCount < MAX_SHADER_REMAPS) {
strcpy(remappedShaders[remapCount].newShader, newShader);
strcpy(remappedShaders[remapCount].oldShader, oldShader);
remappedShaders[remapCount].timeOffset = timeOffset;
remapCount++;
}
}
const char *BuildShaderStateConfig()
{
static char buff[MAX_STRING_CHARS * 4];
char out[(MAX_QPATH * 2) + 5];
int i;
memset(buff, 0, MAX_STRING_CHARS);
for (i = 0; i < remapCount; i++) {
Com_sprintf(out, (MAX_QPATH * 2) + 5, "%s=%s:%5.2f@", remappedShaders[i].oldShader,
remappedShaders[i].newShader, remappedShaders[i].timeOffset);
Q_strcat(buff, sizeof(buff), out);
}
return buff;
}
/*
=========================================================================
model / sound configstring indexes
=========================================================================
*/
/*
================
G_FindConfigstringIndex
================
*/
int G_FindConfigstringIndex(char *name, int start, int max, qboolean create)
{
int i;
char s[MAX_STRING_CHARS];
if (!name || !name[0]) {
return 0;
}
for (i = 1; i < max; i++) {
trap_GetConfigstring(start + i, s, sizeof(s));
if (!s[0]) {
break;
}
if (!strcmp(s, name)) {
return i;
}
}
if (!create) {
return 0;
}
if (i == max) {
G_Error("G_FindConfigstringIndex: overflow");
}
trap_SetConfigstring(start + i, name);
return i;
}
int G_ModelIndex(char *name)
{
return G_FindConfigstringIndex(name, CS_MODELS, MAX_MODELS, qtrue);
}
int G_SoundIndex(char *name)
{
return G_FindConfigstringIndex(name, CS_SOUNDS, MAX_SOUNDS, qtrue);
}
//=====================================================================
/*
================
G_TeamCommand
Broadcasts a command to only a specific team
================
*/
void G_TeamCommand(team_t team, char *cmd)
{
int i;
for (i = 0; i < level.maxclients; i++) {
if (level.clients[i].pers.connected == CON_CONNECTED) {
if (level.clients[i].sess.sessionTeam == team) {
trap_SendServerCommand(i, va("%s", cmd));
}
}
}
}
/*
=============
G_Find
Searches all active entities for the next one that holds
the matching string at fieldofs (use the FOFS() macro) in the structure.
Searches beginning at the entity after from, or the beginning if NULL
NULL will be returned if the end of the list is reached.
=============
*/
gentity_t *G_Find(gentity_t * from, int fieldofs, const char *match)
{
char *s;
if (!from)
from = g_entities;
else
from++;
for (; from < &g_entities[level.num_entities]; from++) {
if (!from->inuse)
continue;
s = *(char **) ((byte *) from + fieldofs);
if (!s)
continue;
if (!Q_stricmp(s, match))
return from;
}
return NULL;
}
//Makro - returns the first entity that matches both fieldofs
gentity_t *G_Find2(gentity_t * from, int fieldofs, const char *match, int fieldofs2, const char *match2)
{
gentity_t *ent;
for (ent = G_Find(from, fieldofs, match); ent; ent = G_Find(ent, fieldofs, match)) {
char *s = *(char **) ((byte *) ent + fieldofs2);
if (!s)
continue;
if (!Q_stricmp(s, match2))
return ent;
}
return NULL;
}
/*
=============
G_PickTarget
Selects a random entity from among the targets
=============
*/
#define MAXCHOICES 32
gentity_t *G_PickTarget(char *targetname)
{
gentity_t *ent = NULL;
int num_choices = 0;
gentity_t *choice[MAXCHOICES];
if (!targetname) {
G_Printf("G_PickTarget called with NULL targetname\n");
return NULL;
}
while (1) {
ent = G_Find(ent, FOFS(targetname), targetname);
if (!ent)
break;
choice[num_choices++] = ent;
if (num_choices == MAXCHOICES)
break;
}
if (!num_choices) {
G_Printf("G_PickTarget: target %s not found\n", targetname);
return NULL;
}
return choice[rand() % num_choices];
}
/*
==============================
G_UseTargets
"activator" should be set to the entity that initiated the firing.
Search for (string)targetname in all entities that
match (string)self.target and call their .use function
==============================
*/
//Makro - added
void G_UseEntities(gentity_t * ent, char *target, gentity_t * activator)
{
gentity_t *t;
if (!ent || !target) {
return;
}
if (ent->targetShaderName && ent->targetShaderNewName) {
float f = level.time * 0.001;
AddRemap(ent->targetShaderName, ent->targetShaderNewName, f);
trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig());
}
t = NULL;
while ((t = G_Find(t, FOFS(targetname), target)) != NULL) {
if (t == ent) {
G_Printf("WARNING: Entity used itself.\n");
} else {
if (t->use) {
t->use(t, ent, activator);
}
}
if (!ent->inuse) {
G_Printf("entity was removed while using targets\n");
return;
}
}
}
void G_UseTargets(gentity_t * ent, gentity_t * activator)
{
//Makro - moved the code to the function above
G_UseEntities(ent, ent->target, activator);
}
/*
===============
G_SetMovedir
The editor only specifies a single value for angles (yaw),
but we have special constants to generate an up or down direction.
Angles will be cleared, because it is being used to represent a direction
instead of an orientation.
===============
*/
void G_SetMovedir(vec3_t angles, vec3_t movedir)
{
static vec3_t VEC_UP = { 0, -1, 0 };
static vec3_t MOVEDIR_UP = { 0, 0, 1 };
static vec3_t VEC_DOWN = { 0, -2, 0 };
static vec3_t MOVEDIR_DOWN = { 0, 0, -1 };
if (VectorCompare(angles, VEC_UP)) {
VectorCopy(MOVEDIR_UP, movedir);
} else if (VectorCompare(angles, VEC_DOWN)) {
VectorCopy(MOVEDIR_DOWN, movedir);
} else {
AngleVectors(angles, movedir, NULL, NULL);
}
VectorClear(angles);
}
float vectoyaw(const vec3_t vec)
{
float yaw;
if (vec[YAW] == 0 && vec[PITCH] == 0) {
yaw = 0;
} else {
if (vec[PITCH]) {
yaw = (atan2(vec[YAW], vec[PITCH]) * 180 / M_PI);
} else if (vec[YAW] > 0) {
yaw = 90;
} else {
yaw = 270;
}
if (yaw < 0) {
yaw += 360;
}
}
return yaw;
}
void G_InitGentity(gentity_t * e)
{
e->inuse = qtrue;
e->classname = "noclass";
e->s.number = e - g_entities;
e->r.ownerNum = ENTITYNUM_NONE;
}
/*
=================
G_Spawn
Either finds a free entity, or allocates a new one.
The slots from 0 to MAX_CLIENTS-1 are always reserved for clients, and will
never be used by anything else.
Try to avoid reusing an entity that was recently freed, because it
can cause the client to think the entity morphed into something else
instead of being removed and recreated, which can cause interpolated
angles and bad trails.
=================
*/
gentity_t *G_Spawn(void)
{
int i, force;
gentity_t *e;
e = NULL; // shut up warning
i = 0; // shut up warning
for (force = 0; force < 2; force++) {
// if we go through all entities and can't find one to free,
// override the normal minimum times before use
e = &g_entities[MAX_CLIENTS];
for (i = MAX_CLIENTS; i < level.num_entities; i++, e++) {
if (e->inuse) {
continue;
}
// the first couple seconds of server time can involve a lot of
// freeing and allocating, so relax the replacement policy
if (!force && e->freetime > level.startTime + 2000 && level.time - e->freetime < 1000) {
continue;
}
// reuse this slot
G_InitGentity(e);
return e;
}
if (i != MAX_GENTITIES) {
break;
}
}
if (i == ENTITYNUM_MAX_NORMAL) {
for (i = 0; i < MAX_GENTITIES; i++) {
G_Printf("%4i: %s\n", i, g_entities[i].classname);
}
G_Error("G_Spawn: no free entities");
}
// open up a new slot
level.num_entities++;
// let the server system know that there are more entities
trap_LocateGameData(level.gentities, level.num_entities, sizeof(gentity_t),
&level.clients[0].ps, sizeof(level.clients[0]));
G_InitGentity(e);
return e;
}
/*
=================
G_EntitiesFree
=================
*/
qboolean G_EntitiesFree(void)
{
int i;
gentity_t *e;
e = &g_entities[MAX_CLIENTS];
for (i = MAX_CLIENTS; i < level.num_entities; i++, e++) {
if (e->inuse) {
continue;
}
// slot available
return qtrue;
}
return qfalse;
}
/*
=================
G_FreeEntity
Marks the entity as free
=================
*/
void G_FreeEntity(gentity_t * ed, int line, char *file)
{
if (ed == NULL || ed-g_entities < 0 || ed-g_entities > level.num_entities || ed->s.number <0 || ed->s.number > level.num_entities) {
trap_SendServerCommand(-1, va("print \"^1G_FreeEntity got called with a bad ent from line %d of file %s. PLEASE report this to the RQ3 team\"", line, file));
G_LogPrintf("G_FreeEntity got called with a bad ent from line %d of file %s. PLEASE report this to the RQ3 team", line, file);
return;
}
trap_RQ3UnlinkEntity(ed, __LINE__, __FILE__); // unlink from world
if (ed->neverFree) {
return;
}
memset(ed, 0, sizeof(*ed));
ed->classname = "freed";
ed->freetime = level.time;
ed->inuse = qfalse;
}
void G_RealFreeEntity(gentity_t * ed)
{
if (ed == NULL || ed-g_entities < 0 || ed-g_entities > level.num_entities || ed->s.number <0 || ed->s.number > level.num_entities) {
trap_SendServerCommand(-1, va("print \"^1G_FreeEntity got called with a bad ent with no tracing. PLEASE report this to the RQ3 team\""));
G_LogPrintf("G_FreeEntity got called with a bad ent with no tracing. PLEASE report this to the RQ3 team");
return;
}
trap_RQ3UnlinkEntity(ed, __LINE__, __FILE__); // unlink from world
if (ed->neverFree) {
return;
}
memset(ed, 0, sizeof(*ed));
ed->classname = "freed";
ed->freetime = level.time;
ed->inuse = qfalse;
}
/*
=================
G_TempEntity
Spawns an event entity that will be auto-removed
The origin will be snapped to save net bandwidth, so care
must be taken if the origin is right on a surface (snap towards start vector first)
=================
*/
gentity_t *G_TempEntity(vec3_t origin, int event)
{
gentity_t *e;
vec3_t snapped;
e = G_Spawn();
e->s.eType = ET_EVENTS + event;
e->classname = "tempEntity";
e->eventTime = level.time;
e->freeAfterEvent = qtrue;
VectorCopy(origin, snapped);
SnapVector(snapped); // save network bandwidth
G_SetOrigin(e, snapped);
// find cluster for PVS
trap_RQ3LinkEntity(e, __LINE__, __FILE__);
return e;
}
/*
=================
G_TempEntity2
Elder: Like above, except can sneak in event parameters
=================
*/
gentity_t *G_TempEntity2(vec3_t origin, int event, int eParm)
{
gentity_t *e;
vec3_t snapped;
e = G_Spawn();
e->s.eType = ET_EVENTS + event;
e->s.eventParm = eParm;
e->classname = "tempEntity";
e->eventTime = level.time;
e->freeAfterEvent = qtrue;
VectorCopy(origin, snapped);
SnapVector(snapped); // save network bandwidth
G_SetOrigin(e, snapped);
// find cluster for PVS
trap_RQ3LinkEntity(e, __LINE__, __FILE__);
return e;
}
/*
==============================================================================
Kill box
==============================================================================
*/
/*
=================
G_KillBox
Kills all entities that would touch the proposed new positioning
of ent. Ent should be unlinked before calling this!
=================
*/
void G_KillBox(gentity_t * ent)
{
int i, num;
int touch[MAX_GENTITIES];
gentity_t *hit;
vec3_t mins, maxs;
// JBravo attempting to stop telefrags
if (g_gametype.integer == GT_TEAMPLAY) { // && level.lights_camera_action) {
return;
}
VectorAdd(ent->client->ps.origin, ent->r.mins, mins);
VectorAdd(ent->client->ps.origin, ent->r.maxs, maxs);
num = trap_EntitiesInBox(mins, maxs, touch, MAX_GENTITIES);
for (i = 0; i < num; i++) {
hit = &g_entities[touch[i]];
if (!hit->client) {
continue;
}
// nail it
G_Damage(hit, ent, ent, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
}
}
//==============================================================================
/*
===============
G_AddPredictableEvent
Use for non-pmove events that would also be predicted on the
client side: jumppads and item pickups
Adds an event+parm and twiddles the event counter
===============
*/
void G_AddPredictableEvent(gentity_t * ent, int event, int eventParm)
{
if (!ent->client) {
return;
}
BG_AddPredictableEventToPlayerstate(event, eventParm, &ent->client->ps);
}
/*
===============
G_AddEvent
Adds an event+parm and twiddles the event counter
===============
*/
void G_AddEvent(gentity_t * ent, int event, int eventParm)
{
int bits;
if (!event) {
G_Printf("G_AddEvent: zero event added for entity %i\n", ent->s.number);
return;
}
// clients need to add the event in playerState_t instead of entityState_t
if (ent->client) {
bits = ent->client->ps.externalEvent & EV_EVENT_BITS;
bits = (bits + EV_EVENT_BIT1) & EV_EVENT_BITS;
ent->client->ps.externalEvent = event | bits;
ent->client->ps.externalEventParm = eventParm;
ent->client->ps.externalEventTime = level.time;
} else {
bits = ent->s.event & EV_EVENT_BITS;
bits = (bits + EV_EVENT_BIT1) & EV_EVENT_BITS;
ent->s.event = event | bits;
ent->s.eventParm = eventParm;
}
ent->eventTime = level.time;
}
/*
=============
G_Sound
=============
*/
void G_Sound(gentity_t * ent, int channel, int soundIndex)
{
gentity_t *te;
te = G_TempEntity(ent->r.currentOrigin, EV_GENERAL_SOUND);
te->s.eventParm = soundIndex;
}
//==============================================================================
/*
================
G_SetOrigin
Sets the pos trajectory for a fixed position
================
*/
void G_SetOrigin(gentity_t * ent, vec3_t origin)
{
VectorCopy(origin, ent->s.pos.trBase);
ent->s.pos.trType = TR_STATIONARY;
ent->s.pos.trTime = 0;
ent->s.pos.trDuration = 0;
VectorClear(ent->s.pos.trDelta);
VectorCopy(origin, ent->r.currentOrigin);
}
/*
================
DebugLine
debug polygons only work when running a local game
with r_debugSurface set to 2
================
*/
int DebugLine(vec3_t start, vec3_t end, int color)
{
vec3_t points[4], dir, cross, up = { 0, 0, 1 };
float dot;
VectorCopy(start, points[0]);
VectorCopy(start, points[1]);
//points[1][2] -= 2;
VectorCopy(end, points[2]);
//points[2][2] -= 2;
VectorCopy(end, points[3]);
VectorSubtract(end, start, dir);
VectorNormalize(dir);
dot = DotProduct(dir, up);
if (dot > 0.99 || dot < -0.99)
VectorSet(cross, 1, 0, 0);
else
CrossProduct(dir, up, cross);
VectorNormalize(cross);
VectorMA(points[0], 2, cross, points[0]);
VectorMA(points[1], -2, cross, points[1]);
VectorMA(points[2], -2, cross, points[2]);
VectorMA(points[3], 2, cross, points[3]);
return trap_DebugPolygonCreate(color, 4, points);
}
// Blaze: Find radius
//
gentity_t *findradius(gentity_t * from, vec3_t org, float rad)
{
vec3_t eorg;
int j;
if (!from)
from = g_entities;
else
from++;
for (; from < &g_entities[level.num_entities]; from++) {
if (!from->inuse)
continue;
for (j = 0; j < 3; j++)
eorg[j] = org[j] - (from->r.currentOrigin[j] + (from->r.mins[j] + from->r.maxs[j]) * 0.5);
if (VectorLength(eorg) > rad)
continue;
return from;
}
return NULL;
}
/*
================
Added by Elder
RQ3_SaveZoomLevel
Quick function to save the last zoom setting
================
*/
void RQ3_SaveZoomLevel(gentity_t * ent)
{
if (ent->client) {
if ((ent->client->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW)
ent->client->lastzoom |= RQ3_ZOOM_LOW;
if ((ent->client->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED)
ent->client->lastzoom |= RQ3_ZOOM_MED;
}
}
/*
================
Added by Elder
RQ3_isZoomed
Quick function to determine if player is zoomed in
================
*/
int RQ3_isZoomed(gentity_t * ent)
{
if (!ent->client) {
G_Error("RQ3_isZoomed: passed non-client entity");
return -1;
} else {
return ((ent->client->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW ||
(ent->client->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED);
}
}
/*
G_PlayerAlive by NiceAss
Created to fix complications when inbetween death and being a spectator in TP
*/
int G_PlayerAlive(gentity_t *ent)
{
if (g_gametype.integer < GT_TEAM)
{
if ( ent->health > 0 )
return qtrue;
else
return qfalse;
}
else
{
if ( ent->health > 0 && ( ent->client->sess.sessionTeam == TEAM_RED || ent->client->sess.sessionTeam == TEAM_BLUE ) )
return qtrue;
else
return qfalse;
}
}
/*
Want to save data right before RQ3 crashes? Ues this =D
*/
void G_DebugSaveData(char *Data) {
fileHandle_t f;
if (trap_FS_FOpenFile("debugout.txt", &f, FS_WRITE) >= 0) {
trap_FS_Write(Data, strlen(Data), f);
trap_FS_FCloseFile(f);
}
}
qboolean G_FileSearch(char *Filename, char *Text) {
fileHandle_t file;
char *buf;
int len;
len = trap_FS_FOpenFile(Filename, &file, FS_READ);
if (!file)
return qfalse;
buf = G_Alloc(len);
trap_FS_Read(buf, len, file);
trap_FS_FCloseFile(file);
return ( strstr(buf, Text) != NULL );
}
/*
==================
SanitizeString
Remove case and control characters
==================
*/
void SanitizeString(char *in, char *out)
{
while (*in) {
if (*in == 27) {
in += 2; // skip color code
continue;
}
if (*in < 32) {
in++;
continue;
}
*out++ = tolower(*in++);
}
*out = 0;
}

View File

@ -1,148 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP465.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
"C:\Games\Quake3\rq3source\reaction\game\ai_chat.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_cmd.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_dmnet.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_dmq3.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_main.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_team.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_vcmd.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_misc.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_pmove.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_slidemove.c"
"C:\Games\Quake3\rq3source\reaction\game\g_active.c"
"C:\Games\Quake3\rq3source\reaction\game\g_arenas.c"
"C:\Games\Quake3\rq3source\reaction\game\g_bot.c"
"C:\Games\Quake3\rq3source\reaction\game\g_client.c"
"C:\Games\Quake3\rq3source\reaction\game\g_cmds.c"
"C:\Games\Quake3\rq3source\reaction\game\g_combat.c"
"C:\Games\Quake3\rq3source\reaction\game\g_fileio.c"
"C:\Games\Quake3\rq3source\reaction\game\g_items.c"
"C:\Games\Quake3\rq3source\reaction\game\g_main.c"
"C:\Games\Quake3\rq3source\reaction\game\g_matchmode.c"
"C:\Games\Quake3\rq3source\reaction\game\g_mem.c"
"C:\Games\Quake3\rq3source\reaction\game\g_misc.c"
"C:\Games\Quake3\rq3source\reaction\game\g_missile.c"
"C:\Games\Quake3\rq3source\reaction\game\g_mover.c"
"C:\Games\Quake3\rq3source\reaction\game\g_session.c"
"C:\Games\Quake3\rq3source\reaction\game\g_spawn.c"
"C:\Games\Quake3\rq3source\reaction\game\g_svcmds.c"
"C:\Games\Quake3\rq3source\reaction\game\g_syscalls.c"
"C:\Games\Quake3\rq3source\reaction\game\g_target.c"
"C:\Games\Quake3\rq3source\reaction\game\g_team.c"
"C:\Games\Quake3\rq3source\reaction\game\g_teamplay.c"
"C:\Games\Quake3\rq3source\reaction\game\g_trigger.c"
"C:\Games\Quake3\rq3source\reaction\game\g_utils.c"
"C:\Games\Quake3\rq3source\reaction\game\g_weapon.c"
"C:\Games\Quake3\rq3source\reaction\game\q_math.c"
"C:\Games\Quake3\rq3source\reaction\game\q_shared.c"
"C:\Games\Quake3\rq3source\reaction\game\rxn_game.c"
"C:\Games\Quake3\rq3source\reaction\game\zcam.c"
"C:\Games\Quake3\rq3source\reaction\game\zcam_target.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP465.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP466.tmp" with contents
[
kernel32.lib user32.lib winmm.lib /nologo /base:"0x20000000" /subsystem:windows /dll /incremental:no /pdb:"c:\reactionoutput/qagamex86.pdb" /map:"c:\reactionoutput/qagamex86.map" /machine:I386 /def:".\game.def" /out:"..\Release/qagamex86.dll" /implib:"c:\reactionoutput/qagamex86.lib"
\reactionoutput\ai_chat.obj
\reactionoutput\ai_cmd.obj
\reactionoutput\ai_dmnet.obj
\reactionoutput\ai_dmq3.obj
\reactionoutput\ai_main.obj
\reactionoutput\ai_team.obj
\reactionoutput\ai_vcmd.obj
\reactionoutput\bg_misc.obj
\reactionoutput\bg_pmove.obj
\reactionoutput\bg_slidemove.obj
\reactionoutput\g_active.obj
\reactionoutput\g_arenas.obj
\reactionoutput\g_bot.obj
\reactionoutput\g_client.obj
\reactionoutput\g_cmds.obj
\reactionoutput\g_combat.obj
\reactionoutput\g_fileio.obj
\reactionoutput\g_items.obj
\reactionoutput\g_main.obj
\reactionoutput\g_matchmode.obj
\reactionoutput\g_mem.obj
\reactionoutput\g_misc.obj
\reactionoutput\g_missile.obj
\reactionoutput\g_mover.obj
\reactionoutput\g_session.obj
\reactionoutput\g_spawn.obj
\reactionoutput\g_svcmds.obj
\reactionoutput\g_syscalls.obj
\reactionoutput\g_target.obj
\reactionoutput\g_team.obj
\reactionoutput\g_teamplay.obj
\reactionoutput\g_trigger.obj
\reactionoutput\g_utils.obj
\reactionoutput\g_weapon.obj
\reactionoutput\q_math.obj
\reactionoutput\q_shared.obj
\reactionoutput\rxn_game.obj
\reactionoutput\zcam.obj
\reactionoutput\zcam_target.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP466.tmp"
<h3>Output Window</h3>
Compiling...
ai_chat.c
ai_cmd.c
ai_dmnet.c
ai_dmq3.c
ai_main.c
ai_team.c
ai_vcmd.c
bg_misc.c
bg_pmove.c
bg_slidemove.c
g_active.c
g_arenas.c
g_bot.c
g_client.c
g_cmds.c
g_combat.c
g_fileio.c
g_items.c
g_main.c
g_matchmode.c
g_mem.c
g_misc.c
g_missile.c
g_mover.c
g_session.c
g_spawn.c
g_svcmds.c
g_syscalls.c
g_target.c
g_team.c
g_teamplay.c
g_trigger.c
g_utils.c
g_weapon.c
q_math.c
C:\Games\Quake3\rq3source\reaction\game\g_weapon.c(2210) : warning C4701: local variable 'tr' may be used without having been initialized
q_shared.c
rxn_game.c
zcam.c
zcam_target.c
Linking...
Creating library c:\reactionoutput/qagamex86.lib and object c:\reactionoutput/qagamex86.exp
<h3>Results</h3>
qagamex86.dll - 0 error(s), 1 warning(s)
</pre>
</body>
</html>

View File

@ -1,204 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
<<<<<<< game.plg
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP465.tmp" with contents
=======
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPC.tmp" with contents
>>>>>>> 1.60
[
<<<<<<< game.plg
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
"C:\Games\Quake3\rq3source\reaction\game\ai_chat.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_cmd.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_dmnet.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_dmq3.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_main.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_team.c"
"C:\Games\Quake3\rq3source\reaction\game\ai_vcmd.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_misc.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_pmove.c"
"C:\Games\Quake3\rq3source\reaction\game\bg_slidemove.c"
"C:\Games\Quake3\rq3source\reaction\game\g_active.c"
"C:\Games\Quake3\rq3source\reaction\game\g_arenas.c"
"C:\Games\Quake3\rq3source\reaction\game\g_bot.c"
"C:\Games\Quake3\rq3source\reaction\game\g_client.c"
"C:\Games\Quake3\rq3source\reaction\game\g_cmds.c"
"C:\Games\Quake3\rq3source\reaction\game\g_combat.c"
"C:\Games\Quake3\rq3source\reaction\game\g_fileio.c"
"C:\Games\Quake3\rq3source\reaction\game\g_items.c"
"C:\Games\Quake3\rq3source\reaction\game\g_main.c"
"C:\Games\Quake3\rq3source\reaction\game\g_matchmode.c"
"C:\Games\Quake3\rq3source\reaction\game\g_mem.c"
"C:\Games\Quake3\rq3source\reaction\game\g_misc.c"
"C:\Games\Quake3\rq3source\reaction\game\g_missile.c"
"C:\Games\Quake3\rq3source\reaction\game\g_mover.c"
"C:\Games\Quake3\rq3source\reaction\game\g_session.c"
"C:\Games\Quake3\rq3source\reaction\game\g_spawn.c"
"C:\Games\Quake3\rq3source\reaction\game\g_svcmds.c"
"C:\Games\Quake3\rq3source\reaction\game\g_syscalls.c"
"C:\Games\Quake3\rq3source\reaction\game\g_target.c"
"C:\Games\Quake3\rq3source\reaction\game\g_team.c"
"C:\Games\Quake3\rq3source\reaction\game\g_teamplay.c"
"C:\Games\Quake3\rq3source\reaction\game\g_trigger.c"
"C:\Games\Quake3\rq3source\reaction\game\g_utils.c"
"C:\Games\Quake3\rq3source\reaction\game\g_weapon.c"
"C:\Games\Quake3\rq3source\reaction\game\q_math.c"
"C:\Games\Quake3\rq3source\reaction\game\q_shared.c"
"C:\Games\Quake3\rq3source\reaction\game\rxn_game.c"
"C:\Games\Quake3\rq3source\reaction\game\zcam.c"
"C:\Games\Quake3\rq3source\reaction\game\zcam_target.c"
=======
/nologo /G5 /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "BUILDING_REF_GL" /D "DEBUG" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
"C:\Development\reaction\game\ai_chat.c"
"C:\Development\reaction\game\ai_cmd.c"
"C:\Development\reaction\game\ai_dmnet.c"
"C:\Development\reaction\game\ai_dmq3.c"
"C:\Development\reaction\game\ai_main.c"
"C:\Development\reaction\game\ai_team.c"
"C:\Development\reaction\game\ai_vcmd.c"
"C:\Development\reaction\game\bg_misc.c"
"C:\Development\reaction\game\bg_pmove.c"
"C:\Development\reaction\game\bg_slidemove.c"
"C:\Development\reaction\game\g_active.c"
"C:\Development\reaction\game\g_arenas.c"
"C:\Development\reaction\game\g_bot.c"
"C:\Development\reaction\game\g_client.c"
"C:\Development\reaction\game\g_cmds.c"
"C:\Development\reaction\game\g_combat.c"
"C:\Development\reaction\game\g_fileio.c"
"C:\Development\reaction\game\g_items.c"
"C:\Development\reaction\game\g_main.c"
"C:\Development\reaction\game\g_matchmode.c"
"C:\Development\reaction\game\g_mem.c"
"C:\Development\reaction\game\g_misc.c"
"C:\Development\reaction\game\g_missile.c"
"C:\Development\reaction\game\g_mover.c"
"C:\Development\reaction\game\g_session.c"
"C:\Development\reaction\game\g_spawn.c"
"C:\Development\reaction\game\g_svcmds.c"
"C:\Development\reaction\game\g_syscalls.c"
"C:\Development\reaction\game\g_target.c"
"C:\Development\reaction\game\g_team.c"
"C:\Development\reaction\game\g_teamplay.c"
"C:\Development\reaction\game\g_trigger.c"
"C:\Development\reaction\game\g_utils.c"
"C:\Development\reaction\game\g_weapon.c"
"C:\Development\reaction\game\q_math.c"
"C:\Development\reaction\game\q_shared.c"
"C:\Development\reaction\game\rxn_game.c"
"C:\Development\reaction\game\zcam.c"
"C:\Development\reaction\game\zcam_target.c"
>>>>>>> 1.60
]
<<<<<<< game.plg
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP465.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP466.tmp" with contents
=======
Creating command line "cl.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPC.tmp"
Creating temporary file "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPD.tmp" with contents
>>>>>>> 1.60
[
kernel32.lib user32.lib winmm.lib /nologo /base:"0x20000000" /subsystem:windows /dll /incremental:no /pdb:"c:\reactionoutput/qagamex86.pdb" /map:"c:\reactionoutput/qagamex86.map" /machine:I386 /def:".\game.def" /out:"..\Release/qagamex86.dll" /implib:"c:\reactionoutput/qagamex86.lib"
\reactionoutput\ai_chat.obj
\reactionoutput\ai_cmd.obj
\reactionoutput\ai_dmnet.obj
\reactionoutput\ai_dmq3.obj
\reactionoutput\ai_main.obj
\reactionoutput\ai_team.obj
\reactionoutput\ai_vcmd.obj
\reactionoutput\bg_misc.obj
\reactionoutput\bg_pmove.obj
\reactionoutput\bg_slidemove.obj
\reactionoutput\g_active.obj
\reactionoutput\g_arenas.obj
\reactionoutput\g_bot.obj
\reactionoutput\g_client.obj
\reactionoutput\g_cmds.obj
\reactionoutput\g_combat.obj
\reactionoutput\g_fileio.obj
\reactionoutput\g_items.obj
\reactionoutput\g_main.obj
\reactionoutput\g_matchmode.obj
\reactionoutput\g_mem.obj
\reactionoutput\g_misc.obj
\reactionoutput\g_missile.obj
\reactionoutput\g_mover.obj
\reactionoutput\g_session.obj
\reactionoutput\g_spawn.obj
\reactionoutput\g_svcmds.obj
\reactionoutput\g_syscalls.obj
\reactionoutput\g_target.obj
\reactionoutput\g_team.obj
\reactionoutput\g_teamplay.obj
\reactionoutput\g_trigger.obj
\reactionoutput\g_utils.obj
\reactionoutput\g_weapon.obj
\reactionoutput\q_math.obj
\reactionoutput\q_shared.obj
\reactionoutput\rxn_game.obj
\reactionoutput\zcam.obj
\reactionoutput\zcam_target.obj
]
<<<<<<< game.plg
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP466.tmp"
=======
Creating command line "link.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\RSPD.tmp"
>>>>>>> 1.60
<h3>Output Window</h3>
Compiling...
ai_chat.c
ai_cmd.c
ai_dmnet.c
ai_dmq3.c
ai_main.c
ai_team.c
ai_vcmd.c
bg_misc.c
bg_pmove.c
bg_slidemove.c
g_active.c
g_arenas.c
g_bot.c
g_client.c
g_cmds.c
g_combat.c
g_fileio.c
g_items.c
g_main.c
g_matchmode.c
g_mem.c
g_misc.c
g_missile.c
g_mover.c
g_session.c
g_spawn.c
g_svcmds.c
g_syscalls.c
g_target.c
g_team.c
g_teamplay.c
g_trigger.c
g_utils.c
g_weapon.c
q_math.c
C:\Games\Quake3\rq3source\reaction\game\g_weapon.c(2210) : warning C4701: local variable 'tr' may be used without having been initialized
q_shared.c
rxn_game.c
zcam.c
zcam_target.c
Linking...
Creating library c:\reactionoutput/qagamex86.lib and object c:\reactionoutput/qagamex86.exp
<h3>Results</h3>
qagamex86.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,75 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: cgame - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP410.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fp"Release/cgame.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
"C:\Games\Quake3\rq3source\reaction\cgame\cg_ents.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP410.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP411.tmp" with contents
[
/nologo /base:"0x30000000" /subsystem:windows /dll /incremental:no /pdb:"Release/cgamex86.pdb" /map:"Release/cgamex86.map" /machine:I386 /def:".\cgame.def" /out:"../Release/cgamex86.dll" /implib:"Release/cgamex86.lib"
.\Release\bg_misc.obj
.\Release\bg_pmove.obj
.\Release\bg_slidemove.obj
.\Release\cg_consolecmds.obj
.\Release\cg_draw.obj
.\Release\cg_drawtools.obj
.\Release\cg_effects.obj
.\Release\cg_ents.obj
.\Release\cg_event.obj
.\Release\cg_info.obj
.\Release\cg_localents.obj
.\Release\cg_main.obj
.\Release\cg_marks.obj
.\Release\cg_players.obj
.\Release\cg_playerstate.obj
.\Release\cg_predict.obj
.\Release\cg_scoreboard.obj
.\Release\cg_servercmds.obj
.\Release\cg_snapshot.obj
.\Release\cg_syscalls.obj
.\Release\cg_view.obj
.\Release\cg_weapons.obj
.\Release\q_math.obj
.\Release\q_shared.obj
.\Release\ui_shared.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP411.tmp"
<h3>Output Window</h3>
Compiling...
cg_ents.c
Linking...
Creating library Release/cgamex86.lib and object Release/cgamex86.exp
<h3>Results</h3>
cgamex86.dll - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
qagamex86.dll - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: ui - Win32 Release TA--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
uix86.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,76 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: cgame - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4F.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fp"Release/cgame.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
"C:\Games\Quake3\rq3source\reaction\cgame\cg_ents.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4F.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP50.tmp" with contents
[
/nologo /base:"0x30000000" /subsystem:windows /dll /incremental:no /pdb:"Release/cgamex86.pdb" /map:"Release/cgamex86.map" /machine:I386 /def:".\cgame.def" /out:"../Release/cgamex86.dll" /implib:"Release/cgamex86.lib"
.\Release\bg_misc.obj
.\Release\bg_pmove.obj
.\Release\bg_slidemove.obj
.\Release\cg_atmospheric.obj
.\Release\cg_consolecmds.obj
.\Release\cg_draw.obj
.\Release\cg_drawtools.obj
.\Release\cg_effects.obj
.\Release\cg_ents.obj
.\Release\cg_event.obj
.\Release\cg_info.obj
.\Release\cg_localents.obj
.\Release\cg_main.obj
.\Release\cg_marks.obj
.\Release\cg_players.obj
.\Release\cg_playerstate.obj
.\Release\cg_predict.obj
.\Release\cg_scoreboard.obj
.\Release\cg_servercmds.obj
.\Release\cg_snapshot.obj
.\Release\cg_syscalls.obj
.\Release\cg_view.obj
.\Release\cg_weapons.obj
.\Release\q_math.obj
.\Release\q_shared.obj
.\Release\ui_shared.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP50.tmp"
<h3>Output Window</h3>
Compiling...
cg_ents.c
Linking...
Creating library Release/cgamex86.lib and object Release/cgamex86.exp
<h3>Results</h3>
cgamex86.dll - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
qagamex86.dll - 0 error(s), 0 warning(s)
<h3>
--------------------Configuration: ui - Win32 Release TA--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
uix86.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,120 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4D3.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
"C:\Games\Quake3\rq3source\reaction\game\g_misc.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4D3.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4D4.tmp" with contents
[
kernel32.lib user32.lib winmm.lib /nologo /base:"0x20000000" /subsystem:windows /dll /incremental:no /pdb:"c:\reactionoutput/qagamex86.pdb" /map:"c:\reactionoutput/qagamex86.map" /machine:I386 /def:".\game.def" /out:"..\Release/qagamex86.dll" /implib:"c:\reactionoutput/qagamex86.lib"
\reactionoutput\ai_chat.obj
\reactionoutput\ai_cmd.obj
\reactionoutput\ai_dmnet.obj
\reactionoutput\ai_dmq3.obj
\reactionoutput\ai_main.obj
\reactionoutput\ai_team.obj
\reactionoutput\ai_vcmd.obj
\reactionoutput\bg_misc.obj
\reactionoutput\bg_pmove.obj
\reactionoutput\bg_slidemove.obj
\reactionoutput\g_active.obj
\reactionoutput\g_arenas.obj
\reactionoutput\g_bot.obj
\reactionoutput\g_client.obj
\reactionoutput\g_cmds.obj
\reactionoutput\g_combat.obj
\reactionoutput\g_fileio.obj
\reactionoutput\g_items.obj
\reactionoutput\g_main.obj
\reactionoutput\g_matchmode.obj
\reactionoutput\g_mem.obj
\reactionoutput\g_misc.obj
\reactionoutput\g_missile.obj
\reactionoutput\g_mover.obj
\reactionoutput\g_session.obj
\reactionoutput\g_spawn.obj
\reactionoutput\g_svcmds.obj
\reactionoutput\g_syscalls.obj
\reactionoutput\g_target.obj
\reactionoutput\g_team.obj
\reactionoutput\g_teamplay.obj
\reactionoutput\g_trigger.obj
\reactionoutput\g_utils.obj
\reactionoutput\g_weapon.obj
\reactionoutput\q_math.obj
\reactionoutput\q_shared.obj
\reactionoutput\rxn_game.obj
\reactionoutput\zcam.obj
\reactionoutput\zcam_target.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP4D4.tmp"
<h3>Output Window</h3>
Compiling...
g_misc.c
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(312) : error C2143: syntax error : missing ';' before '<<'
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(385) : error C2143: syntax error : missing ';' before '=='
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(387) : error C2143: syntax error : missing ';' before '>>'
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(412) : error C2065: 'player' : undeclared identifier
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(412) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : error C2065: 'tent' : undeclared identifier
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : warning C4047: 'function' : 'float *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : warning C4024: 'G_TempEntity' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : error C2198: 'G_TempEntity' : too few actual parameters
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(413) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct gentity_s *'
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(414) : error C2223: left of '->s' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(414) : error C2223: left of '->s' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(416) : error C2065: 'origin' : undeclared identifier
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(416) : warning C4047: 'function' : 'float *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(416) : warning C4024: 'G_TempEntity' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(416) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct gentity_s *'
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(417) : error C2223: left of '->s' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(417) : error C2223: left of '->s' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(420) : warning C4047: 'function' : 'struct gentity_s *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(420) : warning C4024: 'trap_RQ3UnlinkEntity' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2109: subscript requires array or pointer type
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2109: subscript requires array or pointer type
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(422) : error C2109: subscript requires array or pointer type
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(423) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(428) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(429) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(432) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(435) : warning C4047: 'function' : 'struct gentity_s *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(435) : warning C4024: 'G_ResetHistory' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(441) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(442) : warning C4047: 'function' : 'struct gentity_s *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(442) : warning C4024: 'G_KillBox' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(445) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(445) : error C2223: left of '->s' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(445) : warning C4047: 'function' : 'struct playerState_s *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(445) : warning C4024: 'BG_PlayerStateToEntityState' : different types for formal and actual parameter 1
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(445) : error C2198: 'BG_PlayerStateToEntityState' : too few actual parameters
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->r' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->r' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->r' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(448) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(450) : error C2223: left of '->client' must point to struct/union
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(451) : warning C4047: 'function' : 'struct gentity_s *' differs in levels of indirection from 'int '
C:\Games\Quake3\rq3source\reaction\game\g_misc.c(451) : warning C4024: 'trap_RQ3LinkEntity' : different types for formal and actual parameter 1
Error executing cl.exe.
<h3>Results</h3>
qagamex86.dll - 34 error(s), 16 warning(s)
</pre>
</body>
</html>

View File

@ -1,118 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: game - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8F5.tmp" with contents
[
/nologo /G6 /ML /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR"c:\reactionoutput/" /Fp"c:\reactionoutput/game.pch" /YX /Fo"c:\reactionoutput/" /Fd"c:\reactionoutput/" /FD /c
"C:\Games\Quake3\rq3source\reaction\game\g_misc.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8F5.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8F6.tmp" with contents
[
kernel32.lib user32.lib winmm.lib /nologo /base:"0x20000000" /subsystem:windows /dll /incremental:no /pdb:"c:\reactionoutput/qagamex86.pdb" /map:"c:\reactionoutput/qagamex86.map" /machine:I386 /def:".\game.def" /out:"..\Release/qagamex86.dll" /implib:"c:\reactionoutput/qagamex86.lib"
\reactionoutput\ai_chat.obj
\reactionoutput\ai_cmd.obj
\reactionoutput\ai_dmnet.obj
\reactionoutput\ai_dmq3.obj
\reactionoutput\ai_main.obj
\reactionoutput\ai_team.obj
\reactionoutput\ai_vcmd.obj
\reactionoutput\bg_misc.obj
\reactionoutput\bg_pmove.obj
\reactionoutput\bg_slidemove.obj
\reactionoutput\g_active.obj
\reactionoutput\g_arenas.obj
\reactionoutput\g_bot.obj
\reactionoutput\g_client.obj
\reactionoutput\g_cmds.obj
\reactionoutput\g_combat.obj
\reactionoutput\g_fileio.obj
\reactionoutput\g_items.obj
\reactionoutput\g_main.obj
\reactionoutput\g_matchmode.obj
\reactionoutput\g_mem.obj
\reactionoutput\g_misc.obj
\reactionoutput\g_missile.obj
\reactionoutput\g_mover.obj
\reactionoutput\g_session.obj
\reactionoutput\g_spawn.obj
\reactionoutput\g_svcmds.obj
\reactionoutput\g_syscalls.obj
\reactionoutput\g_target.obj
\reactionoutput\g_team.obj
\reactionoutput\g_teamplay.obj
\reactionoutput\g_trigger.obj
\reactionoutput\g_unlagged.obj
\reactionoutput\g_utils.obj
\reactionoutput\g_weapon.obj
\reactionoutput\q_math.obj
\reactionoutput\q_shared.obj
\reactionoutput\rxn_game.obj
\reactionoutput\zcam.obj
\reactionoutput\zcam_target.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8F6.tmp"
<h3>Output Window</h3>
Compiling...
g_misc.c
Linking...
Creating library c:\reactionoutput/qagamex86.lib and object c:\reactionoutput/qagamex86.exp
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8FA.tmp" with contents
[
/nologo /o"c:\reactionoutput/game.bsc"
\reactionoutput\ai_chat.sbr
\reactionoutput\ai_cmd.sbr
\reactionoutput\ai_dmnet.sbr
\reactionoutput\ai_dmq3.sbr
\reactionoutput\ai_main.sbr
\reactionoutput\ai_team.sbr
\reactionoutput\ai_vcmd.sbr
\reactionoutput\bg_misc.sbr
\reactionoutput\bg_pmove.sbr
\reactionoutput\bg_slidemove.sbr
\reactionoutput\g_active.sbr
\reactionoutput\g_arenas.sbr
\reactionoutput\g_bot.sbr
\reactionoutput\g_client.sbr
\reactionoutput\g_cmds.sbr
\reactionoutput\g_combat.sbr
\reactionoutput\g_fileio.sbr
\reactionoutput\g_items.sbr
\reactionoutput\g_main.sbr
\reactionoutput\g_matchmode.sbr
\reactionoutput\g_mem.sbr
\reactionoutput\g_misc.sbr
\reactionoutput\g_missile.sbr
\reactionoutput\g_mover.sbr
\reactionoutput\g_session.sbr
\reactionoutput\g_spawn.sbr
\reactionoutput\g_svcmds.sbr
\reactionoutput\g_syscalls.sbr
\reactionoutput\g_target.sbr
\reactionoutput\g_team.sbr
\reactionoutput\g_teamplay.sbr
\reactionoutput\g_trigger.sbr
\reactionoutput\g_unlagged.sbr
\reactionoutput\g_utils.sbr
\reactionoutput\g_weapon.sbr
\reactionoutput\q_math.sbr
\reactionoutput\q_shared.sbr
\reactionoutput\rxn_game.sbr
\reactionoutput\zcam.sbr
\reactionoutput\zcam_target.sbr]
Creating command line "bscmake.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP8FA.tmp"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
qagamex86.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,58 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: ui - Win32 Release TA--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP535.tmp" with contents
[
/nologo /G6 /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UI_EXPORTS" /FR"Release_TA/" /Fp"Release_TA/ta_ui.pch" /YX /Fo"Release_TA/" /Fd"Release_TA/" /FD /c
"C:\Games\Quake3\rq3source\reaction\ta_ui\ui_shared.c"
]
Creating command line "cl.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP535.tmp"
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP536.tmp" with contents
[
/nologo /base:"0x40000000" /dll /incremental:no /pdb:"Release_TA/uix86.pdb" /map:"Release_TA/uix86.map" /machine:I386 /def:".\ui.def" /out:"../Release/uix86.dll" /implib:"Release_TA/uix86.lib"
.\Release_TA\bg_misc.obj
.\Release_TA\q_math.obj
.\Release_TA\q_shared.obj
.\Release_TA\ui_atoms.obj
.\Release_TA\ui_gameinfo.obj
.\Release_TA\ui_main.obj
.\Release_TA\ui_players.obj
.\Release_TA\ui_shared.obj
.\Release_TA\ui_syscalls.obj
.\Release_TA\ui_util.obj
]
Creating command line "link.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP536.tmp"
<h3>Output Window</h3>
Compiling...
ui_shared.c
Linking...
Creating library Release_TA/uix86.lib and object Release_TA/uix86.exp
Creating temporary file "D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP53A.tmp" with contents
[
/nologo /o"Release_TA/ta_ui.bsc"
.\Release_TA\bg_misc.sbr
.\Release_TA\q_math.sbr
.\Release_TA\q_shared.sbr
.\Release_TA\ui_atoms.sbr
.\Release_TA\ui_gameinfo.sbr
.\Release_TA\ui_main.sbr
.\Release_TA\ui_players.sbr
.\Release_TA\ui_shared.sbr
.\Release_TA\ui_syscalls.sbr
.\Release_TA\ui_util.sbr]
Creating command line "bscmake.exe @D:\DOCUME~1\Andrei\LOCALS~1\Temp\RSP53A.tmp"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
uix86.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,555 +0,0 @@
//-----------------------------------------------------------------------------
//
// $Id: ui_credits.c,v 1.13 2002/01/11 20:20:58 jbravo Exp $
//
//-----------------------------------------------------------------------------
//
// $Log: ui_credits.c,v $
// Revision 1.13 2002/01/11 20:20:58 jbravo
// Adding TP to main branch
//
// Revision 1.12 2002/01/11 19:48:30 jbravo
// Formatted the source in non DOS format.
//
// Revision 1.11 2001/12/31 16:28:42 jbravo
// I made a Booboo with the Log tag.
//
//
//-----------------------------------------------------------------------------
/*
===========================================
SCROLLING CREDITS CODE
Author: Iain McGinniss
Company: AZ Development Team
Produced for Code 3 Arena, feel free
to use this code in your own projects
just please remember to give credit
to AZ Development team for this.
That should be easy now with this
new credits system!
===========================================
Elder's modifications
-Letterbox simulation
-Fixed width string drawing
-Movie style "character -- actor" layout
-Configurable fade-to-color sequence
*/
// INCLUDE FILES
#include "ui_local.h"
// CONSTANT DEFINITIONS
#define SCROLLSPEED 2.00 // The scrolling speed in pixels per second.
// modify as appropriate for our credits
#define BACKGROUND_SHADER
// uncomment this to use a background shader, otherwise a solid color
// defined in the vec4_t "color_background" is filled to the screen
//Elder: added to choose drawFixed
#define PROPWIDTH 0
#define FIXEDWIDTH 1
#define RIGHT_JUSTIFY_POSITION 310
#define LEFT_JUSTIFY_POSITION 330
//Elder: fader code parameters - plus nicer to access vec4_t with COLOR_*
#define FADE_START_TIME 4000
#define FADE_DURATION 10000
#define COLOR_R 0
#define COLOR_G 1
#define COLOR_B 2
#define COLOR_A 3
// STRUCTURES
typedef struct {
menuframework_s menu;
} creditsmenu_t;
static creditsmenu_t s_credits;
int starttime = 0; // game time at which credits are started
float mvolume; // records the original music volume level, as we will
// modify it for the credits
//Elder: fader variables
static float fade = 0.00;
//Elder: Fade color - leave alpha component at 0.00
vec4_t color_fader = {0.00, 0.00, 0.00, 0.00};
vec4_t color_background = {0.00, 0.00, 0.00, 1.00};
// these are just example colours that are used in credits[]
vec4_t color_headertext = {0.80, 0.00, 0.00, 1.00};
vec4_t color_maintext = {1.00, 1.00, 1.00, 1.00};
// definition of the background shader pointer
qhandle_t BackgroundShader;
/*
Constants to be used for the "style" field of the cr_line credits[] structure...
UI_LEFT - Align to the left of the screen
UI_CENTER - Align to the center
UI_RIGHT - Align to the right of the screen
UI_SMALLFONT - Small font
UI_BIGFONT - Big font
UI_GIANTFONT - Giant font
UI_DROPSHADOW - A drop shadow is created behind the text
UI_BLINK - The text blinks
UI_PULSE - The text pulses
*/
typedef struct
{
char *string;
int style;
vec4_t *colour;
//Elder: added
int drawFixed;
} cr_line;
cr_line credits[] = { // edit this as necessary for your credits
{ "CAST", UI_CENTER|UI_BIGFONT, &color_headertext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "GRUNT", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "CYRUS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "KGB", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "M LOWREY", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "MASON", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "MR. TEE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "NUT", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "PSYCHO", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ROBBER", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SWAT", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "REACTION QUAKE 3 TEAM", UI_CENTER|UI_BIGFONT, &color_headertext, FIXEDWIDTH },
// Programming
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "PROGRAMMING", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "MALCOLM BECHARD (TSUNAMI)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SCOTT BROOKS (BLAZE)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "VICTOR CHOW (ELDER_MMHS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "BRYCE HUTCHINGS (NICEASS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "RICHARD ALLEN (JBRAVO)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Additional programming -- snippets
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL PROGRAMMING", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "MICHAEL BRUCE (AGTORANGE)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "DAN CHIN (LT. HAWKINS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "MIKE CONNOR (HOMER)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Artwork - models, textures, whatever
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ART", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "IAN MCEACHERN (FROST)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "BRIAN MILLS (BIRDMAN)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "LINH NGUYEN (SONIC128)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "MARK POTNICK (CLOUD)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "RYAN VANCE (BRAGOBLIN)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Additional artwork - a few extra things
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL ART", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "VICTOR CHOW (ELDER_MMHS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "TOMI ISOAHO (T.T.I.)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SHAY MCCARTY (SHAYMON)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "KYLE VANMEURS (R0OK)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Mappers
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "LEVEL DESIGN", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "DAVID COSTELLO (SZE)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ANDREI DREXLER (MAKRO)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "TOMI ISOAHO (T.T.I.)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SHAY MCCARTY (SHAYMON)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "DAVID PIKE (CENTURION)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "KELLY RUSH (HEXYDES)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "JESSE SMITH (SPYDER)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "WALTER SOMOL (JOHNNY_ROCKET)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Extra mappers/strictly ports
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL LEVEL DESIGN", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "GREGORY SIMMONS (SMOKE)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "JASON IRBY (IRBY)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Sound guys
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "SOUND DESIGN", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "ERWIN PEIL (SPECOPS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Organization -- rare :)
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ORGANIZATION", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "ERWIN PEIL (SPECOPS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Additional organization -- past peeps
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL ORGANIZATION", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "LUCY CONNOR (LUCY)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Website
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "WEBSITE DESIGN", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "VICTOR CHOW (ELDER_MMHS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "RICHARD WATT (C00T)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Beta Testers
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "TESTERS AND ADVISORS", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "NON FICTION (FICTION)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SETH CHABOT (WOOK!EBOY)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "STEVE EWALD (PSYCHOTAKES)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "LUKE PAUL (ALICE)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ANDREW PROSNIK (BLACK MONK)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// TBC
//{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
//{ "..TO BE FINISHED..", UI_CENTER|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
//{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "REACTION QUAKE 3 CONTRIBUTIONS", UI_CENTER|UI_BIGFONT, &color_headertext, FIXEDWIDTH },
// Additional artwork -- handcannon, hands
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL ARTWORK", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "DWAYNE DOUGLASS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Additional testers -- Elder's test subjects ;)
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ADDITIONAL TESTING", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "WINSTON CHOW (SHISHKABOB)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "STEPHEN LOOI (DUD)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Music Contributions
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "REACTION QUAKE 3 TITLE SCORE", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "JESPER KYD", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "THE REACTION QUAKE 3 TEAM THANKS", UI_CENTER|UI_BIGFONT, &color_headertext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "A-TEAM REPRESENTATIVE", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "DWAYNE DOUGLASS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Art resources/etc.
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ART RESOURCES", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "MASTABA SOLUTIONS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "POLYCOUNT", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "QWORKSHOP3", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SHADERLAB", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Coding help/ideas/snippets
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "CODING RESOURCES", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "CODE3ARENA", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "IAIN MCGINNISS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "INOLEN", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "JUZ'S SLIPGATE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "QUAKE3WORLD FORUMS (MOD PROGRAMMING)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "WANG (ATF)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "TOMAS EDWARDSSON (FREUD)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "JOHANN THORIRSSON (VONDIKALL)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Fex for the public board
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "PRE-RELEASE MESSAGEBOARD GOD", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "THE GREAT FEX", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Groups?
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "GROUPS", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "ABOVE INTELLIGENCE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ALL THE LITTLE PEOPLE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "FAMILY AND FRIENDS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "FEAR.NET FREQUENTERS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "id SOFTWARE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "THE A-TEAM (AQ2 DEVELOPERS)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "THE GRAMMAR RANGERS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "#MODELING @ GAMESNET", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Commodities -- food, drugs, you name it
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "COMMODITIES", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "CAFFEINE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "CHEX MIX", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "DR. PEPPER", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "HOME-COOKED MEALS (MM, MM, MMM!)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "HOT POCKETS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "MOUNTAIN DEW", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "PEPSI", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "PHO", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "VARIOUS PIZZA PLACES", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "WACOM TABLETS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Mapping help
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "MAPPING RESOURCES", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "QERADIANT.COM", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "GAMEDESIGN.NET", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "QUAKE3WORLD FORUMS (LEVEL DESIGN)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// The great webhosts
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "WEB HOSTS", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "TELEFRAGGED AND AFFILIATES", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ALL MIRRORS (TOO MANY TO LIST)", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
// Fan sites?
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
// This point on: id credits -- try to match up with the latest PR
{ "id SOFTWARE", UI_CENTER|UI_BIGFONT, &color_headertext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "PROGRAMMERS", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "JOHN CARMACK", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "ROBERT A. DUFFY", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "JIM DOSE'", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "ART", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "ADRIAN CARMACK", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "KEVIN CLOUD", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "KENNETH SCOTT", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "SENECA MENARD", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "FRED NILSSON", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "GAME DESIGNER", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "GRAEME DEVINE", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "LEVEL DESIGN", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "TIM WILLITS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "CHRISTIAN ANTKOW", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "PAUL JAQUAYS", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "CEO", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "TODD HOLLENSHEAD", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "DIRECTOR OF BUSINESS DEVELOPMENT", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "MARTY STRATTON", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "BIZ ASSIST AND ID MOM", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "DONNA JACKSON", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "DEVELOPMENT ASSISTANCE", UI_RIGHT|UI_SMALLFONT, &color_headertext, FIXEDWIDTH },
{ "ERIC WEBB", UI_LEFT|UI_SMALLFONT, &color_maintext, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{ "", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
// TODO: make something better
{ "THIS HAS BEEN A REACTION QUAKE 3 TEAM PRODUCTION Copyright 2000 - 2001", UI_CENTER|UI_SMALLFONT, &color_blue, FIXEDWIDTH },
{NULL}
};
/*
=================
UI_CreditMenu_Key
=================
*/
static sfxHandle_t UI_CreditMenu_Key( int key ) {
if( key & K_CHAR_FLAG ) {
return 0;
}
// pressing the escape key or clicking the mouse will exit
// we also reset the music volume to the user's original
// choice here, by setting s_musicvolume to the stored var
//Elder: doesn't appear to restore music volume
//trap_Cmd_ExecuteText( EXEC_APPEND, va("s_musicvolume %f;quit\n", mvolume));
//trap_Cvar_SetValue( "s_musicvolume", mvolume);
//trap_S_StopBackgroundTrack();
trap_Cmd_ExecuteText( EXEC_APPEND, va("s_musicvolume %f\n", mvolume));
trap_Cmd_ExecuteText( EXEC_APPEND, "quit\n");
return 0;
}
/*
=================
ScrollingCredits_Draw
This is the main drawing function for the credits.
Most of the code is self-explanatory.
=================
*/
static void ScrollingCredits_Draw(void) {
int x = 320, y, n, ysize = 0;
// ysize is used to determine the entire length
// of the credits in pixels.
// We can then use this in further calculations
if(!ysize) {
// ysize not calculated, so calculate it dammit!
for(n = 0; n <= sizeof(credits) - 1; n++) {
//Elder: don't add right-justified stuff to height
if (!(credits[n].style & UI_RIGHT)) {
// fixed width font
if(credits[n].drawFixed) {
ysize += SMALLCHAR_HEIGHT;
}
// it is a small character
else if(credits[n].style & UI_SMALLFONT) {
// add small character height
ysize += PROP_HEIGHT * PROP_SMALL_SIZE_SCALE;
}
// it is a big character
else if(credits[n].style & UI_BIGFONT) {
// add big character size
ysize += PROP_HEIGHT;
}
// it is a huge character
else if(credits[n].style & UI_GIANTFONT) {
// add giant character size.
ysize += PROP_HEIGHT * (1 / PROP_SMALL_SIZE_SCALE);
}
}
}
}
// first, fill the background with the specified colour/shader
// we are drawing a shader
#ifdef BACKGROUND_SHADER
UI_DrawHandlePic(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, BackgroundShader);
//Elder: added and then removed for fader
//UI_FillRect( 0, 0, 640, 480, color_deepdim );
#else
// we are just filling a color
UI_FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, color_background);
#endif
//Elder: my simple fader code - vec4_t doesn't like var parameters
//so we'll have to access the alpha channel once it's initialized
if ( (uis.realtime - starttime) >= FADE_START_TIME ) {
if (fade < 1.00) {
fade += (1.00 / FADE_DURATION) * 10;
}
//safety clamp
else {
fade = 1.00;
}
color_fader[COLOR_A] = fade;
UI_FillRect( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, color_fader );
}
// let's draw the stuff
// set initial y location
y = 480 - SCROLLSPEED * (float)(uis.realtime - starttime) / 100;
for(n = 0; n <= sizeof(credits) - 1; n++) {
// this NULL string marks the end of the credits struct
if(credits[n].string == NULL) {
// credits sequence is completely off screen
if(y < -16) {
trap_Cmd_ExecuteText( EXEC_APPEND, va("s_musicvolume %f; quit\n", mvolume));
break;
// end of credits
}
break;
}
if( strlen(credits[n].string) == 1) // spacer string, no need to draw
continue;
// if the line is within the visible range of the screen
if( y > -(PROP_HEIGHT * (1 / PROP_SMALL_SIZE_SCALE))) {
//Elder: added to support fixed width display and movie-style alignment
if ( credits[n].drawFixed ) {
if (credits[n].style & UI_RIGHT) {
UI_DrawString(RIGHT_JUSTIFY_POSITION, y, credits[n].string, credits[n].style, *credits[n].colour );
}
else if (credits[n].style & UI_CENTER) {
UI_DrawString(x, y, credits[n].string, credits[n].style, *credits[n].colour );
}
else {
UI_DrawString(LEFT_JUSTIFY_POSITION, y, credits[n].string, credits[n].style, *credits[n].colour );
}
}
else {
UI_DrawProportionalString(x, y, credits[n].string,
credits[n].style, *credits[n].colour );
}
}
// re-adjust y for next line
//Elder: right-justified stuff doesn't bump up the line
if (!(credits[n].style & UI_RIGHT)) {
//Elder: added for fixed width
if (credits[n].drawFixed) {
y += SMALLCHAR_HEIGHT;
}
else if(credits[n].style & UI_SMALLFONT) {
y += PROP_HEIGHT * PROP_SMALL_SIZE_SCALE;
}
else if(credits[n].style & UI_BIGFONT) {
y += PROP_HEIGHT;
}
else if(credits[n].style & UI_GIANTFONT) {
y += PROP_HEIGHT * (1 / PROP_SMALL_SIZE_SCALE);
}
}
// if y is off the screen, break out of loop
if (y > 480)
break;
}
//Elder: "Letterbox" mask
UI_FillRect( 0, 0, SCREEN_WIDTH, 54, color_black);
UI_FillRect( 0, 426, SCREEN_WIDTH, 54, color_black);
UI_FillRect( 0, 54, SCREEN_WIDTH, 2, color_red);
UI_FillRect( 0, 426, SCREEN_WIDTH, 2, color_red);
//Elder: debug information for fader
//UI_DrawString( 635, 464, va( "Time index: %i", uis.realtime - starttime), UI_RIGHT|UI_SMALLFONT, color_white);
//UI_DrawString (0, 464, va("Fade alpha: %f", fade), UI_SMALLFONT, color_white);
}
/*
===============
UI_CreditMenu
===============
*/
void UI_CreditMenu( void ) {
memset( &s_credits, 0 ,sizeof(s_credits) );
s_credits.menu.draw = ScrollingCredits_Draw;
s_credits.menu.key = UI_CreditMenu_Key;
s_credits.menu.fullscreen = qtrue;
UI_PushMenu ( &s_credits.menu );
starttime = uis.realtime; // record start time for credits to scroll properly
mvolume = trap_Cvar_VariableValue( "s_musicvolume" );
if(mvolume < 0.5)
trap_Cmd_ExecuteText( EXEC_APPEND, "s_musicvolume 0.5\n" );
//void trap_S_StopBackgroundTrack( void )
//void trap_S_StartBackgroundTrack( const char *intro, const char *loop) {
//trap_S_StartBackgroundTrack( "music/win", "music/win");
trap_Cmd_ExecuteText( EXEC_APPEND, "music music/win music/win\n" );
// load the background shader
#ifdef BACKGROUND_SHADER
//Elder: changed to rq3 fire
BackgroundShader = trap_R_RegisterShaderNoMip("rq3-menuback");
#endif
}