world.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include <draw/world.h>
  2. void draw_bounds(Canvas *canvas)
  3. {
  4. // Draw the outer bounds adjusted by camera offset
  5. // we draw this last to ensure users can see the bounds
  6. canvas_draw_frame(canvas, -camera_x, -camera_y, WORLD_WIDTH, WORLD_HEIGHT);
  7. }
  8. void draw_example_world(Level *level)
  9. {
  10. spawn_icon(level, &I_icon_earth, 112, 56, 15, 16);
  11. spawn_icon(level, &I_icon_home, 128, 24, 15, 16);
  12. spawn_icon(level, &I_icon_info, 144, 24, 15, 16);
  13. spawn_icon(level, &I_icon_man, 160, 56, 7, 16);
  14. spawn_icon(level, &I_icon_woman, 168, 56, 9, 16);
  15. spawn_icon(level, &I_icon_plant, 168, 32, 16, 16);
  16. }
  17. /* JSON of the draw_example_world with fields icon, x, y, width, height
  18. {
  19. "name": "Example World",
  20. "author": "JBlanked",
  21. "json_data": [
  22. {
  23. "icon": "earth",
  24. "x": 112,
  25. "y": 56,
  26. "width": 15,
  27. "height": 16
  28. },
  29. {
  30. "icon": "home",
  31. "x": 128,
  32. "y": 24,
  33. "width": 15,
  34. "height": 16
  35. },
  36. {
  37. "icon": "info",
  38. "x": 144,
  39. "y": 24,
  40. "width": 15,
  41. "height": 16
  42. },
  43. {
  44. "icon": "man",
  45. "x": 160,
  46. "y": 56,
  47. "width": 7,
  48. "height": 16
  49. },
  50. {
  51. "icon": "woman",
  52. "x": 168,
  53. "y": 56,
  54. "width": 9,
  55. "height": 16
  56. },
  57. {
  58. "icon": "plant",
  59. "x": 168,
  60. "y": 32,
  61. "width": 16,
  62. "height": 16
  63. }
  64. ]
  65. }
  66. */
  67. bool draw_json_world(Level *level, FuriString *json_data)
  68. {
  69. for (int i = 0; i < MAX_WORLD_OBJECTS; i++)
  70. {
  71. char *data = get_json_array_value("json_data", i, (char *)furi_string_get_cstr(json_data), MAX_WORLD_TOKENS);
  72. if (data == NULL)
  73. {
  74. break;
  75. }
  76. char *icon = get_json_value("icon", data, 64);
  77. char *x = get_json_value("x", data, 64);
  78. char *y = get_json_value("y", data, 64);
  79. char *width = get_json_value("width", data, 64);
  80. char *height = get_json_value("height", data, 64);
  81. if (icon == NULL || x == NULL || y == NULL || width == NULL || height == NULL)
  82. {
  83. return false;
  84. }
  85. spawn_icon(level, get_icon(icon), atoi(x), atoi(y), atoi(width), atoi(height));
  86. }
  87. return true;
  88. }
  89. void draw_tree_world(Level *level)
  90. {
  91. // Spawn two full left/up tree lines
  92. for (int i = 0; i < 2; i++)
  93. {
  94. for (int j = 0; j < 22; j++)
  95. {
  96. spawn_icon(level, &I_icon_tree, 5 + j * 17, 2 + i * 17, 16, 16); // Horizontal lines
  97. }
  98. for (int j = 0; j < 11; j++)
  99. {
  100. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + j * 17, 16, 16); // Vertical lines
  101. }
  102. }
  103. // Spawn two full down tree lines
  104. for (int i = 9; i < 11; i++)
  105. {
  106. for (int j = 0; j < 22; j++)
  107. {
  108. spawn_icon(level, &I_icon_tree, 5 + j * 17, 2 + i * 17, 16, 16); // Horizontal lines
  109. }
  110. }
  111. // Spawn two full right tree lines
  112. for (int i = 20; i < 22; i++)
  113. {
  114. for (int j = 0; j < 8; j++)
  115. {
  116. spawn_icon(level, &I_icon_tree, 5 + i * 17, 50 + j * 17, 16, 16); // Vertical lines
  117. }
  118. }
  119. // Spawn labyrinth lines
  120. // Third line (14 left, 3 middle, 0 right) - exit line
  121. for (int i = 0; i < 14; i++)
  122. {
  123. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 2 * 17, 16, 16);
  124. }
  125. for (int i = 0; i < 3; i++)
  126. {
  127. spawn_icon(level, &I_icon_tree, 5 + 16 * 17 + i * 17, 2 + 2 * 17, 16, 16);
  128. }
  129. // Fourth line (3 left, 6 middle, 4 right)
  130. for (int i = 0; i < 3; i++)
  131. {
  132. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 3 * 17, 16, 16); // 3 left
  133. }
  134. for (int i = 0; i < 6; i++)
  135. {
  136. spawn_icon(level, &I_icon_tree, 5 + 7 * 17 + i * 17, 2 + 3 * 17, 16, 16); // 6 middle
  137. }
  138. for (int i = 0; i < 4; i++)
  139. {
  140. spawn_icon(level, &I_icon_tree, 5 + 15 * 17 + i * 17, 2 + 3 * 17, 16, 16); // 4 right
  141. }
  142. // Fifth line (6 left, 7 middle, 0 right)
  143. for (int i = 0; i < 6; i++)
  144. {
  145. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 4 * 17, 16, 16); // 6 left
  146. }
  147. for (int i = 0; i < 7; i++)
  148. {
  149. spawn_icon(level, &I_icon_tree, 5 + 7 * 17 + i * 17, 2 + 4 * 17, 16, 16); // 7 middle
  150. }
  151. // Sixth line (5 left, 6 middle, 7 right)
  152. for (int i = 0; i < 5; i++)
  153. {
  154. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 5 * 17, 16, 16); // 5 left
  155. }
  156. for (int i = 0; i < 3; i++)
  157. {
  158. spawn_icon(level, &I_icon_tree, 5 + 7 * 17 + i * 17, 2 + 5 * 17, 16, 16); // 3 middle
  159. }
  160. for (int i = 0; i < 7; i++)
  161. {
  162. spawn_icon(level, &I_icon_tree, 5 + 15 * 17 + i * 17, 2 + 5 * 17, 16, 16); // 7 right
  163. }
  164. // Seventh line (0 left, 7 middle, 4 right)
  165. for (int i = 0; i < 7; i++)
  166. {
  167. spawn_icon(level, &I_icon_tree, 5 + 6 * 17 + i * 17, 2 + 6 * 17, 16, 16); // 7 middle
  168. }
  169. for (int i = 0; i < 4; i++)
  170. {
  171. spawn_icon(level, &I_icon_tree, 5 + 14 * 17 + i * 17, 2 + 6 * 17, 16, 16); // 4 right
  172. }
  173. // Eighth line (4 left, 3 middle, 4 right)
  174. for (int i = 0; i < 4; i++)
  175. {
  176. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 7 * 17, 16, 16); // 4 left
  177. }
  178. for (int i = 0; i < 3; i++)
  179. {
  180. spawn_icon(level, &I_icon_tree, 5 + 7 * 17 + i * 17, 2 + 7 * 17, 16, 16); // 3 middle
  181. }
  182. for (int i = 0; i < 4; i++)
  183. {
  184. spawn_icon(level, &I_icon_tree, 5 + 15 * 17 + i * 17, 2 + 7 * 17, 16, 16); // 4 right
  185. }
  186. // Ninth line (3 left, 2 middle, 3 right)
  187. for (int i = 0; i < 3; i++)
  188. {
  189. spawn_icon(level, &I_icon_tree, 5 + i * 17, 2 + 8 * 17, 16, 16); // 3 left
  190. }
  191. for (int i = 0; i < 1; i++) // 2 middle
  192. {
  193. spawn_icon(level, &I_icon_tree, 5 + 5 * 17 + i * 17, 2 + 8 * 17, 16, 16);
  194. }
  195. for (int i = 0; i < 3; i++)
  196. {
  197. spawn_icon(level, &I_icon_tree, 5 + 11 * 17 + i * 17, 2 + 8 * 17, 16, 16); // 3 right
  198. }
  199. }