123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- /*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
- //Filename : OR_TOWN.CPP
- //Description : Town Report
- #include <OVGA.h>
- #include <OFONT.h>
- #include <OIMGRES.h>
- #include <OVBROWIF.h>
- #include <OBUTTON.h>
- #include <ORACERES.h>
- #include <OFIRM.h>
- #include <OFIRM.h>
- #include <OWORLD.h>
- #include <ONATION.h>
- #include <OUNIT.h>
- #include <OINFO.h>
- //------------- 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 <int> recNo is not given :
- // - return the total no. of firms of this nation
- //
- // 2. when <int> 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 ; i<MAX_RACE ; i++ )
- {
- if( townPtr->race_pop_array[i] > 0 )
- {
- ++raceCount;
- }
- }
- if( raceCount > 7 )
- {
- iconSpacing = 7 * iconSpacing / raceCount;
- }
- #endif
- for( i=0 ; i<MAX_RACE ; i++ )
- {
- if( townPtr->race_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 <int> recNo is not given :
- // - return the total no. of firms of this nation
- //
- // 2. when <int> 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 -----------//
|