summary refs log tree commit diff stats
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp123
1 files changed, 37 insertions, 86 deletions
diff --git a/src/game.cpp b/src/game.cpp index a7c94db..62e755b 100644 --- a/src/game.cpp +++ b/src/game.cpp
@@ -8,25 +8,11 @@
8 8
9Game::Game(std::mt19937& rng, Muxer& muxer) : 9Game::Game(std::mt19937& rng, Muxer& muxer) :
10 rng(rng), 10 rng(rng),
11 muxer(muxer), 11 muxer(muxer)
12 map(
13 -INIT_ZOOM * ZOOM_X_FACTOR / 2,
14 -INIT_ZOOM * ZOOM_Y_FACTOR / 2,
15 INIT_ZOOM * ZOOM_X_FACTOR,
16 INIT_ZOOM * ZOOM_Y_FACTOR)
17{ 12{
18 losePopLampTimer.accumulate(losePopLampTimer.getDt()); 13 losePopLampTimer.accumulate(losePopLampTimer.getDt());
19 14
20 for (MapData& md : map.data()) 15 loadMap();
21 {
22 if (std::bernoulli_distribution(0.5)(rng))
23 {
24 md.tile = Tile::Wall;
25 }
26 }
27
28 tick();
29 tick();
30 16
31 for (int y = -1; y <= 1; y++) 17 for (int y = -1; y <= 1; y++)
32 { 18 {
@@ -39,12 +25,12 @@ Game::Game(std::mt19937& rng, Muxer& muxer) :
39 tick(); 25 tick();
40} 26}
41 27
42inline bool isTileSetOrNotLit(const Map<MapData>& map, int x, int y) 28inline bool isTileSetOrNotLit(const Map& map, int x, int y)
43{ 29{
44 return (map.inBounds(x, y) && (map.at(x,y).tile == Tile::Wall || !map.at(x,y).lit)); 30 return (map.inBounds(x, y) && (map.at(x,y).tile == Tile::Wall || !map.at(x,y).lit));
45} 31}
46 32
47inline bool isTileSet(const Map<MapData>& map, int x, int y, Tile val = Tile::Wall) 33inline bool isTileSet(const Map& map, int x, int y, Tile val = Tile::Wall)
48{ 34{
49 return (map.inBounds(x, y) && map.at(x,y).tile == val); 35 return (map.inBounds(x, y) && map.at(x,y).tile == val);
50} 36}
@@ -69,7 +55,7 @@ void Game::tick(
69 bool invert, 55 bool invert,
70 bool onlyDark) 56 bool onlyDark)
71{ 57{
72 Map<MapData> temp(map); 58 std::vector<MapData> temp(map.data());
73 59
74 for (int y = map.getTop(); y < map.getBottom(); y++) 60 for (int y = map.getTop(); y < map.getBottom(); y++)
75 { 61 {
@@ -102,21 +88,22 @@ void Game::tick(
102 incrementIfSet(*this, count, x+1, y ); 88 incrementIfSet(*this, count, x+1, y );
103 incrementIfSet(*this, count, x+1, y+1); 89 incrementIfSet(*this, count, x+1, y+1);
104 90
91 int tempIndex = map.getTrueX(x) + map.getTrueY(y) * map.getWidth();
105 if (count >= 5) 92 if (count >= 5)
106 { 93 {
107 temp.at(x,y).tile = Tile::Wall; 94 temp[tempIndex].tile = Tile::Wall;
108 } else { 95 } else {
109 temp.at(x,y).tile = Tile::Floor; 96 temp[tempIndex].tile = Tile::Floor;
110 } 97 }
111 98
112 if (temp.at(x,y).tile != map.at(x,y).tile) { 99 if (temp[tempIndex].tile != map.at(x,y).tile) {
113 temp.at(x,y).dirtyRender = true; 100 temp[tempIndex].dirtyRender = true;
114 dirtyRender = true; 101 dirtyRender = true;
115 } 102 }
116 } 103 }
117 } 104 }
118 105
119 map = std::move(temp); 106 map.data() = std::move(temp);
120} 107}
121 108
122void Game::tick(bool onlyDark) 109void Game::tick(bool onlyDark)
@@ -132,10 +119,10 @@ void Game::tick(bool onlyDark)
132 119
133bool Game::movePlayer(int x, int y) 120bool Game::movePlayer(int x, int y)
134{ 121{
135 if (x >= curBoundX && 122 if (/*x >= curBoundX &&
136 y >= curBoundY && 123 y >= curBoundY &&
137 x < curBoundX + curZoom * ZOOM_X_FACTOR && 124 x < curBoundX + curZoom * ZOOM_X_FACTOR &&
138 y < curBoundY + curZoom * ZOOM_Y_FACTOR && 125 y < curBoundY + curZoom * ZOOM_Y_FACTOR &&*/
139 map.at(x,y).tile == Tile::Floor) 126 map.at(x,y).tile == Tile::Floor)
140 { 127 {
141 if (map.at(player_x, player_y).tile == Tile::Floor) 128 if (map.at(player_x, player_y).tile == Tile::Floor)
@@ -154,6 +141,13 @@ bool Game::movePlayer(int x, int y)
154 moveProgress.start(66); 141 moveProgress.start(66);
155 dirtyLighting = true; 142 dirtyLighting = true;
156 143
144 int chunkX, chunkY, old_chunkX, old_chunkY;
145 toChunkPos(player_x, player_y, chunkX, chunkY);
146 toChunkPos(player_oldx, player_oldy, old_chunkX, old_chunkY);
147 if ((chunkX != old_chunkX) || (chunkY != old_chunkY)) {
148 loadMap();
149 }
150
157 return true; 151 return true;
158 } else { 152 } else {
159 if (!alreadyBumped) { 153 if (!alreadyBumped) {
@@ -501,39 +495,25 @@ void Game::processKickup()
501 }); 495 });
502} 496}
503 497
504void Game::growMap(size_t zoom) 498void Game::loadMap() {
505{ 499 int newChunksHoriz = std::ceil(static_cast<double>(curZoom) * ZOOM_X_FACTOR / CHUNK_WIDTH) + 4;
506 int ol = map.getLeft(); 500 int newChunksVert = std::ceil(static_cast<double>(curZoom) * ZOOM_Y_FACTOR / CHUNK_HEIGHT) + 4;
507 int ot = map.getTop(); 501 int curPlayerChunkX, curPlayerChunkY;
508 int ow = map.getWidth(); 502 toChunkPos(player_x, player_y, curPlayerChunkX, curPlayerChunkY);
509 int oh = map.getHeight();
510 503
511 map.resize( 504 map.load(
512 -zoom * ZOOM_X_FACTOR / 2, 505 curPlayerChunkX - newChunksHoriz / 2,
513 -zoom * ZOOM_Y_FACTOR / 2, 506 curPlayerChunkY - newChunksVert / 2,
514 zoom * ZOOM_X_FACTOR, 507 newChunksHoriz,
515 zoom * ZOOM_Y_FACTOR); 508 newChunksVert,
509 rng);
516 510
517 maxZoom = zoom; 511 tick();
518 512 tick();
519 for (int y = map.getTop(); y < map.getBottom(); y++) 513 tick();
520 {
521 for (int x = map.getLeft(); x < map.getRight(); x++)
522 {
523 if (!(x >= ol && x < (ol + ow) && y >= ot && y < (ot + oh)))
524 {
525 if (std::bernoulli_distribution(0.5)(rng))
526 {
527 map.at(x,y).tile = Tile::Wall;
528 }
529 }
530 }
531 }
532 514
533 for (int i = 0; i < 3; i++) 515 dirtyLighting = true;
534 { 516 dirtyRender = true;
535 tick(ol, ot, ol + ow, ot + oh, true);
536 }
537} 517}
538 518
539void Game::setZoom(size_t zoom) 519void Game::setZoom(size_t zoom)
@@ -543,40 +523,11 @@ void Game::setZoom(size_t zoom)
543 return; 523 return;
544 } 524 }
545 525
546 if (zoom > maxZoom)
547 {
548 growMap(zoom);
549 }
550
551 std::tie(
552 lastZoomLeft,
553 lastZoomTop,
554 lastZoomWidth,
555 lastZoomHeight) =
556 Renderer::calculateZoomRect(*this);
557
558 zoomProgress = 0; 526 zoomProgress = 0;
559 zoomLength = std::abs(static_cast<long>(zoom - curZoom)) * TILE_WIDTH; 527 zoomLength = std::abs(static_cast<long>(zoom - curZoom)) * TILE_WIDTH;
560 curZoom = zoom; 528 curZoom = zoom;
561 zooming = true; 529 zooming = true;
562 530 loadMap();
563 curBoundX = player_x - zoom * ZOOM_X_FACTOR / 2;
564 if (curBoundX < map.getLeft())
565 {
566 curBoundX = map.getLeft();
567 } else if (curBoundX + zoom * ZOOM_X_FACTOR >= map.getRight())
568 {
569 curBoundX = map.getRight() - zoom * ZOOM_X_FACTOR;
570 }
571
572 curBoundY = player_y - zoom * ZOOM_Y_FACTOR / 2;
573 if (curBoundY < map.getTop())
574 {
575 curBoundY = map.getTop();
576 } else if (curBoundY + zoom * ZOOM_Y_FACTOR >= map.getBottom())
577 {
578 curBoundY = map.getBottom() - zoom * ZOOM_Y_FACTOR;
579 }
580 531
581 int zoomLevel = getZoomLevel(*this); 532 int zoomLevel = getZoomLevel(*this);
582 if (zoomLevel == 0) { 533 if (zoomLevel == 0) {