hangman.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #pragma once
  2. #define HANGMAN_GALLOWS_MAX_STATE 7
  3. #define HANGMAN_GALLOWS_INIT_STATE 0
  4. #define HANGMAN_MAX_ALP_SIZE 0xFF
  5. #define HANGMAN_MAX_MENU_SIZE 5
  6. #define HANGMAN_MENU_FILE APP_ASSETS_PATH("menu.txt")
  7. #define CONST const __auto_type
  8. #include "hangman_icons.h"
  9. #include <math.h>
  10. #include <gui/gui.h>
  11. #include <gui/elements.h>
  12. #include <furi.h>
  13. #include <storage/storage.h>
  14. #include <toolbox/stream/stream.h>
  15. #include <toolbox/stream/file_stream.h>
  16. #include <furi_hal_random.h>
  17. typedef enum {
  18. HangmanOpenedInit,
  19. HangmanOpenedFound,
  20. HangmanOpenedNotFound,
  21. } HangmanOpened;
  22. typedef enum {
  23. HangmanGameOn,
  24. HangmanGameWin,
  25. HangmanGameLoose,
  26. } HangmanGameResult;
  27. typedef struct {
  28. char* dict_file;
  29. uint16_t unicode_base;
  30. uint8_t first_letter_offset;
  31. uint8_t letters_cnt;
  32. uint8_t keyboard_cols;
  33. uint8_t keyboard_rows;
  34. uint8_t word_letters_gap;
  35. uint16_t letters[HANGMAN_MAX_ALP_SIZE];
  36. char *message_ok, *message_won, *message_loose;
  37. } HangmanLangConfig;
  38. typedef struct {
  39. uint16_t* arr;
  40. size_t len;
  41. } HangmanWord;
  42. typedef struct {
  43. Gui* gui;
  44. ViewPort* view_port;
  45. FuriMessageQueue* event_queue;
  46. HangmanWord word;
  47. uint8_t pos;
  48. uint8_t gallows_state;
  49. HangmanOpened opened[HANGMAN_MAX_ALP_SIZE];
  50. bool need_generate;
  51. HangmanGameResult eog;
  52. HangmanLangConfig* lang;
  53. bool menu_show;
  54. int8_t menu_item;
  55. size_t menu_cnt;
  56. char** menu;
  57. } HangmanApp;
  58. void hangman_app_free(HangmanApp** app);
  59. void hangman_render_callback(Canvas* canvas, void* ctx);
  60. HangmanApp* hangman_app_alloc();
  61. void hangman_draw_gallows(Canvas* canvas, HangmanApp* app);
  62. void hangman_clear_state(HangmanApp* app);
  63. void hangman_text_window(Canvas* canvas, char* ok, char* txt);
  64. void hangman_window(Canvas* canvas, uint8_t x, uint8_t y, uint8_t w, uint8_t h);
  65. void hangman_draw_utf8_str(Canvas* canvas, uint8_t x, uint8_t y, const char* str);
  66. size_t hangman_string_length(const char* str);
  67. char** hangman_menu_read(size_t* menu_size);
  68. void hangman_free_menu_data(char** lines, size_t menu_size);
  69. void hangman_draw_menu(Canvas* canvas, HangmanApp* app);
  70. void hangman_load_lang(HangmanApp* app);
  71. void hangman_choice_letter(HangmanApp* app);
  72. bool hangman_wait_close_window(HangmanApp* app);
  73. bool hangman_menu_selection(HangmanApp* app);
  74. bool hangman_main_loop(HangmanApp* app);
  75. void hangman_set_font(Canvas* canvas, const uint8_t h);