/* * 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 : OREGIONS.CPP // Description : functions on RegionStat #include #include #include #include #include #include #include //-------- Begin of function RegionArray::init_region_stat -------// void RegionArray::init_region_stat() { //------ count the no. of regions with statistic -----// // // Only include land regions that are big enough. // //----------------------------------------------------// region_stat_count=0; RegionInfo* regionInfo; int i; for( i=1 ; i<=region_info_count ; i++ ) { regionInfo = region_array[i]; if( regionInfo->region_size >= MIN_STAT_REGION_SIZE && // regions are sorted by their sizes regionInfo->region_type == REGION_LAND ) { region_stat_count++; } } err_when( region_stat_count==0 ); //-------- init the region_stat_array ---------// region_stat_array = (RegionStat*) mem_add( region_stat_count * sizeof(RegionStat) ); memset( region_stat_array, 0, region_stat_count * sizeof(RegionStat) ); int regionStatId=1; for( i=1 ; i<=region_info_count ; i++ ) { regionInfo = get_sorted_region(i); if( regionInfo->region_type != REGION_LAND ) continue; err_when( regionStatId<1 || regionStatId>region_stat_count ); region_stat_array[regionStatId-1].region_id = regionInfo->region_id; regionInfo->region_stat_id = regionStatId; if( ++regionStatId > region_stat_count ) break; } err_when( regionStatId != region_stat_count+1 ); // no all regionStat get their region_id for( i=0 ; iregion_type != REGION_SEA ) continue; if( !region_array.is_adjacent(region_id, seaRegionId) ) continue; //--- scan thru all big regions (regions in region_stat_array) ---// RegionStat* regionStat = region_array.region_stat_array; for( int i=1 ; i<=region_array.region_stat_count ; i++, regionStat++ ) { if( regionStat->region_id==region_id ) continue; if( region_array.is_adjacent(seaRegionId, regionStat->region_id) ) { reachable_region_array[reachable_region_count].sea_region_id = seaRegionId; reachable_region_array[reachable_region_count].land_region_stat_id = i; if( ++reachable_region_count == MAX_REACHABLE_REGION_PER_STAT ) return; } } } } //--------- End of function RegionStat::init -------// //--------- Begin of function RegionStat::update_stat -------// void RegionStat::update_stat() { //------ save useful constant info ------// int regionId = region_id; RegionPath reachableRegionArray[MAX_REACHABLE_REGION_PER_STAT]; char reachableRegionCount = reachable_region_count; err_when( sizeof(reachable_region_array) != sizeof(reachableRegionArray) ); memcpy( reachableRegionArray, reachable_region_array, sizeof(reachable_region_array) ); memset( this, 0, sizeof(RegionStat) ); // reset all data region_id = regionId; reachable_region_count = reachableRegionCount; memcpy( reachable_region_array, reachableRegionArray, sizeof(reachable_region_array) ); //--------- update firm stat ---------// Firm* firmPtr; int i; for( i=firm_array.size() ; i>0 ; i-- ) { if( firm_array.is_deleted(i) ) continue; firmPtr = firm_array[i]; if( firmPtr->region_id != region_id ) continue; if( firmPtr->nation_recno==0 ) // monster firms continue; err_when( firmPtr->firm_id < 1 || firmPtr->firm_id > MAX_FIRM_TYPE ); err_when( firmPtr->nation_recno < 1 || firmPtr->nation_recno > MAX_NATION ); firm_type_count_array[firmPtr->firm_id-1]++; firm_nation_count_array[firmPtr->nation_recno-1]++; total_firm_count++; if( firmPtr->firm_id == FIRM_CAMP ) camp_nation_count_array[firmPtr->nation_recno-1]++; if( firmPtr->firm_id == FIRM_HARBOR ) harbor_nation_count_array[firmPtr->nation_recno-1]++; if( firmPtr->firm_id == FIRM_MINE ) mine_nation_count_array[firmPtr->nation_recno-1]++; } //--------- update town stat ---------// Town* townPtr; for( i=town_array.size() ; i>0 ; i-- ) { if( town_array.is_deleted(i) ) continue; townPtr = town_array[i]; if( townPtr->region_id != region_id ) continue; if( townPtr->nation_recno ) { err_when( townPtr->nation_recno < 1 || townPtr->nation_recno > MAX_NATION ); town_nation_count_array[townPtr->nation_recno-1]++; if( townPtr->is_base_town ) base_town_nation_count_array[townPtr->nation_recno-1]++; nation_population_array[townPtr->nation_recno-1] += townPtr->population; nation_jobless_population_array[townPtr->nation_recno-1] += townPtr->jobless_population; } else independent_town_count++; total_town_count++; } //--------- update unit stat ---------// Unit* unitPtr; for( i=unit_array.size() ; i>0 ; i-- ) { if( unit_array.is_deleted(i) ) continue; unitPtr = unit_array[i]; if( unitPtr->region_id() != region_id ) continue; if( unitPtr->nation_recno ) unit_nation_count_array[unitPtr->nation_recno-1]++; else independent_unit_count++; total_unit_count++; } //--------- update site count --------// Site* sitePtr; for( i=site_array.size() ; i>0 ; i-- ) { if( site_array.is_deleted(i) ) continue; sitePtr = site_array[i]; if( sitePtr->region_id != region_id ) continue; if( sitePtr->site_type == SITE_RAW ) raw_count++; site_count++; } //----- update each nation's presence on the region -----// for( i=0 ; i 0 || town_nation_count_array[i] > 0 || unit_nation_count_array[i] > 0 ) { nation_is_present_array[i] = 1; nation_presence_count++; } } } //--------- End of function RegionStat::update_stat -------// //--------- Begin of function RegionArray::get_sea_path_region_id -------// // // Return the region id. of the sea path between the two given regions. // int RegionArray::get_sea_path_region_id(int regionId1, int regionId2) { RegionStat* regionStat = region_array.get_region_stat(regionId1); int regionStatId2 = region_array[regionId2]->region_stat_id; RegionPath* regionPath = regionStat->reachable_region_array; for( int i=0 ; ireachable_region_count ; i++, regionPath++ ) { if( regionPath->land_region_stat_id == regionStatId2 ) return regionPath->sea_region_id; } return 0; } //--------- End of function RegionArray::get_sea_path_region_id -------// //--------- Begin of function RegionArray::nation_has_base_town -------// // // Return whether the given nation has a base town in the given region. // int RegionArray::nation_has_base_town(int regionId, int nationRecno) { RegionStat* regionStat = region_array.region_stat_array; for( int i=1 ; i<=region_array.region_stat_count ; i++, regionStat++ ) { if( regionStat->region_id != regionId ) continue; return regionStat->base_town_nation_count_array[nationRecno-1] > 0; } return 0; } //--------- End of function RegionArray::nation_has_base_town -------//