/* * 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 : OAI_DIPL.CPP //Description: AI functions on diplomacy #include #include #include #include //----- Begin of function Nation::think_diplomacy -----// // void Nation::think_diplomacy() { //--- process incoming messages first, so we won't send out the same request to nation which has already proposed the same thing ---// int nationRecno = nation_recno; process_action(0, ACTION_AI_PROCESS_TALK_MSG); if( nation_array.is_deleted(nationRecno) ) // the nation may have been deleted, if the nation accepts a purchase kingdom offer return; //---- thinking about war first -----// if( think_declare_war() ) return; //----- think buy food first -------// think_request_buy_food(); // don't return even if this request is sent //----- think request cease fire ----// if( think_request_cease_war() ) return; //------ thinking about treaty ---------// if( think_trade_treaty() ) return; if( think_propose_alliance_treaty() ) // try proposing alliance treaty first, then try proposing friendly treaty return; if( think_propose_friendly_treaty() ) return; if( think_end_treaty() ) return; //-------- think about other matters --------// if( think_demand_tribute_aid() ) return; if( think_give_tech() ) return; if( think_demand_tech() ) return; //---- think about offering to purchase throne ----// if( think_request_surrender() ) return; } //------ End of function Nation::think_diplomacy ------// //----- Begin of function Nation::should_diplomacy_retry -----// // int Nation::should_diplomacy_retry(int talkId, int nationRecno) { if( !talk_res.can_send_msg(nationRecno, nation_recno, talkId ) ) return 0; int retryInterval; //--- shorter retry interval for demand talk message ----// if( talkId == TALK_DEMAND_TRIBUTE || talkId == TALK_DEMAND_AID || talkId == TALK_DEMAND_TECH ) { retryInterval = 60 + 60 * (100-pref_diplomacy_retry) / 100; // 2-4 months } else { retryInterval = 90 + 270 * (100-pref_diplomacy_retry) / 100; // 3 months to 12 months before next try } return info.game_date > get_relation(nationRecno)->last_talk_reject_date_array[talkId-1] + retryInterval; } //------ End of function Nation::should_diplomacy_retry ------// //----- Begin of function Nation::ai_notify_reply -----// // // Notify this AI nation that there is a reply to one // of the diplomatic messages that it has sent out. // void Nation::ai_notify_reply(int talkMsgRecno) { err_when( talk_res.is_talk_msg_deleted(talkMsgRecno) ); TalkMsg* talkMsg = talk_res.get_talk_msg(talkMsgRecno); int relationChange = 0; NationRelation* nationRelation = get_relation(talkMsg->to_nation_recno); if( talkMsg->reply_type == REPLY_REJECT ) nationRelation->last_talk_reject_date_array[talkMsg->talk_id-1] = info.game_date; else nationRelation->last_talk_reject_date_array[talkMsg->talk_id-1] = 0; switch( talkMsg->talk_id ) { case TALK_PROPOSE_TRADE_TREATY: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = pref_trading_tendency/10; else relationChange = -pref_trading_tendency/10; break; case TALK_PROPOSE_FRIENDLY_TREATY: case TALK_PROPOSE_ALLIANCE_TREATY: if( talkMsg->reply_type == REPLY_REJECT ) relationChange = -5; break; case TALK_REQUEST_MILITARY_AID: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = 0; // the AI never knows whether the player has really aided him in the war else relationChange = -(20-pref_military_courage/10); // -10 to -20 break; case TALK_REQUEST_TRADE_EMBARGO: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = (10+pref_trading_tendency/10); // +10 to +20 else relationChange = -(10+pref_trading_tendency/20); // -10 to -15 break; case TALK_REQUEST_CEASE_WAR: if( talkMsg->reply_type == REPLY_REJECT ) relationChange = -5; break; case TALK_REQUEST_DECLARE_WAR: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = pref_allying_tendency/10; else relationChange = -30; break; case TALK_REQUEST_BUY_FOOD: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = pref_food_reserve/10; else relationChange = -pref_food_reserve/10; break; case TALK_DEMAND_TRIBUTE: case TALK_DEMAND_AID: if( talkMsg->reply_type == REPLY_ACCEPT ) { //-- the less cash the nation, the more it will appreciate the tribute --// relationChange = 100 * talkMsg->talk_para1 / max(1000, (int) cash); } else { relationChange = -(400-pref_peacefulness)/10; // -30 to 40 points depending the peacefulness preference } break; case TALK_DEMAND_TECH: if( talkMsg->reply_type == REPLY_ACCEPT ) relationChange = 10+pref_use_weapon/5; // +10 to +30 else relationChange = -(10+pref_use_weapon/10); // -10 to -20 break; case TALK_GIVE_TRIBUTE: case TALK_GIVE_AID: case TALK_GIVE_TECH: if( talkMsg->reply_type == REPLY_REJECT ) // reject your gift relationChange = -5; break; case TALK_REQUEST_SURRENDER: // no relation change on this request break; default: err_here(); } //------- chance relationship now -------// if( relationChange < 0 ) relationChange -= relationChange * (200-pref_forgiveness) / 200; if( relationChange != 0 ) change_ai_relation_level( talkMsg->to_nation_recno, relationChange ); //---- think about giving tribute to become more friendly with the nation so it will accept our request next time ---// if( talkMsg->reply_type == REPLY_REJECT ) { if( think_give_tribute_aid( talkMsg ) ) return; //--- if our request was rejected, end treaty if the ai_nation_relation is low enough ---// if( talkMsg->talk_id != TALK_PROPOSE_ALLIANCE_TREATY && // the rejected request is not alliance treaty nationRelation->status >= NATION_FRIENDLY && nationRelation->ai_relation_level < 40-pref_allying_tendency/5 ) // 20 to 40 { int talkId; if( nationRelation->status == NATION_FRIENDLY ) talkId = TALK_END_FRIENDLY_TREATY; else talkId = TALK_END_ALLIANCE_TREATY; talk_res.ai_send_talk_msg(talkMsg->to_nation_recno, nation_recno, talkId); } //----- declare war if ai_relation_level==0 -----// else if( nationRelation->ai_relation_level == 0 ) { //--------- declare war ---------// if( config.ai_aggressiveness >= OPTION_HIGH || pref_peacefulness < 50 ) { talk_res.ai_send_talk_msg(talkMsg->to_nation_recno, nation_recno, TALK_DECLARE_WAR); //------- attack immediately --------// if( config.ai_aggressiveness >= OPTION_VERY_HIGH || ( config.ai_aggressiveness >= OPTION_HIGH && pref_peacefulness < 50 ) ) { if( largest_town_recno ) { think_capture_new_enemy_town( town_array[largest_town_recno], 1 ); // 1-use forces from all camps to attack the target } } } } } } //------ End of function Nation::ai_notify_reply ------// //----- Begin of function Nation::think_propose_friendly_treaty -----// // int Nation::think_propose_friendly_treaty() { //--- think about which nation this nation should propose treaty to ---// int curRating, bestRating=0, bestNationRecno=0; NationRelation* nationRelation; for( int i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationRelation = get_relation(i); if( !nationRelation->has_contact || nationRelation->status >= NATION_FRIENDLY ) continue; if( !should_diplomacy_retry(TALK_PROPOSE_FRIENDLY_TREATY, i) ) continue; curRating = consider_friendly_treaty(i); if( curRating > bestRating ) { bestRating = curRating; bestNationRecno = i; } } if( bestNationRecno ) { talk_res.ai_send_talk_msg(bestNationRecno, nation_recno, TALK_PROPOSE_FRIENDLY_TREATY ); return 1; } return 0; } //------ End of function Nation::think_propose_friendly_treaty ------// //----- Begin of function Nation::think_propose_alliance_treaty -----// // int Nation::think_propose_alliance_treaty() { //--- think about which nation this nation should propose treaty to ---// int curRating, bestRating=0, bestNationRecno=0; NationRelation* nationRelation; for( int i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationRelation = get_relation(i); if( !nationRelation->has_contact || nationRelation->status == NATION_ALLIANCE ) continue; if( !should_diplomacy_retry(TALK_PROPOSE_ALLIANCE_TREATY, i) ) continue; curRating = consider_alliance_treaty(i); if( curRating > bestRating ) { bestRating = curRating; bestNationRecno = i; } } if( bestNationRecno ) { talk_res.ai_send_talk_msg(bestNationRecno, nation_recno, TALK_PROPOSE_ALLIANCE_TREATY ); return 1; } return 0; } //------ End of function Nation::think_propose_alliance_treaty ------// //----- Begin of function Nation::think_request_cease_war -----// // int Nation::think_request_cease_war() { Nation* nationPtr; NationRelation* nationRelation; for( int i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationPtr = nation_array[i]; nationRelation = get_relation(i); if( nationRelation->status != NATION_HOSTILE ) continue; if( !should_diplomacy_retry(TALK_REQUEST_CEASE_WAR, i) ) continue; //----- think about if it should cease war with the nation ------// if( consider_cease_war(i) > 0 ) { talk_res.ai_send_talk_msg(i, nation_recno, TALK_REQUEST_CEASE_WAR); } //--------------------------------------------// // The relation improves slowly if there is // no attack. However, if there is any battles // started between the two nations, the status will be // set to hostile and ai_relation_level will be set to 0 again. //--------------------------------------------// else { change_ai_relation_level(i, 1); } } return 0; } //------ End of function Nation::think_request_cease_war ------// //----- Begin of function Nation::think_end_treaty -----// // int Nation::think_end_treaty() { if( pref_honesty < 30 ) // never formally end a treaty if the honesty is < 30 return 0; Nation* nationPtr; NationRelation* nationRelation; for( int i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationRelation = get_relation(i); if( nationRelation->status < NATION_FRIENDLY ) continue; if( nationRelation->ai_secret_attack || ( nationRelation->ai_relation_level < 30 && trade_rating(i) < 50 ) ) { //--- don't change terminate treaty too soon ---// if( info.game_date < nationRelation->last_change_status_date+60+pref_honesty/2 ) // only after 60 to 110 days continue; //----------------------------------------// if( !talk_res.can_send_msg(i, nation_recno, nationRelation->status==NATION_FRIENDLY ? TALK_END_FRIENDLY_TREATY : TALK_END_ALLIANCE_TREATY) ) continue; nationPtr = nation_array[i]; //-----------------------------------------// // What makes it tend to end treaty: // -higher honesty // -a larger overall power over the target nation. // // If honesty is > 50, if will end treaty // if its power is equal to the enemy. // // If honesty is < 50, if will end treaty // if its power is larger than the enemy. // // If honesty is > 50, if will end treaty // even if its power is lower than the enemy. //-----------------------------------------// if( pref_honesty-50 > nationPtr->overall_rating - overall_rating ) { if( nationRelation->status == NATION_FRIENDLY ) talk_res.ai_send_talk_msg(i, nation_recno, TALK_END_FRIENDLY_TREATY); else talk_res.ai_send_talk_msg(i, nation_recno, TALK_END_ALLIANCE_TREATY); return 1; } } } return 0; } //------ End of function Nation::think_end_treaty ------// //----- Begin of function Nation::think_trade_treaty -----// // int Nation::think_trade_treaty() { Nation* nationPtr; NationRelation *ourRelation; for( int i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationPtr = nation_array[i]; ourRelation = get_relation(i); if( !ourRelation->has_contact ) continue; //------- propose a trade treaty --------// if( !ourRelation->trade_treaty ) { if( consider_trade_treaty(i) > 0 ) { if( should_diplomacy_retry(TALK_PROPOSE_TRADE_TREATY, i) ) { talk_res.ai_send_talk_msg(i, nation_recno, TALK_PROPOSE_TRADE_TREATY); ourRelation->ai_demand_trade_treaty = 0; return 1; } } } } return 0; } //------ End of function Nation::think_trade_treaty ------// //----- Begin of function Nation::think_request_buy_food -----// // int Nation::think_request_buy_food() { //------ first see if we need to buy food ------// int yearFoodChange = yearly_food_change(); int neededFoodLevel; if( yearFoodChange > 0 ) { if( food > 0 ) return 0; else neededFoodLevel = (int) -food; // if the food is negative } else { neededFoodLevel = -yearFoodChange * (100+pref_food_reserve) / 50; if( food > neededFoodLevel ) // one to three times (based on pref_food_reserve) of the food needed in a year, return 0; } //----- think about which nation to buy food from -----// Nation *nationPtr, *bestNation=NULL; int curRating, bestRating=0; int relationStatus; int i; for( i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationPtr = nation_array[i]; if( nationPtr->food < 500 ) // if the nation is short of food itself. The minimum request purchase qty is 500 continue; relationStatus = get_relation_status(i); if( relationStatus == NATION_HOSTILE || !get_relation(i)->has_contact ) continue; if( nationPtr->yearly_food_change() < 0 && nationPtr->food < 1500 ) { continue; } if( !should_diplomacy_retry(TALK_REQUEST_BUY_FOOD, i) ) continue; //-----------------------------------// curRating = relationStatus*20 + (int)nationPtr->food / 100 + (int)nationPtr->yearly_food_change() / 10; if( curRating > bestRating ) { bestRating = curRating; bestNation = nationPtr; } } if( !bestNation ) return 0; //------------------------------------// static short buyQtyArray[] = { 500, 1000, 2000, 4000 }; int buyQty=0, buyPrice; for( i=3 ; i>=0 ; i-- ) { if( bestNation->food/2 > buyQtyArray[i] ) { buyQty = buyQtyArray[i]; break; } } if( buyQty == 0 ) return 0; //------- set the offering price ------// if( food < neededFoodLevel/4 ) // if we need the food badly { buyPrice = 30; } else if( food < neededFoodLevel/3 ) { buyPrice = 20; } else { if( bestNation->food > bestNation->all_population() * PERSON_FOOD_YEAR_CONSUMPTION * 5 && // if the nation has plenty of food bestNation->cash < bestNation->fixed_expense_365days() / 2 ) // if the nation runs short of cash { buyPrice = 5; } else buyPrice = 10; } talk_res.ai_send_talk_msg(bestNation->nation_recno, nation_recno, TALK_REQUEST_BUY_FOOD, buyQty, buyPrice); return 1; } //------ End of function Nation::think_request_buy_food ------// //----- Begin of function Nation::think_declare_war -----// // int Nation::think_declare_war() { NationRelation* nationRelation; int rc=0; //---- don't declare a new war if we already has enemies ---// int i; for( i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; if( get_relation(i)->status == NATION_HOSTILE ) return 0; } //------------------------------------------------// int targetStrength, minStrength=0x1000, bestTargetNation=0; for( i=1 ; i<=nation_array.size() ; i++ ) { if( nation_array.is_deleted(i) || i==nation_recno ) continue; nationRelation = get_relation(i); if( !nationRelation->has_contact ) continue; if( nationRelation->status == NATION_HOSTILE ) // already at war continue; if( nationRelation->ai_relation_level >= 10 ) continue; if( !ai_should_spend( 100-trade_rating(i) ) ) // if trade_rating is 0, importanceRating will be 100, if trade_rating is 100, importanceRating will be 0 continue; //----------------------------------------// Nation* targetNation = nation_array[i]; targetStrength = targetNation->military_rank_rating() + targetNation->population_rank_rating()/2 + targetNation->economic_rank_rating()/3; if( targetStrength < minStrength ) { minStrength = targetStrength; bestTargetNation = i; } } //------------------------------------------// if( bestTargetNation ) { if( should_diplomacy_retry(TALK_DECLARE_WAR, bestTargetNation) ) { talk_res.ai_send_talk_msg(bestTargetNation, nation_recno, TALK_DECLARE_WAR); return 1; } } return 0; } //------ End of function Nation::think_declare_war ------// //----- Begin of function Nation::think_give_tribute_aid -----// // // This function is called when a nation rejected our request // which is important to us and we want to give tribute to the // nation so it may accept next time. // // rejectedMsg - the TalkMsg that has been rejected. // int Nation::think_give_tribute_aid(TalkMsg* rejectedMsg) { //-----------get the talk id. ------------// int talkId; int talkNationRecno = rejectedMsg->to_nation_recno; int rejectedTalkId = rejectedMsg->talk_id; NationRelation* nationRelation = get_relation(talkNationRecno); if( nationRelation->status >= NATION_FRIENDLY ) talkId = TALK_GIVE_AID; else talkId = TALK_GIVE_TRIBUTE; //-------- don't give tribute too frequently -------// if( info.game_date < nationRelation->last_talk_reject_date_array[talkId-1] + 365 - pref_allying_tendency ) { return 0; } //---- think if the nation should spend money now ----// static short tributeAmountArray[] = { 500, 1000 }; int tributeAmount = tributeAmountArray[m.random(2)]; if( !ai_should_spend(0, (float) tributeAmount) ) // importance rating is 0 return 0; //--------------------------------------// Nation* talkNation = nation_array[talkNationRecno]; int rc; if( rejectedTalkId == TALK_PROPOSE_TRADE_TREATY ) { rc = ai_trade_with_rating(talkNationRecno) > 100-pref_trading_tendency/2; } else if ( rejectedTalkId == TALK_PROPOSE_FRIENDLY_TREATY || rejectedTalkId == TALK_PROPOSE_ALLIANCE_TREATY ) { int curRating = talkNation->trade_rating(talkNationRecno) + ai_trade_with_rating(talkNationRecno) + talkNation->overall_rating - overall_rating; int acceptRating = 200-pref_trading_tendency/4 -pref_allying_tendency/4; rc = curRating >= acceptRating; } //--------------------------------------// else if( rejectedTalkId == TALK_REQUEST_CEASE_WAR ) { rc = talkNation->military_rank_rating() > military_rank_rating() + (100-pref_peacefulness)/2; } //--------------------------------------// if( rc ) { //------ give tribute --------// talk_res.ai_send_talk_msg(talkNationRecno, nation_recno, talkId, tributeAmount); nationRelation->last_talk_reject_date_array[talkId-1] = info.game_date; //------ request again after giving tribute ----// nationRelation->last_talk_reject_date_array[rejectedTalkId-1] = 0; // reset the rejected talk id. talk_res.ai_send_talk_msg(talkNationRecno, nation_recno, rejectedTalkId, rejectedMsg->talk_para1, rejectedMsg->talk_para2 ); } return rc; } //------ End of function Nation::think_give_tribute_aid ------// //----- Begin of function Nation::think_demand_tribute_aid -----// // // Demand tribute when the nation's economy is good and its // military is weak. // int Nation::think_demand_tribute_aid() { if( info.game_date < info.game_start_date + 180 + nation_recno*50 ) // don't ask for tribute too soon, as in the beginning, the ranking are all the same for all nations return 0; //--------------------------------------// Nation* nationPtr; int totalNation=nation_array.size(); int nationRecno=m.random(totalNation)+1; int curRating, requestRating; int talkId; int ourMilitary = military_rank_rating(); int ourEconomy = economic_rank_rating(); for( int i=totalNation ; i>0 ; i-- ) { if( ++nationRecno > totalNation ) nationRecno = 1; if( nation_array.is_deleted(nationRecno) || nationRecno==nation_recno ) continue; nationPtr = nation_array[nationRecno]; //-- only demand tribute from non-friendly nations --// if( get_relation(nationRecno)->status <= NATION_NEUTRAL ) talkId = TALK_DEMAND_TRIBUTE; else talkId = TALK_DEMAND_AID; //-----------------------------------------------// float fixedExpense = fixed_expense_365days(); if( talkId == TALK_DEMAND_TRIBUTE ) { if( !should_diplomacy_retry(talkId, nationRecno) ) continue; curRating = ourMilitary - nationPtr->military_rank_rating(); if( curRating < 0 ) continue; //----------------------------------------------// // // Some nation will actually consider the ability // of the target nation to pay tribute, so nation // will not and just ask anyway. // //----------------------------------------------// if( pref_economic_development > 50 ) { int addRating = nationPtr->economic_rank_rating()-ourEconomy; if( addRating > 0 ) curRating += addRating; } requestRating = 20 + trade_rating(nationRecno)/2 + (100-pref_peacefulness)/3; if( cash < fixedExpense && fixedExpense != 0 ) requestRating -= int( (float) requestRating * cash / fixedExpense); } else { if( cash >= fixedExpense ) continue; if( cash > fixedExpense * (50+pref_cash_reserve) / 300 && // if the nation is runing short of cash, don't wait a while until next retry, retry immediately !should_diplomacy_retry(talkId, nationRecno) ) { continue; } //----- only ask for aid when the nation is short of cash ----// curRating = (ourMilitary - nationPtr->military_rank_rating())/2 + ( nationPtr->economic_rank_rating()-ourEconomy ); requestRating = 20 + 50 * (int)(cash / fixedExpense); } //----- if this is a human player's nation -----// if( !nationPtr->is_ai() ) { switch( config.ai_aggressiveness ) { case OPTION_LOW: requestRating += 40; // don't go against the player too easily break; case OPTION_HIGH: requestRating -= 20; break; case OPTION_VERY_HIGH: requestRating -= 40; break; } //--- if the nation has plenty of cash, demand from it ----// if( nationPtr->cash > cash && config.ai_aggressiveness >= OPTION_HIGH ) { requestRating -= (int) (nationPtr->cash - cash)/500; } } //--------------------------------------// if( curRating > requestRating ) { int tributeAmount; if( curRating - requestRating > 120 ) tributeAmount = 4000; else if( curRating - requestRating > 80 ) tributeAmount = 3000; else if( curRating - requestRating > 40 ) tributeAmount = 2000; else if( curRating - requestRating > 20 ) tributeAmount = 1000; else tributeAmount = 500; talk_res.ai_send_talk_msg(nationRecno, nation_recno, talkId, tributeAmount); return 1; } } return 0; } //------ End of function Nation::think_demand_tribute_aid ------// //----- Begin of function Nation::think_demand_tech -----// // int Nation::think_demand_tech() { if( m.random(10) > 0 ) // only 1/10 chance of calling this function return 0; Nation* nationPtr; int totalNation=nation_array.size(); int nationRecno=m.random(totalNation)+1; for( int i=totalNation ; i>0 ; i-- ) { if( ++nationRecno > totalNation ) nationRecno = 1; if( nation_array.is_deleted(nationRecno) || nationRecno==nation_recno ) continue; nationPtr = nation_array[nationRecno]; if( nationPtr->total_tech_level() == 0 ) continue; if( !should_diplomacy_retry(TALK_DEMAND_TECH, nationRecno) ) continue; //--- don't request from hostile or tense nations -----// if( get_relation(nationRecno)->status < NATION_NEUTRAL ) continue; //---- scan which tech that the nation has but we don't have ----// int techId; for( techId=1 ; techId<=tech_res.tech_count ; techId++ ) { TechInfo *techInfo = tech_res[techId]; if( techInfo->get_nation_tech_level(nation_recno)==0 && techInfo->get_nation_tech_level(nationRecno) > 0 ) { break; } } if( techId > tech_res.tech_count ) continue; //-------- send the message now ---------// talk_res.ai_send_talk_msg(nationRecno, nation_recno, TALK_DEMAND_TECH, techId); return 1; } return 0; } //------ End of function Nation::think_demand_tech ------// //----- Begin of function Nation::think_give_tech -----// // int Nation::think_give_tech() { return 0; } //------ End of function Nation::think_give_tech ------// //----- Begin of function Nation::think_request_surrender -----// // int Nation::think_request_surrender() { if( m.random(5) != 0 ) // don't do this too often return 0; //---- only do so when we have enough cash ----// if( cash < fixed_expense_365days() + 5000 + 10000 * pref_cash_reserve / 100 ) return 0; if( profit_365days() < 0 && cash < 20000 ) // don't ask if we are losing money and the cash isn't plenty return 0; //----- calculate the amount this nation can offer ----// int offerAmount = (int)cash - min(5000, (int)fixed_expense_365days()); static int amtArray[] = { 5000, 7500, 10000, 15000, 20000, 30000, 40000, 50000 }; int i; for( i=7 ; i>=0 ; i-- ) { if( offerAmount >= amtArray[i] ) { offerAmount = amtArray[i]; break; } } if( i<0 ) return 0; //---------------------------------------------// Nation* nationPtr; int ourOverallRankRating = overall_rank_rating(); int totalNation = nation_array.size(); int nationRecno = m.random(totalNation)+1; for( i=0 ; i totalNation ) nationRecno = 1; if( nation_array.is_deleted(nationRecno) || nation_recno==nationRecno ) continue; nationPtr = nation_array[nationRecno]; //--- don't ask for a kingdom that is more powerful to surrender to us ---// if( nationPtr->cash > 100 ) // unless it is running short of cash { if( nationPtr->overall_rank_rating() > ourOverallRankRating ) continue; } //-------------------------------------------// if( !should_diplomacy_retry(TALK_REQUEST_SURRENDER, nationRecno) ) continue; //-------------------------------------------// talk_res.ai_send_talk_msg(nationRecno, nation_recno, TALK_REQUEST_SURRENDER, offerAmount/10 ); // divide by 10 to cope with 's upper limit return 1; } return 0; } //------ End of function Nation::think_request_surrender ------//