scientist.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "scientist.h"
  2. #include "game_sprites.h"
  3. #include <jetpack_game_icons.h>
  4. #include <gui/gui.h>
  5. void scientist_tick(SCIENTIST* const scientists) {
  6. for(int i = 0; i < SCIENTISTS_MAX; i++) {
  7. if(scientists[i].visible) {
  8. if(scientists[i].point.x < 64) scientists[i].velocity_x = 0.5f;
  9. scientists[i].point.x -= scientists[i].state == ScientistStateAlive ?
  10. 1 - scientists[i].velocity_x :
  11. 1; // move based on velocity_x
  12. int width = (scientists[i].state == ScientistStateAlive) ? SCIENTIST_WIDTH :
  13. SCIENTIST_HEIGHT;
  14. if(scientists[i].point.x <= -width) { // if the scientist is out of screen
  15. scientists[i].visible = false;
  16. }
  17. }
  18. }
  19. }
  20. void spawn_random_scientist(SCIENTIST* const scientists) {
  21. float velocities[] = {-0.5f, 0.0f, 0.5f, -1.0f};
  22. // Check for an available slot for a new scientist
  23. for(int i = 0; i < SCIENTISTS_MAX; ++i) {
  24. if(!scientists[i].visible &&
  25. (rand() % 1000) < 10) { // Spawn rate is less frequent than coins
  26. scientists[i].state = ScientistStateAlive;
  27. scientists[i].point.x = 127;
  28. scientists[i].point.y = 49;
  29. scientists[i].velocity_x = velocities[rand() % 4];
  30. scientists[i].visible = true;
  31. break;
  32. }
  33. }
  34. }
  35. void draw_scientists(const SCIENTIST* scientists, Canvas* const canvas, const GameSprites* sprites) {
  36. for(int i = 0; i < SCIENTISTS_MAX; ++i) {
  37. if(scientists[i].visible) {
  38. canvas_set_color(canvas, ColorBlack);
  39. if(scientists[i].state == ScientistStateAlive) {
  40. canvas_draw_icon(
  41. canvas,
  42. (int)scientists[i].point.x,
  43. scientists[i].point.y,
  44. scientists[i].velocity_x >= 0 ? sprites->scientist_right :
  45. sprites->scientist_left);
  46. canvas_set_color(canvas, ColorWhite);
  47. canvas_draw_icon(
  48. canvas,
  49. (int)scientists[i].point.x,
  50. scientists[i].point.y,
  51. scientists[i].velocity_x >= 0 ? sprites->scientist_right_infill :
  52. sprites->scientist_left_infill);
  53. } else {
  54. canvas_set_color(canvas, ColorBlack);
  55. canvas_draw_icon(
  56. canvas,
  57. (int)scientists[i].point.x,
  58. scientists[i].point.y + 5,
  59. &I_dead_scientist);
  60. canvas_set_color(canvas, ColorWhite);
  61. canvas_draw_icon(
  62. canvas,
  63. (int)scientists[i].point.x,
  64. scientists[i].point.y + 5,
  65. &I_dead_scientist_infill);
  66. }
  67. }
  68. }
  69. }