/* * 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 : OF_HARB.CPP //Description : Firm Harbor #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //------------- Define coordinations -----------// enum { SHIP_BROWSE_X1 = INFO_X1, SHIP_BROWSE_Y1 = INFO_Y1+54, SHIP_BROWSE_X2 = INFO_X2, SHIP_BROWSE_Y2 = SHIP_BROWSE_Y1+100 }; enum { SHIP_DET_X1 = INFO_X1, SHIP_DET_Y1 = SHIP_BROWSE_Y2+5, SHIP_DET_X2 = INFO_X2, SHIP_DET_Y2 = SHIP_DET_Y1+92 }; //---------- Define constant ------------// enum { HARBOR_MENU_MAIN, HARBOR_MENU_BUILD, }; // ######## begin Gilbert 22/9 #######// #define BUILD_BUTTON_WIDTH 205 #define BUILD_BUTTON_HEIGHT 48 #define COUNT_BUTTON_OFFSET_X 160 #define COUNT_BUTTON_OFFSET_Y 8 // ######## end Gilbert 22/9 #######// #define COUNT_BUTTON_WIDTH 32 #define COUNT_BUTTON_HEIGHT 32 //----------- Define static variables ----------// static VBrowseIF browse_ship; static Button3D button_build, button_sail; static Button3D button_cancel_build; static ButtonGroup button_mode(2); // ###### begin Gilbert 20/9 #######// // static short button_unit_id[MAX_SHIP_TYPE]; static ButtonCustom button_ship[MAX_SHIP_TYPE]; static ButtonCustom button_queue_ship[MAX_SHIP_TYPE]; // ###### end Gilbert 20/9 #######// static int added_count; static ButtonCustom button_cancel; static int last_ship_count; static FirmHarbor* firm_harbor_ptr; static char harbor_menu_mode; static char disable_refresh=0; static char ship_disp_mode=SHIP_MENU_UNIT; //----------- Define static functions ----------// static void put_ship_rec(int recNo, int x, int y, int refreshFlag); static void i_disp_build_button(ButtonCustom *button, int); static void i_disp_queue_button(ButtonCustom *button, int); //--------- Begin of function FirmHarbor::FirmHarbor ---------// // FirmHarbor::FirmHarbor() { ship_count = 0; build_unit_id = 0; build_queue_count = 0; land_region_id = 0; sea_region_id = 0; link_checked = 0; linked_mine_num = linked_factory_num = linked_market_num = 0; memset(linked_mine_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); memset(linked_factory_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); memset(linked_market_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); } //----------- End of function FirmHarbor::FirmHarbor -----------// //--------- Begin of function FirmHarbor::deinit_derived ---------// // void FirmHarbor::deinit_derived() { int shipUnitRecno; for( int i=ship_count ; i>0 ; i-- ) { shipUnitRecno = ship_recno_array[i-1]; //---- mobilize ships in the harbor ----// sail_ship( shipUnitRecno, COMMAND_AUTO ); //--- if the ship does not sailed out due to no limit sea space, delete it ---// if( ship_count==i ) { del_hosted_ship(shipUnitRecno); unit_array.del(shipUnitRecno); } } } //----------- End of function FirmHarbor::deinit_derived() -----------// //--------- Begin of function FirmHarbor::init ---------// // void FirmHarbor::init(int xLoc, int yLoc, int nationRecno, int firmId, char* buildCode, short builderRecno) { // ignore raceId and find north, south, west or east harbor if( world.get_loc(xLoc+1, yLoc+2)->can_build_harbor(1) ) { // check north harbour Firm::init(xLoc, yLoc, nationRecno, firmId, "N", builderRecno); land_region_id = world.get_loc(xLoc+1, yLoc+2)->region_id; sea_region_id = world.get_loc(xLoc+1, yLoc)->region_id; } else if( world.get_loc(xLoc+1, yLoc)->can_build_harbor(1) ) { // check south harbour Firm::init(xLoc, yLoc, nationRecno, firmId, "S", builderRecno); land_region_id = world.get_loc(xLoc+1, yLoc)->region_id; sea_region_id = world.get_loc(xLoc+1, yLoc+2)->region_id; } else if( world.get_loc(xLoc+2, yLoc+1)->can_build_harbor(1) ) { // check west harbour Firm::init(xLoc, yLoc, nationRecno, firmId, "W", builderRecno); land_region_id = world.get_loc(xLoc+2, yLoc+1)->region_id; sea_region_id = world.get_loc(xLoc, yLoc+1)->region_id; } else if( world.get_loc(xLoc, yLoc+1)->can_build_harbor(1) ) { // check east harbour Firm::init(xLoc, yLoc, nationRecno, firmId, "E", builderRecno); land_region_id = world.get_loc(xLoc, yLoc+1)->region_id; sea_region_id = world.get_loc(xLoc+2, yLoc+1)->region_id; } else { err_here(); } region_id = land_region_id; // set region_id to land_region_id //------- update the harbor count of the regions ------// region_array.update_region_stat(); } //----------- End of function FirmHarbor::init -----------// //------- Begin of function FirmHarbor::assign_unit -----------// // void FirmHarbor::assign_unit(int unitRecno) { //------- if this is a construction worker -------// if( unit_array[unitRecno]->skill.skill_id == SKILL_CONSTRUCTION ) { set_builder(unitRecno); return; } //---------------------------------------// //if( ship_count==MAX_SHIP_IN_HARBOR ) // return; if(ship_count + (build_unit_id>0) == MAX_SHIP_IN_HARBOR) return; // leave a room for the building unit add_hosted_ship(unitRecno); unit_array[unitRecno]->deinit_sprite(); UnitMarine *unitPtr = (UnitMarine*) unit_array[unitRecno]; unitPtr->extra_move_in_beach = NO_EXTRA_MOVE; unitPtr->deinit_sprite(); //------------------------------------------------// if( firm_array.selected_recno == firm_recno ) info.disp(); } //--------- End of function FirmHarbor::assign_unit -----------// //--------- Begin of function FirmHarbor::next_day ---------// // void FirmHarbor::next_day() { //----- call next_day() of the base class -----// Firm::next_day(); //------- process building -------// if( build_unit_id ) process_build(); else process_queue(); //-*********** simulate ship movement ************-// //if(build_unit_id==0) // build_ship(UNIT_CARAVEL, 0); //-*********** simulate ship movement ************-// } //----------- End of function FirmHarbor::next_day -----------// //--------- Begin of function FirmHarbor::put_info ---------// // void FirmHarbor::put_info(int refreshFlag) { if( refreshFlag==INFO_REPAINT && !disable_refresh ) harbor_menu_mode = HARBOR_MENU_MAIN; switch( harbor_menu_mode ) { case HARBOR_MENU_MAIN: disp_main_menu(refreshFlag); break; case HARBOR_MENU_BUILD: disp_build_menu(refreshFlag); break; } } //----------- End of function FirmHarbor::put_info -----------// //--------- Begin of function FirmHarbor::detect_info ---------// // void FirmHarbor::detect_info() { switch( harbor_menu_mode ) { case HARBOR_MENU_MAIN: detect_main_menu(); break; case HARBOR_MENU_BUILD: detect_build_menu(); break; } } //----------- End of function FirmHarbor::detect_info -----------// //--------- Begin of function FirmHarbor::disp_main_menu ---------// // void FirmHarbor::disp_main_menu(int refreshFlag) { firm_harbor_ptr = this; disp_basic_info(INFO_Y1, refreshFlag); if( !should_show_harbor_info() ) return; //-------- display browser -----------// if( refreshFlag == INFO_REPAINT ) { browse_ship.init( SHIP_BROWSE_X1, SHIP_BROWSE_Y1, SHIP_BROWSE_X2, SHIP_BROWSE_Y2, 0, 25, ship_count, put_ship_rec ); browse_ship.open(1); put_det(INFO_REPAINT); } else { if( last_ship_count != ship_count ) { last_ship_count = ship_count; info.disp(); } else browse_ship.update(); // update only } last_ship_count = ship_count; //-------------------------------// if( !own_firm() ) return; //-------- display buttons ---------// if( refreshFlag == INFO_REPAINT ) { button_build.paint( SHIP_DET_X1, SHIP_DET_Y2+4, 'A', "MAKESHIP" ); button_sail.paint ( SHIP_DET_X1+BUTTON_ACTION_WIDTH, SHIP_DET_Y2+4, 'A', "SAILOUT" ); } if( ship_count > 0 ) button_sail.enable(); else button_sail.disable(); //------ display the info of the ship under construction ------// disp_build_info(refreshFlag); } //----------- End of function FirmHarbor::disp_main_menu -----------// //--------- Begin of function FirmHarbor::detect_main_menu ---------// // void FirmHarbor::detect_main_menu() { firm_harbor_ptr = this; if( detect_basic_info() ) return; if( !own_firm() ) return; if( browse_ship.detect() ) put_det(INFO_UPDATE); if( detect_det() ) return; //------- detect the build button ---------// if( button_build.detect() ) { harbor_menu_mode = HARBOR_MENU_BUILD; disable_refresh = 1; // static var for disp_info() only info.disp(); disable_refresh = 0; } //-------- detect the sail button ---------// if( button_sail.detect() && browse_ship.recno() > 0 ) sail_ship( ship_recno_array[browse_ship.recno()-1], COMMAND_PLAYER ); //---------- detect cancel build button -----------// if(build_unit_id) { if(button_cancel_build.detect()) { if( !remote.is_enable() ) cancel_build_unit(); else { short *shortPtr = (short *)remote.new_send_queue_msg(MSG_F_HARBOR_SKIP_SHIP, sizeof(short)); shortPtr[0] = firm_recno; } } } } //----------- End of function FirmHarbor::detect_main_menu -----------// //------- Begin of function FirmHarbor::should_show_harbor_info -------// // int FirmHarbor::should_show_harbor_info() { if( should_show_info() ) return 1; //--- if any of the ships in the harbor has the spies of the player ---// UnitMarine* unitMarine; for( int i=0 ; ishould_show_info() ) return 1; } return 0; } //------- End of function FirmHarbor::should_show_harbor_info ---------// //--------- Begin of function FirmHarbor::put_det ---------// // void FirmHarbor::put_det(int refreshFlag) { if( refreshFlag == INFO_REPAINT ) vga.d3_panel_up( SHIP_DET_X1, SHIP_DET_Y1, SHIP_DET_X2, SHIP_DET_Y2 ); else vga.blt_buf( SHIP_DET_X1, SHIP_DET_Y1, SHIP_DET_X2, SHIP_DET_Y2, 0 ); if( browse_ship.none_record ) return; refreshFlag = INFO_REPAINT; // for calling disp_ship_units() and disp_ship_goods() //------- display info of the ship --------// UnitMarine* shipUnitPtr = (UnitMarine*) unit_array[ ship_recno_array[browse_ship.recno()-1] ]; UnitInfo* shipUnitInfo = unit_res[shipUnitPtr->unit_id]; //----- if the ship can carry both goods and units, display mode selection button ---// if( shipUnitInfo->carry_goods_capacity > 0 && shipUnitInfo->carry_unit_capacity > 0 ) { button_mode[0].create_text( SHIP_DET_X1+10, SHIP_DET_Y1+3, SHIP_DET_X1+80, SHIP_DET_Y1+19, "Units" ); button_mode[1].create_text( SHIP_DET_X1+90, SHIP_DET_Y1+3, SHIP_DET_X2-10, SHIP_DET_Y1+19, "Goods" ); button_mode.paint(ship_disp_mode); if( ship_disp_mode == SHIP_MENU_UNIT ) disp_ship_units(shipUnitPtr, SHIP_DET_Y1+22, refreshFlag); else disp_ship_goods(shipUnitPtr, SHIP_DET_Y1+22, refreshFlag); } else if( shipUnitInfo->carry_goods_capacity > 0 ) { disp_ship_goods(shipUnitPtr, SHIP_DET_Y1+22, refreshFlag); } else if( shipUnitInfo->carry_unit_capacity > 0 ) { disp_ship_units(shipUnitPtr, SHIP_DET_Y1+22, refreshFlag); } } //----------- End of function FirmHarbor::put_det -----------// //--------- Begin of function FirmHarbor::detect_det ---------// // int FirmHarbor::detect_det() { if( browse_ship.none_record ) return 0; UnitMarine* shipUnitPtr = (UnitMarine*) unit_array[ ship_recno_array[browse_ship.recno()-1] ]; UnitInfo* shipUnitInfo = unit_res[shipUnitPtr->unit_id]; if( shipUnitInfo->carry_goods_capacity > 0 && shipUnitInfo->carry_unit_capacity > 0 ) { if( button_mode.detect() >= 0 ) { ship_disp_mode = button_mode.button_pressed; vga.blt_buf( SHIP_DET_X1, SHIP_DET_Y1+22, SHIP_DET_X2, SHIP_DET_Y2, 0 ); put_det(INFO_UPDATE); return 1; } } return 0; } //----------- End of function FirmHarbor::detect_det -----------// //--------- Begin of function FirmHarbor::disp_ship_goods ---------// // // Display goods carried by the selected ship. // void FirmHarbor::disp_ship_goods(UnitMarine* shipUnit, int dispY1, int refreshFlag) { int x=INFO_X1+20, y=dispY1+5; String str; int i; for(i=0; iraw_qty_array[i], 1, x+59 ); } x =INFO_X1+20; y+=19; for( i=0; iproduct_raw_qty_array[i], 1, x+59 ); } } //---------- End of function FirmHarbor::disp_ship_goods ----------// //--------- Begin of function FirmHarbor::disp_ship_units ---------// // void FirmHarbor::disp_ship_units(UnitMarine* shipUnit, int dispY1, int refreshFlag) { //------ display population composition -------// int x, y; Unit* unitPtr; static short last_unit_race_array[MAX_UNIT_IN_SHIP]; dispY1+=5; for( int i=0 ; iunit_count ) { unitPtr = unit_array[ shipUnit->unit_recno_array[i] ]; if( refreshFlag==INFO_REPAINT || last_unit_race_array[i] != unitPtr->race_id ) { vga_front.d3_panel_up( x, y, x+27, y+23, 1 ); // ####### begin Gilbert 17/10 ##########// vga_front.put_bitmap(x+2, y+2, unit_res[unitPtr->unit_id]->get_small_icon_ptr(unitPtr->rank_id)); // ####### end Gilbert 17/10 ##########// } //------- set help parameters ---------// if( mouse.in_area(x, y, x+27, y+23) ) help.set_unit_help( unitPtr->unit_id, 0, x, y, x+27, y+23 ); //------------------------------------// last_unit_race_array[i] = unitPtr->race_id; } else { if( last_unit_race_array[i] != 0 ) { vga.blt_buf( x-2, y-2, x+36, y+25, 0 ); last_unit_race_array[i] = 0; } } } } //----------- End of function FirmHarbor::disp_ship_units -----------// //--------- Begin of function FirmHarbor::disp_build_menu ---------// // void FirmHarbor::disp_build_menu(int refreshFlag) { // ###### begin Gilbert 20/9 ######// if( refreshFlag == INFO_UPDATE ) { for( int b=0; bunit_class == UNIT_CLASS_SHIP ) { if( unit_res[unitId]->get_nation_tech_level(nation_recno) > 0 ) { // disp_build_button( y, unitId, 1); button_queue_ship[added_count].create(x+COUNT_BUTTON_OFFSET_X, y+COUNT_BUTTON_OFFSET_Y, x+COUNT_BUTTON_OFFSET_X+COUNT_BUTTON_WIDTH-1, y+COUNT_BUTTON_OFFSET_Y+COUNT_BUTTON_HEIGHT-1, i_disp_queue_button, ButtonCustomPara(this, unitId) ); button_ship[added_count].paint(x, y, x+BUILD_BUTTON_WIDTH-1, y+BUILD_BUTTON_HEIGHT-1, i_disp_build_button, ButtonCustomPara(&button_queue_ship[added_count], unitId) ); err_when(added_count >= MAX_SHIP_TYPE); // button_unit_id[added_count++] = unitId; added_count++; y += BUILD_BUTTON_HEIGHT; } } } button_cancel.paint(x, y, x+BUILD_BUTTON_WIDTH-1, y+BUILD_BUTTON_HEIGHT*3/4, ButtonCustom::disp_text_button_func, ButtonCustomPara((void*)"Done",0) ); } // ###### end Gilbert 20/9 ######// } //----------- End of function FirmHarbor::disp_build_menu -----------// // ####### begin Gilbert 20/9 ########// /* //--------- Begin of function FirmHarbor::disp_build_button ---------// void FirmHarbor::disp_build_button(int y, int unitId, int buttonUp) { int x; int y0 = y; if(buttonUp) { vga.d3_panel_up(INFO_X1, y, INFO_X2-1, y+BUILD_BUTTON_HEIGHT-2); x = INFO_X1; } else { vga.d3_panel_down(INFO_X1, y, INFO_X2-1, y+BUILD_BUTTON_HEIGHT-2); x = INFO_X1+1; y++; } // display unit large icon UnitInfo* unitInfo = unit_res[unitId]; vga_front.put_bitmap(x+6, y+4, unitInfo->get_large_icon_ptr(0)); //-------- display unit name --------// String str; str = unitInfo->name; font_bible.put( x+60, y+14, str ); disp_queue_button(y0+COUNT_BUTTON_OFFSET_Y, unitId, 1); } //----------- End of function FirmHarbor::disp_build_button -----------// */ //-------- Begin of function i_disp_build_button --------// // static void i_disp_build_button(ButtonCustom *button, int repaintBody) { int x1 = button->x1; int y1 = button->y1; int x2 = button->x2; int y2 = button->y2; if( !button->pushed_flag ) { if( repaintBody ) { vga.blt_buf(x1, y1, x2, y2, 0); vga.d3_panel2_up( x1, y1, x2, y2, 1 ); } x2--; y2--; } else { if( repaintBody ) { vga.blt_buf(x1, y1, x2, y2, 0); vga.d3_panel2_down( x1, y1, x2, y2, 1 ); } x1++; y1++; } ButtonCustom *queueButton = (ButtonCustom *)button->custom_para.ptr; if( repaintBody) { // display unit large icon short unitId = button->custom_para.value; UnitInfo* unitInfo = unit_res[unitId]; vga_front.put_bitmap(x1+6, y1+4, unitInfo->get_large_icon_ptr(0)); err_when( button->custom_para.value != queueButton->custom_para.value); //-------- display unit name --------// String str; str = unitInfo->name; if( unitInfo->unit_class == UNIT_CLASS_WEAPON ) // add version no. { FirmHarbor *harbor = (FirmHarbor *)queueButton->custom_para.ptr; int techLevel = unitInfo->get_nation_tech_level(harbor->nation_recno); if( techLevel > 1 ) { str += " "; str += m.roman_number(techLevel); } } font_bible.put( x1+60, y1+13, str ); } // display small button queueButton->paint(-1, repaintBody); } //--------- End of static function i_disp_build_button ---------// /* //--------- Begin of function FirmHarbor::disp_queue_button ---------// void FirmHarbor::disp_queue_button(int y, int unitId, int buttonUp) { //----- count the no. of units queued for this ship ------// int x=INFO_X1+2+COUNT_BUTTON_OFFSET_X; int queuedCount=0; for(int i=0; icustom_para.ptr; int x1 = button->x1; int y1 = button->y1; int x2 = button->x2; int y2 = button->y2; if( !button->pushed_flag ) { if( repaintBody ) { vga.blt_buf(x1, y1, x2, y2, 0); vga.d3_panel2_up( x1, y1, x2, y2, 1, 1); } x2--; y2--; } else { if( repaintBody ) { vga.blt_buf(x1, y1, x2, y2, 0); vga.d3_panel2_down( x1, y1, x2, y2, 1, 1); } x1++; y1++; } //----- count the no. of units queued for this weapon ------// short unitId = button->custom_para.value; int queuedCount=0; for( int i=0 ; ibuild_queue_count ; i++ ) { if( harbor->build_queue_array[i] == unitId ) queuedCount++; } if( harbor->build_unit_id == unitId) queuedCount++; font_mid.center_put( x1+3, y1+3, x2-3, y2-3, m.format(queuedCount), 1); } //--------- End of static function i_disp_queue_button ---------// // ####### end Gilbert 20/9 #######// //--------- Begin of function FirmHarbor::detect_build_menu ---------// // void FirmHarbor::detect_build_menu() { int unitId, x=INFO_X1+2, y=INFO_Y1, rc, quitFlag; UnitInfo* unitInfo; for(int b=0; b 0 ) { if( rc==1 ) // left button { if( remote.is_enable() ) { // packet structure : short *shortPtr = (short *)remote.new_send_queue_msg(MSG_F_HARBOR_BUILD_SHIP, 2*sizeof(short) ); shortPtr[0] = firm_recno; shortPtr[1] = unitId; } else add_queue(unitId); // ##### begin Gilbert 25/9 ######// se_ctrl.immediate_sound("TURN_ON"); // ##### end Gilbert 25/9 ######// } else // right button - remove queue { if( remote.is_enable() ) { // packet structure : short *shortPtr = (short *)remote.new_send_queue_msg(MSG_F_HARBOR_BUILD_SHIP, 2*sizeof(short) ); shortPtr[0] = firm_recno; shortPtr[1] = -unitId; } else remove_queue(unitId); // ##### begin Gilbert 25/9 ######// se_ctrl.immediate_sound("TURN_OFF"); // ##### end Gilbert 25/9 ######// } if( quitFlag ) info.disp(); // info.disp() will call put_info() which will switch mode back to the main menu mode else // ######## begin Gilbert 20/9 ########// // disp_queue_button(y+COUNT_BUTTON_OFFSET_Y, unitId, 1); info.update(); // ######## end Gilbert 20/9 ########// return; } y += BUILD_BUTTON_HEIGHT; } //------ detect the cancel button --------// if( button_cancel.detect() || mouse.any_click(1) ) // press the cancel button or right click { harbor_menu_mode = HARBOR_MENU_MAIN; info.disp(); // ###### begin Gilbert 26/9 #######// se_ctrl.immediate_sound("TURN_OFF"); // ###### end Gilbert 26/9 #######// } } //----------- End of function FirmHarbor::detect_build_menu -----------// //--------- Begin of function FirmHarbor::build_ship ---------// // void FirmHarbor::build_ship(int unitId, char) { if(ship_count>=MAX_SHIP_IN_HARBOR) return; Nation* nationPtr = nation_array[nation_recno]; if( nationPtr->cash < unit_res[unitId]->build_cost ) return; nationPtr->add_expense( EXPENSE_SHIP, unit_res[unitId]->build_cost); build_unit_id = unitId; start_build_frame_no = sys.frame_count; } //----------- End of function FirmHarbor::build_ship -----------// //--------- Begin of function FirmHarbor::sail_ship ---------// // void FirmHarbor::sail_ship(int unitRecno, char remoteAction) { if( !remoteAction && remote.is_enable() ) { // packet structure : short *shortPtr = (short *)remote.new_send_queue_msg(MSG_F_HARBOR_SAIL_SHIP, 2*sizeof(short) ); shortPtr[0] = firm_recno; shortPtr[1] = unitRecno; return; } //----- get the browse recno of the ship in the harbor's ship_recno_array[] ----// int browseRecno=0; for( int i=0 ; iunit_mode != UNIT_MODE_IN_HARBOR || unitPtr->unit_mode_para != firm_recno ); SpriteInfo* spriteInfo = unitPtr->sprite_info; int xLoc=loc_x1; // xLoc & yLoc are used for returning results int yLoc=loc_y1; if(!world.locate_space(xLoc, yLoc, loc_x2, loc_y2, spriteInfo->loc_width, spriteInfo->loc_height, UNIT_SEA, sea_region_id)) return; unitPtr->init_sprite(xLoc, yLoc); del_hosted_ship(ship_recno_array[browseRecno-1]); //-------- selected the ship --------// if( firm_array.selected_recno == firm_recno && nation_recno == nation_array.player_recno ) { power.reset_selection(); unitPtr->selected_flag = 1; unit_array.selected_recno = unitPtr->sprite_recno; unit_array.selected_count = 1; info.disp(); } } //----------- End of function FirmHarbor::sail_ship -----------// //--------- Begin of function FirmHarbor::disp_build_info ---------// // void FirmHarbor::disp_build_info(int refreshFlag) { if( !build_unit_id || nation_recno!=nation_array.player_recno ) return; int dispY1 = INFO_Y1+26; int x=MSG_X1+3, y=MSG_Y1+3; if( refreshFlag == INFO_REPAINT ) { vga.d3_panel_up( MSG_X1, MSG_Y1, MSG_X2, MSG_Y2 ); vga.d3_panel_down(x, y, x+UNIT_SMALL_ICON_WIDTH+3, y+UNIT_SMALL_ICON_HEIGHT+3 ); vga_front.put_bitmap(x+2, y+2, unit_res[build_unit_id]->get_small_icon_ptr(RANK_SOLDIER) ); } vga_front.indicator( 0, x+UNIT_SMALL_ICON_WIDTH+6, y, (float)(sys.frame_count-start_build_frame_no), (float)unit_res[build_unit_id]->build_days * FRAMES_PER_DAY, VGA_GRAY ); button_cancel_build.paint(MSG_X2-27, MSG_Y1+2, "V_X-U", "V_X-D"); button_cancel_build.set_help_code( "CANCELSHP" ); } //----------- End of function FirmHarbor::disp_build_info -----------// //--------- Begin of function FirmHarbor::process_build ---------// // void FirmHarbor::process_build() { int totalBuildDays = unit_res[build_unit_id]->build_days; err_when( !build_unit_id ); if( (int)(sys.frame_count-start_build_frame_no) / FRAMES_PER_DAY >= totalBuildDays ) { int unitRecno = unit_array.add_unit( build_unit_id, nation_recno ); add_hosted_ship(unitRecno); if( own_firm() ) se_res.far_sound(center_x, center_y, 1, 'F', firm_id, "FINS", 'S', unit_res[build_unit_id]->sprite_id); build_unit_id = 0; // ##### begin Gilbert 20/9 ########// if( firm_array.selected_recno == firm_recno ) { disable_refresh = 1; info.disp(); disable_refresh = 0; } // ##### end Gilbert 20/9 ########// //-*********** simulate ship movement ************-// //sail_ship(ship_recno_array[0], 0); //-*********** simulate ship movement ************-// } } //----------- End of function FirmHarbor::process_build -----------// //--------- Begin of function FirmHarbor::cancel_build_unit ---------// void FirmHarbor::cancel_build_unit() { build_unit_id = 0; if( firm_array.selected_recno == firm_recno ) { disable_refresh = 1; info.disp(); disable_refresh = 0; } } //----------- End of function FirmHarbor::cancel_build_unit -----------// //--------- Begin of function FirmHarbor::add_hosted_ship ---------// // void FirmHarbor::add_hosted_ship(int shipRecno) { err_when( ship_count == MAX_SHIP_IN_HARBOR ); ship_recno_array[ship_count++] = shipRecno; //---- set the unit_mode of the ship ----// err_when( firm_id != FIRM_HARBOR ); unit_array[shipRecno]->set_mode(UNIT_MODE_IN_HARBOR, firm_recno); //---------------------------------------// if( firm_recno == firm_array.selected_recno ) put_info(INFO_UPDATE); } //----------- End of function FirmHarbor::add_hosted_ship -----------// //--------- Begin of function FirmHarbor::del_hosted_ship ---------// // void FirmHarbor::del_hosted_ship(int delUnitRecno) { //---- reset the unit_mode of the ship ----// unit_array[delUnitRecno]->set_mode(0); //-----------------------------------------// int i; for( i=0 ; i MAX_SHIP_IN_HARBOR ); m.del_array_rec( ship_recno_array, ship_count, sizeof(ship_recno_array[0]), i+1 ); break; } } err_when( i==ship_count ); ship_count--; if( firm_recno == firm_array.selected_recno ) put_info(INFO_UPDATE); } //----------- End of function FirmHarbor::del_hosted_ship -----------// //--------- Begin of function FirmHarbor::update_linked_firm_info ---------// // Note: when ai is finished, ai_link_checked may be used as am indicator // for link_checked. Performance should be improved in this way. // void FirmHarbor::update_linked_firm_info() { if(link_checked) return; // no need to check again linked_mine_num = linked_factory_num = linked_market_num = 0; memset(linked_mine_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); memset(linked_factory_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); memset(linked_market_array, 0, sizeof(short)*MAX_LINKED_FIRM_FIRM); Firm *firmPtr; Nation *nationPtr; for(int i=linked_firm_count-1; i>=0; i--) { if(linked_firm_enable_array[i]!=LINK_EE) continue; firmPtr = firm_array[linked_firm_array[i]]; if(!nation_array[nation_recno]->get_relation(firmPtr->nation_recno)->trade_treaty) continue; switch(firmPtr->firm_id) { case FIRM_MINE: nationPtr = nation_array[firmPtr->nation_recno]; //if(nationPtr->get_relation_status(nation_recno)<=NATION_TENSE) // continue; linked_mine_array[linked_mine_num] = firmPtr->firm_recno; linked_mine_num++; break; case FIRM_FACTORY: nationPtr = nation_array[firmPtr->nation_recno]; //if(nationPtr->get_relation_status(nation_recno)<=NATION_TENSE) // continue; linked_factory_array[linked_factory_num] = firmPtr->firm_recno; linked_factory_num++; break; case FIRM_MARKET: nationPtr = nation_array[firmPtr->nation_recno]; //if(nationPtr->get_relation_status(nation_recno)<=NATION_TENSE) // continue; linked_market_array[linked_market_num] = firmPtr->firm_recno; linked_market_num++; break; } } } //----------- End of function FirmHarbor::update_linked_firm_info -----------// //--------- Begin of function FirmHarbor::process_queue ---------// void FirmHarbor::process_queue() { if(build_queue_count>0) { build_ship(build_queue_array[0], COMMAND_AUTO); // remove the queue no matter build_ship success or not m.del_array_rec( build_queue_array, build_queue_count, sizeof(build_queue_array[0]), 1 ); build_queue_count--; if( firm_array.selected_recno == firm_recno ) { disable_refresh = 1; info.disp(); disable_refresh = 0; } } } //----------- End of function FirmHarbor::process_queue -----------// //--------- Begin of function FirmHarbor::add_queue ---------// void FirmHarbor::add_queue(int unitId) { if( build_queue_count+(build_unit_id>0)==MAX_BUILD_SHIP_QUEUE ) return; build_queue_array[build_queue_count++] = unitId; } //----------- End of function FirmHarbor::add_queue -----------// //--------- Begin of function FirmHarbor::remove_queue ---------// void FirmHarbor::remove_queue(int unitId) { for( int i=build_queue_count-1 ; i>=0 ; i-- ) { if( build_queue_array[i] == unitId ) { err_when( build_queue_count > MAX_BUILD_SHIP_QUEUE ); m.del_array_rec( build_queue_array, build_queue_count, sizeof(build_queue_array[0]), i+1 ); build_queue_count--; return; } } if(build_unit_id==unitId) cancel_build_unit(); } //----------- End of function FirmHarbor::remove_queue -----------// //-------- Begin of static function put_ship_rec --------// // static void put_ship_rec(int recNo, int x, int y, int refreshFlag) { UnitMarine* unitPtr = (UnitMarine*) unit_array[ firm_harbor_ptr->ship_recno_array[recNo-1] ]; UnitInfo* unitInfo = unit_res[unitPtr->unit_id]; //-------- display unit icon -------// vga_front.d3_panel_down(x+1, y+1, x+UNIT_SMALL_ICON_WIDTH+4, y+UNIT_SMALL_ICON_HEIGHT+4, 2, 0 ); // ###### begin Gilbert 17/10 #######// vga_front.put_bitmap(x+3, y+3, unit_res[unitPtr->unit_id]->get_small_icon_ptr(unitPtr->rank_id) ); // ###### end Gilbert 17/10 #######// y+=6; //---------- display unit name ----------// font_san.put( x+32 , y, unitInfo->name, 1, x+119 ); // 1-use short words //------- display unit hit points -------// String str; str = (int) unitPtr->hit_points; str += "/"; str += unitPtr->max_hit_points; font_san.put( x+125, y, str, 1, x+browse_ship.rec_width-3 ); } //----------- End of static function put_ship_rec -----------//