[Freeciv-Dev] (PR#6330) terrain flags: TER_NO_BARBS
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
This patch introduces terrain flags, read from the ruleset and sent to
the client. One simple terrain flag NO_BARBS (no barbarian summoning on
this terrain) is added (this also addresses PR#6183).
jason
Index: client/packhand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/packhand.c,v
retrieving revision 1.332
diff -u -r1.332 packhand.c
--- client/packhand.c 2003/09/23 22:01:41 1.332
+++ client/packhand.c 2003/09/30 01:55:12
@@ -2388,6 +2388,8 @@
t->transform_result = p->transform_result;
t->transform_time = p->transform_time;
+ t->flags = p->flags;
+
t->helptext = p->helptext; /* pointer assignment */
tilespec_setup_tile_type(p->id);
Index: common/capstr.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/capstr.c,v
retrieving revision 1.144
diff -u -r1.144 capstr.c
--- common/capstr.c 2003/09/22 16:54:09 1.144
+++ common/capstr.c 2003/09/30 01:55:12
@@ -80,7 +80,7 @@
"+no_nation_selected +diplomacy +no_extra_tiles " \
"+diplomacy2 +citizens_style +root_tech auth " \
"+nat_ulimit +retake +goto_pack borders dip " \
- "+packet_short_unit +unit_occupied"
+ "+packet_short_unit +unit_occupied +terr_flags"
/* "+1.14.0" is protocol for 1.14.0 release.
*
@@ -152,6 +152,9 @@
*
* "unit_occupied" means units occupying transporters are not sent to enemies.
* instead an 'occupied' flag is set for the transporter.
+ *
+ * "terr_flags" means terrain flags (with the TER_NO_BARBS flag) have been
+ * added.
*/
void init_our_capability(void)
Index: common/map.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.c,v
retrieving revision 1.146
diff -u -r1.146 map.c
--- common/map.c 2003/09/29 02:42:15 1.146
+++ common/map.c 2003/09/30 01:55:12
@@ -408,6 +408,28 @@
return count;
}
+/****************************************************************************
+ Return the terrain flag matching the given string.
+****************************************************************************/
+enum terrain_flag_id terrain_flag_from_str(const char *s)
+{
+ /* Must match terrain flags in terrain.h. */
+ enum terrain_flag_id flag;
+ const char *flag_names[] = {
+ "no_barbs"
+ };
+
+ assert(ARRAY_SIZE(flag_names) == TER_COUNT);
+
+ for (flag = TER_FIRST; flag < TER_LAST; flag++) {
+ if (mystrcasecmp(flag_names[flag], s) == 0) {
+ return flag;
+ }
+ }
+
+ return TER_LAST;
+}
+
/***************************************************************
determines if any tile close to x,y has special spe
***************************************************************/
Index: common/map.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.h,v
retrieving revision 1.156
diff -u -r1.156 map.h
--- common/map.h 2003/09/29 17:42:37 1.156
+++ common/map.h 2003/09/30 01:55:12
@@ -100,7 +100,7 @@
tile_type for each terrain type
expand with government bonuses??
*****************************************************************/
-
+BV_DEFINE(bv_terrain_flags, TER_MAX);
struct tile_type {
char terrain_name[MAX_LEN_NAME]; /* "" if unused */
char terrain_name_orig[MAX_LEN_NAME]; /* untranslated copy */
@@ -149,6 +149,8 @@
enum tile_terrain_type transform_result;
int transform_time;
+ bv_terrain_flags flags;
+
char *helptext;
};
@@ -348,6 +350,7 @@
const char *get_special_name(enum tile_special_type type);
bool is_terrain_near_tile(int x, int y, enum tile_terrain_type t);
int count_terrain_near_tile(int x, int y, enum tile_terrain_type t);
+enum terrain_flag_id terrain_flag_from_str(const char *s);
bool is_special_near_tile(int x, int y, enum tile_special_type spe);
int count_special_near_tile(int x, int y, enum tile_special_type spe);
bool is_coastline(int x,int y);
Index: common/packets.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/packets.c,v
retrieving revision 1.257
diff -u -r1.257 packets.c
--- common/packets.c 2003/09/22 16:54:09 1.257
+++ common/packets.c 2003/09/30 01:55:13
@@ -2443,6 +2443,8 @@
dio_put_string(&dout, packet->special[i].graphic_alt);
}
+ DIO_BV_PUT(&dout, packet->flags);
+
/* This must be last, so client can determine length: */
if(packet->helptext) {
dio_put_string(&dout, packet->helptext);
@@ -2494,6 +2496,8 @@
dio_get_string(&din, packet->special[i].graphic_alt,
sizeof(packet->special[i].graphic_alt));
}
+
+ DIO_BV_GET(&din, packet->flags);
len = dio_input_remaining(&din);
if (len > 0) {
Index: common/packets.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/packets.h,v
retrieving revision 1.154
diff -u -r1.154 packets.h
--- common/packets.h 2003/09/22 16:54:09 1.154
+++ common/packets.h 2003/09/30 01:55:13
@@ -761,6 +761,8 @@
enum tile_terrain_type transform_result;
int transform_time;
+
+ bv_terrain_flags flags;
char *helptext; /* same as for packet_ruleset_unit, above */
};
Index: common/terrain.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/terrain.h,v
retrieving revision 1.5
diff -u -r1.5 terrain.h
--- common/terrain.h 2003/01/09 02:36:37 1.5
+++ common/terrain.h 2003/09/30 01:55:13
@@ -71,6 +71,14 @@
#define T_FIRST (T_ARCTIC)
#define T_COUNT (T_UNKNOWN)
+enum terrain_flag_id {
+ TER_NO_BARBS, /* No barbarians summoned on this terrain. */
+ TER_LAST
+};
+#define TER_FIRST (TER_NO_BARBS)
+#define TER_COUNT (TER_LAST)
+#define TER_MAX 64
+
enum known_type {
TILE_UNKNOWN, TILE_KNOWN_FOGGED, TILE_KNOWN
};
@@ -82,5 +90,7 @@
#define is_ocean_near_tile(x, y) is_terrain_near_tile(x, y, T_OCEAN)
#define adjacent_ocean_tiles4(x, y) adjacent_terrain_tiles4(x, y, T_OCEAN)
#define count_ocean_near_tile(x,y) count_terrain_near_tile(x,y, T_OCEAN)
+
+#define terrain_has_flag(terr, flag) BV_ISSET(tile_types[(terr)].flags, flag)
#endif /* FC__TERRAIN_H */
Index: data/civ1/terrain.ruleset
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/civ1/terrain.ruleset,v
retrieving revision 1.14
diff -u -r1.14 terrain.ruleset
--- data/civ1/terrain.ruleset 2002/03/30 02:43:52 1.14
+++ data/civ1/terrain.ruleset 2003/09/30 01:55:13
@@ -171,6 +171,7 @@
mining_time = 0
transform_result = "no"
transform_time = 0
+flags = "no_barbs"
helptext = _("\
Arctic squares are found only in the most northerly or southerly\
reaches of the world. They are very cold, and hence difficult to\
@@ -572,6 +573,7 @@
mining_time = 0
transform_result = "no"
transform_time = 0
+flags = "no_barbs"
helptext = _("\
Tundra are broad, cold regions, fit for some agriculture and little\
else.\
Index: data/civ2/terrain.ruleset
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/civ2/terrain.ruleset,v
retrieving revision 1.16
diff -u -r1.16 terrain.ruleset
--- data/civ2/terrain.ruleset 2002/03/30 02:43:53 1.16
+++ data/civ2/terrain.ruleset 2003/09/30 01:55:13
@@ -179,6 +179,7 @@
mining_time = 10
transform_result = "Tundra"
transform_time = 24
+flags = "no_barbs"
helptext = _("\
Glaciers are found only in the most northerly or southerly\
reaches of the world. They are very cold, and hence difficult to\
@@ -573,6 +574,7 @@
mining_time = 0
transform_result = "Desert"
transform_time = 24
+flags = "no_barbs"
helptext = _("\
Tundra are broad, cold regions, fit for some agriculture and little\
else.\
Index: data/default/terrain.ruleset
===================================================================
RCS file: /home/freeciv/CVS/freeciv/data/default/terrain.ruleset,v
retrieving revision 1.17
diff -u -r1.17 terrain.ruleset
--- data/default/terrain.ruleset 2002/03/30 02:43:54 1.17
+++ data/default/terrain.ruleset 2003/09/30 01:55:13
@@ -179,6 +179,7 @@
mining_time = 10
transform_result = "Tundra"
transform_time = 24
+flags = "no_barbs"
helptext = _("\
Glaciers are found only in the most northerly or southerly\
reaches of the world. They are very cold, and hence difficult to\
@@ -573,6 +574,7 @@
mining_time = 0
transform_result = "Desert"
transform_time = 24
+flags = "no_barbs"
helptext = _("\
Tundra are broad, cold regions, fit for some agriculture and little\
else.\
Index: server/barbarian.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/barbarian.c,v
retrieving revision 1.68
diff -u -r1.68 barbarian.c
--- server/barbarian.c 2003/09/19 14:14:45 1.68
+++ server/barbarian.c 2003/09/30 01:55:13
@@ -35,6 +35,7 @@
#include "rand.h"
#include "support.h"
#include "tech.h"
+#include "terrain.h"
#include "gamehand.h"
#include "maphand.h"
@@ -331,7 +332,7 @@
/* No uprising on North or South Pole */
do {
rand_map_pos(&x, &y);
- } while (y == 0 || y == map.ysize - 1);
+ } while (terrain_has_flag(map_get_terrain(x, y), TER_NO_BARBS));
if (!(pc = dist_nearest_city(NULL, x, y, TRUE, FALSE))) {
/* any city */
Index: server/ruleset.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/ruleset.c,v
retrieving revision 1.154
diff -u -r1.154 ruleset.c
--- server/ruleset.c 2003/09/21 14:02:15 1.154
+++ server/ruleset.c 2003/09/30 01:55:13
@@ -1431,8 +1431,7 @@
for (i = T_FIRST; i < T_COUNT; i++)
{
- char *s1_name;
- char *s2_name;
+ char *s1_name, *s2_name, **slist;
t = &(tile_types[i]);
sz_strlcpy(t->graphic_str,
@@ -1488,6 +1487,22 @@
t->transform_result =
lookup_terrain(secfile_lookup_str(file, "%s.transform_result", sec[i]),
i);
t->transform_time = secfile_lookup_int(file, "%s.transform_time",
sec[i]);
+
+ slist = secfile_lookup_str_vec(file, &nval, "%s.flags", sec[i]);
+ BV_CLR_ALL(t->flags);
+ for (j = 0; j < nval; j++) {
+ const char *sval = slist[j];
+ enum terrain_flag_id flag = terrain_flag_from_str(sval);
+
+ if (flag == TER_LAST) {
+ /* TRANS: Rare error message. */
+ freelog(LOG_FATAL, _("Terrain %s has unknown flag %s"),
+ t->terrain_name, sval);
+ exit(EXIT_FAILURE);
+ } else {
+ BV_SET(t->flags, flag);
+ }
+ }
t->helptext = lookup_helptext(file, sec[i]);
}
@@ -2655,6 +2670,8 @@
packet.transform_result = t->transform_result;
packet.transform_time = t->transform_time;
+
+ packet.flags = t->flags;
packet.helptext = t->helptext; /* pointer assignment */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Freeciv-Dev] (PR#6330) terrain flags: TER_NO_BARBS,
Jason Short <=
|
|