/*
* 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 : OF_RESE.CPP
//Description : Firm Magic Tower
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------- Define constant ------------//
#define MAX_RESEARCH_OPTION 6
#define RESEARCH_OPTION_HEIGHT 48
//---------- Define constant ------------//
enum { RESEARCH_MENU_MAIN,
RESEARCH_MENU_RESEARCH,
};
//----------- Define static vars -------------//
static Button3D button_select_research;
static char research_menu_mode;
static char disable_refresh=0;
static ButtonCustom button_research_array[MAX_RESEARCH_OPTION];
// ######## begin Gilbert 16/8 ######//
static ButtonCustom button_cancel;
// ######## end Gilbert 16/8 ######//
static int added_count; // no. of buttons in button_research_array
//---------- Declare static functions ---------//
static void i_disp_research_button(ButtonCustom *, int);
//--------- Begin of function FirmResearch::FirmResearch ---------//
//
FirmResearch::FirmResearch()
{
firm_skill_id = SKILL_RESEARCH;
}
//----------- End of function FirmResearch::FirmResearch -----------//
//--------- Begin of function FirmResearch::~FirmResearch ---------//
//
FirmResearch::~FirmResearch()
{
terminate_research();
}
//----------- End of function FirmResearch::~FirmResearch -----------//
//--------- Begin of function FirmResearch::init_derived ---------//
//
void FirmResearch::init_derived()
{
tech_id = 0; // the id. of the tech this firm is currently researching
complete_percent = (float) 0; // percent completed on researching the current technology
}
//----------- End of function FirmResearch::init_derived -----------//
//--------- Begin of function FirmResearch::put_info ---------//
//
void FirmResearch::put_info(int refreshFlag)
{
if( refreshFlag==INFO_REPAINT && !disable_refresh )
research_menu_mode = RESEARCH_MENU_MAIN;
switch( research_menu_mode )
{
case RESEARCH_MENU_MAIN:
disp_main_menu(refreshFlag);
break;
case RESEARCH_MENU_RESEARCH:
disp_research_menu(refreshFlag);
break;
}
}
//----------- End of function FirmResearch::put_info -----------//
//--------- Begin of function FirmResearch::detect_info ---------//
//
void FirmResearch::detect_info()
{
switch( research_menu_mode )
{
case RESEARCH_MENU_MAIN:
detect_main_menu();
break;
case RESEARCH_MENU_RESEARCH:
detect_research_menu();
break;
}
}
//----------- End of function FirmResearch::detect_info -----------//
//--------- Begin of function FirmResearch::disp_main_menu ---------//
//
void FirmResearch::disp_main_menu(int refreshFlag)
{
disp_basic_info(INFO_Y1, refreshFlag);
if( !should_show_info() )
return;
disp_research_info(INFO_Y1+54, refreshFlag);
disp_worker_list(INFO_Y1+107, refreshFlag);
disp_worker_info(INFO_Y1+171, refreshFlag);
if( own_firm() )
{
if( refreshFlag==INFO_REPAINT )
button_select_research.paint( INFO_X1, INFO_Y1+235, 'A', "RESEARCH" );
}
disp_spy_button( INFO_X1+BUTTON_ACTION_WIDTH, INFO_Y1+235, refreshFlag );
}
//----------- End of function FirmResearch::disp_main_menu -----------//
//--------- Begin of function FirmResearch::detect_main_menu ---------//
//
void FirmResearch::detect_main_menu()
{
//-------- detect basic info -----------//
if( detect_basic_info() )
return;
//----------- detect worker -----------//
if( detect_worker_list() )
{
disp_research_info(INFO_Y1+54, INFO_UPDATE);
disp_worker_info(INFO_Y1+171, INFO_UPDATE);
}
//-------- detect spy button ----------//
detect_spy_button();
if( !own_firm() )
return;
//------ detect the select research button -------//
if( button_select_research.detect() )
{
research_menu_mode = RESEARCH_MENU_RESEARCH;
disable_refresh = 1; // static var for disp_info() only
info.disp();
disable_refresh = 0;
}
}
//----------- End of function FirmResearch::detect_main_menu -----------//
//--------- Begin of function FirmResearch::disp_research_menu ---------//
//
void FirmResearch::disp_research_menu(int refreshFlag)
{
if( refreshFlag != INFO_REPAINT )
return;
int techId, y=INFO_Y1;
added_count=0;
for( techId=1 ; techId<=tech_res.tech_count ; techId++ )
{
if( !tech_res[techId]->can_research(nation_recno) )
continue;
if( added_count < MAX_RESEARCH_OPTION )
{
button_research_array[added_count].paint(INFO_X1, y, INFO_X2, y+RESEARCH_OPTION_HEIGHT-2,
i_disp_research_button, ButtonCustomPara(this, techId) );
added_count++;
y += RESEARCH_OPTION_HEIGHT;
}
}
// ###### begin Gilbert 16/8 ######//
// button_cancel.paint(INFO_X1, y, "CANCEL1", "CANCEL1D" );
button_cancel.paint(INFO_X1, y, INFO_X2, y+RESEARCH_OPTION_HEIGHT*3/4,
ButtonCustom::disp_text_button_func, ButtonCustomPara((void*)"Cancel",0) );
// ###### end Gilbert 16/8 ######//
}
//----------- End of function FirmResearch::disp_research_menu -----------//
//--------- Begin of function FirmResearch::detect_research_menu ---------//
//
void FirmResearch::detect_research_menu()
{
int i;
for( i = 0; i < added_count; ++i )
{
if(button_research_array[i].detect() )
{
int techId = button_research_array[i].custom_para.value;
if( tech_res[techId]->can_research(nation_recno) )
{
start_research(techId, COMMAND_PLAYER);
// ##### begin Gilbert 25/9 ######//
se_ctrl.immediate_sound("TURN_ON");
// ##### end Gilbert 25/9 ######//
research_menu_mode = RESEARCH_MENU_MAIN;
info.disp();
}
else
{
// ##### begin Gilbert 25/9 ######//
se_ctrl.immediate_sound("TURN_OFF");
// ##### end Gilbert 25/9 ######//
}
break;
}
}
//------ detect the cancel button --------//
if( i >= added_count ) // no research button has been pressed
{
if( button_cancel.detect() )
{
// ##### begin Gilbert 25/9 ######//
se_ctrl.immediate_sound("TURN_OFF");
// ##### end Gilbert 25/9 ######//
research_menu_mode = RESEARCH_MENU_MAIN;
info.disp();
}
}
}
//----------- End of function FirmResearch::detect_research_menu -----------//
//-------- Begin of static function i_disp_research_button --------//
//
void i_disp_research_button(ButtonCustom *button, int repaintBody)
{
int x1 = button->x1;
int y1 = button->y1;
int x2 = button->x2;
int y2 = button->y2;
if( button->pushed_flag )
{
vga.d3_panel2_down(x1, y1, x2, y2);
x1++;
y1++;
}
else
{
vga.d3_panel2_up(x1, y1, x2, y2);
x2--;
y2--;
}
//--------------------------------------------//
TechInfo* techInfo = tech_res[button->custom_para.value];
// Vga::active_buf->d3_panel_down(x1+2, y1+2, x1+TECH_LARGE_ICON_WIDTH+7, y1+TECH_LARGE_ICON_HEIGHT+7, 2, 0 );
Vga::active_buf->put_bitmap(x1+4, y1+4, techInfo->tech_large_icon() );
//------ display research description -------//
String str;
str = techInfo->tech_des();
Firm *firmPtr = (Firm *) button->custom_para.ptr;
int researchVersion = techInfo->get_nation_tech_level(firmPtr->nation_recno)+1; // research the next non-researched version
if( researchVersion > 1 )
{
str += " ";
str += m.roman_number(researchVersion);
}
font_bible.put( x1+TECH_LARGE_ICON_WIDTH+12, y1+14, str );
}
//--------- End of static function i_disp_research_button ---------//
//--------- Begin of function FirmResearch::disp_research_info ---------//
//
void FirmResearch::disp_research_info(int dispY1, int refreshFlag)
{
static short lastTechId=0;
if( refreshFlag==INFO_UPDATE && lastTechId != tech_id )
{
lastTechId = tech_id;
info.disp();
}
//---------------- paint the panel --------------//
if( refreshFlag == INFO_REPAINT )
vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+50 );
if( !tech_id )
return;
int x=INFO_X1+4, y=dispY1+4;
//-------- display the icon of the researching item ---------//
TechInfo* techInfo = tech_res[tech_id];
if( refreshFlag == INFO_REPAINT )
{
vga.d3_panel_down( x, y, x+TECH_LARGE_ICON_WIDTH+3, y+TECH_LARGE_ICON_HEIGHT+3, 2 );
vga_front.put_bitmap( x+2, y+2, techInfo->tech_large_icon() );
//----------- display text ------------//
x += TECH_LARGE_ICON_WIDTH+10;
String str;
str = techInfo->tech_des();
int researchVersion = techInfo->get_nation_tech_level(nation_recno)+1; // research the next non-researched version
if( researchVersion > 1 )
{
str += " ";
str += m.roman_number(researchVersion);
}
font_san.put( x, y+4, str);
}
else
{
x += TECH_LARGE_ICON_WIDTH+10;
}
vga_front.indicator( 0, x-2, y+21, techInfo->get_progress(nation_recno), (float)100, VGA_GRAY );
}
//----------- End of function FirmResearch::disp_research_info -----------//
//--------- Begin of function FirmResearch::next_day ---------//
//
void FirmResearch::next_day()
{
//----- call next_day() of the base class -----//
Firm::next_day();
//----------- update population -------------//
recruit_worker();
//-------- train up the skill ------------//
update_worker();
//--------- calculate productivity ----------//
calc_productivity();
//--------- process research ----------//
process_research();
}
//----------- End of function FirmResearch::next_day -----------//
//------- Begin of function FirmResearch::change_nation ---------//
//
void FirmResearch::change_nation(int newNationRecno)
{
terminate_research();
//-------- change the nation of this firm now ----------//
Firm::change_nation(newNationRecno);
}
//-------- End of function FirmResearch::change_nation ---------//
//--------- Begin of function FirmResearch::start_research --------//
//
// Start researching on the specific technology.
//
// techId - id. of the technology to research.
//
void FirmResearch::start_research(int techId, char remoteAction)
{
TechInfo* techInfo = tech_res[techId];
err_when( !techInfo->can_research(nation_recno) );
if( !remoteAction && remote.is_enable())
{
// packet structure :
short *shortPtr = (short *)remote.new_send_queue_msg(MSG_F_RESEARCH_START, 2*sizeof(short) );
shortPtr[0] = firm_recno;
shortPtr[1] = (short) techId;
return;
}
//---- if the firm currently is already researching something ---//
if( tech_id )
terminate_research();
//-------- set self parameters ---------//
tech_id = techId;
//------- set TechRes parameters -------//
techInfo->inc_nation_is_researching(nation_recno);
}
//----------- End of function FirmResearch::start_research ---------//
//--------- Begin of function FirmResearch::process_research --------//
//
// Process the current research.
//
void FirmResearch::process_research()
{
if( !tech_id )
return;
//------- make a progress with the research ------//
TechInfo* techInfo = tech_res[tech_id];
float progressPoint;
if( config.fast_build && nation_recno==nation_array.player_recno )
progressPoint = (float) productivity / 100 + (float) 0.5;
else
progressPoint = (float) productivity / 300;
int newLevel = techInfo->get_nation_tech_level(nation_recno)+1;
float levelDivider = ((float)(newLevel+1)/2); // from 1.0 to 2.0
progressPoint = progressPoint * (float) 30
/ techInfo->complex_level
/ levelDivider; // more complex and higher level technology will take longer to research
int techId = tech_id; // techInfo->progress() will reset tech_id if the current research level is the max tech level, so we have to save it now
if( techInfo->progress(nation_recno, progressPoint) )
{
if( tech_id ) // TechRes::progress() may have called terminate_research() if the tech level reaches the maximum
{
int techId = tech_id;
research_complete();
//----- research next level technology automatically -----//
if( !firm_ai ) // for player's firm only
{
if( techInfo->get_nation_tech_level(nation_recno) < techInfo->max_tech_level )
{
start_research( techId, COMMAND_AUTO );
if( firm_recno == firm_array.selected_recno )
info.disp();
}
}
}
//--------- add news ---------//
if( own_firm() )
{
news_array.tech_researched( techId, tech_res[techId]->get_nation_tech_level(nation_recno) );
se_res.far_sound(center_x, center_y, 1, 'F', firm_id, "FINS",
'S', unit_res[tech_res[techId]->unit_id]->sprite_id);
}
}
}
//----------- End of function FirmResearch::process_research ---------//
//--------- Begin of function FirmResearch::research_complete --------//
//
void FirmResearch::research_complete()
{
short techId = tech_id; // backup tech_id
tech_res[tech_id]->dec_nation_is_researching(nation_recno);
tech_id = 0; // reset parameters
complete_percent = (float) 0;
}
//----------- End of function FirmResearch::research_complete ---------//
//--------- Begin of function FirmResearch::terminate_research --------//
//
void FirmResearch::terminate_research()
{
if( !tech_id )
return;
tech_res[tech_id]->dec_nation_is_researching(nation_recno);
tech_id = 0; // reset parameters
complete_percent = (float) 0;
}
//----------- End of function FirmResearch::terminate_research ---------//