/*
* 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 : OR_RANK.CPP
//Description : Ranking report
#include
#include
#include
#include
#include
#include
#include
//------------- Define coordinations -----------//
enum { NATION_BROWSE_X1 = ZOOM_X1+6,
NATION_BROWSE_Y1 = ZOOM_Y1+6,
NATION_BROWSE_X2 = ZOOM_X2-6,
NATION_BROWSE_Y2 = NATION_BROWSE_Y1+220,
};
enum { NATION_SCORE_X1 = ZOOM_X1+6,
NATION_SCORE_Y1 = NATION_BROWSE_Y2+6,
NATION_SCORE_X2 = ZOOM_X2-6,
NATION_SCORE_Y2 = NATION_SCORE_Y1+150,
};
enum { NATION_GOAL_X1 = ZOOM_X1+6,
NATION_GOAL_Y1 = NATION_SCORE_Y2+6,
NATION_GOAL_X2 = ZOOM_X2-6,
NATION_GOAL_Y2 = NATION_GOAL_Y1+110,
};
enum { PLAY_TIME_X1 = ZOOM_X1+6,
PLAY_TIME_X2 = ZOOM_X2-6,
};
//----------- Define static variables ----------//
static VBrowseIF browse_nation;
static int nation_rank_data_array[MAX_RANK_TYPE][MAX_NATION];
//----------- Define static functions ----------//
static void put_nation_rec(int recNo, int x, int y, int refreshFlag);
static int nation_filter(int recNo=0);
static void disp_score();
static void disp_goal();
static void disp_play_time(int y1);
//--------- Begin of function Info::disp_rank ---------//
//
void Info::disp_rank(int refreshFlag)
{
set_rank_data(1); // 1-only set those nations that have contact with us
int x=NATION_BROWSE_X1+9;
int y=NATION_BROWSE_Y1+3;
vga_back.d3_panel_up(NATION_BROWSE_X1, NATION_BROWSE_Y1, NATION_BROWSE_X2, NATION_BROWSE_Y1+32 );
font_san.put( x , y+7, "Kingdom" );
font_san.put( x+180, y+7, "Population" );
font_san.put( x+264, y+7, "Military" );
font_san.put( x+332, y+7, "Economy" );
font_san.put( x+406, y+7, "Reputation" );
#if(defined(SPANISH))
font_san.put( x+484, y , "Lucha" );
font_san.put( x+484, y+13, "Fryhtan" );
#else
// FRENCH, German and US
font_san.put( x+484, y , "Fryhtan" );
font_san.put( x+484, y+13, "Battling" );
#endif
if( refreshFlag == INFO_REPAINT )
{
browse_nation.init( NATION_BROWSE_X1, NATION_BROWSE_Y1+34, NATION_BROWSE_X2, NATION_BROWSE_Y2,
0, 22, nation_filter(), put_nation_rec, 1 );
browse_nation.open(browse_nation_recno);
}
else
{
browse_nation.paint();
browse_nation.open(browse_nation_recno, nation_filter());
}
//----- display score -------//
disp_score();
//------ display goal -------//
if( !game.game_has_ended ) // if the ending screen has already appeared once, don't display the goal
{
disp_goal();
y = NATION_GOAL_Y2+6;
}
else
{
y = NATION_GOAL_Y1;
}
//----- display total playing time -----//
disp_play_time(y);
}
//----------- End of function Info::disp_rank -----------//
//--------- Begin of static function disp_score ---------//
//
static void disp_score()
{
int x=NATION_SCORE_X1+6, y=NATION_SCORE_Y1+6;
static char* rankStrArray[] =
{ "Population Score", "Military Score", "Economic Score",
"Reputation Score", "Fryhtan Battling Score" };
vga.d3_panel_down( NATION_SCORE_X1, NATION_SCORE_Y1, NATION_SCORE_X2, NATION_SCORE_Y2 );
//------ display individual scores ---------//
int rankScore, totalScore=0;
int viewNationRecno = nation_filter(browse_nation.recno());
for( int i=0 ; icheat_enabled_flag )
{
str = "X 0 ";
str += translate.process( "(Cheated)" );
str += " ";
finalScore = 0;
}
else
str = "";
str += "= ";
str += finalScore;
font_san.put( x2+170, y+12, str);
y+=36;
}
//----------- End of static function disp_score -----------//
//--------- Begin of static function disp_goal ---------//
//
static void disp_goal()
{
//----- if the ending screen has already appeared once -----//
if( game.game_has_ended )
return;
//------------------------------------//
int x=NATION_GOAL_X1+6, y=NATION_GOAL_Y1+6;
int goalCount = 1 + config.goal_destroy_monster +
config.goal_population_flag +
config.goal_economic_score_flag +
config.goal_total_score_flag;
vga.d3_panel_down( NATION_GOAL_X1, NATION_GOAL_Y1, NATION_GOAL_X2, NATION_GOAL_Y2 );
//------------------------------------//
String str;
if( goalCount > 1 )
str = "GOAL: Achieve One of the Following";
else
str = "GOAL: Defeat All Other Kingdoms";
if( config.goal_year_limit_flag )
str += " Before ";
str = translate.process(str);
if( config.goal_year_limit_flag )
str += date.date_str( info.goal_deadline );
//--------------------------------------//
str += ".";
font_san.put( x, y, str );
y+=18;
if( goalCount==1 )
return;
//-----------------------------------//
str = "Defeat All Other Kingdoms.";
font_san.put( x, y, str );
y+=16;
//-----------------------------------//
if( config.goal_destroy_monster )
{
str = "Destroy All Fryhtans.";
font_san.put( x, y, str );
y+=16;
}
//-----------------------------------//
if( config.goal_population_flag )
{
#if(defined(SPANISH))
str = "Alcanzar una población de ";
str += config.goal_population;
str += ".";
#elif(defined(FRENCH))
str = "Atteindre une population de ";
str += config.goal_population;
str += ".";
#elif(defined(GERMAN))
str = "Bevölkerungszahl von ";
str += config.goal_population;
str += " erreichen.";
#else
str = "Achieve a Population of ";
str += config.goal_population;
str += ".";
#endif
font_san.put( x, y, str );
y+=16;
}
//-----------------------------------//
if( config.goal_economic_score_flag )
{
#if(defined(SPANISH))
str = "Alcanzar unos Puntos por Economía de ";
str += config.goal_economic_score;
str += ".";
#elif(defined(FRENCH))
str = "Atteindre un score économique de ";
str += config.goal_economic_score;
str += ".";
#elif(defined(GERMAN))
str = "Ökonom.-Punkte von ";
str += config.goal_economic_score;
str += " erreichen.";
#else
str = "Achieve an Economic Score of ";
str += config.goal_economic_score;
str += ".";
#endif
font_san.put( x, y, str );
y+=16;
}
//-----------------------------------//
if( config.goal_total_score_flag )
{
#if(defined(SPANISH))
str = "Alcanzar unos Puntos Totales de ";
str += config.goal_total_score;
str += ".";
#elif(defined(FRENCH))
str = "Atteindre un score global de ";
str += config.goal_total_score;
str += ".";
#elif(defined(GERMAN))
str = "Gesamtpunkte von ";
str += config.goal_total_score;
str += " erreichen.";
#else
str = "Achieve a Total Score of ";
str += config.goal_total_score;
str += ".";
#endif
font_san.put( x, y, str );
y+=16;
}
}
//----------- End of static function disp_goal -----------//
//--------- Begin of static function disp_play_time ---------//
//
static void disp_play_time(int y1)
{
vga.d3_panel_down( PLAY_TIME_X1, y1, PLAY_TIME_X2, y1+24 );
String str;
str = "Total Playing Time";
str = translate.process(str);
str += ": ";
str += info.play_time_str();
font_san.put( PLAY_TIME_X1+6, y1+6, str );
}
//----------- End of static function disp_play_time -----------//
//--------- Begin of function Info::detect_rank ---------//
//
void Info::detect_rank()
{
//------- detect nation browser ------//
if( browse_nation.detect() )
{
browse_nation_recno = browse_nation.recno();
return;
}
}
//----------- End of function Info::detect_rank -----------//
//-------- Begin of static function nation_filter --------//
//
// This function has dual purpose :
//
// 1. when recNo is not given :
// - return the total no. of nations of this nation
//
// 2. when recNo is given :
// - return the nation recno in nation_array of the given recno.
//
static int nation_filter(int recNo)
{
int i, nationCount=0;
Nation* viewingNation = NULL;
if( nation_array.player_recno )
viewingNation = nation_array[info.viewing_nation_recno];
for( i=1 ; i<=nation_array.size() ; i++ )
{
if( nation_array.is_deleted(i) )
continue;
if( i==info.viewing_nation_recno ||
!viewingNation ||
viewingNation->get_relation(i)->has_contact )
{
nationCount++;
}
if( recNo && nationCount==recNo )
return i;
}
err_when( recNo ); // the recNo is not found, it is out of range
return nationCount;
}
//----------- End of static function nation_filter -----------//
//-------- Begin of static function put_nation_rec --------//
//
static void put_nation_rec(int recNo, int x, int y, int refreshFlag)
{
int nationRecno = nation_filter(recNo);
Nation* nationPtr = nation_array[nationRecno];
x+=3;
y+=5;
nationPtr->disp_nation_color(x, y+4);
font_san.put( x+20, y, nationPtr->nation_name() );
font_san.put( x+210, y, info.get_rank_pos_str(1, nationRecno) );
font_san.put( x+270, y, info.get_rank_pos_str(2, nationRecno) );
font_san.put( x+352, y, info.get_rank_pos_str(3, nationRecno) );
font_san.put( x+435, y, info.get_rank_pos_str(4, nationRecno) );
font_san.put( x+500, y, info.get_rank_pos_str(5, nationRecno) );
}
//----------- End of static function put_nation_rec -----------//
//-------- Begin of function Info::set_rank_data --------//
//
// onlyHasContact - if this is 1, then only nations
// that have contact with the viewing
// nation is counted. Otherwise all nations
// are counted.
//
void Info::set_rank_data(int onlyHasContact)
{
Nation* viewingNation = NULL;
Nation* nationPtr;
int rankPos=0;
if( nation_array.player_recno && !nation_array.is_deleted(info.viewing_nation_recno) )
viewingNation = nation_array[info.viewing_nation_recno];
memset( nation_rank_data_array, 0, sizeof(nation_rank_data_array) );
for( int i=1 ; i<=nation_array.size() ; i++ )
{
if( nation_array.is_deleted(i) )
continue;
if( onlyHasContact )
{
if( viewingNation && !viewingNation->get_relation(i)->has_contact )
continue;
}
nationPtr = nation_array[i];
nation_rank_data_array[0][i-1] = nationPtr->population_rating;
nation_rank_data_array[1][i-1] = nationPtr->military_rating;
nation_rank_data_array[2][i-1] = nationPtr->economic_rating;
nation_rank_data_array[3][i-1] = (int) nationPtr->reputation;
nation_rank_data_array[4][i-1] = (int) nationPtr->kill_monster_score;
}
}
//----------- End of static function Info::set_rank_data -----------//
//-------- Begin of function Info::get_rank_pos_str --------//
//
char* Info::get_rank_pos_str(int rankType, int nationRecno)
{
Nation* viewingNation = NULL;
int curNationRankData = nation_rank_data_array[rankType-1][nationRecno-1];
int rankPos=1;
if( nation_array.player_recno && !nation_array.is_deleted(info.viewing_nation_recno) )
viewingNation = nation_array[info.viewing_nation_recno];
for( int i=1 ; i<=nation_array.size() ; i++ )
{
if( nation_array.is_deleted(i) || i == nationRecno )
continue;
if( viewingNation && !viewingNation->get_relation(i)->has_contact )
continue;
if( nation_rank_data_array[rankType-1][i-1] > curNationRankData ) // if another nation's value is higher than the given nation's value
rankPos++;
}
return m.num_th(rankPos);
}
//----------- End of function Info::get_rank_pos_str -----------//
//-------- Begin of function Info::get_rank_score --------//
//
// Get the score of the given nation in the given ranking type.
//
int Info::get_rank_score(int rankType, int nationRecno)
{
int maxValue;
switch( rankType )
{
case 1: // population
maxValue = 100;
break;
case 2: // military strength
maxValue = 200;
break;
case 3: // economic strength
maxValue = 6000;
break;
case 4: // reputation
maxValue = 100; // so the maximum score of the reputation portion is 50 only
break;
case 5: // monsters slain score
maxValue = 1000;
break;
}
int rankScore = 100 * nation_rank_data_array[rankType-1][nationRecno-1] / maxValue;
return max(0, rankScore);
}
//----------- End of function Info::get_rank_score -----------//
//-------- Begin of function Info::get_total_score --------//
//
// Get the score of the given nation.
//
int Info::get_total_score(int nationRecno)
{
int totalScore=0;
for( int i=0 ; i