diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2022-03-19 11:30:22 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2022-03-19 11:30:22 -0400 |
commit | 81e8c1dae2e7e4be632d6e81d765b5dd43ea3927 (patch) | |
tree | f1b660e91a5204a801cb62a7951322e4491210ff /src | |
parent | 6cfe247b362106543bbb1a835dde9e7da9128fee (diff) | |
download | ether-81e8c1dae2e7e4be632d6e81d765b5dd43ea3927.tar.gz ether-81e8c1dae2e7e4be632d6e81d765b5dd43ea3927.tar.bz2 ether-81e8c1dae2e7e4be632d6e81d765b5dd43ea3927.zip |
game tries to make sure initial cave is not tiny
Diffstat (limited to 'src')
-rw-r--r-- | src/game.cpp | 58 | ||||
-rw-r--r-- | src/game.h | 2 |
2 files changed, 50 insertions, 10 deletions
diff --git a/src/game.cpp b/src/game.cpp index f048400..f8508c2 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
@@ -3,6 +3,8 @@ | |||
3 | #include <fov.h> | 3 | #include <fov.h> |
4 | #include <iostream> | 4 | #include <iostream> |
5 | #include <fstream> | 5 | #include <fstream> |
6 | #include <set> | ||
7 | #include <deque> | ||
6 | #include "util.h" | 8 | #include "util.h" |
7 | #include "renderer.h" | 9 | #include "renderer.h" |
8 | #include "consts.h" | 10 | #include "consts.h" |
@@ -14,20 +16,22 @@ Game::Game(std::mt19937& rng, Muxer& muxer, Renderer& renderer) : | |||
14 | { | 16 | { |
15 | losePopLampTimer.accumulate(losePopLampTimer.getDt()); | 17 | losePopLampTimer.accumulate(losePopLampTimer.getDt()); |
16 | 18 | ||
17 | loadMap(); | 19 | do { |
18 | tick(); | 20 | loadMap(); |
19 | tick(); | 21 | tick(); |
20 | tick(); | 22 | tick(); |
23 | tick(); | ||
21 | 24 | ||
22 | for (int y = -1; y <= 1; y++) | 25 | for (int y = -1; y <= 1; y++) |
23 | { | ||
24 | for (int x = -1; x <= 1; x++) | ||
25 | { | 26 | { |
26 | map.tile(x,y) = Tile::Floor; | 27 | for (int x = -1; x <= 1; x++) |
28 | { | ||
29 | map.tile(x,y) = Tile::Floor; | ||
30 | } | ||
27 | } | 31 | } |
28 | } | ||
29 | 32 | ||
30 | tick(); | 33 | tick(); |
34 | } while (!isInitialCaveBigEnough()); | ||
31 | 35 | ||
32 | std::ifstream textFile("../res/childoflight.txt"); | 36 | std::ifstream textFile("../res/childoflight.txt"); |
33 | std::string line; | 37 | std::string line; |
@@ -167,6 +171,40 @@ void Game::tick(bool onlyDark) | |||
167 | onlyDark); | 171 | onlyDark); |
168 | } | 172 | } |
169 | 173 | ||
174 | bool Game::isInitialCaveBigEnough() const { | ||
175 | std::set<coord> accessible; | ||
176 | std::deque<coord> search; | ||
177 | search.emplace_back(player_x, player_y); | ||
178 | |||
179 | auto check_fn = [&](int x, int y) { | ||
180 | coord potential = {x,y}; | ||
181 | if (!accessible.count(potential) && !isTileSet(map, x, y)) { | ||
182 | accessible.insert(potential); | ||
183 | search.push_back(potential); | ||
184 | } | ||
185 | }; | ||
186 | |||
187 | while (!search.empty()) { | ||
188 | auto [x,y] = search.front(); | ||
189 | search.pop_front(); | ||
190 | |||
191 | check_fn(x-1, y-1); | ||
192 | check_fn(x-1, y ); | ||
193 | check_fn(x-1, y+1); | ||
194 | check_fn(x , y-1); | ||
195 | check_fn(x , y+1); | ||
196 | check_fn(x+1, y-1); | ||
197 | check_fn(x+1, y ); | ||
198 | check_fn(x+1, y+1); | ||
199 | |||
200 | if (accessible.size() >= 200) { | ||
201 | return true; | ||
202 | } | ||
203 | } | ||
204 | |||
205 | return false; | ||
206 | } | ||
207 | |||
170 | bool Game::movePlayer(int x, int y) | 208 | bool Game::movePlayer(int x, int y) |
171 | { | 209 | { |
172 | if (map.tile(x,y) == Tile::Floor && !map.at(x,y).sign) | 210 | if (map.tile(x,y) == Tile::Floor && !map.at(x,y).sign) |
diff --git a/src/game.h b/src/game.h index a70f57e..5f13672 100644 --- a/src/game.h +++ b/src/game.h | |||
@@ -126,6 +126,8 @@ private: | |||
126 | 126 | ||
127 | void tick(bool onlyDark = false); | 127 | void tick(bool onlyDark = false); |
128 | 128 | ||
129 | bool isInitialCaveBigEnough() const; | ||
130 | |||
129 | bool movePlayer(int x, int y); | 131 | bool movePlayer(int x, int y); |
130 | 132 | ||
131 | void recalculateLighting(); | 133 | void recalculateLighting(); |