Core.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "Core.hpp"
  2. #include "Echo.hpp"
  3. #include "Animation.hpp"
  4. Core::Core(Global* lg):
  5. _player(&_settings),
  6. _lives(lg->lives),
  7. g(lg)
  8. {
  9. _settings.view = &_view;
  10. _settings.window = &g->window;
  11. _settings.evm = &_evm;
  12. _settings.bg = &_background;
  13. _settings.fog = &_fog;
  14. _settings.size = Vector2u(256, 224);
  15. _settings.running = true;
  16. _settings.paused = false;
  17. _settings.p = &_player;
  18. _settings._s = g->score;
  19. if(_settings._s == 0 && _lives == 2)
  20. _settings.state = 0;
  21. else
  22. _settings.state = 2;
  23. _view = g->window.getDefaultView();
  24. loadTexture(_hud_tx, "data/hud.png");
  25. _hud_score.setTexture(_hud_tx);
  26. _hud_score.setTextureRect(IntRect(0, 0, 72, 7));
  27. _hud_score.setPosition(8, 0);
  28. _hud_highscore.setTexture(_hud_tx);
  29. _hud_highscore.setTextureRect(IntRect(0, 7, 72, 7));
  30. _hud_highscore.setPosition(88, 0);
  31. _hud_time.setTexture(_hud_tx);
  32. _hud_time.setTextureRect(IntRect(0, 14, 72, 7));
  33. _hud_time.setPosition(15, 17);
  34. _hud_energy.setTexture(_hud_tx);
  35. _hud_energy.setTextureRect(IntRect(0, 21, 72, 7));
  36. _hud_energy.setPosition(80, 17);
  37. loadTexture(_font, "data/numbers.png");
  38. _score_text.setTexture(&_font);
  39. _score_text.setPosition(55, 8);
  40. _highscore_text.setTexture(&_font);
  41. _highscore_text.setPosition(138, 8);
  42. _time_text.setTexture(&_font);
  43. _time_text.semicolon();
  44. _time_text.setPosition(18, 27);
  45. _energy_text.setTexture(&_font);
  46. _energy_text.percent();
  47. _energy_text.setPosition(100, 27);
  48. loadTexture(_head_tx, "data/glim-head.png");
  49. _head_tx.setRepeated(true);
  50. _head.setTexture(_head_tx);
  51. _head.setPosition(0, 224);
  52. _head.setOrigin(0, _head_tx.getSize().y);
  53. _head.setTextureRect(IntRect(0, 0, _head_tx.getSize().x * _lives, _head_tx.getSize().y));
  54. loadTexture(_frame_tx, "data/frame.png");
  55. _frame.setTexture(_frame_tx);
  56. _frame.setPosition(128, 224);
  57. _frame.setOrigin(_frame_tx.getSize().x / 2.f, _frame_tx.getSize().y + 4.f);
  58. if(g->reachedEast)
  59. _player.setPosition(16 * 86, 224);
  60. else
  61. _player.setPosition(16 * 9, 224);
  62. _player.addAnimation("data/snowfall-walk.png", "data/glim-walk.png", 500, "walk", true);
  63. _player.addAnimation("data/snowfall-idle.png", "data/glim-idle.png", 10000, "idle", true);
  64. _player.addAnimation("data/snowfall-longidle.png", "data/glim-longidle.png", 1000, "longidle", false);
  65. _player.addAnimation("data/snowfall-forward.png", "data/glim-forward.png", 1000, "forward", false);
  66. _player.addAnimation("data/snowfall-jump.png", "data/glim-jump.png", 200, "jump", false);
  67. _player.setAnimation("longidle", true);
  68. _view.setSize(256, 224);
  69. _view.setCenter(_player.getPosition().x, _player.getPosition().y - 80.f);
  70. loadTexture(_background_tx, "data/basic_background.png");
  71. _background.setTexture(_background_tx);
  72. _background.setOrigin((Vector2f)_background_tx.getSize() / 2.f);
  73. _background.setPosition(_player.getPosition().x, _player.getPosition().y - 80.f);
  74. loadTexture(_evm_tx, "data/evilmountain.png");
  75. _evm.setTexture(_evm_tx);
  76. _evm.setOrigin((Vector2f)_evm_tx.getSize() / 2.f);
  77. _evm.setPosition(_player.getPosition().x + 32.f, _player.getPosition().y - 128.f);
  78. loadTexture(_fog_tx, "data/basic_fog.png");
  79. _fog.setTexture(_fog_tx);
  80. _fog.setOrigin((Vector2f)_fog_tx.getSize() / 2.f);
  81. _fog.setColor(Color(255, 255, 255, 10));
  82. _fog.setPosition(_player.getPosition().x, _player.getPosition().y - 80.f);
  83. map.load("data/map1.tmx");
  84. for(unsigned i = 0; i < LAYERCOUNT; ++i) {
  85. _layer[i].create(map, i);
  86. }
  87. /// Left invisible wall
  88. _settings.cb.emplace_back(-16, 0, 16, 16 * 32);
  89. _settings.cb.emplace_back(192 * 16, 0, 16, 16 * 32);
  90. /// Graves
  91. _settings.cb.emplace_back(6 * 16, 13 * 16, 16, 16);
  92. _settings.cb.emplace_back(19 * 16, 13 * 16, 16, 16);
  93. _settings.cb.emplace_back(38 * 16, 13 * 16, 16, 16);
  94. _settings.cb.emplace_back(53 * 16, 13 * 16, 16, 16);
  95. _settings.cb.emplace_back(28 * 16, 9 * 16, 16, 16);
  96. /// Ground
  97. _settings.cp.emplace_back(0, 224, 64 * 16 + 16, 8);
  98. _settings.cp.emplace_back(22 * 16, 10 * 16, 13 * 16 + 16, 8);
  99. _settings.cp.emplace_back(73 * 16, 224, 130 * 16 + 16, 8);
  100. jedi.emplace_back(2 * 16, 13 * 16, 48, 16);
  101. jedi.emplace_back(11 * 16, 13 * 16, 48, 16);
  102. jedi.emplace_back(48 * 16, 13 * 16, 48, 16);
  103. jedi.emplace_back(86 * 16, 13 * 16, 48, 16);
  104. jedi.emplace_back(101 * 16, 13 * 16, 48, 16);
  105. jedi.emplace_back(112 * 16, 13 * 16, 48, 16);
  106. jedi.emplace_back(124 * 16, 13 * 16, 48, 16);
  107. jedi.emplace_back(139 * 16, 13 * 16, 48, 16);
  108. jedi.emplace_back(171 * 16, 13 * 16, 48 * 3, 16);
  109. jedi.emplace_back(31 * 16, 9 * 16, 48, 16);
  110. _p1.create(&_settings, {23, 13}, {23, 9});
  111. _p2.create(&_settings, {64, 13}, {74, 13});
  112. _p3.create(&_settings, {75, 13}, {63, 13});
  113. debug.setFillColor(Color(255, 0, 0, 100));
  114. debug.setSize(Vector2f(4.f, 4.f));
  115. debug.setOrigin(2.f, 2.f);
  116. debug2.setFillColor(Color::Red);
  117. debug2.setSize(Vector2f(4.f, 4.f));
  118. debug2.setOrigin(2.f, 2.f);
  119. splashtx.loadFromFile("data/splash.png");
  120. splash.setTexture(splashtx);
  121. _settings._t = sf::seconds(120);
  122. _settings._s = g->score;
  123. _settings._h = g->high;
  124. _settings._e = 50;
  125. timegranted = false;
  126. boom.loadFromFile("data/shoot.wav");
  127. sht.setBuffer(boom);
  128. sht.setVolume(40.f);
  129. ggtex.loadFromFile("data/shot.png");
  130. _corrupted.emplace_back(&_settings);
  131. _corrupted.back().setPosition(170 * 16, 224);
  132. _corrupted.back().out = 0.f;
  133. _corrupted.back().in = 0.f;
  134. _corrupted.back().speed = 144.f;
  135. _corrupted.back().lifespan = 2000000000;
  136. _corrupted.back().hp = 6;
  137. _corrupted.back().ready = true;
  138. _trix.loadFromFile("data/trixie.png");
  139. _trixie.setPosition(_player.getPosition().x + 32.f, _player.getPosition().y);
  140. _trixie.setOrigin(0.f, 14.f);
  141. _trixie.setTexture(_trix);
  142. }
  143. Core::~Core()
  144. {
  145. }
  146. void Core::run()
  147. {
  148. Clock clock;
  149. float delta;
  150. float minimum = 1.f / 30.f;
  151. Echo(INFO, "Starting.");
  152. while(_settings.running) {
  153. think(delta);
  154. delta = clock.restart().asSeconds();
  155. while(delta > minimum) {
  156. delta -= minimum;
  157. if(!_settings.paused)
  158. loop(minimum);
  159. }
  160. if(!_settings.paused)
  161. loop(delta);
  162. render();
  163. }
  164. }
  165. void Core::think(float delta)
  166. {
  167. Event event;
  168. _settings.jump = false;
  169. while(g->window.pollEvent(event)) {
  170. if(event.type == Event::Closed || (event.type == Event::KeyReleased && event.key.code == Keyboard::Escape)) {
  171. g->window.close();
  172. g->restart = false;
  173. _settings.running = false;
  174. }
  175. else if(event.type == Event::GainedFocus) {
  176. _settings.paused = false;
  177. }
  178. else if(event.type == Event::LostFocus) {
  179. _settings.paused = true;
  180. }
  181. else if(event.type == Event::KeyReleased && event.key.code == Keyboard::P) {
  182. _settings.paused = !_settings.paused;
  183. }
  184. else if(_settings.state == 2 && event.type == Event::KeyPressed && (event.key.code == Keyboard::Space || event.key.code == Keyboard::X)) {
  185. if(_settings._e >= 10.f && !_player.dead)
  186. {
  187. _settings.jump = true;
  188. _settings._e -= 10.f;
  189. }
  190. }
  191. else if(_settings.state == 2 && event.type == Event::KeyPressed && (event.key.code == Keyboard::LControl || event.key.code == Keyboard::Z)) {
  192. if(gg.size() < 3 && _settings._e >= 20.f) {
  193. _settings._e -= 20.f;
  194. sht.setPitch(int(80 + rand() % 40) / 100.f);
  195. sht.play();
  196. gg.emplace_back();
  197. gg.back().setTexture(ggtex);
  198. gg.back().setOrigin(4, 4 + 24);
  199. gg.back().setScale(_player.getScale());
  200. gg.back().setPosition(_player.getPosition().x, _player.getPosition().y);
  201. }
  202. }
  203. else if(_settings.state < 2 && event.type == Event::KeyReleased && (
  204. event.key.code == Keyboard::Return || event.key.code == Keyboard::Num1)) {
  205. _settings.state = 2;
  206. _s1c.restart();
  207. }
  208. }
  209. }
  210. #include <sstream>
  211. void Core::loop(float delta)
  212. {
  213. if(_settings.state == 2)
  214. _player.loop(delta);
  215. else
  216. _player.animate();
  217. if(_settings.state != 1) {
  218. _s1c.restart();
  219. }
  220. _settings.hz.clear();
  221. _settings.gz.clear();
  222. _p1.animate();
  223. _p2.animate();
  224. _p3.animate();
  225. _score_text.setNumber(_settings._s);
  226. _highscore_text.setNumber(_settings._h);
  227. std::stringstream ss;
  228. int asfioahsfuio;
  229. if(int(_settings._t.asSeconds() / 60) < 10)
  230. ss << 0;
  231. ss << int(_settings._t.asSeconds() / 60.f);
  232. if(int(_settings._t.asSeconds()) % 60 < 10)
  233. ss << 0;
  234. ss << int(_settings._t.asSeconds()) % 60;
  235. ss >> asfioahsfuio;
  236. _time_text.setNumber(asfioahsfuio);
  237. _energy_text.setNumber((int)_settings._e);
  238. if(_settings.state == 1) {
  239. }
  240. if(_settings.state == 2) {
  241. if(_settings._e < 100.f) {
  242. _settings._e += delta * 3.f;
  243. bool jedifound = false;
  244. for(unsigned i = 0; i < jedi.size(); ++i) {
  245. if(jedi[i].intersects(IntRect(_player.getGlobalBounds()))) {
  246. jedifound = true;
  247. break;
  248. }
  249. }
  250. if(jedifound) {
  251. if(jediClock.getElapsedTime().asSeconds() > 1.f) {
  252. _settings._e += delta * 17.f;
  253. }
  254. }
  255. else {
  256. jediClock.restart();
  257. }
  258. }
  259. _settings._t -= seconds(delta);
  260. if(!timegranted && _player.getPosition().x > 70.f * 16.f) {
  261. timegranted = true;
  262. _settings._t = sf::seconds(120);
  263. g->reachedEast = true;
  264. }
  265. for(unsigned i = 0; i < gg.size(); ++i) {
  266. gg[i].move(delta * 256.f * gg[i].getScale().x, 0.f);
  267. _settings.gz.push_back(IntRect(gg[i].getPosition().x - gg[i].getOrigin().x,
  268. gg[i].getPosition().y - gg[i].getOrigin().x,
  269. gg[i].getTextureRect().width,
  270. gg[i].getTextureRect().height));
  271. }
  272. for(unsigned i = 0; i < _corrupted.size(); ++i) {
  273. _corrupted[i].loop(delta);
  274. }
  275. if(_corrupted[0].dead) {
  276. _settings._s += 900;
  277. _settings._s += _settings._t.asSeconds() * 10;
  278. _settings.state = 5;
  279. splashtx.loadFromFile("data/gaemover.png");
  280. splash.setTexture(splashtx);
  281. }
  282. for(unsigned i = 1; i < _corrupted.size(); ++i) {
  283. if(_corrupted[i].dead) {
  284. _corrupted.erase(_corrupted.begin() + i);
  285. i--;
  286. }
  287. }
  288. for(unsigned i = 0; i < _corrupted.size(); ++i) {
  289. if(!_corrupted[i].ready) {
  290. continue;
  291. }
  292. _settings.hz.push_back(IntRect(_corrupted[i].getPosition().x - _corrupted[i].getOrigin().x,
  293. _corrupted[i].getPosition().y - _corrupted[i].getOrigin().x,
  294. _corrupted[i].getTextureRect().width,
  295. _corrupted[i].getTextureRect().height));
  296. }
  297. for(unsigned i = 0; i < keb.size(); ++i) {
  298. keb[i].loop(delta);
  299. }
  300. for(unsigned i = 0; i < keb.size(); ++i) {
  301. if(keb[i].dead) {
  302. keb.erase(keb.begin() + i);
  303. }
  304. }
  305. for(unsigned i = 0; i < keb.size(); ++i) {
  306. _settings.hz.push_back(IntRect(keb[i].getPosition().x + keb[i].keb.getGlobalBounds().left,
  307. keb[i].getPosition().y + keb[i].spr.getGlobalBounds().top + 8.f,
  308. keb[i].keb.getTextureRect().width,
  309. keb[i].keb.getTextureRect().height + 16.f));
  310. _settings.hz.push_back(IntRect(keb[i].getPosition().x + keb[i].spr.getGlobalBounds().left,
  311. keb[i].getPosition().y + keb[i].spr.getGlobalBounds().top + 8.f,
  312. keb[i].spr.getTextureRect().width,
  313. keb[i].spr.getTextureRect().height));
  314. }
  315. //debug2.setPosition(_player.getPosition().x - 8.f * _player.getScale().x, _player.getPosition().y);
  316. if(_player.getPosition().x < 64 * 16) {
  317. if(_corr_clock.getElapsedTime().asSeconds() > 2.f && !_player.isJumping() && _corrupted.size() < 6) {
  318. _corr_clock.restart();
  319. _corrupted.emplace_back(&_settings);
  320. bool bad = true;
  321. while(bad) {
  322. bad = true;
  323. _corrupted.back().setPosition(_player.getPosition().x - 32.f + rand() % 64, _player.getPosition().y + 24.f + 16.f * (rand() % 2));
  324. for(unsigned i = 0; i < _settings.cp.size(); ++i) {
  325. if(((_corrupted.back().getPosition().x >= _settings.cp[i].left + 4.f
  326. && _corrupted.back().getPosition().x <= _settings.cp[i].left - 4.f + _settings.cp[i].width)
  327. ||
  328. (_corrupted.back().getPosition().x - 8.f >= _settings.cp[i].left + 4.f
  329. && _corrupted.back().getPosition().x - 8.f <= _settings.cp[i].left - 4.f + _settings.cp[i].width))
  330. && _corrupted.back().getPosition().y - 24.f >= _settings.cp[i].top
  331. && _corrupted.back().getPosition().y - 24.f <= _settings.cp[i].top + _settings.cp[i].height) {
  332. bad = false;
  333. break;
  334. }
  335. }
  336. if(_corrupted.back().getPosition().x >= _player.getPosition().x - 16.f && _corrupted.back().getPosition().x <= _player.getPosition().x + 16.f)
  337. bad = true;
  338. for(unsigned i = 0; i < _settings.cb.size() && !bad; ++i) {
  339. if(_corrupted.back().getPosition().x + 12.f > _settings.cb[i].left
  340. && _corrupted.back().getPosition().x + 12.f < _settings.cb[i].left + _settings.cb[i].width
  341. && _corrupted.back().getPosition().y - 24.f - 8.f > _settings.cb[i].top
  342. && _corrupted.back().getPosition().y - 24.f - 8.f < _settings.cb[i].top + _settings.cb[i].height) {
  343. bad = true;
  344. break;
  345. }
  346. }
  347. }
  348. }
  349. }
  350. if(_player.getPosition().x > 90 * 16 && !_player.isJumping()) {
  351. if(_corr_clock.getElapsedTime().asSeconds() > 2.f && keb.size() < 6) {
  352. _corr_clock.restart();
  353. keb.emplace_back(&_settings);
  354. keb.back().setPosition(_player.getPosition().x - 128.f + rand() % 256, _player.getPosition().y - 32.f - ((rand() % 2) * 16.f));
  355. keb.back().keb.setColor(Color(255, 255, 255, 0));
  356. }
  357. }
  358. }
  359. for(unsigned i = 0; i < gg.size(); ++i) {
  360. if(_settings.gz[i].width == 0 || _settings.gz[i].left > _view.getCenter().x + _view.getSize().x / 2.f || _settings.gz[i].left + _settings.gz[i].width < _view.getCenter().x - _view.getSize().x / 2.f) {
  361. gg.erase(gg.begin() + i);
  362. break;
  363. }
  364. }
  365. static float waiting = 0.f;
  366. if(_player.dead || _settings._t.asSeconds() < 0.5f) {
  367. if(waiting < 1.f) {
  368. if(_lives == 0) {
  369. _settings.state = 4;
  370. splashtx.loadFromFile("data/gaemover2.png");
  371. splash.setTexture(splashtx);
  372. waiting += 1.f;
  373. }
  374. else waiting += 3.f;
  375. }
  376. waiting += delta;
  377. if(waiting > 4.f) {
  378. waiting = 0.f;
  379. --_lives;
  380. g->lives--;
  381. g->score = _settings._s;
  382. _settings.running = false;
  383. /*_player.setPosition(16 * 9, 224);
  384. _head.setTextureRect(IntRect(0, 0, _head_tx.getSize().x * _lives, _head_tx.getSize().y));
  385. if(_lives <= -1) {
  386. _settings.state = 4;
  387. splashtx.loadFromFile("data/gaemover2.png");
  388. splash.setTexture(splashtx);
  389. }
  390. _view.setCenter(_player.getPosition().x, _player.getPosition().y - 80.f);
  391. _background.setPosition(_player.getPosition().x, _player.getPosition().y - 80.f);
  392. _evm.setPosition(_player.getPosition().x + 32.f, _player.getPosition().y - 128.f);
  393. _fog.setPosition(_player.getPosition().x, _player.getPosition().y - 80.f);
  394. _player.dead = false;
  395. _player.armored = true;
  396. _player.iframed = true;
  397. _player.iframeclock.restart();*/
  398. }
  399. }
  400. }
  401. void Core::render()
  402. {
  403. g->window.setView(_view);
  404. g->window.draw(_background);
  405. g->window.draw(_evm);
  406. for(unsigned i = 1; i < LAYERCOUNT; ++i) {
  407. g->window.draw(_layer[i]);
  408. }
  409. g->window.draw(_p1);
  410. g->window.draw(_p2);
  411. g->window.draw(_p3);
  412. for(unsigned i = 0; i < _corrupted.size(); ++i) {
  413. g->window.draw(_corrupted[i]);
  414. }
  415. for(unsigned i = 0; i < keb.size(); ++i) {
  416. g->window.draw(keb[i]);
  417. }
  418. g->window.draw(_layer[0]);
  419. if(_settings.state == 2)
  420. g->window.draw(_player);
  421. if(_settings.state == 0 && _s1c.getElapsedTime().asSeconds() < 4.f)
  422. g->window.draw(_trixie);
  423. for(unsigned i = 0; i < gg.size(); ++i) {
  424. g->window.draw(gg[i]);
  425. }
  426. g->window.draw(_fog);
  427. g->window.draw(debug);
  428. g->window.draw(debug2);
  429. g->window.setView(g->window.getDefaultView());
  430. g->window.draw(_hud_time);
  431. g->window.draw(_hud_highscore);
  432. g->window.draw(_hud_energy);
  433. g->window.draw(_highscore_text);
  434. g->window.draw(_time_text);
  435. g->window.draw(_energy_text);
  436. if(_settings.state == 2) {
  437. g->window.draw(_head);
  438. g->window.draw(_frame);
  439. }
  440. if(_settings.state == 0 || _settings.state > 2) {
  441. g->window.draw(splash);
  442. }
  443. g->window.draw(_hud_score);
  444. g->window.draw(_score_text);
  445. g->window.display();
  446. }