(PR#11009) AI Hunts Own Units
"Gregory Berkolaiko" <[email protected]> Thu, 18 Nov 2004 18:48:54 -0800
| Newsgroups | gmane.games.freeciv.ai |
|---|---|
| Message-ID | <[email protected]> |
<URL: http://rt.freeciv.org/Ticket/Display.html?id=11009 > > [[email protected] - Thu Nov 18 23:17:39 2004]: > > OK, it seems you won't let me wriggle out of this one :-). A proper try > this time. > > Self loathing leads to self harm: some additional assertions revealled > the culprit to be the comparison > ai->diplomacy.acceptable_reputation > aplayer->reputation > That is, if the AI is a scum bag, he thinks he is a danger to himself. Hehe! Good job. > Attached is a patch, which fixes the problem, provides comments to > document the peculiarities, and has assertions for checking the > invariants that the is_player_dangerous function depends on, near where > those invariants might be broken. I am no so sure about peppering the asserts around. Might leave it to Per. For now I want to fix the style and put a little comment into already committed code, see the attachment. Gr.
dangerous.diff
(text/plain, 1.5 KB)
? civ.serv
? ttt
Index: ai/aitools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
retrieving revision 1.128
diff -u -r1.128 aitools.c
--- ai/aitools.c 18 Nov 2004 07:44:29 -0000 1.128
+++ ai/aitools.c 19 Nov 2004 02:47:21 -0000
@@ -85,15 +85,17 @@
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];
+ struct ai_dip_intel *adip = &ai->diplomacy.player_intel[aplayer->player_no];
+ int reason = pplayer->diplstates[aplayer->player_no].has_reason_to_cancel;
- return (pplayer != aplayer)
- && ((pplayers_at_war(pplayer, aplayer)
- || ai->diplomacy.target == aplayer
- || pplayer->diplstates[aplayer->player_no].has_reason_to_cancel != 0
- || ai->diplomacy.acceptable_reputation > aplayer->reputation
- || adip->is_allied_with_enemy));
+ /* Have to check if aplayer == pplayer explicitly because our reputation
+ * can be so low that we'd fear being stabbed in the back by ourselves */
+ return (pplayer != aplayer
+ && (pplayers_at_war(pplayer, aplayer)
+ || ai->diplomacy.target == aplayer
+ || reason != 0
+ || ai->diplomacy.acceptable_reputation > aplayer->reputation
+ || adip->is_allied_with_enemy));
}
/*************************************************************************