diff options
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 189 |
1 files changed, 150 insertions, 39 deletions
diff --git a/src/main.cpp b/src/main.cpp index e26a5a8..c39cdb6 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -45,6 +45,13 @@ enum class Tile { | |||
45 | Lamp | 45 | Lamp |
46 | }; | 46 | }; |
47 | 47 | ||
48 | enum class LoseState { | ||
49 | None, | ||
50 | PoppingLamps, | ||
51 | PoppingPlayer, | ||
52 | Outro | ||
53 | }; | ||
54 | |||
48 | const int GAME_WIDTH = 640*2; | 55 | const int GAME_WIDTH = 640*2; |
49 | const int GAME_HEIGHT = 480*2; | 56 | const int GAME_HEIGHT = 480*2; |
50 | const int TILE_WIDTH = 8*2; | 57 | const int TILE_WIDTH = 8*2; |
@@ -85,10 +92,13 @@ public: | |||
85 | std::list<Kickup> kickups; | 92 | std::list<Kickup> kickups; |
86 | int lightedSpots = 0; | 93 | int lightedSpots = 0; |
87 | bool dirtyLighting = true; | 94 | bool dirtyLighting = true; |
95 | size_t numLamps = 0; | ||
96 | size_t numDust = 0; | ||
88 | }; | 97 | }; |
89 | 98 | ||
90 | int player_x = VIEW_WIDTH / 2; | 99 | int player_x = VIEW_WIDTH / 2; |
91 | int player_y = VIEW_HEIGHT / 2; | 100 | int player_y = VIEW_HEIGHT / 2; |
101 | bool renderPlayer = true; | ||
92 | 102 | ||
93 | void render( | 103 | void render( |
94 | SDL_Renderer* ren, | 104 | SDL_Renderer* ren, |
@@ -104,7 +114,7 @@ void render( | |||
104 | { | 114 | { |
105 | bool draw = true; | 115 | bool draw = true; |
106 | 116 | ||
107 | if (player_x == x && player_y == y) | 117 | if ((player_x == x && player_y == y) && renderPlayer) |
108 | { | 118 | { |
109 | SDL_SetRenderDrawColor(ren, 255, 255, 0, 255); | 119 | SDL_SetRenderDrawColor(ren, 255, 255, 0, 255); |
110 | } else if (!map.lighting.at(x+VIEW_WIDTH*y)) | 120 | } else if (!map.lighting.at(x+VIEW_WIDTH*y)) |
@@ -217,6 +227,7 @@ void movePlayer(int x, int y, Map& map) | |||
217 | if (map.tiles[player_x+player_y*VIEW_WIDTH] == Tile::Floor) | 227 | if (map.tiles[player_x+player_y*VIEW_WIDTH] == Tile::Floor) |
218 | { | 228 | { |
219 | map.tiles[player_x+player_y*VIEW_WIDTH] = Tile::Dust; | 229 | map.tiles[player_x+player_y*VIEW_WIDTH] = Tile::Dust; |
230 | map.numDust++; | ||
220 | } | 231 | } |
221 | 232 | ||
222 | player_x = x; | 233 | player_x = x; |
@@ -279,7 +290,7 @@ void recalculateLighting(Map& map, fov_settings_type* fov) | |||
279 | { | 290 | { |
280 | for (int x = 0; x < VIEW_WIDTH; x++) | 291 | for (int x = 0; x < VIEW_WIDTH; x++) |
281 | { | 292 | { |
282 | if ((player_x == x && player_y == y) || | 293 | if ((player_x == x && player_y == y && renderPlayer) || |
283 | map.tiles[x+VIEW_WIDTH*y] == Tile::Dust || | 294 | map.tiles[x+VIEW_WIDTH*y] == Tile::Dust || |
284 | map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) | 295 | map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) |
285 | { | 296 | { |
@@ -327,7 +338,6 @@ void processKeys(Map& map, const Input& keystate) | |||
327 | 338 | ||
328 | void kickUpDust(Map& map, int x, int y, size_t chain) | 339 | void kickUpDust(Map& map, int x, int y, size_t chain) |
329 | { | 340 | { |
330 | std::cout << "kickup " << x << " " << y << " " << chain << std::endl; | ||
331 | Kickup dk; | 341 | Kickup dk; |
332 | dk.x = x; | 342 | dk.x = x; |
333 | dk.y = y; | 343 | dk.y = y; |
@@ -338,6 +348,20 @@ void kickUpDust(Map& map, int x, int y, size_t chain) | |||
338 | map.kickups.push_back(dk); | 348 | map.kickups.push_back(dk); |
339 | } | 349 | } |
340 | 350 | ||
351 | void popLamp(Map& map, int x, int y, size_t chain) | ||
352 | { | ||
353 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) | ||
354 | { | ||
355 | map.numLamps--; | ||
356 | } | ||
357 | |||
358 | map.tiles[x+VIEW_WIDTH*y] = Tile::Dust; | ||
359 | map.numDust++; | ||
360 | map.dirtyLighting = true; | ||
361 | |||
362 | kickUpDust(map, x, y, chain); | ||
363 | } | ||
364 | |||
341 | void processKickup(Map& map) | 365 | void processKickup(Map& map) |
342 | { | 366 | { |
343 | for (Kickup& kickup : map.kickups) | 367 | for (Kickup& kickup : map.kickups) |
@@ -347,6 +371,7 @@ void processKickup(Map& map) | |||
347 | if (map.tiles[kickup.x+VIEW_WIDTH*kickup.y] == Tile::Floor) | 371 | if (map.tiles[kickup.x+VIEW_WIDTH*kickup.y] == Tile::Floor) |
348 | { | 372 | { |
349 | map.tiles[kickup.x+VIEW_WIDTH*kickup.y] = Tile::Dust; | 373 | map.tiles[kickup.x+VIEW_WIDTH*kickup.y] = Tile::Dust; |
374 | map.numDust++; | ||
350 | } | 375 | } |
351 | 376 | ||
352 | std::unique_ptr<fov_settings_type> dusty(new fov_settings_type); | 377 | std::unique_ptr<fov_settings_type> dusty(new fov_settings_type); |
@@ -373,13 +398,11 @@ void processKickup(Map& map) | |||
373 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Floor) | 398 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Floor) |
374 | { | 399 | { |
375 | map.tiles[x+VIEW_WIDTH*y] = Tile::Dust; | 400 | map.tiles[x+VIEW_WIDTH*y] = Tile::Dust; |
401 | map.numDust++; | ||
376 | map.dirtyLighting = true; | 402 | map.dirtyLighting = true; |
377 | } else if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) | 403 | } else if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) |
378 | { | 404 | { |
379 | map.tiles[x+VIEW_WIDTH*y] = Tile::Dust; | 405 | popLamp(map, x, y, kickup.chain + 1); |
380 | map.dirtyLighting = true; | ||
381 | |||
382 | kickUpDust(map, x, y, kickup.chain + 1); | ||
383 | } | 406 | } |
384 | } | 407 | } |
385 | }); | 408 | }); |
@@ -454,6 +477,7 @@ int main(int, char**) | |||
454 | tick(map); | 477 | tick(map); |
455 | 478 | ||
456 | bool quit = false; | 479 | bool quit = false; |
480 | LoseState losing = LoseState::None; | ||
457 | Input keystate; | 481 | Input keystate; |
458 | SDL_Event e; | 482 | SDL_Event e; |
459 | 483 | ||
@@ -463,6 +487,12 @@ int main(int, char**) | |||
463 | size_t inputDt = 50; | 487 | size_t inputDt = 50; |
464 | size_t inputAcc = 0; | 488 | size_t inputAcc = 0; |
465 | 489 | ||
490 | size_t losePopLampDt = 1000; | ||
491 | size_t losePopLampAcc = losePopLampDt; | ||
492 | |||
493 | size_t losePopPlayerDt = 4000; | ||
494 | size_t losePopPlayerAcc = 0; | ||
495 | |||
466 | size_t lastTime = SDL_GetTicks(); | 496 | size_t lastTime = SDL_GetTicks(); |
467 | 497 | ||
468 | while (!quit) | 498 | while (!quit) |
@@ -471,50 +501,60 @@ int main(int, char**) | |||
471 | size_t frameTime = currentTime - lastTime; | 501 | size_t frameTime = currentTime - lastTime; |
472 | lastTime = currentTime; | 502 | lastTime = currentTime; |
473 | 503 | ||
474 | //bool input = false; | ||
475 | //int presses = 0; | ||
476 | bool pressedSpace = false; | ||
477 | while (SDL_PollEvent(&e)) | 504 | while (SDL_PollEvent(&e)) |
478 | { | 505 | { |
479 | if (e.type == SDL_QUIT) | 506 | if (e.type == SDL_QUIT) |
480 | { | 507 | { |
481 | quit = true; | 508 | if (losing != LoseState::None) |
509 | { | ||
510 | quit = true; | ||
511 | } else { | ||
512 | losing = LoseState::PoppingLamps; | ||
513 | } | ||
482 | } else if (e.type == SDL_KEYDOWN) | 514 | } else if (e.type == SDL_KEYDOWN) |
483 | { | 515 | { |
484 | //presses++; | ||
485 | |||
486 | switch (e.key.keysym.sym) | 516 | switch (e.key.keysym.sym) |
487 | { | 517 | { |
488 | case SDLK_ESCAPE: | 518 | case SDLK_ESCAPE: |
489 | { | 519 | { |
490 | quit = true; | 520 | if (losing != LoseState::None) |
521 | { | ||
522 | quit = true; | ||
523 | } else { | ||
524 | losing = LoseState::PoppingLamps; | ||
525 | } | ||
526 | |||
491 | break; | 527 | break; |
492 | } | 528 | } |
493 | 529 | ||
494 | case SDLK_SPACE: | 530 | case SDLK_SPACE: |
495 | { | 531 | { |
496 | pressedSpace = true; | 532 | if (losing == LoseState::None) |
497 | |||
498 | setIfValid(map, player_x , player_y , Tile::Lamp); | ||
499 | |||
500 | for (int i = 0; i < 5; i++) | ||
501 | { | 533 | { |
502 | processKeys(map, keystate); | 534 | if (map.tiles[player_x+VIEW_WIDTH*player_y] == Tile::Floor) |
503 | 535 | { | |
504 | tick( | 536 | map.tiles[player_x+VIEW_WIDTH*player_y] = Tile::Lamp; |
505 | map, | 537 | map.numLamps++; |
506 | player_x - (RADIUS - 1), | 538 | map.dirtyLighting = true; |
507 | player_y - (RADIUS - 1), | 539 | kickUpDust(map, player_x, player_y, 0); |
508 | player_x + RADIUS, | 540 | |
509 | player_y + RADIUS); | 541 | for (int i = 0; i < 5; i++) |
510 | 542 | { | |
511 | //render(ren.get(), map, false); | 543 | processKeys(map, keystate); |
512 | //SDL_Delay(30); | 544 | |
545 | tick( | ||
546 | map, | ||
547 | player_x - (RADIUS - 1), | ||
548 | player_y - (RADIUS - 1), | ||
549 | player_x + RADIUS, | ||
550 | player_y + RADIUS); | ||
551 | |||
552 | //render(ren.get(), map, false); | ||
553 | //SDL_Delay(30); | ||
554 | } | ||
555 | } | ||
513 | } | 556 | } |
514 | 557 | ||
515 | map.dirtyLighting = true; | ||
516 | kickUpDust(map, player_x, player_y, 0); | ||
517 | |||
518 | break; | 558 | break; |
519 | } | 559 | } |
520 | } | 560 | } |
@@ -527,8 +567,6 @@ int main(int, char**) | |||
527 | keystate.up = state[SDL_SCANCODE_UP]; | 567 | keystate.up = state[SDL_SCANCODE_UP]; |
528 | keystate.down = state[SDL_SCANCODE_DOWN]; | 568 | keystate.down = state[SDL_SCANCODE_DOWN]; |
529 | 569 | ||
530 | bool input = keystate.left || keystate.right || keystate.up || keystate.down || pressedSpace; | ||
531 | |||
532 | dustAcc += frameTime; | 570 | dustAcc += frameTime; |
533 | inputAcc += frameTime; | 571 | inputAcc += frameTime; |
534 | 572 | ||
@@ -546,16 +584,89 @@ int main(int, char**) | |||
546 | } | 584 | } |
547 | } | 585 | } |
548 | 586 | ||
587 | map.numDust = 0; | ||
588 | |||
549 | processKickup(map); | 589 | processKickup(map); |
550 | 590 | ||
551 | dustAcc -= dustDt; | 591 | dustAcc -= dustDt; |
552 | } | 592 | } |
553 | 593 | ||
554 | while (inputAcc >= inputDt) | 594 | switch (losing) |
555 | { | 595 | { |
556 | processKeys(map, keystate); | 596 | case LoseState::None: |
597 | { | ||
598 | while (inputAcc >= inputDt) | ||
599 | { | ||
600 | processKeys(map, keystate); | ||
601 | |||
602 | inputAcc -= inputDt; | ||
603 | } | ||
557 | 604 | ||
558 | inputAcc -= inputDt; | 605 | break; |
606 | } | ||
607 | |||
608 | case LoseState::PoppingLamps: | ||
609 | { | ||
610 | if (map.numLamps == 0) | ||
611 | { | ||
612 | if (map.numDust == 0) | ||
613 | { | ||
614 | losing = LoseState::PoppingPlayer; | ||
615 | } | ||
616 | } else { | ||
617 | losePopLampAcc += frameTime; | ||
618 | |||
619 | while (losePopLampAcc >= losePopLampDt) | ||
620 | { | ||
621 | std::vector<std::tuple<int, int>> lamps; | ||
622 | |||
623 | for (int y = 0; y < VIEW_HEIGHT; y++) | ||
624 | { | ||
625 | for (int x = 0; x < VIEW_WIDTH; x++) | ||
626 | { | ||
627 | if (map.tiles[x+VIEW_WIDTH*y] == Tile::Lamp) | ||
628 | { | ||
629 | lamps.emplace_back(x, y); | ||
630 | } | ||
631 | } | ||
632 | } | ||
633 | |||
634 | std::uniform_int_distribution<int> lampDist(0, lamps.size() - 1); | ||
635 | std::tuple<int, int> popPos = lamps[lampDist(rng)]; | ||
636 | |||
637 | popLamp(map, std::get<0>(popPos), std::get<1>(popPos), 0); | ||
638 | |||
639 | losePopLampAcc -= losePopLampDt; | ||
640 | } | ||
641 | } | ||
642 | |||
643 | break; | ||
644 | } | ||
645 | |||
646 | case LoseState::PoppingPlayer: | ||
647 | { | ||
648 | losePopPlayerAcc += frameTime; | ||
649 | |||
650 | if (losePopPlayerAcc >= losePopPlayerDt) | ||
651 | { | ||
652 | popLamp(map, player_x, player_y, 10); | ||
653 | renderPlayer = false; | ||
654 | |||
655 | losing = LoseState::Outro; | ||
656 | } | ||
657 | |||
658 | break; | ||
659 | } | ||
660 | |||
661 | case LoseState::Outro: | ||
662 | { | ||
663 | if (map.numDust == 0) | ||
664 | { | ||
665 | quit = true; | ||
666 | } | ||
667 | |||
668 | break; | ||
669 | } | ||
559 | } | 670 | } |
560 | 671 | ||
561 | if (map.dirtyLighting) | 672 | if (map.dirtyLighting) |
@@ -594,4 +705,4 @@ int main(int, char**) | |||
594 | SDL_Quit(); | 705 | SDL_Quit(); |
595 | 706 | ||
596 | return 0; | 707 | return 0; |
597 | } \ No newline at end of file | 708 | } |