Complete.Org: Mailing Lists: Archives: freeciv-dev: July 2006:
[Freeciv-Dev] Re: (PR#12559) [Patch] is_ocean() -> can_unit_exist_at_til
Home

[Freeciv-Dev] Re: (PR#12559) [Patch] is_ocean() -> can_unit_exist_at_til

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: marko.lindqvist@xxxxxxxxxxx
Subject: [Freeciv-Dev] Re: (PR#12559) [Patch] is_ocean() -> can_unit_exist_at_tile()
From: "Marko Lindqvist" <cazfi74@xxxxxxxxx>
Date: Fri, 7 Jul 2006 12:46:46 -0700
Reply-to: bugs@xxxxxxxxxxx

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

Marko Lindqvist wrote:
> 
>   Some is_ocean() calls are used to check if unit can move to certain 
> tile. This patch replaces most of those with can_unit_exist_at_tile().

  Parts of original patch are already in. This patch collects remaining 
pieces. One case is added. A couple of bugs from original patch have 
been fixed.

  Autogames differ. I'm not entirely sure if that is ok or not. I'll 
investigate.


  - ML

diff -Nurd -X.diff_ignore freeciv/ai/aiferry.c freeciv/ai/aiferry.c
--- freeciv/ai/aiferry.c        2006-07-07 22:29:52.421875000 +0300
+++ freeciv/ai/aiferry.c        2006-07-07 21:58:25.750000000 +0300
@@ -334,6 +334,9 @@
   search_map = pf_create_map(&param);
 
   pf_iterator(search_map, pos) {
+   /* Should this be !can_unit_exist_at_tile() instead of is_ocean() some day?
+    * That would allow special units to wade in shallow coast waters to meet
+    * ferry where deep sea starts. */
     int radius = (is_ocean(pos.tile->terrain) ? 1 : 0);
 
     if (pos.turn + pos.total_EC/PF_TURN_FACTOR > best_turns) {
diff -Nurd -X.diff_ignore freeciv/ai/aiunit.c freeciv/ai/aiunit.c
--- freeciv/ai/aiunit.c 2006-07-07 22:29:53.093750000 +0300
+++ freeciv/ai/aiunit.c 2006-07-07 22:04:23.515625000 +0300
@@ -1632,8 +1632,8 @@
   struct city *pc;
 
   if ((pc = dist_nearest_city(pplayer, punit->tile, FALSE, TRUE))) {
-    if (!is_ocean(tile_get_terrain(punit->tile))) {
-      UNIT_LOG(LOG_DEBUG, punit, "Barbarian marching to conquer %s", pc->name);
+    if (can_unit_exist_at_tile(punit, punit->tile)) {
+      UNIT_LOG(LOG_DEBUG, punit, "Barbarian heading to conquer %s", pc->name);
       (void) ai_gothere(pplayer, punit, pc->tile);
     } else {
       struct unit *ferry = NULL;
@@ -2293,9 +2293,9 @@
 
   CHECK_UNIT(leader);
 
-  if (leader->moves_left == 0 || 
-      (!is_ocean(tile_get_terrain(leader->tile)) &&
-       unit_list_size(leader->tile->units) > 1) ) {
+  if (leader->moves_left == 0
+      || (can_unit_survive_at_tile(leader, leader->tile)
+          && unit_list_size(leader->tile->units) > 1) ) {
       handle_unit_activity_request(leader, ACTIVITY_SENTRY);
       return;
   }
diff -Nurd -X.diff_ignore freeciv/common/unit.c freeciv/common/unit.c
--- freeciv/common/unit.c       2006-07-07 22:30:47.828125000 +0300
+++ freeciv/common/unit.c       2006-07-07 22:16:47.000000000 +0300
@@ -78,8 +78,8 @@
 {
   struct city *pcity=tile_get_city(ptile);
 
-  if (action!=DIPLOMAT_MOVE
-      && is_ocean(tile_get_terrain(pdiplomat->tile))) {
+  if (action != DIPLOMAT_MOVE
+      && !can_unit_exist_at_tile(pdiplomat, pdiplomat->tile)) {
     return FALSE;
   }
 
@@ -1109,12 +1109,12 @@
   unit_list_iterate(ptile->units, punit) {
     if (unit_owner(punit) == pplayer) {
       if (unit_flag(punit, F_CARRIER)
-         && !(is_ground_unit(punit) && is_ocean(ptile->terrain))) {
+          && can_unit_exist_at_tile(punit, ptile)) {
        *airall += get_transporter_capacity(punit);
        continue;
       }
       if (unit_flag(punit, F_MISSILE_CARRIER)
-         && !(is_ground_unit(punit) && is_ocean(ptile->terrain))) {
+          && can_unit_exist_at_tile(punit, ptile)) {
        *misonly += get_transporter_capacity(punit);
        continue;
       }
diff -Nurd -X.diff_ignore freeciv/server/unithand.c freeciv/server/unithand.c
--- freeciv/server/unithand.c   2006-07-07 22:32:42.625000000 +0300
+++ freeciv/server/unithand.c   2006-07-07 22:30:15.703125000 +0300
@@ -1037,11 +1037,14 @@
                                                 punit->id, target_id);
         return FALSE;
       } else if (!can_unit_move_to_tile(punit, pdesttile, igzoc)) {
-        notify_player(pplayer, punit->tile, E_BAD_COMMAND,
-                         is_ocean(tile_get_terrain(punit->tile))
-                         ? _("Unit must be on land to "
-                             "perform diplomatic action.")
-                         : _("No diplomat action possible."));
+        if (can_unit_exist_at_tile(punit, punit->tile)) {
+          notify_player(pplayer, punit->tile, E_BAD_COMMAND,
+                        _("No diplomat action possible."));
+        } else {
+          notify_player(pplayer, punit->tile, E_BAD_COMMAND,
+                        _("Unit cannot perform diplomatic action from %s."),
+                          get_name(punit->tile->terrain));
+        }
         return FALSE;
       }
     }
diff -Nurd -X.diff_ignore freeciv/server/unittools.c freeciv/server/unittools.c
--- freeciv/server/unittools.c  2006-07-07 22:32:42.875000000 +0300
+++ freeciv/server/unittools.c  2006-07-07 22:32:39.937500000 +0300
@@ -2473,15 +2473,13 @@
   square_iterate(punit->tile, 3, ptile) {
     unit_list_iterate(ptile->units, penemy) {
       int radius_sq = get_unit_vision_at(penemy, penemy->tile, V_MAIN);
-      enum unit_move_type move_type = get_unit_move_type(unit_type(penemy));
-      struct terrain *pterrain = tile_get_terrain(ptile);
 
       if (!pplayers_allied(unit_owner(punit), unit_owner(penemy))
          && penemy->activity == ACTIVITY_SENTRY
          && radius_sq >= sq_map_distance(punit->tile, ptile)
          && can_player_see_unit(unit_owner(penemy), punit)
          /* on board transport; don't awaken */
-         && !(move_type == LAND_MOVING && is_ocean(pterrain))) {
+         && !can_unit_exist_at_tile(penemy, penemy->tile)) {
        set_unit_activity(penemy, ACTIVITY_IDLE);
        send_unit_info(NULL, penemy);
       }

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