diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-05-24 15:55:31 -0400 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-05-24 15:55:31 -0400 |
commit | 39c7e5062ed85cd59f88bc3431e4a72f7d6936ab (patch) | |
tree | bb076f1f69fc732712ebc8119f65730a08399e9f /src/main.cpp | |
parent | 60e13fb891ce4cb534d90a9d6f11db36856ab72c (diff) | |
download | ether-39c7e5062ed85cd59f88bc3431e4a72f7d6936ab.tar.gz ether-39c7e5062ed85cd59f88bc3431e4a72f7d6936ab.tar.bz2 ether-39c7e5062ed85cd59f88bc3431e4a72f7d6936ab.zip |
caverns shift in the dark
after moving, any tile that just became dark will randomly become a wall or a floor. then, all of the dark tiles will be ticked three times. this is to cause a sense of being lost by having the caverns shift around you where you can't see. the radius of dust scattering after a lamp drops/pops increases with the number of pops that have occured due to that drop. this allows chain reactions of popping lamps to occur. both dust and the player are now considered illuminated (in addition to being light sources).
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/main.cpp b/src/main.cpp index 7be82d1..28c89cc 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -62,6 +62,7 @@ public: | |||
62 | 62 | ||
63 | std::vector<Tile> tiles; | 63 | std::vector<Tile> tiles; |
64 | std::vector<bool> lighting; | 64 | std::vector<bool> lighting; |
65 | std::vector<bool> oldLighting; | ||
65 | int lightedSpots = 0; | 66 | int lightedSpots = 0; |
66 | }; | 67 | }; |
67 | 68 | ||
@@ -141,7 +142,7 @@ void incrementIfSet(Map& map, int& count, int x, int y, int w, int h, Tile val = | |||
141 | } | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
144 | void tick(Map& map, int x1 = 0, int y1 = 0, int x2 = VIEW_WIDTH, int y2 = VIEW_HEIGHT) | 145 | void tick(Map& map, int x1 = 0, int y1 = 0, int x2 = VIEW_WIDTH, int y2 = VIEW_HEIGHT, bool onlyDark = false) |
145 | { | 146 | { |
146 | std::vector<Tile> temp(map.tiles); | 147 | std::vector<Tile> temp(map.tiles); |
147 | 148 | ||
@@ -149,6 +150,11 @@ void tick(Map& map, int x1 = 0, int y1 = 0, int x2 = VIEW_WIDTH, int y2 = VIEW_H | |||
149 | { | 150 | { |
150 | for (int x = std::max(x1, 0); x < std::min(x2, VIEW_WIDTH); x++) | 151 | for (int x = std::max(x1, 0); x < std::min(x2, VIEW_WIDTH); x++) |
151 | { | 152 | { |
153 | if (onlyDark && map.lighting[x+y*VIEW_WIDTH]) | ||
154 | { | ||
155 | continue; | ||
156 | } | ||
157 | |||
152 | if (map.tiles[x+y*VIEW_WIDTH] == Tile::Lamp) | 158 | if (map.tiles[x+y*VIEW_WIDTH] == Tile::Lamp) |
153 | { | 159 | { |
154 | continue; | 160 | continue; |
@@ -203,6 +209,7 @@ void setIfValid(Map& map, int x, int y, Tile val) | |||
203 | 209 | ||
204 | void recalculateLighting(Map& map, fov_settings_type* fov) | 210 | void recalculateLighting(Map& map, fov_settings_type* fov) |
205 | { | 211 | { |
212 | map.oldLighting = map.lighting; | ||
206 | map.lighting = std::vector<bool>(VIEW_WIDTH*VIEW_HEIGHT, false); | 213 | map.lighting = std::vector<bool>(VIEW_WIDTH*VIEW_HEIGHT, false); |
207 | map.lightedSpots = 0; | 214 | map.lightedSpots = 0; |
208 | 215 | ||
@@ -240,12 +247,15 @@ void recalculateLighting(Map& map, fov_settings_type* fov) | |||
240 | fov_circle(fov, static_cast<void*>(&map), nullptr, x, y, 8); | 247 | fov_circle(fov, static_cast<void*>(&map), nullptr, x, y, 8); |
241 | } | 248 | } |
242 | 249 | ||
243 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) | 250 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp || |
251 | map.tiles[x+VIEW_WIDTH*y] == Tile::Dust) | ||
244 | { | 252 | { |
245 | map.lighting[x+VIEW_WIDTH*y] = true; | 253 | map.lighting[x+VIEW_WIDTH*y] = true; |
246 | } | 254 | } |
247 | } | 255 | } |
248 | } | 256 | } |
257 | |||
258 | map.lighting[player_x+VIEW_WIDTH*player_y] = true; | ||
249 | } | 259 | } |
250 | 260 | ||
251 | void processKeys(Map& map) | 261 | void processKeys(Map& map) |
@@ -371,8 +381,11 @@ int main(int, char**) | |||
371 | SDL_Delay(30); | 381 | SDL_Delay(30); |
372 | } | 382 | } |
373 | 383 | ||
384 | int lamped = 0; | ||
374 | while (!lamps.empty()) | 385 | while (!lamps.empty()) |
375 | { | 386 | { |
387 | lamped++; | ||
388 | |||
376 | int px, py; | 389 | int px, py; |
377 | std::tie(px, py) = lamps.front(); | 390 | std::tie(px, py) = lamps.front(); |
378 | lamps.pop_front(); | 391 | lamps.pop_front(); |
@@ -409,7 +422,7 @@ int main(int, char**) | |||
409 | } | 422 | } |
410 | }); | 423 | }); |
411 | 424 | ||
412 | fov_circle(dusty.get(), static_cast<void*>(&map), static_cast<void*>(&lamps), px, py, 8); | 425 | fov_circle(dusty.get(), static_cast<void*>(&map), static_cast<void*>(&lamps), px, py, 8*lamped); |
413 | 426 | ||
414 | render(ren.get(), map, false); | 427 | render(ren.get(), map, false); |
415 | SDL_Delay(50); | 428 | SDL_Delay(50); |
@@ -444,6 +457,30 @@ int main(int, char**) | |||
444 | } | 457 | } |
445 | 458 | ||
446 | recalculateLighting(map, fov.get()); | 459 | recalculateLighting(map, fov.get()); |
460 | |||
461 | if (presses > 0) | ||
462 | { | ||
463 | for (int y = 0; y < VIEW_HEIGHT; y++) | ||
464 | { | ||
465 | for (int x = 0; x < VIEW_WIDTH; x++) | ||
466 | { | ||
467 | if (!map.lighting[x+y*VIEW_WIDTH] && map.oldLighting[x+y*VIEW_WIDTH]) | ||
468 | { | ||
469 | if (std::bernoulli_distribution(0.5)(rng)) | ||
470 | { | ||
471 | map.tiles[x+y*VIEW_WIDTH] = Tile::Wall; | ||
472 | } else { | ||
473 | map.tiles[x+y*VIEW_WIDTH] = Tile::Floor; | ||
474 | } | ||
475 | } | ||
476 | } | ||
477 | } | ||
478 | |||
479 | tick(map, 0, 0, VIEW_WIDTH, VIEW_HEIGHT, true); | ||
480 | tick(map, 0, 0, VIEW_WIDTH, VIEW_HEIGHT, true); | ||
481 | tick(map, 0, 0, VIEW_WIDTH, VIEW_HEIGHT, true); | ||
482 | } | ||
483 | |||
447 | render(ren.get(), map, true); | 484 | render(ren.get(), map, true); |
448 | SDL_Delay(10); | 485 | SDL_Delay(10); |
449 | } | 486 | } |