Feature #1469 ยป 0090-daidiplomacy.c-Improve-coding-style.patch
| ai/default/daidiplomacy.c | ||
|---|---|---|
|
struct packet_chat_msg packet;
|
||
|
va_start(ap, text);
|
||
|
vpackage_event(&packet, NULL, E_DIPLOMACY, ftc_chat_private, text, ap);
|
||
|
vpackage_event(&packet, nullptr, E_DIPLOMACY, ftc_chat_private,
|
||
|
text, ap);
|
||
|
va_end(ap);
|
||
|
lsend_packet_chat_msg(dest, &packet);
|
||
| ... | ... | |
|
}
|
||
|
/******************************************************************//**
|
||
|
This is your typical human reaction. Convert lack of love into
|
||
|
This is your typical human reaction. Convert lack of love into
|
||
|
lust for gold.
|
||
|
**********************************************************************/
|
||
|
static int greed(int missing_love)
|
||
| ... | ... | |
|
if (TECH_PREREQS_KNOWN == state) {
|
||
|
worth /= 2;
|
||
|
}
|
||
|
return worth;
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
} players_iterate_alive_end;
|
||
|
return TRUE;
|
||
|
}
|
||
| ... | ... | |
|
return aplayer;
|
||
|
}
|
||
|
} players_iterate_alive_end;
|
||
|
return NULL;
|
||
|
return nullptr;
|
||
|
}
|
||
|
/******************************************************************//**
|
||
| ... | ... | |
|
if (game.info.tech_upkeep_style != TECH_UPKEEP_NONE) {
|
||
|
/* Consider the upkeep costs! Thus, one can not get an AI player by
|
||
|
* - given AI lots of techs for gold/cities etc.
|
||
|
* - AI losses tech due to high upkeep.
|
||
|
* - AI losses tech due to high upkeep.
|
||
|
* FIXME: Is there a better way for this? */
|
||
|
struct research *research = research_get(pplayer);
|
||
|
int limit;
|
||
| ... | ... | |
|
case CLAUSE_CEASEFIRE:
|
||
|
/* Don't do anything in away mode */
|
||
|
if (has_handicap(pplayer, H_AWAY)) {
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* In away mode AI can't sign such a treaty."),
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* In away mode AI can't sign such a treaty."),
|
||
|
player_name(pplayer));
|
||
|
worth = -BIG_NUMBER;
|
||
|
break;
|
||
| ... | ... | |
|
&& pclause->type != CLAUSE_CEASEFIRE) {
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* I would like to see you keep your "
|
||
|
"distance from %s for some time, %s."),
|
||
|
player_name(pplayer), player_name(adip->is_allied_with_enemy),
|
||
|
player_name(pplayer),
|
||
|
player_name(adip->is_allied_with_enemy),
|
||
|
player_name(aplayer));
|
||
|
worth = -BIG_NUMBER;
|
||
|
break;
|
||
| ... | ... | |
|
= player_diplstate_get(pplayer, aplayer);
|
||
|
if (!pplayers_non_attack(pplayer, aplayer)) {
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* Let us first cease hostilities, %s."),
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* Let us first cease hostilities, %s."),
|
||
|
player_name(pplayer),
|
||
|
player_name(aplayer));
|
||
|
worth = -BIG_NUMBER;
|
||
|
} else if (ds->type == DS_CEASEFIRE && ds->turns_left > 4) {
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* I wish to see you keep the current "
|
||
|
"ceasefire for a bit longer first, %s."),
|
||
|
player_name(pplayer),
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* I wish to see you keep the current "
|
||
|
"ceasefire for a bit longer first, %s."),
|
||
|
player_name(pplayer),
|
||
|
player_name(aplayer));
|
||
|
worth = -BIG_NUMBER;
|
||
|
} else if (adip->countdown >= 0 || adip->countdown < -1) {
|
||
|
worth = -BIG_NUMBER; /* but say nothing */
|
||
|
worth = -BIG_NUMBER; /* But say nothing */
|
||
|
} else {
|
||
|
worth = greed(pplayer->ai_common.love[player_index(aplayer)]
|
||
|
- ai->diplomacy.req_love_for_peace);
|
||
| ... | ... | |
|
- ai->diplomacy.req_love_for_peace);
|
||
|
}
|
||
|
if (adip->countdown >= 0 || adip->countdown < -1) {
|
||
|
worth = -BIG_NUMBER; /* but say nothing */
|
||
|
worth = -BIG_NUMBER; /* But say nothing */
|
||
|
} else {
|
||
|
worth += greed(pplayer->ai_common.love[player_index(aplayer)]
|
||
|
- ai->diplomacy.req_love_for_alliance);
|
||
| ... | ... | |
|
turns -= player_diplstate_get(pplayer, aplayer)->first_contact_turn;
|
||
|
if (turns < TURNS_BEFORE_TARGET) {
|
||
|
worth = 0; /* show some good faith */
|
||
|
worth = 0; /* Show some good faith */
|
||
|
break;
|
||
|
} else {
|
||
|
worth = greed(pplayer->ai_common.love[player_index(aplayer)]);
|
||
| ... | ... | |
|
if (!offer || city_owner(offer) != giver) {
|
||
|
/* City destroyed or taken during negotiations */
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* I do not know the city you mention."),
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* I do not know the city you mention."),
|
||
|
player_name(pplayer));
|
||
|
worth = 0;
|
||
|
DIPLO_LOG(ait, LOG_DEBUG, pplayer, aplayer, "city destroyed during negotiations");
|
||
|
DIPLO_LOG(ait, LOG_DEBUG, pplayer, aplayer,
|
||
|
"city destroyed during negotiations");
|
||
|
} else if (give) {
|
||
|
/* AI must be crazy to trade away its cities */
|
||
|
worth -= city_gold_worth(nmap, offer);
|
||
| ... | ... | |
|
} else {
|
||
|
worth = city_gold_worth(nmap, offer);
|
||
|
}
|
||
|
if (offer != NULL) {
|
||
|
DIPLO_LOG(ait, LOG_DEBUG, pplayer, aplayer, "worth of %s is %d",
|
||
|
if (offer != nullptr) {
|
||
|
DIPLO_LOG(ait, LOG_DEBUG, pplayer, aplayer, "worth of %s is %d",
|
||
|
city_name_get(offer), worth);
|
||
|
}
|
||
|
break;
|
||
| ... | ... | |
|
_("*%s (AI)* Sorry, sharing vision with you "
|
||
|
"is not safe."),
|
||
|
player_name(pplayer));
|
||
|
worth = -BIG_NUMBER;
|
||
|
} else {
|
||
|
worth = -BIG_NUMBER;
|
||
|
} else {
|
||
|
worth = 0;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
/* so out of the question */
|
||
|
/* So out of the question */
|
||
|
worth = -BIG_NUMBER;
|
||
|
}
|
||
|
} else {
|
||
| ... | ... | |
|
worth = -5 * game.info.turn;
|
||
|
} else {
|
||
|
worth = MIN(-50 * game.info.turn
|
||
|
+ pplayer->ai_common.love[player_index(aplayer)],
|
||
|
+ pplayer->ai_common.love[player_index(aplayer)],
|
||
|
-5 * game.info.turn);
|
||
|
}
|
||
|
} else if (game.info.tech_leakage == TECH_LEAKAGE_EMBASSIES) {
|
||
| ... | ... | |
|
case CLAUSE_COUNT:
|
||
|
fc_assert(pclause->type != CLAUSE_COUNT);
|
||
|
break;
|
||
|
} /* end of switch */
|
||
|
} /* End of switch */
|
||
|
if (close_here) {
|
||
|
dai_data_phase_finished(ait, pplayer);
|
||
|
}
|
||
|
diplomacy_verbose = TRUE;
|
||
|
return worth;
|
||
|
}
|
||
| ... | ... | |
|
{
|
||
|
int total_balance = 0;
|
||
|
bool only_gifts = TRUE;
|
||
|
enum diplstate_type ds_after =
|
||
|
player_diplstate_get(pplayer, aplayer)->type;
|
||
|
enum diplstate_type ds_after
|
||
|
= player_diplstate_get(pplayer, aplayer)->type;
|
||
|
int given_cities = 0;
|
||
|
clause_list_iterate(ptreaty->clauses, pclause) {
|
||
| ... | ... | |
|
ds_after = pact_clause_to_diplstate_type(pclause->type);
|
||
|
}
|
||
|
if (pclause->type == CLAUSE_CITY && pclause->from == pplayer) {
|
||
|
given_cities++;
|
||
|
}
|
||
|
given_cities++;
|
||
|
}
|
||
|
} clause_list_iterate_end;
|
||
|
|
||
|
/* Evaluate clauses */
|
||
|
clause_list_iterate(ptreaty->clauses, pclause) {
|
||
|
const struct research *presearch = research_get(pplayer);
|
||
| ... | ... | |
|
if (pclause->type != CLAUSE_GOLD && pclause->type != CLAUSE_MAP
|
||
|
&& pclause->type != CLAUSE_SEAMAP && pclause->type != CLAUSE_VISION
|
||
|
&& (pclause->type != CLAUSE_ADVANCE
|
||
|
&& (pclause->type != CLAUSE_ADVANCE
|
||
|
|| game.info.tech_cost_style != TECH_COST_CIV1CIV2
|
||
|
|| pclause->value == research_get(pplayer)->tech_goal
|
||
|
|| pclause->value == research_get(pplayer)->researching
|
||
| ... | ... | |
|
/* Accept if balance is good */
|
||
|
if (total_balance >= 0) {
|
||
|
handle_diplomacy_accept_treaty_req(pplayer, player_number(aplayer));
|
||
|
DIPLO_LOG(ait, LOG_DIPL2, pplayer, aplayer, "balance was good: %d",
|
||
|
DIPLO_LOG(ait, LOG_DIPL2, pplayer, aplayer, "balance was good: %d",
|
||
|
total_balance);
|
||
|
} else {
|
||
|
/* AI complains about the treaty which was proposed, unless the AI
|
||
|
* made the proposal. */
|
||
|
if (pplayer != ptreaty->plr0) {
|
||
|
dai_diplo_notify(aplayer, _("*%s (AI)* This deal was not very good for us, %s!"),
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* This deal was not very good for us, %s!"),
|
||
|
player_name(pplayer),
|
||
|
player_name(aplayer));
|
||
|
}
|
||
|
DIPLO_LOG(ait, LOG_DIPL2, pplayer, aplayer, "balance was bad: %d",
|
||
|
DIPLO_LOG(ait, LOG_DIPL2, pplayer, aplayer, "balance was bad: %d",
|
||
|
total_balance);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
struct ai_plr *ai;
|
||
|
int total_balance = 0;
|
||
|
bool gift = TRUE;
|
||
|
enum diplstate_type ds_after =
|
||
|
player_diplstate_get(pplayer, aplayer)->type;
|
||
|
enum diplstate_type ds_after
|
||
|
= player_diplstate_get(pplayer, aplayer)->type;
|
||
|
ai = dai_plr_data_get(ait, pplayer, &close_here);
|
||
| ... | ... | |
|
/* Evaluate clauses */
|
||
|
clause_list_iterate(ptreaty->clauses, pclause) {
|
||
|
int balance =
|
||
|
dai_goldequiv_clause(ait, pplayer, aplayer, pclause, TRUE, ds_after);
|
||
|
int balance
|
||
|
= dai_goldequiv_clause(ait, pplayer, aplayer, pclause, TRUE, ds_after);
|
||
|
total_balance += balance;
|
||
|
gift = (gift && (balance >= 0));
|
||
| ... | ... | |
|
static int dai_war_desire(struct ai_type *ait, struct player *pplayer,
|
||
|
struct player *target)
|
||
|
{
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, NULL);
|
||
|
struct adv_data *adv = adv_data_get(pplayer, NULL);
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, nullptr);
|
||
|
struct adv_data *adv = adv_data_get(pplayer, nullptr);
|
||
|
int want = 0, fear = 0, distance = 0, settlers = 0, cities = 0;
|
||
|
struct player_spaceship *ship = &target->spaceship;
|
||
|
city_list_iterate(target->cities, pcity) {
|
||
|
want += 100; /* base city want */
|
||
|
want += 100; /* Base city want */
|
||
|
want += city_size_get(pcity) * 20;
|
||
|
want += pcity->surplus[O_SHIELD] * 8;
|
||
|
want += pcity->surplus[O_TRADE] * 6;
|
||
| ... | ... | |
|
} city_list_iterate_end;
|
||
|
/* Modify by settler/cities ratio to prevent early wars when
|
||
|
* we should be expanding. This will eliminate want if we
|
||
|
* we should be expanding. This will eliminate want if we
|
||
|
* produce settlers in all cities (ie full expansion). */
|
||
|
want -= abs(want) / MAX(cities - settlers, 1);
|
||
| ... | ... | |
|
}
|
||
|
if (adv->dipl.spacerace_leader == target) {
|
||
|
ai->diplomacy.strategy = WIN_CAPITAL;
|
||
|
return BIG_NUMBER; /* do NOT amortize this number! */
|
||
|
return BIG_NUMBER; /* Do NOT amortize this number! */
|
||
|
}
|
||
|
/* Modify by which treaties we would break to other players, and what
|
||
| ... | ... | |
|
} players_iterate_alive_end;
|
||
|
/* Modify by love. Increase the divisor to make ai go to war earlier */
|
||
|
want -= MAX(0, want * pplayer->ai_common.love[player_index(target)]
|
||
|
want -= MAX(0, want * pplayer->ai_common.love[player_index(target)]
|
||
|
/ (2 * MAX_AI_LOVE));
|
||
|
/* Make novice AI more peaceful with human players */
|
||
| ... | ... | |
|
pplayer is the (AI) player suggesting the treaty.
|
||
|
If to_pplayer, then aplayer is giver in the clause, else pplayer is.
|
||
|
**********************************************************************/
|
||
|
static void dai_diplomacy_suggest(struct player *pplayer,
|
||
|
struct player *aplayer,
|
||
|
enum clause_type what,
|
||
|
static void dai_diplomacy_suggest(struct player *pplayer,
|
||
|
struct player *aplayer,
|
||
|
enum clause_type what,
|
||
|
bool to_pplayer,
|
||
|
int value)
|
||
|
int value)
|
||
|
{
|
||
|
if (!could_meet_with_player(pplayer, aplayer)) {
|
||
|
log_base(LOG_DIPL2, "%s tries to do diplomacy to %s without contact",
|
||
| ... | ... | |
|
Only ever called for AI players and never for barbarians.
|
||
|
This is called at the start of a new AI phase. It's not called when
|
||
|
a game is loaded. So everything calculated here should be put into
|
||
|
This is called at the start of a new AI phase. It's not called when
|
||
|
a game is loaded. So everything calculated here should be put into
|
||
|
the savegame.
|
||
|
**********************************************************************/
|
||
|
void dai_diplomacy_begin_new_phase(struct ai_type *ait, struct player *pplayer)
|
||
|
{
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, NULL);
|
||
|
struct adv_data *adv = adv_data_get(pplayer, NULL);
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, nullptr);
|
||
|
struct adv_data *adv = adv_data_get(pplayer, nullptr);
|
||
|
int war_desire[player_slot_count()];
|
||
|
int best_desire = 0;
|
||
|
struct player *best_target = NULL;
|
||
|
struct player *best_target = nullptr;
|
||
|
fc_assert_ret(is_ai(pplayer));
|
||
|
if (!pplayer->is_alive) {
|
||
|
return; /* duh */
|
||
|
return; /* Duh */
|
||
|
}
|
||
|
memset(war_desire, 0, sizeof(war_desire));
|
||
| ... | ... | |
|
pit = player_in_territory(pplayer, aplayer) * (MAX_AI_LOVE / 200);
|
||
|
amount -= MIN(pit,
|
||
|
ai->diplomacy.love_incr
|
||
|
* ((adip->is_allied_with_enemy != NULL) + 1));
|
||
|
* ((adip->is_allied_with_enemy != nullptr) + 1));
|
||
|
pplayer->ai_common.love[player_index(aplayer)] += amount;
|
||
|
if (amount != 0) {
|
||
|
DIPLO_LOG(ait, LOG_DEBUG, pplayer, aplayer, "%d love lost due to units inside "
|
||
|
"our borders", amount);
|
||
|
}
|
||
|
/* Increase the love if aplayer has got a building that makes
|
||
|
/* Increase the love if aplayer has got a building that makes
|
||
|
* us love them more. Typically it's Eiffel Tower */
|
||
|
if (!NEVER_MET(pplayer, aplayer)) {
|
||
|
pplayer->ai_common.love[player_index(aplayer)] +=
|
||
| ... | ... | |
|
/* Edge love towards zero */
|
||
|
*love -= *love * ((double)ai->diplomacy.love_coeff / 100.0);
|
||
|
/* ai love should always be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
|
||
|
/* AI love should always be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
|
||
|
*love = MAX(-MAX_AI_LOVE, MIN(MAX_AI_LOVE, *love));
|
||
|
} players_iterate_end;
|
||
|
}
|
||
| ... | ... | |
|
{
|
||
|
struct treaty *old_treaty = find_treaty(pplayer, aplayer);
|
||
|
if (old_treaty != NULL) {
|
||
|
if (old_treaty != nullptr) {
|
||
|
/* Remove existing clauses */
|
||
|
clause_list_iterate(old_treaty->clauses, pclause) {
|
||
|
dlsend_packet_diplomacy_remove_clause(aplayer->connections,
|
||
| ... | ... | |
|
{
|
||
|
struct ai_plr *data = def_ai_player_data(pplayer, ait);
|
||
|
if (data->diplomacy.war_target != NULL) {
|
||
|
if (data->diplomacy.war_target != nullptr) {
|
||
|
if (gives_shared_vision(pplayer, data->diplomacy.war_target)) {
|
||
|
remove_shared_vision(pplayer, data->diplomacy.war_target);
|
||
|
}
|
||
|
dai_declare_war(ait, pplayer, data->diplomacy.war_target);
|
||
|
data->diplomacy.war_target = NULL;
|
||
|
data->diplomacy.war_target = nullptr;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
adip->war_reason = reason;
|
||
|
players_iterate_alive(ally) {
|
||
|
if (!pplayers_allied(pplayer, ally)
|
||
|
if (!pplayers_allied(pplayer, ally)
|
||
|
|| ally == target
|
||
|
|| NEVER_MET(pplayer, ally)) {
|
||
|
continue;
|
||
| ... | ... | |
|
"civilization of %s. We declare war in %d turn.",
|
||
|
"*%s (AI)* We intend to pillage and plunder the rich "
|
||
|
"civilization of %s. We declare war in %d turns.",
|
||
|
countdown),
|
||
|
countdown),
|
||
|
player_name(pplayer),
|
||
|
player_name(target),
|
||
|
countdown);
|
||
| ... | ... | |
|
"declare war on %s in %d turns. We expect you to "
|
||
|
"do likewise.",
|
||
|
countdown),
|
||
|
player_name(pplayer),
|
||
|
player_name(pplayer),
|
||
|
player_name(adip->at_war_with_ally),
|
||
|
player_name(target),
|
||
|
countdown);
|
||
| ... | ... | |
|
**********************************************************************/
|
||
|
void dai_diplomacy_actions(struct ai_type *ait, struct player *pplayer)
|
||
|
{
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, NULL);
|
||
|
struct ai_plr *ai = dai_plr_data_get(ait, pplayer, nullptr);
|
||
|
bool need_targets = TRUE;
|
||
|
struct player *target = NULL;
|
||
|
struct player *target = nullptr;
|
||
|
int most_hatred = MAX_AI_LOVE;
|
||
|
int war_threshold;
|
||
|
int aggr;
|
||
| ... | ... | |
|
/*** Stop other players from winning by space race ***/
|
||
|
if (ai->diplomacy.strategy != WIN_SPACE) {
|
||
|
struct adv_data *adv = adv_data_get(pplayer, NULL);
|
||
|
struct adv_data *adv = adv_data_get(pplayer, nullptr);
|
||
|
players_iterate_alive(aplayer) {
|
||
|
struct ai_dip_intel *adip = dai_diplomacy_get(ait, pplayer, aplayer);
|
||
|
struct player_spaceship *ship = &aplayer->spaceship;
|
||
|
if (aplayer == pplayer
|
||
|
|| adip->countdown >= 0 /* already counting down to war */
|
||
|
|| adip->countdown >= 0 /* Already counting down to war */
|
||
|
|| ship->state == SSHIP_NONE
|
||
|
|| players_on_same_team(pplayer, aplayer)
|
||
|
|| pplayers_at_war(pplayer, aplayer)) {
|
||
| ... | ... | |
|
}
|
||
|
/* Never forgive this */
|
||
|
pplayer->ai_common.love[player_index(aplayer)] = -MAX_AI_LOVE;
|
||
|
} else if (ship->state == SSHIP_STARTED
|
||
|
} else if (ship->state == SSHIP_STARTED
|
||
|
&& adip->warned_about_space == 0) {
|
||
|
pplayer->ai_common.love[player_index(aplayer)] -= MAX_AI_LOVE / 10;
|
||
|
adip->warned_about_space = 10 + fc_rand(6);
|
||
| ... | ... | |
|
/*** Declare war against somebody if we are out of targets ***/
|
||
|
players_iterate_alive(aplayer) {
|
||
|
int turns; /* turns since contact */
|
||
|
int turns; /* Turns since contact */
|
||
|
if (NEVER_MET(pplayer, aplayer)) {
|
||
|
continue;
|
||
| ... | ... | |
|
if (adip->at_war_with_ally) {
|
||
|
break;
|
||
|
}
|
||
|
target = NULL;
|
||
|
target = nullptr;
|
||
|
players_iterate(eplayer) {
|
||
|
if (WAR(pplayer, eplayer)
|
||
|
&& !pplayers_at_war(aplayer, eplayer)) {
|
||
| ... | ... | |
|
}
|
||
|
if (adip->spam <= 0) {
|
||
|
/* Count down patience toward AI player (one that can have spam > 0)
|
||
|
/* Count down patience toward AI player (one that can have spam > 0)
|
||
|
* at the same speed as toward human players. */
|
||
|
if (adip->ally_patience == 0) {
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* Greetings our most trustworthy "
|
||
|
"ally. We call upon you to destroy our enemy, %s."),
|
||
|
"ally. We call upon you to destroy our enemy, %s."),
|
||
|
player_name(pplayer),
|
||
|
player_name(target));
|
||
|
adip->ally_patience--;
|
||
| ... | ... | |
|
adip->asked_about_alliance = is_human(aplayer) ? 13 : 0;
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* Greetings friend, may we suggest "
|
||
|
"making a common cause and join in an alliance?"),
|
||
|
"making a common cause and join in an alliance?"),
|
||
|
player_name(pplayer));
|
||
|
break;
|
||
| ... | ... | |
|
player_name(pplayer));
|
||
|
break;
|
||
|
case DS_NO_CONTACT: /* but we do have embassy! weird. */
|
||
|
case DS_NO_CONTACT: /* But we do have embassy! weird. */
|
||
|
case DS_WAR:
|
||
|
clause.type = CLAUSE_CEASEFIRE;
|
||
|
if ((is_human(aplayer) && adip->asked_about_ceasefire > 0)
|
||
| ... | ... | |
|
adip->asked_about_ceasefire = is_human(aplayer) ? 9 : 0;
|
||
|
dai_diplo_notify(aplayer,
|
||
|
_("*%s (AI)* We grow weary of this constant "
|
||
|
"bloodshed. May we suggest a cessation of hostilities?"),
|
||
|
"bloodshed. May we suggest a cessation of hostilities?"),
|
||
|
player_name(pplayer));
|
||
|
break;
|
||
| ... | ... | |
|
}
|
||
|
/******************************************************************//**
|
||
|
Are we going to be declaring war in a few turns time? If so, go
|
||
|
Are we going to be declaring war in a few turns time? If so, go
|
||
|
on a war footing, and try to buy out as many units as possible.
|
||
|
**********************************************************************/
|
||
|
bool dai_on_war_footing(struct ai_type *ait, struct player *pplayer)
|
||
| ... | ... | |
|
}
|
||
|
/******************************************************************//**
|
||
|
War declared against a player. We apply a penalty because this
|
||
|
War declared against a player. We apply a penalty because this
|
||
|
means they are seen as untrustworthy, especially if past relations
|
||
|
with the victim have been cordial (betrayal).
|
||
| ... | ... | |
|
pplayer->ai_common.love[player_index(violator)] -= MAX_AI_LOVE / 10;
|
||
|
}
|
||
|
if (victim == pplayer) {
|
||
|
pplayer->ai_common.love[player_index(violator)] =
|
||
|
pplayer->ai_common.love[player_index(violator)] =
|
||
|
MIN(pplayer->ai_common.love[player_index(violator)] - MAX_AI_LOVE / 3, -1);
|
||
|
/* Scream for help!! */
|
||
|
players_iterate_alive(ally) {
|
||