Complete.Org: Mailing Lists: Archives: freeciv-ai: September 2005:
[freeciv-ai] (PR#14053) naive AI and ceasefire
Home

[freeciv-ai] (PR#14053) naive AI and ceasefire

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Subject: [freeciv-ai] (PR#14053) naive AI and ceasefire
From: "Mateusz Stefek" <mstefek@xxxxxxxxx>
Date: Tue, 20 Sep 2005 11:10:54 -0700
Reply-to: bugs@xxxxxxxxxxx

<URL: http://bugs.freeciv.org/Ticket/Display.html?id=14053 >

> [lo_oris@xxxxxxxx - Tue Sep 20 17:01:37 2005]:
> 
> Il giorno 20/set/05, alle 15:15, Mateusz Stefek ha scritto:
> 
> > (Of course leaving empty cities is also a bug)
> 
> i was able to conquer in one single turn 5-6 AI empty cities: he was 
> leaving them empty with my horsemen nearby, just because we were 
> allies.

As I have just noticed, is_player_dangerous trusts neutral players.
Here's my proposed change. Now I cannot take few warriors on the earth
map and kill few players in the beginning - they protect their cities.
--
mateusz
Index: ai/aitools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
retrieving revision 1.161
diff -u -r1.161 aitools.c
--- ai/aitools.c        26 Aug 2005 19:27:40 -0000      1.161
+++ ai/aitools.c        20 Sep 2005 17:58:31 -0000
@@ -112,20 +112,49 @@
 /**********************************************************************
   There are some signs that a player might be dangerous: We are at 
   war with him, he has done lots of ignoble things to us, he is an 
-  ally of one of our enemies (a ticking bomb to be sure), or he is 
-  our war target.
+  ally of one of our enemies (a ticking bomb to be sure), he is 
+  our war target, we don't like him, diplomatic state is neutral 
+  or we have case fire.
+  This function is used for example to check if pplayer can leave
+  his city undefended when aplayer's units are near it.
 ***********************************************************************/
 bool is_player_dangerous(struct player *pplayer, struct player *aplayer)
 {
-  struct ai_data *ai = ai_data_get(pplayer);
-  struct ai_dip_intel *adip = &ai->diplomacy.player_intel[aplayer->player_no];
-  int reason = pplayer->diplstates[aplayer->player_no].has_reason_to_cancel;
+  struct ai_dip_intel *adip;
+  struct ai_data *ai;
+  enum diplstate_type ds;
+
+  if (pplayer == aplayer) {
+    /* We always trust ourself */
+    return FALSE;
+  }
+  
+  ds = pplayer_get_diplstate(pplayer, aplayer)->type;
+  
+  if (ds == DS_WAR || ds == DS_CEASEFIRE || ds == DS_NEUTRAL) {
+    /* It's already a war or aplayer can declare it soon */
+    return TRUE;
+  }
 
-  return (pplayer != aplayer
-          && (pplayers_at_war(pplayer, aplayer)
-              || adip->countdown >= 0
-              || reason != 0
-              || adip->is_allied_with_enemy));
+  ai = ai_data_get(pplayer);
+  adip = &(ai->diplomacy.player_intel[aplayer->player_no]);
+  
+  if (adip->countdown >= 0 || adip->is_allied_with_enemy) {
+    /* Don't trust our war target or someone who will declare war on us soon */
+    return TRUE;
+  }
+  
+  if (pplayer->diplstates[aplayer->player_no].has_reason_to_cancel > 0) {
+    return TRUE;
+  }
+  
+  if (pplayer->ai.love[aplayer->player_no] < MAX_AI_LOVE / 10) {
+    /* We don't trust players who we don't like. Note that 
+     * aplayer's units inside pplayer's borders decreases AI's love */
+    return TRUE;
+  }
+  
+  return FALSE;
 }
 
 /*************************************************************************

[Prev in Thread] Current Thread [Next in Thread]