/*
* 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 : OFIRM2.CPP
//Description : Class Firm - part 2
#include
#include
#include
#include
#include
#include
//--------- Begin of function Firm::kill_overseer ---------//
//
// Kill the overeseer of the firm
//
void Firm::kill_overseer()
{
if( !overseer_recno )
return;
//-------- if the overseer is a spy -------//
Unit* unitPtr = unit_array[overseer_recno];
if( unitPtr->spy_recno )
spy_array[unitPtr->spy_recno]->set_place(SPY_UNDEFINED, 0);
//-- no need to del the spy here, unit_array.del() will del the spy --//
//-----------------------------------------//
if( overseer_town_recno )
town_array[overseer_town_recno]->dec_pop(unit_array[overseer_recno]->race_id, 1);
unit_array.del(overseer_recno);
overseer_recno = 0;
}
//----------- End of function Firm::kill_overseer -----------//
//--------- Begin of function Firm::kill_all_worker ---------//
//
// All the workers in the firm are deleted
//
void Firm::kill_all_worker()
{
for(int i=worker_count; i>0; i--)
kill_worker(i);
}
//----------- End of function Firm::kill_all_worker -----------//
//--------- Begin of function Firm::kill_worker ---------//
//
// Kill a specific worker.
//
void Firm::kill_worker(int workerId)
{
err_when( !worker_array ); // this function shouldn't be called if this firm does not need worker
err_when( workerId<1 || workerId>worker_count );
//------- decrease worker no. and create an unit -----//
Worker* workerPtr = worker_array+workerId-1;
int unitRecno = 0;
if( workerPtr->race_id && workerPtr->name_id )
race_res[workerPtr->race_id]->free_name_id(workerPtr->name_id);
if( workerPtr->town_recno ) // town_recno is 0 if the workers in the firm do not live in towns
town_array[workerPtr->town_recno]->dec_pop(workerPtr->race_id, 1); // 1-has job
//-------- if this worker is a spy ---------//
if( workerPtr->spy_recno )
{
spy_array[workerPtr->spy_recno]->set_place(SPY_UNDEFINED, 0);
spy_array.del_spy( workerPtr->spy_recno );
}
//--- decrease the nation unit count as the Unit has already increased it ----//
if( !firm_res[firm_id]->live_in_town ) // if the unit does not live in town, increase the unit count now
unit_res[workerPtr->unit_id]->dec_nation_unit_count(nation_recno);
//------- delete the record from the worker_array ------//
err_when( worker_count > MAX_WORKER );
err_when( selected_worker_id > worker_count );
m.del_array_rec(worker_array, worker_count, sizeof(Worker), workerId);
if( selected_worker_id > workerId || selected_worker_id == worker_count )
selected_worker_id--;
worker_count--;
if( worker_count==0 )
selected_worker_id = 0;
err_when( selected_worker_id > worker_count );
}
//----------- End of function Firm::kill_worker -----------//
//--------- Begin of function Firm::kill_builder ---------//
void Firm::kill_builder(short builderRecno)
{
unit_array.del(builderRecno);
}
//----------- End of function Firm::kill_builder -----------//
//--------- Begin of function Firm::locate_space ---------//
int Firm::locate_space(int removeFirm, int &xLoc, int &yLoc, int xLoc2, int yLoc2, int width, int height, int mobileType, int regionId)
{
int checkXLoc, checkYLoc;
if(removeFirm)
{
//*** note only for land unit with size 1x1 ***//
char mType = UNIT_LAND;
for(checkYLoc=loc_y1; checkYLoc<=loc_y2; checkYLoc++)
{
for(checkXLoc=loc_x1; checkXLoc<=loc_x2; checkXLoc++)
{
if(world.get_loc(checkXLoc, checkYLoc)->can_move(mType))
{
xLoc = checkXLoc;
yLoc = checkYLoc;
return 1;
}
}
}
}
else
{
checkXLoc = loc_x1;
checkYLoc = loc_y1;
if(!world.locate_space(checkXLoc, checkYLoc, xLoc2, yLoc2, width, height, mobileType, regionId))
return 0;
else
{
xLoc = checkXLoc;
yLoc = checkYLoc;
return 1;
}
}
return 0;
}
//----------- End of function Firm::locate_space -----------//