Freeciv21
Develop your civilization from humble roots to a global empire
layer_fog.cpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPLv3-or-later
2 // SPDX-FileCopyrightText: Freeciv authors
3 // SPDX-FileCopyrightText: Freeciv21 authors
4 // SPDX-FileCopyrightText: Louis Moureaux <m_louis30@yahoo.com>
5 
6 #include "layer_fog.h"
7 
8 #include "climap.h"
9 #include "colors_common.h"
10 #include "tilespec.h"
11 
12 namespace freeciv {
13 
14 layer_fog::layer_fog(struct tileset *ts, fog_style style,
15  darkness_style darkness)
16  : freeciv::layer(ts, LAYER_FOG), m_style(style), m_darkness(darkness)
17 {
18 }
19 
21 {
22  m_fog_sprite = load_sprite({"tx.fog"}, true);
23 
24  if (m_darkness == DARKNESS_CORNER) {
25  for (int i = 0; i < 81 /* 3^4 */; i++) {
26  // Unknown, fog, known.
27  const QChar ids[] = {'u', 'f', 'k'};
28  auto buf = QStringLiteral("t.fog");
29  int values[4], k = i;
30 
31  for (int vi = 0; vi < 4; vi++) {
32  values[vi] = k % 3;
33  k /= 3;
34 
35  buf += QStringLiteral("_") + ids[values[vi]];
36  }
37  fc_assert(k == 0);
38 
39  m_darkness_sprites.push_back(load_sprite({buf}));
40  }
41  }
42 }
43 
44 std::vector<drawn_sprite>
45 layer_fog::fill_sprite_array(const tile *ptile, const tile_edge *pedge,
46  const tile_corner *pcorner,
47  const unit *punit) const
48 {
49  std::vector<drawn_sprite> sprs;
50 
51  if (m_style == FOG_SPRITE && gui_options->draw_fog_of_war && ptile
53  sprs.emplace_back(tileset(), m_darkness_sprites[0]);
54  }
55 
56  if (m_darkness == DARKNESS_CORNER && pcorner
58  int tileno = 0;
59 
60  for (int i = 3; i >= 0; i--) {
61  const int unknown = 0, fogged = 1, known = 2;
62  int value = -1;
63 
64  if (!pcorner->tile[i]) {
65  value = fogged;
66  } else {
67  switch (client_tile_get_known(pcorner->tile[i])) {
68  case TILE_KNOWN_SEEN:
69  value = known;
70  break;
71  case TILE_KNOWN_UNSEEN:
72  value = fogged;
73  break;
74  case TILE_UNKNOWN:
75  value = unknown;
76  break;
77  }
78  }
79  fc_assert(value >= 0 && value < 3);
80 
81  tileno = tileno * 3 + value;
82  }
83 
84  if (m_darkness_sprites[tileno]) {
85  sprs.emplace_back(tileset(), m_darkness_sprites[tileno]);
86  }
87  }
88 
89  return sprs;
90 }
91 
92 } // namespace freeciv
void load_sprites() override
Loads all sprites that do not depend on the ruleset.
Definition: layer_fog.cpp:20
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 list of sprites drawn by this layer somewhere on the map.
Definition: layer_fog.cpp:45
QPixmap * m_fog_sprite
Definition: layer_fog.h:45
layer_fog(struct tileset *ts, fog_style style, darkness_style darkness)
Definition: layer_fog.cpp:14
darkness_style m_darkness
Definition: layer_fog.h:44
fog_style m_style
Definition: layer_fog.h:43
std::vector< QPixmap * > m_darkness_sprites
Definition: layer_fog.h:46
A layer when drawing the map.
Definition: layer.h:153
QPixmap * load_sprite(const QStringList &possible_names, bool required=false, bool verbose=true) const
Shortcut to load a sprite from the tileset.
Definition: layer.cpp:79
struct tileset * tileset() const
Definition: layer.h:241
enum known_type client_tile_get_known(const struct tile *ptile)
A tile's "known" field is used by the server to store whether each player knows the tile.
Definition: climap.cpp:29
#define fc_assert(condition)
Definition: log.h:89
Definition: path.cpp:10
client_options * gui_options
Definition: options.cpp:74
bool draw_fog_of_war
Definition: options.h:139
const struct tile * tile[NUM_CORNER_TILES]
Definition: layer.h:49
Definition: tile.h:42
Definition: unit.h:134
@ TILE_KNOWN_UNSEEN
Definition: tile.h:30
@ TILE_UNKNOWN
Definition: tile.h:29
@ TILE_KNOWN_SEEN
Definition: tile.h:31