/*
* 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_SPY.CPP
//Description : Spy Report
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------- Define coordinations -----------//
enum { SPY_BROWSE_X1 = ZOOM_X1+6,
SPY_BROWSE_Y1 = ZOOM_Y1+6,
SPY_BROWSE_X2 = ZOOM_X2-6,
SPY_BROWSE_Y2 = ZOOM_Y2-6,
};
//----------- Define static variables ----------//
static VBrowseIF browse_spy;
//----------- Define static functions ----------//
static void put_spy_rec(int recNo, int x, int y, int refreshFlag);
static int spy_filter(int recNo=0);
static void disp_total();
//--------- Begin of function Info::disp_spy ---------//
//
void Info::disp_spy(int refreshFlag)
{
//------- Display the spy report -------//
int x=SPY_BROWSE_X1+9;
int y=SPY_BROWSE_Y1+4;
vga_back.d3_panel_up(SPY_BROWSE_X1, SPY_BROWSE_Y1, SPY_BROWSE_X2, SPY_BROWSE_Y1+20 );
#if(defined(FRENCH))
font_san.put( x , y, "Spy Name" );
font_san.put( x+155, y, "Cloak" );
font_san.put( x+205, y, "Location" );
font_san.put( x+320, y, "Skill" );
font_san.put( x+384, y, "Loyalty" );
font_san.put( x+448, y, "Action" );
#else
// German and US
font_san.put( x , y, "Spy Name" );
font_san.put( x+155, y, "Cloak" );
font_san.put( x+205, y, "Location" );
font_san.put( x+330, y, "Skill" );
font_san.put( x+370, y, "Loyalty" );
font_san.put( x+435, y, "Action" );
#endif
if( refreshFlag == INFO_REPAINT )
{
browse_spy.init( SPY_BROWSE_X1, SPY_BROWSE_Y1+22, SPY_BROWSE_X2, SPY_BROWSE_Y2-20,
0, 21, spy_filter(), put_spy_rec, 1 );
browse_spy.open(browse_spy_recno);
}
else
{
browse_spy.paint();
browse_spy.open(browse_spy_recno, spy_filter());
}
//--------- Display total ------------//
disp_total();
}
//----------- End of function Info::disp_spy -----------//
//--------- Begin of function Info::detect_spy ---------//
//
void Info::detect_spy()
{
//------- detect the spy browser -------//
if( browse_spy.detect() )
{
browse_spy_recno = browse_spy.recno();
if( browse_spy.double_click )
{
Spy* spyPtr = spy_array[ spy_filter(browse_spy_recno) ];
int xLoc, yLoc;
if( spyPtr->get_loc(xLoc, yLoc) )
world.go_loc( xLoc, yLoc, 1 );
}
}
}
//----------- End of function Info::detect_spy -----------//
//-------- Begin of static function disp_total --------//
static void disp_total()
{
int x = SPY_BROWSE_X1+9;
int y = SPY_BROWSE_Y2-16;
vga_back.d3_panel_up(SPY_BROWSE_X1, SPY_BROWSE_Y2-18, SPY_BROWSE_X2, SPY_BROWSE_Y2 );
String str;
if( browse_spy.total_rec() > 1 )
str = "Total Spies";
else
str = "Total Spy";
str = translate.process(str);
str += ": ";
str += browse_spy.total_rec();
font_san.put( x, y, str );
}
//----------- End of static function disp_total -----------//
//-------- Begin of static function spy_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 spy_filter(int recNo)
{
int totalSpy = spy_array.size();
int spyCount=0;
Spy* spyPtr;
for( int spyRecno=1 ; spyRecno<=totalSpy ; spyRecno++ )
{
if( spy_array.is_deleted(spyRecno) )
continue;
spyPtr = spy_array[spyRecno];
if( spyPtr->true_nation_recno==info.viewing_nation_recno )
spyCount++;
if( recNo && spyCount==recNo )
return spyRecno;
}
err_when( recNo ); // the recNo is not found, it is out of range
return spyCount;
}
//----------- End of static function spy_filter -----------//
//-------- Begin of static function put_spy_rec --------//
//
static void put_spy_rec(int recNo, int x, int y, int refreshFlag)
{
int spyRecno = spy_filter(recNo);
Spy* spyPtr = spy_array[spyRecno];
x+=3;
y+=5;
//------ display rank/skill icon -------//
int cloakedRankId = spyPtr->cloaked_rank_id();
int cloakedSkillId = spyPtr->cloaked_skill_id();
String str;
switch( cloakedRankId )
{
case RANK_KING:
str = "U_KING";
break;
case RANK_GENERAL:
str = "U_GENE";
break;
case RANK_SOLDIER:
if( cloakedSkillId )
{
str = "U_";
str += Skill::skill_code_array[cloakedSkillId-1];
}
else
{
str = "";
}
break;
}
if( str.len() > 0 )
image_icon.put_back(x, y+1, str);
//------ display race icon -------------//
vga_back.put_bitmap( x+13, y-4, race_res[spyPtr->race_id]->icon_bitmap_ptr );
//----------- display name -----------//
font_san.put( x+39, y, race_res[spyPtr->race_id]->get_name(spyPtr->name_id), 0, 185 );
//------- display cloaked nation color ------//
int tx = x+170;
if( spyPtr->cloaked_nation_recno==0 ) // independent nation
{
vga_back.bar( tx, y, tx+12, y+12, V_WHITE );
vga_back.rect( tx, y, tx+12, y+12, 1, VGA_GRAY+8 );
}
else
{
nation_array[spyPtr->cloaked_nation_recno]->disp_nation_color(tx, y+2);
}
//---------- display other info ----------//
switch( spyPtr->spy_place )
{
case SPY_FIRM:
str = firm_res[firm_array[spyPtr->spy_place_para]->firm_id]->name;
break;
case SPY_TOWN:
str = town_array[spyPtr->spy_place_para]->town_name();
break;
case SPY_MOBILE:
{
Unit* unitPtr = unit_array[spyPtr->spy_place_para];
switch( unitPtr->unit_mode )
{
case UNIT_MODE_CONSTRUCT:
str = firm_res[firm_array[unitPtr->unit_mode_para]->firm_id]->name;
break;
case UNIT_MODE_ON_SHIP:
str = "On Ship";
break;
default:
str = "Mobile";
}
break;
}
default:
str = "";
}
font_san.put( x+205, y, str );
font_san.put( x+335, y, spyPtr->spy_skill );
font_san.put( x+385, y, spyPtr->spy_loyalty );
font_san.put( x+435, y, spyPtr->action_str() );
}
//----------- End of static function put_spy_rec -----------//