/* =========================================================================== 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 . 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 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 != '\0' ) { 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 != '\0' ) { 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 != '\0' ) { 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 ); // RB: 64 bit fixes, changed NULL to 0 gui->SetGlobal( "focusWindow", 0 ); // RB end } } 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 ) ); } } } } }