hangman.h 2.2 KB

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