1105 lines
35 KiB
C++
1105 lines
35 KiB
C++
//===========================================================================
|
|
// Copyright (C) 2000 Radical Entertainment Ltd. All rights reserved.
|
|
//
|
|
// Component: CGuiScreenPhoneBooth
|
|
//
|
|
// Description: Implementation of the CGuiScreenPhoneBooth class.
|
|
//
|
|
// Authors: Tony Chu
|
|
//
|
|
// Revisions Date Author Revision
|
|
// 2002/08/21 TChu Created for SRR2
|
|
//
|
|
//===========================================================================
|
|
|
|
//===========================================================================
|
|
// Includes
|
|
//===========================================================================
|
|
#include <presentation/gui/ingame/guiscreenphonebooth.h>
|
|
#include <presentation/gui/ingame/guiscreenhud.h>
|
|
#include <presentation/gui/utility/specialfx.h>
|
|
#include <presentation/gui/guimenu.h>
|
|
#include <presentation/gui/guitextbible.h>
|
|
|
|
#include <ai/actionbuttonhandler.h>
|
|
#include <camera/relativeanimatedcam.h>
|
|
#include <camera/supercam.h>
|
|
#include <camera/supercammanager.h>
|
|
#include <cheats/cheatinputsystem.h>
|
|
#include <events/eventmanager.h>
|
|
#include <memory/srrmemory.h>
|
|
#include <mission/gameplaymanager.h>
|
|
#include <mission/missionmanager.h>
|
|
#include <mission/rewards/rewardsmanager.h>
|
|
#include <mission/rewards/reward.h>
|
|
#include <mission/charactersheet/charactersheetmanager.h>
|
|
#include <sound/soundmanager.h>
|
|
#include <worldsim/character/charactermanager.h>
|
|
#include <worldsim/character/character.h>
|
|
#include <worldsim/coins/coinmanager.h>
|
|
#include <worldsim/vehiclecentral.h>
|
|
|
|
#include <screen.h>
|
|
#include <page.h>
|
|
#include <layer.h>
|
|
#include <group.h>
|
|
#include <sprite.h>
|
|
#include <text.h>
|
|
#include <pure3dobject.h>
|
|
|
|
#include <p3d/anim/cameraanimation.hpp>
|
|
|
|
#include <raddebug.hpp> // Foundation
|
|
|
|
#include <string.h>
|
|
|
|
//===========================================================================
|
|
// Global Data, Local Data, Local Classes
|
|
//===========================================================================
|
|
#ifdef RAD_WIN32
|
|
const float VEHICLE_CORRECTION_SCALE = 0.93f;
|
|
const float VEHICLE_DAMAGED_CORRECTION_SCALE = 0.93f;
|
|
const float HUSK_CORRECTION_SCALE = 1.4f;
|
|
#else
|
|
const float VEHICLE_CORRECTION_SCALE = 1.0f / 0.75f;
|
|
const float VEHICLE_DAMAGED_CORRECTION_SCALE = 1.0f / 0.5f;
|
|
const float HUSK_CORRECTION_SCALE = 1.0f / 0.5f;
|
|
#endif
|
|
|
|
const float VEHICLE_LOCKED_IMAGE_ALPHA = 0.5f;
|
|
|
|
const tUID CHARACTER_VEHICLE_NAMES[] =
|
|
{
|
|
tEntity::MakeUID( "apu_v" ),
|
|
tEntity::MakeUID( "bart_v" ),
|
|
tEntity::MakeUID( "comic_v" ),
|
|
tEntity::MakeUID( "cletu_v" ),
|
|
tEntity::MakeUID( "frink_v" ),
|
|
tEntity::MakeUID( "gramp_v" ),
|
|
tEntity::MakeUID( "homer_v" ),
|
|
tEntity::MakeUID( "lisa_v" ),
|
|
tEntity::MakeUID( "marge_v" ),
|
|
tEntity::MakeUID( "skinn_v" ),
|
|
tEntity::MakeUID( "smith_v" ),
|
|
tEntity::MakeUID( "snake_v" ),
|
|
tEntity::MakeUID( "wiggu_v" ),
|
|
|
|
0 // dummy terminator
|
|
};
|
|
|
|
const int NUM_CHARACTER_VEHICLE_NAMES =
|
|
sizeof( CHARACTER_VEHICLE_NAMES ) / sizeof( CHARACTER_VEHICLE_NAMES[ 0 ] ) - 1;
|
|
|
|
static int GetVehicleIndex( const char* vehicleName )
|
|
{
|
|
int vehicleIndex = -1;
|
|
|
|
tUID vehicleNameUID = tEntity::MakeUID( vehicleName );
|
|
|
|
for( int i = 0; i < NUM_CHARACTER_VEHICLE_NAMES; i++ )
|
|
{
|
|
if( CHARACTER_VEHICLE_NAMES[ i ] == vehicleNameUID )
|
|
{
|
|
// found it!
|
|
//
|
|
vehicleIndex = i;
|
|
|
|
// stop searching
|
|
//
|
|
break;
|
|
}
|
|
}
|
|
|
|
return vehicleIndex;
|
|
}
|
|
|
|
#ifdef SRR2_OVERRIDE_CAR_SELECTION
|
|
const char* OVERRIDE_VEHICLE_NAMES[] =
|
|
{
|
|
"snake_v",
|
|
"bookb_v",
|
|
"marge_v",
|
|
"carhom_v",
|
|
"krust_v",
|
|
"bbman_v",
|
|
"elect_v",
|
|
"famil_v",
|
|
"bart_v",
|
|
"scorp_v",
|
|
"honor_v",
|
|
"hbike_v",
|
|
"frink_v",
|
|
"comic_v",
|
|
"lisa_v",
|
|
"smith_v",
|
|
"mrplo_v",
|
|
"fone_v",
|
|
"cletu_v",
|
|
"apu_v",
|
|
"plowk_v",
|
|
"wiggu_v",
|
|
"otto_v",
|
|
"moe_v",
|
|
"skinn_v",
|
|
"homer_v",
|
|
"zombi_v",
|
|
"burns_v",
|
|
"willi_v",
|
|
"gramp_v",
|
|
"gramR_v",
|
|
|
|
"atv_v",
|
|
"knigh_v",
|
|
"mono_v",
|
|
"oblit_v",
|
|
"hype_v",
|
|
"dune_v",
|
|
"rocke_v",
|
|
|
|
"cArmor",
|
|
"cCellA",
|
|
"cCellB",
|
|
"cCellC",
|
|
"cCellD",
|
|
"cSedan",
|
|
"cCola",
|
|
"cCube",
|
|
"cCurator",
|
|
"cDonut",
|
|
"cDuff",
|
|
"cBlbart",
|
|
"cHears",
|
|
"cKlimo",
|
|
"cLimo",
|
|
"cMilk",
|
|
"cNerd",
|
|
"cNonup",
|
|
"cPolice",
|
|
"cVan",
|
|
|
|
//"huskA",
|
|
"compactA",
|
|
"minivanA",
|
|
"pickupA",
|
|
"sedanA",
|
|
"sedanB",
|
|
"sportsA",
|
|
"sportsB",
|
|
"wagonA",
|
|
"SUVA",
|
|
"taxiA",
|
|
"coffin",
|
|
"ship",
|
|
"hallo",
|
|
"witchcar",
|
|
|
|
"ambul",
|
|
"burnsarm",
|
|
"fishtruc",
|
|
"garbage",
|
|
"icecream",
|
|
"IStruck",
|
|
"nuctruck",
|
|
"pizza",
|
|
"schoolbu",
|
|
"votetruc",
|
|
"glastruc",
|
|
"cFire_v",
|
|
"cBone",
|
|
"redbrick",
|
|
|
|
"" // dummy terminator
|
|
};
|
|
|
|
const unsigned int NUM_OVERRIDE_VEHICLES =
|
|
sizeof( OVERRIDE_VEHICLE_NAMES ) / sizeof( OVERRIDE_VEHICLE_NAMES[ 0 ] ) - 1;
|
|
|
|
const char* VEHICLES_DIR = "art\\cars\\";
|
|
|
|
int CGuiScreenPhoneBooth::s_currentDebugVehicleSelection = 0;
|
|
unsigned CGuiScreenPhoneBooth::s_currentTeleportSelection = 0;
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::
|
|
//===========================================================================
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::CGuiScreenPhoneBooth
|
|
//===========================================================================
|
|
// Description: Constructor.
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
CGuiScreenPhoneBooth::CGuiScreenPhoneBooth
|
|
(
|
|
Scrooby::Screen* pScreen,
|
|
CGuiEntity* pParent
|
|
)
|
|
: IGuiScreenRewards( pScreen,
|
|
pScreen->GetPage( "PhoneBooth" ),
|
|
pParent,
|
|
GUI_SCREEN_ID_PHONE_BOOTH ),
|
|
m_damagedInfo( NULL ),
|
|
m_vehicleDamaged( NULL ),
|
|
m_repairCostInfo( NULL ),
|
|
m_vehicleRepairCost( NULL )
|
|
{
|
|
MEMTRACK_PUSH_GROUP( "CGUIScreenPhoneBooth" );
|
|
// Retrieve the Scrooby drawing elements.
|
|
//
|
|
Scrooby::Page* pPage = m_pScroobyScreen->GetPage( "PhoneBooth" );
|
|
rAssert( pPage != NULL );
|
|
|
|
#ifdef RAD_WIN32
|
|
m_leftArrow = pPage->GetGroup( "Arrows" )->GetSprite( "LeftArrow" );
|
|
m_rightArrow = pPage->GetGroup( "Arrows" )->GetSprite( "RightArrow" );
|
|
m_leftArrow->ScaleAboutCenter( 1.3f );
|
|
m_rightArrow->ScaleAboutCenter( 1.3f );
|
|
#endif
|
|
|
|
// get vehicle damaged info
|
|
//
|
|
m_damagedInfo = pPage->GetGroup( "DamagedInfo" );
|
|
rAssert( m_damagedInfo != NULL );
|
|
m_vehicleDamaged = m_damagedInfo->GetText( "VehicleDamaged_Value" );
|
|
|
|
m_repairCostInfo = m_damagedInfo->GetGroup( "RepairCostInfo" );
|
|
rAssert( m_repairCostInfo != NULL );
|
|
m_vehicleRepairCost = m_repairCostInfo->GetText( "CostToFix_Value" );
|
|
|
|
// always show vehicle stats
|
|
//
|
|
rAssert( m_statsOverlay != NULL );
|
|
m_statsOverlay->SetVisible( true );
|
|
|
|
#ifdef PAL
|
|
// re-position damaged info text
|
|
//
|
|
const int DAMAGED_INFO_TRANSLATE_X = +60;
|
|
|
|
m_vehicleDamaged->ResetTransformation();
|
|
m_vehicleDamaged->Translate( DAMAGED_INFO_TRANSLATE_X, 0 );
|
|
|
|
m_vehicleRepairCost->ResetTransformation();
|
|
m_vehicleRepairCost->Translate( DAMAGED_INFO_TRANSLATE_X, 0 );
|
|
|
|
Scrooby::Text* repairCostCoins = m_repairCostInfo->GetText( "Coins" );
|
|
if( repairCostCoins != NULL )
|
|
{
|
|
repairCostCoins->ResetTransformation();
|
|
repairCostCoins->Translate( DAMAGED_INFO_TRANSLATE_X, 0 );
|
|
#ifdef RAD_WIN32
|
|
repairCostCoins->Translate( 70, 0 );
|
|
repairCostCoins->ScaleAboutCenter( 0.5f );
|
|
#endif
|
|
}
|
|
|
|
// move stats over to the left a bit to avoid safe zone
|
|
// boundary clipping
|
|
//
|
|
m_statsOverlay->ResetTransformation();
|
|
m_statsOverlay->Translate( -15, 0 );
|
|
|
|
// scale-down vehicle name a bit
|
|
//
|
|
m_previewName->ResetTransformation();
|
|
m_previewName->ScaleAboutCenter( 0.9f );
|
|
#endif // PAL
|
|
|
|
// apply correction scale to spotlight
|
|
//
|
|
Scrooby::Sprite* spotLight = pPage->GetSprite( "Spotlight" );
|
|
if( spotLight != NULL )
|
|
{
|
|
spotLight->ResetTransformation();
|
|
spotLight->ScaleAboutCenter( 4.0f );
|
|
}
|
|
|
|
// apply correction scale to spotlight overlay
|
|
//
|
|
spotLight = pPage->GetSprite( "Overlay" );
|
|
if( spotLight != NULL )
|
|
{
|
|
spotLight->ResetTransformation();
|
|
spotLight->ScaleAboutCenter( 4.0f );
|
|
}
|
|
|
|
rAssert( m_pRewardsMenu != NULL );
|
|
m_pRewardsMenu->SetHighlightColour( false, tColour( 255, 255, 255 ) );
|
|
m_pRewardsMenu->Reset();
|
|
|
|
this->AutoScaleFrame( pPage );
|
|
|
|
#ifdef SRR2_OVERRIDE_CAR_SELECTION
|
|
pPage = m_pScroobyScreen->GetPage( "CarSelect" );
|
|
if( pPage != NULL )
|
|
{
|
|
m_carSelectOverlay = pPage->GetLayerByIndex( 0 );
|
|
rAssert( m_carSelectOverlay );
|
|
}
|
|
|
|
// Create a menu.
|
|
//
|
|
m_pMenu = new CGuiMenu( this );
|
|
rAssert( m_pMenu != NULL );
|
|
|
|
// Add menu items
|
|
//
|
|
m_pMenu->AddMenuItem( pPage->GetText( "Car" ),
|
|
pPage->GetText( "Car_Value" ) );
|
|
|
|
// clamp number of vehicle selections w/ only what's available
|
|
//
|
|
m_pMenu->SetSelectionValueCount( 0, NUM_OVERRIDE_VEHICLES );
|
|
|
|
// wrap vehicle names
|
|
//
|
|
Scrooby::Text* vehicleNames = dynamic_cast<Scrooby::Text*>( m_pMenu->GetMenuItem( 0 )->GetItemValue() );
|
|
rAssert( vehicleNames != NULL );
|
|
vehicleNames->SetTextMode( Scrooby::TEXT_WRAP );
|
|
|
|
m_menuTeleport = false;
|
|
#endif
|
|
MEMTRACK_POP_GROUP("CGUIScreenPhoneBooth");
|
|
}
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::~CGuiScreenPhoneBooth
|
|
//===========================================================================
|
|
// Description: Destructor.
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
CGuiScreenPhoneBooth::~CGuiScreenPhoneBooth()
|
|
{
|
|
#ifdef SRR2_OVERRIDE_CAR_SELECTION
|
|
if( m_pMenu != NULL )
|
|
{
|
|
delete m_pMenu;
|
|
m_pMenu = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::HandleMessage
|
|
//===========================================================================
|
|
// Description:
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
void CGuiScreenPhoneBooth::HandleMessage
|
|
(
|
|
eGuiMessage message,
|
|
unsigned int param1,
|
|
unsigned int param2
|
|
)
|
|
{
|
|
if( m_isLoading )
|
|
{
|
|
if( message == GUI_MSG_CONTROLLER_SELECT ||
|
|
message == GUI_MSG_CONTROLLER_BACK )
|
|
{
|
|
// don't allow user to select or back out of screen
|
|
// during loading
|
|
//
|
|
return;
|
|
}
|
|
}
|
|
|
|
rAssert( m_pRewardsMenu != NULL );
|
|
if( m_pRewardsMenu->HasSelectionBeenMade() || m_isLoadingReward )
|
|
{
|
|
if( this->IsControllerMessage( message ) )
|
|
{
|
|
// selection has already been made or reward is currently loading,
|
|
// ignore all controller inputs
|
|
//
|
|
return;
|
|
}
|
|
}
|
|
|
|
#ifdef SRR2_OVERRIDE_CAR_SELECTION
|
|
if( m_state == GUI_WINDOW_STATE_RUNNING )
|
|
{
|
|
if( message == GUI_MSG_CONTROLLER_L1 || message == GUI_MSG_CONTROLLER_R1 )
|
|
{
|
|
#ifdef FINAL
|
|
if( GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_UNLOCK_VEHICLES ) &&
|
|
GetCharacterSheetManager()->QueryPercentGameCompleted() > 99.999f )
|
|
#endif
|
|
{
|
|
rAssert( m_carSelectOverlay != NULL );
|
|
|
|
// toggle visibility of car selection overlay
|
|
//
|
|
m_carSelectOverlay->SetVisible( !m_carSelectOverlay->IsVisible() );
|
|
|
|
if( m_carSelectOverlay->IsVisible() )
|
|
{
|
|
this->SetButtonVisible( BUTTON_ICON_ACCEPT, true );
|
|
|
|
// Teleportation menu disabled in final build
|
|
#ifndef FINAL
|
|
m_menuTeleport = (message == GUI_MSG_CONTROLLER_L1);
|
|
#endif
|
|
Scrooby::Text* menuLabel = dynamic_cast<Scrooby::Text*>( m_pMenu->GetMenuItem( 0 )->GetItem() );
|
|
rAssert( menuLabel != NULL );
|
|
|
|
HeapMgr()->PushHeap( GMA_LEVEL_HUD );
|
|
if( !m_menuTeleport )
|
|
{
|
|
menuLabel->SetString( 0, "Vehicle:" );
|
|
m_pMenu->SetSelectionValue( 0, s_currentDebugVehicleSelection );
|
|
}
|
|
else
|
|
{
|
|
menuLabel->SetString( 0, "Teleport:" );
|
|
m_pMenu->SetSelectionValue( 0, s_currentTeleportSelection );
|
|
}
|
|
HeapMgr()->PopHeap( GMA_LEVEL_HUD );
|
|
}
|
|
else
|
|
{
|
|
this->SetButtonVisible( BUTTON_ICON_ACCEPT,
|
|
this->GetCurrentPreviewObject()->isUnlocked );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( m_carSelectOverlay->IsVisible() )
|
|
{
|
|
this->HandleMessageForCar( message, param1, param2 );
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
if( m_state == GUI_WINDOW_STATE_RUNNING )
|
|
{
|
|
switch( message )
|
|
{
|
|
case GUI_MSG_CONTROLLER_SELECT:
|
|
{
|
|
const PreviewObject* currentPreviewObject = this->GetCurrentPreviewObject();
|
|
|
|
if( currentPreviewObject->isUnlocked )
|
|
{
|
|
// check if selecting a damaged out vehicle; if so, reduce current bank
|
|
// value by repair cost amount
|
|
//
|
|
int carIndex = GetCharacterSheetManager()->GetCarIndex( currentPreviewObject->name );
|
|
if( carIndex >= 0 )
|
|
{
|
|
bool isVehicleDamagedOut = ( GetCharacterSheetManager()->GetCarDamageState( carIndex ) == eHusk );
|
|
if( isVehicleDamagedOut )
|
|
{
|
|
int repairCost = currentPreviewObject->pReward->GetRepairCost();
|
|
|
|
// TC: *** Joe says to always allow car repair, even if user
|
|
// doesn't quite have enough money
|
|
/*
|
|
if( GetCoinManager()->GetBankValue() < repairCost )
|
|
{
|
|
// doh... not enough money in the bank to repair damaged vehicle
|
|
//
|
|
return;
|
|
}
|
|
*/
|
|
GetCoinManager()->AdjustBankValue( -repairCost );
|
|
|
|
// trigger HUD event
|
|
//
|
|
GetEventManager()->TriggerEvent( EVENT_LOST_COINS );
|
|
|
|
//Chuck: Adding Record that the car has full hitpoints restored
|
|
GetCharacterSheetManager()->UpdateCarHealth(carIndex,1.0f);
|
|
}
|
|
}
|
|
|
|
Character* pWalkerCharacter = GetCharacterManager()->GetCharacter( 0 );
|
|
rWarning( pWalkerCharacter != NULL );
|
|
|
|
GetEventManager()->TriggerEvent( EVENT_PHONE_BOOTH_RIDE_REQUEST, reinterpret_cast<void*>( pWalkerCharacter ) );
|
|
|
|
bool isBonusVehicle = (m_previewVehicles[ m_currentPreviewVehicle ].pReward->GetQuestType() == Reward::eBonusMission);
|
|
if( isBonusVehicle )
|
|
{
|
|
Character* pDriverCharacter = NULL;
|
|
|
|
Vehicle* pCurrentVehicle = GetGameplayManager()->GetCurrentVehicle();
|
|
rAssert( pCurrentVehicle != NULL );
|
|
|
|
bool isNewVehicle = ( strcmp( pCurrentVehicle->GetName(), currentPreviewObject->name ) != 0 );
|
|
if( !isNewVehicle )
|
|
{
|
|
//
|
|
// Re-requesting old vehicle. Send some dialogue if there's a driver.
|
|
//
|
|
pDriverCharacter = pCurrentVehicle->GetDriver();
|
|
if( pDriverCharacter != NULL )
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_PHONE_BOOTH_OLD_VEHICLE_RESELECTED, pDriverCharacter );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetEventManager()->TriggerEvent( EVENT_FE_LOCKED_OUT );
|
|
return;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case GUI_MSG_MENU_SELECTION_MADE:
|
|
{
|
|
// load selected reward item
|
|
//
|
|
this->LoadSelectedReward();
|
|
|
|
break;
|
|
}
|
|
case GUI_MSG_CONTROLLER_LEFT:
|
|
{
|
|
m_currentPreviewVehicle = (m_currentPreviewVehicle - 1 + m_numPreviewVehicles) % m_numPreviewVehicles;
|
|
|
|
this->On3DModelSelectionChange( &m_previewVehicles[ m_currentPreviewVehicle ] );
|
|
this->UpdateDamagedInfo();
|
|
|
|
break;
|
|
}
|
|
case GUI_MSG_CONTROLLER_RIGHT:
|
|
{
|
|
m_currentPreviewVehicle = (m_currentPreviewVehicle + 1 + m_numPreviewVehicles) % m_numPreviewVehicles;
|
|
|
|
this->On3DModelSelectionChange( &m_previewVehicles[ m_currentPreviewVehicle ] );
|
|
this->UpdateDamagedInfo();
|
|
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Propogate the message up the hierarchy.
|
|
//
|
|
IGuiScreenRewards::HandleMessage( message, param1, param2 );
|
|
}
|
|
}
|
|
|
|
#ifdef RAD_WIN32
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::CheckCursorAgainstHotspots
|
|
//===========================================================================
|
|
// Description: Checks cursor position against its list of hotspots.
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: float x - The x position of cursor in P3D coordinates.
|
|
// float y - The y position of cursor in P3D coordinates.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
eFEHotspotType CGuiScreenPhoneBooth::CheckCursorAgainstHotspots( float x, float y )
|
|
{
|
|
eFEHotspotType hotSpotType = CGuiScreen::CheckCursorAgainstHotspots( x, y );
|
|
if( hotSpotType == HOTSPOT_NONE )
|
|
{
|
|
if( m_leftArrow )
|
|
{
|
|
if( m_leftArrow->IsPointInBoundingRect( x, y ) )
|
|
{
|
|
hotSpotType = HOTSPOT_ARROWLEFT;
|
|
}
|
|
}
|
|
if( m_rightArrow )
|
|
{
|
|
if( m_rightArrow->IsPointInBoundingRect( x, y ) )
|
|
{
|
|
hotSpotType = HOTSPOT_ARROWRIGHT;
|
|
}
|
|
}
|
|
|
|
}
|
|
return hotSpotType;
|
|
}
|
|
#endif
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::InitIntro
|
|
//===========================================================================
|
|
// Description:
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
void CGuiScreenPhoneBooth::InitIntro()
|
|
{
|
|
IGuiScreenRewards::InitIntro();
|
|
|
|
// hide lock by default
|
|
//
|
|
rAssert( m_lockedOverlay != NULL );
|
|
m_lockedOverlay->SetVisible( false );
|
|
|
|
// set level default vehicle as default garage vehicle selection
|
|
//
|
|
Reward* pDefaultCar = GetRewardsManager()->GetReward( GetGameplayManager()->GetCurrentLevelIndex(),
|
|
Reward::eDefaultCar );
|
|
if( pDefaultCar != NULL )
|
|
{
|
|
for( int i = 0; i < m_numPreviewVehicles; i++ )
|
|
{
|
|
if( m_previewVehicles[ i ].pReward == pDefaultCar )
|
|
{
|
|
m_currentPreviewVehicle = i;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
this->UpdateDamagedInfo();
|
|
|
|
// load current 3D model object
|
|
//
|
|
this->On3DModelSelectionChange( this->GetCurrentPreviewObject() );
|
|
|
|
// notify sound manager that game is paused
|
|
//
|
|
GetSoundManager()->OnStoreScreenStart();
|
|
}
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::InitRunning
|
|
//===========================================================================
|
|
// Description:
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
void CGuiScreenPhoneBooth::InitRunning()
|
|
{
|
|
IGuiScreenRewards::InitRunning();
|
|
|
|
CGuiScreenHud::UpdateNumCoinsDisplay( GetCoinManager()->GetBankValue() );
|
|
}
|
|
|
|
//===========================================================================
|
|
// CGuiScreenPhoneBooth::InitOutro
|
|
//===========================================================================
|
|
// Description:
|
|
//
|
|
// Constraints: None.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//===========================================================================
|
|
void CGuiScreenPhoneBooth::InitOutro()
|
|
{
|
|
if( m_isLoadingReward )
|
|
{
|
|
RelativeAnimatedCam::AllowSkipping( true );
|
|
RelativeAnimatedCam::Reset();
|
|
RelativeAnimatedCam::SetCamera( "phonecameraShape" );
|
|
RelativeAnimatedCam::SetMulticontroller( "phonecamera" );
|
|
tCameraAnimationController* camController = p3d::find< tCameraAnimationController >( "CAM_phonecameraShape" );
|
|
|
|
SuperCam* sc = GetSuperCamManager()->GetSCC( 0 )->GetSuperCam( SuperCam::RELATIVE_ANIMATED_CAM );
|
|
RelativeAnimatedCam* rac = dynamic_cast< RelativeAnimatedCam* >( sc );
|
|
rac->SetCameraAnimationController( camController );
|
|
GetSuperCamManager()->GetSCC( 0 )->SelectSuperCam( SuperCam::RELATIVE_ANIMATED_CAM );
|
|
RelativeAnimatedCam::CheckPendingCameraSwitch();
|
|
|
|
GetMissionManager()->Update( 16 );
|
|
GetSuperCamManager()->GetSCC( 0 )->NoTransition();
|
|
GetSuperCamManager()->Update( 16, true );
|
|
}
|
|
|
|
CGuiScreenHud::UpdateNumCoinsDisplay( 0, false );
|
|
|
|
IGuiScreenRewards::InitOutro();
|
|
|
|
// notify sound manager that game is un-paused
|
|
//
|
|
GetSoundManager()->OnStoreScreenEnd();
|
|
}
|
|
|
|
void
|
|
CGuiScreenPhoneBooth::On3DModelLoaded( const PreviewObject* previewObject )
|
|
{
|
|
p3d::pddi->DrawSync();
|
|
|
|
rAssert( m_previewImage != NULL );
|
|
m_previewImage->SetVisible( true );
|
|
m_previewImage->ResetTransformation();
|
|
|
|
// apply alpha to locked vehicles
|
|
//
|
|
m_previewImage->SetAlpha( previewObject->isUnlocked ? 1.0f : VEHICLE_LOCKED_IMAGE_ALPHA );
|
|
|
|
CarDamageStateEnum damageState = eNull;
|
|
if( previewObject->isUnlocked )
|
|
{
|
|
int carIndex = GetCharacterSheetManager()->GetCarIndex( previewObject->name );
|
|
if( carIndex >= 0 )
|
|
{
|
|
damageState = GetCharacterSheetManager()->GetCarDamageState( carIndex );
|
|
}
|
|
}
|
|
|
|
if( damageState == eHusk )
|
|
{
|
|
m_previewImage->ScaleAboutCenter( HUSK_CORRECTION_SCALE );
|
|
|
|
// show generic husk
|
|
//
|
|
m_previewImage->SetRawSprite( NULL, true );
|
|
}
|
|
else
|
|
{
|
|
// search for 2D image(s) in inventory
|
|
//
|
|
char name[ 16 ];
|
|
|
|
if( damageState == eDamaged )
|
|
{
|
|
// show damaged vehicle
|
|
//
|
|
#ifdef LOAD_DAMAGED_VEHICLE_IMAGES
|
|
sprintf( name, "%sD.png", previewObject->nameModel );
|
|
m_previewImage->ScaleAboutCenter( VEHICLE_DAMAGED_CORRECTION_SCALE );
|
|
#else
|
|
sprintf( name, "%s.png", previewObject->nameModel );
|
|
m_previewImage->ScaleAboutCenter( VEHICLE_CORRECTION_SCALE );
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
// show normal vehicle
|
|
//
|
|
sprintf( name, "%s.png", previewObject->nameModel );
|
|
|
|
m_previewImage->ScaleAboutCenter( VEHICLE_CORRECTION_SCALE );
|
|
}
|
|
|
|
tSprite* pSprite = p3d::find<tSprite>( name );
|
|
if( pSprite != NULL )
|
|
{
|
|
m_previewImage->SetRawSprite( pSprite, true );
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg( false, "*** Can't find 2D vehicle image!!" );
|
|
}
|
|
}
|
|
}
|
|
|
|
const PreviewObject*
|
|
CGuiScreenPhoneBooth::GetCurrentPreviewObject() const
|
|
{
|
|
const PreviewObject* previewObject = NULL;
|
|
|
|
if( m_numPreviewVehicles > 0 )
|
|
{
|
|
previewObject = &m_previewVehicles[ m_currentPreviewVehicle ];
|
|
}
|
|
|
|
return previewObject;
|
|
}
|
|
|
|
void
|
|
CGuiScreenPhoneBooth::InitMenu()
|
|
{
|
|
const int highestLevelPlayed = GetCharacterSheetManager()->QueryHighestMission().mLevel;
|
|
|
|
for( int i = 0; i <= highestLevelPlayed; i++ )
|
|
{
|
|
Reward* pReward = NULL;
|
|
|
|
for( int j = (Reward::eBlank + 1); j < Reward::NUM_QUESTS; j++ )
|
|
{
|
|
pReward = GetRewardsManager()->GetReward( i, (Reward::eQuestType)j );
|
|
if( pReward != NULL &&
|
|
pReward->GetRewardType() == Reward::ALT_PLAYERCAR )
|
|
{
|
|
rAssert( m_numPreviewVehicles < MAX_NUM_PREVIEW_VEHICLES - 1 );
|
|
m_numPreviewVehicles = this->InsertPreviewObject( m_previewVehicles,
|
|
m_numPreviewVehicles,
|
|
pReward,
|
|
true );
|
|
}
|
|
}
|
|
|
|
for( pReward = GetRewardsManager()->FindFirstMerchandise( i, Merchandise::SELLER_SIMPSON );
|
|
pReward != NULL;
|
|
pReward = GetRewardsManager()->FindNextMerchandise( i, Merchandise::SELLER_SIMPSON ) )
|
|
{
|
|
rAssert( m_numPreviewVehicles < MAX_NUM_PREVIEW_VEHICLES - 1 );
|
|
m_numPreviewVehicles = this->InsertPreviewObject( m_previewVehicles,
|
|
m_numPreviewVehicles,
|
|
pReward,
|
|
true );
|
|
}
|
|
|
|
for( pReward = GetRewardsManager()->FindFirstMerchandise( i, Merchandise::SELLER_GIL );
|
|
pReward != NULL;
|
|
pReward = GetRewardsManager()->FindNextMerchandise( i, Merchandise::SELLER_GIL ) )
|
|
{
|
|
rAssert( m_numPreviewVehicles < MAX_NUM_PREVIEW_VEHICLES - 1 );
|
|
m_numPreviewVehicles = this->InsertPreviewObject( m_previewVehicles,
|
|
m_numPreviewVehicles,
|
|
pReward,
|
|
true );
|
|
}
|
|
}
|
|
|
|
rAssertMsg( m_numPreviewVehicles > 0, "No vehicle selections!" );
|
|
|
|
// apply cheats, if enabled
|
|
//
|
|
if( GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_UNLOCK_VEHICLES ) )
|
|
{
|
|
for( int i = 0; i < m_numPreviewVehicles; i++ )
|
|
{
|
|
m_previewVehicles[ i ].isUnlocked = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CGuiScreenPhoneBooth::OnUpdate( unsigned int elapsedTime )
|
|
{
|
|
IGuiScreenRewards::OnUpdate( elapsedTime );
|
|
}
|
|
|
|
void
|
|
CGuiScreenPhoneBooth::LoadSelectedReward()
|
|
{
|
|
// unload 3D model first before loading reward
|
|
//
|
|
this->Unload3DModel();
|
|
|
|
m_isLoading = true; // set loading flag
|
|
m_isLoadingReward = true; // we're loading the selected reward
|
|
|
|
const PreviewObject* currentPreviewObject = this->GetCurrentPreviewObject();
|
|
|
|
VehicleCentral::DriverInit driverInit = VehicleCentral::ALLOW_DRIVER;
|
|
ActionButton::SummonVehiclePhone::LoadVehicle( currentPreviewObject->name,
|
|
currentPreviewObject->filename,
|
|
driverInit );
|
|
}
|
|
|
|
void
|
|
CGuiScreenPhoneBooth::UpdateDamagedInfo()
|
|
{
|
|
if( this->GetCurrentPreviewObject()->isUnlocked )
|
|
{
|
|
m_damagedInfo->SetVisible( true );
|
|
|
|
HeapMgr()->PushHeap( GMA_LEVEL_HUD );
|
|
|
|
Reward* pReward = this->GetCurrentPreviewObject()->pReward;
|
|
rAssert( pReward != NULL );
|
|
|
|
char buffer[ 16 ];
|
|
|
|
int carIndex = GetCharacterSheetManager()->GetCarIndex( pReward->GetName() );
|
|
if( carIndex != -1 )
|
|
{
|
|
float damagedAmount = 1.0f - GetCharacterSheetManager()->GetCarHealth( carIndex );
|
|
if( damagedAmount >= 0.0f && damagedAmount <= 1.0f )
|
|
{
|
|
sprintf( buffer, "%.0f %%", damagedAmount * 100 );
|
|
rAssert( m_vehicleDamaged != NULL );
|
|
m_vehicleDamaged->SetString( 0, buffer );
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg( false, "Why is the damage amount not between 0 and 1??" );
|
|
}
|
|
|
|
rAssert( m_repairCostInfo != NULL );
|
|
m_repairCostInfo->SetVisible( damagedAmount == 1.0f );
|
|
|
|
sprintf( buffer, "%d", pReward->GetRepairCost() );
|
|
rAssert( m_vehicleRepairCost != NULL );
|
|
m_vehicleRepairCost->SetString( 0, buffer );
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg( false, "Why is the car index -1??" );
|
|
}
|
|
|
|
HeapMgr()->PopHeap( GMA_LEVEL_HUD );
|
|
}
|
|
else
|
|
{
|
|
m_damagedInfo->SetVisible( false );
|
|
}
|
|
}
|
|
|
|
#ifdef SRR2_OVERRIDE_CAR_SELECTION
|
|
|
|
void
|
|
CGuiScreenPhoneBooth::HandleMessageForCar( eGuiMessage message,
|
|
unsigned int param1,
|
|
unsigned int param2 )
|
|
{
|
|
if( m_state == GUI_WINDOW_STATE_RUNNING )
|
|
{
|
|
switch( message )
|
|
{
|
|
case GUI_MSG_MENU_SELECTION_MADE:
|
|
{
|
|
rAssert( param1 == 0 );
|
|
|
|
if( m_menuTeleport )
|
|
{
|
|
if( s_currentTeleportSelection >= 0 &&
|
|
s_currentTeleportSelection < CharacterManager::GetNumTeleportDests() )
|
|
{
|
|
CharacterManager::Teleport(s_currentTeleportSelection );
|
|
|
|
m_pParent->HandleMessage( GUI_MSG_BACK_SCREEN );
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg( 0, "WARNING: *** Invalid teleport destination selection!" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( s_currentDebugVehicleSelection >= 0 &&
|
|
s_currentDebugVehicleSelection < static_cast<int>( NUM_OVERRIDE_VEHICLES ) )
|
|
{
|
|
char vehicleFileName[ 32 ];
|
|
sprintf( vehicleFileName, "%s%s.p3d",
|
|
VEHICLES_DIR,
|
|
OVERRIDE_VEHICLE_NAMES[ s_currentDebugVehicleSelection ] );
|
|
|
|
ActionButton::SummonVehiclePhone::CarSelectionInfo* pInfo =
|
|
ActionButton::SummonVehiclePhone::GetDebugCarSelectInfo();
|
|
|
|
rAssert( pInfo );
|
|
pInfo->AddDebugVehicleSelectionInfo( vehicleFileName,
|
|
OVERRIDE_VEHICLE_NAMES[ s_currentDebugVehicleSelection ],
|
|
"" );
|
|
|
|
this->Unload3DModel(); // unload 3D model first
|
|
|
|
ActionButton::SummonVehiclePhone::LoadDebugVehicle();
|
|
|
|
m_state = GUI_WINDOW_STATE_IDLE;
|
|
}
|
|
else
|
|
{
|
|
rAssertMsg( 0, "WARNING: *** Invalid vehicle selection!" );
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case GUI_MSG_MENU_SELECTION_VALUE_CHANGED:
|
|
{
|
|
rAssert( param1 == 0 );
|
|
|
|
HeapMgr()->PushHeap( GMA_LEVEL_HUD );
|
|
|
|
Scrooby::Text* vehicleNames = dynamic_cast<Scrooby::Text*>( m_pMenu->GetMenuItem( 0 )->GetItemValue() );
|
|
rAssert( vehicleNames != NULL );
|
|
|
|
if( m_menuTeleport )
|
|
{
|
|
s_currentTeleportSelection = static_cast<int>( param2 );
|
|
|
|
if( s_currentTeleportSelection == 99 )
|
|
{
|
|
s_currentTeleportSelection = CharacterManager::GetNumTeleportDests() - 1;
|
|
m_pMenu->SetSelectionValue( 0, s_currentTeleportSelection);
|
|
}
|
|
|
|
if( s_currentTeleportSelection >= CharacterManager::GetNumTeleportDests() )
|
|
{
|
|
s_currentTeleportSelection = 0;
|
|
m_pMenu->SetSelectionValue( 0, s_currentTeleportSelection);
|
|
}
|
|
|
|
vehicleNames->SetString( s_currentTeleportSelection, CharacterManager::GetTeleportDest(s_currentTeleportSelection) );
|
|
}
|
|
else
|
|
{
|
|
s_currentDebugVehicleSelection = static_cast<int>( param2 );
|
|
|
|
if( param2 < NUM_OVERRIDE_VEHICLES )
|
|
{
|
|
char textBibleEntry[ 16 ];
|
|
strcpy( textBibleEntry, OVERRIDE_VEHICLE_NAMES[ s_currentDebugVehicleSelection ] );
|
|
UnicodeChar* textBibleString = GetTextBibleString( strupr( textBibleEntry ) );
|
|
UnicodeString unicodeString;
|
|
if( textBibleString != NULL )
|
|
{
|
|
unicodeString.ReadUnicode( textBibleString );
|
|
}
|
|
else
|
|
{
|
|
unicodeString.ReadAscii( OVERRIDE_VEHICLE_NAMES[ s_currentDebugVehicleSelection ] );
|
|
}
|
|
|
|
vehicleNames->SetString( s_currentDebugVehicleSelection, unicodeString );
|
|
}
|
|
}
|
|
|
|
HeapMgr()->PopHeap( GMA_LEVEL_HUD );
|
|
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( m_pMenu != NULL )
|
|
{
|
|
m_pMenu->HandleMessage( message, param1, param2 );
|
|
}
|
|
}
|
|
|
|
CGuiScreen::HandleMessage( message, param1, param2 );
|
|
}
|
|
|
|
#endif
|
|
|