[Freeciv-Dev] Re: (PR#9338) RFC: using tileset direction lists
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
<URL: http://rt.freeciv.org/Ticket/Display.html?id=9338 >
There are possibly more critical aspects to rivers in hex maps.
As a minor nit, in hex cardinal should *not* be used as the descriptive
word for all river directions even if the implementation in rectangularly
based tilesets does. Use something like primary vs secondary map axes
when talking about hex to distinguish the implementation from concept.
That there are two flavours of hexmap, one E-W vs N-S aligned, should
clue one into fallacies in assuming all hex directions are created equal.
Cardinal directions are (or should be) used to help prevent loops in rivers
preserving the concept of upstream to downstream flow vs swamps. It is not
unreasonable to come up with some sort of matching adjacency restriction in
a hexmap. The concepts below have totally ignored the real problems and
nomenclature should at least be changed to recognize them as provide
inaccurate redefinitions of reality to match the current bad behaviour.
One extension that would help is to have the Civ III definition of rivers
as running along the edge of tiles, vs through the tile. In this view,
hex maps are intrinsically less likely to have loops than a 4-sided tile.
Cheers,
RossW
=====
Jason Short wrote:
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=9338 >
>
> Currently the tileset assumes the NSEW directions are cardinal and the
> other four directions are diagonal.
>
> However in most cases this doesn't make sense with hex tilesets. For
> one thing there are only six directions total. And they are all cardinal.
>
> In this case cardinal means that an edge (not just a vertex) is shared
> with the adjacent tile in that direction. For instance rivers need to
> be drawn to all adjacent tiles (this is actually a significant problem).
> Mountains/forests/hills/jungles, if matched, must match all adjacent
> tiles (giving 64 graphics instead of 16). Darkness sprites and blending
> sprites must exist for all cardinal directions. Right now none of this
> is true, and someone making a hex tileset has to try to hack around it
> or not use those features.
>
> The 6 valid directions are a small problem in a few cases. For instance
> with roadstyle 3 the hex author must include 256 road and rail graphics
> even though only 64 should be needed.
>
> IMO the tileset can ignore the underlying topology. Rivers only
> actually connect on hex lines if the topology is hex, but a hex tileset
> should draw them that way regardless. Anyone using a tileset with the
> wrong topology shouldn't be - and in single-player this is easy to
> enforce by setting the topology when the client launches the server.
>
> Attached is a patch that creates the direction lists. This is basically
> identical to the topology lists created in init_topology. Using these
> lists, though, is quite a bit harder. Code like INDEX_NSEW or nsew_str
> (in which "nsew" basically means "cardinal") is not easy to convert into
> an array form.
>
> jason
>
>
>
> ------------------------------------------------------------------------
>
> Index: client/tilespec.c
> ===================================================================
> RCS file: /home/freeciv/CVS/freeciv/client/tilespec.c,v
> retrieving revision 1.182
> diff -u -r1.182 tilespec.c
> --- client/tilespec.c 10 Jul 2004 18:48:17 -0000 1.182
> +++ client/tilespec.c 11 Jul 2004 17:49:18 -0000
> @@ -88,6 +88,9 @@
> #define NUM_CORNER_DIRS 4
> #define TILES_PER_CORNER 4
>
> +static int num_valid_tileset_dirs, num_cardinal_tileset_dirs;
> +static enum direction8 valid_tileset_dirs[8], cardinal_tileset_dirs[8];
> +
> static struct {
> enum match_style match_style;
> int count;
> @@ -197,6 +200,35 @@
> bool required, const char *what,
> const char *name);
>
> +/****************************************************************************
> + Return TRUE iff the dir is valid in this tileset.
> +****************************************************************************/
> +static bool is_valid_tileset_dir(enum direction8 dir)
> +{
> + if (hex_width > 0) {
> + return dir != DIR8_NORTHEAST && dir != DIR8_SOUTHWEST;
> + } else if (hex_height > 0) {
> + return dir != DIR8_NORTHWEST && dir != DIR8_SOUTHEAST;
> + } else {
> + return TRUE;
> + }
> +}
> +
> +/****************************************************************************
> + Return TRUE iff the dir is cardinal in this tileset.
> +
> + "Cardinal", in this sense, means that a tile will share a border with
> + another tile in the direction rather than sharing just a single vertex.
> +****************************************************************************/
> +static bool is_cardinal_tileset_dir(enum direction8 dir)
> +{
> + if (hex_width > 0 || hex_height > 0) {
> + return is_valid_tileset_dir(dir);
> + } else {
> + return DIR_IS_CARDINAL(dir);
> + }
> +}
> +
> /**********************************************************************
> Returns a static list of tilesets available on the system by
> searching all data directories for files matching TILESPEC_SUFFIX.
> @@ -687,6 +719,7 @@
> char **spec_filenames, **terrains;
> char *file_capstr;
> bool duplicates_ok, is_hex;
> + enum direction8 dir;
>
> fname = tilespec_fullname(tileset_name);
> freelog(LOG_VERBOSE, "tilespec file is %s", fname);
> @@ -738,6 +771,24 @@
> return tilespec_read_toplevel(NULL);
> }
>
> + /* Create arrays of valid and cardinal tileset dirs. These depend
> + * entirely on the tileset, not the topology. They are also in clockwise
> + * rotational ordering. */
> + num_valid_tileset_dirs = num_cardinal_tileset_dirs = 0;
> + dir = DIR8_NORTH;
> + do {
> + if (is_valid_tileset_dir(dir)) {
> + valid_tileset_dirs[num_valid_tileset_dirs] = dir;
> + num_valid_tileset_dirs++;
> + }
> + if (is_cardinal_tileset_dir(dir)) {
> + cardinal_tileset_dirs[num_cardinal_tileset_dirs] = dir;
> + num_cardinal_tileset_dirs++;
> + }
> +
> + dir = dir_cw(dir);
> + } while (dir != DIR8_NORTH);
> +
> NORMAL_TILE_WIDTH = secfile_lookup_int(file, "tilespec.normal_tile_width");
> NORMAL_TILE_HEIGHT = secfile_lookup_int(file,
> "tilespec.normal_tile_height");
> if (is_isometric) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Freeciv-Dev] Re: (PR#9338) RFC: using tileset direction lists,
rwetmore@xxxxxxxxxxxx <=
|
|