forked from a1batross/Paranoia2_original
218 lines
5.0 KiB
C++
218 lines
5.0 KiB
C++
// ====================================
|
|
// written by BUzer for HL: Paranoia modification
|
|
// ====================================
|
|
|
|
#include "hud.h"
|
|
#include "cl_util.h"
|
|
#include "parsemsg.h"
|
|
#include "const.h"
|
|
#include "entity_types.h"
|
|
#include "cdll_int.h"
|
|
#include "vgui_TeamFortressViewport.h"
|
|
#include "vgui_tips.h"
|
|
#include "vgui_shadowtext.h"
|
|
#include "../game_shared/vgui_loadtga.h"
|
|
#include "getfont.h"
|
|
|
|
#define TIPS_APPEAR_TIME 0.15
|
|
#define TIPS_DISAPPEAR_TIME 1
|
|
|
|
#define TIPS_BASE_HEIGHT (YRES(390))
|
|
#define TIPS_XSTEP (XRES(20))
|
|
|
|
int errorshows[10];
|
|
|
|
void ShowTip( client_textmessage_t *tempMessage )
|
|
{
|
|
if (gViewPort && gViewPort->m_pTips)
|
|
gViewPort->m_pTips->Show( tempMessage );
|
|
else
|
|
gEngfuncs.Con_Printf("Tips error: m_pTips or ViewPort is not constructed!\n");
|
|
}
|
|
|
|
void CTips::Initialize()
|
|
{
|
|
setVisible(false);
|
|
m_fShowTime = 0;
|
|
m_fHideTime = 0;
|
|
|
|
if (m_pBitmap) delete m_pBitmap;
|
|
m_pBitmap = NULL;
|
|
}
|
|
|
|
CTips::CTips() : Panel(0, 0, ScreenWidth, ScreenHeight)
|
|
{
|
|
m_pBitmap = NULL;
|
|
m_pText = new ShadowTextPanel("", 0, 0, (ScreenWidth*3)/2, ScreenHeight);
|
|
m_pText->setParent(this);
|
|
m_pText->setPaintBackgroundEnabled(false);
|
|
Initialize();
|
|
|
|
for (int i = 0; i < 10; i++)
|
|
errorshows[i] = 0;
|
|
}
|
|
|
|
|
|
CTips::~CTips()
|
|
{
|
|
if (m_pBitmap) delete m_pBitmap;
|
|
m_pBitmap = NULL;
|
|
}
|
|
|
|
void CTips::Show( client_textmessage_t *tempMessage )
|
|
{
|
|
if (isVisible())
|
|
{
|
|
nextMsg = tempMessage;
|
|
m_fHideTime = gEngfuncs.GetClientTime() + TIPS_APPEAR_TIME; // use fast disappear when someone waits
|
|
return;
|
|
}
|
|
|
|
nextMsg = NULL;
|
|
setVisible(true);
|
|
LoadMsg(tempMessage);
|
|
}
|
|
|
|
// it assumes that
|
|
// 20 <= (msg->effect) < 30
|
|
void CTips::LoadMsg( client_textmessage_t *msg )
|
|
{
|
|
float curtime = gEngfuncs.GetClientTime();
|
|
// gEngfuncs.Con_Printf("loaded\n");
|
|
|
|
m_fShowTime = curtime;
|
|
m_fHideTime = curtime + msg->holdtime;
|
|
const char *pText = msg->pMessage;
|
|
Font *pFont = FontFromMessage(pText);
|
|
m_pText->setFont(pFont);
|
|
m_pText->setText(pText);
|
|
m_pText->setFgColor(msg->r1, msg->g1, msg->b1, 0);
|
|
|
|
if (m_pBitmap) delete m_pBitmap;
|
|
m_pBitmap = NULL;
|
|
|
|
// load image
|
|
// (damn, instead of copying this block of code everywhere,
|
|
// i really need to create a single function to load images this way...)
|
|
int iconnum = msg->effect - 20;
|
|
|
|
static int resArray[] =
|
|
{
|
|
320, 400, 512, 640, 800,
|
|
1024, 1152, 1280, 1600
|
|
};
|
|
|
|
//find current resolution
|
|
int resArrayIndex = 0;
|
|
int i = 0;
|
|
while ((resArray[i] <= ScreenWidth) && (i < 9))
|
|
{
|
|
resArrayIndex = i;
|
|
i++;
|
|
}
|
|
|
|
while(m_pBitmap == NULL && resArrayIndex >= 0)
|
|
{
|
|
char imgName[64];
|
|
sprintf(imgName, "gfx/vgui/icon%d_%d.tga", iconnum, resArray[resArrayIndex]);
|
|
m_pBitmap = vgui_LoadTGA(imgName);
|
|
resArrayIndex--;
|
|
}
|
|
|
|
int iconWide = 0, iconTall = 0;
|
|
if (!m_pBitmap)
|
|
{
|
|
if (!errorshows[iconnum]) // dont show error message for same icon wice
|
|
{
|
|
gEngfuncs.Con_Printf("Could not load icon gfx/vgui/icon%d_...\n", iconnum);
|
|
errorshows[iconnum] = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pBitmap->getSize( iconWide, iconTall );
|
|
m_pBitmap->setPos( TIPS_XSTEP, TIPS_BASE_HEIGHT - (iconTall / 2));
|
|
iconWide += XRES(7);
|
|
}
|
|
|
|
m_pText->setPos( TIPS_XSTEP + iconWide, TIPS_BASE_HEIGHT - (pFont->getTall() / 2));
|
|
}
|
|
|
|
|
|
void CTips::paintBackground()
|
|
{
|
|
float curtime = gEngfuncs.GetClientTime();
|
|
|
|
if (curtime > m_fHideTime)
|
|
{
|
|
if (nextMsg)
|
|
{
|
|
LoadMsg(nextMsg);
|
|
nextMsg = NULL;
|
|
}
|
|
else
|
|
{
|
|
// put away from screen
|
|
Initialize();
|
|
return;
|
|
}
|
|
}
|
|
|
|
int mr, mg, mb, ma;
|
|
m_pText->getFgColor(mr, mg, mb, ma);
|
|
|
|
if (curtime < m_fShowTime + TIPS_APPEAR_TIME)
|
|
{
|
|
float alpha = (curtime - m_fShowTime) / TIPS_APPEAR_TIME;
|
|
m_pText->setFgColor( mr, mg, mb, (1 - alpha) * 255 );
|
|
if (m_pBitmap) m_pBitmap->setColor( Color(255, 255, 255, (1 - alpha) * 255) );
|
|
}
|
|
else if (nextMsg && (curtime > m_fHideTime - TIPS_APPEAR_TIME))
|
|
{
|
|
float alpha = (m_fHideTime - curtime) / TIPS_APPEAR_TIME;
|
|
m_pText->setFgColor( mr, mg, mb, (1 - alpha) * 255 );
|
|
if (m_pBitmap) m_pBitmap->setColor( Color(255, 255, 255, (1 - alpha) * 255) );
|
|
}
|
|
else if (!nextMsg && (curtime > m_fHideTime - TIPS_DISAPPEAR_TIME))
|
|
{
|
|
float alpha = (m_fHideTime - curtime) / TIPS_DISAPPEAR_TIME;
|
|
m_pText->setFgColor( mr, mg, mb, (1 - alpha) * 255 );
|
|
if (m_pBitmap) m_pBitmap->setColor( Color(255, 255, 255, (1 - alpha) * 255) );
|
|
}
|
|
else
|
|
{
|
|
m_pText->setFgColor( mr, mg, mb, 0 );
|
|
if (m_pBitmap) m_pBitmap->setColor( Color(255, 255, 255, 0) );
|
|
}
|
|
|
|
if (m_pBitmap)
|
|
m_pBitmap->doPaint(this);
|
|
|
|
// Panel::paintBackground();
|
|
}
|
|
|
|
|
|
|
|
// неважно, куда-бы это засунуть..
|
|
|
|
#include "vgui_screenmsg.h"
|
|
|
|
void VGuiAddScreenMessage( client_textmessage_t *msg )
|
|
{
|
|
if (gViewPort && gViewPort->m_pScreenMsg)
|
|
{
|
|
gViewPort->m_pScreenMsg->SetMessage( msg );
|
|
}
|
|
else
|
|
gEngfuncs.Con_Printf("Screenmessage error: ViewPort is not constructed!\n");
|
|
}
|
|
|
|
// Wargon: Засуну и я это сюда. )
|
|
void VGuiAddScrollingMessage( client_textmessage_t *msg )
|
|
{
|
|
if (gViewPort && gViewPort->m_pScrollingMsg)
|
|
gViewPort->m_pScrollingMsg->SetMessage(msg);
|
|
else
|
|
gEngfuncs.Con_Printf("Scrollingmessage error: ViewPort is not constructed!\n");
|
|
}
|