Author: sveinung
Date: Wed Apr 12 11:54:41 2017
New Revision: 35221

URL: http://svn.gna.org/viewcvs/freeciv?rev=35221&view=rev
Log:
A visible unit may forbid a stack tgt action.

A unit the player is able to see may make a unit stack targeted action
illegal. Make action_prob_vs_units() use this fact to eliminate false
positives.

See hrm Feature #651396

Modified:
    trunk/common/actions.c

Modified: trunk/common/actions.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/actions.c?rev=35221&r1=35220&r2=35221&view=diff
==============================================================================
--- trunk/common/actions.c      (original)
+++ trunk/common/actions.c      Wed Apr 12 11:54:41 2017
@@ -3206,21 +3206,36 @@
     return ACTPROB_IMPOSSIBLE;
   }
 
-  /* Does the player know if there are units at the tile? Must be done here
-   * since an empthy unseen tile will result in false. */
-  if (!can_player_see_hypotetic_units_at(unit_owner(actor_unit),
-                                         target_tile)) {
-    /* Invisible units at this tile can make the action legal or
-     * illegal. */
-    return act_prob_unseen_target(action_id, actor_unit);
-  } else if (unit_list_size(target_tile->units) == 0) {
-    /* Known empty tile. */
-    return ACTPROB_IMPOSSIBLE;
-  }
-
-  prob_all = ACTPROB_CERTAIN;
+  /* Must be done here since an empty unseen tile will result in
+   * ACTPROB_IMPOSSIBLE. */
+  if (unit_list_size(target_tile->units) == 0) {
+    /* Can't act against an empty tile. */
+
+    if (player_can_trust_tile_has_no_units(unit_owner(actor_unit),
+                                           target_tile)) {
+      /* Known empty tile. */
+      return ACTPROB_IMPOSSIBLE;
+    } else {
+      /* The player doesn't know that the tile is empty. */
+      return act_prob_unseen_target(action_id, actor_unit);
+    }
+  }
+
+  /* Invisible units at this tile can make the action legal or illegal.
+   * Invisible units can be stacked with visible units. The possible
+   * existence of invisible units therefore makes the result uncertain. */
+  prob_all = (can_player_see_hypotetic_units_at(unit_owner(actor_unit),
+                                                target_tile)
+              ? ACTPROB_CERTAIN : ACTPROB_NOT_KNOWN);
+
   unit_list_iterate(target_tile->units, target_unit) {
     struct act_prob prob_unit;
+
+    if (!can_player_see_unit(unit_owner(actor_unit), target_unit)) {
+      /* Only visible units are considered. The invisible units contributed
+       * their uncertainty to prob_all above. */
+      continue;
+    }
 
     prob_unit = action_prob(action_id,
                             unit_owner(actor_unit),


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to