40 const QString &tag, extrastyle_id style)
48 #define INIT(vector, func) \
50 terrain_type_iterate(terrain) \
53 auto &data = vector[terrain_index(terrain)].emplace_back(); \
55 initialize_corners(data, extra, tag, terrain); \
56 func(data, tag, terrain); \
58 terrain_type_iterate_end;
60 if (style == ESTYLE_ROAD_ALL_COMBINED) {
62 }
else if (style == ESTYLE_ROAD_ALL_SEPARATE) {
64 }
else if (style == ESTYLE_ROAD_PARITY_COMBINED) {
100 for (
int i = 0; i < count; ++i) {
147 for (
int i = 1; i < num_index; i++) {
148 QString cs = QStringLiteral(
"_c_");
149 QString ds = QStringLiteral(
"_d_");
152 int value = (i >> j) & 1;
153 cs += QStringLiteral(
"%1%2")
157 ds += QStringLiteral(
"%1%2")
192 direction8 dir,
const bv_extras
extras,
193 const bv_extras extras_near,
const terrain *terrain_near)
225 direction8 dir,
const bv_extras
extras,
226 const bv_extras extras_near,
terrain *terrain_near)
229 if (!connects(t, extra, dir,
extras, extras_near, terrain_near)) {
236 if (connects(t, hider, dir,
extras, extras_near, terrain_near)) {
253 std::tuple<std::bitset<DIR8_MAGIC_MAX>,
bool>
254 road_data(
const struct tileset *t,
const tile *ptile,
262 return make_tuple(std::bitset<DIR8_MAGIC_MAX>(),
false);
271 std::bitset<DIR8_MAGIC_MAX> draw;
274 draw[i] = should_draw(t, extra,
static_cast<direction8
>(dir),
extras,
275 extras_near[dir], terrain_near[dir]);
280 auto isolated = !draw.any()
282 && !is_hidden(extra,
extras);
284 return make_tuple(draw, isolated);
292 std::vector<drawn_sprite>
295 const unit *punit)
const
311 std::vector<drawn_sprite> sprs;
343 const tile *ptile)
const
382 for (
int i = 0; i < num_valid_dirs; ++i) {
383 enum direction8 dir = valid_dirs[i];
390 auto cardinal_before =
391 valid_dirs[(i + num_valid_dirs - 1) % num_valid_dirs];
393 auto cardinal_after = valid_dirs[(i + 1) % num_valid_dirs];
405 auto relative_dir = valid_dirs[(i + 2) % num_valid_dirs];
409 extras_near[dir], terrain_near[dir])
411 extras_near[cardinal_before],
412 extras_near[cardinal_after],
413 terrain_near[cardinal_after])) {
427 const tile *ptile)
const
432 if (draw.any() || isolated) {
444 const tile *ptile)
const
469 const tile *ptile)
const
474 int even_tileno = 0, odd_tileno = 0;
477 auto odd = 2 * i + 1;
480 even_tileno |= 1 << i;
483 odd_tileno |= 1 << i;
488 if (even_tileno != 0) {
491 if (odd_tileno != 0) {
bool BV_ISSET(const BV &bv, int bit)
std::vector< std::vector< all_combined_data > > m_all_combined
void fill_all_combined(std::vector< drawn_sprite > &sprs, const all_combined_data &data, const tile *ptile) const
Fill sprites for extras with type RoadAllCombined.
std::vector< std::vector< parity_combined_data > > m_parity_combined
layer_roads(struct tileset *ts)
Constructor.
void initialize_all_combined(all_combined_data &data, const QString &tag, const terrain *terrain)
Initializes sprite data for RoadAllCombined.
void reset_ruleset() override
Resets cached data that depends on the ruleset.
std::vector< std::vector< all_separate_data > > m_all_separate
void fill_all_separate(std::vector< drawn_sprite > &sprs, const all_separate_data &data, const tile *ptile) const
Fill sprites for extras with type RoadAllSeparate.
std::vector< drawn_sprite > fill_sprite_array(const tile *ptile, const tile_edge *pedge, const tile_corner *pcorner, const unit *punit) const override
Returns the sprites to draw roads.
void fill_corners(std::vector< drawn_sprite > &sprs, const corner_sprites &data, const tile *ptile) const
Fills "corner" sprites that help complete diagonal roads where they overlap with adjacent tiles.
void initialize_parity_combined(parity_combined_data &data, const QString &tag, const terrain *terrain)
Initializes sprite data for RoadAllSeparate.
void initialize_all_separate(all_separate_data &data, const QString &tag, const terrain *terrain)
Initializes sprite data for RoadAllSeparate.
void fill_parity_combined(std::vector< drawn_sprite > &sprs, const parity_combined_data &data, const tile *ptile) const
Fill sprites for extras with type RoadAllSeparate.
void initialize_corners(corner_sprites &data, const extra_type *extra, const QString &tag, const terrain *terrain)
Initializes "corner" sprite data.
void initialize_extra(const extra_type *extra, const QString &tag, extrastyle_id style) override
Collects all extras to be drawn.
A layer when drawing the map.
QPixmap * load_sprite(const QStringList &possible_names, bool required=false, bool verbose=true) const
Shortcut to load a sprite from the tileset.
struct tileset * tileset() const
#define INIT(vector, func)
client_options * gui_options
bool is_cardinal_only_road(const struct extra_type *pextra)
Is extra cardinal only road.
Stores the data common to all road types.
std::array< QPixmap *, DIR8_MAGIC_MAX > corners
Terrain_type_id terrain_count()
Return the number of terrains.
Terrain_type_id terrain_index(const struct terrain *pterrain)
Return the terrain index.
enum terrain_class terrain_type_terrain_class(const struct terrain *pterrain)
What terrain class terrain type belongs to.
struct city * tile_city(const struct tile *ptile)
Return the city on this tile (or nullptr), checking for city center.
#define tile_terrain(_tile)
static const bv_extras * tile_extras(const struct tile *ptile)
int tileset_hex_width(const struct tileset *t)
Return the hex_width of the current tileset.
QString valid_index_str(const struct tileset *t, int idx)
Do the same thing as cardinal_str, except including all valid directions.
void build_tile_data(const struct tile *ptile, struct terrain *pterrain, struct terrain **tterrain_near, bv_extras *textras_near)
Assemble some data that is used in building the tile sprite arrays.
bool is_cardinal_tileset_dir(const struct tileset *t, enum direction8 dir)
Return TRUE iff the dir is cardinal in this tileset.
int tileset_hex_height(const struct tileset *t)
Return the hex_height of the current tileset.
int tileset_num_valid_dirs(const struct tileset *t)
Returns the number of valid directions in the tileset.
bool is_extra_drawing_enabled(const extra_type *pextra)
Should the given extra be drawn FIXME: Some extras can not be switched.
std::array< direction8, 8 > tileset_valid_dirs(const struct tileset *t)
Returns the valid directions for the tileset.
QStringList make_tag_terrain_list(const QString &prefix, const QString &suffix, const struct terrain *pterrain)
Make the list of possible tag names for the extras which may vary depending on the terrain they're on...
QString dir_get_tileset_name(enum direction8 dir)
Return the tileset name of the direction.