mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2024-12-12 21:41:48 +00:00
2392 lines
50 KiB
C++
2392 lines
50 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 BFG Edition GPL Source Code
|
|
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
|
|
|
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
===========================================================================
|
|
*/
|
|
#pragma hdrstop
|
|
#include "../../idLib/precompiled.h"
|
|
#include "../Game_local.h"
|
|
|
|
extern idCVar pm_stamina;
|
|
extern idCVar in_useJoystick;
|
|
extern idCVar flashlight_batteryDrainTimeMS;
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::Initialize
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::Initialize( idMenuHandler* data )
|
|
{
|
|
idMenuScreen::Initialize( data );
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ShowScreen
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowScreen( const mainMenuTransition_t transitionType )
|
|
{
|
|
if( menuData != NULL )
|
|
{
|
|
menuGUI = menuData->GetGUI();
|
|
}
|
|
|
|
if( menuGUI == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFScriptObject& root = menuGUI->GetRootObject();
|
|
playerInfo = root.GetNestedObj( "_bottomLeft", "playerInfo", "info" );
|
|
stamina = root.GetNestedObj( "_bottomLeft", "stamina" );
|
|
locationName = root.GetNestedText( "_bottomLeft", "location", "txtVal" );
|
|
tipInfo = root.GetNestedObj( "_left", "tip" );
|
|
|
|
if( playerInfo )
|
|
{
|
|
healthBorder = playerInfo->GetNestedSprite( "healthBorder", "damage" );
|
|
healthPulse = playerInfo->GetNestedSprite( "healthBorder", "pulse" );
|
|
armorFrame = playerInfo->GetNestedSprite( "armorFrame" );
|
|
}
|
|
|
|
// Security Update
|
|
security = root.GetNestedSprite( "_center", "security" );
|
|
securityText = root.GetNestedText( "_center", "security", "info", "txtVal" );
|
|
|
|
// PDA Download
|
|
newPDADownload = root.GetNestedSprite( "_center", "pdaDownload" );
|
|
newPDAName = root.GetNestedText( "_center", "pdaDownload", "info", "txtName" );
|
|
newPDAHeading = root.GetNestedText( "_center", "pdaDownload", "info", "txtHeading" );
|
|
newPDA = root.GetNestedSprite( "_bottomLeft", "newPDA" );
|
|
|
|
// Video Download
|
|
newVideoDownload = root.GetNestedSprite( "_center", "videoDownload" );
|
|
newVideoHeading = root.GetNestedText( "_center", "videoDownload", "info", "txtHeading" );
|
|
newVideo = root.GetNestedSprite( "_bottomLeft", "newVideo" );
|
|
|
|
// Audio Log
|
|
audioLog = root.GetNestedSprite( "_bottomLeft", "audioLog" );
|
|
|
|
// Radio Communication
|
|
communication = root.GetNestedSprite( "_bottomLeft", "communication" );
|
|
|
|
// Oxygen
|
|
oxygen = root.GetNestedSprite( "_bottomLeft", "oxygen" );
|
|
flashlight = root.GetNestedSprite( "_bottomLeft", "flashlight" );
|
|
|
|
// Objective
|
|
objective = root.GetNestedSprite( "_right", "objective" );
|
|
objectiveComplete = root.GetNestedSprite( "_right", "objectiveComplete" );
|
|
|
|
// Ammo Info
|
|
ammoInfo = root.GetNestedSprite( "_bottomRight", "ammoInfo" );
|
|
bsInfo = root.GetNestedSprite( "_bottomRight", "bsInfo" );
|
|
soulcubeInfo = root.GetNestedSprite( "_bottomRight", "soulcube" );
|
|
|
|
// If the player loaded a save with enough souls to use the cube, the icon wouldn't show. We're setting this flag in idPlayer::Restore so we can show the cube after loading a game
|
|
if( showSoulCubeInfoOnLoad == true )
|
|
{
|
|
showSoulCubeInfoOnLoad = false;
|
|
UpdateSoulCube( true );
|
|
}
|
|
|
|
// Weapon pills
|
|
weaponPills = root.GetNestedObj( "_bottomRight", "weaponState" );
|
|
weaponImg = root.GetNestedSprite( "_bottomRight", "weaponIcon" );
|
|
weaponName = root.GetNestedObj( "_bottomRight", "weaponName" );
|
|
|
|
// Pickup Info
|
|
newWeapon = root.GetNestedSprite( "_center", "newWeapon" );
|
|
pickupInfo = root.GetNestedSprite( "_bottomLeft", "pickupInfo" );
|
|
newItem = root.GetNestedSprite( "_left", "newItem" );
|
|
|
|
// Cursors
|
|
talkCursor = root.GetNestedSprite( "_center", "crosshairTalk" );
|
|
combatCursor = root.GetNestedSprite( "_center", "crosshairCombat" );
|
|
grabberCursor = root.GetNestedSprite( "_center", "crosshairGrabber" );
|
|
respawnMessage = root.GetNestedSprite( "_center", "respawnMessage" );
|
|
|
|
// MP OBJECTS
|
|
mpInfo = root.GetNestedSprite( "_top", "mp_info" );
|
|
mpHitInfo = root.GetNestedSprite( "_bottom", "hitInfo" );
|
|
mpTime = root.GetNestedText( "_top", "mp_info", "txtTime" );
|
|
mpMessage = root.GetNestedText( "_top", "mp_info", "txtInfo" );
|
|
mpWeapons = root.GetNestedObj( "_bottom", "mpWeapons" );
|
|
mpChatObject = root.GetNestedSprite( "_left", "mpChat" );
|
|
mpConnection = root.GetNestedSprite( "_center", "connectionMsg" );
|
|
|
|
|
|
// Functions
|
|
|
|
class idTriggerNewPDAOrVideo : public idSWFScriptFunction_RefCounted
|
|
{
|
|
public:
|
|
idTriggerNewPDAOrVideo( idMenuScreen_HUD* _screen ) :
|
|
screen( _screen )
|
|
{
|
|
}
|
|
|
|
idSWFScriptVar Call( idSWFScriptObject* thisObject, const idSWFParmList& parms )
|
|
{
|
|
|
|
if( screen == NULL )
|
|
{
|
|
return idSWFScriptVar();
|
|
}
|
|
|
|
if( parms.Num() != 1 )
|
|
{
|
|
return idSWFScriptVar();
|
|
}
|
|
|
|
bool pdaDownload = parms[0].ToBool();
|
|
if( pdaDownload )
|
|
{
|
|
screen->ToggleNewPDA( true );
|
|
}
|
|
else
|
|
{
|
|
screen->ToggleNewVideo( true );
|
|
}
|
|
|
|
return idSWFScriptVar();
|
|
}
|
|
private:
|
|
idMenuScreen_HUD* screen;
|
|
};
|
|
|
|
menuGUI->SetGlobal( "toggleNewNotification", new idTriggerNewPDAOrVideo( this ) );
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::HideScreen
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::HideScreen( const mainMenuTransition_t transitionType )
|
|
{
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::Update
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::Update()
|
|
{
|
|
|
|
idPlayer* player = gameLocal.GetLocalPlayer();
|
|
if( player == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idMenuScreen::Update();
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateHealth
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateHealthArmor( idPlayer* player )
|
|
{
|
|
|
|
if( !playerInfo || !player )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
playerInfo->GetSprite()->SetYPos( 20.0f );
|
|
}
|
|
else
|
|
{
|
|
playerInfo->GetSprite()->SetYPos( 0.0f );
|
|
}
|
|
|
|
idSWFTextInstance* txtVal = playerInfo->GetNestedText( "health", "txtVal" );
|
|
if( txtVal != NULL )
|
|
{
|
|
txtVal->SetText( va( "%d", player->health ) );
|
|
txtVal->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
|
|
// Set the damage color
|
|
swfColorRGBA_t color;
|
|
color.r = 255;
|
|
color.a = 255;
|
|
uint8 gbColor;
|
|
if( player->health > 60 )
|
|
{
|
|
gbColor = 255;
|
|
}
|
|
else if( player->health > 30 )
|
|
{
|
|
gbColor = 156;
|
|
}
|
|
else
|
|
{
|
|
gbColor = 0;
|
|
}
|
|
color.g = gbColor;
|
|
color.b = gbColor;
|
|
txtVal->color = color;
|
|
}
|
|
|
|
txtVal = playerInfo->GetNestedText( "armor", "txtVal" );
|
|
if( txtVal != NULL )
|
|
{
|
|
txtVal->SetText( va( "%d", player->inventory.armor ) );
|
|
txtVal->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
|
|
if( armorFrame != NULL )
|
|
{
|
|
if( player->inventory.armor == 0 )
|
|
{
|
|
armorFrame->StopFrame( 2 );
|
|
}
|
|
else
|
|
{
|
|
armorFrame->StopFrame( 1 );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( healthBorder != NULL )
|
|
{
|
|
healthBorder->StopFrame( 100 - player->health + 1 );
|
|
}
|
|
|
|
if( healthPulse != NULL )
|
|
{
|
|
if( player->healthPulse )
|
|
{
|
|
player->StartSound( "snd_healthpulse", SND_CHANNEL_ITEM, 0, false, NULL );
|
|
player->healthPulse = false;
|
|
healthPulse->SetVisible( true );
|
|
healthPulse->PlayFrame( "rollOn" );
|
|
}
|
|
|
|
if( player->healthTake )
|
|
{
|
|
player->StartSound( "snd_healthtake", SND_CHANNEL_ITEM, 0, false, NULL );
|
|
player->healthTake = false;
|
|
healthPulse->SetVisible( true );
|
|
healthPulse->PlayFrame( "rollOn" );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateStamina
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateStamina( idPlayer* player )
|
|
{
|
|
|
|
if( !stamina || !player )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFSpriteInstance* stamSprite = stamina->GetSprite();
|
|
if( stamSprite != NULL )
|
|
{
|
|
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
stamSprite->SetVisible( false );
|
|
}
|
|
else
|
|
{
|
|
float max_stamina = pm_stamina.GetFloat();
|
|
if( !max_stamina )
|
|
{
|
|
stamSprite->SetVisible( false );
|
|
}
|
|
else
|
|
{
|
|
stamSprite->SetVisible( true );
|
|
float staminaPercent = idMath::Ftoi( 100.0f * player->stamina / max_stamina );
|
|
stamSprite->StopFrame( staminaPercent + 1 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateLocation
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateWeaponInfo( idPlayer* player )
|
|
{
|
|
|
|
if( !player || !ammoInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idEntityPtr<idWeapon> weapon = player->weapon;
|
|
|
|
assert( weapon.GetEntity() );
|
|
|
|
int inClip = weapon.GetEntity()->AmmoInClip();
|
|
int ammoAmount = weapon.GetEntity()->AmmoAvailable();
|
|
|
|
//Make sure the hud always knows how many bloodstone charges there are
|
|
int ammoRequired;
|
|
int bloodstoneAmmo = 0;
|
|
if( player->weapon_bloodstone >= 0 )
|
|
{
|
|
ammo_t ammo_i = player->inventory.AmmoIndexForWeaponClass( "weapon_bloodstone_passive", &ammoRequired );
|
|
bloodstoneAmmo = player->inventory.HasAmmo( ammo_i, ammoRequired );
|
|
}
|
|
if( bsInfo )
|
|
{
|
|
if( bloodstoneAmmo > 0 )
|
|
{
|
|
bsInfo->SetVisible( true );
|
|
bsInfo->StopFrame( bloodstoneAmmo + 1 );
|
|
}
|
|
else
|
|
{
|
|
bsInfo->SetVisible( false );
|
|
}
|
|
}
|
|
|
|
if( ammoAmount == -1 || player->GetCurrentWeaponSlot() == player->weapon_bloodstone || player->GetCurrentWeaponSlot() == player->weapon_soulcube )
|
|
{
|
|
|
|
ammoInfo->SetVisible( false );
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
idStr totalAmmo;
|
|
idStr playerAmmo;
|
|
idStr playerClip;
|
|
|
|
bool showClip = true;
|
|
|
|
//Hack to stop the bloodstone ammo to display when it is being activated
|
|
if( !weapon.GetEntity()->IsReady() )
|
|
{
|
|
// show infinite ammo
|
|
playerAmmo = "";
|
|
totalAmmo = "";
|
|
}
|
|
else
|
|
{
|
|
// show remaining ammo
|
|
totalAmmo = va( "%i", ammoAmount );
|
|
playerAmmo = weapon.GetEntity()->ClipSize() ? va( "%i", inClip ) : "--"; // how much in the current clip
|
|
playerClip = weapon.GetEntity()->ClipSize() ? va( "%i", ammoAmount / weapon.GetEntity()->ClipSize() ) : "--";
|
|
//allAmmo = va( "%i/%i", inClip, ammoAmount );
|
|
}
|
|
|
|
if( !weapon.GetEntity()->ClipSize() )
|
|
{
|
|
showClip = false;
|
|
}
|
|
|
|
bool ammoEmpty = ( ammoAmount == 0 );
|
|
bool clipEmpty = ( weapon.GetEntity()->ClipSize() ? inClip == 0 : false );
|
|
bool clipLow = ( weapon.GetEntity()->ClipSize() ? inClip <= weapon.GetEntity()->LowAmmo() : false );
|
|
|
|
//Hack to stop the bloodstone ammo to display when it is being activated
|
|
if( player->GetCurrentWeaponSlot() == player->weapon_bloodstone )
|
|
{
|
|
ammoEmpty = false;
|
|
clipEmpty = false;
|
|
clipLow = false;
|
|
}
|
|
|
|
if( showClip )
|
|
{
|
|
|
|
ammoInfo->SetVisible( true );
|
|
ammoInfo->StopFrame( 1 );
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
ammoInfo->SetYPos( 20.0f );
|
|
}
|
|
else
|
|
{
|
|
ammoInfo->SetYPos( 0.0f );
|
|
}
|
|
idSWFSpriteInstance* txtClipSprite = ammoInfo->GetScriptObject()->GetNestedSprite( "info", "clip" );
|
|
idSWFSpriteInstance* clipLowSprite = ammoInfo->GetScriptObject()->GetNestedSprite( "info", "lowAmmo" );
|
|
idSWFSpriteInstance* clipEmptySprite = ammoInfo->GetScriptObject()->GetNestedSprite( "info", "clipEmpty" );
|
|
idSWFSpriteInstance* ammoEmptySprite = ammoInfo->GetScriptObject()->GetNestedSprite( "info", "noAmmo" );
|
|
idSWFSpriteInstance* txtAmmoSprite = ammoInfo->GetScriptObject()->GetNestedSprite( "info", "ammoCount" );
|
|
|
|
idSWFTextInstance* txtClip = ammoInfo->GetScriptObject()->GetNestedText( "info", "clip", "clipCount", "txtVal" );
|
|
idSWFTextInstance* txtAmmo = ammoInfo->GetScriptObject()->GetNestedText( "info", "ammoCount", "txtVal" );
|
|
|
|
if( txtClipSprite && clipLowSprite && clipEmptySprite )
|
|
{
|
|
|
|
if( clipEmpty )
|
|
{
|
|
clipLowSprite->SetVisible( false );
|
|
clipEmptySprite->SetVisible( true );
|
|
txtClipSprite->StopFrame( 3 );
|
|
}
|
|
else if( clipLow )
|
|
{
|
|
clipLowSprite->SetVisible( true );
|
|
clipEmptySprite->SetVisible( false );
|
|
txtClipSprite->StopFrame( 2 );
|
|
}
|
|
else
|
|
{
|
|
clipLowSprite->SetVisible( false );
|
|
clipEmptySprite->SetVisible( false );
|
|
txtClipSprite->StopFrame( 1 );
|
|
}
|
|
|
|
if( txtClip != NULL )
|
|
{
|
|
txtClip->SetText( playerAmmo );
|
|
txtClip->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
}
|
|
|
|
if( txtAmmo != NULL )
|
|
{
|
|
|
|
if( ammoEmptySprite && txtAmmoSprite )
|
|
{
|
|
if( ammoEmpty )
|
|
{
|
|
ammoEmptySprite->SetVisible( true );
|
|
txtAmmoSprite->StopFrame( 2 );
|
|
}
|
|
else
|
|
{
|
|
ammoEmptySprite->SetVisible( false );
|
|
txtAmmoSprite->StopFrame( 1 );
|
|
}
|
|
}
|
|
|
|
txtAmmo->SetText( totalAmmo );
|
|
txtAmmo->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
ammoInfo->SetVisible( true );
|
|
ammoInfo->StopFrame( 2 );
|
|
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
ammoInfo->SetYPos( 20.0f );
|
|
}
|
|
else
|
|
{
|
|
ammoInfo->SetYPos( 0.0f );
|
|
}
|
|
|
|
idSWFTextInstance* txtAmmo = ammoInfo->GetScriptObject()->GetNestedText( "info", "txtVal" );
|
|
|
|
if( txtAmmo != NULL )
|
|
{
|
|
txtAmmo->SetText( totalAmmo );
|
|
txtAmmo->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::GiveWeapon
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::GiveWeapon( idPlayer* player, int weaponIndex )
|
|
{
|
|
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
const char* weapnum = va( "def_weapon%d", weaponIndex );
|
|
const char* weap = player->spawnArgs.GetString( weapnum );
|
|
if( weap != NULL && *weap != NULL )
|
|
{
|
|
const idDeclEntityDef* weaponDef = gameLocal.FindEntityDef( weap, false );
|
|
if( weaponDef != NULL )
|
|
{
|
|
const char* hudIconName = weaponDef->dict.GetString( "hudIcon" );
|
|
if( hudIconName[ 0 ] == '\0' )
|
|
{
|
|
idLib::Warning( "idMenuScreen_HUD: Missing hudIcon for weapon %s", weap );
|
|
return;
|
|
}
|
|
|
|
const idMaterial* hudIcon = declManager->FindMaterial( hudIconName, false );
|
|
if( newWeapon != NULL )
|
|
{
|
|
newWeapon->SetVisible( true );
|
|
newWeapon->PlayFrame( 2 );
|
|
|
|
idSWFSpriteInstance* topImg = newWeapon->GetScriptObject()->GetNestedSprite( "topImg" );
|
|
idSWFSpriteInstance* botImg = newWeapon->GetScriptObject()->GetNestedSprite( "botImg" );
|
|
|
|
if( topImg && botImg )
|
|
{
|
|
topImg->SetMaterial( hudIcon );
|
|
botImg->SetMaterial( hudIcon );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateWeaponStates
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdatePickupInfo( int index, const idStr& name )
|
|
{
|
|
|
|
if( !pickupInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFTextInstance* txtItem = pickupInfo->GetScriptObject()->GetNestedText( va( "item%d", index ), "txtVal" );
|
|
if( txtItem != NULL )
|
|
{
|
|
txtItem->SetText( name );
|
|
txtItem->SetStrokeInfo( true, 0.6f, 2.0f );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::IsPickupListReady
|
|
========================
|
|
*/
|
|
bool idMenuScreen_HUD::IsPickupListReady()
|
|
{
|
|
|
|
if( !pickupInfo )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if( pickupInfo->GetCurrentFrame() == 1 )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateWeaponStates
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowPickups()
|
|
{
|
|
|
|
if( !pickupInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
pickupInfo->SetVisible( true );
|
|
pickupInfo->PlayFrame( "rollOn" );
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetCursorState
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetCursorState( idPlayer* player, cursorState_t state, int set )
|
|
{
|
|
|
|
switch( state )
|
|
{
|
|
case CURSOR_TALK:
|
|
{
|
|
cursorNone = 0;
|
|
cursorTalking = set;
|
|
break;
|
|
}
|
|
case CURSOR_IN_COMBAT:
|
|
{
|
|
cursorNone = 0;
|
|
cursorInCombat = set;
|
|
break;
|
|
}
|
|
case CURSOR_ITEM:
|
|
{
|
|
cursorNone = 0;
|
|
cursorItem = set;
|
|
break;
|
|
}
|
|
case CURSOR_GRABBER:
|
|
{
|
|
cursorNone = 0;
|
|
cursorGrabber = set;
|
|
break;
|
|
}
|
|
case CURSOR_NONE:
|
|
{
|
|
// so that talk button still appears for 3D view
|
|
if( cursorState != CURSOR_TALK || cursorTalking != 1 )
|
|
{
|
|
cursorTalking = 0;
|
|
cursorGrabber = 0;
|
|
cursorInCombat = 0;
|
|
cursorItem = 0;
|
|
cursorNone = 1;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetCursorText
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetCursorText( const idStr& action, const idStr& focus )
|
|
{
|
|
cursorAction = action;
|
|
cursorFocus = focus;
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::CombatCursorFlash
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::CombatCursorFlash()
|
|
{
|
|
|
|
if( cursorInCombat )
|
|
{
|
|
if( cursorState == CURSOR_IN_COMBAT )
|
|
{
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->PlayFrame( "hit" );
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateCursorState
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateCursorState()
|
|
{
|
|
|
|
if( !cursorTalking && !cursorInCombat && !cursorGrabber && !cursorItem )
|
|
{
|
|
|
|
cursorNone = true;
|
|
cursorState = CURSOR_NONE;
|
|
|
|
// hide all cursors
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->StopFrame( 1 );
|
|
combatCursor->SetVisible( false );
|
|
}
|
|
|
|
if( talkCursor )
|
|
{
|
|
talkCursor->StopFrame( 1 );
|
|
talkCursor->SetVisible( false );
|
|
}
|
|
|
|
if( grabberCursor )
|
|
{
|
|
grabberCursor->StopFrame( 1 );
|
|
grabberCursor->SetVisible( false );
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if( cursorTalking )
|
|
{
|
|
|
|
if( cursorTalking == 1 ) // ready to talk
|
|
{
|
|
|
|
}
|
|
else if( cursorTalking == 2 ) // already talking / busy
|
|
{
|
|
|
|
}
|
|
|
|
if( cursorState != CURSOR_TALK )
|
|
{
|
|
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->StopFrame( 1 );
|
|
combatCursor->SetVisible( false );
|
|
}
|
|
|
|
if( grabberCursor )
|
|
{
|
|
grabberCursor->StopFrame( 1 );
|
|
grabberCursor->SetVisible( false );
|
|
}
|
|
|
|
// play roll on
|
|
if( talkCursor )
|
|
{
|
|
talkCursor->SetVisible( true );
|
|
talkCursor->PlayFrame( 2 );
|
|
|
|
idSWFSpriteInstance* topBacking = talkCursor->GetScriptObject()->GetNestedSprite( "backing", "topBar" );
|
|
idSWFSpriteInstance* bottomBacking = talkCursor->GetScriptObject()->GetNestedSprite( "backing", "botBar" );
|
|
|
|
idSWFTextInstance* txtAction = talkCursor->GetScriptObject()->GetNestedText( "info", "txtAction" );
|
|
idSWFTextInstance* txtFocus = talkCursor->GetScriptObject()->GetNestedText( "info", "txtFocus" );
|
|
|
|
idSWFTextInstance* txtPrompt = talkCursor->GetScriptObject()->GetNestedText( "talkPrompt", "txtPrompt" );
|
|
|
|
if( txtAction )
|
|
{
|
|
|
|
if( !in_useJoystick.GetBool() )
|
|
{
|
|
txtAction->tooltip = true;
|
|
keyBindings_t bind = idKeyInput::KeyBindingsFromBinding( "_use", true );
|
|
idStr actionText = idLocalization::GetString( cursorAction );
|
|
if( !bind.mouse.IsEmpty() )
|
|
{
|
|
actionText.Append( " [" );
|
|
actionText.Append( bind.mouse );
|
|
actionText.Append( "]" );
|
|
}
|
|
else if( !bind.keyboard.IsEmpty() )
|
|
{
|
|
actionText.Append( " [" );
|
|
actionText.Append( bind.keyboard );
|
|
actionText.Append( "]" );
|
|
}
|
|
|
|
txtAction->SetText( actionText );
|
|
}
|
|
else
|
|
{
|
|
txtAction->tooltip = false;
|
|
txtAction->SetText( cursorAction );
|
|
}
|
|
txtAction->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
float actionLength = txtAction->GetTextLength();
|
|
|
|
if( topBacking )
|
|
{
|
|
if( !cursorAction.IsEmpty() )
|
|
{
|
|
topBacking->SetXPos( actionLength );
|
|
}
|
|
else
|
|
{
|
|
topBacking->SetXPos( -75.0f );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( txtFocus )
|
|
{
|
|
txtFocus->SetText( cursorFocus );
|
|
txtFocus->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
float focusLength = txtFocus->GetTextLength();
|
|
|
|
if( bottomBacking )
|
|
{
|
|
if( !cursorFocus.IsEmpty() )
|
|
{
|
|
bottomBacking->SetXPos( focusLength );
|
|
}
|
|
else
|
|
{
|
|
bottomBacking->SetXPos( -75.0f );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( txtPrompt )
|
|
{
|
|
if( in_useJoystick.GetBool() )
|
|
{
|
|
txtPrompt->tooltip = true;
|
|
txtPrompt->SetText( "_use" );
|
|
}
|
|
else
|
|
{
|
|
txtPrompt->tooltip = false;
|
|
txtPrompt->SetText( "" );
|
|
}
|
|
}
|
|
}
|
|
cursorState = CURSOR_TALK;
|
|
}
|
|
|
|
}
|
|
else if( cursorGrabber )
|
|
{
|
|
|
|
if( talkCursor )
|
|
{
|
|
talkCursor->StopFrame( 1 );
|
|
talkCursor->SetVisible( false );
|
|
}
|
|
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->StopFrame( 1 );
|
|
combatCursor->SetVisible( false );
|
|
}
|
|
|
|
if( cursorState != CURSOR_GRABBER )
|
|
{
|
|
if( grabberCursor )
|
|
{
|
|
grabberCursor->SetVisible( true );
|
|
grabberCursor->PlayFrame( "loop" );
|
|
}
|
|
}
|
|
|
|
cursorState = CURSOR_GRABBER;
|
|
|
|
}
|
|
else if( cursorItem )
|
|
{
|
|
|
|
cursorState = CURSOR_ITEM;
|
|
|
|
}
|
|
else if( cursorInCombat )
|
|
{
|
|
|
|
if( cursorState == CURSOR_TALK )
|
|
{
|
|
if( talkCursor )
|
|
{
|
|
talkCursor->StopFrame( 1 );
|
|
talkCursor->SetVisible( false );
|
|
}
|
|
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->SetVisible( true );
|
|
combatCursor->PlayFrame( "rollOn" );
|
|
}
|
|
|
|
// play cursor roll on
|
|
}
|
|
else if( cursorState != CURSOR_IN_COMBAT )
|
|
{
|
|
|
|
if( grabberCursor )
|
|
{
|
|
grabberCursor->StopFrame( 1 );
|
|
grabberCursor->SetVisible( false );
|
|
}
|
|
|
|
// set cursor visible
|
|
if( combatCursor )
|
|
{
|
|
combatCursor->SetVisible( true );
|
|
combatCursor->StopFrame( 2 );
|
|
}
|
|
|
|
}
|
|
|
|
cursorState = CURSOR_IN_COMBAT;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateSoulCube
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateSoulCube( bool ready )
|
|
{
|
|
|
|
if( !soulcubeInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( ready && !soulcubeInfo->IsVisible() )
|
|
{
|
|
soulcubeInfo->SetVisible( true );
|
|
soulcubeInfo->PlayFrame( "rollOn" );
|
|
}
|
|
else if( !ready )
|
|
{
|
|
soulcubeInfo->PlayFrame( "rollOff" );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ShowRespawnMessage
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowRespawnMessage( bool show )
|
|
{
|
|
|
|
if( !respawnMessage )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show )
|
|
{
|
|
respawnMessage->SetVisible( true );
|
|
respawnMessage->PlayFrame( "rollOn" );
|
|
|
|
idSWFTextInstance* message = respawnMessage->GetScriptObject()->GetNestedText( "info", "txtMessage" );
|
|
if( message != NULL )
|
|
{
|
|
message->tooltip = true;
|
|
message->SetText( "#str_respawn_message" );
|
|
message->SetStrokeInfo( true );
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if( respawnMessage->IsVisible() )
|
|
{
|
|
respawnMessage->PlayFrame( "rollOff" );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateWeaponStates
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateWeaponStates( idPlayer* player, bool weaponChanged )
|
|
{
|
|
|
|
if( !weaponPills )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( player == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idStr displayName;
|
|
if( common->IsMultiplayer() )
|
|
{
|
|
|
|
if( !mpWeapons || player->GetIdealWeapon() == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
weaponPills->GetSprite()->SetVisible( false );
|
|
|
|
if( weaponChanged )
|
|
{
|
|
mpWeapons->GetSprite()->SetVisible( true );
|
|
mpWeapons->GetSprite()->PlayFrame( "rollOn" );
|
|
|
|
int weaponDefIndex = -1;
|
|
idList< idStr > weaponDefNames;
|
|
// start at 1 so we skip the fists
|
|
for( int i = 1; i < MAX_WEAPONS; ++i )
|
|
{
|
|
if( player->inventory.weapons & ( 1 << i ) )
|
|
{
|
|
if( i == player->GetIdealWeapon() )
|
|
{
|
|
weaponDefIndex = weaponDefNames.Num();
|
|
}
|
|
weaponDefNames.Append( va( "def_weapon%d", i ) );
|
|
}
|
|
}
|
|
|
|
int numRightWeapons = 0;
|
|
int numLeftWeapons = 0;
|
|
|
|
if( weaponDefNames.Num() == 2 )
|
|
{
|
|
numRightWeapons = 1 - weaponDefIndex;
|
|
numLeftWeapons = weaponDefIndex;
|
|
}
|
|
else if( weaponDefNames.Num() == 3 )
|
|
{
|
|
numRightWeapons = 1;
|
|
numLeftWeapons = 1;
|
|
}
|
|
else if( weaponDefNames.Num() > 3 )
|
|
{
|
|
numRightWeapons = 2;
|
|
numLeftWeapons = 2;
|
|
}
|
|
|
|
for( int i = -2; i < 3; ++i )
|
|
{
|
|
|
|
bool hide = false;
|
|
|
|
if( i < 0 && idMath::Abs( i ) > numLeftWeapons )
|
|
{
|
|
hide = true;
|
|
}
|
|
else if( i > numRightWeapons )
|
|
{
|
|
hide = true;
|
|
}
|
|
else if( weaponDefNames.Num() == 0 )
|
|
{
|
|
hide = true;
|
|
}
|
|
|
|
int index = i;
|
|
if( i < 0 )
|
|
{
|
|
index = 2 + idMath::Abs( i );
|
|
}
|
|
|
|
idSWFSpriteInstance* topValid = mpWeapons->GetNestedSprite( "list", va( "weapon%i", index ), "topValid" );
|
|
idSWFSpriteInstance* botValid = mpWeapons->GetNestedSprite( "list", va( "weapon%i", index ), "botValid" );
|
|
idSWFSpriteInstance* topInvalid = mpWeapons->GetNestedSprite( "list", va( "weapon%i", index ), "topInvalid" );
|
|
idSWFSpriteInstance* botInvalid = mpWeapons->GetNestedSprite( "list", va( "weapon%i", index ), "botInvalid" );
|
|
|
|
if( !topValid || !botValid || !topInvalid || !botInvalid )
|
|
{
|
|
mpWeapons->GetSprite()->SetVisible( false );
|
|
break;
|
|
}
|
|
|
|
if( hide )
|
|
{
|
|
topValid->SetVisible( false );
|
|
botValid->SetVisible( false );
|
|
topInvalid->SetVisible( false );
|
|
botInvalid->SetVisible( false );
|
|
continue;
|
|
}
|
|
|
|
int weaponIndex = weaponDefIndex + i;
|
|
if( weaponIndex < 0 )
|
|
{
|
|
weaponIndex = weaponDefNames.Num() + weaponIndex;
|
|
}
|
|
else if( weaponIndex >= weaponDefNames.Num() )
|
|
{
|
|
weaponIndex = ( weaponIndex - weaponDefNames.Num() );
|
|
}
|
|
|
|
int weapState = 1;
|
|
const idMaterial* hudIcon = NULL;
|
|
const char* weapNum = weaponDefNames[ weaponIndex ];
|
|
const char* weap = player->spawnArgs.GetString( weapNum );
|
|
if( weap != NULL && *weap != NULL )
|
|
{
|
|
const idDeclEntityDef* weaponDef = gameLocal.FindEntityDef( weap, false );
|
|
if( weaponDef != NULL )
|
|
{
|
|
hudIcon = declManager->FindMaterial( weaponDef->dict.GetString( "hudIcon" ), false );
|
|
if( i == 0 )
|
|
{
|
|
displayName = weaponDef->dict.GetString( "display_name" );
|
|
weapState++;
|
|
}
|
|
}
|
|
|
|
if( !player->inventory.HasAmmo( weap, true, player ) )
|
|
{
|
|
weapState = 0;
|
|
}
|
|
}
|
|
|
|
topValid->SetVisible( false );
|
|
botValid->SetVisible( false );
|
|
topInvalid->SetVisible( false );
|
|
botInvalid->SetVisible( false );
|
|
|
|
topValid->SetMaterial( hudIcon );
|
|
botValid->SetMaterial( hudIcon );
|
|
topInvalid->SetMaterial( hudIcon );
|
|
botInvalid->SetMaterial( hudIcon );
|
|
|
|
if( weapState == 0 )
|
|
{
|
|
botInvalid->SetVisible( true );
|
|
if( i == 0 )
|
|
{
|
|
topInvalid->SetVisible( true );
|
|
}
|
|
}
|
|
else if( weapState == 2 )
|
|
{
|
|
topValid->SetVisible( true );
|
|
botValid->SetVisible( true );
|
|
}
|
|
else
|
|
{
|
|
botValid->SetVisible( true );
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
bool hasWeapons = false;
|
|
const idMaterial* hudIcon = NULL;
|
|
|
|
for( int i = 0; i < MAX_WEAPONS; i++ )
|
|
{
|
|
const char* weapnum = va( "def_weapon%d", i );
|
|
int weapstate = 0;
|
|
if( player->inventory.weapons & ( 1 << i ) )
|
|
{
|
|
hasWeapons = true;
|
|
const char* weap = player->spawnArgs.GetString( weapnum );
|
|
if( weap != NULL && *weap != NULL )
|
|
{
|
|
weapstate++;
|
|
}
|
|
if( player->GetIdealWeapon() == i )
|
|
{
|
|
|
|
const idDeclEntityDef* weaponDef = gameLocal.FindEntityDef( weap, false );
|
|
if( weaponDef != NULL )
|
|
{
|
|
hudIcon = declManager->FindMaterial( weaponDef->dict.GetString( "hudIcon" ), false );
|
|
displayName = weaponDef->dict.GetString( "display_name" );
|
|
}
|
|
|
|
weapstate++;
|
|
}
|
|
}
|
|
|
|
idSWFSpriteInstance* pill = weaponPills->GetNestedSprite( va( "pill%d", i ) );
|
|
if( pill )
|
|
{
|
|
pill->StopFrame( weapstate + 1 );
|
|
}
|
|
}
|
|
|
|
if( !hasWeapons )
|
|
{
|
|
weaponPills->GetSprite()->SetVisible( false );
|
|
}
|
|
else
|
|
{
|
|
weaponPills->GetSprite()->SetVisible( true );
|
|
}
|
|
|
|
if( weaponImg )
|
|
{
|
|
if( weaponChanged && hudIcon != NULL )
|
|
{
|
|
weaponImg->SetVisible( true );
|
|
weaponImg->PlayFrame( 2 );
|
|
|
|
idSWFSpriteInstance* topImg = weaponImg->GetScriptObject()->GetNestedSprite( "topImg" );
|
|
idSWFSpriteInstance* botImg = weaponImg->GetScriptObject()->GetNestedSprite( "botImg" );
|
|
|
|
if( topImg != NULL && botImg != NULL )
|
|
{
|
|
topImg->SetMaterial( hudIcon );
|
|
botImg->SetMaterial( hudIcon );
|
|
}
|
|
|
|
/*if ( weaponName && weaponName->GetSprite() ) {
|
|
weaponName->GetSprite()->SetVisible( true );
|
|
weaponName->GetSprite()->PlayFrame( 2 );
|
|
|
|
idSWFTextInstance * txtVal = weaponName->GetNestedText( "info", "txtVal" );
|
|
if ( txtVal != NULL ) {
|
|
txtVal->SetText( displayName );
|
|
txtVal->SetStrokeInfo( true, 0.6f, 2.0f );
|
|
}
|
|
}*/
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateLocation
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateLocation( idPlayer* player )
|
|
{
|
|
|
|
if( !locationName || !player )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idPlayer* playertoLoc = player;
|
|
if( player->spectating && player->spectator != player->entityNumber )
|
|
{
|
|
playertoLoc = static_cast< idPlayer* >( gameLocal.entities[ player->spectator ] );
|
|
if( playertoLoc == NULL )
|
|
{
|
|
playertoLoc = player;
|
|
}
|
|
}
|
|
|
|
idLocationEntity* locationEntity = gameLocal.LocationForPoint( playertoLoc->GetEyePosition() );
|
|
if( locationEntity )
|
|
{
|
|
locationName->SetText( locationEntity->GetLocation() );
|
|
}
|
|
else
|
|
{
|
|
locationName->SetText( idLocalization::GetString( "#str_02911" ) );
|
|
}
|
|
locationName->SetStrokeInfo( true, 0.6f, 2.0f );
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ShowTip
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowTip( const char* title, const char* tip )
|
|
{
|
|
|
|
if( !tipInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFSpriteInstance* tipSprite = tipInfo->GetSprite();
|
|
|
|
if( !tipSprite )
|
|
{
|
|
return;
|
|
}
|
|
|
|
tipSprite->SetVisible( true );
|
|
tipSprite->PlayFrame( "rollOn" );
|
|
|
|
idSWFTextInstance* txtTitle = tipInfo->GetNestedText( "info", "txtTitle" );
|
|
idSWFTextInstance* txtTip = tipInfo->GetNestedText( "info", "txtTip" );
|
|
|
|
if( txtTitle != NULL )
|
|
{
|
|
txtTitle->SetText( title );
|
|
txtTitle->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
|
|
if( txtTip != NULL )
|
|
{
|
|
txtTip->SetText( tip );
|
|
txtTip->tooltip = true;
|
|
txtTip->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
int numLines = txtTip->CalcNumLines();
|
|
if( numLines == 0 )
|
|
{
|
|
numLines = 1;
|
|
}
|
|
idSWFSpriteInstance* backing = tipInfo->GetNestedSprite( "info", "backing" );
|
|
if( backing != NULL )
|
|
{
|
|
backing->StopFrame( numLines );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::HideTip
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::HideTip()
|
|
{
|
|
|
|
if( !tipInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFSpriteInstance* tipSprite = tipInfo->GetSprite();
|
|
|
|
if( !tipSprite )
|
|
{
|
|
return;
|
|
}
|
|
|
|
tipSprite->SetVisible( true );
|
|
tipSprite->PlayFrame( "rollOff" );
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::DownloadPDA
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::DownloadPDA( const idDeclPDA* pda, bool newSecurity )
|
|
{
|
|
|
|
if( newPDADownload )
|
|
{
|
|
newPDADownload->SetVisible( true );
|
|
newPDADownload->PlayFrame( "rollOn" );
|
|
|
|
newPDAName = newPDADownload->GetScriptObject()->GetNestedText( "info", "txtName" );
|
|
newPDAHeading = newPDADownload->GetScriptObject()->GetNestedText( "info", "txtHeading" );
|
|
|
|
if( newPDAName && GetSWFObject() != NULL )
|
|
{
|
|
idStr pdaName = pda->GetPdaName();
|
|
pdaName.RemoveColors();
|
|
GetSWFObject()->SetGlobal( "pdaNameDownload", pdaName );
|
|
newPDAName->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
|
|
if( newPDAHeading && GetSWFObject() != NULL )
|
|
{
|
|
GetSWFObject()->SetGlobal( "pdaDownloadHeading", "#str_02031" );
|
|
newPDAHeading->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
}
|
|
|
|
if( newSecurity )
|
|
{
|
|
UpdatedSecurity();
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::DownloadVideo
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::DownloadVideo()
|
|
{
|
|
|
|
if( newVideoDownload )
|
|
{
|
|
newVideoDownload->SetVisible( true );
|
|
newVideoDownload->PlayFrame( "rollOn" );
|
|
|
|
newVideoHeading = newVideoDownload->GetScriptObject()->GetNestedText( "info", "txtHeading" );
|
|
|
|
if( newVideoHeading )
|
|
{
|
|
newVideoHeading->SetText( "#str_02033" );
|
|
newVideoHeading->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdatedSecurity
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdatedSecurity()
|
|
{
|
|
if( security != NULL && securityText != NULL )
|
|
{
|
|
security->SetVisible( true );
|
|
security->PlayFrame( "rollOn" );
|
|
securityText->SetText( "#str_02032" );
|
|
securityText->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ClearNewPDAInfo
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ClearNewPDAInfo()
|
|
{
|
|
|
|
ToggleNewVideo( false );
|
|
ToggleNewPDA( false );
|
|
|
|
if( security )
|
|
{
|
|
security->StopFrame( 1 );
|
|
}
|
|
|
|
if( newPDADownload )
|
|
{
|
|
newPDADownload->StopFrame( 1 );
|
|
}
|
|
|
|
if( newVideoDownload )
|
|
{
|
|
newVideoDownload->StopFrame( 1 );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdatedSecurity
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ToggleNewVideo( bool show )
|
|
{
|
|
|
|
if( !newVideo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show && !newVideo->IsVisible() )
|
|
{
|
|
newVideo->SetVisible( true );
|
|
newVideo->PlayFrame( "rollOn" );
|
|
}
|
|
else if( !show )
|
|
{
|
|
newVideo->StopFrame( 1 );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdatedSecurity
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ToggleNewPDA( bool show )
|
|
{
|
|
|
|
if( !newPDA )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show && !newPDA->IsVisible() )
|
|
{
|
|
newPDA->SetVisible( true );
|
|
newPDA->PlayFrame( "rollOn" );
|
|
}
|
|
else if( !show )
|
|
{
|
|
newPDA->StopFrame( 1 );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdatedSecurity
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateAudioLog( bool show )
|
|
{
|
|
|
|
if( !audioLog )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show && !audioLog->IsVisible() )
|
|
{
|
|
audioLog->SetVisible( true );
|
|
audioLog->StopFrame( "2" );
|
|
|
|
for( int index = 0; index < 13; ++index )
|
|
{
|
|
idSWFSpriteInstance* node = audioLog->GetScriptObject()->GetNestedSprite( "bar", va( "node%d", index ) );
|
|
if( node != NULL )
|
|
{
|
|
int frame = gameLocal.random.RandomInt( 100 );
|
|
node->SetScale( 100.0f, frame );
|
|
float toFrame = gameLocal.random.RandomFloat();
|
|
node->SetMoveToScale( -1.0f, toFrame );
|
|
}
|
|
}
|
|
|
|
}
|
|
else if( !show )
|
|
{
|
|
|
|
audioLog->StopFrame( 1 );
|
|
|
|
}
|
|
else if( show )
|
|
{
|
|
|
|
if( audioLogPrevTime == 0 )
|
|
{
|
|
audioLogPrevTime = gameLocal.time;
|
|
}
|
|
|
|
for( int index = 0; index < 13; ++index )
|
|
{
|
|
idSWFSpriteInstance* node = audioLog->GetScriptObject()->GetNestedSprite( "bar", va( "node%d", index ) );
|
|
if( node != NULL )
|
|
{
|
|
float diff = gameLocal.time - audioLogPrevTime;
|
|
float speed = ( diff / 350.0f ) * 100.0f;
|
|
if( !node->UpdateMoveToScale( speed ) )
|
|
{
|
|
int frame = gameLocal.random.RandomInt( 100 );
|
|
float scale = frame / 100.0f;
|
|
node->SetMoveToScale( -1.0f, scale );
|
|
}
|
|
}
|
|
}
|
|
audioLogPrevTime = gameLocal.time;
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdatedSecurity
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateCommunication( bool show, idPlayer* player )
|
|
{
|
|
|
|
if( !communication || !player )
|
|
{
|
|
return;
|
|
}
|
|
|
|
bool oxygenChanged = false;
|
|
if( inVaccuum != oxygenComm )
|
|
{
|
|
oxygenChanged = true;
|
|
}
|
|
|
|
if( show && !communication->IsVisible() )
|
|
{
|
|
communication->SetVisible( true );
|
|
if( inVaccuum )
|
|
{
|
|
communication->StopFrame( "oxygen" );
|
|
}
|
|
else
|
|
{
|
|
communication->StopFrame( "2" );
|
|
}
|
|
|
|
for( int index = 0; index < 16; ++index )
|
|
{
|
|
idSWFSpriteInstance* node = communication->GetScriptObject()->GetNestedSprite( "info", "bar", va( "node%d", index ) );
|
|
if( node != NULL )
|
|
{
|
|
int frame = gameLocal.random.RandomInt( 100 );
|
|
node->SetScale( 100.0f, frame );
|
|
float toFrame = gameLocal.random.RandomFloat();
|
|
node->SetMoveToScale( -1.0f, toFrame );
|
|
}
|
|
}
|
|
}
|
|
else if( !show )
|
|
{
|
|
communication->StopFrame( 1 );
|
|
}
|
|
else if( show )
|
|
{
|
|
|
|
if( oxygenChanged )
|
|
{
|
|
if( inVaccuum )
|
|
{
|
|
communication->PlayFrame( "rollUp" );
|
|
}
|
|
else
|
|
{
|
|
communication->PlayFrame( "rollDown" );
|
|
}
|
|
}
|
|
|
|
if( commPrevTime == 0 )
|
|
{
|
|
commPrevTime = gameLocal.time;
|
|
}
|
|
|
|
for( int index = 0; index < 16; ++index )
|
|
{
|
|
idSWFSpriteInstance* node = communication->GetScriptObject()->GetNestedSprite( "info", "bar", va( "node%d", index ) );
|
|
if( node != NULL )
|
|
{
|
|
float diff = gameLocal.time - commPrevTime;
|
|
float speed = ( diff / 350.0f ) * 100.0f;
|
|
if( !node->UpdateMoveToScale( speed ) )
|
|
{
|
|
int frame = gameLocal.random.RandomInt( 100 );
|
|
float scale = frame / 100.0f;
|
|
node->SetMoveToScale( -1.0f, scale );
|
|
}
|
|
}
|
|
}
|
|
|
|
commPrevTime = gameLocal.time;
|
|
}
|
|
|
|
oxygenComm = inVaccuum;
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateOxygen
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateOxygen( bool show, int val )
|
|
{
|
|
|
|
if( !oxygen )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show )
|
|
{
|
|
if( !oxygen->IsVisible() )
|
|
{
|
|
inVaccuum = true;
|
|
oxygen->SetVisible( true );
|
|
oxygen->PlayFrame( "rollOn" );
|
|
}
|
|
|
|
idSWFSpriteInstance* info = oxygen->GetScriptObject()->GetNestedSprite( "info" );
|
|
if( info != NULL )
|
|
{
|
|
info->StopFrame( val + 1 );
|
|
}
|
|
|
|
idSWFSpriteInstance* goodFrame = oxygen->GetScriptObject()->GetNestedSprite( "goodFrame" );
|
|
idSWFSpriteInstance* badFrame = oxygen->GetScriptObject()->GetNestedSprite( "badFrame" );
|
|
|
|
if( goodFrame != NULL && badFrame != NULL )
|
|
{
|
|
if( val + 1 >= 36 )
|
|
{
|
|
goodFrame->SetVisible( true );
|
|
badFrame->SetVisible( false );
|
|
}
|
|
else
|
|
{
|
|
goodFrame->SetVisible( false );
|
|
badFrame->SetVisible( true );
|
|
}
|
|
}
|
|
|
|
idSWFTextInstance* txtVal = oxygen->GetScriptObject()->GetNestedText( "info", "txtHeading" );
|
|
if( txtVal != NULL )
|
|
{
|
|
txtVal->SetText( "#str_00100922" );
|
|
txtVal->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
|
|
txtVal = oxygen->GetScriptObject()->GetNestedText( "info", "txtVal" );
|
|
if( txtVal != NULL )
|
|
{
|
|
txtVal->SetText( va( "%d", val ) );
|
|
txtVal->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
|
|
}
|
|
else if( !show )
|
|
{
|
|
inVaccuum = false;
|
|
oxygen->StopFrame( 1 );
|
|
}
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetupObjective
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetupObjective( const idStr& title, const idStr& desc, const idMaterial* screenshot )
|
|
{
|
|
objTitle = title;
|
|
objDesc = desc;
|
|
objScreenshot = screenshot;
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetupObjective
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetupObjectiveComplete( const idStr& title )
|
|
{
|
|
|
|
objCompleteTitle = title;
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ShowObjective
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowObjective( bool complete )
|
|
{
|
|
|
|
if( complete )
|
|
{
|
|
|
|
if( !objectiveComplete )
|
|
{
|
|
return;
|
|
}
|
|
|
|
objectiveComplete->SetVisible( true );
|
|
objectiveComplete->PlayFrame( "rollOn" );
|
|
|
|
idSWFTextInstance* txtComplete = objectiveComplete->GetScriptObject()->GetNestedText( "info", "txtComplete" );
|
|
idSWFTextInstance* txtTitle = objectiveComplete->GetScriptObject()->GetNestedText( "info", "txtTitle" );
|
|
idSWFSpriteInstance* rightArrow = objectiveComplete->GetScriptObject()->GetNestedSprite( "info", "right_arrows" );
|
|
|
|
if( txtComplete != NULL )
|
|
{
|
|
txtComplete->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
|
|
if( rightArrow != NULL )
|
|
{
|
|
rightArrow->SetXPos( txtComplete->GetTextLength() + 30.0f );
|
|
}
|
|
}
|
|
|
|
if( txtTitle != NULL )
|
|
{
|
|
txtTitle->SetText( objCompleteTitle );
|
|
txtTitle->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if( !objective )
|
|
{
|
|
return;
|
|
}
|
|
|
|
objective->SetVisible( true );
|
|
objective->PlayFrame( "rollOn" );
|
|
|
|
idSWFTextInstance* txtNew = objective->GetScriptObject()->GetNestedText( "info", "txtComplete" );
|
|
idSWFTextInstance* txtTitle = objective->GetScriptObject()->GetNestedText( "info", "txtTitle" );
|
|
idSWFTextInstance* txtDesc = objective->GetScriptObject()->GetNestedText( "info", "txtDesc" );
|
|
idSWFSpriteInstance* img = objective->GetScriptObject()->GetNestedSprite( "info", "img" );
|
|
idSWFSpriteInstance* rightArrow = objective->GetScriptObject()->GetNestedSprite( "info", "right_arrows" );
|
|
|
|
if( txtNew != NULL )
|
|
{
|
|
txtNew->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
|
|
if( rightArrow != NULL )
|
|
{
|
|
rightArrow->SetXPos( txtNew->GetTextLength() + 55.0f );
|
|
}
|
|
}
|
|
|
|
if( txtTitle != NULL )
|
|
{
|
|
txtTitle->SetText( objTitle );
|
|
txtTitle->SetStrokeInfo( true, 0.9f, 2.0f );
|
|
}
|
|
|
|
if( txtDesc )
|
|
{
|
|
txtDesc->SetText( objDesc );
|
|
}
|
|
|
|
if( img != NULL )
|
|
{
|
|
img->SetMaterial( objScreenshot );
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::HideObjective
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::HideObjective( bool complete )
|
|
{
|
|
|
|
if( complete )
|
|
{
|
|
|
|
if( !objectiveComplete )
|
|
{
|
|
return;
|
|
}
|
|
|
|
objectiveComplete->PlayFrame( "rollOff" );
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if( !objective )
|
|
{
|
|
return;
|
|
}
|
|
|
|
objective->PlayFrame( "rollOff" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//******************************************************************************************
|
|
// MULTIPLAYER FUNCITONS
|
|
//******************************************************************************************
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ToggleMPInfo
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ToggleMPInfo( bool show, bool showTeams, bool isCTF )
|
|
{
|
|
|
|
if( !mpInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show )
|
|
{
|
|
|
|
mpInfo->SetVisible( true );
|
|
|
|
idSWFSpriteInstance* redTeam = mpInfo->GetScriptObject()->GetNestedSprite( "redTeam" );
|
|
idSWFSpriteInstance* blueTeam = mpInfo->GetScriptObject()->GetNestedSprite( "blueTeam" );
|
|
idSWFSpriteInstance* redFlag = mpInfo->GetScriptObject()->GetNestedSprite( "redFlag" );
|
|
idSWFSpriteInstance* blueFlag = mpInfo->GetScriptObject()->GetNestedSprite( "blueFlag" );
|
|
|
|
if( redFlag )
|
|
{
|
|
redFlag->SetVisible( isCTF );
|
|
}
|
|
|
|
if( blueFlag )
|
|
{
|
|
blueFlag->SetVisible( isCTF );
|
|
}
|
|
|
|
if( !showTeams )
|
|
{
|
|
if( redTeam )
|
|
{
|
|
redTeam->SetVisible( false );
|
|
}
|
|
|
|
if( blueTeam )
|
|
{
|
|
blueTeam->SetVisible( false );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( redTeam )
|
|
{
|
|
redTeam->SetVisible( true );
|
|
}
|
|
|
|
if( blueTeam )
|
|
{
|
|
blueTeam->SetVisible( true );
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
mpInfo->SetVisible( false );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetFlagState
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetFlagState( int team, int state )
|
|
{
|
|
|
|
if( !mpInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
idSWFSpriteInstance* flag = NULL;
|
|
if( team == 0 )
|
|
{
|
|
flag = mpInfo->GetScriptObject()->GetNestedSprite( "redFlag" );
|
|
}
|
|
else if( team == 1 )
|
|
{
|
|
flag = mpInfo->GetScriptObject()->GetNestedSprite( "blueFlag" );
|
|
}
|
|
|
|
if( flag )
|
|
{
|
|
if( state == 3 ) //FLAGSTATUS_NONE
|
|
{
|
|
flag->StopFrame( 1 );
|
|
}
|
|
else
|
|
{
|
|
flag->SetVisible( true );
|
|
flag->StopFrame( state + 2 );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetTeamScore
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetTeamScore( int team, int score )
|
|
{
|
|
|
|
if( !mpInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFTextInstance* txtScore = NULL;
|
|
|
|
if( team == 0 )
|
|
{
|
|
txtScore = mpInfo->GetScriptObject()->GetNestedText( "redTeam", "txtRedScore" );
|
|
}
|
|
else if( team == 1 )
|
|
{
|
|
txtScore = mpInfo->GetScriptObject()->GetNestedText( "blueTeam", "txtBlueScore" );
|
|
}
|
|
|
|
if( txtScore )
|
|
{
|
|
txtScore->SetText( va( "%i", score ) );
|
|
txtScore->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::SetTeam
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::SetTeam( int team )
|
|
{
|
|
|
|
if( !mpInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWFSpriteInstance* teamBacking = mpInfo->GetScriptObject()->GetNestedSprite( "teamBack" );
|
|
|
|
if( teamBacking )
|
|
{
|
|
if( team < 0 )
|
|
{
|
|
teamBacking->StopFrame( 3 );
|
|
}
|
|
else
|
|
{
|
|
teamBacking->StopFrame( team + 1 );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::TriggerHitTarget
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::TriggerHitTarget( bool show, const idStr& target, int color )
|
|
{
|
|
|
|
if( !mpHitInfo )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show )
|
|
{
|
|
|
|
mpHitInfo->SetVisible( true );
|
|
mpHitInfo->PlayFrame( "rollOn" );
|
|
|
|
if( menuGUI )
|
|
{
|
|
menuGUI->SetGlobal( "hitTargetName", target.c_str() );
|
|
}
|
|
|
|
idSWFSpriteInstance* backing = mpHitInfo->GetScriptObject()->GetNestedSprite( "bgColor" );
|
|
if( backing )
|
|
{
|
|
if( color <= 0 || !gameLocal.mpGame.IsGametypeTeamBased() )
|
|
{
|
|
color = 1;
|
|
}
|
|
backing->StopFrame( color );
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
mpHitInfo->PlayFrame( "rollOff" );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ToggleLagged
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ToggleLagged( bool show )
|
|
{
|
|
|
|
if( !mpConnection )
|
|
{
|
|
return;
|
|
}
|
|
|
|
mpConnection->SetVisible( show );
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateGameTime
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateGameTime( const char* time )
|
|
{
|
|
|
|
if( !mpTime )
|
|
{
|
|
return;
|
|
}
|
|
|
|
UpdateMessage( false, "" );
|
|
|
|
mpTime->SetText( time );
|
|
mpTime->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateMessage
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateMessage( bool show, const idStr& message )
|
|
{
|
|
|
|
if( !mpMessage )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( show )
|
|
{
|
|
if( mpTime )
|
|
{
|
|
mpTime->SetText( "" );
|
|
}
|
|
|
|
mpMessage->SetText( message );
|
|
mpMessage->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
else
|
|
{
|
|
mpMessage->SetText( "" );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::ShowNewItem
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::ShowNewItem( const char* name, const char* icon )
|
|
{
|
|
|
|
if( !newItem )
|
|
{
|
|
return;
|
|
}
|
|
|
|
newItem->SetVisible( true );
|
|
newItem->PlayFrame( "rollOn" );
|
|
|
|
idSWFSpriteInstance* topImg = newItem->GetScriptObject()->GetNestedSprite( "info", "topImg" );
|
|
idSWFSpriteInstance* botImg = newItem->GetScriptObject()->GetNestedSprite( "info", "botImg" );
|
|
idSWFTextInstance* heading = newItem->GetScriptObject()->GetNestedText( "info", "txtTitle" );
|
|
idSWFTextInstance* itemName = newItem->GetScriptObject()->GetNestedText( "info", "txtItem" );
|
|
|
|
const idMaterial* mat = declManager->FindMaterial( icon, false );
|
|
if( topImg != NULL && botImg != NULL && mat != NULL )
|
|
{
|
|
topImg->SetMaterial( mat );
|
|
botImg->SetMaterial( mat );
|
|
}
|
|
|
|
if( heading != NULL )
|
|
{
|
|
heading->SetText( "#str_02027" );
|
|
heading->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
|
|
if( itemName != NULL )
|
|
{
|
|
itemName->SetText( name );
|
|
itemName->SetStrokeInfo( true, 0.75f, 1.5f );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateFlashlight
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateFlashlight( idPlayer* player )
|
|
{
|
|
|
|
if( !player || !flashlight )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( player->flashlightBattery != flashlight_batteryDrainTimeMS.GetInteger() )
|
|
{
|
|
flashlight->StopFrame( 2 );
|
|
flashlight->SetVisible( true );
|
|
idSWFSpriteInstance* batteryLife = flashlight->GetScriptObject()->GetNestedSprite( "info" );
|
|
if( batteryLife )
|
|
{
|
|
float power = ( ( float )player->flashlightBattery / ( float )flashlight_batteryDrainTimeMS.GetInteger() ) * 100.0f;
|
|
batteryLife->StopFrame( power );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flashlight->StopFrame( 1 );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
========================
|
|
idMenuScreen_HUD::UpdateChattingHud
|
|
========================
|
|
*/
|
|
void idMenuScreen_HUD::UpdateChattingHud( idPlayer* player )
|
|
{
|
|
|
|
if( !mpChatObject || !GetSWFObject() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
idSWF* gui = GetSWFObject();
|
|
|
|
if( player->isChatting == 0 )
|
|
{
|
|
if( mpChatObject->GetCurrentFrame() != 1 )
|
|
{
|
|
mpChatObject->StopFrame( 1 );
|
|
gui->ForceInhibitControl( false );
|
|
gui->SetGlobal( "focusWindow", NULL );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( !mpChatObject->IsVisible() )
|
|
{
|
|
mpChatObject->SetVisible( true );
|
|
mpChatObject->PlayFrame( "rollOn" );
|
|
gui->ForceInhibitControl( true );
|
|
|
|
idSWFTextInstance* txtType = mpChatObject->GetScriptObject()->GetNestedText( "info", "saybox" );
|
|
int length = 0;
|
|
if( txtType )
|
|
{
|
|
if( player->isChatting == 1 )
|
|
{
|
|
txtType->SetText( "#str_swf_talk_all" );
|
|
}
|
|
else if( player->isChatting == 2 )
|
|
{
|
|
txtType->SetText( "#str_swf_talk_team" );
|
|
}
|
|
txtType->SetStrokeInfo( true );
|
|
length = txtType->GetTextLength();
|
|
}
|
|
|
|
idSWFSpriteInstance* sayBox = mpChatObject->GetScriptObject()->GetNestedSprite( "info", "textEntry" );
|
|
if( sayBox )
|
|
{
|
|
sayBox->SetXPos( length + 10 );
|
|
}
|
|
|
|
idSWFTextInstance* say = mpChatObject->GetScriptObject()->GetNestedText( "info", "textEntry", "txtVal" );
|
|
if( say != NULL )
|
|
{
|
|
say->SetIgnoreColor( false );
|
|
say->SetText( "" );
|
|
say->SetStrokeInfo( true );
|
|
say->renderMode = SWF_TEXT_RENDER_AUTOSCROLL;
|
|
}
|
|
|
|
idSWFScriptObject* const sayObj = mpChatObject->GetScriptObject()->GetNestedObj( "info", "textEntry", "txtVal" );
|
|
if( sayObj != NULL )
|
|
{
|
|
|
|
gui->SetGlobal( "focusWindow", sayObj );
|
|
|
|
class idPostTextChat : public idSWFScriptFunction_RefCounted
|
|
{
|
|
public:
|
|
idPostTextChat( idPlayer* _player, idSWFTextInstance* _text )
|
|
{
|
|
player = _player;
|
|
text = _text;
|
|
}
|
|
idSWFScriptVar Call( idSWFScriptObject* thisObject, const idSWFParmList& parms )
|
|
{
|
|
if( !player || !text )
|
|
{
|
|
return idSWFScriptVar();
|
|
}
|
|
|
|
idStr val = text->text;
|
|
val.Replace( "\'", "" );
|
|
val.Replace( "\"", "" );
|
|
idStr command;
|
|
if( player->isChatting == 2 )
|
|
{
|
|
command = va( "sayTeam %s\n", val.c_str() );
|
|
}
|
|
else
|
|
{
|
|
command = va( "say %s\n", val.c_str() );
|
|
}
|
|
|
|
cmdSystem->BufferCommandText( CMD_EXEC_NOW, command.c_str() );
|
|
|
|
player->isChatting = 0;
|
|
return idSWFScriptVar();
|
|
}
|
|
idPlayer* player;
|
|
idSWFTextInstance* text;
|
|
};
|
|
|
|
class idCancelTextChat : public idSWFScriptFunction_RefCounted
|
|
{
|
|
public:
|
|
idCancelTextChat( idPlayer* _player )
|
|
{
|
|
player = _player;
|
|
}
|
|
idSWFScriptVar Call( idSWFScriptObject* thisObject, const idSWFParmList& parms )
|
|
{
|
|
if( !player )
|
|
{
|
|
return idSWFScriptVar();
|
|
}
|
|
|
|
player->isChatting = 0;
|
|
return idSWFScriptVar();
|
|
}
|
|
idPlayer* player;
|
|
};
|
|
|
|
sayObj->Set( "onPress", new( TAG_SWF ) idPostTextChat( player, say ) );
|
|
|
|
idSWFScriptObject* const shortcutKeys = gui->GetGlobal( "shortcutKeys" ).GetObject();
|
|
if( verify( shortcutKeys != NULL ) )
|
|
{
|
|
shortcutKeys->Set( "ENTER", sayObj );
|
|
shortcutKeys->Set( "ESCAPE", new( TAG_SWF ) idCancelTextChat( player ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|