diff options
Diffstat (limited to 'utils/json2rostertbl.c')
-rw-r--r-- | utils/json2rostertbl.c | 184 |
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"); +} |