/*
* 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_MINE.CPP
//Description : Firm Mine
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//--------- Begin of function FirmMine::FirmMine ---------//
//
FirmMine::FirmMine()
{
firm_skill_id = SKILL_MINING;
cur_month_production = (float) 0;
last_month_production = (float) 0;
next_output_link_id = 0;
next_output_firm_recno = 0;
ai_should_build_factory_count = 0;
}
//----------- End of function FirmMine::FirmMine -----------//
//--------- Begin of function FirmMine::~FirmMine ---------//
//
FirmMine::~FirmMine()
{
//------- update the site deposit reserve ------//
if( site_recno )
{
site_array.untapped_raw_count++;
if( reserve_qty==0 ) // if the reserve has been used up
{
site_array.del_site(site_recno);
}
else // restore the site
{
Site* sitePtr = site_array[site_recno];
sitePtr->reserve_qty = (int) reserve_qty;
sitePtr->has_mine = 0;
}
}
//-------- decrease AI raw count --------//
if( raw_id )
{
nation_array[nation_recno]->raw_count_array[raw_id-1]--;
err_when( nation_array[nation_recno]->raw_count_array[raw_id-1] < 0 );
}
}
//----------- End of function FirmMine::~FirmMine -----------//
//--------- Begin of function FirmMine::init_derived ---------//
//
void FirmMine::init_derived()
{
//---- scan for raw site in this firm's building location ----//
Location* locPtr = scan_raw_site();
if( locPtr )
{
site_recno = locPtr->site_recno();
raw_id = site_array[site_recno]->object_id;
reserve_qty = (float) site_array[site_recno]->reserve_qty;
site_array[site_recno]->has_mine = 1;
site_array.untapped_raw_count--;
err_when( site_array.untapped_raw_count < 0 );
}
else
{
site_recno = 0;
raw_id = 0;
reserve_qty = (float) 0;
}
stock_qty = (float) 0;
max_stock_qty = (float) DEFAULT_MINE_MAX_STOCK_QTY;
//-------- increase AI raw count --------//
if( raw_id )
nation_array[nation_recno]->raw_count_array[raw_id-1]++;
}
//----------- End of function FirmMine::init_derived -----------//
//------- Begin of function FirmMine::change_nation ---------//
//
void FirmMine::change_nation(int newNationRecno)
{
if( raw_id )
{
nation_array[nation_recno]->raw_count_array[raw_id-1]--;
err_when( nation_array[nation_recno]->raw_count_array[raw_id-1] < 0 );
nation_array[newNationRecno]->raw_count_array[raw_id-1]++;
}
//-------- change the nation of this firm now ----------//
Firm::change_nation(newNationRecno);
}
//-------- End of function FirmMine::change_nation ---------//
//--------- Begin of function FirmMine::scan_raw_site ---------//
//
Location* FirmMine::scan_raw_site()
{
//---- scan for raw site in this firm's building location ----//
int xLoc, yLoc;
Location* locPtr;
for( yLoc=loc_y1 ; yLoc<=loc_y2 ; yLoc++ )
{
for( xLoc=loc_x1 ; xLoc<=loc_x2 ; xLoc++ )
{
locPtr = world.get_loc(xLoc,yLoc);
if( locPtr->has_site() &&
site_array[locPtr->site_recno()]->site_type == SITE_RAW )
{
return locPtr;
}
}
}
return NULL;
}
//--------- End of function FirmMine::scan_raw_site ---------//
//--------- Begin of function FirmMine::put_info ---------//
//
void FirmMine::put_info(int refreshFlag)
{
disp_basic_info(INFO_Y1, refreshFlag);
if( !should_show_info() )
return;
disp_mine_info(INFO_Y1+52, refreshFlag);
disp_worker_list(INFO_Y1+127, refreshFlag);
disp_worker_info(INFO_Y1+191, refreshFlag);
//---------- display spy button ----------//
disp_spy_button(INFO_X1, INFO_Y1+249, refreshFlag);
}
//----------- End of function FirmMine::put_info -----------//
//--------- Begin of function FirmMine::detect_info ---------//
//
void FirmMine::detect_info()
{
//-------- detect basic info -----------//
if( detect_basic_info() )
return;
//----------- detect worker -----------//
if( detect_worker_list() )
{
disp_mine_info(INFO_Y1+52, INFO_UPDATE);
disp_worker_info(INFO_Y1+191, INFO_UPDATE);
}
//-------- detect spy button ----------//
detect_spy_button();
if( !own_firm() )
return;
}
//----------- End of function FirmMine::detect_info -----------//
//--------- Begin of function FirmMine::disp_mine_info ---------//
//
void FirmMine::disp_mine_info(int dispY1, int refreshFlag)
{
//---------------- paint the panel --------------//
if( refreshFlag == INFO_REPAINT )
vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+70);
//------ if there is no natural resource on this location ------//
if( !raw_id )
{
font_san.center_put( INFO_X1, dispY1, INFO_X2, dispY1+70, "No Natural Resources" );
return;
}
//-------------- display mining info -----------//
int x=INFO_X1+4, y=dispY1+4;
raw_res.put_small_raw_icon( x+1, y+1, raw_id );
String str;
str = translate.process("Mining ");
str += raw_res[raw_id]->name;
font_san.disp( x+20, y, str, INFO_X2-2);
y+=16;
font_san.field( x, y, "Monthly Production", x+126, (int) production_30days(), 1, INFO_X2-2, refreshFlag, "MN_PROD");
y+=16;
str = (int) stock_qty;
str += " / ";
str += (int) max_stock_qty;
font_san.field( x, y, "Mined Stock", x+126, str, INFO_X2-2, refreshFlag, "MN_STOCK");
y+=16;
font_san.field( x, y, "Untapped Reserve", x+126, (int) reserve_qty, 1, INFO_X2-2, refreshFlag, "MN_UNTAP");
}
//----------- End of function FirmMine::disp_mine_info -----------//
//--------- Begin of function FirmMine::next_day ---------//
//
void FirmMine::next_day()
{
//----- call next_day() of the base class -----//
Firm::next_day();
//----------- update population -------------//
recruit_worker();
//-------- train up the skill ------------//
update_worker();
//---------------------------------------//
if( info.game_date%PROCESS_GOODS_INTERVAL == firm_recno%PROCESS_GOODS_INTERVAL ) // produce raw materials once every 3 days
{
produce_raw();
set_next_output_firm(); // set next output firm
}
}
//----------- End of function FirmMine::next_day -----------//
//--------- Begin of function FirmMine::next_month ---------//
//
void FirmMine::next_month()
{
last_month_production = cur_month_production;
cur_month_production = (float) 0;
}
//----------- End of function FirmMine::next_month -----------//
//------- Begin of function FirmMine::set_next_output_firm ------//
//
// Set next_output_firm_recno, the recno of the linked firm
// to which this mine is going to output raw materials.
//
void FirmMine::set_next_output_firm()
{
int i, firmRecno, firmId;
for( i=0 ; i linked_firm_count ) // next firm in the link
next_output_link_id = 1;
if( linked_firm_enable_array[next_output_link_id-1] == LINK_EE )
{
firmRecno = linked_firm_array[next_output_link_id-1];
firmId = firm_array[firmRecno]->firm_id;
if( firmId==FIRM_FACTORY || firmId==FIRM_MARKET )
{
next_output_firm_recno = firmRecno;
return;
}
}
}
next_output_firm_recno = 0; // this mine has no linked output firms
}
//-------- End of function FirmMine::set_next_output_firm ---------//
//--------- Begin of function FirmMine::produce_raw ---------//
//
// Produce raw materials.
//
void FirmMine::produce_raw()
{
//----- if stock capacity reached or reserve exhausted -----//
if( stock_qty == max_stock_qty || reserve_qty==0 )
return;
err_when( reserve_qty < 0 );
err_when( stock_qty > max_stock_qty );
//------- calculate the productivity of the workers -----------//
calc_productivity();
//-------- mine raw materials -------//
float produceQty = (float) 100 * productivity / 100;
produceQty = min( produceQty, reserve_qty );
produceQty = min( produceQty, max_stock_qty-stock_qty );
reserve_qty -= produceQty;
stock_qty += produceQty;
cur_month_production += produceQty;
site_array[site_recno]->reserve_qty = (int) reserve_qty; // update the reserve_qty in site_array
err_when( reserve_qty < 0 );
err_when( stock_qty > max_stock_qty );
//---- add news if run out of raw deposit ----//
if( reserve_qty == 0 )
{
site_array.untapped_raw_count++; // have to restore its first as del_site() will decrease uptapped_raw_count
site_array.del_site(site_recno);
site_recno = 0;
if( nation_recno == nation_array.player_recno )
news_array.raw_exhaust(raw_id, center_x, center_y);
}
}
//----------- End of function FirmMine::produce_raw -----------//
//------- Begin of function FirmMine::draw -----------//
//
// Draw raw materials stocks.
//
void FirmMine::draw(int displayLayer)
{
Firm::draw(displayLayer);
if( !should_show_info() )
return;
if( under_construction )
return;
if( raw_id && displayLayer == 1)
{
int cargoCount = MAX_CARGO * (int)stock_qty / (int)max_stock_qty;
draw_cargo( max(1,cargoCount), raw_res.small_raw_icon(raw_id) );
}
}
//--------- End of function FirmMine::draw -----------//