00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "Common/Assert.h"
00012 #include "Common/Time.h"
00013 #include "Render/Render.h"
00014 #include "Render/Font.h"
00015 #include "Render/Camera.h"
00016 #include "Mod/Mod.h"
00017
00018 #include "Game/ClientWorld.h"
00019 #include "Mod_Aeternis/A_Team.h"
00020 #include "Mod_Aeternis_Client/A_Interface.h"
00021 #include "Mod_Aeternis_Client/A_ClientCharacter.h"
00022 #include "Mod_Aeternis_Client/A_ClientFlag.h"
00023 #include "Mod_Aeternis_Client/A_ClientGameManager.h"
00024 #include "Mod_Aeternis_Client/A_InputManager.h"
00025 #include "Mod_Aeternis_Client/A_ClientWeapon.h"
00026
00027 #include "Mod_Aeternis_Client/A_WinHUD.h"
00028 #include "Mod_Aeternis_Client/A_WinBuy.h"
00029
00030 #define KWINDOW_NUMBERS_SHADER_WIDTH 256
00031 #define KWINDOW_NUMBERS_SHADER_HEIGHT 32
00032 #define KWINDOW_HUD2_SHADER_WIDTH 512
00033 #define KWINDOW_HUD2_SHADER_HEIGHT 512
00034
00035 #define RADARMOVESPEED 0.8f
00036
00037 #define KHUDSTATUS_WIDTH 0.3f
00038 #define KHUDSTATUS_HEIGHT 0.59f
00039
00040
00041
00042
00043 KAWinHUD::KAWinHUD( KWin* pFather, KFPt& Pos, KFPt& Size, KInterface* pInterface )
00044 : KWin( pFather, Pos, Size, pInterface )
00045 {
00046 m_hBackGround = KSHADER_NO;
00047 m_hHud = KSHADER_NO;
00048 m_hNumbers = KSHADER_NO;
00049 m_bDisplayVoiceCommand = false ;
00050 m_bDisplayRadar = true ;
00051 m_bDisplayFlagBloc = false ;
00052 m_bDisplayWeaponBloc = false ;
00053 m_bDisplayStatusBloc = true ;
00054 m_fRadarPercentOutOfScreen = 1.0f ;
00055 m_fWeaponBlocPercentOutOfScreen = 1.0f ;
00056 m_fFlagBlocPercentOutOfScreen = 1.0f ;
00057 m_fStatusBlocPercentOutOfScreen = 1.0f ;
00058 m_BloodTime = 0;
00059 m_BloodDuration = 0;
00060 }
00061
00062
00063 KAWinHUD::~KAWinHUD()
00064 {
00065 }
00066
00067
00068 void KAWinHUD::Display()
00069 {
00070 u8 FadeAlpha = (u8)(255.0f * GetFade());
00071 KHEALTH Health = 0;
00072 KAGAMEFLAGMODE RedFlagMode = KAGFM_STARTPOS;
00073 KAGAMEFLAGMODE BlueFlagMode = KAGFM_STARTPOS;
00074 s32 RedScore = 0;
00075 s32 BlueScore = 0;
00076 KMATEAM Team = KMAT_SPECTATOR;
00077
00078 KAClientGameManager* pGameManager = (KAClientGameManager*)g_pClientGameManager;
00079
00080 if( pGameManager )
00081 {
00082 KAClientPlayer* pPlayer = (KAClientPlayer*)pGameManager->GetpMyPlayer();
00083 if( pPlayer )
00084 {
00085
00086 Health = pPlayer->GetHealth();
00087 if( pPlayer->GetpTeam() )
00088 Team = pPlayer->GetpTeam()->GetTeam();
00089 }
00090
00091 if( pGameManager->m_pRedFlag )
00092 RedFlagMode = pGameManager->m_pRedFlag->GetFlagMode() ;
00093
00094 if( pGameManager->m_pBlueFlag )
00095 BlueFlagMode = pGameManager->m_pBlueFlag->GetFlagMode() ;
00096
00097 RedScore = pGameManager->GetpTeam( KMAT_RED )->GetScore();
00098 BlueScore = pGameManager->GetpTeam( KMAT_BLUE )->GetScore();
00099 }
00100
00101 DisplayRadar( Team, 1.0f );
00102 DisplayStatusPanel( Team, RedFlagMode, RedScore, BlueFlagMode, BlueScore, Health );
00103
00104
00105
00106 DisplayInventory(Team) ;
00107 DisplayTime() ;
00108
00109 if(m_bDisplayVoiceCommand) DisplayVoiceCommand(true) ;
00110
00111 DisplayBlood();
00112 }
00113
00114
00115 void KAWinHUD::Manage()
00116 {
00117 static KTIME lastTime = g_Time.GetTime() ;
00118 KTIME newTime = g_Time.GetTime() ;
00119
00120 float fTimeElapsed = (float)(newTime - lastTime) ;
00121 lastTime = newTime ;
00122 float fStep = (fTimeElapsed * RADARMOVESPEED) / 1000.0f ;
00123
00124 if(m_bDisplayRadar) m_fRadarPercentOutOfScreen -= fStep ;
00125 if(!m_bDisplayRadar) m_fRadarPercentOutOfScreen += fStep ;
00126 if(m_fRadarPercentOutOfScreen > 1.0f) m_fRadarPercentOutOfScreen = 1.0f ;
00127 if(m_fRadarPercentOutOfScreen < 0.0f) m_fRadarPercentOutOfScreen = 0.0f ;
00128
00129 if(m_bDisplayWeaponBloc) m_fWeaponBlocPercentOutOfScreen -= fStep ;
00130 if(!m_bDisplayWeaponBloc) m_fWeaponBlocPercentOutOfScreen += fStep ;
00131 if(m_fWeaponBlocPercentOutOfScreen > 1.0f) m_fWeaponBlocPercentOutOfScreen = 1.0f ;
00132 if(m_fWeaponBlocPercentOutOfScreen < 0.0f) m_fWeaponBlocPercentOutOfScreen = 0.0f ;
00133
00134 if(m_bDisplayFlagBloc) m_fFlagBlocPercentOutOfScreen -= fStep ;
00135 if(!m_bDisplayFlagBloc) m_fFlagBlocPercentOutOfScreen += fStep ;
00136 if(m_fFlagBlocPercentOutOfScreen > 1.0f) m_fFlagBlocPercentOutOfScreen = 1.0f ;
00137 if(m_fFlagBlocPercentOutOfScreen < 0.0f) m_fFlagBlocPercentOutOfScreen = 0.0f ;
00138
00139 if(m_bDisplayStatusBloc) m_fStatusBlocPercentOutOfScreen -= fStep ;
00140 if(!m_bDisplayStatusBloc) m_fStatusBlocPercentOutOfScreen += fStep ;
00141 if(m_fStatusBlocPercentOutOfScreen > 1.0f) m_fStatusBlocPercentOutOfScreen = 1.0f ;
00142 if(m_fStatusBlocPercentOutOfScreen < 0.0f) m_fStatusBlocPercentOutOfScreen = 0.0f ;
00143 }
00144
00145
00146 void KAWinHUD::DisplayNumbers( KFPt& Pos, KFPt& Size, s32 Numbers, KCOLOR Color, KCOLOR Specular )
00147 {
00148 char pNumbers[256];
00149
00150 sprintf( pNumbers, "%.2i", Numbers );
00151
00152 s32 Len = (s32)strlen( pNumbers );
00153 for( s32 i = 0; i < Len; i ++ )
00154 {
00155 DisplayNumber( Pos + KFPt( Size.x * (float)i, 0.0f ), KFPt( Size.x, Size.y ), (s32)(pNumbers[i] - '0'), Color, Specular );
00156 }
00157 }
00158
00159
00160 void KAWinHUD::DisplayNumber( KFPt& Pos, KFPt& Size, s32 Number, KCOLOR Color, KCOLOR Specular )
00161 {
00162 KASSERT( ( Number >= 0 ) && ( Number <= 9 ) );
00163
00164 float pTU[4], pTV[4];
00165 float dtexelu = 0.5f / (float)KWINDOW_NUMBERS_SHADER_WIDTH;
00166 float dtexelv = 0.5f / (float)KWINDOW_NUMBERS_SHADER_HEIGHT;
00167
00168 pTU[0] = (float)Number / 10.0f + dtexelu; pTV[0] = dtexelv;
00169 pTU[1] = ((float)Number + 1.0f ) / 10.0f + dtexelu; pTV[1] = dtexelv;
00170 pTU[2] = (float)Number / 10.0f + dtexelu; pTV[2] = 1.0f + dtexelv;
00171 pTU[3] = ((float)Number + 1.0f ) / 10.0f + dtexelu; pTV[3] = 1.0f + dtexelv;
00172
00173 DrawQuad( Pos.x, Pos.y, Size.x, Size.y, m_hNumbers, Color, Specular, KRM_NORMAL, pTU, pTV );
00174 }
00175
00176
00177 void KAWinHUD::DisplayAmmo( s32 Ammo )
00178 {
00179 DisplayNumbers( KFPt( 0.9f, 0.1f), KFPt( 0.03f, 0.03f ), ((g_Time.GetTime() / 100) % 100) );
00180 }
00181
00182
00183 void KAWinHUD::DisplayLife( KHEALTH Health )
00184 {
00185 u8 FadeAlpha = (u8)(255.0f * GetFade());
00186 u8 c = u8((float)Health * 2.55f);
00187 KCOLOR Specular = KRGBA( 255 - c, 0, 0, FadeAlpha );
00188 KCOLOR Color = KRGBA( 255, c, c, FadeAlpha );
00189
00190 KFPt fSize = GetFloatPoint( KPt( 20, 20 ) );
00191 KFPt fPos = GetFloatPoint( KPt( 8, GetIntPoint( GetSize() ).y - 30 ) );
00192
00193 KFPt StatusDelta;
00194 KFPt fStatusSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * KHUDSTATUS_WIDTH), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * KHUDSTATUS_HEIGHT) ) );
00195 StatusDelta.x = -m_fStatusBlocPercentOutOfScreen * fStatusSize.x;
00196 StatusDelta.y = m_fStatusBlocPercentOutOfScreen * fStatusSize.y;
00197
00198 DisplayNumbers( fPos + StatusDelta, fSize, Health, Color, Specular );
00199 }
00200
00201
00202 void KAWinHUD::DisplayRadar( KMATEAM Team, float Zoom )
00203 {
00204 u8 FadeAlpha = (u8)(255.0f * GetFade());
00205 KFPt RadarDelta;
00206 float pTU[4], pTV[4];
00207 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00208 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00209
00210 float w = 0.50f;
00211 float h = 0.375f;
00212 pTU[0] = (float)0.0f + dtexelu; pTV[0] = 0.0f + dtexelv;
00213 pTU[1] = (float)w + dtexelu; pTV[1] = 0.0f + dtexelv;
00214 pTU[2] = (float)0.0f + dtexelu; pTV[2] = h + dtexelv;
00215 pTU[3] = (float)w + dtexelu; pTV[3] = h + dtexelv;
00216
00217 KFPt fSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * w), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * h) ) );
00218 RadarDelta.x = -m_fRadarPercentOutOfScreen * fSize.x;
00219 RadarDelta.y = -m_fRadarPercentOutOfScreen * fSize.y;
00220
00221 DrawQuad( m_Pos.x + RadarDelta.x, m_Pos.y + RadarDelta.y, fSize.x, fSize.y, m_hHud, GetTeamColor( Team ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00222
00223
00224 char pZoomText[256];
00225 sprintf( pZoomText, "x%.0f", Zoom );
00226 m_pRender->DrawText( GetIntPoint( m_Pos ) + KPt( 25 , 170 ) + GetIntPoint( RadarDelta ), pZoomText, KRGB( 200, 200, 200 ), 0.75f );
00227
00228 KFPt fCenterPos = GetFloatPoint( KPt( 138, 106 ) );
00229
00230
00231 KAClientGameManager* pGameManager = (KAClientGameManager*)g_pClientGameManager;
00232 if( !pGameManager )
00233 return;
00234
00235 KClientWorld* pWorld = pGameManager->GetpClientWorld();
00236 if( !pWorld )
00237 return;
00238
00239 KAClientPlayer* pMyPlayer = (KAClientPlayer*)pGameManager->GetpMyPlayer();
00240 if( !pMyPlayer )
00241 return;
00242
00243 KAClientCharacter* pMyCharacter = pMyPlayer ? pMyPlayer->GetpCharacter() : NULL;
00244 if( !pMyCharacter )
00245 return;
00246
00247
00248 KVector vUp, vRight, vView;
00249 m_pRender->GetCamera()->GetAxes( vRight, vUp, vView );
00250
00251 KFPt vDirX;
00252 KFPt vDirY;
00253 vDirX.x = vRight.x;
00254 vDirX.y = vRight.y;
00255 vDirX.Normalize();
00256 vDirY.x = vView.x;
00257 vDirY.y = vView.y;
00258 vDirY.Normalize();
00259
00260
00261
00262
00263 float ZoomFactor = Zoom / 20.0f;
00264
00265 for( K3DObject* pObject = pWorld->GetpFirstObject(); pObject; pObject = pWorld->GetpNextObject( pObject ) )
00266 {
00267 switch( pObject->GetType() )
00268 {
00269 case KAGOT_CHARACTER:
00270 {
00271 KFPt fItemSize = GetFloatPoint( KPt( 8, 8 ) );
00272
00273 KAClientCharacter* pCharacter = (KAClientCharacter*)pObject;
00274 KAClientPlayer* pPlayer = (KAClientPlayer*)pGameManager->GetpPlayer( pCharacter->GethPlayer() );
00275
00276 if( pCharacter != pMyCharacter && pPlayer && pPlayer->GetpTeam() && pPlayer->GetpTeam()->GetTeam() == Team )
00277 {
00278 KFPt WorldObjectPos;
00279
00280
00281 WorldObjectPos.x = ( pObject->GetPos().x - pMyCharacter->GetPos().x ) * ZoomFactor;
00282 WorldObjectPos.y = ( pObject->GetPos().y - pMyCharacter->GetPos().y ) * ZoomFactor;
00283
00284 KFPt TmpPos = WorldObjectPos;
00285 WorldObjectPos.x = vDirX.x * TmpPos.x + vDirX.y * TmpPos.y;
00286 WorldObjectPos.y = vDirY.x * TmpPos.x + vDirY.y * TmpPos.y;
00287
00288
00289 KFPt ObjectPos;
00290
00291 ObjectPos.x = m_Pos.x + fCenterPos.x - fItemSize.x / 2.0f;
00292 ObjectPos.y = m_Pos.y + fCenterPos.y - fItemSize.y / 2.0f;
00293
00294 ObjectPos += GetFloatPoint( KPt( (s32)WorldObjectPos.x, (s32)-WorldObjectPos.y ) );
00295
00296 DrawQuad( ObjectPos.x + RadarDelta.x,
00297 ObjectPos.y + RadarDelta.y,
00298 fItemSize.x,
00299 fItemSize.y,
00300 KSHADER_NO,
00301 KRGB( 200, 200, 20 ) );
00302 }
00303 }
00304 break;
00305 case KAGOT_FLAG:
00306 {
00307 KFPt fItemSize = GetFloatPoint( KPt( 16, 16 ) );
00308
00309 KAClientFlag* pFlag = (KAClientFlag*)pObject;
00310
00311 KFPt WorldObjectPos;
00312
00313
00314 WorldObjectPos.x = ( pObject->GetPos().x - pMyCharacter->GetPos().x ) * ZoomFactor;
00315 WorldObjectPos.y = ( pObject->GetPos().y - pMyCharacter->GetPos().y ) * ZoomFactor;
00316
00317 KFPt TmpPos = WorldObjectPos;
00318 WorldObjectPos.x = vDirX.x * TmpPos.x + vDirX.y * TmpPos.y;
00319 WorldObjectPos.y = vDirY.x * TmpPos.x + vDirY.y * TmpPos.y;
00320
00321
00322 KFPt ObjectPos;
00323
00324 ObjectPos.x = m_Pos.x + fCenterPos.x - fItemSize.x / 2.0f;
00325 ObjectPos.y = m_Pos.y + fCenterPos.y - fItemSize.y / 2.0f;
00326
00327 ObjectPos += GetFloatPoint( KPt( (s32)WorldObjectPos.x, (s32)-WorldObjectPos.y ) );
00328
00329 KCOLOR FlagColor = GetTeamColor( pFlag->GetTeam() );
00330 float pTU[4], pTV[4];
00331
00332 GetFlagUV( pFlag->GetFlagMode(), pTU, pTV );
00333
00334 DrawQuad( ObjectPos.x + RadarDelta.x,
00335 ObjectPos.y + RadarDelta.y,
00336 fItemSize.x,
00337 fItemSize.y,
00338 m_hHud,
00339 FlagColor,
00340 FlagColor,
00341 KRM_NORMAL,
00342 pTU,
00343 pTV );
00344 }
00345 break;
00346 }
00347 }
00348 }
00349
00350
00351 void KAWinHUD::DisplayStatusPanel( KMATEAM Team, KAGAMEFLAGMODE RedFlagMode, s32 RedScore, KAGAMEFLAGMODE BlueFlagMode, s32 BlueScore, KHEALTH Health )
00352 {
00353 u8 FadeAlpha = (u8)(255.0f * GetFade());
00354 KFPt StatusDelta;
00355 float pTU[4], pTV[4];
00356 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00357 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00358
00359 float w = KHUDSTATUS_WIDTH;
00360 float h = KHUDSTATUS_HEIGHT;
00361 pTU[0] = (float)0.0f + dtexelu; pTV[0] = 0.41f + dtexelv;
00362 pTU[1] = (float)w + dtexelu; pTV[1] = 0.41f + dtexelv;
00363 pTU[2] = (float)0.0f + dtexelu; pTV[2] = 1.0f + dtexelv;
00364 pTU[3] = (float)w + dtexelu; pTV[3] = 1.0f + dtexelv;
00365
00366 KFPt fSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * w), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * h) ) );
00367 StatusDelta.x = -m_fStatusBlocPercentOutOfScreen * fSize.x;
00368 StatusDelta.y = -m_fStatusBlocPercentOutOfScreen * fSize.y;
00369
00370 DrawQuad( m_Pos.x + StatusDelta.x, m_Pos.y + 1.0f - fSize.y - StatusDelta.y, fSize.x, fSize.y, m_hHud, GetTeamColor( Team ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00371
00372 DisplayFlag( RedFlagMode, KMAT_RED, RedScore );
00373 DisplayFlag( BlueFlagMode, KMAT_BLUE, BlueScore );
00374 DisplayLife( Health );
00375 }
00376
00377
00378 void KAWinHUD::DisplayFlag( KAGAMEFLAGMODE FlagMode, KMATEAM Team, s32 Score )
00379 {
00380 u8 FadeAlpha = (u8)(255.0f * GetFade());
00381 KFPt StatusDelta;
00382 float pTU[4], pTV[4];
00383 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00384 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00385
00386 GetFlagUV( FlagMode, pTU, pTV );
00387
00388 s32 PosY = (Team == KMAT_BLUE) ? 155 : 235;
00389 KCOLOR Color = GetTeamColor( Team );
00390 u8 i = s8(64.0f * fabs( cosf( (float)g_Time.GetTime() / 400.0f ) ) );
00391 KCOLOR Specular = (FlagMode != KAGFM_STARTPOS) ? RGB( i, i, i ) : KRGB( 16, 16, 16 );
00392
00393 KFPt fSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * 0.09f), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * 0.09) ) );
00394 KFPt fPos = GetFloatPoint( KPt( 70, GetIntPoint( GetSize() ).y - PosY ) );
00395 KFPt fStatusSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * KHUDSTATUS_WIDTH), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * KHUDSTATUS_HEIGHT) ) );
00396 StatusDelta.x = -m_fStatusBlocPercentOutOfScreen * fStatusSize.x;
00397 StatusDelta.y = m_fStatusBlocPercentOutOfScreen * fStatusSize.y;
00398
00399 DrawQuad( fPos.x + StatusDelta.x, fPos.y + StatusDelta.y, fSize.x, fSize.y, m_hHud, Color, Specular, KRM_NORMAL, pTU, pTV );
00400
00401 char pTextScore[16];
00402 sprintf( pTextScore, "%i", Score );
00403 m_pRender->DrawText( KPt( 110, GetIntPoint( GetSize() ).y - PosY + 48 ) + GetIntPoint( StatusDelta ), pTextScore, KRGB( 200, 200, 200 ), 0.75f );
00404 }
00405
00406
00407 void KAWinHUD::DisplayWeaponPanel( KFPt& Pos, KMATEAM Team )
00408 {
00409 u8 FadeAlpha = (u8)(255.0f * GetFade());
00410 float pTU[4], pTV[4];
00411 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00412 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00413
00414 float w = 0.5;
00415 float h = 0.125f;
00416
00417 pTU[0] = (float)0.3125f + dtexelu; pTV[0] = 1.0f - h + dtexelv;
00418 pTU[1] = (float)0.3125f + w + dtexelu; pTV[1] = 1.0f - h + dtexelv;
00419 pTU[2] = (float)0.3125f + dtexelu; pTV[2] = 1.0f + dtexelv;
00420 pTU[3] = (float)0.3125f + w + dtexelu; pTV[3] = 1.0f + dtexelv;
00421
00422 KFPt fSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * w), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * h) ) );
00423
00424 DrawQuad( m_Pos.x + Pos.x + (m_fWeaponBlocPercentOutOfScreen * 0.083984375f), m_Pos.y + 1.0f - fSize.y + (h * m_fWeaponBlocPercentOutOfScreen), fSize.x, fSize.y, m_hHud, GetTeamColor( Team ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00425
00426 }
00427
00428
00429 void KAWinHUD::DisplayFlagPanel( KFPt& Pos, KMATEAM Team )
00430 {
00431 u8 FadeAlpha = (u8)(255.0f * GetFade());
00432 float pTU[4], pTV[4];
00433 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00434 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00435
00436 float w = 0.3f;
00437 float h = 0.1171875f;
00438
00439 pTU[0] = (float)0.3125f + dtexelu; pTV[0] = 0.7617f + dtexelv;
00440 pTU[1] = (float)0.3125f + w + dtexelu; pTV[1] = 0.7617f + dtexelv;
00441 pTU[2] = (float)0.3125f + dtexelu; pTV[2] = 0.7617f + h + dtexelv;
00442 pTU[3] = (float)0.3125f + w + dtexelu; pTV[3] = 0.7617f + h + dtexelv;
00443
00444 KFPt fSize = GetFloatPoint( KPt( (s32)((float)KWINDOW_HUD2_SHADER_WIDTH * w), (s32)((float)KWINDOW_HUD2_SHADER_HEIGHT * h) ) );
00445 DrawQuad( m_Pos.x + Pos.x + (m_fFlagBlocPercentOutOfScreen * 0.125f), m_Pos.y + 1.0f - fSize.y + (h * m_fFlagBlocPercentOutOfScreen), fSize.x, fSize.y, m_hHud, GetTeamColor( Team ), KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00446
00447 }
00448
00449
00450 void KAWinHUD::GetFlagUV( KAGAMEFLAGMODE FlagMode, float* pTU, float* pTV )
00451 {
00452 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00453 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00454
00455 switch( FlagMode )
00456 {
00457 case KAGFM_STARTPOS:
00458 pTU[0] = (float)0.875f + dtexelu; pTV[0] = 0.125f + dtexelv;
00459 pTU[1] = (float)1.0f + dtexelu; pTV[1] = 0.125f + dtexelv;
00460 pTU[2] = (float)0.875f + dtexelu; pTV[2] = 0.250f + dtexelv;
00461 pTU[3] = (float)1.0f + dtexelu; pTV[3] = 0.250f + dtexelv;
00462 break;
00463 case KAGFM_TAKEN:
00464 pTU[0] = (float)0.750f + dtexelu; pTV[0] = 0.0f + dtexelv;
00465 pTU[1] = (float)0.875f + dtexelu; pTV[1] = 0.0f + dtexelv;
00466 pTU[2] = (float)0.750f + dtexelu; pTV[2] = 0.125f + dtexelv;
00467 pTU[3] = (float)0.875f + dtexelu; pTV[3] = 0.125f + dtexelv;
00468 break;
00469 case KAGFM_DROPPED:
00470 pTU[0] = (float)0.750f + dtexelu; pTV[0] = 0.125f + dtexelv;
00471 pTU[1] = (float)0.875f + dtexelu; pTV[1] = 0.125f + dtexelv;
00472 pTU[2] = (float)0.750f + dtexelu; pTV[2] = 0.250f + dtexelv;
00473 pTU[3] = (float)0.875f + dtexelu; pTV[3] = 0.250f + dtexelv;
00474 break;
00475 }
00476 }
00477
00478
00479 KCOLOR KAWinHUD::GetTeamColor( KMATEAM Team )
00480 {
00481 u8 FadeAlpha = (u8)(255.0f * GetFade());
00482
00483 switch( Team )
00484 {
00485 case KMAT_BLUE:
00486 return KRGBA( 147, 162, 255, FadeAlpha );
00487 case KMAT_RED:
00488 return KRGBA( 255, 147, 162, FadeAlpha );
00489 }
00490
00491 return KRGBA( 255, 255, 255, FadeAlpha );
00492 }
00493
00494
00495 void KAWinHUD::DisplayVoiceCommand(bool bDisplay)
00496 {
00497 m_bDisplayVoiceCommand = bDisplay ;
00498
00499 if(m_bDisplayVoiceCommand)
00500 {
00501 char* pTitle = "Voice Command" ;
00502
00503 m_pRender->DrawText( KPt( 20, 200 ), pTitle, KRGB( 255, 0, 0 ), 0.75f );
00504 for( s32 i = 0; i < KAGVC_COUNT; i ++ )
00505 m_pRender->DrawText( KPt( 20, 220 + i * 16 ), m_psVoiceCommand[i], KRGB( 200, 200, 200 ), 0.75f );
00506 }
00507 }
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530 void KAWinHUD::Load()
00531 {
00532 KWin::Load();
00533
00534 m_hBackGround = m_pRender->GetpShaderBank()->LoadShader( "GUI/WinHUD" );
00535 m_hHud = m_pRender->GetpShaderBank()->LoadShader( "GUI/WinHUD3" );
00536 m_hNumbers = m_pRender->GetpShaderBank()->LoadShader( "GUI/Numbers" );
00537
00538 m_psVoiceCommand[KAGVC_AFFIRMATIVE] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD1)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_AFFIRMATIVE) );
00539 m_psVoiceCommand[KAGVC_NEGATIVE] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD2)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_NEGATIVE) );
00540 m_psVoiceCommand[KAGVC_LETSGO] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD3)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_LETSGO) );
00541 m_psVoiceCommand[KAGVC_COVERME] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD4)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_COVERME) );
00542 m_psVoiceCommand[KAGVC_ENEMYDOWN] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD5)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_ENEMYDOWN) );
00543 m_psVoiceCommand[KAGVC_IAMINPOSITION] = KStr( "%s - %s", g_AInputManager.GetpMappedKey(E_ACTIONS_VOICECMD6)->GetpKeyName(), GETLOCALSTRING(LS_VOICECMD_IAMINPOSITION) );
00544 }
00545
00546
00547 void KAWinHUD::Unload()
00548 {
00549 KWin::Unload();
00550
00551 m_pRender->GetpShaderBank()->UnloadShader( m_hBackGround );
00552 m_pRender->GetpShaderBank()->UnloadShader( m_hHud );
00553 m_pRender->GetpShaderBank()->UnloadShader( m_hNumbers );
00554 }
00555
00556
00557 void KAWinHUD::DisplayRadar(bool bDisplay)
00558 {
00559 if(bDisplay)
00560 m_fRadarPercentOutOfScreen = 0.0f ;
00561 else
00562 m_fRadarPercentOutOfScreen = 0.5f ;
00563 }
00564
00565
00566 bool KAWinHUD::OnKeyDown( u32 VirtKey, u32 KeyData )
00567 {
00568
00569
00570
00571
00572
00573
00574
00575
00576 if(((KAInterface*)m_pInterface)->IsInGameMenu())
00577 return false ;
00578 KAClientGameManager* pGameManager = (KAClientGameManager*)g_pClientGameManager ;
00579 KAClientPlayer* pMyPlayer = (KAClientPlayer*)pGameManager->GetpMyPlayer() ;
00580
00581 if( ISVKMAPPED( E_ACTIONS_RADAR ) )
00582 m_bDisplayRadar = !m_bDisplayRadar ;
00583
00584 if( ISVKMAPPED( E_ACTIONS_HUDSTATUS ) )
00585 m_bDisplayStatusBloc = !m_bDisplayStatusBloc ;
00586
00587 if( ISVKMAPPED( E_ACTIONS_PREVOBJECT ) )
00588 pMyPlayer->SelectPrevObject() ;
00589
00590 if( ISVKMAPPED( E_ACTIONS_NEXTOBJECT ) )
00591 pMyPlayer->SelectNextObject() ;
00592
00593 if( ISVKMAPPED( E_ACTIONS_DROP ) )
00594 pMyPlayer->Drop() ;
00595
00596 if( ISVKMAPPED( E_ACTIONS_ZOOM ) )
00597 pMyPlayer->Zoom() ;
00598
00599
00600 if( ISVKMAPPED( E_ACTIONS_DISPLAYVOICECMD ) )
00601 m_bDisplayVoiceCommand = m_bDisplayVoiceCommand ? false : true;
00602
00603 if( ISVKMAPPED( E_ACTIONS_VOICECMD1 ) && m_bDisplayVoiceCommand )
00604 {
00605 pGameManager->VoiceCommand( KAGVC_AFFIRMATIVE );
00606 m_bDisplayVoiceCommand = false;
00607 }
00608
00609 if( ISVKMAPPED( E_ACTIONS_VOICECMD2 ) && m_bDisplayVoiceCommand )
00610 {
00611 pGameManager->VoiceCommand( KAGVC_NEGATIVE );
00612 m_bDisplayVoiceCommand = false;
00613 }
00614
00615 if( ISVKMAPPED( E_ACTIONS_VOICECMD3 ) && m_bDisplayVoiceCommand )
00616 {
00617 pGameManager->VoiceCommand( KAGVC_LETSGO );
00618 m_bDisplayVoiceCommand = false;
00619 }
00620
00621 if( ISVKMAPPED( E_ACTIONS_VOICECMD4 ) && m_bDisplayVoiceCommand )
00622 {
00623 pGameManager->VoiceCommand( KAGVC_COVERME );
00624 m_bDisplayVoiceCommand = false;
00625 }
00626
00627 if( ISVKMAPPED( E_ACTIONS_VOICECMD5 ) && m_bDisplayVoiceCommand )
00628 {
00629 pGameManager->VoiceCommand( KAGVC_ENEMYDOWN );
00630 m_bDisplayVoiceCommand = false;
00631 }
00632
00633 if( ISVKMAPPED( E_ACTIONS_VOICECMD6 ) && m_bDisplayVoiceCommand )
00634 {
00635 pGameManager->VoiceCommand( KAGVC_IAMINPOSITION );
00636 m_bDisplayVoiceCommand = false;
00637 }
00638
00639 return true ;
00640 }
00641
00642
00643 void KAWinHUD::DisplayInventory(KMATEAM Team)
00644 {
00645 KAClientGameManager* pGameManager = (KAClientGameManager*)g_pClientGameManager ;
00646 KAClientPlayer* pMyPlayer = (KAClientPlayer*)pGameManager->GetpMyPlayer() ;
00647
00648 if(pMyPlayer == NULL)
00649 return ;
00650
00651 float pTU[4], pTV[4];
00652 float dtexelu = 0.5f / (float)KWINDOW_HUD2_SHADER_WIDTH;
00653 float dtexelv = 0.5f / (float)KWINDOW_HUD2_SHADER_HEIGHT;
00654
00655 if(pMyPlayer->GetCurrentWeapon())
00656 m_bDisplayWeaponBloc = true ;
00657 else
00658 m_bDisplayWeaponBloc = false ;
00659
00660 float OffsetX = 0.165f * (1.0f - m_fStatusBlocPercentOutOfScreen);
00661
00662
00663
00664
00665 if(pMyPlayer->GetCurrentWeapon())
00666 {
00667 u32 WeaponType = pMyPlayer->GetCurrentWeapon()->GetWeaponType() ;
00668
00669 float fWeaponIndexX = 0.5078125f ;
00670 float fWeaponSizeX = 0.25f ;
00671 float fWeaponSizeY = 0.125f ;
00672
00673 switch( WeaponType )
00674 {
00675 case KAGWT_KNIFE:
00676 pTU[0] = fWeaponIndexX + dtexelu; pTV[0] = 0.0f + dtexelv;
00677 pTU[1] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[1] = 0.0f + dtexelv;
00678 pTU[2] = fWeaponIndexX + dtexelu; pTV[2] = 0.0f + fWeaponSizeY + dtexelv;
00679 pTU[3] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[3] = 0.0f + fWeaponSizeY + dtexelv;
00680 break;
00681 case KAGWT_RIFLE:
00682 pTU[0] = fWeaponIndexX + dtexelu; pTV[0] = 0.125f + dtexelv;
00683 pTU[1] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[1] = 0.125f + dtexelv;
00684 pTU[2] = fWeaponIndexX + dtexelu; pTV[2] = 0.125f + fWeaponSizeY + dtexelv;
00685 pTU[3] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[3] = 0.125f + fWeaponSizeY + dtexelv;
00686 break;
00687 case KAGWT_SHOTGUN:
00688 pTU[0] = fWeaponIndexX + dtexelu; pTV[0] = 0.25f + dtexelv;
00689 pTU[1] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[1] = 0.25f + dtexelv;
00690 pTU[2] = fWeaponIndexX + dtexelu; pTV[2] = 0.25f + fWeaponSizeY + dtexelv;
00691 pTU[3] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[3] = 0.25f + fWeaponSizeY + dtexelv;
00692 break;
00693 case KAGWT_ROCKETLAUNCHER:
00694 pTU[0] = fWeaponIndexX + dtexelu; pTV[0] = 0.375f + dtexelv;
00695 pTU[1] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[1] = 0.375f + dtexelv;
00696 pTU[2] = fWeaponIndexX + dtexelu; pTV[2] = 0.375f + fWeaponSizeY + dtexelv;
00697 pTU[3] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[3] = 0.375f + fWeaponSizeY + dtexelv;
00698 break;
00699 case KAGWT_SNIPER:
00700 pTU[0] = fWeaponIndexX + dtexelu; pTV[0] = 0.5f + dtexelv;
00701 pTU[1] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[1] = 0.5f + dtexelv;
00702 pTU[2] = fWeaponIndexX + dtexelu; pTV[2] = 0.5f + fWeaponSizeY + dtexelv;
00703 pTU[3] = fWeaponIndexX + fWeaponSizeX + dtexelu; pTV[3] = 0.5f + fWeaponSizeY + dtexelv;
00704 break;
00705 }
00706
00707 KFPt fSize2 = GetFloatPoint( KPt( 128, 48 ) );
00708 KFPt fSize3 = GetFloatPoint( KPt( 35, 0 ) );
00709 KCOLOR color = GetTeamColor( Team ) ;
00710 if(pMyPlayer->GetCurrentWeapon() == pMyPlayer->GetSelectedObject())
00711 color = KRGB_WHITE ;
00712
00713 DrawQuad( m_Pos.x + OffsetX + fSize3.x + (m_fWeaponBlocPercentOutOfScreen * 0.083984375f), m_Pos.y + (1.0f - fSize2.y) + (0.125f * m_fWeaponBlocPercentOutOfScreen), fSize2.x, fSize2.y, m_hHud, color, KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00714
00715 DisplayWeaponPanel( KFPt( OffsetX, 0.0f ), Team );
00716 OffsetX += 0.275f;
00717 }
00718
00719 m_bDisplayFlagBloc = false ;
00720 for(int iCpt = 0 ; iCpt <= pMyPlayer->GetNbObjectInInventory() ; iCpt ++)
00721 {
00722 K3DObject *pObject = pMyPlayer->GetpObjectInInventory(iCpt) ;
00723
00724 if(pObject != NULL)
00725 {
00726 u32 ObjectType = pObject->GetType() ;
00727
00728 if( ObjectType == KAGOT_FLAG )
00729 {
00730 m_bDisplayFlagBloc = true ;
00731
00732 pTU[0] = (float)0.869140625f + dtexelu; pTV[0] = 0.25390625f + dtexelv;
00733 pTU[1] = (float)0.994140625f + dtexelu; pTV[1] = 0.25390625f + dtexelv;
00734 pTU[2] = (float)0.869140625f + dtexelu; pTV[2] = 0.37890625f + dtexelv;
00735 pTU[3] = (float)0.994140625f + dtexelu; pTV[3] = 0.37890625f + dtexelv;
00736
00737 KFPt fSize2 = GetFloatPoint( KPt( 64, 64 ) );
00738 KFPt fSize3 = GetFloatPoint( KPt( 50, 0 ) );
00739
00740 KCOLOR color = GetTeamColor( Team ) ;
00741 if(pObject == pMyPlayer->GetSelectedObject())
00742 color = KRGB_WHITE ;
00743 DrawQuad( m_Pos.x + OffsetX + fSize3.x + (m_fFlagBlocPercentOutOfScreen * 0.125f), m_Pos.y + 1.0f - fSize2.y + (0.1171875f * m_fFlagBlocPercentOutOfScreen), fSize2.x, fSize2.y, m_hHud, color, KRGB_BLACK, KRM_NORMAL, pTU, pTV );
00744 DisplayFlagPanel( KFPt( OffsetX, 0.0f ), Team );
00745 }
00746 }
00747 }
00748 }
00749
00750
00751 void KAWinHUD::ShowBlood( KDAMAGE Damage )
00752 {
00753 m_BloodTime = g_Time.GetTime();
00754 m_BloodDuration = Damage * 10;
00755 }
00756
00757
00758 void KAWinHUD::DisplayBlood()
00759 {
00760 KCOLOR Color;
00761
00762 KTIME Time = g_Time.GetTime();
00763
00764 if( m_BloodTime + m_BloodDuration > Time )
00765 {
00766 float Intensity = ( ( m_BloodTime + m_BloodDuration - Time ) / (float)( m_BloodDuration ) );
00767
00768 Color = KRGB( u8(255.0f * Intensity), 0, 0 );
00769
00770 DrawQuad( m_Pos.x, m_Pos.y, m_Size.x, m_Size.y, KSHADER_NO, Color, KRGB_BLACK, KRM_ADD );
00771 }
00772 }
00773
00774
00775 void KAWinHUD::DisplayTime()
00776 {
00777 KAClientGameManager* pGameManager = (KAClientGameManager*)g_pClientGameManager;
00778 if( !pGameManager )
00779 return;
00780
00781 KAClientPlayer* pMyPlayer = (KAClientPlayer*)pGameManager->GetpMyPlayer() ;
00782
00783 if(pMyPlayer == NULL)
00784 return ;
00785
00786
00787
00788 KTIME gameTimeLeft = pGameManager->GetGameTimeLeft() ;
00789 KTIME roundTimeLeft = pGameManager->GetRoundTimeLeft() ;
00790
00791 s32 uMinutesGameLeft = gameTimeLeft / 60000 ;
00792 s32 uSecondesGameLeft = (gameTimeLeft - uMinutesGameLeft * 60000) / 1000 ;
00793
00794 s32 uMinutesRoundLeft = roundTimeLeft / 60000 ;
00795 s32 uSecondesRoundLeft = (roundTimeLeft - uMinutesRoundLeft * 60000) / 1000 ;
00796
00797 char cTempGameTime[256] = "" ;
00798 char cTempRoundTime[256] = "" ;
00799
00800 if(uMinutesGameLeft <= 0) uMinutesGameLeft = 0 ;
00801 if(uSecondesGameLeft <= 0) uSecondesGameLeft = 0 ;
00802 if(uMinutesRoundLeft <= 0) uMinutesRoundLeft = 0 ;
00803 if(uSecondesRoundLeft <= 0) uSecondesRoundLeft = 0 ;
00804
00805 sprintf(cTempGameTime,"Game : %i : %i" ,uMinutesGameLeft,uSecondesGameLeft) ;
00806 sprintf(cTempRoundTime,"Round : %i : %i" ,uMinutesRoundLeft,uSecondesRoundLeft) ;
00807
00808 m_pRender->DrawText( GetIntPoint(KFPt( 0.8f , 0.05f )) ,cTempGameTime, KRGB( 200, 200, 200 ), 1.0f );
00809 m_pRender->DrawText( GetIntPoint(KFPt( 0.8f , 0.09f )) , cTempRoundTime, KRGB( 200, 200, 200 ), 1.0f );
00810
00811
00812
00813
00814
00815
00816
00817
00818 }