Без опису
Ви не можете вибрати більше 25 тем Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

debuggers_states.cpp 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "debuggers.h"
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <iostream>
  6. #include <random>
  7. namespace pabloader {
  8. bool Debuggers::GamePlay(float fElapsedTime)
  9. {
  10. DrawSprite(0, 0, &backgroundSprite);
  11. uint32_t bugsSize = bugs.size();
  12. int aliveBugs = std::count_if(bugs.begin(), bugs.end(), [](Bug* bug) { return bug->IsActive() && bug->IsAlive(); });
  13. Programmer* player = programmers.front();
  14. for (auto& bug : bugs) {
  15. if (bug->IsActive()) {
  16. bug->Update(fElapsedTime);
  17. bug->Draw();
  18. for (auto& programmer : programmers) {
  19. if (programmer->Collides(bug)) {
  20. bugsCatched++;
  21. if (programmer == player) {
  22. bugsCatchedByPlayer++;
  23. }
  24. SpawnBugParticles(bug);
  25. if (state == STATE_GAME)
  26. olc::SOUND::PlaySample(bugCatchSample);
  27. bug->Kill();
  28. SpawnBug();
  29. }
  30. }
  31. } else if (bug->IsAlive()) {
  32. bugsMissed++;
  33. bug->Kill();
  34. SpawnBug();
  35. if (state == STATE_GAME) {
  36. sourceCode.erase(sourceCode.begin());
  37. olc::SOUND::PlaySample(bugFallSample);
  38. }
  39. }
  40. }
  41. for (auto& particle : particles) {
  42. if (particle->IsInScreen()) {
  43. particle->Update(fElapsedTime);
  44. particle->Draw();
  45. } else {
  46. particle->Kill();
  47. }
  48. }
  49. for (auto& bonus : bonuses) {
  50. if (bonus->IsActive()) {
  51. bonus->Update(fElapsedTime);
  52. bonus->Draw();
  53. if (player->Collides(bonus)) {
  54. auto type = bonus->GetType();
  55. if (type == BONUS_DOCUMENTATION) {
  56. auto count = std::max(aliveBugs / 10, 1);
  57. for (auto& bug : bugs) {
  58. SpawnBugParticles(bug);
  59. bug->Kill();
  60. count--;
  61. if (count <= 0) {
  62. break;
  63. }
  64. }
  65. } else {
  66. bonusesCatched[type]++;
  67. }
  68. bonus->Kill();
  69. olc::SOUND::PlaySample(bonusSample);
  70. }
  71. } else {
  72. bonus->Kill();
  73. }
  74. }
  75. linesOfCode = (sourceCode.size() * 4 / totalLines) + 1;
  76. for (auto it = programmers.rbegin(); it != programmers.rend(); it++) {
  77. auto& programmer = *it;
  78. programmer->Think();
  79. programmer->Update(fElapsedTime);
  80. programmer->Draw();
  81. }
  82. if (aliveBugs == 0 && player->IsOnGround()) {
  83. SpawnBug();
  84. }
  85. auto programmersSize = programmers.size();
  86. if (bugsCatchedByPlayer >= 15 * programmersSize * programmersSize && player->GetSkin() < programmersSize) {
  87. player->UpgradeLevel();
  88. SpawnBug();
  89. SpawnProgrammer();
  90. }
  91. if (bugsCatched > 14 * bugsSize) {
  92. SpawnBug();
  93. }
  94. if (GetRandom<float>() < 0.03 * fElapsedTime) {
  95. SpawnBonus();
  96. }
  97. #ifdef _DEBUG
  98. if (debug) {
  99. DrawString(1, 37, "Bg: " + std::to_string(bugs.size()) + " Ab: " + std::to_string(aliveBugs));
  100. DrawString(1, 46, "Ps: " + std::to_string(programmers.size()) + " Bn: " + std::to_string(bonuses.size()));
  101. DrawString(1, 55, "Cp: " + std::to_string(bugsCatchedByPlayer));
  102. DrawString(1, 64, "DBG: " + std::to_string(bonusesCatched[BONUS_DEBUGGER]));
  103. DrawString(1, 73, "UTS: " + std::to_string(bonusesCatched[BONUS_UNIT_TEST]));
  104. }
  105. #endif
  106. if (state == STATE_GAME) {
  107. DrawString(1, 1, "Don't let the bugs destroy your code!", olc::YELLOW);
  108. DrawString(1, 10, "Bugs catched: " + std::to_string(bugsCatched));
  109. DrawString(1, 19, "Bugs missed: " + std::to_string(bugsMissed));
  110. }
  111. DrawSourceCode();
  112. if (state == STATE_MAIN_MENU) {
  113. DrawMenu();
  114. } else if (state == STATE_GAME) {
  115. if (!IsFocused() || GetKey(olc::ESCAPE).bPressed) {
  116. SwitchState(STATE_PAUSE_MENU);
  117. } else if (sourceCode.size() == 0) {
  118. SwitchState(STATE_GAME_OVER);
  119. }
  120. }
  121. return true;
  122. }
  123. bool Debuggers::PauseMenu(float fElapsedTime)
  124. {
  125. DrawSprite(0, 0, &backgroundSprite);
  126. for (auto& bug : bugs) {
  127. if (bug->IsActive() && bug->IsAlive()) {
  128. bug->Draw();
  129. }
  130. }
  131. for (auto& particle : particles) {
  132. if (particle->IsInScreen()) {
  133. particle->Draw();
  134. }
  135. }
  136. for (auto& bonus : bonuses) {
  137. if (bonus->IsActive()) {
  138. bonus->Draw();
  139. }
  140. }
  141. for (auto it = programmers.rbegin(); it != programmers.rend(); it++) {
  142. auto& programmer = *it;
  143. programmer->Draw();
  144. }
  145. DrawSourceCode();
  146. DrawMenu();
  147. if (GetKey(olc::ESCAPE).bPressed) {
  148. SwitchState(STATE_GAME);
  149. }
  150. return true;
  151. }
  152. bool Debuggers::GameOver(float dt)
  153. {
  154. DrawSprite(0, 0, &backgroundSprite);
  155. DrawString(ScreenWidth() / 2 - 143, ScreenHeight() / 2 - 15, "GAME OVER", olc::BLACK, 4);
  156. DrawString(ScreenWidth() / 2 - 144, ScreenHeight() / 2 - 16, "GAME OVER", olc::RED, 4);
  157. DrawString(ScreenWidth() / 2 - 144, ScreenHeight() / 2 + 16, "Bugs catched: " + std::to_string(bugsCatched), olc::CYAN, 2);
  158. if (GetKey(olc::ESCAPE).bPressed) {
  159. SwitchState(STATE_MAIN_MENU);
  160. }
  161. return true;
  162. }
  163. bool Debuggers::HelpMenu(float dt)
  164. {
  165. DrawSprite(0, 0, &backgroundSprite);
  166. DrawSourceCode();
  167. DrawLogo();
  168. auto y = 96;
  169. DrawString(16, y, "A,S,D - move left/down/right");
  170. y += 9;
  171. DrawString(16, y, "SPACE - jump");
  172. y += 9;
  173. DrawString(16, y, "Bugs, you must destroy them: ");
  174. y += 9;
  175. helpRotation += dt;
  176. auto w = enemiesSprite.width / 4;
  177. auto h = enemiesSprite.height / 4;
  178. y += h;
  179. olc::GFX2D::Transform2D transform;
  180. transform.Scale(2, 2);
  181. transform.Rotate(helpRotation);
  182. transform.Translate(16 + w / 2, y);
  183. SetPixelMode(olc::Pixel::MASK);
  184. for (auto i = 0; i < 2; i++) {
  185. for (auto j = 0; j < 4; j++) {
  186. olc::GFX2D::DrawPartialSprite(&enemiesSprite, i * w, j * h, w, h, transform, true);
  187. transform.Translate(w * 2, 0);
  188. }
  189. }
  190. y += h;
  191. w = bonusesSprite.width / 4;
  192. h = bonusesSprite.height / 4;
  193. DrawString(16, y, "RTFM removes 10% bugs: ");
  194. y += 9 + h / 2;
  195. DrawPartialSprite(16 + w / 2, y, &bonusesSprite, 0, 0, w, h, 1, true);
  196. SetPixelMode(olc::Pixel::NORMAL);
  197. if (GetKey(olc::ESCAPE).bPressed) {
  198. SwitchState(prevState);
  199. }
  200. return true;
  201. }
  202. }