StateMap.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #include "StateMap.h"
  2. #include "Graphics.h"
  3. #include "render/Text.h"
  4. #include "piaf/Archive.h"
  5. using WalrusRPG::States::StateMap;
  6. using namespace WalrusRPG;
  7. using namespace WalrusRPG::Graphics;
  8. using WalrusRPG::Utils::Rect;
  9. using WalrusRPG::PIAF::Archive;
  10. using WalrusRPG::PIAF::File;
  11. using WalrusRPG::Graphics::Texture;
  12. namespace
  13. {
  14. // x, y, width, height, xoffset, yoffset
  15. const int16_t haeccity[][6] = {
  16. ///*32*/{0, 0, 0, 0},
  17. /*33*/ {0, 0, 1, 6, 0, 3},
  18. /*34*/ {1, 0, 3, 2, 0, 3},
  19. /*35*/ {4, 0, 5, 5, 0, 3},
  20. /*36*/ {9, 0, 5, 7, 0, 3},
  21. /*37*/ {0, 6, 8, 6, 0, 3},
  22. /*38*/ {14, 0, 5, 6, 0, 3},
  23. /*39*/ {1, 2, 1, 2, 0, 3},
  24. /*40*/ {19, 0, 2, 8, 0, 2},
  25. /*41*/ {8, 7, 2, 8, 0, 2},
  26. /*42*/ {0, 12, 5, 5, 0, 2},
  27. /*43*/ {5, 12, 3, 3, 0, 5},
  28. /*44*/ {1, 4, 2, 2, 0, 8},
  29. /*45*/ {2, 2, 2, 2, 0, 5},
  30. /*46*/ {8, 5, 1, 1, 0, 8},
  31. /*47*/ {10, 7, 3, 7, 0, 3},
  32. /*48*/ {13, 7, 4, 6, 0, 3},
  33. /*49*/ {17, 6, 2, 6, 0, 3},
  34. /*50*/ {21, 0, 4, 6, 0, 3},
  35. /*51*/ {25, 0, 3, 6, 0, 3},
  36. /*52*/ {28, 0, 5, 6, 0, 3},
  37. /*53*/ {33, 0, 3, 6, 0, 3},
  38. /*54*/ {36, 0, 4, 6, 0, 3},
  39. /*55*/ {40, 0, 3, 6, 0, 3},
  40. /*56*/ {43, 0, 4, 6, 0, 3},
  41. /*57*/ {47, 0, 4, 6, 0, 3},
  42. /*58*/ {51, 0, 1, 5, 0, 4},
  43. /*59*/ {52, 0, 2, 6, 0, 4},
  44. /*60*/ {54, 0, 3, 5, 0, 4},
  45. /*61*/ {57, 0, 3, 3, 0, 5},
  46. /*62*/ {60, 0, 3, 5, 0, 4},
  47. /*63*/ {57, 3, 3, 6, 0, 3},
  48. /*64*/ {19, 8, 5, 6, 0, 3},
  49. /*65*/ {13, 13, 4, 6, 0, 3},
  50. /*66*/ {0, 17, 4, 6, 0, 3},
  51. /*67*/ {4, 17, 4, 6, 0, 3},
  52. /*68*/ {8, 15, 4, 6, 0, 3},
  53. /*69*/ {24, 6, 3, 6, 0, 3},
  54. /*70*/ {27, 6, 3, 6, 0, 3},
  55. /*71*/ {30, 6, 4, 6, 0, 3},
  56. /*72*/ {34, 6, 4, 6, 0, 3},
  57. /*73*/ {12, 14, 1, 6, 0, 3},
  58. /*74*/ {38, 6, 3, 7, 0, 3},
  59. /*75*/ {24, 12, 4, 6, 0, 3},
  60. /*76*/ {17, 14, 3, 6, 0, 3},
  61. /*77*/ {28, 12, 5, 6, 0, 3},
  62. /*78*/ {13, 19, 4, 6, 0, 3},
  63. /*79*/ {0, 23, 4, 6, 0, 3},
  64. /*80*/ {4, 23, 4, 6, 0, 3},
  65. /*81*/ {8, 21, 5, 7, 0, 3},
  66. /*82*/ {20, 14, 4, 6, 0, 3},
  67. /*83*/ {33, 12, 4, 6, 0, 3},
  68. /*84*/ {41, 6, 3, 6, 0, 3},
  69. /*85*/ {44, 6, 4, 6, 0, 3},
  70. /*86*/ {48, 6, 5, 6, 0, 3},
  71. /*87*/ {63, 0, 5, 6, 0, 3},
  72. /*88*/ {68, 0, 5, 6, 0, 3},
  73. /*89*/ {73, 0, 5, 6, 0, 3},
  74. /*90*/ {53, 6, 4, 6, 0, 3},
  75. /*91*/ {60, 5, 2, 8, 0, 2},
  76. /*92*/ {41, 12, 3, 7, 0, 3},
  77. /*93*/ {24, 18, 2, 8, 0, 2},
  78. /*94*/ {13, 25, 5, 3, 0, 2},
  79. /*95*/ {3, 5, 4, 1, 0, 10},
  80. /*96*/ {17, 12, 2, 2, 1, 1},
  81. /*97*/ {17, 20, 4, 5, 0, 4},
  82. /*98*/ {18, 25, 4, 7, 0, 2},
  83. /*99*/ {21, 20, 3, 5, 0, 4},
  84. /*100*/ {0, 29, 4, 7, 0, 2},
  85. /*101*/ {4, 29, 4, 5, 0, 4},
  86. /*102*/ {8, 28, 4, 8, 0, 2},
  87. /*103*/ {4, 34, 4, 6, 0, 4},
  88. /*104*/ {0, 36, 4, 7, 0, 2},
  89. /*105*/ {12, 28, 1, 7, 0, 2},
  90. /*106*/ {13, 28, 2, 8, 0, 2},
  91. /*107*/ {26, 18, 4, 7, 0, 2},
  92. /*108*/ {15, 28, 2, 7, 0, 2},
  93. /*109*/ {30, 18, 5, 5, 0, 4},
  94. /*110*/ {35, 18, 4, 5, 0, 4},
  95. /*111*/ {37, 13, 4, 5, 0, 4},
  96. /*112*/ {44, 12, 4, 6, 0, 4},
  97. /*113*/ {48, 12, 4, 6, 0, 4},
  98. /*114*/ {52, 12, 3, 5, 0, 4},
  99. /*115*/ {55, 12, 4, 5, 0, 4},
  100. /*116*/ {78, 0, 3, 6, 0, 3},
  101. /*117*/ {81, 0, 4, 5, 0, 4},
  102. /*118*/ {85, 0, 3, 5, 0, 4},
  103. /*119*/ {88, 0, 5, 5, 0, 4},
  104. /*120*/ {93, 0, 3, 5, 0, 4},
  105. /*121*/ {96, 0, 4, 6, 0, 4},
  106. /*122*/ {81, 5, 3, 5, 0, 4},
  107. /*123*/ {62, 6, 3, 8, 0, 2},
  108. /*124*/ {12, 35, 1, 7, 0, 3},
  109. /*125*/ {4, 40, 3, 8, 0, 2},
  110. /*126*/ {7, 40, 5, 2, 0, 5},
  111. /*127*/ {65, 6, 5, 5, 0, 4},
  112. /*uncovered by littera for now*/
  113. {0, 0, 0, 0, 0, 0},
  114. {0, 0, 0, 0, 0, 0},
  115. {0, 0, 0, 0, 0, 0},
  116. {0, 0, 0, 0, 0, 0},
  117. {0, 0, 0, 0, 0, 0},
  118. {0, 0, 0, 0, 0, 0},
  119. {0, 0, 0, 0, 0, 0},
  120. {0, 0, 0, 0, 0, 0},
  121. {0, 0, 0, 0, 0, 0},
  122. {0, 0, 0, 0, 0, 0},
  123. {0, 0, 0, 0, 0, 0},
  124. {0, 0, 0, 0, 0, 0},
  125. /*338*/ {22, 26, 6, 6, 0, 3},
  126. {0, 0, 0, 0, 0, 0},
  127. {0, 0, 0, 0, 0, 0},
  128. {0, 0, 0, 0, 0, 0},
  129. {0, 0, 0, 0, 0, 0},
  130. {0, 0, 0, 0, 0, 0},
  131. {0, 0, 0, 0, 0, 0},
  132. {0, 0, 0, 0, 0, 0},
  133. {0, 0, 0, 0, 0, 0},
  134. {0, 0, 0, 0, 0, 0},
  135. {0, 0, 0, 0, 0, 0},
  136. {0, 0, 0, 0, 0, 0},
  137. {0, 0, 0, 0, 0, 0},
  138. {0, 0, 0, 0, 0, 0},
  139. {0, 0, 0, 0, 0, 0},
  140. {0, 0, 0, 0, 0, 0},
  141. /*339*/ {32, 25, 6, 5, 0, 4},
  142. {0, 0, 0, 0, 0, 0},
  143. {0, 0, 0, 0, 0, 0},
  144. {7, 42, 5, 8, 0, 1},
  145. {0, 0, 0, 0, 0, 0},
  146. /*161*/ {0, 48, 1, 6, 0, 4},
  147. /*162*/ {1, 48, 4, 7, 0, 3},
  148. /*163*/ {32, 30, 4, 6, 0, 3},
  149. /*164*/ {21, 35, 6, 4, 0, 3},
  150. /*165*/ {27, 34, 5, 6, 0, 3},
  151. /*166*/ {0, 54, 1, 7, 0, 3},
  152. /*167*/ {21, 39, 3, 7, 0, 3},
  153. /*168*/ {14, 6, 3, 1, 1, 2},
  154. /*169*/ {36, 30, 6, 7, 0, 2},
  155. /*170*/ {38, 25, 4, 5, 0, 2},
  156. /*171*/ {16, 42, 5, 3, 0, 5},
  157. /*172*/ {35, 23, 4, 2, 0, 5},
  158. /*173*/ {15, 35, 2, 2, 0, 5},
  159. /*174*/ {84, 5, 7, 8, 0, 2},
  160. /*175*/ {54, 5, 3, 1, 0, 2},
  161. /*176*/ {16, 45, 3, 3, 0, 2},
  162. /*177*/ {12, 47, 3, 5, 0, 4},
  163. /*178*/ {5, 50, 2, 4, 0, 3},
  164. /*179*/ {7, 50, 2, 4, 0, 3},
  165. /*180*/ {15, 37, 2, 2, 1, 1},
  166. /*181*/ {75, 10, 5, 6, 0, 4},
  167. /*182*/ {32, 36, 4, 7, 0, 3},
  168. /*183*/ {8, 6, 1, 1, 0, 6},
  169. /*184*/ {5, 48, 2, 2, 1, 9},
  170. /*185*/ {75, 6, 2, 4, 0, 3},
  171. /*186*/ {24, 40, 4, 5, 0, 2},
  172. /*187*/ {70, 13, 5, 3, 0, 5},
  173. /*188*/ {100, 0, 7, 6, 0, 3},
  174. /*189*/ {107, 0, 6, 6, 0, 3},
  175. /*190*/ {113, 0, 7, 6, 0, 3},
  176. /*191*/ {9, 50, 3, 6, 0, 4},
  177. /*192*/ {1, 55, 4, 9, 0, 0},
  178. /*193*/ {5, 54, 4, 9, 0, 0},
  179. /*194*/ {28, 40, 4, 9, 0, 0},
  180. /*195*/ {15, 48, 4, 9, 0, 0},
  181. /*196*/ {9, 56, 4, 8, 0, 1},
  182. /*197*/ {5, 63, 4, 9, 0, 0},
  183. /*198*/ {19, 46, 6, 6, 0, 3},
  184. /*199*/ {0, 64, 4, 8, 0, 3},
  185. /*200*/ {25, 45, 3, 9, 0, 0},
  186. /*201*/ {19, 52, 3, 9, 0, 0},
  187. /*202*/ {13, 57, 3, 9, 0, 0},
  188. /*203*/ {9, 64, 3, 8, 0, 1},
  189. /*204*/ {16, 57, 2, 9, 0, 0},
  190. /*205*/ {22, 52, 2, 9, 0, 0},
  191. /*206*/ {46, 23, 3, 9, -1, 0},
  192. /*207*/ {61, 18, 3, 8, -1, 1},
  193. /*208*/ {49, 24, 5, 6, 0, 3},
  194. /*209*/ {54, 24, 4, 9, 0, 0},
  195. /*210*/ {42, 32, 4, 9, 0, 0},
  196. /*211*/ {36, 37, 4, 9, 0, 0},
  197. /*212*/ {32, 43, 4, 9, 0, 0},
  198. /*213*/ {28, 49, 4, 9, 0, 0},
  199. /*214*/ {24, 54, 4, 8, 0, 1},
  200. /*215*/ {12, 52, 3, 3, 0, 5},
  201. /*216*/ {18, 61, 4, 6, 0, 3},
  202. /*217*/ {12, 66, 4, 9, 0, 0},
  203. /*218*/ {0, 72, 4, 9, 0, 0},
  204. /*219*/ {4, 72, 4, 9, 0, 0},
  205. /*220*/ {8, 72, 4, 8, 0, 1},
  206. /*221*/ {46, 32, 5, 9, 0, 0},
  207. /*222*/ {80, 10, 4, 6, 0, 3},
  208. /*223*/ {91, 5, 4, 6, 0, 3},
  209. /*224*/ {120, 0, 4, 8, 0, 1},
  210. /*225*/ {95, 6, 4, 8, 0, 1},
  211. /*226*/ {84, 13, 4, 8, 0, 1},
  212. /*227*/ {64, 19, 4, 8, 0, 1},
  213. /*228*/ {58, 26, 4, 7, 0, 2},
  214. /*229*/ {68, 19, 4, 8, 0, 1},
  215. /*230*/ {72, 16, 5, 5, 0, 4},
  216. /*231*/ {77, 16, 4, 7, 0, 4},
  217. /*232*/ {72, 21, 4, 8, 0, 1},
  218. /*233*/ {62, 27, 4, 8, 0, 1},
  219. /*234*/ {51, 33, 4, 8, 0, 1},
  220. /*235*/ {55, 33, 4, 7, 0, 2},
  221. /*236*/ {16, 66, 2, 8, 0, 1},
  222. /*237*/ {22, 61, 2, 8, 0, 1},
  223. /*238*/ {18, 67, 3, 8, -1, 1},
  224. /*239*/ {59, 33, 3, 7, -1, 2},
  225. /*240*/ {66, 27, 4, 7, 0, 2},
  226. /*241*/ {88, 13, 4, 8, 0, 1},
  227. /*242*/ {99, 6, 4, 8, 0, 1},
  228. /*243*/ {103, 6, 4, 8, 0, 1},
  229. /*244*/ {107, 6, 4, 8, 0, 1},
  230. /*245*/ {111, 6, 4, 8, 0, 1},
  231. /*246*/ {115, 6, 4, 7, 0, 2},
  232. /*247*/ {81, 16, 3, 5, 0, 4},
  233. /*248*/ {124, 0, 4, 5, 0, 4},
  234. /*249*/ {128, 0, 4, 8, 0, 1},
  235. /*250*/ {124, 5, 4, 8, 0, 1},
  236. /*251*/ {119, 8, 4, 8, 0, 1},
  237. /*252*/ {92, 14, 4, 7, 0, 2},
  238. /*253*/ {96, 14, 4, 9, 0, 1},
  239. /*254*/ {81, 21, 3, 8, 0, 2},
  240. /*255*/ {76, 23, 4, 8, 0, 2}};
  241. const int8_t haeccity_kernings[][3] = {
  242. {66, 74, -1}, {67, 74, -1}, {68, 74, -1}, {70, 44, -2}, {70, 46, -1},
  243. {70, 59, -1}, {70, 74, -2}, {71, 74, -1}, {76, 34, -1}, {76, 39, -1},
  244. {76, 84, -1}, {76, 86, -1}, {76, 87, -1}, {76, 89, -1}, {76, 121, -1},
  245. {79, 74, -1}, {80, 44, -2}, {80, 46, -1}, {80, 59, -1}, {80, 74, -1},
  246. {80, 88, -1}, {80, 97, -1}, {84, 44, -1}, {84, 46, -1}, {84, 59, -1},
  247. {84, 74, -1}, {84, 97, -1}, {86, 44, -2}, {86, 46, -1}, {86, 59, -1},
  248. {86, 74, -1}, {86, 97, -1}, {87, 59, -1}, {87, 74, -1}, {89, 44, -2},
  249. {89, 46, -1}, {89, 59, -1}, {89, 74, -1}, {98, 44, -1}, {98, 106, -1},
  250. {101, 44, -1}, {101, 97, -1}, {101, 106, -1}, {102, 34, 1}, {102, 39, 1},
  251. {102, 44, -1}, {102, 97, -1}, {107, 97, -1}, {107, 102, -1}, {107, 103, -1},
  252. {107, 115, -1}, {107, 116, -1}, {107, 118, -1}, {107, 121, -1}, {108, 97, -1},
  253. {108, 102, -1}, {108, 103, -1}, {108, 115, -1}, {108, 116, -1}, {108, 121, -1},
  254. {111, 44, -1}, {111, 106, -1}, {112, 44, -1}, {112, 106, -1}, {114, 44, -2},
  255. {114, 46, -1}, {114, 97, -1}, {114, 100, -1}, {114, 106, -1}, {115, 44, -1},
  256. {115, 102, -1}, {115, 106, -1}, {115, 116, -1}, {118, 44, -1}, {118, 106, -1},
  257. {119, 44, -1}, {119, 106, -1},
  258. };
  259. void print_debug_camera_data(const Camera &camera)
  260. {
  261. Text::print_format(0, 8, "CAM : X : %d Y: %d", camera.get_x(), camera.get_y());
  262. }
  263. void print_debug_map_data(const Map &map)
  264. {
  265. Text::print_format(0, 16, "MAP : W: %d, H:%d", map.get_width(), map.get_height());
  266. }
  267. }
  268. void StateMap::putchar_haeccity(unsigned char c, unsigned x, unsigned y)
  269. {
  270. if (c <= 32)
  271. return;
  272. c -= 33;
  273. Rect letter{haeccity[c][0], haeccity[c][1], haeccity[c][2], haeccity[c][3]};
  274. put_sprite(tex_haeccity, x + haeccity[c][4], y + haeccity[c][5], letter);
  275. }
  276. void StateMap::putchar_haeccity_tint(unsigned char c, unsigned x, unsigned y,
  277. const Pixel &col)
  278. {
  279. if (c <= 32)
  280. return;
  281. c -= 33;
  282. Rect letter{haeccity[c][0], haeccity[c][1], haeccity[c][2], haeccity[c][3]};
  283. put_sprite_tint(tex_haeccity, x + haeccity[c][4], y + haeccity[c][5], letter, col);
  284. }
  285. void StateMap::print_haeccity(const char *str, unsigned x, unsigned y,
  286. const Pixel &col = White)
  287. {
  288. const bool must_tint = (col != White);
  289. for (unsigned i = 0; str[i] && x < 320; i++)
  290. {
  291. unsigned char c = str[i];
  292. if (c < 32)
  293. continue;
  294. if (c == 32)
  295. {
  296. x += 2;
  297. continue;
  298. }
  299. // printf("%c = %d\n", c, c);
  300. if (must_tint)
  301. putchar_haeccity_tint(c, x, y, col);
  302. else
  303. putchar_haeccity(c, x, y);
  304. x += haeccity[c - 33][2] + 1;
  305. }
  306. }
  307. StateMap::StateMap(int x, int y, Map &map)
  308. : camera(x, y), map(map), arc_haeccity("data/haeccity.wrf"),
  309. tex_haeccity(arc_haeccity.get("haeccity"))
  310. {
  311. }
  312. void StateMap::update(unsigned dt)
  313. {
  314. camera.update(dt);
  315. }
  316. void StateMap::render(unsigned dt)
  317. {
  318. // fill(Black);
  319. map.render(camera, dt);
  320. // print_debug_camera_data(camera);
  321. // print_debug_map_data(map);
  322. print_haeccity("Hello world! :D", 0, 0);
  323. print_haeccity("This isn't actually a utility nor built-ins functions.", 0, 9);
  324. print_haeccity("This is a quick prototype to see if variable-wdith fonts works.", 0,
  325. 18);
  326. print_haeccity("Builting it myself allows me to make it work on calc too.", 0, 27,
  327. Yellow);
  328. print_haeccity(
  329. "( I wonder if a conditionnal to tint the text slows down a lot the process. )",
  330. 0, 36, Gray);
  331. print_haeccity("Oh well, I hope I'll get to do a pretty textbox like in games !", 0,
  332. 45);
  333. for (int i = 0; i < 16; ++i)
  334. {
  335. for (int j = 0; j < 16; ++j)
  336. {
  337. putchar_haeccity_tint(16 * j + i + 32, 6 * i, 9 * j + 54,
  338. Pixel(i * 16, j * 16, 255));
  339. }
  340. }
  341. }