Complete.Org: Mailing Lists: Archives: freeciv-ai: September 2004:
[freeciv-ai] (PR#10170) MAX_AI_LOVE
Home

[freeciv-ai] (PR#10170) MAX_AI_LOVE

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [freeciv-ai] (PR#10170) MAX_AI_LOVE
From: "Mateusz Stefek" <mstefek@xxxxxxxxx>
Date: Fri, 17 Sep 2004 13:46:06 -0700
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=10170 >

This patch adds new constant: MAX_AI_LOVE
It also simplifies greed() function - It was some kind of
spline-aproximation of x^2/50, new we use exactly x^2/50.
--
mateusz
? freeciv.spec
? ai/test
? client/civgame-3950.sav.gz
? server/civgame-3700.sav.gz
? server/civgame-3900.sav.gz
? server/civgame-3950.sav.gz
? server/freeciv_user_database
Index: ai/advdiplomacy.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/advdiplomacy.c,v
retrieving revision 1.42
diff -u -r1.42 advdiplomacy.c
--- ai/advdiplomacy.c   17 Sep 2004 08:35:14 -0000      1.42
+++ ai/advdiplomacy.c   17 Sep 2004 20:44:41 -0000
@@ -100,28 +100,17 @@
   lust for gold.
 ***********************************************************************/
 static int greed(int missing_love)
-#define NUM_BANDS 5
 {
-  int band_incr[NUM_BANDS] = {50, 50, 100, 200, 300};
-  int band_rate[NUM_BANDS+1] = {1, 3, 5, 10, 25, 50};
-  int greed = 0;
-  int i = 0;
-  int n_love = -missing_love;
-
-  while(i < NUM_BANDS && n_love > 0) {
-    int band_love = MIN(band_incr[i], n_love);
-
-    greed += band_love * band_rate[i];
-    n_love -= band_incr[i];
-    i++;
-  }
-
-  if (n_love > 0) {
-    greed += n_love * band_rate[NUM_BANDS];
+  if (missing_love > 0) {
+    return 0;
+  } else {
+    /* Don't change the operation order here.
+     * We do not want integer overflows */
+    return ((missing_love * MAX_AI_LOVE) / 1000) * 
+           ((missing_love * MAX_AI_LOVE) / 1000) /
+          50;
   }
-  return (-greed);
 }
-#undef NUM_BANDS
 
 /********************************************************************** 
   How much is a tech worth to player measured in gold
@@ -175,7 +164,7 @@
   return (ai1->diplomacy.target != player2 && 
           (player1 == ai1->diplomacy.alliance_leader ||
            !pplayers_at_war(player2, ai1->diplomacy.alliance_leader)) &&
-         player1->ai.love[player2->player_no] > -400 &&
+         player1->ai.love[player2->player_no] > - (MAX_AI_LOVE * 4 / 10)  &&
          (ai1->diplomacy.target == NULL || 
           !pplayers_allied(ai1->diplomacy.target, player2)));
 }
@@ -652,7 +641,7 @@
   /* Modify by love. Increase the divisor to make ai go to war earlier */
   kill_desire -= MAX(0, kill_desire 
                         * pplayer->ai.love[aplayer->player_no] 
-                        / 2000);
+                        / (2 * MAX_AI_LOVE));
 
   /* Amortize by distance */
   return amortize(kill_desire, adip->distance);
@@ -720,7 +709,7 @@
       if (ai->diplomacy.target != aplayer && 
           pplayer->ai.love[aplayer->player_no] < 0) {
         /* Give him a better chance for a cease fire */
-        pplayer->ai.love[aplayer->player_no] += 30;
+        pplayer->ai.love[aplayer->player_no] += (MAX_AI_LOVE) * 3 / 100;
       }
       PLAYER_LOG(LOG_DEBUG, pplayer, ai, "Reduced love for %s (now %d) ",
                  aplayer->name, pplayer->ai.love[aplayer->player_no]);
@@ -737,18 +726,19 @@
     /* Reduce love by number of units in our territory.
      * AI is so naive, that we have to count it even if players are allied */
     pplayer->ai.love[aplayer->player_no] -=
-      MIN(player_in_territory(pplayer, aplayer) * 10,
+      MIN(player_in_territory(pplayer, aplayer) * (MAX_AI_LOVE / 100),
           pplayers_allied(aplayer, pplayer) ? 
-           ai->diplomacy.love_incr - 1 : 500);
+           ai->diplomacy.love_incr - 1 : (MAX_AI_LOVE / 2));
          
     /* Massage our numbers to keep love and its opposite on the ground. 
      * Gravitate towards zero. */
     pplayer->ai.love[aplayer->player_no] -= 
        (pplayer->ai.love[aplayer->player_no] * ai->diplomacy.love_coeff / 100);
        
-    /* ai love should always be in range [-1000..1000] */
+    /* ai love should always be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
     pplayer->ai.love[aplayer->player_no] = 
-      MAX(-1000, MIN(1000, pplayer->ai.love[aplayer->player_no]));
+      MAX(-MAX_AI_LOVE,
+          MIN(MAX_AI_LOVE, pplayer->ai.love[aplayer->player_no]));
   } players_iterate_end;
 
   /* Stop war against a dead player */
Index: ai/aidata.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aidata.c,v
retrieving revision 1.39
diff -u -r1.39 aidata.c
--- ai/aidata.c 14 Sep 2004 09:12:21 -0000      1.39
+++ ai/aidata.c 17 Sep 2004 20:44:44 -0000
@@ -442,9 +442,9 @@
   ai->diplomacy.timer = 0;
   ai->diplomacy.countdown = 0;
   ai->diplomacy.love_coeff = 4; /* 4% */
-  ai->diplomacy.love_incr = 40;
-  ai->diplomacy.req_love_for_peace = 80;
-  ai->diplomacy.req_love_for_alliance = 160;
+  ai->diplomacy.love_incr = MAX_AI_LOVE * 4 / 100;
+  ai->diplomacy.req_love_for_peace = MAX_AI_LOVE * 8 / 100;
+  ai->diplomacy.req_love_for_alliance = MAX_AI_LOVE * 16 / 100;
   ai->diplomacy.req_love_for_ceasefire = 0;
   ai->diplomacy.alliance_leader = pplayer;
 
Index: common/player.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/player.c,v
retrieving revision 1.155
diff -u -r1.155 player.c
--- common/player.c     17 Sep 2004 08:35:14 -0000      1.155
+++ common/player.c     17 Sep 2004 20:44:50 -0000
@@ -566,28 +566,28 @@
 **************************************************************************/
 const char *love_text(const int love)
 {
-  if (love <= -950) {
+  if (love <= - MAX_AI_LOVE * 90 / 100) {
     return Q_("?attitude:Genocidal");
-  } else if (love >= -949 && love <= -701) {
+  } else if (love <= - MAX_AI_LOVE * 70 / 100) {
     return Q_("?attitude:Belligerent");
-  } else if (love >= -700 && love <= -501) {
+  } else if (love <= - MAX_AI_LOVE * 50 / 100) {
     return Q_("?attitude:Hostile");
-  } else if (love >= -500 && love <= -251) {
+  } else if (love <= - MAX_AI_LOVE * 25 / 100) {
     return Q_("?attitude:Uncooperative");
-  } else if (love >= -250 && love <= -101) {
+  } else if (love <= - MAX_AI_LOVE * 10 / 100) {
     return Q_("?attitude:Uneasy");
-  } else if (love >= -100 && love <= 100) {
+  } else if (love <= MAX_AI_LOVE * 10 / 100) {
     return Q_("?attitude:Neutral");
-  } else if (love >= 101 && love <= 250) {
+  } else if (love <= MAX_AI_LOVE * 25 / 100) {
     return Q_("?attitude:Respectful");
-  } else if (love >= 251 && love <= 500) {
+  } else if (love <= MAX_AI_LOVE * 50 / 100) {
     return Q_("?attitude:Helpful");
-  } else if (love >= 501 && love <= 700) {
+  } else if (love <= MAX_AI_LOVE * 70 / 100) {
     return Q_("?attitude:Enthusiastic");
-  } else if (love >= 701 && love <= 949) {
+  } else if (love <= MAX_AI_LOVE * 90 / 100) {
     return Q_("?attitude:Admiring");
   } else {
-    assert(love >= 950);
+    assert(love > MAX_AI_LOVE * 90 / 100);
     return Q_("?attitude:Worshipful");
   }
 }
Index: common/player.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/player.h,v
retrieving revision 1.126
diff -u -r1.126 player.h
--- common/player.h     17 Sep 2004 08:35:14 -0000      1.126
+++ common/player.h     17 Sep 2004 20:44:51 -0000
@@ -303,4 +303,7 @@
   }                                                                           \
 }
 
+/* ai love values should be in range [-MAX_AI_LOVE..MAX_AI_LOVE] */
+#define MAX_AI_LOVE 1000
+
 #endif  /* FC__PLAYER_H */

[Prev in Thread] Current Thread [Next in Thread]
  • [freeciv-ai] (PR#10170) MAX_AI_LOVE, Mateusz Stefek <=