summaryrefslogtreecommitdiff
path: root/utils/json2rostertbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/json2rostertbl.c')
-rw-r--r--utils/json2rostertbl.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/utils/json2rostertbl.c b/utils/json2rostertbl.c
new file mode 100644
index 0000000..6b31cef
--- /dev/null
+++ b/utils/json2rostertbl.c
@@ -0,0 +1,184 @@
+#include <err.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <json_tokener.h>
+#include <json_util.h>
+
+#include "constants.h"
+
+void printpokemon(struct json_object *);
+
+void
+required8int(struct json_object *k, struct json_object *l, const char *s)
+{
+ if (!json_object_object_get_ex(k, s, &l)) {
+ errx(1, "Needs a '%s'!", s);
+ }
+ fputc(json_object_get_int(l), stdout);
+}
+
+void
+required8id(struct json_object *k, struct json_object *l, const char *s,
+ int (*f)(const char *))
+{
+ if (!json_object_object_get_ex(k, s, &l)) {
+ errx(1, "Needs a '%s'!", s);
+ }
+ fputc(f(json_object_get_string(l)), stdout);
+}
+
+void
+optional8id(struct json_object *k, struct json_object *l, const char *s,
+ int (*f)(const char *))
+{
+ if (!json_object_object_get_ex(k, s, &l)) {
+ fputc(0, stdout);
+ } else {
+ fputc(f(json_object_get_string(l)), stdout);
+ }
+}
+
+void
+optional8strint(struct json_object *k, struct json_object *l, const char *s)
+{
+ if (!json_object_object_get_ex(k, s, &l)) {
+ fputc(0, stdout);
+ } else {
+ char *ep;
+ unsigned long x;
+ x = strtoul(json_object_get_string(l), &ep, 0);
+ if (json_object_get_string(l)[0] == '\0' || *ep != '\0') {
+ errx(1, "invalid number for '%s'", s);
+ }
+ if (errno == ERANGE && x == ULONG_MAX) {
+ errx(1, "invalid number for '%s'", s);
+ }
+ fputc(x, stdout);
+ }
+}
+
+void
+required16strint(struct json_object *k, struct json_object *l, const char *s)
+{
+ if (!json_object_object_get_ex(k, s, &l)) {
+ errx(1, "Needs a '%s'!", s);
+ } else {
+ char *ep;
+ unsigned long x;
+ x = strtoul(json_object_get_string(l), &ep, 0);
+ if (json_object_get_string(l)[0] == '\0' || *ep != '\0') {
+ errx(1, "invalid number for '%s'", s);
+ }
+ if (errno == ERANGE && x == ULONG_MAX) {
+ errx(1, "invalid number for '%s'", s);
+ }
+ fputc(x >> 8, stdout);
+ fputc(x & 0xff, stdout);
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct json_object *j, *k, *l;
+ int len, i;
+
+ if (argc != 2) {
+ errx(1, "usage: json2rostertbl file");
+ }
+
+ j = json_object_from_file(argv[1]);
+
+ len = json_object_array_length(j);
+
+ if (len > 50) {
+ /* rentals */
+ fputc(len, stdout);
+ fputc(0, stdout);
+ fputc(0, stdout);
+ fputc(0, stdout);
+ for (i = 0; i < len; ++i) {
+ printpokemon(json_object_array_get_idx(j, i));
+ }
+ } else {
+ /* rosters */
+ fputc(len, stdout);
+ fputc(0, stdout);
+ fputc(0, stdout);
+ fputc(0, stdout);
+ for (i = 0; i < len; ++i) {
+ k = json_object_array_get_idx(j, i);
+ required8id(k, l, "group", strtogroup);
+ required8id(k, l, "trainer", strtotrainer);
+ optional8strint(k, l, "unknown1");
+ required8id(k, l, "text", strtotext);
+
+ if (!json_object_object_get_ex(k, "pokemon", &l)) {
+ errx(1, "Needs a pokemon!");
+ }
+ fputc(json_object_array_length(l), stdout);
+
+ struct json_object *m;
+ optional8strint(k, m, "unknown3");
+ optional8strint(k, m, "unknown4");
+ optional8strint(k, m, "unknown5");
+
+ int z;
+ struct json_object *o;
+ for (z = 0; z < json_object_array_length(l); ++z) {
+ printpokemon(json_object_array_get_idx(l, z));
+ }
+ while (z++ < 6) {
+ /*
+ * XXX should create a json string for generic
+ * pokemon, parse it here, and pass it to
+ * printpokemon()
+ */
+ fputc(1, stdout);
+ fputc(1, stdout);
+ int A;
+ for (A = 0; A < 7; ++A) {
+ fputc(0, stdout);
+ }
+ fputc(0x7f, stdout);
+ for (A = 0; A < 10; ++A) {
+ fputc(0, stdout);
+ }
+ fputc(0x67, stdout);
+ fputc(0x77, stdout);
+ fputc(0, stdout);
+ fputc(0, stdout);
+ }
+ }
+ }
+
+ return 0;
+}
+
+void
+printpokemon(struct json_object *k)
+{
+ struct json_object *l;
+ required8int(k, l, "level");
+ required8id(k, l, "species", strtopokemon);
+ optional8id(k, l, "item", strtoitem);
+ optional8strint(k, l, "unknown1");
+ required8id(k, l, "move1", strtomove);
+ optional8id(k, l, "move2", strtomove);
+ optional8id(k, l, "move3", strtomove);
+ optional8id(k, l, "move4", strtomove);
+ optional8strint(k, l, "unknown2");
+ optional8strint(k, l, "unknown3");
+ required16strint(k, l, "hp exp");
+ required16strint(k, l, "attack exp");
+ required16strint(k, l, "defense exp");
+ required16strint(k, l, "speed exp");
+ required16strint(k, l, "special exp");
+ required16strint(k, l, "dvs");
+ optional8strint(k, l, "unknown4");
+ optional8strint(k, l, "unknown5");
+}