/*
* 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_NAT.CPP
//Description : Nation Report
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------- Define coordinations -----------//
enum { REPORT_BROWSE_X1 = ZOOM_X1+6,
REPORT_BROWSE_Y1 = ZOOM_Y1+6,
REPORT_BROWSE_X2 = ZOOM_X2-6,
REPORT_BROWSE_Y2 = REPORT_BROWSE_Y1+206,
REPORT_BUTTON_X1 = ZOOM_X1+8,
REPORT_BUTTON_Y1 = REPORT_BROWSE_Y2+6,
REPORT_BUTTON_WIDTH = 135,
REPORT_BUTTON_Y2 = REPORT_BUTTON_Y1+20,
REPORT_BUTTON_X_SPACE = 130,
REPORT_DET_X1 = ZOOM_X1+6,
REPORT_DET_Y1 = REPORT_BUTTON_Y2+4,
REPORT_DET_X2 = ZOOM_X2-6,
REPORT_DET_Y2 = ZOOM_Y2-6,
REPORT_TALK_Y2 = ZOOM_Y2-86, // use a shorter height for the diplomacy menu as it needs to let the player looks at the messages received.
};
//---------- Define report mode strings ---------//
static char* report_mode_str_array[MAX_NATION_REPORT_MODE] =
{
"Information",
"Diplomacy",
"Chat",
"Diplomatic Log",
"Debug",
};
//---------- Define chat receiver str strings ---------//
static char* chat_receiver_str_array[MAX_CHAT_RECEIVER_TYPE] =
{
"Send to the selected kingdom",
"Send to all allied human controlled kingdoms",
"Send to all human controlled kingdoms",
};
//----------- Define static variables ----------//
static VBrowseIF browse_nation, browse_talk_msg;
static ButtonGroup button_allow_attack(2);
static ButtonGroup button_chat_receiver(MAX_CHAT_RECEIVER_TYPE);
static int init_get_chat = 0;
static GetA get_chat;
//----------- Define static functions ----------//
static void put_nation_rec(int recNo, int x, int y, int refreshFlag);
static void put_talk_msg_rec(int recNo, int x, int y, int refreshFlag);
static int nation_filter(int recNo=0);
static void disp_button();
static int detect_button();
static void disp_detail(int refreshFlag);
static void detect_detail();
static void disp_nation_info();
static void detect_nation_info();
static void disp_debug_info();
static void disp_nation_talk();
static void detect_nation_talk();
static void disp_nation_chat(int refreshFlag);
static void detect_nation_chat();
static void disp_talk_msg_sent(int refreshFlag);
static int sort_talk_msg( const void *a, const void *b );
//--------- Begin of function Info::disp_nation ---------//
//
// refreshFlag - INFO_REPAINT - the user has just switched
// to this report.
// INFO_UPDATE - the report is already in this mode,
// just keep displaying and updating.
//
void Info::disp_nation(int refreshFlag)
{
//--------- Create nation income and expenses browsers -------//
int x=REPORT_BROWSE_X1+9, y=REPORT_BROWSE_Y1+4;
vga_back.d3_panel_up(REPORT_BROWSE_X1, REPORT_BROWSE_Y1, REPORT_BROWSE_X2, REPORT_BROWSE_Y1+33 );
font_san.put( x , y+7, "Kingdom" );
font_san.put( x+185, y+7, "Reputation" );
font_san.put( x+275, y+7, "Status" );
#if(defined(SPANISH))
font_san.put( x+335, y , "Allow" );
font_san.put( x+335, y+13, "Attack" );
font_san.put( x+395, y, "Acuerdo" );
font_san.put( x+395, y+13, "Comerc." );
font_san.put( x+468, y , "Cantidad" );
font_san.put( x+468, y+13, "Comerciada" );
#elif(defined(FRENCH))
font_san.put( x+335, y , "Allow" );
font_san.put( x+335, y+13, "Attack" );
font_san.put( x+395, y, "Accord" );
font_san.put( x+395, y+13, "Commercial" );
font_san.put( x+473, y , "Montant" );
font_san.put( x+473, y+13, "Commercial" );
#elif(defined(GERMAN))
font_san.put( x+345, y , "Allow" );
font_san.put( x+343, y+13, "Attack" );
font_san.put( x+405, y , "Handels-" );
font_san.put( x+405, y+13, "Vertrag" );
font_san.put( x+465, y , "Handels-" );
font_san.put( x+465, y+13, "Betrag" );
#else
font_san.put( x+345, y , "Allow" );
font_san.put( x+343, y+13, "Attack" );
font_san.put( x+405, y , "Trade" );
font_san.put( x+405, y+13, "Treaty" );
font_san.put( x+465, y , "Trade" );
font_san.put( x+465, y+13, "Amount" );
#endif
if( refreshFlag == INFO_REPAINT )
{
browse_nation.init( REPORT_BROWSE_X1, REPORT_BROWSE_Y1+35, REPORT_BROWSE_X2, REPORT_BROWSE_Y2,
0, 20, nation_filter(), put_nation_rec, 1 );
browse_nation.open(browse_nation_recno);
}
else
{
browse_nation.paint();
browse_nation.open(browse_nation_recno, nation_filter());
}
browse_nation_recno = browse_nation.recno();
//------- disp report buttons --------//
disp_button();
//--------- display detail info --------//
if( refreshFlag==INFO_REPAINT )
{
info.last_talk_nation_recno = 0;
browse_talk_msg_recno = 1;
}
disp_detail(refreshFlag);
}
//----------- End of function Info::disp_nation -----------//
//--------- Begin of function Info::detect_nation ---------//
//
void Info::detect_nation()
{
//------- detect nation browser ------//
if( browse_nation.detect() )
{
browse_nation_recno = browse_nation.recno();
return;
}
//------- detect report buttons --------//
if( detect_button() )
return;
//--------- detect detail info -------//
detect_detail();
}
//----------- End of function Info::detect_nation -----------//
//--------- Begin of function Info::init_player_reply ---------//
//
// This function is called by TalkRes::player_reply() when the
// player is going to reply to a diplomatic message from another
// nation.
//
// talkToNationRecno - recno of the nation the player is
// going to talk to.
//
void Info::init_player_reply(int talkToNationRecno)
{
nation_report_mode = NATION_REPORT_TALK;
info.player_reply_mode = 1;
//--- go to the nation in the browser which the player is going to talk to ---//
int nationCount = nation_filter();
int i;
for( i=1 ; i<=nationCount ; i++ )
{
if( nation_filter(i) == talkToNationRecno )
{
browse_nation_recno = i;
break;
}
}
err_when( i>nationCount );
//----- if currently it's in nation report mode -----//
if( sys.view_mode == MODE_NATION )
browse_nation.refresh(browse_nation_recno);
}
//----------- End of function Info::init_player_reply -----------//
//-------- 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 = 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->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];
Nation* viewingNation = nation_array[info.viewing_nation_recno];
NationRelation* nationRelation = viewingNation->get_relation(nationRecno);
x+=3;
y+=5;
nationPtr->disp_nation_color(x, y+1);
font_san.put( x+20 , y, nationPtr->nation_name(), 0, x+215 );
font_san.put( x+220, y, m.format((int) nationPtr->reputation) );
//------- display relation parameters --------//
if( nationRecno != info.viewing_nation_recno )
{
font_san.put( x+272, y, nationRelation->status_str() );
font_san.put( x+355, y, nationRelation->should_attack ? (char*)"Yes" : (char*)"No" );
font_san.put( x+412, y, nationRelation->trade_treaty ? (char*)"Yes" : (char*)"No" );
font_san.put( x+465, y, m.format( (int) viewingNation->total_year_trade(nationRecno),2) );
if( config.show_ai_info )
{
font_san.put( x+510, y, m.format(nationPtr->get_relation(info.viewing_nation_recno)->ai_relation_level) );
font_san.put( x+180, y, m.format( (int) nationPtr->get_relation(info.viewing_nation_recno)->good_relation_duration_rating) );
}
}
}
//----------- End of static function put_nation_rec -----------//
//--------- Begin of static function disp_button ---------//
//
static void disp_button()
{
int x=REPORT_BUTTON_X1;
for( int i=1 ; i<=MAX_NATION_REPORT_MODE ; i++ )
{
if( i==NATION_REPORT_DEBUG )
{
if( remote.is_enable() ||
( !sys.debug_session && !sys.testing_session ) )
{
continue;
}
}
else if( !sys.debug_session && i==NATION_REPORT_CHAT )
{
if( !remote.is_enable() )
continue;
}
//-----------------------------------------//
if( info.nation_report_mode == i )
vga.d3_panel_down( x, REPORT_BUTTON_Y1, x+REPORT_BUTTON_WIDTH-1, REPORT_BUTTON_Y2 );
else
vga.d3_panel_up( x, REPORT_BUTTON_Y1, x+REPORT_BUTTON_WIDTH-1, REPORT_BUTTON_Y2 );
font_san.center_put( x, REPORT_BUTTON_Y1, x+REPORT_BUTTON_WIDTH-1, REPORT_BUTTON_Y2, report_mode_str_array[i-1] );
x+=REPORT_BUTTON_WIDTH;
}
}
//----------- End of static function disp_button -----------//
//--------- Begin of static function detect_button ---------//
//
static int detect_button()
{
int x=REPORT_BUTTON_X1;
for( int i=1 ; i<=MAX_NATION_REPORT_MODE ; i++ )
{
if( i==NATION_REPORT_DEBUG )
{
if( remote.is_enable() ||
( !sys.debug_session && !sys.testing_session ) )
{
continue;
}
}
else if( !sys.debug_session && i==NATION_REPORT_CHAT )
{
if( !remote.is_enable() )
continue;
}
//-----------------------------------------//
if( mouse.single_click( x, REPORT_BUTTON_Y1, x+REPORT_BUTTON_WIDTH-1, REPORT_BUTTON_Y2 ) )
{
info.nation_report_mode = i;
return 1;
}
x+=REPORT_BUTTON_WIDTH;
}
return 0;
}
//----------- End of static function detect_button -----------//
//--------- Begin of static function disp_detail ---------//
//
static void disp_detail(int refreshFlag)
{
if( browse_nation.recno()==0 ) // no records in the list
return;
switch( info.nation_report_mode )
{
case NATION_REPORT_INFO:
disp_nation_info();
break;
case NATION_REPORT_TALK:
disp_nation_talk();
break;
case NATION_REPORT_CHAT:
disp_nation_chat(refreshFlag);
break;
case NATION_REPORT_TALK_LOG:
disp_talk_msg_sent(refreshFlag);
break;
case NATION_REPORT_DEBUG:
disp_debug_info();
break;
}
}
//----------- End of static function disp_detail -----------//
//--------- Begin of static function detect_detail ---------//
//
static void detect_detail()
{
switch( info.nation_report_mode )
{
case NATION_REPORT_INFO:
detect_nation_info();
break;
case NATION_REPORT_TALK:
detect_nation_talk();
break;
case NATION_REPORT_CHAT:
detect_nation_chat();
break;
case NATION_REPORT_TALK_LOG:
if( browse_talk_msg.detect() )
info.browse_talk_msg_recno = browse_talk_msg.recno();
break;
}
}
//----------- End of static function detect_detail -----------//
//--------- Begin of static function disp_nation_info ---------//
//
static void disp_nation_info()
{
vga.d3_panel_down( REPORT_DET_X1, REPORT_DET_Y1, REPORT_DET_X2, REPORT_DET_Y2 );
//----------- display info ------------//
int nationRecno = nation_filter(browse_nation.recno());
Nation* nationPtr = nation_array[nationRecno];
Nation* viewingNation = nation_array[info.viewing_nation_recno];
NationRelation* nationRelation = viewingNation->get_relation(nationRecno);
int x1=REPORT_DET_X1+6, x2=REPORT_DET_X1+340, x3=REPORT_DET_X2-10;
int y=REPORT_DET_Y1+6;
//-------- display economic data ----------//
String str;
if( nationRecno == info.viewing_nation_recno )
{
font_san.put_field( x1, y, "Your Food", x2, nationPtr->food_str() );
str = "$";
str += nationPtr->cash_str();
font_san.put_field( x1, y+=16, "Your Treasure", x2, str );
font_san.field( x1, y+=16, "Your Continuous Peace Time", x2, nationPtr->peace_duration_str(), x3, INFO_REPAINT, "PEACE" );
}
else
{
str = translate.process("Your Yearly Import from ");
str += nationPtr->nation_name();
font_san.field( x1, y , str, x2, (int) viewingNation->get_relation(nationRecno)->import_365days(IMPORT_TOTAL), 2, x3, INFO_REPAINT, "IMPORT" );
str = translate.process("Your Yearly Export to ");
str += nationPtr->nation_name();
font_san.field( x1, y+=16, str, x2, (int) nationPtr->get_relation(info.viewing_nation_recno)->import_365days(IMPORT_TOTAL), 2, x3, INFO_REPAINT, "EXPORT" );
str = translate.process("Continuous Peace Time of ");
str += nationPtr->nation_name();
font_san.field( x1, y+=16, str, x2, nationPtr->peace_duration_str(), x3, INFO_REPAINT, "PEACE" );
//--------- duration of current status ----------//
#if(defined(SPANISH))
str = "Duración del estado de ";
str += translate.process(nationRelation->status_str());
#elif(defined(FRENCH))
str = "Duration of ";
str += nationRelation->status_str();
str += " Status";
str = translate.process(str);
#else
// GERMAN and US
str = translate.process("Duration of ");
str += translate.process(nationRelation->status_str());
str += " Status";
#endif
font_san.field( x1, y+=16, str, x2, nationRelation->status_duration_str(), x3, INFO_REPAINT, "STATTIME" );
//------- display the allow_attack field --------//
#if(defined(SPANISH))
// str = "Permitir que tus Unidades ataquen al ";
str = "Permitir atacar al ";
str += nationPtr->nation_name();
#elif(defined(FRENCH))
str = "Autoriser attaque contre le ";
str += nationPtr->nation_name();
#elif(defined(GERMAN))
str = "Angriffe auf ";
str += nationPtr->nation_name();
str += " erlauben";
#else
str = "Allow Your Units to Attack ";
str += nationPtr->nation_name();
#endif
font_san.field( x1, y+=16, str, x2, "", x3, INFO_REPAINT, "ALLOWATK" );
button_allow_attack[1].create_text( x2+6 , y, x2+50 , y+15, "Yes" );
button_allow_attack[0].create_text( x2+54, y, x2+100, y+15, "No" );
button_allow_attack.paint( viewingNation->get_relation(nationRecno)->should_attack );
//---- if this nation is our ally, display its cash and food ----//
if( viewingNation->get_relation(nationRecno)->status == NATION_ALLIANCE )
{
#if(defined(SPANISH))
str = "Tesoro del ";
str += nationPtr->nation_name();
#elif(defined(FRENCH))
str = "Trésor du ";
str += nationPtr->nation_name();
#else
// GERMAN and US
str = nationPtr->nation_name();
str += " 's Treasure";
#endif
font_san.field( x1, y+=16, str, x2, nationPtr->cash, 2, x3, INFO_REPAINT );
#if(defined(SPANISH))
str = "Alimentos del ";
str += nationPtr->nation_name();
#elif(defined(FRENCH))
str = "Réserves de nourriture du ";
str += nationPtr->nation_name();
#else
// GERMAN and US
str = nationPtr->nation_name();
str += " 's Food";
#endif
font_san.field( x1, y+=16, str, x2, nationPtr->food, 2, x3, INFO_REPAINT );
}
}
y+=26;
//----- display its relation status with other nations -----//
if( info.viewing_nation_recno != nationRecno )
{
String str;
#if(defined(SPANISH))
str = "Estado Diplomático del ";
str += nationPtr->nation_name();
str += " con otros Reinos:";
#elif(defined(FRENCH))
str = "Relations diplomatiques de ";
str += nationPtr->nation_name();
str += " avec les autres royaumes:";
#else
// GERMAN and US
str = nationPtr->nation_name();
str += "'s ";
str += translate.process( "Diplomatic Status with Other Kingdoms:" );
#endif
nationPtr->disp_nation_color(x1, y+1);
font_san.put(x1+20, y, str);
y+=20;
for( int i=1 ; i<=nation_array.size() ; i++ )
{
if( nation_array.is_deleted(i) ||
i == nationRecno ||
i == info.viewing_nation_recno )
{
continue;
}
nation_array[i]->disp_nation_color(x1, y+1);
font_san.put( x1+20, y, nation_array[i]->nation_name() );
font_san.put( x1+240, y, nationPtr->get_relation(i)->status_str() );
if( nationPtr->get_relation(i)->trade_treaty )
{
font_san.put( x1+330, y, "Trade Treaty" );
#if(defined(FRENCH))
font_san.put( x1+460, y, m.format((int)nationPtr->total_year_trade(i),2) );
#else
// German and US
font_san.put( x1+450, y, m.format((int)nationPtr->total_year_trade(i),2) );
#endif
}
if( config.show_ai_info )
{
font_san.put( x1+500, y, nationPtr->get_relation(i)->ai_relation_level );
font_san.put( x1+530, y, (int) nationPtr->get_relation(i)->good_relation_duration_rating );
}
y+=16;
}
}
}
//----------- End of static function disp_nation_info -----------//
//--------- Begin of static function detect_nation_info ---------//
//
static void detect_nation_info()
{
int nationRecno = nation_filter(browse_nation.recno());
Nation* viewingNation = nation_array[info.viewing_nation_recno];
if( button_allow_attack.detect() >= 0 )
viewingNation->set_relation_should_attack(nationRecno, button_allow_attack.button_pressed, COMMAND_PLAYER);
}
//----------- End of static function detect_nation_info -----------//
//--------- Begin of static function disp_debug_info ---------//
//
static void disp_debug_info()
{
vga.d3_panel_down( REPORT_DET_X1, REPORT_DET_Y1, REPORT_DET_X2, REPORT_DET_Y2 );
//----------- display info ------------//
int nationRecno = nation_filter(browse_nation.recno());
Nation* nationPtr = nation_array[nationRecno];
int x1=REPORT_DET_X1+6, x2=REPORT_DET_X1+160;
int y=REPORT_DET_Y1+6;
int refreshFlag = INFO_REPAINT;
//------------ display AI info ----------//
font_san.put_field( x1, y , "Food ", x2, nationPtr->food_str() );
font_san.put_field( x1, y+=16, "Treasure", x2, nationPtr->cash_str() );
font_san.put_field( x1, y+=16, "ai_capture_enemy_town_recno", x2, nationPtr->ai_capture_enemy_town_recno, 1 );
font_san.put_field( x1, y+=16, "Surplus supply rating", x2, nationPtr->surplus_supply_rating() );
y+=48;
//--------- display AI preference ----------//
x2 += 60;
font_san.put_field( x1, y+=16, "Unit Chase Distance" , x2, nationPtr->pref_unit_chase_distance , 1 );
font_san.put_field( x1, y+=16, "Military Development" , x2, nationPtr->pref_military_development , 1 );
font_san.put_field( x1, y+=16, "Economic Development" , x2, nationPtr->pref_economic_development , 1 );
font_san.put_field( x1, y+=16, "Increase Pop by Capture" , x2, nationPtr->pref_inc_pop_by_capture , 1 );
font_san.put_field( x1, y+=16, "Increase Pop by Growth" , x2, nationPtr->pref_inc_pop_by_growth , 1 );
font_san.put_field( x1, y+=16, "Peacefulness" , x2, nationPtr->pref_peacefulness , 1 );
font_san.put_field( x1, y+=16, "Military Courage" , x2, nationPtr->pref_military_courage , 1 );
font_san.put_field( x1, y+=16, "Territorial Cohesiveness", x2, nationPtr->pref_territorial_cohesiveness, 1 );
font_san.put_field( x1, y+=16, "Trading Tendency" , x2, nationPtr->pref_trading_tendency , 1 );
x1 += (REPORT_DET_X2-REPORT_DET_X1)/2;
x2 += (REPORT_DET_X2-REPORT_DET_X1)/2;
y=REPORT_DET_Y1+6;
font_san.put_field( x1, y , "Allying Tendency" , x2, nationPtr->pref_allying_tendency , 1 );
font_san.put_field( x1, y+=16, "Honesty" , x2, nationPtr->pref_honesty , 1 );
font_san.put_field( x1, y+=16, "Town Harmony" , x2, nationPtr->pref_town_harmony , 1 );
font_san.put_field( x1, y+=16, "Citizen Loyalty Concern" , x2, nationPtr->pref_loyalty_concern , 1 );
font_san.put_field( x1, y+=16, "Forgiveness" , x2, nationPtr->pref_forgiveness , 1 );
font_san.put_field( x1, y+=16, "Collect Tax Tendency" , x2, nationPtr->pref_collect_tax , 1 );
font_san.put_field( x1, y+=16, "Build Inn Tendency" , x2, nationPtr->pref_hire_unit , 1 );
font_san.put_field( x1, y+=16, "Use Weapon Tendency" , x2, nationPtr->pref_use_weapon , 1 );
font_san.put_field( x1, y+=16, "Keep Generals Tendency" , x2, nationPtr->pref_keep_general , 1 );
font_san.put_field( x1, y+=16, "Keep Skilled Units Tendency", x2, nationPtr->pref_keep_skilled_unit , 1 );
font_san.put_field( x1, y+=16, "Attack Monster" , x2, nationPtr->pref_attack_monster , 1 );
font_san.put_field( x1, y+=16, "Use Spies" , x2, nationPtr->pref_spy , 1 );
font_san.put_field( x1, y+=16, "Use Counter Spies" , x2, nationPtr->pref_counter_spy , 1 );
font_san.put_field( x1, y+=16, "Food Reserve" , x2, nationPtr->pref_food_reserve , 1 );
font_san.put_field( x1, y+=16, "Cash Reserve" , x2, nationPtr->pref_cash_reserve , 1 );
font_san.put_field( x1, y+=16, "Use Marine" , x2, nationPtr->pref_use_marine , 1 );
}
//----------- End of static function disp_debug_info -----------//
//--------- Begin of static function disp_nation_talk ---------//
//
static void disp_nation_talk()
{
int nationRecno = nation_filter(info.browse_nation_recno);
//----- if the selected nation is the viewing nation ----//
if( nationRecno != info.viewing_nation_recno &&
info.viewing_nation_recno == nation_array.player_recno )
{
vga.d3_panel_down( REPORT_DET_X1, REPORT_DET_Y1, REPORT_DET_X2, REPORT_TALK_Y2 );
if( info.last_talk_nation_recno != nationRecno && !info.player_reply_mode )
talk_res.init_conversion(nationRecno);
info.player_reply_mode = 0;
info.last_talk_nation_recno = nationRecno;
talk_res.disp_talk();
}
}
//----------- End of static function disp_nation_talk -----------//
//--------- Begin of static function detect_nation_talk ---------//
//
static void detect_nation_talk()
{
int nationRecno = nation_filter(info.browse_nation_recno);
//----- if the selected nation is the viewing nation ----//
if( nationRecno != info.viewing_nation_recno &&
info.viewing_nation_recno == nation_array.player_recno )
{
talk_res.detect_talk();
}
}
//----------- End of static function detect_nation_talk -----------//
//--------- Begin of static function disp_talk_msg_sent ---------//
//
static void disp_talk_msg_sent(int refreshFlag)
{
//--- filter out talk messages sent by this nation and sort them by date ---//
TalkMsg* talkMsg;
TalkMsgDisp talkMsgDisp;
static short lastNationRecno=0;
int nationRecno = nation_filter(info.browse_nation_recno);
if( lastNationRecno != nationRecno )
{
info.browse_talk_msg_recno = 1; // reset the browser recno of the viewing nation has been changed
lastNationRecno = nationRecno;
}
//--------------------------------------------//
info.talk_msg_disp_array.zap();
for( short i=1 ; i<=talk_res.talk_msg_count() ; i++ )
{
if( talk_res.is_talk_msg_deleted(i) )
continue;
talkMsg = talk_res.get_talk_msg(i);
if( !talkMsg->is_valid_to_disp() ) // don't link it out, otherwise it may cause multiplayer sync problem.
continue;
if( talkMsg->from_nation_recno == nationRecno ||
talkMsg->to_nation_recno == nationRecno )
{
if( talkMsg->from_nation_recno == info.viewing_nation_recno ||
talkMsg->to_nation_recno == info.viewing_nation_recno )
{
if( !nation_array.is_deleted(talkMsg->from_nation_recno) &&
!nation_array.is_deleted(talkMsg->to_nation_recno) )
{
talkMsgDisp.recno = i;
talkMsgDisp.date = talkMsg->date;
talkMsgDisp.is_reply = 0;
info.talk_msg_disp_array.linkin(&talkMsgDisp);
if( talkMsg->reply_date )
{
talkMsgDisp.recno = i;
talkMsgDisp.date = talkMsg->reply_date;
talkMsgDisp.is_reply = 1;
info.talk_msg_disp_array.linkin(&talkMsgDisp);
}
}
}
}
}
if( info.talk_msg_disp_array.size() > 0 )
info.talk_msg_disp_array.quick_sort(sort_talk_msg);
//----- display a browser of the talk msg sent -----//
if( refreshFlag == INFO_REPAINT || !browse_talk_msg.init_flag )
{
browse_talk_msg.init( REPORT_DET_X1, REPORT_DET_Y1, REPORT_DET_X2, REPORT_DET_Y2,
0, 30, info.talk_msg_disp_array.size(), put_talk_msg_rec, 1 );
browse_talk_msg.open(info.browse_talk_msg_recno);
}
else
{
browse_talk_msg.paint();
browse_talk_msg.open(info.browse_talk_msg_recno, info.talk_msg_disp_array.size());
}
info.browse_talk_msg_recno = browse_talk_msg.recno();
}
//----------- End of static function disp_talk_msg_sent -----------//
//------ Begin of function sort_talk_msg ------//
//
static int sort_talk_msg( const void *a, const void *b )
{
if( ((TalkMsgDisp*)b)->recno == ((TalkMsgDisp*)a)->recno )
return ((TalkMsgDisp*)b)->is_reply ? 1 : -1;
return ((TalkMsgDisp*)b)->date - ((TalkMsgDisp*)a)->date;
}
//------- End of function sort_talk_msg ------//
//-------- Begin of static function put_talk_msg_rec --------//
//
static void put_talk_msg_rec(int recNo, int x1, int y, int refreshFlag)
{
TalkMsgDisp* talkMsgDisp = (TalkMsgDisp*) info.talk_msg_disp_array.get(recNo);
TalkMsg* talkMsg = talk_res.get_talk_msg(talkMsgDisp->recno);
int x=x1, isTo;
x+=3;
y+=2;
if( !talkMsgDisp->is_reply ) // if not a replying message
isTo = talkMsg->from_nation_recno == info.viewing_nation_recno; // you send a message to a nation
else
isTo = talkMsg->from_nation_recno != info.viewing_nation_recno;
//---------------------------------------//
char* str1;
if( isTo )
str1 = translate.process("To");
else
str1 = translate.process("From");
font_san.put( x , y, str1 );
x += font_san.text_width(str1)+5;
//---------------------------------------//
if( talkMsg->from_nation_recno == info.viewing_nation_recno )
nation_array[talkMsg->to_nation_recno]->disp_nation_color(x, y+2);
else
nation_array[talkMsg->from_nation_recno]->disp_nation_color(x, y+2);
x+=18;
String str;
str = translate.process("on ");
if( talkMsgDisp->is_reply )
str += date.date_str(talkMsg->reply_date);
else
str += date.date_str(talkMsg->date);
str += " :";
font_san.put( x , y, str );
font_san.put( x1, y+13, talkMsg->msg_str(info.viewing_nation_recno, talkMsgDisp->is_reply), 0, browse_talk_msg.ix2 );
}
//----------- End of static function put_talk_msg_rec -----------//
//--------- Begin of static function disp_nation_chat ---------//
//
static void disp_nation_chat(int refreshFlag)
{
int nationRecno = nation_filter(info.browse_nation_recno);
//----- if the selected nation is the viewing nation ----//
if( !(sys.debug_session || nation_array[nationRecno]->nation_type == NATION_REMOTE &&
info.viewing_nation_recno == nation_array.player_recno ) )
{
return;
}
//-------- display the chat get control -------//
vga.d3_panel_down( REPORT_DET_X1, REPORT_DET_Y1, REPORT_DET_X2, REPORT_TALK_Y2 );
font_san.put( REPORT_DET_X1+10, REPORT_DET_Y1+10,
"Please enter your chat message and press to send." );
// ###### begin Gilbert 15/10 #######//
if( !init_get_chat )
{
get_chat.init( REPORT_DET_X1+10, REPORT_DET_Y1+30, REPORT_DET_X2-10,
info.player_chat_str, CHAT_STR_LEN, &font_san, 0, 0 );
get_chat.clear();
init_get_chat = 1;
}
// ###### end Gilbert 15/10 #######//
int vgaUseBack = vga.use_back_buf;
vga.use_back();
get_chat.paint(1); // 1-paint cursor
if( !vgaUseBack )
vga.use_front();
//-------- display receiver type buttons ---------//
int y=REPORT_TALK_Y2-70;
for( int i=1 ; i<=MAX_CHAT_RECEIVER_TYPE ; i++, y+=22 )
{
if( info.chat_receiver_type == i )
vga.d3_panel_down( REPORT_DET_X1+10, y, REPORT_DET_X2-10, y+20 );
else
vga.d3_panel_up( REPORT_DET_X1+10, y, REPORT_DET_X2-10, y+20 );
font_san.center_put( REPORT_DET_X1+10, y, REPORT_DET_X2-10, y+20, chat_receiver_str_array[i-1] );
}
}
//----------- End of static function disp_nation_chat -----------//
//--------- Begin of static function detect_nation_chat ---------//
//
static void detect_nation_chat()
{
int nationRecno = nation_filter(info.browse_nation_recno);
//----- if the selected nation is the viewing nation ----//
if( sys.debug_session || nation_array[nationRecno]->nation_type == NATION_REMOTE &&
info.viewing_nation_recno == nation_array.player_recno )
{
// ###### begin Gilbert 15/10 #######//
if( !init_get_chat )
{
get_chat.init( REPORT_DET_X1+10, REPORT_DET_Y1+30, REPORT_DET_X2-10,
info.player_chat_str, CHAT_STR_LEN, &font_san, 0, 0 );
get_chat.clear();
init_get_chat = 1;
}
// ###### end Gilbert 15/10 #######//
for( int i=0 ; i<5 ; i++ )
{
int keyCode = get_chat.detect();
if( !keyCode )
break;
//---- press to send the chat message ----//
if( keyCode == KEY_RETURN && info.player_chat_str[0] != '\0')
{
if( remote.is_enable() )
{
// packet structure :
short *shortPtr = (short *)remote.new_send_queue_msg(MSG_CHAT, 2*sizeof(short) + strlen(info.player_chat_str)+1 );
switch( info.chat_receiver_type )
{
case 1: // selected
shortPtr[0] = nationRecno;
break;
case 2: // all allies
shortPtr[0] = -1;
break;
case 3: // all human
shortPtr[0] = 0;
break;
}
shortPtr[1] = info.viewing_nation_recno;
strcpy(2*sizeof(short)+(char *)shortPtr, info.player_chat_str);
}
get_chat.clear();
break;
}
mouse.get_event();
}
}
//-------- detect receiver type buttons ---------//
int y=REPORT_TALK_Y2-70;
for( int i=1 ; i<=MAX_CHAT_RECEIVER_TYPE ; i++, y+=22 )
{
if( mouse.single_click( REPORT_DET_X1+10, y, REPORT_DET_X2-50, y+20 ) )
{
info.chat_receiver_type = i;
return;
}
}
}
//----------- End of static function detect_nation_chat -----------//
//------- Begin of function Info::player_reply_chat --------//
//
// withNationRecno - player reply a chat message to this nation.
//
void Info::player_reply_chat(int withNationRecno)
{
nation_report_mode = NATION_REPORT_CHAT;
//--- go to the nation in the browser which the player is going to talk to ---//
int nationCount = nation_filter();
int i;
for( i=1 ; i<=nationCount ; i++ )
{
if( nation_filter(i) == withNationRecno )
{
browse_nation_recno = i;
break;
}
}
err_when( i>nationCount );
sys.set_view_mode(MODE_NATION);
}
//-------- End of function Info::player_reply_chat ---------//