/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* 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 2 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 .
*
*/
//Filename : OGAMEND.CPP
//Description : Game ending screen
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// ####### begin Gilbert 29/10 ########//
#include
// ####### end Gilbert 29/10 ########//
//-------- Declare static vars & functions ---------//
static int disp_score(int winFlag);
static void disp_goal_str(int winNationRecno);
static void disp_losing_str(int surrenderToNationRecno);
static void disp_retire_str();
static void disp_ranking();
static void disp_stat();
static void put_stat(int y, char* desStr, char* dispStr);
static void put_stat(int y, char* desStr, int dispValue);
static void put_ranking(int y, int nationRecno);
//---------- Begin of function Game::game_end --------//
//
// winNationRecno - the recno of the nation that won the game.
// 0 - if you are just defeated or surrender
// to another kingdom, and no other kingdom
// has won yet.
// [int] playerDestroyed - whether the player's nation has been destroyed or not.
// (default: 0)
// [int] surrenderToNationRecno - the nation your surrender to.
// [int] retireFlag - 1 if the player retires
//
void Game::game_end(int winNationRecno, int playerDestroyed, int surrenderToNationRecno, int retireFlag)
{
//--- if the player has already won/lost the game and is just staying/observing the game ---//
if( game_has_ended && !retireFlag ) // don't repeat displaying the winning/losing screen
return;
// ------ quit any menu mode ------//
if( option_menu.is_active() )
{
option_menu.abort();
}
if( ::in_game_menu.is_active() )
{
::in_game_menu.abort();
}
//------ set the quit siginal -------//
sys.signal_exit_flag = 2; // set it first to disable Power::mouse.handler()
mouse_cursor.set_frame(0);
// ####### begin Gilbert 29/10 #######//
mouse_cursor.set_icon(CURSOR_NORMAL);
// ####### end Gilbert 29/10 #######//
info.save_game_scr();
int useBackBuf = vga.use_back_buf;
vga.use_front();
//------- display the winning/losing picture -------//
int songId = 10;
int winFlag = 0;
if( !retireFlag ) // don't display this when retire
{
char* fileName;
if( winNationRecno && (winNationRecno == nation_array.player_recno) )
{
fileName = race_res[(~nation_array)->race_id]->code;
songId = 9;
winFlag = 1;
}
else
fileName = "LOSEGAME";
vga.disp_image_file(fileName);
music.play(songId, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0);
mouse.wait_press(60); // 60 seconds to time out
}
else
{
music.play(songId, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0);
}
//------- display the statistic -------//
vga.disp_image_file("RESULTS");
if( winNationRecno )
{
disp_goal_str(winNationRecno);
}
else if( retireFlag )
{
disp_retire_str();
}
else
{
disp_losing_str(surrenderToNationRecno);
}
disp_stat();
mouse.wait_press(60); // 60 seconds to time out
//-------- display ranking and score ----------//
vga.disp_image_file("RESULTS");
info.set_rank_data(0); // count all nations, not only those that have contact with the player
disp_ranking();
int totalScore = disp_score(winFlag);
mouse.wait_press(60); // 60 seconds to time out
//--- if the player has managed to get into the hall of fame ---//
if( !game_has_ended )
{
if( !game_file_array.add_hall_of_fame(totalScore) )
vga.finish_disp_image_file(); // if add_hall_of_fame() has displayed the bitmap, it should have called vga.finish_disp_image_file() already
}
else
{
vga.finish_disp_image_file();
}
//--------- set game_has_ended to 1 --------//
music.stop();
game_has_ended = 1;
//----------- reset all goals -----------//
config.goal_destroy_monster = 0;
config.goal_population_flag = 0;
config.goal_economic_score_flag = 0;
config.goal_total_score_flag = 0;
config.goal_year_limit_flag = 0;
//--- otherwise, ask if the player wants to stay in the game ---//
#ifndef DEMO // cannot continue to stay in the game in the demo version
if( !retireFlag && !remote.is_enable() ) // can't stay in the game in a multiplayer game
{
vga_front.bar( 0, 0, VGA_WIDTH-1, VGA_HEIGHT-1, V_BLACK ); // clear the screen
// ###### begin Gilbert 29/10 ######//
char powerWinFlag = power.win_opened;
power.win_opened = 1;
if( box.ask( "Do you want to continue to stay in the game?", "Yes", "No" ) )
sys.signal_exit_flag = 0;
power.win_opened = powerWinFlag;
// ###### end Gilbert 29/10 ######//
}
#endif
//-------- if it quits now ----------//
if( sys.signal_exit_flag )
{
info.free_game_scr();
vga.use_back_buf = useBackBuf;
}
else
{
//---- otherwise restore the screen and continue to play ----//
info.rest_game_scr();
vga.use_back_buf = useBackBuf;
//---- reveal the whole world for staying in the game after being destroyed ----//
if( playerDestroyed && !retireFlag )
{
world.unveil(0, 0, MAX_WORLD_X_LOC-1, MAX_WORLD_Y_LOC-1);
world.visit(0, 0, MAX_WORLD_X_LOC-1, MAX_WORLD_Y_LOC-1, 0, 0);
config.blacken_map = 0;
config.fog_of_war = 0;
}
}
}
//----------- End of function Game::game_end ---------//
//----------- Begin of static function disp_goal_str -----------//
static void disp_goal_str(int winNationRecno)
{
Nation* winNation = nation_array[winNationRecno];
String str, str2;
if( winNationRecno == nation_array.player_recno )
str = translate.process("Your Kingdom");
else
str = nation_array[winNationRecno]->nation_name();
str2 = "";
//---- if the player has achieved one of its goals ----//
if( winNation->goal_destroy_monster_achieved() )
{
str2 = str;
str = translate.process("All Fryhtans have been Destroyed !");
str2 += translate.process(" has Achieved the Highest Fryhtan Battling Score !");
}
//-----------------------------------//
else if( winNation->goal_population_achieved() )
{
str += translate.process( " has Reached" );
str2 = translate.process( "its Population Goal of " );
str2 += config.goal_population;
str2 += " !";
}
//-----------------------------------//
else if( winNation->goal_economic_score_achieved() )
{
str += translate.process( " has Reached" );
str2 = translate.process( "its Economic Score Goal of " );
str2 += config.goal_economic_score;
str2 += " !";
}
//-----------------------------------//
else if( winNation->goal_total_score_achieved() )
{
str += translate.process( " has Reached" );
str2 = translate.process( "its Total Score Goal of " );
str2 += config.goal_total_score;
str2 += " !";
}
//-----------------------------------//
else // ( winNation->goal_destroy_nation_achieved() )
{
str += translate.process( " has Defeated All Other Kingdoms !" );
}
//-----------------------------------//
int y=40;
if( winNationRecno != nation_array.player_recno )
{
font_bible.center_put(0, 30, VGA_WIDTH-1, 60, "You Have Lost the Game !" );
y=60;
}
font_bible.center_put(0, y , VGA_WIDTH-1, y+30, str );
font_bible.center_put(0, y+30, VGA_WIDTH-1, y+60, str2 );
}
//----------- End of static function disp_goal_str -----------//
//----------- Begin of static function disp_losing_str -----------//
static void disp_losing_str(int surrenderToNationRecno)
{
String str;
if( surrenderToNationRecno ) // you surrender to another kingdom
{
str = translate.process( "You Surrendered to " );
str += nation_array[surrenderToNationRecno]->nation_name();
str += " ";
str += translate.process( "on ");
str += date.date_str(info.game_date);
str += ".";
}
// You failed to achieve the goal within the time limit
else if( config.goal_year_limit_flag && info.game_date >= info.goal_deadline )
{
str = "Your Kingdom has Failed to Achieve its Goal Within the Time Limit.";
}
else // you're defeated by another kingdom
{
str = "Your Kingdom has Gone Down to Ignominious Defeat !";
}
font_bible.center_put(0, 0, VGA_WIDTH-1, 139, str );
}
//----------- End of static function disp_losing_str -----------//
//----------- Begin of static function disp_retire_str -----------//
static void disp_retire_str()
{
String str;
#if(defined(SPANISH))
str = "Te has retirado el ";
str += date.date_str( info.game_date );
str += ".";
#elif(defined(FRENCH))
str = "Vous avez abandonné le ";
str += date.date_str( info.game_date );
str += ".";
#elif(defined(GERMAN))
str = "Sie haben am ";
str += date.date_str( info.game_date );
str += " aufgegeben.";
#else
str = "You Retired on ";
str += date.date_str( info.game_date );
str += ".";
#endif
font_bible.center_put(0, 0, VGA_WIDTH-1, 139, str );
}
//----------- End of static function disp_retire_str -----------//
//-------- Begin of static function disp_stat --------//
//
static void disp_stat()
{
int y=140;
Nation* nationPtr = ~nation_array;
put_stat( y , "Duration of Your Rule", info.game_duration_str() );
put_stat( y+=20, "Total Gaming Time", info.play_time_str() );
put_stat( y+=30, "Final Population", nationPtr->all_population() );
put_stat( y+=20, "Final Treasure" , m.format((int)nationPtr->cash,2) );
put_stat( y+=30, "Enemy Soldiers Dispatched", nationPtr->enemy_soldier_killed );
put_stat( y+=20, "King's Soldiers Martyred" , nationPtr->own_soldier_killed );
put_stat( y+=30, "Enemy Weapons Destroyed" , nationPtr->enemy_weapon_destroyed );
put_stat( y+=20, "King's Weapons Rendered Obsolete", nationPtr->own_weapon_destroyed );
put_stat( y+=30, "Enemy Ships Sunk" , nationPtr->enemy_ship_destroyed );
put_stat( y+=20, "King's Ships Missing", nationPtr->own_ship_destroyed );
put_stat( y+=30, "Enemy Buildings Destroyed" , nationPtr->enemy_firm_destroyed );
put_stat( y+=20, "King's Buildings Cleared", nationPtr->own_firm_destroyed );
put_stat( y+=30, "Enemy Civilians Collaterally Damaged", nationPtr->enemy_civilian_killed );
put_stat( y+=20, "King's Civilians Cruelly Murdered" , nationPtr->own_civilian_killed );
}
//----------- End of static function disp_stat -----------//
//-------- Begin of static function put_stat --------//
//
static void put_stat(int y, char* desStr, char* dispStr)
{
font_bible.put( 140, y, desStr );
font_bible.put( 570, y, dispStr );
}
//----------- End of static function put_stat -----------//
//-------- Begin of static function put_stat --------//
//
static void put_stat(int y, char* desStr, int dispValue)
{
font_bible.put( 140, y, desStr );
font_bible.put( 570, y, m.format(dispValue) );
}
//----------- End of static function put_stat -----------//
//-------- Begin of static function disp_ranking --------//
//
static void disp_ranking()
{
//--------- display descriptions ---------//
int x=20, y=76;
font_bible.put( x+20 , y+7, "Kingdom" );
font_bible.put( x+260, y+7, "Population" );
font_bible.put( x+370, y+7, "Military" );
font_bible.put( x+470, y+7, "Economy" );
font_bible.put( x+562, y+7, "Reputation" );
#if(defined(SPANISH))
font_bible.put( x+670, y , "Lucha" );
font_bible.put( x+670, y+14, "Fryhtan" );
#else
font_bible.put( x+670, y , "Fryhtan" );
font_bible.put( x+670, y+14, "Battling" );
#endif
//--------- display rankings -----------//
put_ranking(y+=36, nation_array.player_recno);
for( int i=1 ; i<=nation_array.size() ; i++ )
{
if( nation_array.is_deleted(i) || i==nation_array.player_recno )
continue;
put_ranking( y+=30, i );
}
}
//----------- End of static function disp_ranking -----------//
//-------- Begin of static function put_ranking --------//
//
static void put_ranking(int y, int nationRecno)
{
Nation* nationPtr = nation_array[nationRecno];
int x=20;
nationPtr->disp_nation_color(x, y+5);
font_bible.put( x+20, y, nationPtr->nation_name() );
int y2 = y+font_bible.height()-1;
font_bible.center_put( x+260, y, x+340, y2, info.get_rank_pos_str(1, nationRecno) );
font_bible.center_put( x+370, y, x+435, y2, info.get_rank_pos_str(2, nationRecno) );
font_bible.center_put( x+470, y, x+540, y2, info.get_rank_pos_str(3, nationRecno) );
font_bible.center_put( x+562, y, x+640, y2, info.get_rank_pos_str(4, nationRecno) );
font_bible.center_put( x+670, y, x+730, y2, info.get_rank_pos_str(5, nationRecno) );
}
//----------- End of static function put_ranking -----------//
//--------- Begin of static function disp_score ---------//
//
static int disp_score(int winFlag)
{
int x=200, y=360;
static char* rankStrArray[] =
{ "Population Score", "Military Score", "Economic Score",
"Reputation Score", "Fryhtan Battling Score" };
//------ display individual scores ---------//
int rankScore, totalScore=0;
int viewNationRecno = nation_array.player_recno;
for( int i=0 ; icheat_enabled_flag ) // if cheated, don't display bonus score, as there is no space for displaying both
{
str += "+ ";
str += info.goal_score_bonus;
str += " (Bonus) ";
finalScore += info.goal_score_bonus;
}
//------- if the player has cheated -------//
if( nation_array[viewNationRecno]->cheat_enabled_flag )
{
str = "X 0 ";
str += translate.process( "(Cheated)" );
str += " ";
finalScore = 0;
}
str += "= ";
str += finalScore;
font_bible.put( x+180, y+18, str);
return finalScore;
}
//----------- End of static function disp_score -----------//