pokemon_data.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #ifndef POKEMON_DATA_H
  2. #define POKEMON_DATA_H
  3. #pragma once
  4. /* NOTE: These map to the Gen 1 character set! */
  5. /* TODO: It may make more sense to put this in a const array as a LUT,
  6. * e.g. t['F'], t['l'], t['i'], t['p'], t['e'], t['r'], t['\0']
  7. * As this could be an easier translation for each letter to build a string
  8. * to set names and things on the fly in the flipper. Need to explore that.
  9. * once I get to that point.
  10. */
  11. #define TERM_ 0x50
  12. #define SPACE_ 0x7f
  13. #define A_ 0x80
  14. #define B_ 0x81
  15. #define C_ 0x82
  16. #define D_ 0x83
  17. #define E_ 0x84
  18. #define F_ 0x85
  19. #define G_ 0x86
  20. #define H_ 0x87
  21. #define I_ 0x88
  22. #define J_ 0x89
  23. #define K_ 0x8a
  24. #define L_ 0x8b
  25. #define M_ 0x8c
  26. #define N_ 0x8d
  27. #define O_ 0x8e
  28. #define P_ 0x8f
  29. #define Q_ 0x90
  30. #define R_ 0x91
  31. #define S_ 0x92
  32. #define T_ 0x93
  33. #define U_ 0x94
  34. #define V_ 0x95
  35. #define W_ 0x96
  36. #define X_ 0x97
  37. #define Y_ 0x98
  38. #define Z_ 0x99
  39. #define O_PAREN_ 0x9a
  40. #define C_PAREN_ 0x9b
  41. #define COLON_ 0x9c
  42. #define SEMI_ 0x9d
  43. #define O_BRACKET_ 0x9e
  44. #define C_BRACKET_ 0x9f
  45. #define a_ 0xa0
  46. #define b_ 0xa1
  47. #define c_ 0xa2
  48. #define d_ 0xa3
  49. #define e_ 0xa4
  50. #define f_ 0xa5
  51. #define g_ 0xa6
  52. #define h_ 0xa7
  53. #define i_ 0xa8
  54. #define j_ 0xa9
  55. #define k_ 0xaa
  56. #define l_ 0xab
  57. #define m_ 0xac
  58. #define n_ 0xad
  59. #define o_ 0xae
  60. #define p_ 0xaf
  61. #define q_ 0xb0
  62. #define r_ 0xb1
  63. #define s_ 0xb2
  64. #define t_ 0xb3
  65. #define u_ 0xb4
  66. #define v_ 0xb5
  67. #define w_ 0xb6
  68. #define x_ 0xb7
  69. #define y_ 0xb8
  70. #define z_ 0xb9
  71. #define e_ACCENT_ 0xba
  72. #define d_TICK_ 0xbb
  73. #define l_TICK_ 0xbc
  74. #define s_TICK_ 0xbd
  75. #define t_TICK_ 0xbe
  76. #define v_TICK_ 0xbf
  77. #define S_QUOTE_ 0xe0
  78. #define PK_ 0xe1
  79. #define MN_ 0xe2
  80. #define DASH_ 0xe3
  81. #define r_TICK_ 0xe4
  82. #define m_TICK_ 0xe5
  83. #define QUESTION_ 0xe6
  84. #define EXCLAIM_ 0xe7
  85. #define PERIOD_ 0xe8
  86. #define R_ARR_ 0xec
  87. #define D_ARR_ 0xee
  88. #define MALE_ 0xef
  89. #define FEMALE_ 0xf5
  90. #define _0_ 0xf6
  91. #define _1_ 0xf7
  92. #define _2_ 0xf8
  93. #define _3_ 0xf9
  94. #define _4_ 0xfa
  95. #define _5_ 0xfb
  96. #define _6_ 0xfc
  97. #define _7_ 0xfd
  98. #define _8_ 0xfe
  99. #define _9_ 0xff
  100. /* XXX: These are all opposite endianness on the flipper than they are in the
  101. * GB/Z80. e.g. a uint16_t value of 0x2c01 translates to 0x012c. Does flipper
  102. * API have calls to swap endianness?
  103. */
  104. struct __attribute__((__packed__)) pokemon_structure {
  105. uint8_t species;
  106. uint16_t hp;
  107. uint8_t level;
  108. uint8_t status_condition;
  109. uint8_t type[2];
  110. uint8_t catch_held;
  111. uint8_t move[4];
  112. uint16_t orig_trainer;
  113. uint8_t exp[3];
  114. uint16_t hp_ev;
  115. uint16_t atk_ev;
  116. uint16_t def_ev;
  117. uint16_t spd_ev;
  118. uint16_t special_ev;
  119. uint16_t iv;
  120. uint8_t move_pp[4];
  121. uint8_t level_again;
  122. uint16_t max_hp;
  123. uint16_t atk;
  124. uint16_t def;
  125. uint16_t spd;
  126. uint16_t special;
  127. };
  128. struct __attribute__((__packed__)) name {
  129. unsigned char str[11];
  130. };
  131. struct __attribute__((__packed__)) trade_data_block {
  132. unsigned char trainer_name[11];
  133. uint8_t party_cnt;
  134. uint8_t party_members[7]; // Unsure if last byte always needs to be 0xff for terminator
  135. struct pokemon_structure party[6];
  136. struct name ot_name[6];
  137. struct name nickname[6];
  138. };
  139. struct trade_data_block DATA_BLOCK2 = {
  140. .trainer_name = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00, 0x00 },
  141. .party_cnt = 1,
  142. .party_members = { 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
  143. .party = {
  144. {
  145. .species = 0x4a,
  146. .hp = 0x2c01,
  147. .level = 0x4a,
  148. .status_condition = 0x0,
  149. .type = { 0x14, 0x08 },
  150. .catch_held = 0x1f,
  151. .move = { 0x7e, 0x38, 0x09, 0x19 },
  152. .orig_trainer = 0xd204,
  153. .exp = { 0x3, 0xd, 0x40 },
  154. .hp_ev = 0xffff,
  155. .atk_ev = 0xffff,
  156. .def_ev = 0xffff,
  157. .spd_ev = 0xffff,
  158. .special_ev = 0xffff,
  159. .iv = 0xffff,
  160. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  161. .level_again = 0x4a,
  162. .max_hp = 0x2c01,
  163. .atk = 0x9600,
  164. .def = 0x9700,
  165. .spd = 0x9800,
  166. .special = 0x9900
  167. },
  168. {
  169. .species = 0x4a,
  170. .hp = 0x2c01,
  171. .level = 0x4a,
  172. .status_condition = 0x0,
  173. .type = { 0x14, 0x08 },
  174. .catch_held = 0x1f,
  175. .move = { 0x7e, 0x38, 0x09, 0x19 },
  176. .orig_trainer = 0xd204,
  177. .exp = { 0x3, 0xd, 0x40 },
  178. .hp_ev = 0xffff,
  179. .atk_ev = 0xffff,
  180. .def_ev = 0xffff,
  181. .spd_ev = 0xffff,
  182. .special_ev = 0xffff,
  183. .iv = 0xffff,
  184. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  185. .level_again = 0x4a,
  186. .max_hp = 0x2c01,
  187. .atk = 0x9600,
  188. .def = 0x9700,
  189. .spd = 0x9800,
  190. .special = 0x9900
  191. },
  192. {
  193. .species = 0x4a,
  194. .hp = 0x2c01,
  195. .level = 0x4a,
  196. .status_condition = 0x0,
  197. .type = { 0x14, 0x08 },
  198. .catch_held = 0x1f,
  199. .move = { 0x7e, 0x38, 0x09, 0x19 },
  200. .orig_trainer = 0xd204,
  201. .exp = { 0x3, 0xd, 0x40 },
  202. .hp_ev = 0xffff,
  203. .atk_ev = 0xffff,
  204. .def_ev = 0xffff,
  205. .spd_ev = 0xffff,
  206. .special_ev = 0xffff,
  207. .iv = 0xffff,
  208. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  209. .level_again = 0x4a,
  210. .max_hp = 0x2c01,
  211. .atk = 0x9600,
  212. .def = 0x9700,
  213. .spd = 0x9800,
  214. .special = 0x9900
  215. },
  216. {
  217. .species = 0x4a,
  218. .hp = 0x2c01,
  219. .level = 0x4a,
  220. .status_condition = 0x0,
  221. .type = { 0x14, 0x08 },
  222. .catch_held = 0x1f,
  223. .move = { 0x7e, 0x38, 0x09, 0x19 },
  224. .orig_trainer = 0xd204,
  225. .exp = { 0x3, 0xd, 0x40 },
  226. .hp_ev = 0xffff,
  227. .atk_ev = 0xffff,
  228. .def_ev = 0xffff,
  229. .spd_ev = 0xffff,
  230. .special_ev = 0xffff,
  231. .iv = 0xffff,
  232. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  233. .level_again = 0x4a,
  234. .max_hp = 0x2c01,
  235. .atk = 0x9600,
  236. .def = 0x9700,
  237. .spd = 0x9800,
  238. .special = 0x9900
  239. },
  240. {
  241. .species = 0x4a,
  242. .hp = 0x2c01,
  243. .level = 0x4a,
  244. .status_condition = 0x0,
  245. .type = { 0x14, 0x08 },
  246. .catch_held = 0x1f,
  247. .move = { 0x7e, 0x38, 0x09, 0x19 },
  248. .orig_trainer = 0xd204,
  249. .exp = { 0x3, 0xd, 0x40 },
  250. .hp_ev = 0xffff,
  251. .atk_ev = 0xffff,
  252. .def_ev = 0xffff,
  253. .spd_ev = 0xffff,
  254. .special_ev = 0xffff,
  255. .iv = 0xffff,
  256. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  257. .level_again = 0x4a,
  258. .max_hp = 0x2c01,
  259. .atk = 0x9600,
  260. .def = 0x9700,
  261. .spd = 0x9800,
  262. .special = 0x9900
  263. },
  264. {
  265. .species = 0x4a,
  266. .hp = 0x2c01,
  267. .level = 0x4a,
  268. .status_condition = 0x0,
  269. .type = { 0x14, 0x08 },
  270. .catch_held = 0x1f,
  271. .move = { 0x7e, 0x38, 0x09, 0x19 },
  272. .orig_trainer = 0xd204,
  273. .exp = { 0x3, 0xd, 0x40 },
  274. .hp_ev = 0xffff,
  275. .atk_ev = 0xffff,
  276. .def_ev = 0xffff,
  277. .spd_ev = 0xffff,
  278. .special_ev = 0xffff,
  279. .iv = 0xffff,
  280. .move_pp = { 0xc0, 0xc0, 0xc0, 0xc0 },
  281. .level_again = 0x4a,
  282. .max_hp = 0x2c01,
  283. .atk = 0x9600,
  284. .def = 0x9700,
  285. .spd = 0x9800,
  286. .special = 0x9900
  287. },
  288. },
  289. /* NOTE: I think this shouldn't exceed 7 chars */
  290. .ot_name = {
  291. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  292. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  293. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  294. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  295. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  296. { .str = { F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  297. },
  298. .nickname = {
  299. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  300. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  301. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  302. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  303. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  304. { .str = { F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00 } },
  305. }
  306. };
  307. unsigned char INPUT_BLOCK[405];
  308. unsigned char *DATA_BLOCK = (unsigned char *)&DATA_BLOCK2;
  309. #endif /* POKEMON_DATA_H */