/*
* 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 : OINFOMIL.CPP
//Description : Economy information screen
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------- Define coordinations -----------//
enum { TROOP_BROWSE_X1 = ZOOM_X1+6,
TROOP_BROWSE_Y1 = ZOOM_Y1+6,
TROOP_BROWSE_X2 = ZOOM_X2-6,
TROOP_BROWSE_Y2 = TROOP_BROWSE_Y1+240
};
enum { UNIT_BROWSE_X1 = ZOOM_X1+6,
UNIT_BROWSE_Y1 = TROOP_BROWSE_Y2+6,
UNIT_BROWSE_X2 = ZOOM_X2-6,
UNIT_BROWSE_Y2 = ZOOM_Y2-6,
};
//----------- Define static variables ----------//
static VBrowseIF browse_troop;
static VBrowseIF browse_unit;
//----------- Define static functions ----------//
static void put_troop_rec(int recNo, int x, int y, int refreshFlag);
static void put_unit_rec(int recNo, int x, int y, int refreshFlag);
static int troop_filter(int recNo=0);
static int unit_filter(int recNo=0);
static void disp_troop_total();
static void disp_unit_total();
//--------- Begin of function Info::disp_military ---------//
//
void Info::disp_military(int refreshFlag)
{
//------- Display the Troop report -------//
int x=TROOP_BROWSE_X1+9;
int y=TROOP_BROWSE_Y1+4;
vga_back.d3_panel_up(TROOP_BROWSE_X1, TROOP_BROWSE_Y1, TROOP_BROWSE_X2, TROOP_BROWSE_Y1+33 );
#if(defined(FRENCH))
font_san.put( x , y+7 , "Commander" );
font_san.put( x+170, y+7, "Leadership" );
font_san.put( x+275, y+7, "Loyalty" );
font_san.put( x+350, y, "Points" );
font_san.put( x+350, y+13, "de vie" );
font_san.put( x+410, y+7, "Garnison" );
font_san.put( x+480, y+7, "Status" );
#elif(defined(GERMAN))
font_san.put( x , y+7 , "Commander" );
font_san.put( x+210, y+7 , "Leadership" );
font_san.put( x+275, y+7 , "Loyalty" );
font_san.put( x+342, y+7 , "Hit Points" );
font_san.put( x+406, y , "Commanded" );
font_san.put( x+415, y+13, "Soldiers" );
font_san.put( x+485, y+7 , "Status" );
#else
font_san.put( x , y+7 , "Commander" );
font_san.put( x+200, y+7 , "Leadership" );
font_san.put( x+285, y+7 , "Loyalty" );
font_san.put( x+342, y+7 , "Hit Points" );
font_san.put( x+406, y , "Commanded" );
font_san.put( x+423, y+13, "Soldiers" );
font_san.put( x+490, y+7 , "Status" );
#endif
if( refreshFlag == INFO_REPAINT )
{
browse_troop.init( TROOP_BROWSE_X1, TROOP_BROWSE_Y1+35, TROOP_BROWSE_X2, TROOP_BROWSE_Y2-20,
0, 22, troop_filter(), put_troop_rec, 1 );
browse_troop.open(browse_troop_recno);
}
else
{
browse_troop.paint();
browse_troop.open(browse_troop_recno, troop_filter());
}
disp_troop_total();
//------- Display the unit report -------//
x=UNIT_BROWSE_X1+9;
y=UNIT_BROWSE_Y1+4;
vga_back.d3_panel_up(UNIT_BROWSE_X1, UNIT_BROWSE_Y1, UNIT_BROWSE_X2, UNIT_BROWSE_Y1+20 );
font_san.put( x , y, "Unit Type" );
font_san.put( x+300, y, "No. of Units" );
if( refreshFlag == INFO_REPAINT )
{
browse_unit.init( UNIT_BROWSE_X1, UNIT_BROWSE_Y1+22, UNIT_BROWSE_X2, UNIT_BROWSE_Y2-20,
0, 16, unit_filter(), put_unit_rec, 1 );
browse_unit.open(browse_unit_recno);
}
else
{
browse_unit.paint();
browse_unit.open(browse_unit_recno, unit_filter());
}
disp_unit_total();
}
//----------- End of function Info::disp_military -----------//
//--------- Begin of function Info::detect_military ---------//
//
void Info::detect_military()
{
//------- detect the troop report -------//
if( browse_troop.detect() )
{
browse_troop_recno = browse_troop.recno();
if( browse_troop.double_click )
{
Unit* unitPtr = unit_array[ troop_filter(browse_troop_recno) ];
short xLoc, yLoc;
if( unitPtr->get_cur_loc(xLoc, yLoc) )
{
world.go_loc(xLoc, yLoc, 1);
}
}
}
//------- detect the unit report -------//
if( browse_unit.detect() )
{
browse_unit_recno = browse_unit.recno();
}
}
//----------- End of function Info::detect_military -----------//
//-------- Begin of static function disp_troop_total --------//
static void disp_troop_total()
{
//---- count the total no. of soldiers ----//
Unit* unitPtr;
int totalSoldier=0, totalCommandedSoldier=0;
int i;
for( i=unit_array.size() ; i>0 ; i-- )
{
if( unit_array.is_deleted(i) )
continue;
unitPtr = unit_array[i];
if( unitPtr->nation_recno != info.viewing_nation_recno )
continue;
if( unitPtr->rank_id == RANK_SOLDIER )
totalSoldier++;
else
totalCommandedSoldier += unitPtr->commanded_soldier_count();
}
Nation* viewingNation = nation_array[info.viewing_nation_recno];
for( i=viewingNation->ai_camp_count-1 ; i>=0 ; i-- )
{
totalSoldier += firm_array[ viewingNation->ai_camp_array[i] ]->worker_count;
}
//--------- paint the area ----------//
int x=TROOP_BROWSE_X1+9;
int y=TROOP_BROWSE_Y2-16;
vga_back.d3_panel_up(TROOP_BROWSE_X1, TROOP_BROWSE_Y2-18, TROOP_BROWSE_X2, TROOP_BROWSE_Y2 );
//------ display commander count ------//
String str;
if( browse_troop.total_rec() > 1 )
str = "Total Commanders";
else
str = "Total Commander";
str = translate.process(str);
str += ": ";
str += browse_troop.total_rec();
font_san.put( x, y, str );
//------ display soldiers under command count ------//
if( totalCommandedSoldier > 1 )
str = "Total Soldiers Under Command";
else
str = "Total Soldier Under Command";
str = translate.process(str);
str += ": ";
str += totalCommandedSoldier;
font_san.put( x+160, y, str );
//------ display soldiers count ------//
if( totalSoldier > 1 )
str = "Total Soldiers";
else
str = "Total Soldier";
str = translate.process(str);
str += ": ";
str += totalSoldier;
#if(defined(FRENCH))
font_san.put( x+396, y, str );
#else
font_san.put( x+410, y, str );
#endif
}
//----------- End of static function disp_troop_total -----------//
//-------- Begin of static function disp_unit_total --------//
static void disp_unit_total()
{
int totalUnitCount=0, totalUnitCost=0;
UnitInfo* unitInfo;
for( int unitId=1 ; unitId<=MAX_UNIT_TYPE ; unitId++ )
{
unitInfo = unit_res[unitId];
int unitCount = unitInfo->nation_unit_count_array[info.viewing_nation_recno-1];
int generalCount = unitInfo->nation_general_count_array[info.viewing_nation_recno-1];
totalUnitCount += unitCount;
if( unitInfo->race_id )
{
totalUnitCost += generalCount * GENERAL_YEAR_SALARY;
totalUnitCost += (unitCount-generalCount) * SOLDIER_YEAR_SALARY;
}
else
totalUnitCost += unitCount * unitInfo->year_cost;
}
//--------- paint the area ----------//
int x=UNIT_BROWSE_X1+9;
int y=UNIT_BROWSE_Y2-16;
vga_back.d3_panel_up(UNIT_BROWSE_X1, UNIT_BROWSE_Y2-18, UNIT_BROWSE_X2, UNIT_BROWSE_Y2 );
String str;
str = "Total Units";
str = translate.process(str);
str += ": ";
str += totalUnitCount;
font_san.put( x, y, str );
}
//----------- End of static function disp_unit_total -----------//
//-------- Begin of static function troop_filter --------//
//
// This function has dual purpose :
//
// 1. when recNo is not given :
// - return the total no. of firms of this nation
//
// 2. when recNo is given :
// - return the firm recno in firm_array of the given recno.
//
static int troop_filter(int recNo)
{
int i, unitCount=0, totalUnit=unit_array.size();
Unit* unitPtr;
for( i=1 ; i<=totalUnit ; i++ )
{
if( unit_array.is_deleted(i) )
continue;
unitPtr = unit_array[i];
if( unitPtr->nation_recno == info.viewing_nation_recno &&
(unitPtr->rank_id==RANK_GENERAL || unitPtr->rank_id==RANK_KING) )
{
unitCount++;
}
if( recNo && unitCount==recNo )
return i;
}
err_when( recNo ); // the recNo is not found, it is out of range
return unitCount;
}
//----------- End of static function troop_filter -----------//
//-------- Begin of static function put_troop_rec --------//
//
static void put_troop_rec(int recNo, int x, int y, int refreshFlag)
{
int unitRecno = troop_filter(recNo);
Unit* unitPtr = unit_array[unitRecno];
//---------- display bitmap ----------//
x+=3;
y+=3;
vga_back.put_bitmap( x, y-2, unit_res[unitPtr->unit_id]->get_small_icon_ptr(unitPtr->rank_id) );
//-------- display name & team size -------//
y+=2;
font_san.put( x+28 , y, unitPtr->unit_name(), 0, 238 );
font_san.put( x+240, y, unitPtr->skill.get_skill(SKILL_LEADING) );
if( unitPtr->rank_id != RANK_KING )
font_san.put( x+295, y, unitPtr->loyalty );
//--------- display hit points -----------//
String str;
str = (int) unitPtr->hit_points;
str += "/";
str += unitPtr->max_hit_points;
font_san.put( x+352, y, str );
//---- display the no. of soldiers led by this general ---//
font_san.put( x+445, y, unitPtr->commanded_soldier_count() );
//---- display the status of the general ----//
char* statusStr;
if( unitPtr->unit_mode == UNIT_MODE_OVERSEE )
{
int firmId = firm_array[ unitPtr->unit_mode_para ]->firm_id;
if( firmId == FIRM_CAMP )
statusStr = "In Fort";
else if( firmId == FIRM_BASE )
statusStr = "In Seat";
else
err_here();
}
else if( unitPtr->unit_mode == UNIT_MODE_ON_SHIP )
{
statusStr = "On Ship";
}
else
{
statusStr = "Mobile";
}
#if(defined(FRENCH))
font_san.put( x+470, y, statusStr );
#else
// German and US
font_san.put( x+486, y, statusStr );
#endif
}
//----------- End of static function put_troop_rec -----------//
//-------- Begin of static function unit_filter --------//
//
// This function has dual purpose :
//
// 1. when recNo is not given :
// - return the total no. of firms of this nation
//
// 2. when recNo is given :
// - return the firm recno in firm_array of the given recno.
//
static int unit_filter(int recNo)
{
int unitTypeCount=0;
UnitInfo* unitInfo;
//------- count human units -------//
Nation* nationPtr = nation_array[info.viewing_nation_recno];
unitTypeCount++;
if( recNo && unitTypeCount==recNo )
return -1;
//------- count non-human unit types -------//
for( int unitId=1 ; unitId<=MAX_UNIT_TYPE ; unitId++ )
{
unitInfo = unit_res[unitId];
//---- if this is not a human unit -----//
if( !unitInfo->race_id &&
unitInfo->nation_unit_count_array[info.viewing_nation_recno-1] > 0 )
{
unitTypeCount++;
}
if( recNo && unitTypeCount==recNo )
return unitId;
}
err_when( recNo ); // the recNo is not found, it is out of range
return unitTypeCount;
}
//----------- End of static function unit_filter -----------//
//-------- Begin of static function put_unit_rec --------//
//
static void put_unit_rec(int recNo, int x, int y, int refreshFlag)
{
int unitId = unit_filter(recNo);
int unitCount;
char* str;
UnitInfo* unitInfo;
Nation* nationPtr = nation_array[info.viewing_nation_recno];
int rc = unit_filter(recNo);
switch( rc )
{
//------- count human units -------//
case -1:
str = "Human General";
unitCount = nationPtr->total_general_count;
break;
default:
unitInfo = unit_res[rc];
str = unitInfo->name;
unitCount = unitInfo->nation_unit_count_array[ info.viewing_nation_recno-1 ];
}
//---------- display info --------//
x+=3;
y+=3;
font_san.put( x , y, str );
font_san.put( x+320, y, m.format(unitCount,1) );
}
//----------- End of static function put_unit_rec -----------//