[Freeciv-Dev] Re: (PR#8487) RFC: hex tilesets
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
<URL: http://rt.freeciv.org/Ticket/Display.html?id=8487 >
Jason Short wrote:
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=8487 >
>
>>[jdorje - Sat Apr 24 17:42:34 2004]:
>>
>>Here's an updated hex-tileset patch.
>
> Oops. Here's the correct patch.
Crap, that one was buggy too. This one should be correct.
jason
Index: client/mapview_common.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.c,v
retrieving revision 1.106
diff -u -r1.106 mapview_common.c
--- client/mapview_common.c 24 Apr 2004 17:20:17 -0000 1.106
+++ client/mapview_common.c 24 Apr 2004 18:16:07 -0000
@@ -758,6 +758,7 @@
int *end_x, int *end_y)
{
const int W = NORMAL_TILE_WIDTH, H = NORMAL_TILE_HEIGHT;
+ const int HW = hex_width, HH = hex_height;
const int overlap = (width > 1) ? 1 : 0;
assert(inset >= 0);
@@ -797,41 +798,61 @@
* adjustment and the overlap adjustment are both 1.
*/
+ if (!(draw & D_B) && !(draw & D_M)) {
+ /* Nothing drawable. */
+ return FALSE;
+ }
+
if (is_isometric) {
switch (dir) {
case DIR8_NORTH:
/* Top right. */
- *start_x = W / 2;
- *end_x = W - inset;
- *start_y = inset + width;
- *end_y = H / 2 + width;
+ *start_x = (W + HW) / 2;
+ *end_x = W - HW / 2 - inset;
+ *start_y = HH / 2 + inset + width;
+ *end_y = (H - HH) / 2 + width;
return (draw & D_M_R) == D_M_R;
case DIR8_SOUTH:
/* Bottom left. */
- *start_x = inset;
- *end_x = W / 2;
- *start_y = H / 2 - overlap;
- *end_y = H - inset - overlap;
+ *start_x = (W - HW) / 2;
+ *end_x = HW / 2 + inset;
+ *start_y = H - HH / 2 - inset - overlap;
+ *end_y = (H + HH) / 2 - overlap;
return (draw & D_B_L) == D_B_L && (inset + overlap) > 0;
case DIR8_EAST:
/* Bottom right. */
- *start_x = W - inset;
- *end_x = W / 2;
- *start_y = H / 2 - overlap;
- *end_y = H - inset - overlap;
+ *start_x = W - HW / 2 - inset;
+ *end_x = (W + HW) / 2;
+ *start_y = (H + HH) / 2 - overlap;
+ *end_y = H - HH / 2 - inset - overlap;
return (draw & D_B_R) == D_B_R && (inset + overlap) > 0;
case DIR8_WEST:
/* Top left. */
- *start_x = inset;
- *end_x = W / 2;
- *start_y = H / 2 + width;
- *end_y = inset + width;
+ *start_x = HW / 2 + inset;
+ *end_x = (W - HW) / 2;
+ *start_y = (H - HH) / 2 + width;
+ *end_y = HH / 2 + inset + width;
return (draw & D_M_L) == D_M_L;
case DIR8_NORTHEAST:
+ *start_x = *end_x = W - HW / 2 - inset - overlap;
+ *start_y = (draw & D_M_R) == D_M_R ? ((H - HH) / 2) : H / 2;
+ *end_y = (draw & D_B_R) == D_B_R ? ((H + HH) / 2) : H / 2;
+ return HH > 0 && (draw & D_R);
case DIR8_SOUTHEAST:
+ *start_x = (draw & D_B_R) == D_B_R ? ((W + HW) / 2) : W / 2;
+ *end_x = (draw & D_B_L) == D_B_L ? ((W - HW) / 2) : W / 2;
+ *start_y = *end_y = H - HH / 2 - inset - overlap;
+ return HW > 0 && (draw & D_B);
case DIR8_SOUTHWEST:
+ *start_x = *end_x = HW / 2 + inset + width;
+ *start_y = (draw & D_B_L) == D_B_L ? ((H + HH) / 2) : H / 2;
+ *end_y = (draw & D_M_L) == D_M_L ? ((H - HH) / 2) : H / 2;
+ return HH > 0 && (draw & D_L);
case DIR8_NORTHWEST:
- return FALSE;
+ *start_x = (draw & D_M_L) == D_M_L ? ((W - HW) / 2) : W / 2;
+ *end_x = (draw & D_M_R) == D_M_R ? ((W + HW) / 2) : W / 2;
+ *start_y = *end_y = HH / 2 + inset + width;
+ return HW > 0 && (draw & D_M);
}
} else {
switch (dir) {
@@ -953,7 +974,7 @@
* we use this hack. */
adjc_dir_iterate(map_x, map_y, adjc_x, adjc_y, dir) {
if ((dir == DIR8_WEST || dir == DIR8_NORTHWEST
- || dir == DIR8_NORTH || dir == DIR8_NORTHEAST)
+ || dir == DIR8_NORTH || dir == DIR8_SOUTHWEST)
&& get_tile_boundaries(dir, 0, BORDER_WIDTH, draw,
&start_x, &start_y, &end_x, &end_y)
&& tile_get_known(adjc_x, adjc_y)
Index: client/tilespec.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.c,v
retrieving revision 1.161
diff -u -r1.161 tilespec.c
--- client/tilespec.c 24 Apr 2004 07:46:52 -0000 1.161
+++ client/tilespec.c 24 Apr 2004 18:16:08 -0000
@@ -76,6 +76,7 @@
int OVERVIEW_TILE_HEIGHT = 2;
bool is_isometric;
+int hex_width, hex_height;
char *city_names_font;
char *city_productions_font_name;
@@ -635,10 +636,10 @@
struct section_file the_file, *file = &the_file;
char *fname, *c;
int i;
- int num_spec_files, num_terrains;
+ int num_spec_files, num_terrains, hex_side;
char **spec_filenames, **terrains;
char *file_capstr;
- bool duplicates_ok;
+ bool duplicates_ok, is_hex;
fname = tilespec_fullname(tileset_name);
freelog(LOG_VERBOSE, "tilespec file is %s", fname);
@@ -659,6 +660,20 @@
(void) section_file_lookup(file, "tilespec.name"); /* currently unused */
is_isometric = secfile_lookup_bool_default(file, FALSE,
"tilespec.is_isometric");
+
+ /* Read hex-tileset information. */
+ is_hex = secfile_lookup_bool_default(file, FALSE, "tilespec.is_hex");
+ hex_side = secfile_lookup_int_default(file, 0, "tilespec.hex_side");
+ hex_width = hex_height = 0;
+ if (is_hex) {
+ if (is_isometric) {
+ hex_height = hex_side;
+ } else {
+ hex_width = hex_side;
+ }
+ is_isometric = TRUE; /* Hex tilesets are drawn the same as isometric. */
+ }
+
if (is_isometric && !isometric_view_supported()) {
freelog(LOG_ERROR, _("Client does not support isometric tilesets."
" Using default tileset instead."));
Index: client/tilespec.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.h,v
retrieving revision 1.62
diff -u -r1.62 tilespec.h
--- client/tilespec.h 22 Apr 2004 21:07:32 -0000 1.62
+++ client/tilespec.h 24 Apr 2004 18:16:08 -0000
@@ -284,6 +284,7 @@
extern int OVERVIEW_TILE_HEIGHT;
extern bool is_isometric;
+extern int hex_width, hex_height;
/* name of font to use to draw city names on main map */
|
|