/* * 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 : OAI_INFO.CPP //Description : AI - A.I. info structure #include #include #include #include #include //--------- Begin of function Nation::update_ai_firm_array --------// // // firmId - determine which firm array to be returned // // actionType: 1 - add a record to the array // 0 - no addition or deletion, just return // -1 - del a record from the array // // actionRecno : the recno to be deleted, if actionType is -1. // the recno to be added, if actionType is 1. // arrayCount: for return the count of the AI info array // short* Nation::update_ai_firm_array(int firmId, int actionType, int actionRecno, int& arrayCount) { short* rc; switch(firmId) { case FIRM_BASE: rc = update_ai_array(ai_base_count, ai_base_size, &ai_base_array, AI_BASE_INC_SIZE, actionType, actionRecno); arrayCount = ai_base_count; break; case FIRM_CAMP: rc = update_ai_array(ai_camp_count, ai_camp_size, &ai_camp_array, AI_CAMP_INC_SIZE, actionType, actionRecno); arrayCount = ai_camp_count; break; case FIRM_FACTORY: rc = update_ai_array(ai_factory_count, ai_factory_size, &ai_factory_array, AI_FACTORY_INC_SIZE, actionType, actionRecno); arrayCount = ai_factory_count; break; case FIRM_MARKET: rc = update_ai_array(ai_market_count, ai_market_size, &ai_market_array, AI_MARKET_INC_SIZE, actionType, actionRecno); arrayCount = ai_market_count; break; case FIRM_INN: rc = update_ai_array(ai_inn_count, ai_inn_size, &ai_inn_array, AI_INN_INC_SIZE, actionType, actionRecno); arrayCount = ai_inn_count; break; case FIRM_MINE: rc = update_ai_array(ai_mine_count, ai_mine_size, &ai_mine_array, AI_MINE_INC_SIZE, actionType, actionRecno); arrayCount = ai_mine_count; break; case FIRM_RESEARCH: rc = update_ai_array(ai_research_count, ai_research_size, &ai_research_array, AI_RESEARCH_INC_SIZE, actionType, actionRecno); arrayCount = ai_research_count; break; case FIRM_WAR_FACTORY: rc = update_ai_array(ai_war_count, ai_war_size, &ai_war_array, AI_WAR_INC_SIZE, actionType, actionRecno); arrayCount = ai_war_count; break; case FIRM_HARBOR: rc = update_ai_array(ai_harbor_count, ai_harbor_size, &ai_harbor_array, AI_HARBOR_INC_SIZE, actionType, actionRecno); arrayCount = ai_harbor_count; break; default: err_here(); return 0; } return rc; } //---------- End of function Nation::update_ai_firm_array --------// //--------- Begin of function Nation::update_ai_array --------// // // aiInfoCount - the count of the AI info array. // aiInfoSize - the size of the AI info array. // aiInfoArray - poniter to the AI info array. // arrayIncSize - the increment size of the array. // // actionType: 1 - add a record to the array // 0 - no addition or deletion, just return // -1 - del a record from the array // // [int] actionRecno : the recno to be deleted, if actionType is -1. // the recno to be added, if actionType is 1. // short* Nation::update_ai_array(short& aiInfoCount, short& aiInfoSize, short** aiInfoArrayPtr, int arrayIncSize, int actionType, int actionRecno) { err_when( aiInfoCount<0 ); err_when( aiInfoCount > aiInfoSize ); err_when( actionType<-1 || actionType>1 ); short* aiInfoArray = *aiInfoArrayPtr; if( actionType == -1 ) { short* aiInfoPtr = aiInfoArray; for( int i=0 ; iregion_id ) { regionRecno = j+1; break; } } if( !regionRecno ) // not included yet { if( ai_region_count == MAX_AI_REGION ) // no space for adding new region continue; err_when( ai_region_count > MAX_AI_REGION ); ai_region_array[ai_region_count++].region_id = townPtr->region_id; regionRecno = ai_region_count; } //--- increase the town and base_town_count of the nation ---// ai_region_array[regionRecno-1].town_count++; if( townPtr->is_base_town ) ai_region_array[regionRecno-1].base_town_count++; } } //---------- End of function Nation::update_ai_region --------// //--------- Begin of function Nation::add_town_info --------// void Nation::add_town_info(short townRecno) { update_ai_array(ai_town_count, ai_town_size, &ai_town_array, AI_TOWN_INC_SIZE, 1, townRecno); update_ai_region(); } //---------- End of function Nation::add_town_info --------// //--------- Begin of function Nation::del_town_info --------// void Nation::del_town_info(short townRecno) { err_when( ai_base_town_count<0 ); //--- if this is a base town, decrease the base town counter ---// if( town_array[townRecno]->is_base_town ) { ai_base_town_count--; err_when( ai_base_town_count<0 ); } //------- delete the record from ai_town_array ------// update_ai_array(ai_town_count, ai_town_size, &ai_town_array, AI_TOWN_INC_SIZE, -1, townRecno); update_ai_region(); } //---------- End of function Nation::del_town_info --------// //--------- Begin of function Nation::add_general_info --------// void Nation::add_general_info(short unitRecno) { Unit* unitPtr = unit_array[unitRecno]; err_when( unitPtr->rank_id != RANK_KING && unitPtr->rank_id != RANK_GENERAL ); update_ai_array(ai_general_count, ai_general_size, &ai_general_array, AI_GENERAL_INC_SIZE, 1, unitRecno); } //---------- End of function Nation::add_general_info --------// //--------- Begin of function Nation::del_general_info --------// void Nation::del_general_info(short unitRecno) { Unit* unitPtr = unit_array[unitRecno]; err_when( unitPtr->rank_id != RANK_KING && unitPtr->rank_id != RANK_GENERAL ); update_ai_array(ai_general_count, ai_general_size, &ai_general_array, AI_GENERAL_INC_SIZE, -1, unitRecno); } //---------- End of function Nation::del_general_info --------// //--------- Begin of function Nation::add_caravan_info --------// void Nation::add_caravan_info(short unitRecno) { update_ai_array(ai_caravan_count, ai_caravan_size, &ai_caravan_array, AI_CARAVAN_INC_SIZE, 1, unitRecno); } //---------- End of function Nation::add_caravan_info --------// //--------- Begin of function Nation::del_caravan_info --------// void Nation::del_caravan_info(short unitRecno) { update_ai_array(ai_caravan_count, ai_caravan_size, &ai_caravan_array, AI_CARAVAN_INC_SIZE, -1, unitRecno); } //---------- End of function Nation::del_caravan_info --------// //--------- Begin of function Nation::is_caravan_exist --------// // // Check whether there is an existing caravan travelling along // the specific route. // // firstStop, secondStop - firm recno of the first and second stops. // [int] setStopInterval - if this is given, then only caravans // that have been set stop within the given // days will be counted as existing ones. // int Nation::is_caravan_exist(int firstStop, int secondStop, int setStopInterval) { UnitCaravan* unitCaravan; for( int i=0; istop_array[0].firm_recno == firstStop && unitCaravan->stop_array[1].firm_recno == secondStop ) || ( unitCaravan->stop_array[1].firm_recno == firstStop && unitCaravan->stop_array[0].firm_recno == secondStop ) ) { if( setStopInterval ) { if( info.game_date - unitCaravan->last_set_stop_date < setStopInterval ) return unitCaravan->sprite_recno; } else return unitCaravan->sprite_recno; } } return 0; } //---------- End of function Nation::is_caravan_exist --------// //--------- Begin of function Nation::add_ship_info --------// void Nation::add_ship_info(short unitRecno) { update_ai_array(ai_ship_count, ai_ship_size, &ai_ship_array, AI_SHIP_INC_SIZE, 1, unitRecno); } //---------- End of function Nation::add_ship_info --------// //--------- Begin of function Nation::del_ship_info --------// void Nation::del_ship_info(short unitRecno) { update_ai_array(ai_ship_count, ai_ship_size, &ai_ship_array, AI_SHIP_INC_SIZE, -1, unitRecno); } //---------- End of function Nation::del_ship_info --------// //--------- Begin of function Nation::has_base_town_in_region --------// // // Return whether this nation has any base town in the given region. // int Nation::has_base_town_in_region(int regionId) { for( int i=0 ; i 0; } return 0; } //---------- End of function Nation::has_base_town_in_region --------// //--------- Begin of function Nation::get_ai_region --------// // // Return the AIRegion of the given region id. // AIRegion* Nation::get_ai_region(int regionId) { for( int i=0 ; i