/* * 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 #include //------------- Define coordinations -----------// enum { CARAVAN_BROWSE_X1 = ZOOM_X1+6, CARAVAN_BROWSE_Y1 = ZOOM_Y1+6, CARAVAN_BROWSE_X2 = ZOOM_X2-6, CARAVAN_BROWSE_Y2 = CARAVAN_BROWSE_Y1+260 }; enum { SHIP_BROWSE_X1 = ZOOM_X1+6, SHIP_BROWSE_Y1 = CARAVAN_BROWSE_Y2+6, SHIP_BROWSE_X2 = ZOOM_X2-6, SHIP_BROWSE_Y2 = ZOOM_Y2-6, }; //----------- Define static variables ----------// static VBrowseIF browse_caravan, browse_ship; //----------- Define static functions ----------// static void create_caravan_list(); static void create_ship_list(); static void put_caravan_rec(int recNo, int x, int y, int refreshFlag); static void put_ship_rec(int recNo, int x, int y, int refreshFlag); static void disp_total(); static void put_stop_info(int x, int y, TradeStop* tradeStop); static int sort_unit( const void *a, const void *b ); //--------- Begin of function Info::disp_trade ---------// // void Info::disp_trade(int refreshFlag) { create_caravan_list(); create_ship_list(); //-------- display the caravan browser --------// int x=CARAVAN_BROWSE_X1+9; int y=CARAVAN_BROWSE_Y1+4; vga_back.d3_panel_up(CARAVAN_BROWSE_X1, CARAVAN_BROWSE_Y1, CARAVAN_BROWSE_X2, CARAVAN_BROWSE_Y1+20 ); font_san.put( x , y, "Caravan" ); #if(defined(FRENCH)) font_san.put( x+75 , y, "Hit Points" ); #else font_san.put( x+90 , y, "Hit Points" ); #endif font_san.put( x+160, y, "Stop 1" ); font_san.put( x+220, y, "Stop 2" ); font_san.put( x+280, y, "Stop 3" ); font_san.put( x+340, y, "Goods Carried" ); if( refreshFlag == INFO_REPAINT ) { browse_caravan.init( CARAVAN_BROWSE_X1, CARAVAN_BROWSE_Y1+22, CARAVAN_BROWSE_X2, CARAVAN_BROWSE_Y2-20, 0, 16, report_array.size(), put_caravan_rec, 1 ); browse_caravan.open(browse_caravan_recno); } else { browse_caravan.paint(); browse_caravan.open(browse_caravan_recno, report_array.size()); } //-------- display the ship browser ---------// x=SHIP_BROWSE_X1+9; y=SHIP_BROWSE_Y1+4; vga_back.d3_panel_up(SHIP_BROWSE_X1, SHIP_BROWSE_Y1, SHIP_BROWSE_X2, SHIP_BROWSE_Y1+20 ); font_san.put( x , y, "Ship" ); #if(defined(FRENCH)) font_san.put( x+75 , y, "Hit Points" ); #else font_san.put( x+90 , y, "Hit Points" ); #endif #if(defined(FRENCH)) font_san.put( x+160, y, "Escale 1" ); font_san.put( x+220, y, "Escale 2" ); font_san.put( x+280, y, "Escale 3" ); #else font_san.put( x+160, y, "Stop 1" ); font_san.put( x+220, y, "Stop 2" ); font_san.put( x+280, y, "Stop 3" ); #endif font_san.put( x+340, y, "Goods Carried" ); if( refreshFlag == INFO_REPAINT ) { browse_ship.init( SHIP_BROWSE_X1, SHIP_BROWSE_Y1+22, SHIP_BROWSE_X2, SHIP_BROWSE_Y2-20, 0, 16, report_array2.size(), put_ship_rec, 1 ); browse_ship.open(browse_ship_recno); } else { browse_ship.paint(); browse_ship.open(browse_ship_recno, report_array2.size()); } //------------ display total -------------// disp_total(); } //----------- End of function Info::disp_trade -----------// //--------- Begin of function Info::detect_trade ---------// // void Info::detect_trade() { //-------- detect the caravan browser ---------// if( browse_caravan.detect() ) { browse_caravan_recno = browse_caravan.recno(); if( browse_caravan.double_click ) { Unit* unitPtr = unit_array[ get_report_data(browse_caravan_recno) ]; world.go_loc(unitPtr->next_x_loc(), unitPtr->next_y_loc(), 1); } } //-------- detect the ship browser ---------// if( browse_ship.detect() ) { browse_ship_recno = browse_ship.recno(); if( browse_ship.double_click ) { Unit* unitPtr = unit_array[ get_report_data2(browse_ship_recno) ]; world.go_loc(unitPtr->next_x_loc(), unitPtr->next_y_loc(), 1); } } } //----------- End of function Info::detect_trade -----------// //-------- Begin of static function disp_total --------// static void disp_total() { //------- display caravan total --------// int x=CARAVAN_BROWSE_X1+9; int y=CARAVAN_BROWSE_Y2-16; vga_back.d3_panel_up(CARAVAN_BROWSE_X1, CARAVAN_BROWSE_Y2-18, CARAVAN_BROWSE_X2, CARAVAN_BROWSE_Y2 ); String str; if( info.report_array.size() > 1 ) str = "Total Caravans"; else str = "Total Caravan"; str = translate.process(str); str += ": "; str += info.report_array.size(); font_san.put( x, y, str ); //-------- display ship total --------// x=SHIP_BROWSE_X1+9; y=SHIP_BROWSE_Y2-16; vga_back.d3_panel_up(SHIP_BROWSE_X1, SHIP_BROWSE_Y2-18, SHIP_BROWSE_X2, SHIP_BROWSE_Y2 ); if( info.report_array2.size() > 1 ) str = "Total Ships"; else str = "Total Ship"; str = translate.process(str); str += ": "; str += info.report_array2.size(); font_san.put( x, y, str ); } //----------- End of static function disp_total -----------// //-------- Begin of static function create_caravan_list --------// // static void create_caravan_list() { int totalUnit = unit_array.size(); Unit* unitPtr; info.report_array.zap(); for( short unitRecno=1 ; unitRecno<=totalUnit ; unitRecno++ ) { if( unit_array.is_deleted(unitRecno) ) continue; unitPtr = unit_array[unitRecno]; if( unitPtr->nation_recno == info.viewing_nation_recno && unitPtr->unit_id == UNIT_CARAVAN ) { info.report_array.linkin(&unitRecno); } } info.report_array.quick_sort(sort_unit); } //----------- End of static function create_caravan_list -----------// //-------- Begin of static function create_ship_list --------// // static void create_ship_list() { int totalUnit = unit_array.size(); Unit* unitPtr; info.report_array2.zap(); for( short unitRecno=1 ; unitRecno<=totalUnit ; unitRecno++ ) { if( unit_array.is_deleted(unitRecno) ) continue; unitPtr = unit_array[unitRecno]; if( unitPtr->nation_recno == info.viewing_nation_recno && unit_res[unitPtr->unit_id]->carry_goods_capacity > 0 ) { info.report_array2.linkin(&unitRecno); } } info.report_array2.quick_sort(sort_unit); } //----------- End of static function create_ship_list -----------// //-------- Begin of static function put_caravan_rec --------// // static void put_caravan_rec(int recNo, int x, int y, int refreshFlag) { int unitRecno = info.get_report_data(recNo); UnitCaravan* unitPtr = (UnitCaravan*) unit_array[unitRecno]; int x2 = x+browse_caravan.rec_width-3; //---------- display info ----------// x+=3; y+=3; String str; str = (int) unitPtr->hit_points; str += "/"; str += unitPtr->max_hit_points; font_san.put( x , y, unitPtr->unit_name() ); font_san.put( x+90 , y, str ); //------- display pick up type of each stop -------// if( unitPtr->stop_defined_num >= 1 ) put_stop_info( x+160, y, unitPtr->stop_array ); if( unitPtr->stop_defined_num >= 2 ) put_stop_info( x+220, y, unitPtr->stop_array+1 ); if( unitPtr->stop_defined_num >= 3 ) put_stop_info( x+280, y, unitPtr->stop_array+2 ); //------- display goods carried -------// x += 340; char *bitmapPtr; int i; for(i=0; iraw_qty_array[i]==0 ) continue; bitmapPtr = raw_res.small_raw_icon(i+1); vga_back.put_bitmap( x, y, bitmapPtr ); font_san.disp( x+14, y-1, unitPtr->raw_qty_array[i], 1, x+45 ); x+=36; if( x+36 > x2 ) return; } for( i=0; iproduct_raw_qty_array[i]==0 ) continue; bitmapPtr = raw_res.small_product_icon(i+1); vga_back.put_bitmap( x, y, bitmapPtr ); font_san.disp( x+14, y-1, unitPtr->product_raw_qty_array[i], 1, x+45 ); x+=36; if( x+36 > x2 ) return; } } //----------- End of static function put_caravan_rec -----------// //-------- Begin of static function put_ship_rec --------// // static void put_ship_rec(int recNo, int x, int y, int refreshFlag) { int unitRecno = info.get_report_data2(recNo); UnitMarine* unitPtr = (UnitMarine*) unit_array[unitRecno]; int x2 = x+browse_ship.rec_width-3; //---------- display info ----------// x+=3; y+=3; String str; str = (int) unitPtr->hit_points; str += "/"; str += unitPtr->max_hit_points; font_san.put( x , y, unitPtr->unit_name() ); font_san.put( x+90 , y, str ); //------- display pick up type of each stop -------// if( unitPtr->stop_defined_num >= 1 ) put_stop_info( x+160, y, unitPtr->stop_array ); if( unitPtr->stop_defined_num >= 2 ) put_stop_info( x+220, y, unitPtr->stop_array+1 ); if( unitPtr->stop_defined_num >= 3 ) put_stop_info( x+280, y, unitPtr->stop_array+2 ); //------- display goods carried -------// x += 340; char *bitmapPtr; int i; for(i=0; iraw_qty_array[i]==0 ) continue; bitmapPtr = raw_res.small_raw_icon(i+1); vga_back.put_bitmap( x, y, bitmapPtr ); font_san.disp( x+14, y-1, unitPtr->raw_qty_array[i], 1, x+45 ); x+=36; if( x+36 > x2 ) return; } for( i=0; iproduct_raw_qty_array[i]==0 ) continue; bitmapPtr = raw_res.small_product_icon(i+1); vga_back.put_bitmap( x, y, bitmapPtr ); font_san.disp( x+14, y-1, unitPtr->product_raw_qty_array[i], 1, x+45 ); x+=36; if( x+36 > x2 ) return; } } //----------- End of static function put_ship_rec -----------// //-------- Begin of static function put_stop_info --------// // static void put_stop_info(int x, int y, TradeStop* tradeStop) { int x2=x+58; //----- display the color of the stop ----// if( firm_array.is_deleted(tradeStop->firm_recno) ) return; Firm* firmPtr = firm_array[tradeStop->firm_recno]; nation_array[firmPtr->nation_recno]->disp_nation_color( x, y ); x+=15; //------ display pick up type icon ------// int i, pickUpType = tradeStop->pick_up_type; switch( pickUpType ) { case AUTO_PICK_UP: vga_back.put_bitmap( x, y, image_icon.get_ptr("AUTOPICK") ); break; case NO_PICK_UP: vga_back.put_bitmap( x, y, image_icon.get_ptr("NOPICK") ); break; default: for( i=PICK_UP_RAW_FIRST ; i<=PICK_UP_RAW_LAST ; i++ ) { if( tradeStop->pick_up_array[i-1] ) { vga_back.put_bitmap( x, y, raw_res.small_raw_icon(i-PICK_UP_RAW_FIRST+1) ); x+=10; if( x+10 > x2 ) return; } } for( i=PICK_UP_PRODUCT_FIRST ; i<=PICK_UP_PRODUCT_LAST ; i++ ) { if( tradeStop->pick_up_array[i-1] ) { vga_back.put_bitmap( x, y, raw_res.small_product_icon(i-PICK_UP_PRODUCT_FIRST+1) ); x+=12; if( x+10 > x2 ) return; } } } } //----------- End of static function put_stop_info -----------// //------ Begin of function sort_unit ------// // static int sort_unit( const void *a, const void *b ) { Unit* unitPtr1 = (Unit*) unit_array[*((short*)a)]; Unit* unitPtr2 = (Unit*) unit_array[*((short*)b)]; return unitPtr1->name_id - unitPtr2->name_id; } //------- End of function sort_unit ------//