This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Commando/scorescreen.cpp

482 lines
17 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program 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.
**
** This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando *
* *
* $Archive:: /Commando/Code/Commando/scorescreen.cpp $*
* *
* $Author:: Byon_g $*
* *
* $Modtime:: 1/24/02 11:20a $*
* *
* $Revision:: 27 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "scorescreen.h"
#include "campaign.h"
#include "resource.h"
#include "translatedb.h"
#include "string_ids.h"
#include "imagectrl.h"
#include "debug.h"
#include "wwstring.h"
#include "gamedata.h"
#include "combat.h"
#include "playerdata.h"
#include "cheatmgr.h"
#include "objectives.h"
#include "dlgloadspgame.h"
#include "savegame.h"
#define NUM_MISSIONS 13
/*
**
*/
void ScoreScreenGameModeClass::Init()
{
START_DIALOG( ScoreScreenDialogClass );
}
float _SSStats_play_time = 0;
int _SSStats_mission_number = 0;
int _SSStats_reload_count = 0;
bool _SSStats_cheated = 0;
int _SSStats_secondary_objectives = 0;
int _SSStats_completed_secondary_objectives = 0;
int _SSStats_tertiary_objectives = 0;
int _SSStats_completed_tertiary_objectives = 0;
int _SSStats_building_destroyed = 0;
int _SSStats_vehicles_destroyed = 0;
int _SSStats_enemies_killed = 0;
int _SSStats_head_hit = 0;
int _SSStats_torso_hit = 0;
int _SSStats_arm_hit = 0;
int _SSStats_crotch_hit = 0;
int _SSStats_leg_hit = 0;
StringClass _SSStats_map_name;
/*
** We save all the stats before the combat is shutdown
*/
void ScoreScreenGameModeClass::Save_Stats( void )
{
_SSStats_play_time = 100000;
_SSStats_building_destroyed = 0;
_SSStats_vehicles_destroyed = 0;
_SSStats_enemies_killed = 0;
_SSStats_head_hit = 0;
_SSStats_torso_hit = 0;
_SSStats_arm_hit = 0;
_SSStats_crotch_hit = 0;
_SSStats_leg_hit = 0;
if ( COMBAT_STAR ) {
PlayerDataClass * player_data = COMBAT_STAR->Get_Player_Data();
if ( player_data != NULL ) {
_SSStats_play_time = player_data->Get_Game_Time();
_SSStats_building_destroyed = player_data->Get_Building_Destroyed();
_SSStats_vehicles_destroyed = player_data->Get_Vehiclies_Destroyed();
_SSStats_enemies_killed = player_data->Get_Enemies_Killed();
_SSStats_head_hit = player_data->Get_Head_Shots();
_SSStats_torso_hit = player_data->Get_Torso_Shots();
_SSStats_arm_hit = player_data->Get_Arm_Shots();
_SSStats_crotch_hit = player_data->Get_Crotch_Shots();
_SSStats_leg_hit = player_data->Get_Leg_Shots();
}
}
// Save the map name
_SSStats_map_name = The_Game()->Get_Map_Name();
StringClass map_name(0,true);
if (SaveGameManager::Peek_Map_Name (_SSStats_map_name, map_name)) {
_SSStats_map_name = map_name;
}
WWASSERT(PTheGameData != NULL);
_SSStats_mission_number = cGameData::Get_Mission_Number_From_Map_Name( _SSStats_map_name );
// Oh, this is just terrible!!! Byon
#define TUTORIAL_LOAD_MENU_NUMBER 90
if ( _SSStats_mission_number == TUTORIAL_LOAD_MENU_NUMBER ) {
_SSStats_mission_number = 0;
}
if ( _SSStats_mission_number > NUM_MISSIONS ) {
_SSStats_mission_number = NUM_MISSIONS;
}
if ( _SSStats_mission_number < 0 ) {
_SSStats_mission_number = 0;
}
_SSStats_reload_count = CombatManager::Get_Reload_Count();
_SSStats_cheated = CheatMgrClass::Get_Instance()->Was_Cheat_Used( CheatMgrClass::ALL_CHEATS );
_SSStats_secondary_objectives = ObjectiveManager::Get_Num_Objectives( ObjectiveManager::TYPE_SECONDARY );
_SSStats_completed_secondary_objectives = ObjectiveManager::Get_Num_Completed_Objectives( ObjectiveManager::TYPE_SECONDARY );
_SSStats_tertiary_objectives = ObjectiveManager::Get_Num_Objectives( ObjectiveManager::TYPE_TERTIARY );
_SSStats_completed_tertiary_objectives = ObjectiveManager::Get_Num_Completed_Objectives( ObjectiveManager::TYPE_TERTIARY );
}
////////////////////////////////////////////////////////////////
//
// ScoreScreenDialogClass
//
////////////////////////////////////////////////////////////////
ScoreScreenDialogClass::ScoreScreenDialogClass (void) :
MenuDialogClass (IDD_SCORE_SCREEN)
{
ScoreScreenActive = true;
return ;
}
////////////////////////////////////////////////////////////////
//
// On_Init_Dialog
//
////////////////////////////////////////////////////////////////
void
ScoreScreenDialogClass::On_Init_Dialog (void)
{
MenuDialogClass::On_Init_Dialog ();
int time_to_finish_stars = Get_Time_To_Finish_Stars();
int level_of_play_stars = Get_Level_Of_Play_Stars();
int saves_loaded_stars = Get_Saves_Loaded_Stars();
int secondary_missions_stars = Get_Secondary_Missions_Stars();
int overall_stars = (time_to_finish_stars + level_of_play_stars +
saves_loaded_stars + secondary_missions_stars) / 4;
// Update the ranking
LoadSPGameMenuClass::Set_Game_Rank( _SSStats_map_name, overall_stars );
/*
** Setup Star Textures
*/
#define BIG_STAR_TEXTURE "IF_LrgStar.tga"
#define SMALL_STAR_TEXTURE "IF_LrgStar.tga"
((ImageCtrlClass*)Get_Dlg_Item( IDC_SS_BACKGROUND ))->Set_Texture( "if_missioncomp.tga" );
((ImageCtrlClass*)Get_Dlg_Item( IDC_MISSION_EVAL_STAR_1 ))->Set_Texture( BIG_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_MISSION_EVAL_STAR_2 ))->Set_Texture( BIG_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_MISSION_EVAL_STAR_3 ))->Set_Texture( BIG_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_MISSION_EVAL_STAR_4 ))->Set_Texture( BIG_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_MISSION_EVAL_STAR_5 ))->Set_Texture( BIG_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_1 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_2 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_3 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_4 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_5 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_1 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_2 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_3 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_4 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_5 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SAVES_LOADED_STAR_1 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SAVES_LOADED_STAR_2 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SAVES_LOADED_STAR_3 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SAVES_LOADED_STAR_4 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SAVES_LOADED_STAR_5 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_1 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_2 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_3 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_4 ))->Set_Texture( SMALL_STAR_TEXTURE );
((ImageCtrlClass*)Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_5 ))->Set_Texture( SMALL_STAR_TEXTURE );
Get_Dlg_Item( IDC_MISSION_EVAL_STAR_1 )->Show( overall_stars >= 1 );
Get_Dlg_Item( IDC_MISSION_EVAL_STAR_2 )->Show( overall_stars >= 2 );
Get_Dlg_Item( IDC_MISSION_EVAL_STAR_3 )->Show( overall_stars >= 3 );
Get_Dlg_Item( IDC_MISSION_EVAL_STAR_4 )->Show( overall_stars >= 4 );
Get_Dlg_Item( IDC_MISSION_EVAL_STAR_5 )->Show( overall_stars >= 5 );
Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_1 )->Show( time_to_finish_stars >= 1 );
Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_2 )->Show( time_to_finish_stars >= 2 );
Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_3 )->Show( time_to_finish_stars >= 3 );
Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_4 )->Show( time_to_finish_stars >= 4 );
Get_Dlg_Item( IDC_TIME_TO_FINISH_STAR_5 )->Show( time_to_finish_stars >= 5 );
Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_1 )->Show( level_of_play_stars >= 1 );
Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_2 )->Show( level_of_play_stars >= 2 );
Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_3 )->Show( level_of_play_stars >= 3 );
Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_4 )->Show( level_of_play_stars >= 4 );
Get_Dlg_Item( IDC_LEVEL_OF_PLAY_STAR_5 )->Show( level_of_play_stars >= 5 );
Get_Dlg_Item( IDC_SAVES_LOADED_STAR_1 )->Show( saves_loaded_stars >= 1 );
Get_Dlg_Item( IDC_SAVES_LOADED_STAR_2 )->Show( saves_loaded_stars >= 2 );
Get_Dlg_Item( IDC_SAVES_LOADED_STAR_3 )->Show( saves_loaded_stars >= 3 );
Get_Dlg_Item( IDC_SAVES_LOADED_STAR_4 )->Show( saves_loaded_stars >= 4 );
Get_Dlg_Item( IDC_SAVES_LOADED_STAR_5 )->Show( saves_loaded_stars >= 5 );
Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_1 )->Show( secondary_missions_stars >= 1 );
Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_2 )->Show( secondary_missions_stars >= 2 );
Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_3 )->Show( secondary_missions_stars >= 3 );
Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_4 )->Show( secondary_missions_stars >= 4 );
Get_Dlg_Item( IDC_SECONDARY_MISSIONS_STAR_5 )->Show( secondary_missions_stars >= 5 );
bool cheater = _SSStats_cheated;
// Build Rank Text
int rank_ids[5] = { IDS_SS_RANK_1, IDS_SS_RANK_2, IDS_SS_RANK_3, IDS_SS_RANK_4, IDS_SS_RANK_5 };
WideStringClass rank_name = L"";
rank_name += TRANSLATE( rank_ids[ overall_stars-1 ] );
if ( cheater ) {
rank_name += TRANSLATE( IDS_SS_CHEATER );
}
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_RANK, rank_name );
// Build Rank Image
const char * rank_images[5] = { "IF_private.tga", "IF_sargent.tga", "IF_leutenant.tga", "IF_major.tga", "IF_general.tga" };
const char * rank_image = "IF_cheatgod.tga";
if ( !cheater ) {
rank_image = rank_images[ overall_stars-1 ];
}
((ImageCtrlClass*)Get_Dlg_Item( IDC_RANK_IMAGE ))->Set_Texture( rank_image );
WideStringClass wstr;
wstr.Format( L"%d", _SSStats_building_destroyed );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_BUILDING_COUNT, wstr );
wstr.Format( L"%d", _SSStats_vehicles_destroyed );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_VEHICLE_COUNT, wstr );
wstr.Format( L"%d", _SSStats_enemies_killed );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_ENEMY_COUNT, wstr );
wstr.Format( L"%d", _SSStats_enemies_killed );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_ENEMY_COUNT, wstr );
wstr.Format( L"%d", _SSStats_head_hit );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_HEAD_COUNT, wstr );
wstr.Format( L"%d", _SSStats_torso_hit );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_TORSO_COUNT, wstr );
wstr.Format( L"%d", _SSStats_arm_hit );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_ARM_COUNT, wstr );
wstr.Format( L"%d", _SSStats_crotch_hit );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_CROTCH_COUNT, wstr );
wstr.Format( L"%d", _SSStats_leg_hit );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_LEG_COUNT, wstr );
WideStringClass text;
text.Format( TRANSLATE( IDS_SS_X_OF_N ), _SSStats_completed_tertiary_objectives, _SSStats_tertiary_objectives );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_BONUS, text );
int mission_names[ NUM_MISSIONS+1 ] = {
IDS_LoadScreen_Tutorial_Item_00_Title,
IDS_Enc_Miss_Title_M01_01,
IDS_Enc_Miss_Title_M02_01,
IDS_Enc_Miss_Title_M03_01,
IDS_Enc_Miss_Title_M04_01,
IDS_Enc_Miss_Title_M05_01,
IDS_Enc_Miss_Title_M06_01,
IDS_Enc_Miss_Title_M07_01,
IDS_Enc_Miss_Title_M08_01,
IDS_Enc_Miss_Title_M09_01,
IDS_Enc_Miss_Title_M10_01,
IDS_Enc_Miss_Title_M11_01,
IDS_LoadScreen_MX0_Title, // 12
IDS_LoadScreen_MX0_Title, // 13 (m00)
};
int id = mission_names[_SSStats_mission_number];
Set_Dlg_Item_Text( IDC_SS_MISSION_NAME, TRANSLATE( id ) );
return ;
}
////////////////////////////////////////////////////////////////
//
// On_Init_Dialog
//
////////////////////////////////////////////////////////////////
void
ScoreScreenDialogClass::On_Destroy (void)
{
MenuDialogClass::On_Destroy ();
if ( ScoreScreenActive ) {
ScoreScreenActive = false;
CampaignManager::Continue();
}
return ;
}
////////////////////////////////////////////////////////////////
//
// On_Command
//
////////////////////////////////////////////////////////////////
void
ScoreScreenDialogClass::On_Command (int ctrl_id, int mesage_id, DWORD param)
{
switch (ctrl_id)
{
case IDCANCEL:
case IDOK:
End_Dialog();
break;
default:
MenuDialogClass::On_Command (ctrl_id, mesage_id, param);
break;
}
return ;
}
/*
**
*/
float level_star_times[] = {
/* STARS 2 3 4 5 */
/* 0 */ 10,
/* 1 */ 20,
/* 2 */ 40,
/* 3 */ 20,
/* 4 */ 25,
/* 5 */ 30,
/* 6 */ 20,
/* 7 */ 35,
/* 8 */ 20,
/* 9 */ 25,
/* 10 */ 35,
/* 11 */ 25,
/* 12 */ 10,
/* 13 */ 10, // Mission 0
};
int ScoreScreenDialogClass::Get_Time_To_Finish_Stars( void )
{
int mission = _SSStats_mission_number;
float time = (_SSStats_play_time+59.0f) / 60.0f;
float par_time = level_star_times[mission];
int stars = 1;
if ( time <= par_time * 1.5f ) {
stars = 2;
}
if ( time <= par_time * 1.3f ) {
stars = 3;
}
if ( time <= par_time * 1.1f ) {
stars = 4;
}
if ( time <= par_time ) {
stars = 5;
}
int minutes = time;
WideStringClass wtime;
wtime.Format( TRANSLATE( IDS_SS_HOURS_MINUTES ), minutes / 60, minutes % 60 );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_PLAYTIME, wtime );
// Debug_Say(( "Time %f Mission %d = Stars %d\n", time, mission, stars ));
return stars;
}
/*
**
*/
int ScoreScreenDialogClass::Get_Level_Of_Play_Stars( void )
{
if ( CombatManager::Get_Difficulty_Level() >= 2 ) {
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_DIFFICULTY, TRANSLATE( IDS_MENU_TEXT065 ) );
return 5;
}
if ( CombatManager::Get_Difficulty_Level() >= 1 ) {
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_DIFFICULTY, TRANSLATE( IDS_MENU_TEXT064 ) );
return 3;
}
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_DIFFICULTY, TRANSLATE( IDS_MENU_TEXT063 ) );
return 1;
}
/*
**
*/
int ScoreScreenDialogClass::Get_Saves_Loaded_Stars( void )
{
WideStringClass text;
text.Format( TRANSLATE( IDS_SS_RELOADS ), _SSStats_reload_count );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_LOADS, text );
if ( _SSStats_reload_count == 0 ) {
return 5;
}
if ( _SSStats_reload_count <= 2 ) {
return 4;
}
if ( _SSStats_reload_count <= 5 ) {
return 3;
}
if ( _SSStats_reload_count <= 9 ) {
return 2;
}
return 1;
}
/*
**
*/
int ScoreScreenDialogClass::Get_Secondary_Missions_Stars( void )
{
WideStringClass text;
text.Format( TRANSLATE( IDS_SS_X_OF_N ), _SSStats_completed_secondary_objectives, _SSStats_secondary_objectives );
Set_Dlg_Item_Text( IDC_SCORE_SCREEN_SECONDARY, text );
float ratio = 1.0f;
if ( _SSStats_secondary_objectives != 0 ) {
ratio = (float)_SSStats_completed_secondary_objectives / (float)_SSStats_secondary_objectives;
}
if ( ratio >= 1.0f ) {
return 5;
}
if ( ratio >= 0.9f ) {
return 4;
}
if ( ratio >= 0.7f ) {
return 3;
}
if ( ratio >= 0.5f ) {
return 2;
}
return 1;
}