/* * 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 : OFIRMIF.CPP //Description : Firm interface routines #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //---------- Define static variables ------------// static Button3D button_sell, button_destruct, button_builder; static short pop_disp_y1; //---------- Declare static function ------------// static void disp_worker_hit_points(int x1, int y1, int x2, int hitPoints, int maxHitPoints); //--------- Begin of function Firm::disp_info_both ---------// // void Firm::disp_info_both(int refreshFlag) { static char lastUnderConstruction; static short lastFirmRecno; static char lastShouldShowInfo; static short lastPlayerSpyCount; //------ check if under_construction has been changed -----// if( lastUnderConstruction != under_construction ) { lastUnderConstruction = under_construction; if( refreshFlag == INFO_UPDATE ) info.disp(); // refresh the display } //--------------------------------------------// if( under_construction ) { disp_basic_info(INFO_Y1, refreshFlag); if( refreshFlag == INFO_REPAINT ) font_san.d3_put( INFO_X1, INFO_Y1+54, INFO_X2, INFO_Y1+74, "Under Construction" ); } else { //------ check if should_show_info() has been changed -----// int shouldShowInfo = should_show_info(); if( shouldShowInfo != lastShouldShowInfo || player_spy_count != lastPlayerSpyCount ) { lastShouldShowInfo = shouldShowInfo; lastPlayerSpyCount = player_spy_count; if( refreshFlag == INFO_UPDATE ) { info.disp(); return; } } //----------------------------------------// if( lastFirmRecno != firm_recno || (firm_menu_mode != FIRM_MENU_ASSASSINATE_RESULT && player_spy_count==0 && bribe_result==BRIBE_NONE) ) // don't refresh mode if the player spy in the firm has just failed the bribing and executed, and we now need to display the failure message { firm_menu_mode = FIRM_MENU_MAIN; lastFirmRecno = firm_recno; bribe_result = BRIBE_NONE; } switch( firm_menu_mode ) { case FIRM_MENU_MAIN: put_info(refreshFlag); break; case FIRM_MENU_SPY: case FIRM_MENU_SELECT_BRIBER: disp_spy_menu(refreshFlag); break; case FIRM_MENU_SET_BRIBE_AMOUNT: disp_bribe_menu(refreshFlag); break; case FIRM_MENU_VIEW_SECRET: spy_array.disp_view_secret_menu(action_spy_recno, refreshFlag); break; case FIRM_MENU_ASSASSINATE_RESULT: disp_assassinate_result(refreshFlag); break; } #ifdef DEBUG if(debug2_enable_flag) { font_san.d3_put( INFO_X1, INFO_Y2-30, INFO_X2, INFO_Y2, "" ); font_san.field( INFO_X1+10, INFO_Y2-20, " ", INFO_X1+20, firm_recno, 1, INFO_X2-10, refreshFlag); font_san.field( INFO_X1+40, INFO_Y2-20, " ", INFO_X1+50, loc_x1, 1, INFO_X2-10, refreshFlag); font_san.field( INFO_X1+70, INFO_Y2-20, " ", INFO_X1+80, loc_y1, 1, INFO_X2-10, refreshFlag); font_san.field( INFO_X1+100, INFO_Y2-20, " ", INFO_X1+110, ai_link_checked, 1, INFO_X2-10, refreshFlag); } #endif } } //----------- End of function Firm::disp_info_both -----------// //--------- Begin of function Firm::detect_info_both ---------// // // Called by Info::detect(). Detect both cases when the firm is // under construction and is normal. // void Firm::detect_info_both() { if( under_construction ) detect_basic_info(); else { switch( firm_menu_mode ) { case FIRM_MENU_MAIN: detect_info(); break; case FIRM_MENU_SPY: case FIRM_MENU_SELECT_BRIBER: detect_spy_menu(); break; case FIRM_MENU_SET_BRIBE_AMOUNT: detect_bribe_menu(); break; case FIRM_MENU_VIEW_SECRET: if( spy_array.detect_view_secret_menu(action_spy_recno, nation_recno) ) { firm_menu_mode = FIRM_MENU_MAIN; info.disp(); } break; case FIRM_MENU_ASSASSINATE_RESULT: detect_assassinate_result(); break; } } } //----------- End of function Firm::detect_info_both -----------// //--------- Begin of function Firm::disp_basic_info ---------// // void Firm::disp_basic_info(int dispY1, int refreshFlag) { //------- display the name of the firm --------// if( refreshFlag == INFO_REPAINT ) { vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+21 ); if( nation_recno ) { font_san.center_put( INFO_X1+21, dispY1, INFO_X2-2, dispY1+21, firm_name() ); char *nationPict = image_button.get_ptr("V_COLCOD"); vga_front.put_bitmap_remap(INFO_X1+3, dispY1+2, nationPict, game.get_color_remap_table(nation_recno, 0) ); } else { font_san.center_put( INFO_X1, dispY1, INFO_X2-2, dispY1+21, firm_name() ); } } dispY1+=23; //------- display hit points and buttons -------// int sliderX1, sliderX2; if( under_construction ) sliderX1 = INFO_X1+34; // there is only one button in the contruction mode, so the slider is longer else sliderX1 = INFO_X1+64; sliderX2 = INFO_X2-64; int showRepairIcon = builder_recno && !under_construction && should_show_info(); if( refreshFlag == INFO_REPAINT ) { button_sell.reset(); button_destruct.reset(); vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+26 ); if( nation_array.player_recno && nation_recno == nation_array.player_recno ) { if( under_construction || !can_sell() ) { button_destruct.paint( INFO_X1+4, dispY1+1, "V_DEM-U", "V_DEM-D" ); // Destruct if( under_construction ) button_destruct.set_help_code( "CANCELBLD" ); else button_destruct.set_help_code( "DESTFIRM" ); } if( !under_construction && can_sell() ) { button_sell.paint( INFO_X1+4, dispY1+1, "V_SEL-U", "V_SEL-D" ); // Sell button_sell.set_help_code( "SELLFIRM" ); } } if( showRepairIcon ) { button_builder.paint( INFO_X1+30, dispY1+1, "REPAIRU", "REPAIRD" ); // Builder button_builder.set_help_code( "REPAIR" ); } } else //--------- INFO_UPDATE --------// { if( showRepairIcon != button_builder.enable_flag ) { if( showRepairIcon ) { button_builder.paint( INFO_X1+30, dispY1+1, "REPAIRU", "REPAIRD" ); // Builder button_builder.set_help_code( "REPAIR" ); } else button_builder.hide(); } } disp_hit_point(dispY1); } //----------- End of function Firm::disp_basic_info -----------// //--------- Begin of function Firm::detect_basic_info ---------// // int Firm::detect_basic_info() { //--- click on the name area to center the map on it ---// if( mouse.single_click(INFO_X1, INFO_Y1, INFO_X2, INFO_Y1+21) ) { world.go_loc( center_x, center_y ); return 1; } //----------- Mobilize the builder ---------// int detectBuilder = builder_recno && !under_construction && unit_array[builder_recno]->is_own(); // this is your unit in your firm or it is a spy of yours in an enemy firm if( detectBuilder && button_builder.detect(0, 0, 1) ) // 1-detect right button also { if( !remote.is_enable() ) set_builder(0); else { // packet structure : short *shortPtr = (short *)remote.new_send_queue_msg(MSG_FIRM_MOBL_BUILDER, sizeof(short)); *shortPtr = firm_recno; } return 1; } //---------------------------------------// if( !own_firm() ) return 0; //---------- "Destruct" button -----------// if( button_destruct.detect(KEY_DEL) ) { if( under_construction ) cancel_construction(COMMAND_PLAYER); else destruct_firm(COMMAND_PLAYER); return 1; } //------------ "Sell" button -------------// if( button_sell.detect(KEY_DEL) ) { sell_firm(COMMAND_PLAYER); return 1; } return 0; } //----------- End of function Firm::detect_basic_info -----------// //--------- Begin of function Firm::disp_worker_list ---------// // void Firm::disp_worker_list(int dispY1, int refreshFlag) { pop_disp_y1 = dispY1; //---------------- paint the panel --------------// if( refreshFlag == INFO_REPAINT ) vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+60 ); //----------- display populatin distribution ---------// int overseerRaceId=0; if( overseer_recno ) overseerRaceId = unit_array[overseer_recno]->race_id; if( selected_worker_id > worker_count ) selected_worker_id = worker_count; //------ display population composition -------// int x, y; Worker* workerPtr = worker_array; static char last_race_id_array[MAX_WORKER]; static char last_unit_id_array[MAX_WORKER]; dispY1+=1; for( int i=0 ; irace_id || last_unit_id_array[i] != workerPtr->unit_id ) { vga_front.put_bitmap(x+2, y+2, workerPtr->small_icon_ptr()); } //----- highlight the selected worker -------// if( selected_worker_id == i+1 ) vga_front.rect( x, y, x+27, y+23, 2, V_YELLOW ); else vga_front.rect( x, y, x+27, y+23, 2, vga_front.color_up ); //------ display hit points bar --------// disp_worker_hit_points( x+2, y+24, x+25, workerPtr->hit_points, workerPtr->max_hit_points() ); //----- display combat or skill level ------// char* spyIconName=NULL; if( workerPtr->spy_recno ) { Spy* spyPtr = spy_array[workerPtr->spy_recno]; //------ if this is the player's spy -------// if( nation_array.player_recno && spyPtr->true_nation_recno == nation_array.player_recno ) { spyIconName = "U_SPY"; } //--------------------------------------------// // // If this is an enemy spy and this firm belongs // to the player and there is a player's phoenix // over this firm and the spying skill of the spy // is low (below 40) // //--------------------------------------------// /* else if( spyPtr->spy_skill < 40 && nation_recno == nation_array.player_recno && nation_array.player_recno && (~nation_array)->revealed_by_phoenix(loc_x1, loc_y1) ) { spyIconName = "ENEMYSPY"; } */ } //--------------------------------------// if( spyIconName ) { vga_front.put_bitmap( x+30, y+6, image_icon.get_ptr(spyIconName) ); vga.blt_buf( x+40, y+6, x+49, y+15, 0 ); vga.blt_buf( x+30, y+16, x+49, y+26, 0 ); } else { if( firm_id == FIRM_CAMP ) font_san.disp(x+30, y+6, workerPtr->combat_level, 1, x+49); else font_san.disp(x+30, y+6, workerPtr->skill_level, 1, x+49); } last_race_id_array[i] = workerPtr->race_id; last_unit_id_array[i] = workerPtr->unit_id; //------- set help parameters ---------// if( mouse.in_area(x, y, x+27, y+23) ) help.set_unit_help( workerPtr->unit_id, 0, x, y, x+27, y+23 ); } else { if( last_race_id_array[i] != 0 || last_unit_id_array[i] != 0 ) { vga.blt_buf( x, y, x+49, y+27, 0 ); last_race_id_array[i] = 0; last_unit_id_array[i] = 0; } } } } //----------- End of function Firm::disp_worker_list -----------// //--------- Begin of function Firm::detect_worker_list ---------// // int Firm::detect_worker_list() { if( !should_show_info() ) return 0; //------- detect buttons on hiring firm workers -------// int i, x, y; int liveInTown = firm_res[firm_id]->live_in_town; for( i=0 ; i worker_count ) selected_worker_id = worker_count; if( lastSelected != selected_worker_id > 0 ) { lastSelected = selected_worker_id > 0; info.disp(); // redisplay the interface return; } //------ if selected_worker_id==0, display overseer info -----// if( selected_worker_id==0 ) // display overseer info { disp_overseer_info(dispY1, refreshFlag); return; } //---------------- paint the panel --------------// if( refreshFlag == INFO_REPAINT ) { if( firm_id == FIRM_CAMP ) // the command base has one more field vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+71 ); else vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+55 ); } if( selected_worker_id > 0 ) { int x=INFO_X1+4, y=dispY1+4; Worker* workerPtr = worker_array + selected_worker_id - 1; if( workerPtr->town_recno ) // FirmInfo::live_in_town is 1 { Town* townPtr = town_array[workerPtr->town_recno]; font_san.field( x, y, "Residence", x+100, townPtr->town_name(), INFO_X2-2, refreshFlag); y+=16; if( town_array[workerPtr->town_recno]->nation_recno == nation_recno && workerPtr->race_id ) { info.disp_loyalty( x, y, x+100, workerPtr->loyalty(), workerPtr->target_loyalty(firm_recno), nation_recno, refreshFlag ); } else font_san.field( x, y, "Loyalty", x+100, "N/A", INFO_X2-2, refreshFlag ); // no loyalty because it does not belong to your empire } else // FirmInfo::live_in_town is 0 { if( workerPtr->race_id ) info.disp_loyalty( x, y, x+100, workerPtr->loyalty(), workerPtr->target_loyalty(firm_recno), nation_recno, refreshFlag ); else font_san.field( x, y, "Loyalty", x+100, "N/A", INFO_X2-2, refreshFlag ); // no loyalty because it does not belong to your empire } y+=16; //----------------------------------------// String str; if( workerPtr->race_id ) str = m.format(workerPtr->skill_level, 1); else str = "N/A"; font_san.field( x, y, Skill::skill_str_array[workerPtr->skill_id-1], x+100, str, INFO_X2-2, refreshFlag); y+=16; //----------------------------------------// if( firm_id == FIRM_CAMP ) { if( workerPtr->race_id ) str = m.format(workerPtr->combat_level, 1); else str = "N/A"; font_san.field( x, y, "Combat", x+100, str, INFO_X2-2, refreshFlag); y+=16; //---------------------------------------// str = workerPtr->hit_points; str += "/"; str += workerPtr->max_hit_points(); font_san.field( x, y, "Hit Points", x+100, str, INFO_X2-2, refreshFlag); } } } //----------- End of function Firm::disp_worker_info -----------// //--------- Begin of function Firm::disp_overseer_info ---------// // void Firm::disp_overseer_info(int dispY1, int refreshFlag) { if( refreshFlag == INFO_REPAINT ) { if( firm_id == FIRM_CAMP ) vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+71 ); else vga.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+55 ); } if( !overseer_recno ) return; int x=INFO_X1+4, y=dispY1+4; Unit* unitPtr = unit_array[overseer_recno]; if( unitPtr->rank_id != RANK_KING ) { info.disp_loyalty( x, y, x+100, unitPtr->loyalty, unitPtr->target_loyalty, nation_recno, refreshFlag ); y+=16; } font_san.field( x, y, Skill::skill_str_array[unitPtr->skill.skill_id-1], x+100, unitPtr->skill.skill_level , 1, INFO_X2-2, refreshFlag); y+=16; if( firm_id==FIRM_CAMP ) // only display combat level in camps and don't display it in seat of power { font_san.field( x, y, "Combat" , x+100, unitPtr->skill.combat_level, 1, INFO_X2-2, refreshFlag); y+=16; } String str; str = (int) unitPtr->hit_points; str += "/"; str += unitPtr->max_hit_points; font_san.field( x, y, "Hit Points", x+100, str, INFO_X2-2, refreshFlag); } //----------- End of function Firm::disp_overseer_info -----------// //----------- Begin of function Firm::disp_hit_point -----------// void Firm::disp_hit_point(int dispY1) { float hitPoints; if( hit_points > (float)0 && hit_points < (float)1 ) hitPoints = (float) 1; // display 1 for value between 0 and 1 else hitPoints = hit_points; Vga::active_buf->indicator(0x0b, INFO_X1+58, dispY1+1, hitPoints, max_hit_points, 0); } //----------- End of function Firm::disp_hit_point -----------//