//--------- Begin of function FirmInn::hire ---------// // // <short> recNo inn unit recno // [int] spyEscape whether this is an instance which a spy escape from the inn, instead of hiring a unit. i.e. no hire cost required // (default: 0) // [short] exitFirmRecno exit inn's firm recno if not same as this inn (see transfer_inn_unit) // (default :0) // int FirmInn::hire(short recNo, int spyEscape, short exitFirmRecno) { err_when( recNo < 1 ); if( recNo > inn_unit_count ) // this may happen in a multiplayer game return 0; //--------- first check if you have enough money to hire ------// Nation* nationPtr = nation_array[nation_recno]; InnUnit* innUnit = inn_unit_array+recNo-1; int unitRecno = 0; err_when( exitFirmRecno && firm_array.is_deleted(exitFirmRecno) ); if( innUnit->spy_recno && (spyEscape // no expense if mobilizing spy || innUnit->true_nation_recno() == nation_recno) ) // no expense if it is own spy { // free, no need to play money unitRecno = (exitFirmRecno ? firm_array[exitFirmRecno] : this)->create_unit(innUnit->unit_id ); if( !unitRecno ) return 0; // no space for creating the unit } else { if( nationPtr->cash < innUnit->hire_cost ) return 0; unitRecno = (exitFirmRecno ? firm_array[exitFirmRecno] : this)->create_unit( innUnit->unit_id ); if( !unitRecno ) return 0; // no space for creating the unit nationPtr->add_expense(EXPENSE_HIRE_UNIT, innUnit->hire_cost); } //-------- set skills of the unit --------// err_when( !unitRecno ); Unit* unitPtr = unit_array[unitRecno]; unitPtr->skill = innUnit->skill; unitPtr->hit_points = innUnit->hit_points; err_when( innUnit->combat_level()<=0 || innUnit->combat_level()>1000 ); //----------------------------------------// // // Set loyalty of the hired unit // // = 30 + the nation's reputation / 2 + 30 if racially homogenous // //----------------------------------------// int unitLoyalty = 30 + (int)nationPtr->reputation/2; if( innUnit->spy_recno && (spyEscape || innUnit->true_nation_recno() == nation_recno) ) { unitLoyalty = spy_array[innUnit->spy_recno]->spy_loyalty; } if( race_res.is_same_race(unitPtr->race_id, nationPtr->race_id) ) unitLoyalty += 20; unitLoyalty = MAX( 40, unitLoyalty ); unitLoyalty = MIN( 100, unitLoyalty ); unitPtr->loyalty = unitLoyalty; // ######## begin Gilbert 24/2 #######// unitPtr->unique_id = innUnit->unique_id; // set unique before add_spy/set_spy_place // ######## end Gilbert 24/2 #######// //----------------------------------------------------// // // If spy_skill>0, this unit is a spy with a // spying skill for hire, he is added by FirmInn // //----------------------------------------------------// if( innUnit->spy_skill > 0 ) { unitPtr->spy_recno = spy_array.add_spy(unitRecno, innUnit->spy_skill); spy_array[unitPtr->spy_recno]->spy_loyalty = unitLoyalty; // this is the spy's true loyalty towards you } //----------------------------------------------------// // // If spy_recno>0, this unit is an enemy spy sneaked // into the inn. // //----------------------------------------------------// else if( innUnit->spy_recno ) { err_when( spy_array.is_deleted(innUnit->spy_recno) ); Spy *spyPtr = spy_array[innUnit->spy_recno]; unitPtr->spy_recno = innUnit->spy_recno; innUnit->spy_recno = 0; // prevent del_inn_unit call spy_array.del_spy unitPtr->loyalty = unitLoyalty; // this is his fake loyalty towards you // ##### begin Gilbert 1/3 ########// if( unitPtr->race_id && spyPtr->name_id ) { unitPtr->set_name( spyPtr->name_id ); } // ##### end Gilbert 1/3 ########// spy_array[unitPtr->spy_recno]->set_place(SPY_MOBILE, unitRecno); if( spyEscape ) { unitPtr->spy_change_nation(spyPtr->true_nation_recno, COMMAND_AUTO); } } // ------ hero id -------// unitPtr->hero_id = innUnit->hero_id; innUnit->hero_id = 0; // ##### begin Gilbert 24/2 #######// // unitPtr->unique_id = innUnit->unique_id; // ##### end Gilbert 24/2 #######// // ------ set item -------// unitPtr->item = innUnit->item; // ###### begin Gilbert 4/11 ######// unitPtr->set_combat_level(-1); // ###### end Gilbert 4/11 ######// //---- remove the record from the hire list ----// del_inn_unit(recNo); // ##### begin Gilbert 24/2 #######// // ------- update win/lose condition on changing of unit recno -----// game.update_condition_on_mobilize(unitRecno, unitPtr->unique_id ); // ##### end Gilbert 24/2 #######// return unitRecno; }
//--------- Begin of function FirmInn::disp_unit_info ---------// // // Display the skill information of the people in the town. // // <int> dispY1 - the top y coordination of the info area // <InnUnit*> hireInfoPtr - pointer to a HireInfo structure // <int> refreshFlag - refresh flag // void FirmInn::disp_unit_info(int dispY1, int refreshFlag) { if( !selected_unit_id || selected_unit_id > inn_unit_count) return; // ##### begin Gilbert 8/1 #####// // int x = INFO_X1 + 83; int x = INFO_X1 + 20; // ##### end Gilbert 8/1 #####// int y = dispY1; int x2; err_when( selected_unit_id <= 0 || selected_unit_id > inn_unit_count ); InnUnit *innUnit = inn_unit_array + selected_unit_id - 1; // display unit name if( innUnit->hero_id ) font_snds.put( x, y, hero_res[innUnit->hero_id]->name, 0, -1, 1 ); else font_snds.put( x, y, unit_res[innUnit->unit_id]->name, 0, -1, 1 ); y += 14; // display combat level // x2 = font_snds.put( x, y, "Combat" ) + 10; x2 = font_snds.put( x, y, text_unit.str_combat_level() ) + 10; font_snds.right_put( INFO_X2-100, y, m.format(innUnit->combat_level(), 4) ); // x2 = font_snds.put( x2, y, innUnit->combat_level() ) + 15; // display spying skill if( innUnit->item.id ) { if( innUnit->spy_skill > 0 ) { // x2 = font_snds.put( x+110, y, "Spying" ) + 10; x2 = font_snds.put( x+110, y, text_unit.str_spy_skill() ) + 10; font_snds.right_put( INFO_X2-10, y, m.format(innUnit->spy_skill,4) ); } else if( innUnit->is_own_spy() ) { // x2 = font_snds.put( x+110, y, "Spying" ) + 10; x2 = font_snds.put( x+110, y, text_unit.str_spy_skill() ) + 10; font_snds.right_put( INFO_X2-10, y, m.format(spy_array[innUnit->spy_recno]->spy_skill,4) ); } else if ( innUnit->hero_id ) { // String str; // str = race_res[ unit_res[innUnit->unit_id]->race_id ]->adjective; // str += " Hero"; // font_red.right_put( INFO_X2-5, y, str ); font_red.right_put( INFO_X2-5, y, text_unit.str_race_hero(race_res[ unit_res[innUnit->unit_id]->race_id ]->adjective) ); } } y += 14; // display leadership skill if( innUnit->skill_level() > 0 ) { // x2 = font_snds.put( x, y, "Leadership" ) + 10; x2 = font_snds.put( x, y, text_unit.str_leadership() ) + 10; font_snds.right_put( INFO_X2-100, y, m.format(innUnit->skill_level(), 4) ); // font_snds.put( x2, y, innUnit->skill_level() ); } // display hire cost font_snds.right_put( INFO_X1+212, y, m.format(innUnit->hire_cost, 2) ); y += 14; // display item if( innUnit->item.id ) { font_snds.put( x, y, innUnit->item.item_name() ); font_snds.right_put( INFO_X1+212, y, m.format(innUnit->item.cost(), 2) ); } else { if( innUnit->spy_skill > 0 ) { // x2 = font_snds.put( x, y, "Spying" ) + 10; x2 = font_snds.put( x, y, text_unit.str_spy_skill() ) + 10; font_snds.right_put( INFO_X2-100, y, m.format(innUnit->spy_skill, 4) ); // font_snds.put( x2, y, innUnit->spy_skill ); } else if( innUnit->is_own_spy() ) { // x2 = font_snds.put( x, y, "Spying" ) + 10; x2 = font_snds.put( x, y, text_unit.str_spy_skill() ) + 10; font_snds.right_put( INFO_X2-100, y, m.format(spy_array[innUnit->spy_recno]->spy_skill, 4) ); // font_snds.put( x2, y, spy_array[innUnit->spy_recno]->spy_skill ); } else if ( innUnit->hero_id ) { // String str; // str = race_res[ unit_res[innUnit->unit_id]->race_id ]->adjective; // str += " Hero"; // font_red.right_put( INFO_X2-95, y, str ); font_red.right_put( INFO_X2-95, y, text_unit.str_race_hero(race_res[ unit_res[innUnit->unit_id]->race_id ]->adjective) ); } } // info.draw_unit_icon( INFO_X1+38, INFO_Y1+228-32, // innUnit->unit_id, nation_recno, // INFO_X1+14, INFO_Y1+157, INFO_X1+63, INFO_Y1+228, 1 ); }