2262 lines
50 KiB
C
2262 lines
50 KiB
C
|
|
//**************************************************************************
|
|
//**
|
|
//** sbar.c
|
|
//**
|
|
//** $Header: /HexenWorld/Client/sbar.c 37 5/31/98 2:58p Mgummelt $
|
|
//**
|
|
//**************************************************************************
|
|
|
|
// HEADER FILES ------------------------------------------------------------
|
|
|
|
#include "quakedef.h"
|
|
|
|
// MACROS ------------------------------------------------------------------
|
|
|
|
#define STAT_MINUS 10 // num frame for '-' stats digit
|
|
|
|
#define BAR_TOP_HEIGHT 46.0
|
|
#define BAR_BOTTOM_HEIGHT 98.0
|
|
#define BAR_TOTAL_HEIGHT (BAR_TOP_HEIGHT+BAR_BOTTOM_HEIGHT)
|
|
#define BAR_BUMP_HEIGHT 23.0
|
|
#define INVENTORY_DISPLAY_TIME 4
|
|
#define ABILITIES_STR_INDEX 400
|
|
|
|
#define RING_FLIGHT 1
|
|
#define RING_WATER 2
|
|
#define RING_REGENERATION 4
|
|
#define RING_TURNING 8
|
|
|
|
#define INV_MAX_CNT 15
|
|
|
|
#define INV_MAX_ICON 6 // Max number of inventory icons to display at once
|
|
|
|
// TYPES -------------------------------------------------------------------
|
|
|
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
|
|
|
void Sbar_DeathmatchOverlay(void);
|
|
void Sbar_NormalOverlay(void);
|
|
|
|
void Sbar_SmallDeathmatchOverlay(void);
|
|
void M_DrawPic(int x, int y, qpic_t *pic);
|
|
|
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
|
|
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
|
|
|
static void Sbar_DrawPic(int x, int y, qpic_t *pic);
|
|
static void Sbar_DrawSubPic(int x, int y, int h, qpic_t *pic);
|
|
static void Sbar_DrawTransPic(int x, int y, qpic_t *pic);
|
|
static int Sbar_itoa(int num, char *buf);
|
|
static void Sbar_DrawNum(int x, int y, int number, int digits);
|
|
void Sbar_SortFrags (qboolean includespec);
|
|
static void Sbar_DrawCharacter(int x, int y, int num);
|
|
static void Sbar_DrawString(int x, int y, char *str);
|
|
static void Sbar_DrawRedString (int cx, int cy, char *str);
|
|
static void Sbar_DrawSmallCharacter(int x, int y, int num);
|
|
static void Sbar_DrawSmallString(int x, int y, char *str);
|
|
static void DrawBarArtifactNumber(int x, int y, int number);
|
|
|
|
static void DrawFullScreenInfo(void);
|
|
static void DrawLowerBar(void);
|
|
static void DrawActiveRings(void);
|
|
static void DrawActiveArtifacts(void);
|
|
static int CalcAC(void);
|
|
static void DrawBarArtifactIcon(int x, int y, int artifact);
|
|
|
|
static qboolean SetChainPosition(float health, float maxHealth);
|
|
|
|
static void ShowInfoDown_f(void);
|
|
static void ShowInfoUp_f(void);
|
|
static void ShowDMDown_f(void);
|
|
static void ShowDMUp_f(void);
|
|
static void ShowNamesDown_f(void);
|
|
static void ShowNamesUp_f(void);
|
|
static void ToggleDM_f(void);
|
|
static void InvLeft_f(void);
|
|
static void InvRight_f(void);
|
|
static void InvUse_f(void);
|
|
static void InvDrop_f(void);
|
|
static void InvOff_f(void);
|
|
|
|
static void DrawArtifactInventory(void);
|
|
|
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
|
|
|
extern int in_impulse;
|
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
|
|
|
int sb_lines; // scan lines to draw
|
|
|
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
|
|
|
static int sb_updates; // if >= vid.numpages, no update needed
|
|
|
|
static float BarHeight;
|
|
static float BarTargetHeight;
|
|
cvar_t BarSpeed = { "barspeed", "5" };
|
|
cvar_t sbtemp = { "sbtemp", "5" };
|
|
cvar_t DMMode = { "dm_mode", "1", true };
|
|
cvar_t sbtrans = { "sbtrans", "0", true };
|
|
|
|
static qpic_t *sb_nums[11];
|
|
static qpic_t *sb_colon, *sb_slash;
|
|
|
|
static int fragsort[MAX_SCOREBOARD];
|
|
|
|
static char scoreboardtext[MAX_SCOREBOARD][20];
|
|
static int scoreboardtop[MAX_SCOREBOARD];
|
|
static int scoreboardbottom[MAX_SCOREBOARD];
|
|
static int scoreboardcount[MAX_SCOREBOARD];
|
|
static int scoreboardlines;
|
|
|
|
static float ChainPosition = 0;
|
|
|
|
static qboolean sb_ShowInfo;
|
|
static qboolean sb_ShowDM;
|
|
static qboolean sb_ShowNames;
|
|
|
|
qboolean inv_flg; // true - show inventory interface
|
|
|
|
static float InventoryHideTime;
|
|
|
|
static char *PlayerClassNames[MAX_PLAYER_CLASS] =
|
|
{
|
|
"Paladin",
|
|
"Crusader",
|
|
"Necromancer",
|
|
"Assassin",
|
|
"Succubus",
|
|
"Dwarf"
|
|
};
|
|
|
|
static int AmuletAC[MAX_PLAYER_CLASS] =
|
|
{
|
|
8, // Paladin
|
|
4, // Crusader
|
|
2, // Necromancer
|
|
6, // Assassin
|
|
6, // Demoness
|
|
0 // Dwarf
|
|
};
|
|
|
|
static int BracerAC[MAX_PLAYER_CLASS] =
|
|
{
|
|
6, // Paladin
|
|
8, // Crusader
|
|
4, // Necromancer
|
|
2, // Assassin
|
|
2, // Demoness
|
|
10 // Demoness
|
|
};
|
|
|
|
static int BreastplateAC[MAX_PLAYER_CLASS] =
|
|
{
|
|
2, // Paladin
|
|
6, // Crusader
|
|
8, // Necromancer
|
|
4, // Assassin
|
|
4, // Demoness
|
|
12 // Dwarf
|
|
};
|
|
|
|
static int HelmetAC[MAX_PLAYER_CLASS] =
|
|
{
|
|
4, // Paladin
|
|
2, // Crusader
|
|
6, // Necromancer
|
|
8, // Assassin
|
|
8, // Demoness
|
|
10 // Dwarf
|
|
};
|
|
|
|
static int AbilityLineIndex[MAX_PLAYER_CLASS] =
|
|
{
|
|
400, // Paladin
|
|
402, // Crusader
|
|
404, // Necromancer
|
|
406, // Assassin
|
|
590, // Demoness
|
|
594 // Dwarf
|
|
};
|
|
// CODE --------------------------------------------------------------------
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_Init
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_Init(void)
|
|
{
|
|
int i;
|
|
|
|
for(i = 0; i < 10; i++)
|
|
{
|
|
sb_nums[i] = Draw_PicFromWad(va("num_%i",i));
|
|
}
|
|
sb_nums[10] = Draw_PicFromWad("num_minus");
|
|
sb_colon = Draw_PicFromWad("num_colon");
|
|
sb_slash = Draw_PicFromWad("num_slash");
|
|
|
|
Cmd_AddCommand("+showinfo", ShowInfoDown_f);
|
|
Cmd_AddCommand("-showinfo", ShowInfoUp_f);
|
|
Cmd_AddCommand("+showdm", ShowDMDown_f);
|
|
Cmd_AddCommand("-showdm", ShowDMUp_f);
|
|
Cmd_AddCommand("+shownames", ShowNamesDown_f);
|
|
Cmd_AddCommand("-shownames", ShowNamesUp_f);
|
|
Cmd_AddCommand("invleft", InvLeft_f);
|
|
Cmd_AddCommand("invright", InvRight_f);
|
|
Cmd_AddCommand("invuse", InvUse_f);
|
|
Cmd_AddCommand("invdrop", InvDrop_f);
|
|
Cmd_AddCommand("invoff", InvOff_f);
|
|
Cmd_AddCommand("toggle_dm", ToggleDM_f);
|
|
Cvar_RegisterVariable(&DMMode);
|
|
Cvar_RegisterVariable(&sbtrans);
|
|
|
|
Cvar_RegisterVariable(&BarSpeed);
|
|
Cvar_RegisterVariable(&sbtemp);
|
|
BarHeight = BarTargetHeight = BAR_TOP_HEIGHT;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SB_PlacePlayerNames(void)
|
|
{
|
|
int i,j;
|
|
entity_t *currententity;
|
|
|
|
for (j=0;j<cl_numvisedicts;j++)
|
|
{
|
|
currententity = &cl_visedicts[j];
|
|
|
|
i = currententity->scoreboard - cl.players;
|
|
/* if (i >= 0 && i<MAX_CLIENTS &&
|
|
(
|
|
(cl.PIV & (1<<i))&&//in PIV and not invis or seen by dwarf MLS_INVIS = 5
|
|
(currententity->drawflags!=5||cl.v.playerclass==CLASS_DWARF)
|
|
)
|
|
)*/
|
|
if (i >= 0 && i<MAX_CLIENTS && (cl.PIV & (1<<i)) )
|
|
{
|
|
if(!cl.players[i].shownames_off)
|
|
{
|
|
if(cl_siege)
|
|
{//why the fuck does GL fuck this up??!!!
|
|
if(cl.players[i].siege_team==ST_ATTACKER)//attacker
|
|
{
|
|
if(i==cl_keyholder)
|
|
R_DrawName(currententity->origin, cl.players[i].name,10);
|
|
else
|
|
R_DrawName(currententity->origin, cl.players[i].name,false);
|
|
}
|
|
else if(cl.players[i].siege_team==ST_DEFENDER)//def
|
|
{
|
|
if(i==cl_keyholder&&i==cl_doc)
|
|
R_DrawName(currententity->origin, cl.players[i].name,12);
|
|
else if(i==cl_keyholder)
|
|
R_DrawName(currententity->origin, cl.players[i].name,11);
|
|
else if(i==cl_doc)
|
|
R_DrawName(currententity->origin, cl.players[i].name,2);
|
|
else
|
|
R_DrawName(currententity->origin, cl.players[i].name,1);
|
|
}
|
|
else
|
|
R_DrawName(currententity->origin, cl.players[i].name,3);
|
|
}
|
|
else
|
|
R_DrawName(currententity->origin, cl.players[i].name,false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_Draw
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_Draw(void)
|
|
{
|
|
float delta;
|
|
char tempStr[80];
|
|
int mana;
|
|
int maxMana;
|
|
int y;
|
|
|
|
if (sb_ShowNames)
|
|
{
|
|
SB_PlacePlayerNames();
|
|
}
|
|
|
|
if (scr_con_current == vid.height)
|
|
{ // console is full screen
|
|
return;
|
|
}
|
|
|
|
if (cl.spectator)
|
|
{
|
|
if (sb_ShowDM)
|
|
{
|
|
//rjr if (cl.gametype == GAME_DEATHMATCH)
|
|
Sbar_DeathmatchOverlay();
|
|
//rjr else
|
|
//rjr Sbar_NormalOverlay();
|
|
}
|
|
else if (DMMode.value)
|
|
{
|
|
Sbar_SmallDeathmatchOverlay();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
trans_level = (int)sbtrans.value;
|
|
if (trans_level < 0 || trans_level > 2)
|
|
{
|
|
trans_level = 0;
|
|
}
|
|
|
|
// Draw always until we fix things
|
|
//if (sb_updates >= vid.numpages)
|
|
// return;
|
|
|
|
/* if(BarHeight == BarTargetHeight)
|
|
{
|
|
return;
|
|
}
|
|
*/
|
|
|
|
if(BarHeight < BarTargetHeight)
|
|
{
|
|
delta = ((BarTargetHeight-BarHeight)*BarSpeed.value)
|
|
*host_frametime;
|
|
if(delta < 0.5)
|
|
{
|
|
delta = 0.5;
|
|
}
|
|
BarHeight += delta;
|
|
if(BarHeight > BarTargetHeight)
|
|
{
|
|
BarHeight = BarTargetHeight;
|
|
}
|
|
scr_fullupdate = 0;
|
|
}
|
|
else if(BarHeight > BarTargetHeight)
|
|
{
|
|
delta = ((BarHeight-BarTargetHeight)*BarSpeed.value)
|
|
*host_frametime;
|
|
if(delta < 0.5)
|
|
{
|
|
delta = 0.5;
|
|
}
|
|
BarHeight -= delta;
|
|
if(BarHeight < BarTargetHeight)
|
|
{
|
|
BarHeight = BarTargetHeight;
|
|
}
|
|
scr_fullupdate = 0;
|
|
}
|
|
|
|
|
|
scr_copyeverything = 1;
|
|
sb_updates++;
|
|
|
|
|
|
if(BarHeight < 0)
|
|
{
|
|
DrawFullScreenInfo();
|
|
}
|
|
|
|
//Sbar_DrawPic(0, 0, Draw_CachePic("gfx/topbar.lmp"));
|
|
Sbar_DrawPic(0, 0, Draw_CachePic("gfx/topbar1.lmp"));
|
|
Sbar_DrawPic(160, 0, Draw_CachePic("gfx/topbar2.lmp"));
|
|
Sbar_DrawTransPic(0, -23, Draw_CachePic("gfx/topbumpl.lmp"));
|
|
Sbar_DrawTransPic(138, -8, Draw_CachePic("gfx/topbumpm.lmp"));
|
|
Sbar_DrawTransPic(269, -23, Draw_CachePic("gfx/topbumpr.lmp"));
|
|
|
|
maxMana = (int)cl.v.max_mana;
|
|
// Blue mana
|
|
mana = (int)cl.v.bluemana;
|
|
if(mana < 0)
|
|
{
|
|
mana = 0;
|
|
}
|
|
if(mana > maxMana)
|
|
{
|
|
mana = maxMana;
|
|
}
|
|
sprintf(tempStr, "%03d", mana);
|
|
Sbar_DrawSmallString(201, 22, tempStr);
|
|
if(mana)
|
|
{
|
|
y = (int)((mana*18.0)/(float)maxMana+0.5);
|
|
Sbar_DrawSubPic(190, 26-y, y+1,
|
|
Draw_CachePic("gfx/bmana.lmp"));
|
|
Sbar_DrawPic(190, 27, Draw_CachePic("gfx/bmanacov.lmp"));
|
|
}
|
|
|
|
// Green mana
|
|
mana = (int)cl.v.greenmana;
|
|
if(mana < 0)
|
|
{
|
|
mana = 0;
|
|
}
|
|
if(mana > maxMana)
|
|
{
|
|
mana = maxMana;
|
|
}
|
|
sprintf(tempStr, "%03d", mana);
|
|
Sbar_DrawSmallString(243, 22, tempStr);
|
|
if(mana)
|
|
{
|
|
y = (int)((mana*18.0)/(float)maxMana+0.5);
|
|
Sbar_DrawSubPic(232, 26-y, y+1,
|
|
Draw_CachePic("gfx/gmana.lmp"));
|
|
Sbar_DrawPic(232, 27, Draw_CachePic("gfx/gmanacov.lmp"));
|
|
}
|
|
|
|
// HP
|
|
if (cl.v.health < -99)
|
|
Sbar_DrawNum(58, 14, -99, 3);
|
|
else
|
|
Sbar_DrawNum(58, 14, cl.v.health, 3);
|
|
SetChainPosition(cl.v.health, cl.v.max_health);
|
|
Sbar_DrawTransPic(45+((int)ChainPosition&7), 38,
|
|
Draw_CachePic("gfx/hpchain.lmp"));
|
|
Sbar_DrawTransPic(45+(int)ChainPosition, 36,
|
|
Draw_CachePic("gfx/hpgem.lmp"));
|
|
Sbar_DrawPic(43, 36, Draw_CachePic("gfx/chnlcov.lmp"));
|
|
Sbar_DrawPic(267, 36, Draw_CachePic("gfx/chnrcov.lmp"));
|
|
|
|
// AC
|
|
Sbar_DrawNum(105, 14, CalcAC(), 2);
|
|
|
|
if(BarHeight > BAR_TOP_HEIGHT)
|
|
{
|
|
DrawLowerBar();
|
|
}
|
|
|
|
// Current inventory item
|
|
if(cl.inv_selected >= 0)
|
|
{
|
|
DrawBarArtifactIcon(144, 3, cl.inv_order[cl.inv_selected]);
|
|
|
|
//Sbar_DrawTransPic(144, 3, Draw_CachePic(va("gfx/arti%02d.lmp",
|
|
// cl.inv_order[cl.inv_selected])));
|
|
}
|
|
|
|
// FIXME: Check for deathmatch and draw frags
|
|
// if(cl.maxclients != 1) Sbar_Draw
|
|
|
|
DrawArtifactInventory();
|
|
|
|
DrawActiveRings();
|
|
DrawActiveArtifacts();
|
|
|
|
trans_level = 0;
|
|
|
|
if (sb_ShowDM)
|
|
{
|
|
//rjr if (cl.gametype == GAME_DEATHMATCH)
|
|
Sbar_DeathmatchOverlay();
|
|
//rjr else
|
|
//rjr Sbar_NormalOverlay();
|
|
}
|
|
else if (DMMode.value)
|
|
{
|
|
Sbar_SmallDeathmatchOverlay();
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SetChainPosition
|
|
//
|
|
//==========================================================================
|
|
|
|
static qboolean SetChainPosition(float health, float maxHealth)
|
|
{
|
|
float delta;
|
|
float chainTargetPosition;
|
|
|
|
if(health < 0)
|
|
{
|
|
health = 0;
|
|
}
|
|
else if(health > maxHealth)
|
|
{
|
|
health = maxHealth;
|
|
}
|
|
chainTargetPosition = (health*195)/maxHealth;
|
|
if(fabs(ChainPosition-chainTargetPosition) < 0.1)
|
|
{
|
|
return false;
|
|
}
|
|
if(ChainPosition < chainTargetPosition)
|
|
{
|
|
delta = ((chainTargetPosition-ChainPosition)*5)*host_frametime;
|
|
if(delta < 0.5)
|
|
{
|
|
delta = 0.5;
|
|
}
|
|
ChainPosition += delta;
|
|
if(ChainPosition > chainTargetPosition)
|
|
{
|
|
ChainPosition = chainTargetPosition;
|
|
}
|
|
}
|
|
else if(ChainPosition > chainTargetPosition)
|
|
{
|
|
delta = ((ChainPosition-chainTargetPosition)*5)*host_frametime;
|
|
if(delta < 0.5)
|
|
{
|
|
delta = 0.5;
|
|
}
|
|
ChainPosition -= delta;
|
|
if(ChainPosition < chainTargetPosition)
|
|
{
|
|
ChainPosition = chainTargetPosition;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawFullScreenInfo
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DrawFullScreenInfo(void)
|
|
{
|
|
int y;
|
|
int mana;
|
|
int maxMana;
|
|
char tempStr[80];
|
|
|
|
y = BarHeight-37;
|
|
Sbar_DrawPic(3, y, Draw_CachePic("gfx/bmmana.lmp"));
|
|
Sbar_DrawPic(3, y+18, Draw_CachePic("gfx/gmmana.lmp"));
|
|
|
|
maxMana = (int)cl.v.max_mana;
|
|
// Blue mana
|
|
mana = (int)cl.v.bluemana;
|
|
if(mana < 0)
|
|
{
|
|
mana = 0;
|
|
}
|
|
if(mana > maxMana)
|
|
{
|
|
mana = maxMana;
|
|
}
|
|
sprintf(tempStr, "%03d", mana);
|
|
Sbar_DrawSmallString(10, y+6, tempStr);
|
|
|
|
// Green mana
|
|
mana = (int)cl.v.greenmana;
|
|
if(mana < 0)
|
|
{
|
|
mana = 0;
|
|
}
|
|
if(mana > maxMana)
|
|
{
|
|
mana = maxMana;
|
|
}
|
|
sprintf(tempStr, "%03d", mana);
|
|
Sbar_DrawSmallString(10, y+18+6, tempStr);
|
|
|
|
// HP
|
|
Sbar_DrawNum(38, y+18, cl.v.health, 3);
|
|
|
|
// Current inventory item
|
|
if(cl.inv_selected >= 0)
|
|
{
|
|
DrawBarArtifactIcon(288, y+7, cl.inv_order[cl.inv_selected]);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawLowerBar
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DrawLowerBar(void)
|
|
{
|
|
int i;
|
|
int minutes, seconds, tens, units;
|
|
char tempStr[80];
|
|
int playerClass;
|
|
int piece;
|
|
int ringhealth;
|
|
|
|
playerClass = cl.players[cl.playernum].playerclass;
|
|
// playerClass = playerclass.value;
|
|
if(playerClass < 1 || playerClass > MAX_PLAYER_CLASS)
|
|
{ // Default to paladin
|
|
playerClass = 1;
|
|
}
|
|
|
|
// Backdrop
|
|
//Sbar_DrawPic(0, 46, Draw_CachePic("gfx/btmbar.lmp"));
|
|
Sbar_DrawPic(0, 46, Draw_CachePic("gfx/btmbar1.lmp"));
|
|
Sbar_DrawPic(160, 46, Draw_CachePic("gfx/btmbar2.lmp"));
|
|
|
|
// Game time
|
|
//minutes = cl.time / 60;
|
|
//seconds = cl.time - 60*minutes;
|
|
//tens = seconds / 10;
|
|
//units = seconds - 10*tens;
|
|
//sprintf(tempStr, "Time :%3i:%i%i", minutes, tens, units);
|
|
//Sbar_DrawSmallString(116, 114, tempStr);
|
|
|
|
// Map name
|
|
//Sbar_DrawSmallString(10, 114, cl.levelname);
|
|
|
|
// Stats
|
|
Sbar_DrawSmallString(11, 48, PlayerClassNames[playerClass-1]);
|
|
|
|
Sbar_DrawSmallString(11, 58, "int");
|
|
sprintf(tempStr, "%02d", (int)cl.v.intelligence);
|
|
Sbar_DrawSmallString(33, 58, tempStr);
|
|
|
|
Sbar_DrawSmallString(11, 64, "wis");
|
|
sprintf(tempStr, "%02d", (int)cl.v.wisdom);
|
|
Sbar_DrawSmallString(33, 64, tempStr);
|
|
|
|
Sbar_DrawSmallString(11, 70, "dex");
|
|
sprintf(tempStr, "%02d", (int)cl.v.dexterity);
|
|
Sbar_DrawSmallString(33, 70, tempStr);
|
|
|
|
Sbar_DrawSmallString(58, 58, "str");
|
|
sprintf(tempStr, "%02d", (int)cl.v.strength);
|
|
Sbar_DrawSmallString(80, 58, tempStr);
|
|
|
|
Sbar_DrawSmallString(58, 64, "lvl");
|
|
sprintf(tempStr, "%02d", (int)cl.v.level);
|
|
Sbar_DrawSmallString(80, 64, tempStr);
|
|
|
|
Sbar_DrawSmallString(58, 70, "exp");
|
|
sprintf(tempStr, "%06d", (int)cl.v.experience);
|
|
Sbar_DrawSmallString(80, 70, tempStr);
|
|
|
|
// Abilities
|
|
Sbar_DrawSmallString(11, 79, "abilities");
|
|
i = AbilityLineIndex[(playerClass-1)];
|
|
if(i+1 < pr_string_count)
|
|
{
|
|
if(((int)cl.v.flags)&FL_SPECIAL_ABILITY1)
|
|
{
|
|
Sbar_DrawSmallString(8, 89,
|
|
&pr_global_strings[pr_string_index[i]]);
|
|
}
|
|
if(((int)cl.v.flags)&FL_SPECIAL_ABILITY2)
|
|
{
|
|
Sbar_DrawSmallString(8, 96,
|
|
&pr_global_strings[pr_string_index[i+1]]);
|
|
}
|
|
}
|
|
|
|
// Portrait
|
|
sprintf(tempStr, "gfx/cport%d.lmp", playerClass);
|
|
Sbar_DrawPic(134, 50, Draw_CachePic(tempStr));
|
|
|
|
// Armor
|
|
if(cl.v.armor_helmet > 0)
|
|
{
|
|
Sbar_DrawPic(164, 115, Draw_CachePic("gfx/armor1.lmp"));
|
|
sprintf(tempStr, "+%d", (int)cl.v.armor_helmet);
|
|
Sbar_DrawSmallString(168, 136, tempStr);
|
|
}
|
|
if(cl.v.armor_amulet > 0)
|
|
{
|
|
Sbar_DrawPic(205, 115, Draw_CachePic("gfx/armor2.lmp"));
|
|
sprintf(tempStr, "+%d", (int)cl.v.armor_amulet);
|
|
Sbar_DrawSmallString(208, 136, tempStr);
|
|
}
|
|
if(cl.v.armor_breastplate > 0)
|
|
{
|
|
Sbar_DrawPic(246, 115, Draw_CachePic("gfx/armor3.lmp"));
|
|
sprintf(tempStr, "+%d", (int)cl.v.armor_breastplate);
|
|
Sbar_DrawSmallString(249, 136, tempStr);
|
|
}
|
|
if(cl.v.armor_bracer > 0)
|
|
{
|
|
Sbar_DrawPic(285, 115, Draw_CachePic("gfx/armor4.lmp"));
|
|
sprintf(tempStr, "+%d", (int)cl.v.armor_bracer);
|
|
Sbar_DrawSmallString(288, 136, tempStr);
|
|
}
|
|
|
|
// Rings
|
|
if(cl.v.ring_flight > 0)
|
|
{
|
|
Sbar_DrawTransPic(6, 119, Draw_CachePic("gfx/ring_f.lmp"));
|
|
|
|
ringhealth = (int)cl.v.ring_flight;
|
|
if(ringhealth > 100)
|
|
ringhealth = 100;
|
|
Sbar_DrawPic( 35 - (int)(26 * (ringhealth/(float)100)),142,Draw_CachePic("gfx/ringhlth.lmp"));
|
|
Sbar_DrawPic( 35, 142, Draw_CachePic("gfx/rhlthcvr.lmp"));
|
|
}
|
|
|
|
if(cl.v.ring_water > 0)
|
|
{
|
|
Sbar_DrawTransPic(44, 119, Draw_CachePic("gfx/ring_w.lmp"));
|
|
ringhealth = (int)cl.v.ring_water;
|
|
if(ringhealth > 100)
|
|
ringhealth = 100;
|
|
Sbar_DrawPic( 73 - (int)(26 * (ringhealth/(float)100)),142,Draw_CachePic("gfx/ringhlth.lmp"));
|
|
Sbar_DrawPic( 73, 142, Draw_CachePic("gfx/rhlthcvr.lmp"));
|
|
}
|
|
|
|
if(cl.v.ring_turning > 0)
|
|
{
|
|
Sbar_DrawTransPic(81, 119, Draw_CachePic("gfx/ring_t.lmp"));
|
|
ringhealth = (int)cl.v.ring_turning;
|
|
if(ringhealth > 100)
|
|
ringhealth = 100;
|
|
Sbar_DrawPic( 110 - (int)(26 * (ringhealth/(float)100)),142,Draw_CachePic("gfx/ringhlth.lmp"));
|
|
Sbar_DrawPic( 110, 142, Draw_CachePic("gfx/rhlthcvr.lmp"));
|
|
}
|
|
|
|
if(cl.v.ring_regeneration > 0)
|
|
{
|
|
Sbar_DrawTransPic(119, 119, Draw_CachePic("gfx/ring_r.lmp"));
|
|
ringhealth = (int)cl.v.ring_regeneration;
|
|
if(ringhealth > 100)
|
|
ringhealth = 100;
|
|
Sbar_DrawPic( 148 -(int)(26 * (ringhealth/(float)100)),142,Draw_CachePic("gfx/ringhlth.lmp"));
|
|
Sbar_DrawPic( 148, 142, Draw_CachePic("gfx/rhlthcv2.lmp"));
|
|
}
|
|
|
|
// Puzzle pieces
|
|
piece = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
if(cl.puzzle_pieces[i][0] == 0)
|
|
{
|
|
continue;
|
|
}
|
|
Sbar_DrawPic(194+(piece%4)*31, piece < 4 ? 51 : 82,
|
|
Draw_CachePic(va("gfx/puzzle/%s.lmp", cl.puzzle_pieces[i])));
|
|
piece++;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// CalcAC
|
|
//
|
|
//==========================================================================
|
|
|
|
static int CalcAC(void)
|
|
{
|
|
int a;
|
|
int playerClass;
|
|
|
|
playerClass = cl.v.playerclass;
|
|
if(playerClass < 1 || playerClass > MAX_PLAYER_CLASS)
|
|
{
|
|
playerClass = 1;
|
|
}
|
|
a = 0;
|
|
if(cl.v.armor_amulet > 0)
|
|
{
|
|
a += AmuletAC[playerClass];
|
|
a += cl.v.armor_amulet/5;
|
|
}
|
|
if(cl.v.armor_bracer > 0)
|
|
{
|
|
a += BracerAC[playerClass];
|
|
a += cl.v.armor_bracer/5;
|
|
}
|
|
if(cl.v.armor_breastplate > 0)
|
|
{
|
|
a += BreastplateAC[playerClass];
|
|
a += cl.v.armor_breastplate/5;
|
|
}
|
|
if(cl.v.armor_helmet > 0)
|
|
{
|
|
a += HelmetAC[playerClass];
|
|
a += cl.v.armor_helmet/5;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_Changed
|
|
//
|
|
//==========================================================================
|
|
|
|
void SB_Changed(void)
|
|
{
|
|
sb_updates = 0; // Update next frame
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_itoa
|
|
//
|
|
//==========================================================================
|
|
|
|
static int Sbar_itoa(int num, char *buf)
|
|
{
|
|
char *str;
|
|
int pow10;
|
|
int dig;
|
|
|
|
str = buf;
|
|
if(num < 0)
|
|
{
|
|
*str++ = '-';
|
|
num = -num;
|
|
}
|
|
|
|
for(pow10 = 10; num >= pow10; pow10 *= 10)
|
|
;
|
|
|
|
do
|
|
{
|
|
pow10 /= 10;
|
|
dig = num/pow10;
|
|
*str++ = '0'+dig;
|
|
num -= dig*pow10;
|
|
} while(pow10 != 1);
|
|
|
|
*str = 0;
|
|
|
|
return str-buf;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawNum
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawNum(int x, int y, int number, int digits)
|
|
{
|
|
char str[12];
|
|
char *ptr;
|
|
int l, frame;
|
|
|
|
l = Sbar_itoa(number, str);
|
|
ptr = str;
|
|
if(l > digits)
|
|
{
|
|
ptr += (l-digits);
|
|
}
|
|
if(l < digits)
|
|
{
|
|
x += ((digits-l)*13)/2;
|
|
}
|
|
|
|
while(*ptr)
|
|
{
|
|
if(*ptr == '-')
|
|
{
|
|
frame = STAT_MINUS;
|
|
}
|
|
else
|
|
{
|
|
frame = *ptr -'0';
|
|
}
|
|
Sbar_DrawTransPic(x, y, sb_nums[frame]);
|
|
x += 13;
|
|
ptr++;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_SortFrags
|
|
//
|
|
//==========================================================================
|
|
|
|
#define SPEC_FRAGS -9999
|
|
|
|
void Sbar_SortFrags (qboolean includespec)
|
|
{
|
|
int i, j, k;
|
|
|
|
// sort by frags
|
|
scoreboardlines = 0;
|
|
for (i=0 ; i<MAX_CLIENTS ; i++)
|
|
{
|
|
if (cl.players[i].name[0] &&
|
|
(!cl.players[i].spectator || includespec))
|
|
{
|
|
fragsort[scoreboardlines] = i;
|
|
scoreboardlines++;
|
|
if (cl.players[i].spectator)
|
|
cl.players[i].frags = SPEC_FRAGS;
|
|
}
|
|
}
|
|
|
|
for (i=0 ; i<scoreboardlines ; i++)
|
|
for (j=0 ; j<scoreboardlines-1-i ; j++)
|
|
if (cl.players[fragsort[j]].frags < cl.players[fragsort[j+1]].frags)
|
|
{
|
|
k = fragsort[j];
|
|
fragsort[j] = fragsort[j+1];
|
|
fragsort[j+1] = k;
|
|
}
|
|
}
|
|
|
|
int Sbar_ColorForMap (int m)
|
|
{
|
|
return m < 128 ? m + 8 : m + 8;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SoloScoreboard
|
|
//
|
|
//==========================================================================
|
|
|
|
static void SoloScoreboard(void)
|
|
{
|
|
char str[80];
|
|
int minutes, seconds, tens, units;
|
|
int l;
|
|
|
|
sprintf (str,"Monsters:%3i /%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);
|
|
Sbar_DrawString (8, 4, str);
|
|
|
|
sprintf (str,"Secrets :%3i /%3i", cl.stats[STAT_SECRETS], cl.stats[STAT_TOTALSECRETS]);
|
|
Sbar_DrawString (8, 12, str);
|
|
|
|
// draw time
|
|
minutes = cl.time / 60;
|
|
seconds = cl.time - 60*minutes;
|
|
tens = seconds / 10;
|
|
units = seconds - 10*tens;
|
|
sprintf (str,"Time :%3i:%i%i", minutes, tens, units);
|
|
Sbar_DrawString (184, 4, str);
|
|
|
|
// draw level name
|
|
l = strlen (cl.levelname);
|
|
Sbar_DrawString (232 - l*4, 12, cl.levelname);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawScoreboard
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_DrawScoreboard(void)
|
|
{
|
|
SoloScoreboard();
|
|
//rjr if(cl.gametype == GAME_DEATHMATCH)
|
|
{
|
|
Sbar_DeathmatchOverlay();
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawFrags
|
|
//
|
|
//==========================================================================
|
|
/*
|
|
void Sbar_DrawFrags (void)
|
|
{
|
|
int i, k, l;
|
|
int top, bottom;
|
|
int x, y, f;
|
|
int xofs;
|
|
char num[12];
|
|
scoreboard_t *s;
|
|
|
|
Sbar_SortFrags ();
|
|
|
|
// draw the text
|
|
l = scoreboardlines <= 4 ? scoreboardlines : 4;
|
|
|
|
x = 23;
|
|
xofs = (vid.width - 320)>>1;
|
|
y = vid.height - BAR_TOP_HEIGHT - 23;
|
|
|
|
for (i=0 ; i<l ; i++)
|
|
{
|
|
k = fragsort[i];
|
|
s = &cl.scores[k];
|
|
if (!s->name[0])
|
|
continue;
|
|
|
|
// draw background
|
|
top = s->colors & 0xf0;
|
|
bottom = (s->colors & 15)<<4;
|
|
top = Sbar_ColorForMap (top);
|
|
bottom = Sbar_ColorForMap (bottom);
|
|
|
|
Draw_Fill (xofs + x*8 + 10, y, 28, 4, top);
|
|
Draw_Fill (xofs + x*8 + 10, y+4, 28, 3, bottom);
|
|
|
|
// draw number
|
|
f = s->frags;
|
|
sprintf (num, "%3i",f);
|
|
|
|
Sbar_DrawCharacter ( (x+1)*8 , -24, num[0]);
|
|
Sbar_DrawCharacter ( (x+2)*8 , -24, num[1]);
|
|
Sbar_DrawCharacter ( (x+3)*8 , -24, num[2]);
|
|
|
|
if (k == cl.viewentity - 1)
|
|
{
|
|
Sbar_DrawCharacter (x*8+2, -24, 16);
|
|
Sbar_DrawCharacter ( (x+4)*8-4, -24, 17);
|
|
}
|
|
x+=4;
|
|
}
|
|
}
|
|
*/
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_IntermissionNumber
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_IntermissionNumber (int x, int y, int num, int digits, int color)
|
|
{
|
|
char str[12];
|
|
char *ptr;
|
|
int l, frame;
|
|
|
|
l = Sbar_itoa (num, str);
|
|
ptr = str;
|
|
if (l > digits)
|
|
ptr += (l-digits);
|
|
if (l < digits)
|
|
x += (digits-l)*24;
|
|
|
|
while (*ptr)
|
|
{
|
|
if (*ptr == '-')
|
|
frame = STAT_MINUS;
|
|
else
|
|
frame = *ptr -'0';
|
|
|
|
Draw_TransPic (x,y,sb_nums[frame]);
|
|
x += 24;
|
|
ptr++;
|
|
}
|
|
}
|
|
|
|
extern int color_offsets[MAX_PLAYER_CLASS];
|
|
extern byte *playerTranslation;
|
|
|
|
void FindColor (int slot, int *color1, int *color2)
|
|
{
|
|
int j;
|
|
int top, bottom, done;
|
|
byte *sourceA, *sourceB, *colorA, *colorB;
|
|
|
|
if (slot > MAX_CLIENTS)
|
|
Sys_Error ("CL_NewTranslation: slot > cl.maxclients");
|
|
|
|
if (cl.players[slot].playerclass <= 0 || cl.players[slot].playerclass > MAX_PLAYER_CLASS)
|
|
{
|
|
*color1 = *color2 = 0;
|
|
return;
|
|
}
|
|
|
|
top = cl.players[slot].topcolor;
|
|
bottom = cl.players[slot].bottomcolor;
|
|
|
|
if (top > 10) top = 0;
|
|
if (bottom > 10) bottom = 0;
|
|
|
|
top -= 1;
|
|
bottom -= 1;
|
|
|
|
colorA = playerTranslation + 256 + color_offsets[(int)cl.players[slot].playerclass-1];
|
|
colorB = colorA + 256;
|
|
sourceA = colorB + 256 + (top * 256);
|
|
sourceB = colorB + 256 + (bottom * 256);
|
|
done = 0;
|
|
for(j=0;j<256;j++,colorA++,colorB++,sourceA++,sourceB++)
|
|
{
|
|
if ((*colorA != 255) && !(done & 1))
|
|
{
|
|
if (top >= 0)
|
|
*color1 = *sourceA;
|
|
else
|
|
*color1 = *colorA;
|
|
// done |= 1;
|
|
}
|
|
if ((*colorB != 255) && !(done & 2))
|
|
{
|
|
if (bottom >= 0)
|
|
*color2 = *sourceB;
|
|
else
|
|
*color2 = *colorB;
|
|
// done |= 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DeathmatchOverlay
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_DeathmatchOverlay(void)
|
|
{
|
|
qpic_t *pic;
|
|
int i, k, l;
|
|
int top, bottom;
|
|
int x, y, f;
|
|
char num[40];
|
|
player_info_t *s;
|
|
float total;
|
|
int minutes;
|
|
struct model_s *play_mdl;
|
|
|
|
if (realtime - cl.last_ping_request > 2)
|
|
{
|
|
cl.last_ping_request = realtime;
|
|
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
|
SZ_Print (&cls.netchan.message, "pings");
|
|
}
|
|
|
|
scr_copyeverything = 1;
|
|
scr_fullupdate = 0;
|
|
|
|
pic = Draw_CachePic ("gfx/menu/title8.lmp");
|
|
M_DrawTransPic ((320-pic->width)/2, 0, pic);
|
|
|
|
// scores
|
|
Sbar_SortFrags (true);
|
|
|
|
// draw the text
|
|
l = scoreboardlines;
|
|
|
|
x = ((vid.width - 320)>>1);//was 8 + ...
|
|
y = 62;
|
|
|
|
Sbar_DrawRedString (x+4, y-1, "FRAG");
|
|
Sbar_DrawRedString (x+48, y-1, "PING");
|
|
Sbar_DrawRedString (x+88, y-1, "TIME");
|
|
Sbar_DrawRedString (x+128, y-1, "NAME");
|
|
y += 12;
|
|
|
|
for (i=0 ; i<l ; i++)
|
|
{
|
|
if (y+10 >= vid.height)
|
|
break;
|
|
|
|
k = fragsort[i];
|
|
s = &cl.players[k];
|
|
|
|
if (!s->name[0])
|
|
continue;
|
|
|
|
|
|
if (s->frags != SPEC_FRAGS)
|
|
{
|
|
switch(s->playerclass)
|
|
{//Print playerclass next to name
|
|
case 0:
|
|
Sbar_DrawRedString (x+128, y, "(r )");
|
|
break;
|
|
case 1:
|
|
Sbar_DrawRedString (x+128, y, "(P )");
|
|
break;
|
|
case 2:
|
|
Sbar_DrawRedString (x+128, y, "(C )");
|
|
break;
|
|
case 3:
|
|
Sbar_DrawRedString (x+128, y, "(N )");
|
|
break;
|
|
case 4:
|
|
Sbar_DrawRedString (x+128, y, "(A )");
|
|
break;
|
|
case 5:
|
|
Sbar_DrawRedString (x+128, y, "(S )");
|
|
break;
|
|
case 6:
|
|
Sbar_DrawRedString (x+128, y, "(D )");
|
|
break;
|
|
default:
|
|
Sbar_DrawRedString (x+128, y, "(? )");
|
|
break;
|
|
}
|
|
|
|
if(cl_siege)
|
|
{
|
|
Sbar_DrawRedString (x+160, y, "6");
|
|
if(s->siege_team==1)
|
|
Draw_Character ( x+152 , y, 143);//shield
|
|
else if(s->siege_team==2)
|
|
Draw_Character ( x+152 , y, 144);//sword
|
|
else
|
|
Sbar_DrawRedString ( x+152 , y, "?");//no team
|
|
|
|
if(k==cl_keyholder)
|
|
Draw_Character ( x+144 , y, 145);//key
|
|
else
|
|
Sbar_DrawRedString (x+144, y, "-");
|
|
|
|
if(k==cl_doc)
|
|
Draw_Character ( x+160 , y, 130);//crown
|
|
else
|
|
Sbar_DrawRedString (x+160, y, "6");
|
|
|
|
}
|
|
else
|
|
{
|
|
Sbar_DrawRedString (x+144, y, "-");
|
|
if(!s->level)
|
|
Sbar_DrawRedString (x+152, y, "01");
|
|
else if((int)s->level<10)
|
|
{
|
|
Sbar_DrawRedString (x+152, y, "0");
|
|
sprintf(num, "%1d",s->level);
|
|
Sbar_DrawRedString (x+160, y, num);
|
|
}
|
|
else
|
|
{
|
|
sprintf(num, "%2d",s->level);
|
|
Sbar_DrawRedString (x+152, y, num);
|
|
}
|
|
}
|
|
|
|
// draw background
|
|
FindColor (k, &top, &bottom);
|
|
|
|
Draw_Fill ( x+8, y, 28, 4, top);//was x to 40
|
|
Draw_Fill ( x+8, y+4, 28, 4, bottom);//was x to 40
|
|
|
|
// draw number
|
|
f = s->frags;
|
|
sprintf (num, "%3i",f);
|
|
|
|
Draw_Character ( x+10 , y-1, num[0]);//was 8
|
|
Draw_Character ( x+18 , y-1, num[1]);//was 16
|
|
Draw_Character ( x+26 , y-1, num[2]);//was 24
|
|
|
|
if (k == cl.playernum)
|
|
Draw_Character ( x, y-1, 13);
|
|
|
|
//rjr if(k==sv_kingofhill)
|
|
//rjr Draw_Character ( x+40 , y-1, 130);
|
|
sprintf(num, "%4d",s->ping);
|
|
Draw_String(x+48, y, num);
|
|
|
|
if (cl.intermission)
|
|
total = cl.completed_time - s->entertime;
|
|
else
|
|
total = realtime - s->entertime;
|
|
minutes = (int)total/60;
|
|
sprintf (num, "%4i", minutes);
|
|
Draw_String ( x+88 , y, num);
|
|
|
|
// draw name
|
|
if(cl_siege&&s->siege_team==2)//attacker
|
|
Draw_String (x+178, y, s->name);
|
|
else
|
|
Sbar_DrawRedString (x+178, y, s->name);
|
|
}
|
|
else
|
|
{
|
|
sprintf(num, "%4d",s->ping);
|
|
Sbar_DrawRedString (x+48, y, num);
|
|
|
|
if (cl.intermission)
|
|
total = cl.completed_time - s->entertime;
|
|
else
|
|
total = realtime - s->entertime;
|
|
minutes = (int)total/60;
|
|
sprintf (num, "%4i", minutes);
|
|
Sbar_DrawRedString ( x+88 , y, num);
|
|
|
|
// draw name
|
|
Sbar_DrawRedString (x+128, y, s->name);
|
|
}
|
|
|
|
y += 10;
|
|
}
|
|
}
|
|
|
|
void FindName(char *which, char *name)
|
|
{
|
|
int j,length;
|
|
char *pos,*p2;
|
|
char test[40];
|
|
|
|
strcpy(name, "Unknown");
|
|
j = atol(puzzle_strings);
|
|
pos = strchr(puzzle_strings,13);
|
|
if (!pos) return;
|
|
|
|
if ((*pos) == 10 || (*pos) == 13)
|
|
pos++;
|
|
if ((*pos) == 10 || (*pos) == 13)
|
|
pos++;
|
|
|
|
length = strlen(which);
|
|
|
|
for(;j;j--)
|
|
{
|
|
p2 = strchr(pos,' ');
|
|
if (!p2)
|
|
return;
|
|
|
|
strncpy(test,pos,p2-pos);
|
|
test[p2-pos] = 0;
|
|
|
|
if (strcmpi(which,test) == 0)
|
|
{
|
|
pos = strchr(pos,' ');
|
|
if (pos)
|
|
{
|
|
pos++;
|
|
p2 = strchr(pos,13);
|
|
if (p2)
|
|
{
|
|
strncpy(name,pos,p2-pos);
|
|
name[p2-pos] = 0;
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
pos = strchr(pos,13);
|
|
if (!pos) return;
|
|
if ((*pos) == 10 || (*pos) == 13)
|
|
pos++;
|
|
if ((*pos) == 10 || (*pos) == 13)
|
|
pos++;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_NormalOverlay
|
|
//
|
|
//==========================================================================
|
|
|
|
void Sbar_NormalOverlay(void)
|
|
{
|
|
qpic_t *pic;
|
|
int i,y,piece;
|
|
char Name[40];
|
|
|
|
scr_copyeverything = 1;
|
|
scr_fullupdate = 0;
|
|
|
|
piece = 0;
|
|
y = 40;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
if(cl.puzzle_pieces[i][0] == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (piece == 4) y = 40;
|
|
|
|
FindName(cl.puzzle_pieces[i],Name);
|
|
|
|
if (piece < 4)
|
|
{
|
|
M_DrawPic(10, y,
|
|
Draw_CachePic(va("gfx/puzzle/%s.lmp", cl.puzzle_pieces[i])));
|
|
M_PrintWhite (45, y, Name);
|
|
}
|
|
else
|
|
{
|
|
M_DrawPic(310-32, y,
|
|
Draw_CachePic(va("gfx/puzzle/%s.lmp", cl.puzzle_pieces[i])));
|
|
M_PrintWhite (310-32-3-(strlen(Name)*8), 18+y, Name);
|
|
}
|
|
|
|
y += 32;
|
|
piece++;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_SmallDeathmatchOverlay
|
|
//
|
|
//==========================================================================
|
|
|
|
void DrawTime (int x, int y, int disp_time)
|
|
{
|
|
int show_min,show_sec;
|
|
char num[40];
|
|
show_min = disp_time;
|
|
show_sec = show_min%60;
|
|
show_min = (show_min - show_sec)/60;
|
|
sprintf(num, "%3d",show_min);
|
|
Sbar_DrawRedString ( x+8 , y, num);
|
|
// Draw_Character ( x+32 , y, 58);// ":"
|
|
sprintf(num, "%2d",show_sec);
|
|
if(show_sec>=10)
|
|
Sbar_DrawRedString ( x+40 , y, num);
|
|
else
|
|
{
|
|
Sbar_DrawRedString ( x+40 , y, num);
|
|
Sbar_DrawRedString ( x+40 , y, "0");
|
|
}
|
|
}
|
|
|
|
void Sbar_SmallDeathmatchOverlay(void)
|
|
{
|
|
qpic_t *pic;
|
|
int i, k, l;
|
|
int top, bottom;
|
|
int x, y, f;
|
|
int def_frags,att_frags;
|
|
int show_min,show_sec;
|
|
char num[40];
|
|
// unsigned char num[12];
|
|
player_info_t *s;
|
|
|
|
if (DMMode.value >= 2 && BarHeight != BAR_TOP_HEIGHT)
|
|
return;
|
|
|
|
trans_level = (int)((DMMode.value-floor(DMMode.value)+1E-3)*10);
|
|
if (trans_level > 2)
|
|
{
|
|
trans_level = 0;
|
|
}
|
|
|
|
scr_copyeverything = 1;
|
|
scr_fullupdate = 0;
|
|
|
|
// scores
|
|
Sbar_SortFrags (false);
|
|
|
|
// draw the text
|
|
l = scoreboardlines;
|
|
|
|
x = 10;
|
|
if ((int)DMMode.value == 1)
|
|
{
|
|
i = (vid.height - 120) / 10;
|
|
|
|
if (l > i)
|
|
l = i;
|
|
|
|
y = 46;
|
|
}
|
|
else if ((int)DMMode.value == 2)
|
|
{
|
|
if (l > 4)
|
|
l = 4;
|
|
y = vid.height - BAR_TOP_HEIGHT;
|
|
}
|
|
if (cl_siege)
|
|
{
|
|
if (l > i)
|
|
l = i;
|
|
y = vid.height - BAR_TOP_HEIGHT - 24;
|
|
x-=4;
|
|
Draw_Character ( x , y, 142);//sundial
|
|
Draw_Character ( x+32 , y, 58);// ":"
|
|
if(cl_timelimit>cl.time+cl_server_time_offset)
|
|
{
|
|
DrawTime(x,y,(int)(cl_timelimit - (cl.time + cl_server_time_offset)));
|
|
}
|
|
else if((int)cl.time%2)
|
|
{//odd number, draw 00:00, this will make it flash every second
|
|
Sbar_DrawRedString ( x+16 , y, "00");
|
|
Sbar_DrawRedString ( x+40 , y, "00");
|
|
}
|
|
}
|
|
|
|
def_frags = att_frags = 0;
|
|
for (i=0 ; i<l ; i++)
|
|
{
|
|
k = fragsort[i];
|
|
s = &cl.players[k];
|
|
if (!s->name[0])
|
|
continue;
|
|
|
|
if(cl_siege)
|
|
{
|
|
if(s->siege_team==1)
|
|
{//defender
|
|
if(s->frags>0)
|
|
def_frags+=s->frags;
|
|
else
|
|
att_frags-=s->frags;
|
|
}
|
|
else if(s->siege_team==2)
|
|
{//attacker
|
|
if(s->frags>0)
|
|
att_frags+=s->frags;
|
|
else
|
|
def_frags-=s->frags;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((int)DMMode.value == 2)
|
|
{
|
|
}
|
|
// draw background
|
|
FindColor (k, &top, &bottom);
|
|
|
|
Draw_Fill ( x, y, 28, 4, top);
|
|
Draw_Fill ( x, y+4, 28, 4, bottom);
|
|
|
|
// draw number
|
|
f = s->frags;
|
|
sprintf (num, "%3i",f);
|
|
|
|
/*
|
|
if (k != cl.playernum)
|
|
{
|
|
Draw_Character ( x+2 , y-1, num[0]);
|
|
Draw_Character ( x+10 , y-1, num[1]);
|
|
Draw_Character ( x+18 , y-1, num[2]);
|
|
}
|
|
else
|
|
{
|
|
Draw_Character ( x - 8, y-1, 13);
|
|
Draw_Character ( x+2 , y-1, num[0] + 256);
|
|
Draw_Character ( x+10 , y-1, num[1] + 256);
|
|
Draw_Character ( x+18 , y-1, num[2] + 256);
|
|
}
|
|
*/
|
|
|
|
if (k == cl.playernum)
|
|
{
|
|
Draw_Character ( x - 8, y-1, 13);
|
|
}
|
|
Draw_Character ( x+2 , y-1, num[0]);
|
|
Draw_Character ( x+10 , y-1, num[1]);
|
|
Draw_Character ( x+18 , y-1, num[2]);
|
|
//rjr if(k==sv_kingofhill)
|
|
//rjr Draw_Character ( x+28 , y-1, 130);
|
|
y += 10;
|
|
}
|
|
}
|
|
if(cl_siege)
|
|
{
|
|
if(cl.playernum == cl_keyholder)
|
|
Draw_Character ( x , y-10, 145);//key
|
|
if(cl.playernum == cl_doc)
|
|
Draw_Character ( x+8 , y-10, 130);//crown
|
|
if((int)cl.v.artifact_active&ARTFLAG_BOOTS)
|
|
Draw_Character ( x+16 , y-10, 146);//boots
|
|
|
|
//Print defender losses
|
|
Draw_Character ( x , y+10, 143);//shield
|
|
sprintf (num, "%3i",defLosses);
|
|
// sprintf (num, "%3i",att_frags);
|
|
Sbar_DrawRedString ( x+8 , y+10, num);
|
|
Draw_Character ( x+32 , y+10, 47);// "/"
|
|
sprintf (num, "%3i",cl_fraglimit);
|
|
Sbar_DrawRedString ( x+40 , y+10, num);
|
|
|
|
//Print attacker losses
|
|
Draw_Character ( x , y+20, 144);//sword
|
|
sprintf (num, "%3i",attLosses);
|
|
// sprintf (num, "%3i",def_frags);
|
|
Sbar_DrawRedString ( x+8 , y+20, num);
|
|
Draw_Character ( x+32 , y+20, 47);// "/"
|
|
sprintf (num, "%3i",cl_fraglimit*2);
|
|
Sbar_DrawRedString ( x+40 , y+20, num);
|
|
}
|
|
|
|
trans_level = 0;
|
|
}
|
|
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawActiveRings
|
|
//
|
|
//==========================================================================
|
|
int art_col;
|
|
int ring_row;
|
|
|
|
static void DrawActiveRings(void)
|
|
{
|
|
int flag;
|
|
int frame;
|
|
char tempStr[24];
|
|
|
|
if (scr_con_current == vid.height)
|
|
return; // console is full screen
|
|
|
|
ring_row = 1;
|
|
|
|
flag = (int)cl.v.rings_active;
|
|
|
|
if(flag&RING_TURNING)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/rngtrn%d.lmp", frame);
|
|
Draw_TransPic(vid.width - 50, ring_row, Draw_CachePic(tempStr));
|
|
ring_row += 33;
|
|
}
|
|
|
|
/* if(flag&RING_REGENERATION)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/rngreg%d.lmp", frame);
|
|
Draw_TransPic(vid.width - 50, ring_row, Draw_CachePic(tempStr));
|
|
ring_row += 33;
|
|
}
|
|
*/
|
|
|
|
if(flag&RING_WATER)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/rngwtr%d.lmp", frame);
|
|
Draw_TransPic(vid.width - 50, ring_row, Draw_CachePic(tempStr));
|
|
ring_row += 33;
|
|
}
|
|
|
|
if(flag&RING_FLIGHT)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/rngfly%d.lmp", frame);
|
|
Draw_TransPic(vid.width - 50, ring_row, Draw_CachePic(tempStr));
|
|
ring_row += 33;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawActiveArtifacts
|
|
//
|
|
//==========================================================================
|
|
static void DrawActiveArtifacts(void)
|
|
{
|
|
int flag;
|
|
static int oldflags = 0;
|
|
int frame;
|
|
char tempStr[24];
|
|
|
|
if (scr_con_current == vid.height)
|
|
return;
|
|
|
|
art_col = 50;
|
|
|
|
if (ring_row != 1)
|
|
art_col += 50;
|
|
|
|
flag = (int)cl.v.artifact_active;
|
|
if (flag & ART_TOMEOFPOWER)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/pwrbook%d.lmp", frame);
|
|
Draw_TransPic(vid.width-art_col, 1, Draw_CachePic(tempStr));
|
|
art_col += 50;
|
|
scr_topupdate = 0;
|
|
}
|
|
else if (oldflags & ART_TOMEOFPOWER)
|
|
{
|
|
scr_topupdate = 0;
|
|
}
|
|
|
|
if (flag & ART_HASTE)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/durhst%d.lmp", frame);
|
|
Draw_TransPic(vid.width-art_col,1, Draw_CachePic(tempStr));
|
|
art_col += 50;
|
|
scr_topupdate = 0;
|
|
}
|
|
else if (oldflags & ART_HASTE)
|
|
{
|
|
scr_topupdate = 0;
|
|
}
|
|
|
|
if (flag & ART_INVINCIBILITY)
|
|
{
|
|
frame = 1+(int)(cl.time*16)%16;
|
|
sprintf(tempStr, "gfx/durshd%d.lmp", frame);
|
|
Draw_TransPic(vid.width-art_col, 1, Draw_CachePic(tempStr));
|
|
art_col += 50;
|
|
scr_topupdate = 0;
|
|
}
|
|
else if (oldflags & ART_INVINCIBILITY)
|
|
{
|
|
scr_topupdate = 0;
|
|
}
|
|
|
|
oldflags = flag;
|
|
}
|
|
|
|
//============================================================================
|
|
|
|
|
|
void Inv_Update(qboolean force)
|
|
{
|
|
if(inv_flg || force)
|
|
{
|
|
// Just to be safe
|
|
if (cl.inv_selected >= 0 && cl.inv_count > 0)
|
|
cl.v.inventory = cl.inv_order[cl.inv_selected] + 1;
|
|
else
|
|
cl.v.inventory = 0;
|
|
|
|
if (!force)
|
|
{
|
|
scr_fullupdate = 0;
|
|
inv_flg = false; // Toggle menu off
|
|
}
|
|
|
|
if (cls.state == ca_active)
|
|
{ // This will cause the server to set the client's edict's inventory value
|
|
MSG_WriteByte (&cls.netchan.message, clc_inv_select);
|
|
MSG_WriteByte (&cls.netchan.message, cl.v.inventory);
|
|
}
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawBarArtifactIcon
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DrawBarArtifactIcon(int x, int y, int artifact)
|
|
{
|
|
int count;
|
|
|
|
Sbar_DrawTransPic(x, y, Draw_CachePic(va("gfx/arti%02d.lmp",
|
|
artifact)));
|
|
// if((count = (int)(&cl.v.cnt_torch)[artifact]) > 1)
|
|
if((count = (int)(&cl.v.cnt_torch)[artifact]) > 0)
|
|
{
|
|
DrawBarArtifactNumber(x+20, y+21, count);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawArtifactInventory
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DrawArtifactInventory(void)
|
|
{
|
|
int i;
|
|
int x, y;
|
|
|
|
if(InventoryHideTime < cl.time)
|
|
{
|
|
Inv_Update(false);
|
|
return;
|
|
}
|
|
if(!inv_flg)
|
|
{
|
|
return;
|
|
}
|
|
if(!cl.inv_count)
|
|
{
|
|
Inv_Update(false);
|
|
return;
|
|
}
|
|
|
|
//SB_InvChanged();
|
|
|
|
if(BarHeight < 0)
|
|
{
|
|
y = BarHeight-34;
|
|
}
|
|
else
|
|
{
|
|
y = -37;
|
|
}
|
|
for(i = 0, x = 64; i < INV_MAX_ICON; i++, x += 33)
|
|
{
|
|
if(cl.inv_startpos+i >= cl.inv_count)
|
|
{
|
|
break;
|
|
}
|
|
if(cl.inv_startpos+i == cl.inv_selected)
|
|
{ // Highlight icon
|
|
Sbar_DrawTransPic(x+9, y-12, Draw_CachePic("gfx/artisel.lmp"));
|
|
}
|
|
DrawBarArtifactIcon(x, y, cl.inv_order[cl.inv_startpos+i]);
|
|
}
|
|
|
|
//Inv_DrawArrows (x, y);
|
|
|
|
/* if (cl.inv_startpos) // Left arrow showing there are icons to the left
|
|
Draw_Fill ( x , y - 5, 3, 1, 30);
|
|
|
|
if (cl.inv_startpos + INV_MAX_ICON < cl.inv_count) // Right arrow showing there are icons to the right
|
|
Draw_Fill ( x + 200, y - 5 , 3, 1, 30);
|
|
*/
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowDMDown_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowDMDown_f(void)
|
|
{
|
|
if (sb_ShowDM)
|
|
{
|
|
return;
|
|
}
|
|
|
|
sb_ShowDM = true;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowDMUp_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowDMUp_f(void)
|
|
{
|
|
sb_ShowDM = false;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowNamesDown_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowNamesDown_f(void)
|
|
{
|
|
if (sb_ShowNames)
|
|
{
|
|
return;
|
|
}
|
|
|
|
sb_ShowNames = true;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowNamesUp_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowNamesUp_f(void)
|
|
{
|
|
sb_ShowNames = false;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowInfoDown_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowInfoDown_f(void)
|
|
{
|
|
if(sb_ShowInfo || cl.intermission)
|
|
{
|
|
return;
|
|
}
|
|
S_LocalSound("misc/barmovup.wav");
|
|
BarTargetHeight = BAR_TOTAL_HEIGHT;
|
|
sb_ShowInfo = true;
|
|
sb_updates = 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ShowInfoUp_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ShowInfoUp_f(void)
|
|
{
|
|
if(cl.intermission || (scr_viewsize.value >= 110.0 && !sbtrans.value))
|
|
{
|
|
BarTargetHeight = 0.0-BAR_BUMP_HEIGHT;
|
|
}
|
|
else
|
|
{
|
|
BarTargetHeight = BAR_TOP_HEIGHT;
|
|
}
|
|
S_LocalSound("misc/barmovdn.wav");
|
|
sb_ShowInfo = false;
|
|
sb_updates = 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// InvLeft_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void InvLeft_f(void)
|
|
{
|
|
if(!cl.inv_count || cl.intermission)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(inv_flg)
|
|
{
|
|
if(cl.inv_selected > 0)
|
|
{
|
|
cl.inv_selected--;
|
|
if(cl.inv_selected < cl.inv_startpos)
|
|
{
|
|
cl.inv_startpos = cl.inv_selected;
|
|
}
|
|
scr_fullupdate = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
inv_flg = true;
|
|
}
|
|
S_LocalSound("misc/invmove.wav");
|
|
InventoryHideTime = cl.time+INVENTORY_DISPLAY_TIME;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// InvRight_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void InvRight_f(void)
|
|
{
|
|
if(!cl.inv_count || cl.intermission)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(inv_flg)
|
|
{
|
|
if(cl.inv_selected < cl.inv_count-1)
|
|
{
|
|
cl.inv_selected++;
|
|
if (cl.inv_selected - cl.inv_startpos >= INV_MAX_ICON)
|
|
{
|
|
// could probably be just a cl.inv_startpos++, but just in case
|
|
cl.inv_startpos = cl.inv_selected - INV_MAX_ICON + 1;
|
|
}
|
|
scr_fullupdate = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
inv_flg = true;
|
|
}
|
|
S_LocalSound("misc/invmove.wav");
|
|
InventoryHideTime = cl.time+INVENTORY_DISPLAY_TIME;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// InvUse_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void InvUse_f(void)
|
|
{
|
|
if(!cl.inv_count || cl.intermission)
|
|
{
|
|
return;
|
|
}
|
|
S_LocalSound("misc/invuse.wav");
|
|
//Inv_Update(false);
|
|
Inv_Update(true);
|
|
inv_flg = false;
|
|
scr_fullupdate = 0;
|
|
in_impulse = 23;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// InvDrop_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void InvDrop_f(void)
|
|
{
|
|
if(!cl.inv_count || cl.intermission)
|
|
{
|
|
return;
|
|
}
|
|
S_LocalSound("misc/invuse.wav");
|
|
//Inv_Update(false);
|
|
Inv_Update(true);
|
|
inv_flg = false;
|
|
scr_fullupdate = 0;
|
|
in_impulse = 44;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// InvOff_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void InvOff_f(void)
|
|
{
|
|
inv_flg = false;
|
|
scr_fullupdate = 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ToggleDM_f
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ToggleDM_f(void)
|
|
{
|
|
DMMode.value += 1;
|
|
if (DMMode.value > 2)
|
|
DMMode.value = 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_InvChanged
|
|
//
|
|
//==========================================================================
|
|
|
|
void SB_InvChanged(void)
|
|
{
|
|
int counter, position;
|
|
qboolean examined[INV_MAX_CNT];
|
|
qboolean ForceUpdate = false;
|
|
|
|
memset(examined,0,sizeof(examined)); // examined[x] = false
|
|
|
|
if(cl.inv_selected >= 0 &&
|
|
(&cl.v.cnt_torch)[cl.inv_order[cl.inv_selected]] == 0)
|
|
ForceUpdate = true;
|
|
|
|
// removed items we no longer have from the order
|
|
for(counter=position=0;counter<cl.inv_count;counter++)
|
|
{
|
|
//if (Inv_GetCount(cl.inv_order[counter]) >= 0)
|
|
if((&cl.v.cnt_torch)[cl.inv_order[counter]] > 0)
|
|
{
|
|
cl.inv_order[position] = cl.inv_order[counter];
|
|
examined[cl.inv_order[position]] = true;
|
|
|
|
position++;
|
|
}
|
|
}
|
|
|
|
// add in the new items
|
|
for(counter=0;counter<INV_MAX_CNT;counter++)
|
|
if (!examined[counter])
|
|
{
|
|
//if (Inv_GetCount(counter) > 0)
|
|
if((&cl.v.cnt_torch)[counter] > 0)
|
|
{
|
|
cl.inv_order[position] = counter;
|
|
position++;
|
|
}
|
|
}
|
|
|
|
cl.inv_count = position;
|
|
if (cl.inv_selected >= cl.inv_count)
|
|
{
|
|
cl.inv_selected = cl.inv_count-1;
|
|
ForceUpdate = true;
|
|
}
|
|
if (cl.inv_count && cl.inv_selected < 0)
|
|
{
|
|
cl.inv_selected = 0;
|
|
ForceUpdate = true;
|
|
}
|
|
if (ForceUpdate)
|
|
{
|
|
Inv_Update(true);
|
|
}
|
|
|
|
if (cl.inv_startpos+INV_MAX_ICON > cl.inv_count)
|
|
{
|
|
cl.inv_startpos = cl.inv_count - INV_MAX_ICON;
|
|
if (cl.inv_startpos < 0) cl.inv_startpos = 0;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_InvReset
|
|
//
|
|
//==========================================================================
|
|
|
|
void SB_InvReset(void)
|
|
{
|
|
cl.inv_count = cl.inv_startpos = 0;
|
|
cl.inv_selected = -1;
|
|
inv_flg = false;
|
|
scr_fullupdate = 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// SB_ViewSizeChanged
|
|
//
|
|
//==========================================================================
|
|
|
|
void SB_ViewSizeChanged(void)
|
|
{
|
|
if(cl.intermission || (scr_viewsize.value >= 110.0 && !sbtrans.value))
|
|
{
|
|
BarTargetHeight = 0.0-BAR_BUMP_HEIGHT;
|
|
}
|
|
else
|
|
{
|
|
BarTargetHeight = BAR_TOP_HEIGHT;
|
|
}
|
|
}
|
|
|
|
// DRAWING FUNCTIONS *******************************************************
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawPic
|
|
//
|
|
// Relative to the current status bar location.
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawPic(int x, int y, qpic_t *pic)
|
|
{
|
|
Draw_PicCropped(x+((vid.width-320)>>1),
|
|
y+(vid.height-(int)BarHeight), pic);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawSubPic
|
|
//
|
|
// Relative to the current status bar location.
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawSubPic(int x, int y, int h, qpic_t *pic)
|
|
{
|
|
Draw_SubPicCropped(x+((vid.width-320)>>1),
|
|
y+(vid.height-(int)BarHeight), h, pic);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawTransPic
|
|
//
|
|
// Relative to the current status bar location.
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawTransPic(int x, int y, qpic_t *pic)
|
|
{
|
|
Draw_TransPicCropped(x+((vid.width-320)>>1),
|
|
y+(vid.height-(int)BarHeight), pic);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawCharacter
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawCharacter(int x, int y, int num)
|
|
{
|
|
Draw_Character(x+((vid.width-320)>>1)+4,
|
|
y+vid.height-(int)BarHeight, num);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawString
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawString(int x, int y, char *str)
|
|
{
|
|
Draw_String(x+((vid.width-320)>>1), y+vid.height-(int)BarHeight, str);
|
|
}
|
|
|
|
void Sbar_DrawRedString (int cx, int cy, char *str)
|
|
{
|
|
while (*str)
|
|
{
|
|
Draw_Character (cx, cy, ((unsigned char)(*str))+256);
|
|
str++;
|
|
cx += 8;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawSmallCharacter
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawSmallCharacter(int x, int y, int num)
|
|
{
|
|
Draw_SmallCharacter(x+((vid.width-320)>>1)+4,
|
|
y+vid.height-(int)BarHeight, num);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Sbar_DrawSmallString
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Sbar_DrawSmallString(int x, int y, char *str)
|
|
{
|
|
Draw_SmallString(x+((vid.width-320)>>1),
|
|
y+vid.height-(int)BarHeight, str);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DrawBarArtifactNumber
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DrawBarArtifactNumber(int x, int y, int number)
|
|
{
|
|
static char artiNumName[18] = "gfx/artinum0.lmp";
|
|
|
|
if(number >= 10)
|
|
{
|
|
artiNumName[11] = '0'+(number%100)/10;
|
|
Sbar_DrawTransPic(x, y, Draw_CachePic(artiNumName));
|
|
}
|
|
artiNumName[11] = '0'+number%10;
|
|
Sbar_DrawTransPic(x+4, y, Draw_CachePic(artiNumName));
|
|
}
|
|
|
|
|
|
|
|
// rjr
|
|
|
|
void Sbar_Changed(void)
|
|
{
|
|
SB_InvChanged();
|
|
}
|
|
|
|
void Sbar_FinaleOverlay(void)
|
|
{
|
|
}
|
|
|
|
void Sbar_IntermissionOverlay(void)
|
|
{
|
|
}
|
|
|