/* * 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 : OR_TOWN.CPP //Description : Town Report #include #include #include #include #include #include #include #include #include #include #include #include //------------- Define coordinations -----------// enum { TOWN_BROWSE_X1 = ZOOM_X1+6, TOWN_BROWSE_Y1 = ZOOM_Y1+6, TOWN_BROWSE_X2 = ZOOM_X2-6, TOWN_BROWSE_Y2 = TOWN_BROWSE_Y1+280 }; enum { POP_TOTAL_X1 = ZOOM_X1+6, POP_TOTAL_Y1 = TOWN_BROWSE_Y2+2, POP_TOTAL_X2 = ZOOM_X2-6, POP_TOTAL_Y2 = POP_TOTAL_Y1+18, }; enum { FIRM_BROWSE_X1 = ZOOM_X1+6, FIRM_BROWSE_Y1 = POP_TOTAL_Y2+6, FIRM_BROWSE_X2 = ZOOM_X2-6, FIRM_BROWSE_Y2 = ZOOM_Y2-6, }; //----------- Define static variables ----------// static VBrowseIF browse_town, browse_firm; static int total_population, total_peasant; static int firm_income_array[MAX_FIRM_TYPE]; static int total_firm_cost, total_firm_income, total_firm_count; static float total_expense; //----------- Define static functions ----------// static void put_town_rec(int recNo, int x, int y, int refreshFlag); static void put_firm_rec(int recNo, int x, int y, int refreshFlag); static int town_filter(int recNo=0); static int firm_filter(int recNo=0); static void disp_total(); static void calc_firm_total(); //--------- Begin of function Info::disp_town ---------// // void Info::disp_town(int refreshFlag) { int x=TOWN_BROWSE_X1+9; int y=TOWN_BROWSE_Y1+4; vga_back.d3_panel_up(TOWN_BROWSE_X1, TOWN_BROWSE_Y1, TOWN_BROWSE_X2, TOWN_BROWSE_Y1+20 ); font_san.put( x , y, "Village" ); font_san.put( x+150, y, "Villagers" ); font_san.put( x+225, y, "Peasants" ); font_san.put( x+295, y, "Loyalty" ); font_san.put( x+355, y, "Races" ); if( refreshFlag == INFO_REPAINT ) { browse_town.init( TOWN_BROWSE_X1, TOWN_BROWSE_Y1+22, TOWN_BROWSE_X2, TOWN_BROWSE_Y2-20, 0, 21, town_filter(), put_town_rec, 1 ); browse_town.open(browse_town_recno); } else { browse_town.paint(); browse_town.open(browse_town_recno, town_filter()); } //------- Display the firm report -------// calc_firm_total(); x=FIRM_BROWSE_X1+9; y=FIRM_BROWSE_Y1+4; vga_back.d3_panel_up(FIRM_BROWSE_X1, FIRM_BROWSE_Y1, FIRM_BROWSE_X2, FIRM_BROWSE_Y1+20 ); font_san.put( x , y, "Structure" ); font_san.put( x+140, y, "Unit Cost" ); #if(defined(FRENCH)) font_san.put( x+237, y, "No. of Structures" ); #else font_san.put( x+217, y, "No. of Structures" ); #endif font_san.put( x+340, y, "Yearly Expense" ); font_san.put( x+450, y, "Yearly Income" ); if( refreshFlag == INFO_REPAINT ) { browse_firm.init( FIRM_BROWSE_X1, FIRM_BROWSE_Y1+22, FIRM_BROWSE_X2, FIRM_BROWSE_Y2-20, 0, 16, firm_filter(), put_firm_rec, 1 ); browse_firm.open(browse_firm_recno); } else { browse_firm.paint(); browse_firm.open(browse_firm_recno, firm_filter()); } //--------- Display total ------------// disp_total(); } //----------- End of function Info::disp_town -----------// //--------- Begin of function Info::detect_town ---------// // void Info::detect_town() { //------- detect the town browser -------// if( browse_town.detect() ) { browse_town_recno = browse_town.recno(); if( browse_town.double_click ) { Town* townPtr = town_array[ town_filter(browse_town_recno) ]; world.go_loc(townPtr->center_x, townPtr->center_y, 1); } } //------- detect the firm browser -------// if( browse_firm.detect() ) browse_firm_recno = browse_firm.recno(); } //----------- End of function Info::detect_town -----------// //-------- Begin of static function disp_total --------// static void disp_total() { //------- calculate total --------// total_population = 0; total_peasant = 0; Town* townPtr; for( int i=town_array.size() ; i>0 ; i-- ) { if( town_array.is_deleted(i) ) continue; townPtr = town_array[i]; if( townPtr->nation_recno==info.viewing_nation_recno ) { total_population += townPtr->population; total_peasant += townPtr->jobless_population; } } //-------- display town total --------// int x=TOWN_BROWSE_X1+9; int y=TOWN_BROWSE_Y2-16; vga_back.d3_panel_up(TOWN_BROWSE_X1, TOWN_BROWSE_Y2-18, TOWN_BROWSE_X2, TOWN_BROWSE_Y2 ); String str; if( browse_town.total_rec() > 1 ) str = "Total Villages"; else str = "Total Village"; str = translate.process(str); str += ": "; str += browse_town.total_rec(); font_san.put( x, y, str ); //-------------------------------// str = "Total Villagers"; str = translate.process(str); str += ": "; str += total_population; font_san.put( x+180, y, str ); //-------------------------------// if( total_peasant > 1 ) str = "Total Peasants"; else str = "Total Peasant"; str = translate.process(str); str += ": "; str += total_peasant; font_san.put( x+360, y, str ); //------- display other totals --------// Nation* viewNation = nation_array[info.viewing_nation_recno]; x=POP_TOTAL_X1+9; y=POP_TOTAL_Y1+2; vga_back.d3_panel_up(POP_TOTAL_X1, POP_TOTAL_Y1, POP_TOTAL_X2, POP_TOTAL_Y2 ); str = "Total Other Human Units"; str = translate.process(str); str += ": "; str += viewNation->total_human_count; font_san.put( x, y, str ); str = "Total Population"; str = translate.process(str); str += ": "; str += viewNation->total_population + viewNation->total_human_count; font_san.put( x+360, y, str ); //-------- display firm total ---------// x=FIRM_BROWSE_X1+9; y=FIRM_BROWSE_Y2-16; vga_back.d3_panel_up(FIRM_BROWSE_X1, FIRM_BROWSE_Y2-18, FIRM_BROWSE_X2, FIRM_BROWSE_Y2 ); font_san.put( x , y, "Total" ); font_san.put( x+265, y, total_firm_count ); font_san.put( x+370, y, m.format(total_firm_cost,2) ); font_san.put( x+470, y, m.format(total_firm_income,2) ); } //----------- End of static function disp_total -----------// //-------- Begin of static function calc_firm_total --------// static void calc_firm_total() { //-------- calculate firm incomes --------// total_firm_income = 0; memset( firm_income_array, 0, sizeof(firm_income_array) ); int thisIncome; 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->nation_recno == info.viewing_nation_recno ) { thisIncome = (int) firmPtr->income_365days(); if( thisIncome > 0 ) { firm_income_array[firmPtr->firm_id-1] += thisIncome; total_firm_income += thisIncome; } } } //------ calculate total firm cost --------// total_firm_count = 0; total_firm_cost = 0; FirmInfo* firmInfo; for( i=1 ; i<=MAX_FIRM_TYPE ; i++ ) { firmInfo = firm_res[i]; total_firm_cost += firmInfo->year_cost * firmInfo->nation_firm_count_array[info.viewing_nation_recno-1]; total_firm_count += firmInfo->nation_firm_count_array[info.viewing_nation_recno-1]; } } //----------- End of static function calc_firm_total -----------// //-------- Begin of static function town_filter --------// // // This function has dual purpose : // // 1. when recNo is not given : // - return the total no. of firms of this nation // // 2. when recNo is given : // - return the firm recno in firm_array of the given recno. // static int town_filter(int recNo) { int totalTown = town_array.size(); int townCount=0; Town* townPtr; for( int townRecno=1 ; townRecno<=totalTown ; townRecno++ ) { if( town_array.is_deleted(townRecno) ) continue; townPtr = town_array[townRecno]; if( townPtr->nation_recno==info.viewing_nation_recno ) townCount++; if( recNo && townCount==recNo ) return townRecno; } err_when( recNo ); // the recNo is not found, it is out of range return townCount; } //----------- End of static function town_filter -----------// //-------- Begin of static function put_town_rec --------// // static void put_town_rec(int recNo, int x, int y, int refreshFlag) { int townRecno = town_filter(recNo); Town* townPtr = town_array[townRecno]; //---------- display info ----------// x+=3; y+=3; font_san.put( x , y, townPtr->town_name() ); font_san.put( x+175, y, townPtr->population ); font_san.put( x+241, y, townPtr->jobless_population ); font_san.put( x+309, y, townPtr->average_loyalty() ); //------- display race icons -------// x += 350; int i; int iconSpacing = RACE_ICON_WIDTH+2; #if(MAX_RACE > 7) int raceCount = 0; for( i=0 ; irace_pop_array[i] > 0 ) { ++raceCount; } } if( raceCount > 7 ) { iconSpacing = 7 * iconSpacing / raceCount; } #endif for( i=0 ; irace_pop_array[i] > 0 ) { vga_back.put_bitmap( x, y-2, race_res[i+1]->icon_bitmap_ptr ); x += iconSpacing; } } } //----------- End of static function put_town_rec -----------// //-------- Begin of static function firm_filter --------// // // This function has dual purpose : // // 1. when recNo is not given : // - return the total no. of firms of this nation // // 2. when recNo is given : // - return the firm recno in firm_array of the given recno. // static int firm_filter(int recNo) { int firmTypeCount=0; FirmInfo* firmInfo; for( int firmId=1 ; firmId<=MAX_FIRM_TYPE ; firmId++ ) { firmInfo = firm_res[firmId]; if( firmInfo->nation_firm_count_array[info.viewing_nation_recno-1] ) firmTypeCount++; if( recNo && firmTypeCount==recNo ) return firmId; } err_when( recNo ); // the recNo is not found, it is out of range return firmTypeCount; } //----------- End of static function firm_filter -----------// //----------- Begin of static function put_firm_rec -----------// // static void put_firm_rec(int recNo, int x, int y, int refreshFlag) { int firmId = firm_filter(recNo); FirmInfo* firmInfo = firm_res[firmId]; x+=3; y+=3; int firmCount = firmInfo->nation_firm_count_array[info.viewing_nation_recno-1]; font_san.put( x , y, firmInfo->name ); font_san.put( x+155, y, m.format(firmInfo->year_cost,2) ); font_san.put( x+265, y, firmCount ); font_san.put( x+370, y, m.format(firmInfo->year_cost*firmCount,2) ); font_san.put( x+470, y, m.format(firm_income_array[firmId-1], 2) ); } //----------- End of static function put_firm_rec -----------//