mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-24 13:11:33 +00:00
- Added Karate Chris's TEAMINFO submission.
SVN r610 (trunk)
This commit is contained in:
parent
b88f46736b
commit
b48cc1792b
17 changed files with 1104 additions and 853 deletions
|
@ -1,4 +1,5 @@
|
||||||
December 20, 2007 (Changes by Graf Zahl)
|
December 20, 2007 (Changes by Graf Zahl)
|
||||||
|
- Added Karate Chris's TEAMINFO submission.
|
||||||
- Added true color processing to FDDSTexture. This is untested so far
|
- Added true color processing to FDDSTexture. This is untested so far
|
||||||
because I don't have any DDS textures to check it with.
|
because I don't have any DDS textures to check it with.
|
||||||
- Fixed: FTexture::~FTexture() must destroy the associated native texture
|
- Fixed: FTexture::~FTexture() must destroy the associated native texture
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "doomstat.h"
|
#include "doomstat.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
CVAR (Int, bot_next_color, 11, 0)
|
CVAR (Int, bot_next_color, 11, 0)
|
||||||
CVAR (Bool, bot_observer, false, 0)
|
CVAR (Bool, bot_observer, false, 0)
|
||||||
|
|
|
@ -56,6 +56,7 @@ Everything that is changed is marked (maybe commented) with "Added by MC"
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
#include "p_acs.h"
|
#include "p_acs.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
static FRandom pr_botspawn ("BotSpawn");
|
static FRandom pr_botspawn ("BotSpawn");
|
||||||
|
|
||||||
|
@ -335,7 +336,7 @@ bool DCajunMaster::SpawnBot (const char *name, int color)
|
||||||
{
|
{
|
||||||
strcat (concat, colors[bot_next_color]);
|
strcat (concat, colors[bot_next_color]);
|
||||||
}
|
}
|
||||||
if (thebot->lastteam < NUM_TEAMS)
|
if (TEAMINFO_IsValidTeam (thebot->lastteam))
|
||||||
{ // Keep the bot on the same team when switching levels
|
{ // Keep the bot on the same team when switching levels
|
||||||
sprintf (concat+strlen(concat), "\\team\\%d\n", thebot->lastteam);
|
sprintf (concat+strlen(concat), "\\team\\%d\n", thebot->lastteam);
|
||||||
}
|
}
|
||||||
|
@ -374,7 +375,11 @@ void DCajunMaster::DoAddBot (int bnum, char *info)
|
||||||
players[bnum].mo = NULL;
|
players[bnum].mo = NULL;
|
||||||
players[bnum].playerstate = PST_ENTER;
|
players[bnum].playerstate = PST_ENTER;
|
||||||
botingame[bnum] = true;
|
botingame[bnum] = true;
|
||||||
Printf ("%s joined the game\n", players[bnum].userinfo.netname);
|
|
||||||
|
if (teamplay)
|
||||||
|
Printf ("%s joined the %s team\n", players[bnum].userinfo.netname, teams[players[bnum].userinfo.team].name);
|
||||||
|
else
|
||||||
|
Printf ("%s joined the game\n", players[bnum].userinfo.netname);
|
||||||
|
|
||||||
G_DoReborn (bnum, true);
|
G_DoReborn (bnum, true);
|
||||||
if (StatusBar != NULL)
|
if (StatusBar != NULL)
|
||||||
|
@ -589,7 +594,7 @@ bool DCajunMaster::LoadBots ()
|
||||||
if (IsNum (sc_String))
|
if (IsNum (sc_String))
|
||||||
{
|
{
|
||||||
teamnum = atoi (sc_String);
|
teamnum = atoi (sc_String);
|
||||||
if (teamnum >= NUM_TEAMS)
|
if (!TEAMINFO_IsValidTeam (teamnum))
|
||||||
{
|
{
|
||||||
teamnum = TEAM_None;
|
teamnum = TEAM_None;
|
||||||
}
|
}
|
||||||
|
@ -597,9 +602,9 @@ bool DCajunMaster::LoadBots ()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
teamnum = TEAM_None;
|
teamnum = TEAM_None;
|
||||||
for (int i = 0; i < NUM_TEAMS; ++i)
|
for (int i = 0; i < teams.Size (); ++i)
|
||||||
{
|
{
|
||||||
if (stricmp (TeamNames[i], sc_String) == 0)
|
if (stricmp (teams[i].name, sc_String) == 0)
|
||||||
{
|
{
|
||||||
teamnum = i;
|
teamnum = i;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -88,6 +88,7 @@
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
#include "st_start.h"
|
#include "st_start.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -2326,6 +2327,10 @@ void D_DoomMain (void)
|
||||||
Printf ("S_InitData: Load sound definitions.\n");
|
Printf ("S_InitData: Load sound definitions.\n");
|
||||||
S_InitData ();
|
S_InitData ();
|
||||||
|
|
||||||
|
// [CW] Parse any TEAMINFO lumps
|
||||||
|
Printf ("TEAMINFO_Init: Load team definitions.\n");
|
||||||
|
TEAMINFO_Init ();
|
||||||
|
|
||||||
FActorInfo::StaticInit ();
|
FActorInfo::StaticInit ();
|
||||||
|
|
||||||
// Now that all actors have been defined we can finally set up the weapon slots
|
// Now that all actors have been defined we can finally set up the weapon slots
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include "p_trace.h"
|
#include "p_trace.h"
|
||||||
#include "a_sharedglobal.h"
|
#include "a_sharedglobal.h"
|
||||||
#include "st_start.h"
|
#include "st_start.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
int P_StartScript (AActor *who, line_t *where, int script, char *map, bool backSide,
|
int P_StartScript (AActor *who, line_t *where, int script, char *map, bool backSide,
|
||||||
int arg0, int arg1, int arg2, int always, bool wantResultCode, bool net);
|
int arg0, int arg1, int arg2, int always, bool wantResultCode, bool net);
|
||||||
|
|
|
@ -66,20 +66,6 @@ struct userinfo_s
|
||||||
};
|
};
|
||||||
typedef struct userinfo_s userinfo_t;
|
typedef struct userinfo_s userinfo_t;
|
||||||
|
|
||||||
enum ETeams
|
|
||||||
{
|
|
||||||
TEAM_Red,
|
|
||||||
TEAM_Blue,
|
|
||||||
TEAM_Green,
|
|
||||||
TEAM_Gold,
|
|
||||||
|
|
||||||
NUM_TEAMS,
|
|
||||||
TEAM_None = 255
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const char *TeamNames[NUM_TEAMS];
|
|
||||||
extern float TeamHues[NUM_TEAMS];
|
|
||||||
|
|
||||||
FArchive &operator<< (FArchive &arc, userinfo_t &info);
|
FArchive &operator<< (FArchive &arc, userinfo_t &info);
|
||||||
|
|
||||||
void D_SetupUserInfo (void);
|
void D_SetupUserInfo (void);
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
static FRandom pr_pickteam ("PickRandomTeam");
|
static FRandom pr_pickteam ("PickRandomTeam");
|
||||||
|
|
||||||
|
@ -62,7 +63,7 @@ CVAR (Float, autoaim, 5000.f, CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (String, name, "Player", CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (String, name, "Player", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (Color, color, 0x40cf00, CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (Color, color, 0x40cf00, CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (String, skin, "base", CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (String, skin, "base", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (Int, team, 255, CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (Int, team, TEAM_None, CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (String, gender, "male", CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (String, gender, "male", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (Bool, neverswitchonpickup, false, CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (Bool, neverswitchonpickup, false, CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
CVAR (Float, movebob, 0.25f, CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR (Float, movebob, 0.25f, CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
|
@ -83,16 +84,6 @@ enum
|
||||||
INFO_PlayerClass,
|
INFO_PlayerClass,
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *TeamNames[NUM_TEAMS] =
|
|
||||||
{
|
|
||||||
"Red", "Blue", "Green", "Gold"
|
|
||||||
};
|
|
||||||
|
|
||||||
float TeamHues[NUM_TEAMS] =
|
|
||||||
{
|
|
||||||
0.f, 240.f, 120.f, 60.f
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *GenderNames[3] = { "male", "female", "other" };
|
const char *GenderNames[3] = { "male", "female", "other" };
|
||||||
|
|
||||||
static const char *UserInfoStrings[] =
|
static const char *UserInfoStrings[] =
|
||||||
|
@ -192,29 +183,11 @@ int D_PlayerClassToInt (const char *classname)
|
||||||
|
|
||||||
void D_GetPlayerColor (int player, float *h, float *s, float *v)
|
void D_GetPlayerColor (int player, float *h, float *s, float *v)
|
||||||
{
|
{
|
||||||
int color = players[player].userinfo.color;
|
userinfo_t *info = &players[player].userinfo;
|
||||||
|
int color = teamplay ? teams[info->team].playercolor : info->color;
|
||||||
|
|
||||||
RGBtoHSV (RPART(color)/255.f, GPART(color)/255.f, BPART(color)/255.f,
|
RGBtoHSV (RPART(color)/255.f, GPART(color)/255.f, BPART(color)/255.f,
|
||||||
h, s, v);
|
h, s, v);
|
||||||
|
|
||||||
if (teamplay && players[player].userinfo.team < NUM_TEAMS)
|
|
||||||
{
|
|
||||||
// In team play, force the player to use the team's hue
|
|
||||||
// and adjust the saturation and value so that the team
|
|
||||||
// hue is visible in the final color.
|
|
||||||
*h = TeamHues[players[player].userinfo.team];
|
|
||||||
if (gameinfo.gametype == GAME_Doom)
|
|
||||||
{
|
|
||||||
*s = *s*0.15f+0.8f;
|
|
||||||
*v = *v*0.5f+0.4f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// I'm not really happy with the red team color in Heretic...
|
|
||||||
*s = team == 0 ? 0.6f : 0.8f;
|
|
||||||
*v = *v*0.4f+0.3f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out which teams are present. If there is only one,
|
// Find out which teams are present. If there is only one,
|
||||||
|
@ -235,7 +208,12 @@ void D_PickRandomTeam (int player)
|
||||||
|
|
||||||
int D_PickRandomTeam ()
|
int D_PickRandomTeam ()
|
||||||
{
|
{
|
||||||
int teamPresent[NUM_TEAMS] = { 0 };
|
for (int i = 0; i < (signed)teams.Size (); i++)
|
||||||
|
{
|
||||||
|
teams[i].present = 0;
|
||||||
|
teams[i].ties = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int numTeams = 0;
|
int numTeams = 0;
|
||||||
int team;
|
int team;
|
||||||
|
|
||||||
|
@ -243,9 +221,9 @@ int D_PickRandomTeam ()
|
||||||
{
|
{
|
||||||
if (playeringame[i])
|
if (playeringame[i])
|
||||||
{
|
{
|
||||||
if (players[i].userinfo.team < NUM_TEAMS)
|
if (TEAMINFO_IsValidTeam (players[i].userinfo.team))
|
||||||
{
|
{
|
||||||
if (teamPresent[players[i].userinfo.team]++ == 0)
|
if (teams[players[i].userinfo.team].present++ == 0)
|
||||||
{
|
{
|
||||||
numTeams++;
|
numTeams++;
|
||||||
}
|
}
|
||||||
|
@ -257,37 +235,36 @@ int D_PickRandomTeam ()
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
team = pr_pickteam() % NUM_TEAMS;
|
team = pr_pickteam() % teams.Size ();
|
||||||
} while (teamPresent[team] != 0);
|
} while (teams[team].present != 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int lowest = INT_MAX, lowestTie = 0, i;
|
int lowest = INT_MAX, lowestTie = 0, i;
|
||||||
int ties[NUM_TEAMS];
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_TEAMS; ++i)
|
for (i = 0; i < (signed)teams.Size (); ++i)
|
||||||
{
|
{
|
||||||
if (teamPresent[i] > 0)
|
if (teams[i].present > 0)
|
||||||
{
|
{
|
||||||
if (teamPresent[i] < lowest)
|
if (teams[i].present < lowest)
|
||||||
{
|
{
|
||||||
lowest = teamPresent[i];
|
lowest = teams[i].present;
|
||||||
lowestTie = 0;
|
lowestTie = 0;
|
||||||
ties[0] = i;
|
teams[0].ties = i;
|
||||||
}
|
}
|
||||||
else if (teamPresent[i] == lowest)
|
else if (teams[i].present == lowest)
|
||||||
{
|
{
|
||||||
ties[++lowestTie] = i;
|
teams[++lowestTie].ties = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lowestTie == 0)
|
if (lowestTie == 0)
|
||||||
{
|
{
|
||||||
team = ties[0];
|
team = teams[0].ties;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
team = ties[pr_pickteam() % (lowestTie+1)];
|
team = teams[pr_pickteam() % (lowestTie+1)].ties;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,21 +276,21 @@ static void UpdateTeam (int pnum, int team, bool update)
|
||||||
userinfo_t *info = &players[pnum].userinfo;
|
userinfo_t *info = &players[pnum].userinfo;
|
||||||
int oldteam;
|
int oldteam;
|
||||||
|
|
||||||
if (team < 0)
|
if (team < TEAM_None)
|
||||||
{
|
{
|
||||||
team = TEAM_None;
|
team = TEAM_None;
|
||||||
}
|
}
|
||||||
oldteam = info->team;
|
oldteam = info->team;
|
||||||
info->team = team;
|
info->team = team;
|
||||||
|
|
||||||
if (teamplay && info->team >= NUM_TEAMS)
|
if (teamplay && !TEAMINFO_IsValidTeam (info->team))
|
||||||
{ // Force players onto teams in teamplay mode
|
{ // Force players onto teams in teamplay mode
|
||||||
info->team = D_PickRandomTeam ();
|
info->team = D_PickRandomTeam ();
|
||||||
}
|
}
|
||||||
if (update && oldteam != info->team)
|
if (update && oldteam != info->team)
|
||||||
{
|
{
|
||||||
if (info->team < NUM_TEAMS)
|
if (TEAMINFO_IsValidTeam (info->team))
|
||||||
Printf ("%s joined the %s team\n", info->netname, TeamNames[info->team]);
|
Printf ("%s joined the %s team\n", info->netname, teams[info->team].name);
|
||||||
else
|
else
|
||||||
Printf ("%s is now a loner\n", info->netname);
|
Printf ("%s is now a loner\n", info->netname);
|
||||||
}
|
}
|
||||||
|
@ -323,13 +300,13 @@ static void UpdateTeam (int pnum, int team, bool update)
|
||||||
{
|
{
|
||||||
StatusBar->AttachToPlayer (&players[pnum]);
|
StatusBar->AttachToPlayer (&players[pnum]);
|
||||||
}
|
}
|
||||||
if ((unsigned)info->team >= NUM_TEAMS)
|
if (!TEAMINFO_IsValidTeam (info->team))
|
||||||
info->team = TEAM_None;
|
info->team = TEAM_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
int D_GetFragCount (player_t *player)
|
int D_GetFragCount (player_t *player)
|
||||||
{
|
{
|
||||||
if (!teamplay || player->userinfo.team >= NUM_TEAMS)
|
if (!teamplay || !TEAMINFO_IsValidTeam (player->userinfo.team))
|
||||||
{
|
{
|
||||||
return player->fragcount;
|
return player->fragcount;
|
||||||
}
|
}
|
||||||
|
@ -359,7 +336,7 @@ void D_SetupUserInfo ()
|
||||||
memset (&players[i].userinfo, 0, sizeof(userinfo_t));
|
memset (&players[i].userinfo, 0, sizeof(userinfo_t));
|
||||||
|
|
||||||
strncpy (coninfo->netname, name, MAXPLAYERNAME);
|
strncpy (coninfo->netname, name, MAXPLAYERNAME);
|
||||||
if (teamplay && team >= NUM_TEAMS)
|
if (teamplay && !TEAMINFO_IsValidTeam (team))
|
||||||
{
|
{
|
||||||
coninfo->team = D_PickRandomTeam ();
|
coninfo->team = D_PickRandomTeam ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
** hu_scores.cpp
|
** hu_scores.cpp
|
||||||
** Routines for drawing the deathmatch scoreboard.
|
** Routines for drawing the scoreboards.
|
||||||
**
|
**
|
||||||
**---------------------------------------------------------------------------
|
**---------------------------------------------------------------------------
|
||||||
** Copyright 1998-2006 Randy Heit
|
** Copyright 1998-2006 Randy Heit
|
||||||
** Copyright 2007 Chris Westley
|
** Copyright 2007 Christopher Westley
|
||||||
** All rights reserved.
|
** All rights reserved.
|
||||||
**
|
**
|
||||||
** Redistribution and use in source and binary forms, with or without
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -35,10 +35,11 @@
|
||||||
|
|
||||||
// HEADER FILES ------------------------------------------------------------
|
// HEADER FILES ------------------------------------------------------------
|
||||||
|
|
||||||
#include "st_stuff.h"
|
|
||||||
#include "c_console.h"
|
#include "c_console.h"
|
||||||
#include "v_video.h"
|
#include "st_stuff.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
|
#include "v_video.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -50,11 +51,8 @@
|
||||||
|
|
||||||
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||||
|
|
||||||
static void HU_DrawNonTeamScores (player_t *, player_t *[MAXPLAYERS]);
|
static void HU_DoDrawScores (player_t *, player_t *[MAXPLAYERS]);
|
||||||
static void HU_DrawTeamScores (player_t *, player_t *[MAXPLAYERS]);
|
|
||||||
|
|
||||||
static void HU_DrawTimeRemaining (int y);
|
static void HU_DrawTimeRemaining (int y);
|
||||||
|
|
||||||
static void HU_DrawPlayer (player_t *, bool, int, int, int, bool);
|
static void HU_DrawPlayer (player_t *, bool, int, int, int, bool);
|
||||||
|
|
||||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
@ -74,12 +72,11 @@ CVAR (Int, sb_deathmatch_yourplayercolor, CR_GREEN, CVAR_ARCHIVE)
|
||||||
CVAR (Int, sb_deathmatch_otherplayercolor, CR_GREY, CVAR_ARCHIVE)
|
CVAR (Int, sb_deathmatch_otherplayercolor, CR_GREY, CVAR_ARCHIVE)
|
||||||
|
|
||||||
CVAR (Bool, sb_teamdeathmatch_enable, true, CVAR_ARCHIVE)
|
CVAR (Bool, sb_teamdeathmatch_enable, true, CVAR_ARCHIVE)
|
||||||
CVAR (Int, sb_teamdeathmatch_yourplayercolor, CR_GREEN, CVAR_ARCHIVE)
|
CVAR (Int, sb_teamdeathmatch_headingcolor, CR_RED, CVAR_ARCHIVE)
|
||||||
CVAR (Int, sb_teamdeathmatch_otherplayercolor, CR_GREY, CVAR_ARCHIVE)
|
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
|
||||||
static int STACK_ARGS compare (const void *arg1, const void *arg2)
|
static int STACK_ARGS comparepoints (const void *arg1, const void *arg2)
|
||||||
{
|
{
|
||||||
if (deathmatch)
|
if (deathmatch)
|
||||||
return (*(player_t **)arg2)->fragcount - (*(player_t **)arg1)->fragcount;
|
return (*(player_t **)arg2)->fragcount - (*(player_t **)arg1)->fragcount;
|
||||||
|
@ -87,6 +84,11 @@ static int STACK_ARGS compare (const void *arg1, const void *arg2)
|
||||||
return (*(player_t **)arg2)->killcount - (*(player_t **)arg1)->killcount;
|
return (*(player_t **)arg2)->killcount - (*(player_t **)arg1)->killcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int STACK_ARGS compareteams (const void *arg1, const void *arg2)
|
||||||
|
{
|
||||||
|
return (*(player_t **)arg1)->userinfo.team - (*(player_t **)arg2)->userinfo.team;
|
||||||
|
}
|
||||||
|
|
||||||
// CODE --------------------------------------------------------------------
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -97,6 +99,25 @@ static int STACK_ARGS compare (const void *arg1, const void *arg2)
|
||||||
|
|
||||||
void HU_DrawScores (player_t *player)
|
void HU_DrawScores (player_t *player)
|
||||||
{
|
{
|
||||||
|
if (deathmatch)
|
||||||
|
{
|
||||||
|
if (teamplay)
|
||||||
|
{
|
||||||
|
if (!sb_teamdeathmatch_enable)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!sb_deathmatch_enable)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!sb_cooperative_enable)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int i, j;
|
int i, j;
|
||||||
player_t *sortedplayers[MAXPLAYERS];
|
player_t *sortedplayers[MAXPLAYERS];
|
||||||
|
|
||||||
|
@ -111,31 +132,42 @@ void HU_DrawScores (player_t *player)
|
||||||
sortedplayers[j] = &players[i];
|
sortedplayers[j] = &players[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
qsort (sortedplayers, MAXPLAYERS, sizeof(player_t *), compare);
|
if (teamplay)
|
||||||
|
qsort (sortedplayers, MAXPLAYERS, sizeof(player_t *), compareteams);
|
||||||
if (deathmatch && teamplay)
|
|
||||||
HU_DrawTeamScores (player, sortedplayers);
|
|
||||||
else
|
else
|
||||||
HU_DrawNonTeamScores (player, sortedplayers);
|
qsort (sortedplayers, MAXPLAYERS, sizeof(player_t *), comparepoints);
|
||||||
|
|
||||||
|
HU_DoDrawScores (player, sortedplayers);
|
||||||
|
|
||||||
BorderNeedRefresh = screen->GetPageCount ();
|
BorderNeedRefresh = screen->GetPageCount ();
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// HU_DrawNonTeamScores
|
// HU_DoDrawScores
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static void HU_DrawNonTeamScores (player_t *player, player_t *sortedplayers[MAXPLAYERS])
|
static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYERS])
|
||||||
{
|
{
|
||||||
int color;
|
int color;
|
||||||
int height = screen->Font->GetHeight() * CleanYfac;
|
int height = screen->Font->GetHeight() * CleanYfac;
|
||||||
int i;
|
int i;
|
||||||
int maxwidth = 0;
|
int maxwidth = 0;
|
||||||
|
int numTeams = 0;
|
||||||
int x ,y;
|
int x ,y;
|
||||||
|
|
||||||
deathmatch ? color = sb_deathmatch_headingcolor : color = sb_cooperative_headingcolor;
|
if (deathmatch)
|
||||||
|
{
|
||||||
|
if (teamplay)
|
||||||
|
color = sb_teamdeathmatch_headingcolor;
|
||||||
|
else
|
||||||
|
color = sb_deathmatch_headingcolor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
color = sb_cooperative_headingcolor;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
@ -147,10 +179,49 @@ static void HU_DrawNonTeamScores (player_t *player, player_t *sortedplayers[MAXP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gamestate == GS_INTERMISSION ? y = SCREENHEIGHT / 4 : y = SCREENHEIGHT / 16;
|
gamestate == GS_INTERMISSION ? y = SCREENHEIGHT / 3.5 : y = SCREENHEIGHT / 16;
|
||||||
|
|
||||||
HU_DrawTimeRemaining (ST_Y - height);
|
HU_DrawTimeRemaining (ST_Y - height);
|
||||||
|
|
||||||
|
for (i = 0; i < teams.Size (); i++)
|
||||||
|
{
|
||||||
|
teams[i].players = 0;
|
||||||
|
teams[i].score = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
|
{
|
||||||
|
if (playeringame[sortedplayers[i]-players] && TEAMINFO_IsValidTeam (sortedplayers[i]->userinfo.team))
|
||||||
|
{
|
||||||
|
if (teams[sortedplayers[i]->userinfo.team].players++ == 0)
|
||||||
|
{
|
||||||
|
numTeams++;
|
||||||
|
}
|
||||||
|
|
||||||
|
teams[sortedplayers[i]->userinfo.team].score += sortedplayers[i]->fragcount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int scorexwidth = SCREENWIDTH / 32;
|
||||||
|
for (i = 0; i < teams.Size (); i++)
|
||||||
|
{
|
||||||
|
if (teams[i].players)
|
||||||
|
{
|
||||||
|
char score[80];
|
||||||
|
sprintf (score, "%d", teams[i].score);
|
||||||
|
|
||||||
|
screen->SetFont (BigFont);
|
||||||
|
screen->DrawText (teams[i].GetTextColor (), scorexwidth, gamestate == GS_INTERMISSION ? y / 1.25 : y / 2, score,
|
||||||
|
DTA_CleanNoMove, true, TAG_DONE);
|
||||||
|
|
||||||
|
scorexwidth += SCREENWIDTH / 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gamestate == GS_INTERMISSION ? y += 0 : y += SCREENWIDTH / 32;
|
||||||
|
|
||||||
|
screen->SetFont (SmallFont);
|
||||||
|
|
||||||
screen->DrawText (color, SCREENWIDTH / 32, y, "Color",
|
screen->DrawText (color, SCREENWIDTH / 32, y, "Color",
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
DTA_CleanNoMove, true, TAG_DONE);
|
||||||
|
|
||||||
|
@ -163,6 +234,8 @@ static void HU_DrawNonTeamScores (player_t *player, player_t *sortedplayers[MAXP
|
||||||
x = (SCREENWIDTH >> 1) - (((maxwidth + 32 + 32 + 16) * CleanXfac) >> 1);
|
x = (SCREENWIDTH >> 1) - (((maxwidth + 32 + 32 + 16) * CleanXfac) >> 1);
|
||||||
gamestate == GS_INTERMISSION ? y = SCREENHEIGHT / 3.5 : y = SCREENHEIGHT / 10;
|
gamestate == GS_INTERMISSION ? y = SCREENHEIGHT / 3.5 : y = SCREENHEIGHT / 10;
|
||||||
|
|
||||||
|
y += SCREENWIDTH / 32;
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS && y < ST_Y - 12 * CleanYfac; i++)
|
for (i = 0; i < MAXPLAYERS && y < ST_Y - 12 * CleanYfac; i++)
|
||||||
{
|
{
|
||||||
if (playeringame[sortedplayers[i] - players])
|
if (playeringame[sortedplayers[i] - players])
|
||||||
|
@ -173,86 +246,6 @@ static void HU_DrawNonTeamScores (player_t *player, player_t *sortedplayers[MAXP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// HU_DrawTeamScores
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
static void HU_DrawTeamScores (player_t *player, player_t *sorted[MAXPLAYERS])
|
|
||||||
{
|
|
||||||
static const int teamColors[NUM_TEAMS] = { CR_RED, CR_BLUE, CR_GREEN, CR_GOLD };
|
|
||||||
|
|
||||||
char str[80];
|
|
||||||
int height = screen->Font->GetHeight() * CleanYfac;
|
|
||||||
int teamPlayers[NUM_TEAMS] = { 0 }, teamSlot[NUM_TEAMS];
|
|
||||||
int teamX[NUM_TEAMS], teamY[NUM_TEAMS], teamScore[NUM_TEAMS] = { 0 };
|
|
||||||
int numTeams = 0;
|
|
||||||
int i, j, tallest;
|
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
|
||||||
{
|
|
||||||
if (playeringame[sorted[i]-players] && sorted[i]->userinfo.team < NUM_TEAMS)
|
|
||||||
{
|
|
||||||
if (teamPlayers[sorted[i]->userinfo.team]++ == 0)
|
|
||||||
{
|
|
||||||
numTeams++;
|
|
||||||
}
|
|
||||||
teamScore[sorted[i]->userinfo.team] += sorted[i]->fragcount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numTeams == 0)
|
|
||||||
{
|
|
||||||
HU_DrawNonTeamScores (player, sorted);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HU_DrawTimeRemaining (ST_Y - height);
|
|
||||||
|
|
||||||
screen->SetFont (BigFont);
|
|
||||||
|
|
||||||
for (i = j = tallest = 0; i < NUM_TEAMS; ++i)
|
|
||||||
{
|
|
||||||
if (teamPlayers[i])
|
|
||||||
{
|
|
||||||
teamPlayers[j] = teamPlayers[i];
|
|
||||||
teamSlot[i] = j;
|
|
||||||
|
|
||||||
if (j < 2 && teamPlayers[i] > tallest)
|
|
||||||
{
|
|
||||||
tallest = teamPlayers[i];
|
|
||||||
}
|
|
||||||
else if (j == 2)
|
|
||||||
{
|
|
||||||
tallest = tallest * (height+CleanYfac) + 36*CleanYfac + teamY[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
teamX[j] = (j&1) ? (SCREENWIDTH+teamX[0]) >> 1 : 10*CleanXfac;
|
|
||||||
teamY[j] = (j&2) ? tallest : (gamestate==GS_LEVEL?32*CleanYfac:
|
|
||||||
(56-100)*CleanYfac+(SCREENHEIGHT/2));
|
|
||||||
|
|
||||||
sprintf (str, "%s: %d", TeamNames[i], teamScore[i]);
|
|
||||||
screen->DrawText (teamColors[i], teamX[j],
|
|
||||||
teamY[j] - 20*CleanYfac, str, DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
screen->SetFont (SmallFont);
|
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
|
||||||
{
|
|
||||||
if (playeringame[sorted[i]-players] && sorted[i]->userinfo.team < NUM_TEAMS)
|
|
||||||
{
|
|
||||||
int slot = teamSlot[sorted[i]->userinfo.team];
|
|
||||||
HU_DrawPlayer (sorted[i], player==sorted[i], teamX[slot], teamY[slot], height, true);
|
|
||||||
teamY[slot] += height + CleanYfac;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// HU_DrawTimeRemaining
|
// HU_DrawTimeRemaining
|
||||||
|
@ -304,50 +297,31 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int x, int y, int h
|
||||||
color = ColorMatcher.Pick (clamp (int(r*255.f),0,255),
|
color = ColorMatcher.Pick (clamp (int(r*255.f),0,255),
|
||||||
clamp (int(g*255.f),0,255), clamp (int(b*255.f),0,255));
|
clamp (int(g*255.f),0,255), clamp (int(b*255.f),0,255));
|
||||||
|
|
||||||
if (deathmatch && teamplay)
|
screen->Clear (SCREENWIDTH / 24, y, SCREENWIDTH / 24 + 24*CleanXfac, y + height, color);
|
||||||
|
|
||||||
|
if (teamplay)
|
||||||
{
|
{
|
||||||
screen->Clear (x, y, x + 24*CleanXfac, y + height, color);
|
color = teams[player->userinfo.team].GetTextColor ();
|
||||||
|
|
||||||
if (player->mo->ScoreIcon > 0)
|
|
||||||
{
|
|
||||||
screen->DrawTexture (TexMan[player->mo->ScoreIcon], x+(pack?20:32)*CleanXfac, y,
|
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf (str, "%d", player->fragcount);
|
|
||||||
|
|
||||||
if (!highlight)
|
|
||||||
color = sb_teamdeathmatch_otherplayercolor;
|
|
||||||
else
|
|
||||||
color = sb_teamdeathmatch_yourplayercolor;
|
|
||||||
|
|
||||||
screen->DrawText (color, x+(pack?28:40)*CleanXfac, y, str,
|
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
|
|
||||||
screen->DrawText (color, x + (pack?54:72)*CleanXfac, y, player->userinfo.netname,
|
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
screen->Clear (SCREENWIDTH / 24, y, SCREENWIDTH / 24 + 24*CleanXfac, y + height, color);
|
|
||||||
|
|
||||||
if (!highlight)
|
if (!highlight)
|
||||||
deathmatch ? color = sb_deathmatch_otherplayercolor : color = sb_cooperative_otherplayercolor;
|
deathmatch ? color = sb_deathmatch_otherplayercolor : color = sb_cooperative_otherplayercolor;
|
||||||
else
|
else
|
||||||
deathmatch ? color = sb_deathmatch_yourplayercolor : color = sb_cooperative_yourplayercolor;
|
deathmatch ? color = sb_deathmatch_yourplayercolor : color = sb_cooperative_yourplayercolor;
|
||||||
|
}
|
||||||
|
|
||||||
sprintf (str, "%d", deathmatch ? player->fragcount : player->killcount);
|
sprintf (str, "%d", deathmatch ? player->fragcount : player->killcount);
|
||||||
|
|
||||||
screen->DrawText (color, SCREENWIDTH / 4, y, str,
|
screen->DrawText (color, SCREENWIDTH / 4, y, str,
|
||||||
|
DTA_CleanNoMove, true, TAG_DONE);
|
||||||
|
|
||||||
|
screen->DrawText (color, SCREENWIDTH / 2, y, player->userinfo.netname,
|
||||||
|
DTA_CleanNoMove, true, TAG_DONE);
|
||||||
|
|
||||||
|
if (player->mo->ScoreIcon > 0)
|
||||||
|
{
|
||||||
|
screen->DrawTexture (TexMan[player->mo->ScoreIcon], SCREENWIDTH / 2.25, y,
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
DTA_CleanNoMove, true, TAG_DONE);
|
||||||
|
|
||||||
screen->DrawText (color, SCREENWIDTH / 2, y, player->userinfo.netname,
|
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
|
|
||||||
if (player->mo->ScoreIcon > 0)
|
|
||||||
{
|
|
||||||
screen->DrawTexture (TexMan[player->mo->ScoreIcon], SCREENWIDTH / 2.25, y,
|
|
||||||
DTA_CleanNoMove, true, TAG_DONE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "p_tick.h"
|
#include "p_tick.h"
|
||||||
#include "st_start.h"
|
#include "st_start.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -2078,8 +2079,8 @@ static void M_PlayerSetupDrawer ()
|
||||||
screen->DrawText (label, PSetupDef.x, PSetupDef.y + LINEHEIGHT+yo, "Team",
|
screen->DrawText (label, PSetupDef.x, PSetupDef.y + LINEHEIGHT+yo, "Team",
|
||||||
DTA_Clean, true, TAG_DONE);
|
DTA_Clean, true, TAG_DONE);
|
||||||
screen->DrawText (value, x, PSetupDef.y + LINEHEIGHT+yo,
|
screen->DrawText (value, x, PSetupDef.y + LINEHEIGHT+yo,
|
||||||
(unsigned)players[consoleplayer].userinfo.team >= NUM_TEAMS ? "None" :
|
!TEAMINFO_IsValidTeam (players[consoleplayer].userinfo.team) ? "None" :
|
||||||
TeamNames[players[consoleplayer].userinfo.team],
|
teams[players[consoleplayer].userinfo.team].name,
|
||||||
DTA_Clean, true, TAG_DONE);
|
DTA_Clean, true, TAG_DONE);
|
||||||
|
|
||||||
// Draw player character
|
// Draw player character
|
||||||
|
@ -2548,7 +2549,7 @@ static void M_ChangePlayerTeam (int choice)
|
||||||
}
|
}
|
||||||
else if (team == TEAM_None)
|
else if (team == TEAM_None)
|
||||||
{
|
{
|
||||||
team = NUM_TEAMS-1;
|
team = teams.Size () - 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2557,7 +2558,7 @@ static void M_ChangePlayerTeam (int choice)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (team == NUM_TEAMS-1)
|
if (team == teams.Size () - 1)
|
||||||
{
|
{
|
||||||
team = TEAM_None;
|
team = TEAM_None;
|
||||||
}
|
}
|
||||||
|
|
|
@ -828,8 +828,7 @@ EXTERN_CVAR (Int, sb_deathmatch_yourplayercolor)
|
||||||
EXTERN_CVAR (Int, sb_deathmatch_otherplayercolor)
|
EXTERN_CVAR (Int, sb_deathmatch_otherplayercolor)
|
||||||
|
|
||||||
EXTERN_CVAR (Bool, sb_teamdeathmatch_enable)
|
EXTERN_CVAR (Bool, sb_teamdeathmatch_enable)
|
||||||
EXTERN_CVAR (Int, sb_teamdeathmatch_yourplayercolor)
|
EXTERN_CVAR (Int, sb_teamdeathmatch_headingcolor)
|
||||||
EXTERN_CVAR (Int, sb_teamdeathmatch_otherplayercolor)
|
|
||||||
|
|
||||||
static menuitem_t ScoreboardItems[] = {
|
static menuitem_t ScoreboardItems[] = {
|
||||||
{ whitetext, "Cooperative Options", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
{ whitetext, "Cooperative Options", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
||||||
|
@ -851,8 +850,7 @@ static menuitem_t ScoreboardItems[] = {
|
||||||
{ whitetext, "Team Deathmatch Options", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
{ whitetext, "Team Deathmatch Options", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
||||||
{ redtext, " ", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
{ redtext, " ", {NULL}, {0.0}, {0.0}, {0.0}, {NULL} },
|
||||||
{ discrete, "Enable Scoreboard", {&sb_teamdeathmatch_enable}, {21.0}, {0.0}, {0.0}, {YesNo} },
|
{ discrete, "Enable Scoreboard", {&sb_teamdeathmatch_enable}, {21.0}, {0.0}, {0.0}, {YesNo} },
|
||||||
{ cdiscrete, "Your Player Color", {&sb_teamdeathmatch_yourplayercolor}, {21.0}, {0.0}, {0.0}, {TextColors} },
|
{ cdiscrete, "Header Color", {&sb_teamdeathmatch_headingcolor}, {21.0}, {0.0}, {0.0}, {TextColors} }
|
||||||
{ cdiscrete, "Other Players' Color", {&sb_teamdeathmatch_otherplayercolor}, {21.0}, {0.0}, {0.0}, {TextColors} }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
menu_t ScoreboardMenu =
|
menu_t ScoreboardMenu =
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "p_conversation.h"
|
#include "p_conversation.h"
|
||||||
#include "thingdef/thingdef.h"
|
#include "thingdef/thingdef.h"
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
180
src/teaminfo.cpp
Normal file
180
src/teaminfo.cpp
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
/*
|
||||||
|
** teaminfo.cpp
|
||||||
|
** Implementation of the TEAMINFO lump.
|
||||||
|
**
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** Copyright 2007 Christopher Westley
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions
|
||||||
|
** are met:
|
||||||
|
**
|
||||||
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
|
** documentation and/or other materials provided with the distribution.
|
||||||
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
|
** derived from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HEADER FILES ------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "i_system.h"
|
||||||
|
#include "sc_man.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
#include "v_palette.h"
|
||||||
|
#include "w_wad.h"
|
||||||
|
|
||||||
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TYPES -------------------------------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||||
|
|
||||||
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||||
|
|
||||||
|
void TEAMINFO_Init ();
|
||||||
|
void TEAMINFO_ParseTeam ();
|
||||||
|
|
||||||
|
bool TEAMINFO_IsValidTeam (int team);
|
||||||
|
|
||||||
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
|
|
||||||
|
TArray <TEAMINFO> teams;
|
||||||
|
|
||||||
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
|
||||||
|
static const char *keywords_teaminfo [] = {
|
||||||
|
"PLAYERCOLOR",
|
||||||
|
"TEXTCOLOR",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// TEAMINFO_Init
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void TEAMINFO_Init ()
|
||||||
|
{
|
||||||
|
int lastlump = 0, lump;
|
||||||
|
|
||||||
|
while ((lump = Wads.FindLump ("TEAMINFO", &lastlump)) != -1)
|
||||||
|
{
|
||||||
|
SC_OpenLumpNum (lump, "TEAMINFO");
|
||||||
|
while (SC_GetString ())
|
||||||
|
{
|
||||||
|
if (SC_Compare("CLEARTEAMS"))
|
||||||
|
teams.Clear ();
|
||||||
|
else if (SC_Compare("TEAM"))
|
||||||
|
TEAMINFO_ParseTeam ();
|
||||||
|
else
|
||||||
|
SC_ScriptError ("Unknown command %s in TEAMINFO", sc_String);
|
||||||
|
}
|
||||||
|
SC_Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (teams.Size () == 0)
|
||||||
|
I_FatalError ("No teams defined in TEAMINFO");
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// TEAMINFO_ParseTeam
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void TEAMINFO_ParseTeam ()
|
||||||
|
{
|
||||||
|
TEAMINFO team;
|
||||||
|
int i;
|
||||||
|
char *color;
|
||||||
|
|
||||||
|
SC_MustGetString ();
|
||||||
|
team.name = sc_String;
|
||||||
|
|
||||||
|
SC_MustGetStringName("{");
|
||||||
|
while (!SC_CheckString("}"))
|
||||||
|
{
|
||||||
|
SC_MustGetString();
|
||||||
|
switch(i = SC_MatchString (keywords_teaminfo))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
SC_MustGetString ();
|
||||||
|
color = sc_String;
|
||||||
|
team.playercolor = V_GetColor (NULL, color);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
SC_MustGetString();
|
||||||
|
team.textcolor = '[';
|
||||||
|
team.textcolor << sc_String << ']';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
teams.Push (team);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// TEAMINFO_IsValidTeam
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
bool TEAMINFO_IsValidTeam (int team)
|
||||||
|
{
|
||||||
|
if (team < 0 || team >= (signed)teams.Size ())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// TEAMINFO :: GetTextColor
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
int TEAMINFO::GetTextColor () const
|
||||||
|
{
|
||||||
|
if (textcolor.IsEmpty())
|
||||||
|
{
|
||||||
|
return CR_UNTRANSLATED;
|
||||||
|
}
|
||||||
|
const BYTE *cp = (const BYTE *)textcolor.GetChars();
|
||||||
|
int color = V_ParseFontColor(cp, 0, 0);
|
||||||
|
if (color == CR_UNDEFINED)
|
||||||
|
{
|
||||||
|
Printf("Undefined color '%s' in definition of team %s\n", textcolor.GetChars (), name.GetChars ());
|
||||||
|
color = CR_UNTRANSLATED;
|
||||||
|
}
|
||||||
|
return color;
|
||||||
|
}
|
59
src/teaminfo.h
Normal file
59
src/teaminfo.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
** teaminfo.h
|
||||||
|
** Implementation of the TEAMINFO lump.
|
||||||
|
**
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** Copyright 2007 Christopher Westley
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions
|
||||||
|
** are met:
|
||||||
|
**
|
||||||
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
|
** documentation and/or other materials provided with the distribution.
|
||||||
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
|
** derived from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TEAMINFO_H__
|
||||||
|
#define __TEAMINFO_H__
|
||||||
|
|
||||||
|
#define TEAM_None -1
|
||||||
|
|
||||||
|
struct TEAMINFO
|
||||||
|
{
|
||||||
|
FString name;
|
||||||
|
int playercolor;
|
||||||
|
FString textcolor;
|
||||||
|
int GetTextColor () const;
|
||||||
|
int players;
|
||||||
|
int score;
|
||||||
|
int present;
|
||||||
|
int ties;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern TArray <TEAMINFO> teams;
|
||||||
|
|
||||||
|
extern void TEAMINFO_Init ();
|
||||||
|
extern void TEAMINFO_ParseTeam ();
|
||||||
|
|
||||||
|
extern bool TEAMINFO_IsValidTeam (int team);
|
||||||
|
|
||||||
|
#endif
|
49
wadsrc/teaminfo.txt
Normal file
49
wadsrc/teaminfo.txt
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
ClearTeams
|
||||||
|
|
||||||
|
Team "Blue"
|
||||||
|
{
|
||||||
|
PlayerColor "00 00 FF"
|
||||||
|
TextColor "Blue"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Red"
|
||||||
|
{
|
||||||
|
PlayerColor "FF 00 00"
|
||||||
|
TextColor "Red"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Green"
|
||||||
|
{
|
||||||
|
PlayerColor "00 FF 00"
|
||||||
|
TextColor "Green"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Gold"
|
||||||
|
{
|
||||||
|
PlayerColor "FF FF 00"
|
||||||
|
TextColor "Gold"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Black"
|
||||||
|
{
|
||||||
|
PlayerColor "00 00 00"
|
||||||
|
TextColor "Black"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "White"
|
||||||
|
{
|
||||||
|
PlayerColor "FF FF FF"
|
||||||
|
TextColor "White"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Orange"
|
||||||
|
{
|
||||||
|
PlayerColor "FF 80 00"
|
||||||
|
TextColor "Orange"
|
||||||
|
}
|
||||||
|
|
||||||
|
Team "Purple"
|
||||||
|
{
|
||||||
|
PlayerColor "FF 00 FF"
|
||||||
|
TextColor "Purple"
|
||||||
|
}
|
|
@ -39,27 +39,6 @@
|
||||||
CompileAsManaged=""
|
CompileAsManaged=""
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="0"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCNMakeTool"
|
|
||||||
BuildCommandLine="nmake /nologo MAKEWAD=..\tools\makewad\makewad XLATCC=..\tools\xlatcc\xlatcc DEHSUPP=..\tools\dehsupp\dehsupp NOLOGO=/nologo andcopy"
|
|
||||||
ReBuildCommandLine="nmake /nologo MAKEWAD=..\tools\makewad\makewad NOLOGO=/nologo XLATCC=..\tools\xlatcc\xlatcc DEHSUPP=..\tools\dehsupp\dehsupp nrebuild"
|
|
||||||
CleanCommandLine="del wadmake zdoom.pk3"
|
|
||||||
Output="zdoom.pk3"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
IncludeSearchPath=""
|
|
||||||
ForcedIncludes=""
|
|
||||||
AssemblySearchPath=""
|
|
||||||
ForcedUsingAssemblies=""
|
|
||||||
CompileAsManaged=""
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|Win32"
|
Name="Release|Win32"
|
||||||
OutputDirectory="Release"
|
OutputDirectory="Release"
|
||||||
|
@ -81,6 +60,27 @@
|
||||||
CompileAsManaged=""
|
CompileAsManaged=""
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|x64"
|
||||||
|
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="0"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCNMakeTool"
|
||||||
|
BuildCommandLine="nmake /nologo MAKEWAD=..\tools\makewad\makewad XLATCC=..\tools\xlatcc\xlatcc DEHSUPP=..\tools\dehsupp\dehsupp NOLOGO=/nologo andcopy"
|
||||||
|
ReBuildCommandLine="nmake /nologo MAKEWAD=..\tools\makewad\makewad NOLOGO=/nologo XLATCC=..\tools\xlatcc\xlatcc DEHSUPP=..\tools\dehsupp\dehsupp nrebuild"
|
||||||
|
CleanCommandLine="del wadmake zdoom.pk3"
|
||||||
|
Output="zdoom.pk3"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
IncludeSearchPath=""
|
||||||
|
ForcedIncludes=""
|
||||||
|
AssemblySearchPath=""
|
||||||
|
ForcedUsingAssemblies=""
|
||||||
|
CompileAsManaged=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|x64"
|
Name="Release|x64"
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
@ -153,6 +153,10 @@
|
||||||
RelativePath=".\sndseq.txt"
|
RelativePath=".\sndseq.txt"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\teaminfo.txt"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\terrain.txt"
|
RelativePath=".\terrain.txt"
|
||||||
>
|
>
|
||||||
|
|
|
@ -59,6 +59,7 @@ in_htc1.txt in_htc1.txt
|
||||||
in_htc2.txt in_htc2.txt
|
in_htc2.txt in_htc2.txt
|
||||||
in_htc3.txt in_htc3.txt
|
in_htc3.txt in_htc3.txt
|
||||||
lockdefs.txt lockdefs.txt
|
lockdefs.txt lockdefs.txt
|
||||||
|
teaminfo.txt teaminfo.txt
|
||||||
|
|
||||||
========
|
========
|
||||||
# Support lumps
|
# Support lumps
|
||||||
|
|
1244
zdoom.vcproj
1244
zdoom.vcproj
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue