Complete.Org: Mailing Lists: Archives: freeciv-dev: February 2005:
[Freeciv-Dev] Re: (PR#12140) AutoReply: use sprites to draw the mapview
Home

[Freeciv-Dev] Re: (PR#12140) AutoReply: use sprites to draw the mapview

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Subject: [Freeciv-Dev] Re: (PR#12140) AutoReply: use sprites to draw the mapview grid
From: "Jason Short" <jdorje@xxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 7 Feb 2005 23:52:08 -0800
Reply-to: bugs@xxxxxxxxxxx

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

Here is an improved (hopefully final) patch.

- All gridlines are loaded.

- Gridlines are included in trident, trident_shields, and isotrident.

- Iteration over edges is fixed.  Non-iso-view was buggy here.

- East-west has been changed to west-east (top-bottom, left-right).

- Borders are handled "properly".  Player colors are added to the 
tileset, as sprites (this can later have much larger use).  We use 
crop_sprite() with the base border graphic to generate borders for each 
nation at load time.  This allows alpha levels to be used (it doesn't 
work without the gtk2-client fix to crop_sprite).

-jason


? dorje_fog.jpeg
? fog
? fog.c
? fog.png
? foo
? data/isotrident/grid.png
? data/isotrident/mask-30x30.png
? data/misc/colors.png
? data/trident/foo.png
? data/trident/grid.png
Index: client/mapview_common.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.h,v
retrieving revision 1.88
diff -u -r1.88 mapview_common.h
--- client/mapview_common.h     7 Feb 2005 22:26:21 -0000       1.88
+++ client/mapview_common.h     8 Feb 2005 07:50:01 -0000
@@ -157,11 +157,11 @@
            pedge->tile[1] = map_pos_to_tile((GRI_sum - 4) / 4, /* S */     \
                                             (GRI_diff + 2) / 4);           \
          } else {                                                          \
-           pedge->type = EDGE_EW;                                          \
+           pedge->type = EDGE_WE;                                          \
            pedge->tile[0] = map_pos_to_tile((GRI_sum - 6) / 4,             \
-                                            GRI_diff / 4); /* E */         \
-           pedge->tile[1] = map_pos_to_tile((GRI_sum - 2) / 4,             \
                                             GRI_diff / 4); /* W */         \
+           pedge->tile[1] = map_pos_to_tile((GRI_sum - 2) / 4,             \
+                                            GRI_diff / 4); /* E */         \
          }                                                                 \
        }                                                                   \
       } else {                                                             \
@@ -186,17 +186,17 @@
          /* Edge. */                                                       \
          pedge = &GRI_edge;                                                \
          if (GRI_y_itr % 2 == 0) {                                         \
-           pedge->type = EDGE_EW;                                          \
-           pedge->tile[0] = map_pos_to_tile(GRI_x_itr / 2 - 1,             \
-                                            (GRI_y_itr - 1) / 2);          \
-           pedge->tile[1] = map_pos_to_tile(GRI_x_itr / 2,                 \
-                                            (GRI_y_itr - 1) / 2);          \
-         } else {                                                          \
            pedge->type = EDGE_NS;                                          \
-           pedge->tile[0] = map_pos_to_tile((GRI_x_itr - 1) / 2,           \
+           pedge->tile[0] = map_pos_to_tile((GRI_x_itr - 1) / 2, /* N */   \
                                             GRI_y_itr / 2 - 1);            \
-           pedge->tile[1] = map_pos_to_tile((GRI_x_itr - 1) / 2,           \
+           pedge->tile[1] = map_pos_to_tile((GRI_x_itr - 1) / 2, /* S */   \
                                             GRI_y_itr / 2);                \
+         } else {                                                          \
+           pedge->type = EDGE_WE;                                          \
+           pedge->tile[0] = map_pos_to_tile(GRI_x_itr / 2 - 1, /* W */     \
+                                            (GRI_y_itr - 1) / 2);          \
+           pedge->tile[1] = map_pos_to_tile(GRI_x_itr / 2, /* E */         \
+                                            (GRI_y_itr - 1) / 2);          \
          }                                                                 \
        }                                                                   \
       }                                                                        
    \
Index: client/tilespec.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.c,v
retrieving revision 1.232
diff -u -r1.232 tilespec.c
--- client/tilespec.c   6 Feb 2005 22:11:10 -0000       1.232
+++ client/tilespec.c   8 Feb 2005 07:50:01 -0000
@@ -1461,6 +1461,54 @@
   SET_SPRITE(tx.airbase,    "tx.airbase");
   SET_SPRITE(tx.fog,        "tx.fog");
 
+  if (load_sprite("grid.main.ns")) {
+    for (i = 0; i < MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS; i++) {
+      my_snprintf(buffer, sizeof(buffer), "colors.player%d", i);
+      SET_SPRITE(colors.player[i], buffer);
+    }
+
+    for (i = 0; i < EDGE_COUNT; i++) {
+      char *name[EDGE_COUNT] = {"ns", "we"};
+      int j, p;
+
+      my_snprintf(buffer, sizeof(buffer), "grid.main.%s", name[i]);
+      SET_SPRITE(grid.main[i], buffer);
+
+      my_snprintf(buffer, sizeof(buffer), "grid.city.%s", name[i]);
+      SET_SPRITE(grid.city[i], buffer);
+
+      my_snprintf(buffer, sizeof(buffer), "grid.worked.%s", name[i]);
+      SET_SPRITE(grid.worked[i], buffer);
+
+      my_snprintf(buffer, sizeof(buffer), "grid.unavailable.%s", name[i]);
+      SET_SPRITE(grid.unavailable[i], buffer);
+
+      my_snprintf(buffer, sizeof(buffer), "grid.selected.%s", name[i]);
+      SET_SPRITE(grid.selected[i], buffer);
+
+      my_snprintf(buffer, sizeof(buffer), "grid.coastline.%s", name[i]);
+      SET_SPRITE(grid.coastline[i], buffer);
+
+      for (j = 0; j < 2; j++) {
+       struct Sprite *s;
+
+       my_snprintf(buffer, sizeof(buffer), "grid.borders.%c", name[i][j]);
+       SET_SPRITE(grid.borders[i][j], buffer);
+
+       for (p = 0; p < MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS; p++) {
+         if (sprites.colors.player[p] && sprites.grid.borders[i][j]) {
+           s = crop_sprite(sprites.colors.player[p],
+                           0, 0, NORMAL_TILE_WIDTH, NORMAL_TILE_HEIGHT,
+                           sprites.grid.borders[i][j], 0, 0);
+         } else {
+           s = sprites.grid.borders[i][j];
+         }
+         sprites.grid.player_borders[p][i][j] = s;
+       }
+      }
+    }
+  }
+
   for (i = 0; i < num_index_cardinal; i++) {
     my_snprintf(buffer, sizeof(buffer), "tx.s_river_%s",
                cardinal_index_str(i));
@@ -2737,6 +2785,96 @@
 
 
 /****************************************************************************
+  Fill in the grid sprites for the given tile, city, and unit.
+****************************************************************************/
+static int fill_grid_sprite_array(struct drawn_sprite *sprs,
+                                 const struct tile *ptile,
+                                 const struct tile_edge *pedge,
+                                 const struct tile_corner *pcorner,
+                                 const struct unit *punit,
+                                 const struct city *pcity,
+                                 bool citymode)
+{
+  struct drawn_sprite *saved_sprs = sprs;
+
+  if (!sprites.grid.main[EDGE_NS]) {
+    if (ptile && tile_get_known(ptile) != TILE_UNKNOWN) {
+      /* Add grid.  In classic view this is done later. */
+      ADD_GRID(ptile, citymode);
+    }
+  } else if (pedge) {
+    bool known[EDGE_COUNT], city[EDGE_COUNT];
+    bool worked[EDGE_COUNT], blocked[EDGE_COUNT];
+    int i;
+
+    for (i = 0; i < 2; i++) {
+      struct tile *tile = pedge->tile[i];
+
+      known[i] = tile && tile_get_known(tile) != TILE_UNKNOWN;
+      city[i] = known[i] && player_in_city_radius(game.player_ptr, tile);
+      worked[i] = blocked[i] = FALSE;
+      if (city[i]) {
+       enum city_tile_type ttype;
+       struct city *dummy;
+
+       get_worker_on_map_position(tile, &ttype, &dummy);
+       switch (ttype) {
+       case C_TILE_EMPTY:
+         break;
+       case C_TILE_WORKER:
+         worked[i] = TRUE;
+         break;
+       case C_TILE_UNAVAILABLE:
+         blocked[i] = TRUE;
+         break;
+       }
+      }
+    }
+
+    if ((pedge->tile[0]
+        && map_deco[pedge->tile[0]->index].hilite == HILITE_CITY)
+       || (pedge->tile[1]
+           && map_deco[pedge->tile[1]->index].hilite == HILITE_CITY)) {
+      ADD_SPRITE_SIMPLE(sprites.grid.selected[pedge->type]);
+    } else if (!draw_terrain && draw_coastline
+              && pedge->tile[0] && pedge->tile[1]
+              && known[0] && known[1]
+              && (is_ocean(pedge->tile[0]->terrain)
+                  ^ is_ocean(pedge->tile[1]->terrain))) {
+      ADD_SPRITE_SIMPLE(sprites.grid.coastline[pedge->type]);
+    } else if (draw_map_grid) {
+      if (blocked[0] || blocked[1]) {
+       ADD_SPRITE_SIMPLE(sprites.grid.unavailable[pedge->type]);
+      } else if (worked[0] || worked[1]) {
+       ADD_SPRITE_SIMPLE(sprites.grid.worked[pedge->type]);
+      } else if (city[0] || city[1]) {
+       ADD_SPRITE_SIMPLE(sprites.grid.city[pedge->type]);
+      } else if (known[0] || known[1]) {
+       ADD_SPRITE_SIMPLE(sprites.grid.main[pedge->type]);
+      }
+    }
+
+    if (draw_borders && game.borders > 0 && known[0] && known[1]) {
+      struct player *owner0 = map_get_owner(pedge->tile[0]);
+      struct player *owner1 = map_get_owner(pedge->tile[1]);
+
+      if (owner0 != owner1) {
+       if (owner0) {
+         ADD_SPRITE_SIMPLE(sprites.grid.player_borders
+                           [owner0->player_no][pedge->type][0]);
+       }
+       if (owner1) {
+         ADD_SPRITE_SIMPLE(sprites.grid.player_borders
+                           [owner1->player_no][pedge->type][1]);
+       }
+      }
+    }
+  }
+
+  return sprs - saved_sprs;
+}
+
+/****************************************************************************
   Fill in the sprite array for the given tile, city, and unit.
 
   ptile, if specified, gives the tile.  If specified the terrain and specials
@@ -2871,9 +3009,9 @@
     break;
 
   case LAYER_GRID1:
-    if (ptile && tile_get_known(ptile) != TILE_UNKNOWN && is_isometric) {
-      /* Add grid.  In classic view this is done later. */
-      ADD_GRID(ptile, citymode);
+    if (is_isometric) {
+      sprs += fill_grid_sprite_array(sprs, ptile, pedge, pcorner,
+                                    punit, pcity, citymode);
     }
     break;
 
@@ -2950,9 +3088,9 @@
     break;
 
   case LAYER_GRID2:
-    if (ptile && tile_get_known(ptile) != TILE_UNKNOWN && !is_isometric) {
-      /* Add grid.  In iso-view this is done earlier. */
-      ADD_GRID(ptile, citymode);
+    if (!is_isometric) {
+      sprs += fill_grid_sprite_array(sprs, ptile, pedge, pcorner,
+                                    punit, pcity, citymode);
     }
     break;
 
Index: client/tilespec.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.h,v
retrieving revision 1.101
diff -u -r1.101 tilespec.h
--- client/tilespec.h   6 Feb 2005 22:11:11 -0000       1.101
+++ client/tilespec.h   8 Feb 2005 07:50:02 -0000
@@ -27,10 +27,12 @@
 struct Sprite;                 /* opaque; gui-dep */
 
 /* An edge is the border between two tiles.  This structure represents one
- * edge.  The tiles are in unspecified order for the moment. */
+ * edge.  The tiles are given in the same order as the enumeration name. */
 struct tile_edge {
   enum {
-    EDGE_NS, EDGE_EW
+    EDGE_NS, /* North and south */
+    EDGE_WE, /* West and east */
+    EDGE_COUNT
   } type;
   struct tile *tile[2];
 };
@@ -314,6 +316,20 @@
       *darkness[MAX_INDEX_CARDINAL],         /* first unused */
       *river_outlet[4];                /* indexed by enum direction4 */
   } tx;                                /* terrain extra */
+  struct {
+    struct Sprite
+      *main[EDGE_COUNT],
+      *city[EDGE_COUNT],
+      *worked[EDGE_COUNT],
+      *unavailable[EDGE_COUNT],
+      *selected[EDGE_COUNT],
+      *coastline[EDGE_COUNT],
+      *borders[EDGE_COUNT][2],
+      *player_borders[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS][EDGE_COUNT][2];
+  } grid;
+  struct {
+    struct Sprite *player[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS];
+  } colors;
 
   struct terrain_drawing_data *terrain[MAX_NUM_TERRAINS];
 };
Index: data/isotrident.tilespec
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/isotrident.tilespec,v
retrieving revision 1.27
diff -u -r1.27 isotrident.tilespec
--- data/isotrident.tilespec    6 Feb 2005 22:11:11 -0000       1.27
+++ data/isotrident.tilespec    8 Feb 2005 07:50:02 -0000
@@ -51,9 +51,11 @@
 ; low-color systems, and if there are any duplicate tags (lattermost
 ; tag is used).
 files = 
+  "misc/colors.spec",
   "isotrident/terrain1.spec",
   "isotrident/terrain2.spec",
   "isotrident/tiles.spec",
+  "isotrident/grid.spec",
   "misc/small.spec",
   "trident/units.spec",
   "isotrident/unitextras.spec",
Index: data/trident.tilespec
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/trident.tilespec,v
retrieving revision 1.29
diff -u -r1.29 trident.tilespec
--- data/trident.tilespec       6 Feb 2005 22:11:11 -0000       1.29
+++ data/trident.tilespec       8 Feb 2005 07:50:02 -0000
@@ -47,10 +47,12 @@
 ; low-color systems, and if there are any duplicate tags (lattermost
 ; tag is used).
 files = 
+  "misc/colors.spec",
   "trident/tiles.spec",
   "misc/small.spec",
   "trident/units.spec",
   "misc/flags.spec",
+  "trident/grid.spec",
   "trident/roads.spec",
   "misc/buildings.spec",
   "misc/space.spec",
Index: data/trident_shields.tilespec
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/trident_shields.tilespec,v
retrieving revision 1.18
diff -u -r1.18 trident_shields.tilespec
--- data/trident_shields.tilespec       25 Dec 2004 19:50:29 -0000      1.18
+++ data/trident_shields.tilespec       8 Feb 2005 07:50:02 -0000
@@ -50,10 +50,12 @@
 ; low-color systems, and if there are any duplicate tags (lattermost
 ; tag is used).
 files = 
+  "misc/colors.spec",
   "trident/tiles.spec",
   "misc/small.spec",
   "trident/units.spec",
   "misc/flags.spec",
+  "trident/grid.spec",
   "trident/roads.spec",
   "misc/buildings.spec",
   "misc/space.spec",
Index: data/isotrident/grid.spec
===================================================================
RCS file: data/isotrident/grid.spec
diff -N data/isotrident/grid.spec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ data/isotrident/grid.spec   8 Feb 2005 07:50:02 -0000
@@ -0,0 +1,42 @@
+
+[spec]
+
+; Format and options of this spec file:
+options = "+spec3"
+
+[info]
+
+artists = "
+    Jason Dorje Short <jdorje@xxxxxxxxxxx>
+"
+
+[file]
+gfx = "isotrident/grid"
+
+[grid_main]
+
+x_top_left = 1
+y_top_left = 1
+dx = 64
+dy = 32
+pixel_border = 1
+
+tiles = { "row", "column", "tag"
+  0, 0, "grid.main.we"
+  1, 0, "grid.main.ns"
+  0, 1, "grid.city.we"
+  1, 1, "grid.city.ns"
+  0, 2, "grid.worked.we"
+  1, 2, "grid.worked.ns"
+  0, 3, "grid.unavailable.we"
+  1, 3, "grid.unavailable.ns"
+  0, 4, "grid.selected.we"
+  1, 4, "grid.selected.ns"
+  0, 5, "grid.coastline.we"
+  1, 5, "grid.coastline.ns"
+
+  2, 0, "grid.borders.n"
+  2, 1, "grid.borders.s"
+  2, 2, "grid.borders.w"
+  2, 3, "grid.borders.e"
+}
Index: data/misc/colors.spec
===================================================================
RCS file: data/misc/colors.spec
diff -N data/misc/colors.spec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ data/misc/colors.spec       8 Feb 2005 07:50:02 -0000
@@ -0,0 +1,60 @@
+
+[spec]
+
+; Format and options of this spec file:
+options = "+spec3"
+
+[info]
+
+artists = "
+    Jason Dorje Short <jdorje@xxxxxxxxxxx>
+"
+
+[file]
+gfx = "misc/colors"
+
+[grid_main]
+
+x_top_left = 1
+y_top_left = 1
+dx = 64
+dy = 32
+pixel_border=1
+
+tiles = { "row", "column", "tag"
+
+  0, 0, "colors.player0"
+  0, 1, "colors.player1"
+  0, 2, "colors.player2"
+  0, 3, "colors.player3"
+  1, 0, "colors.player4"
+  1, 1, "colors.player5"
+  1, 2, "colors.player6"
+  1, 3, "colors.player7"
+  2, 0, "colors.player8"
+  2, 1, "colors.player9"
+  2, 2, "colors.player10"
+  2, 3, "colors.player11"
+  3, 0, "colors.player12"
+  3, 1, "colors.player13"
+
+  0, 0, "colors.player14"
+  0, 1, "colors.player15"
+  0, 2, "colors.player16"
+  0, 3, "colors.player17"
+  1, 0, "colors.player18"
+  1, 1, "colors.player19"
+  1, 2, "colors.player20"
+  1, 3, "colors.player21"
+  2, 0, "colors.player22"
+  2, 1, "colors.player23"
+  2, 2, "colors.player24"
+  2, 3, "colors.player25"
+  3, 0, "colors.player26"
+  3, 1, "colors.player27"
+
+  0, 0, "colors.player28"
+  0, 1, "colors.player29"
+  0, 2, "colors.player30"
+  0, 3, "colors.player31"
+}
Index: data/trident/grid.spec
===================================================================
RCS file: data/trident/grid.spec
diff -N data/trident/grid.spec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ data/trident/grid.spec      8 Feb 2005 07:50:02 -0000
@@ -0,0 +1,42 @@
+
+[spec]
+
+; Format and options of this spec file:
+options = "+spec3"
+
+[info]
+
+artists = "
+    Jason Dorje Short <jdorje@xxxxxxxxxxx>
+"
+
+[file]
+gfx = "trident/grid"
+
+[grid_main]
+
+x_top_left = 1
+y_top_left = 1
+dx = 30
+dy = 30
+pixel_border = 1
+
+tiles = { "row", "column", "tag"
+  0, 0, "grid.main.we"
+  1, 0, "grid.main.ns"
+  0, 1, "grid.city.we"
+  1, 1, "grid.city.ns"
+  0, 2, "grid.worked.we"
+  1, 2, "grid.worked.ns"
+  0, 3, "grid.unavailable.we"
+  1, 3, "grid.unavailable.ns"
+  0, 4, "grid.selected.we"
+  1, 4, "grid.selected.ns"
+  0, 5, "grid.coastline.we"
+  1, 5, "grid.coastline.ns"
+
+  2, 0, "grid.borders.n"
+  2, 1, "grid.borders.s"
+  2, 2, "grid.borders.w"
+  2, 3, "grid.borders.e"
+}

Attachment: grid.tar.gz
Description: GNU Zip compressed data


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