//----- Begin of function Nation::consider_alliance_rating -----// // // Return a rating from 0 to 100 for whether this nation should ally // with the given nation. // int Nation::consider_alliance_rating(int nationRecno) { Nation* nationPtr = nation_array[nationRecno]; //---- the current relation affect the alliance tendency ---// NationRelation* nationRelation = get_relation(nationRecno); int allianceRating = nationRelation->ai_relation_level-20; //--- if the nation has a bad record of starting wars with us before, decrease the rating ---// allianceRating -= nationRelation->started_war_on_us_count * 20; //------ add the trade rating -------// int tradeRating = trade_rating(nationRecno) + // existing trade amount ai_trade_with_rating(nationRecno)/2; // possible trade allianceRating += tradeRating; //---- if the nation's power is larger than us, it's a plus ----// int powerRating = nationPtr->military_rank_rating() - military_rank_rating(); // if the nation's power is larger than ours, it's good to form treaty with them if( powerRating > 0 ) allianceRating += powerRating; return allianceRating; }
//----- Begin of function Nation::ai_overall_relation_rating -----// // // Return the overall relation rating of this nation with the // specific nation. // int Nation::ai_overall_relation_rating(int withNationRecno) { NationRelation* nationRelation = get_relation(withNationRecno); Nation* nationPtr = nation_array[withNationRecno]; int overallRating = nationRelation->ai_relation_level + (int) nationRelation->good_relation_duration_rating + (int) nationPtr->reputation + nationPtr->military_rank_rating() + trade_rating(withNationRecno) + ai_trade_with_rating(withNationRecno)/2 + nationPtr->total_alliance_military(); return overallRating; }
//----- Begin of function Nation::consider_trade_treaty -----// // // Consider agreeing to open up trade with the given nation. // int Nation::consider_trade_treaty(int withNationRecno) { if( nation_array[withNationRecno]->is_human() != is_human() ) return 0; NationRelation* nationRelation = get_relation(withNationRecno); //---- don't accept new trade treaty soon when the trade treaty was terminated not too long ago ----// if( info.game_date < nationRelation->never_accept_until_date_array[TALK_END_TRADE_TREATY-1] ) return 0; //-- if we look forward to have a trade treaty with this nation ourselves --// if( nationRelation->ai_demand_trade_treaty ) return 1; return ai_trade_with_rating(withNationRecno) > 0; }
//----- 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. // // <TalkMsg*> 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 >= RELATION_FRIENDLY ) talkId = TALK_GIVE_AID; else talkId = TALK_GIVE_TRIBUTE; //-------- don't give tribute too frequently -------// if( info.game_date < nationRelation->never_accept_until_date_array[talkId-1] ) 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->set_never_accept_until_date(talkId, 100); // don't offer tribute too often //------ request again after giving tribute ----// nationRelation->last_talk_reject_date_array[rejectedTalkId-1] = 0; // reset the rejected talk id. nationRelation->never_accept_until_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; }
//----- Begin of function Nation::think_ally_against_big_enemy -----// // // Think about allying against a big enemy // int Nation::think_ally_against_big_enemy() { if( info.game_date < info.game_start_date + 365 + nation_recno*70 ) // don't ask for tribute too soon, as in the beginning, the ranking are all the same for all nations return 0; //---------------------------------------// int enemyNationRecno = nation_array.max_overall_nation_recno; if( enemyNationRecno == nation_recno ) return 0; //-- if AI aggressiveness > high, only deal against the player, but not other kingdoms ---// if( config.ai_aggressiveness >= OPTION_HIGH ) { if( nation_array[enemyNationRecno]->is_ai() ) return 0; } //-- if AI aggressiveness is low, don't do this against the human player --// else if( config.ai_aggressiveness == OPTION_LOW ) { if( !nation_array[enemyNationRecno]->is_ai() ) return 0; } //--- increase the ai_relation_level towards other nations except the enemy so we can ally against the enemy ---// Nation* enemyNation = nation_array[enemyNationRecno]; int incRelationLevel = (100-overall_rank_rating())/10; int i; for( i=nation_array.size() ; i>0 ; i-- ) { if( nation_array.is_deleted(i) ) continue; if( i==nation_recno || i==enemyNationRecno ) continue; int thisIncLevel = incRelationLevel * (100-get_relation(i)->ai_relation_level) / 100; change_ai_relation_level( i, thisIncLevel ); } //---- don't have all nations doing it the same time ----// if( misc.random(nation_array.ai_nation_count)==0 ) return 0; //---- if the trade rating is high, stay war-less with it ----// if( trade_rating(enemyNationRecno) + ai_trade_with_rating(enemyNationRecno) > 100 - pref_trading_tendency/3 ) { return 0; } //---- if the nation relation level is still high, then request aid/tribute ----// NationRelation* nationRelation = get_relation(enemyNationRecno); if( nationRelation->ai_relation_level > 30 ) { int talkId; if( nationRelation->status >= NATION_FRIENDLY ) talkId = TALK_DEMAND_AID; else talkId = TALK_DEMAND_TRIBUTE; if( should_diplomacy_retry(talkId, enemyNationRecno) ) { static short aidAmountArray[] = { 500, 1000, 2000 }; int aidAmount = aidAmountArray[misc.random(3)]; talk_res.ai_send_talk_msg(enemyNationRecno, nation_recno, talkId, aidAmount); } return 0; } //-------------------------------------// Nation* nationPtr; NationRelation *ourNationRelation, *enemyNationRelation; for( i=nation_array.size() ; i>0 ; i-- ) { if( nation_array.is_deleted(i) ) continue; if( i==nation_recno || i==enemyNationRecno ) continue; nationPtr = nation_array[i]; ourNationRelation = get_relation(i); enemyNationRelation = enemyNation->get_relation(i); } return 0; }
//----- Begin of function Nation::consider_cease_war -----// // // This function is shared by think_request_cease_war(). // int Nation::consider_cease_war(int withNationRecno) { NationRelation* nationRelation = get_relation(withNationRecno); if( nationRelation->status != RELATION_HOSTILE ) return -1; // -1 means don't reply //---- if we are attacking the nation, don't cease fire ----// if( ai_attack_target_nation_recno == withNationRecno ) return -1; //---- if we are planning to capture the enemy's town ---// if( ai_capture_enemy_town_recno && !town_array.is_deleted(ai_capture_enemy_town_recno) && town_array[ai_capture_enemy_town_recno]->nation_recno == withNationRecno ) { return -1; } //--- don't cease fire too soon after a war is declared ---// if( info.game_date < nationRelation->last_change_status_date + 60 + (100-pref_peacefulness) ) // more peaceful nation may cease fire sooner (but the minimum is 60 days). return -1; //------ if we're run short of money for war -----// Nation* withNation = nation_array[withNationRecno]; if( !ai_should_spend_war(withNation->military_rank_rating(), 1) ) // if we shouldn't spend any more on war, then return 1 return 1; //------------------------------------------------// int curRating = consider_alliance_rating(withNationRecno); //------------------------------------// // // Tend to be easilier to accept cease-fire if this nation's // military strength is weak. // // If the nation's peacefulness concern is high, it will // also be more likely to accept cease-fire. // //-------------------------------------// //--- if the enemy is more power than us, tend more to request cease-fire ---// curRating += total_enemy_military() - military_rank_rating(); curRating += ai_trade_with_rating(withNationRecno) * (100+pref_trading_tendency) / 300; // when we have excessive supply, we may want to cease-fire with our enemy curRating -= (military_rank_rating()-50)/2; // if our military ranking is high, we may like to continue the war, otherwise the nation should try to cease-fire curRating -= nationRelation->started_war_on_us_count*10; // the number of times this nation has started a war with us, the higher the number, the more unlikely we will accept cease-fire int acceptRating = pref_peacefulness/4; return curRating - acceptRating; }