game_state.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "game_state.h"
  2. #include <furi.h>
  3. #include <stdlib.h>
  4. struct GameState {
  5. LaserTagTeam team;
  6. uint8_t health;
  7. uint16_t score;
  8. uint16_t ammo;
  9. uint32_t game_time;
  10. bool game_over;
  11. };
  12. GameState* game_state_alloc() {
  13. GameState* state = malloc(sizeof(GameState));
  14. if(!state) {
  15. FURI_LOG_E("GameState", "Failed to allocate GameState");
  16. return NULL;
  17. }
  18. state->team = TeamRed;
  19. state->health = INITIAL_HEALTH;
  20. state->score = 0;
  21. state->ammo = INITIAL_AMMO;
  22. state->game_time = 0;
  23. state->game_over = false;
  24. FURI_LOG_I("GameState", "GameState allocated successfully");
  25. return state;
  26. }
  27. void game_state_reset(GameState* state) {
  28. furi_assert(state);
  29. state->health = INITIAL_HEALTH;
  30. state->score = 0;
  31. state->ammo = INITIAL_AMMO;
  32. state->game_time = 0;
  33. state->game_over = false;
  34. FURI_LOG_I("GameState", "GameState reset");
  35. }
  36. void game_state_set_team(GameState* state, LaserTagTeam team) {
  37. furi_assert(state);
  38. state->team = team;
  39. FURI_LOG_I("GameState", "Team set to %s", (team == TeamRed) ? "Red" : "Blue");
  40. }
  41. LaserTagTeam game_state_get_team(GameState* state) {
  42. furi_assert(state);
  43. return state->team;
  44. }
  45. void game_state_decrease_health(GameState* state, uint8_t amount) {
  46. furi_assert(state);
  47. if(state->health > amount) {
  48. state->health -= amount;
  49. } else {
  50. state->health = 0;
  51. state->game_over = true;
  52. FURI_LOG_W("GameState", "Health depleted, game over");
  53. }
  54. FURI_LOG_I("GameState", "Health decreased to %d", state->health);
  55. }
  56. void game_state_increase_health(GameState* state, uint8_t amount) {
  57. furi_assert(state);
  58. state->health = (state->health + amount > MAX_HEALTH) ? MAX_HEALTH : state->health + amount;
  59. FURI_LOG_I("GameState", "Health increased to %d", state->health);
  60. }
  61. uint8_t game_state_get_health(GameState* state) {
  62. furi_assert(state);
  63. return state->health;
  64. }
  65. void game_state_increase_score(GameState* state, uint16_t points) {
  66. furi_assert(state);
  67. state->score += points;
  68. FURI_LOG_I("GameState", "Score increased to %d", state->score);
  69. }
  70. uint16_t game_state_get_score(GameState* state) {
  71. furi_assert(state);
  72. return state->score;
  73. }
  74. void game_state_decrease_ammo(GameState* state, uint16_t amount) {
  75. furi_assert(state);
  76. if(state->ammo > amount) {
  77. state->ammo -= amount;
  78. } else {
  79. state->ammo = 0;
  80. FURI_LOG_W("GameState", "Ammo depleted");
  81. }
  82. FURI_LOG_I("GameState", "Ammo decreased to %d", state->ammo);
  83. }
  84. void game_state_increase_ammo(GameState* state, uint16_t amount) {
  85. furi_assert(state);
  86. state->ammo += amount;
  87. FURI_LOG_I("GameState", "Ammo increased to %d", state->ammo);
  88. }
  89. uint16_t game_state_get_ammo(GameState* state) {
  90. furi_assert(state);
  91. return state->ammo;
  92. }
  93. void game_state_update_time(GameState* state, uint32_t delta_time) {
  94. furi_assert(state);
  95. state->game_time += delta_time;
  96. FURI_LOG_I("GameState", "Game time updated to %ld seconds", state->game_time);
  97. }
  98. uint32_t game_state_get_time(GameState* state) {
  99. furi_assert(state);
  100. return state->game_time;
  101. }
  102. bool game_state_is_game_over(GameState* state) {
  103. furi_assert(state);
  104. return state->game_over;
  105. }
  106. void game_state_set_game_over(GameState* state, bool game_over) {
  107. furi_assert(state);
  108. state->game_over = game_over;
  109. FURI_LOG_I("GameState", "Game over status set to %s", game_over ? "true" : "false");
  110. }