diff options
Diffstat (limited to 'tools/dungeonjson/dungeonjson.cpp')
-rw-r--r-- | tools/dungeonjson/dungeonjson.cpp | 241 |
1 files changed, 178 insertions, 63 deletions
diff --git a/tools/dungeonjson/dungeonjson.cpp b/tools/dungeonjson/dungeonjson.cpp index c1a4c81..cdcf0ba 100644 --- a/tools/dungeonjson/dungeonjson.cpp +++ b/tools/dungeonjson/dungeonjson.cpp @@ -29,6 +29,7 @@ using json11::Json; #include "dungeonjson.h" +const string TABLE_END = "@ END OF TABLE\n"; string read_text_file(string filepath) { ifstream in_file(filepath); @@ -283,7 +284,7 @@ string generate_pokemon_table_text(Json map_data) { } // Append null entry to end - text << "@ END OF TABLE" << "\n"; + text << TABLE_END; text << ".2byte " << "0x00, 0x00, 0x00, 0x00" << "\n"; } @@ -302,7 +303,7 @@ string generate_floorID_table_text(Json map_data) { text << ".2byte " << "0, 0, 0, 0, 0, 0, 0, 0" << "\n"; for (auto &table: map_data["tables"].array_items()) { - text << ".2byte " << table["MainData"].int_value() + text << ".2byte " << table["MainData"].int_value() << ", " << table["Pokemon"].int_value() << ", " << table["Traps"].int_value() << ", " << table["Items"].int_value() @@ -312,11 +313,157 @@ string generate_floorID_table_text(Json map_data) { << ", " << "0" << "\n"; } - text << "@ END OF TABLE" << "\n"; + text << TABLE_END; return text.str(); } +string get_start_bytes(int num_bytes) { + return num_bytes == 1 ? "\n.byte " : "\n." + std::to_string(num_bytes) + "byte "; +} + +string get_json_bool_value(Json data) { + return data.bool_value() ? "1" : "0"; +} + +string get_json_int_value(Json data) { + return std::to_string(data.int_value()); +} + +string get_json_string_value(Json data) { + return data.is_string() ? data.string_value() : "0"; +} + +string read_json(Json data, int num_bytes, string(*json_reader)(Json)) { + return get_start_bytes(num_bytes) + json_reader(data); +} + +string read_json_bool(Json data) { + return read_json(data, 1, get_json_bool_value); +} + +string read_json_int(Json data, int num_bytes) { + return read_json(data, num_bytes, get_json_int_value); +} + +string read_json_string(Json data, int num_bytes) { + return read_json(data, num_bytes, get_json_string_value); +} + +string read_json_array(Json data, int num_bytes, int expected_count, string(*json_reader)(Json)) { + ostringstream data_string; + bool first = true; + vector<Json> data_items = data.array_items(); + for (int i = 0; i < expected_count; i++) { + string item = i < data_items.size() ? json_reader(data_items[i]) : "0"; + + data_string << (first ? "" : ", ") << item; + first = false; + } + return get_start_bytes(num_bytes) + data_string.str(); +} + +string read_json_bool_array(Json data, int num_bytes, int expected_count) { + return read_json_array(data, num_bytes, expected_count, get_json_bool_value); +} + +string read_json_int_array(Json data, int num_bytes, int expected_count) { + return read_json_array(data, num_bytes, expected_count, get_json_int_value); +} + +string read_json_string_array(Json data, int num_bytes, int expected_count) { + return read_json_array(data, num_bytes, expected_count, get_json_string_value); +} + +string generate_species_data_text(Json data) { + ostringstream text; + + text << "@ This is auto-generated by species_data.json.\n"; + text << ".include \"include/constants/ability.h\"\n"; + text << ".include \"include/constants/evolve_type.h\"\n"; + text << ".include \"include/constants/friend_area.h\"\n"; + text << ".include \"include/constants/item.h\"\n"; + text << ".include \"include/constants/species.h\"\n"; + text << ".include \"include/constants/type.h\"\n"; + text << ".include \"include/constants/walkable_tile.h\"\n"; + text << ".global gSpeciesData\n"; + text << "gSpeciesData:"; + for (Json data_entry : data.array_items()) { + text << read_json_string(data_entry["species"], 4) + << read_json_string(data_entry["category"], 4) + << read_json_int(data_entry["overworld_palette"], 1) + << read_json_int(data_entry["size"], 1) + << "\n.2byte 0" + << read_json_int(data_entry["move_speed"], 4) + << read_json_int(data_entry["dialogue_sprites"], 2) + << read_json_bool(data_entry["unk12"]) + << read_json_string_array(data_entry["types"], 1, 2) + << read_json_string(data_entry["walkable_tiles"], 1) + << read_json_string(data_entry["friend_area"], 1) + << read_json_string_array(data_entry["abilities"], 1, 2) + << read_json_int(data_entry["shadow_size"], 1) + << read_json_int(data_entry["unk1A"], 1) + << read_json_int(data_entry["unk1B"], 1) + << read_json_bool(data_entry["isMoving"]) + << read_json_int(data_entry["unk1D"], 1) + << read_json_int(data_entry["base_hp"], 2) + << read_json_int(data_entry["base_exp"], 4) + << read_json_int_array(data_entry["base_att_spatt"], 2, 2) + << read_json_int_array(data_entry["base_def_spdef"], 2, 2) + << read_json_int(data_entry["lowkick_dmg"], 2) + << read_json_int(data_entry["sizeorb_dmg"], 2) + << read_json_int(data_entry["unk30"], 1) + << read_json_int(data_entry["unk31"], 1) + << read_json_int(data_entry["unk32"], 1) + << read_json_bool(data_entry["toolboxEnabled"]) + << read_json_string(data_entry["pre"]["evolve_from"], 2) + << read_json_string(data_entry["pre"]["evolve_type"], 2); + + if (data_entry["pre"]["evolve_type"] == "EVOLVE_TYPE_ITEM") { + text << read_json_string(data_entry["needs"]["evolve_need1"], 2); + } else { + text << read_json_int(data_entry["needs"]["evolve_need1"], 2); + } + + text << read_json_int(data_entry["needs"]["evolve_need2"], 2) + << read_json_int_array(data_entry["dexInternal"], 2, 2) + << read_json_int(data_entry["base_recruit"], 2) + << read_json_int_array(data_entry["alphabetParent"], 2, 2) + << "\n.2byte 0\n"; + } + text << TABLE_END; + return text.str(); +} + +string generate_item_data_text(Json data) { + ostringstream text; + + text << "@ This is auto-generated by item_data.json.\n"; + text << ".include \"include/constants/item.h\"\n"; + text << ".include \"include/constants/move_id.h\"\n"; + text << ".global gItemData\n"; + text << "gItemData:"; + for (Json data_entry : data.array_items()) { + text << read_json_string(data_entry["namePointer"], 4) + << read_json_int(data_entry["buyPrice"], 4) + << read_json_int(data_entry["sellPrice"], 4) + << read_json_string(data_entry["type"], 1) + << read_json_int(data_entry["icon"], 1) + << "\n.2byte 0" + << read_json_string(data_entry["descriptionPointer"], 4) + << read_json_bool_array(data_entry["aiFlags"], 1, 3) + << "\n.byte 0" + << read_json_string(data_entry["move"], 2) + << read_json_int(data_entry["order"], 1) + << read_json_int_array(data_entry["unkThrow1B"], 1, 2) + << read_json_int(data_entry["palette"], 1) + << read_json_string(data_entry["category"], 1) + << "\n.byte 0\n"; + } + text << TABLE_END; + return text.str(); +} + string get_directory_name(string filename) { size_t dir_pos = filename.find_last_of("/\\"); @@ -347,34 +494,19 @@ void process_map(string map_filepath, string layouts_filepath, string version) { write_text_file(files_dir + "connections.inc", connections_text); } -void process_dungeon(string map_filepath) { - string mapdata_err; +void process_json(string filepath, string output_file_name, string(*table_text_generator)(Json)) { + string data_err; - string mapdata_json_text = read_text_file(map_filepath); + string data_json_text = read_text_file(filepath); - Json map_data = Json::parse(mapdata_json_text, mapdata_err); - if (map_data == Json()) - FATAL_ERROR("%s\n", mapdata_err.c_str()); + Json data = Json::parse(data_json_text, data_err); + if (data == Json()) + FATAL_ERROR("%s\n", data_err.c_str()); - string pokemon_text = generate_pokemon_table_text(map_data); + string table_text = table_text_generator(data); - string files_dir = get_directory_name(map_filepath); - write_text_file(files_dir + "pokemon_found.inc", pokemon_text); -} - -void process_floorID(string map_filepath) { - string mapdata_err; - - string mapdata_json_text = read_text_file(map_filepath); - - Json map_data = Json::parse(mapdata_json_text, mapdata_err); - if (map_data == Json()) - FATAL_ERROR("%s\n", mapdata_err.c_str()); - - string pokemon_text = generate_floorID_table_text(map_data); - - string files_dir = get_directory_name(map_filepath); - write_text_file(files_dir + "floor_id.inc", pokemon_text); + string files_dir = get_directory_name(filepath); + write_text_file(files_dir + output_file_name, table_text); } string generate_groups_text(Json groups_data) { @@ -599,52 +731,35 @@ int main(int argc, char *argv[]) { char *mode_arg = argv[1]; string mode(mode_arg); - if (mode != "layouts" && mode != "map" && mode != "groups" && mode != "dungeon" && mode != "floor") - FATAL_ERROR("ERROR: <mode> must be 'layouts', 'map', 'groups', 'dungeon' or 'floor' '.\n"); + string filepath(argv[3]); if (mode == "map") { if (argc != 5) FATAL_ERROR("USAGE: dungeonjson map <game-version> <map_file> <layouts_file>\n"); - string filepath(argv[3]); string layouts_filepath(argv[4]); process_map(filepath, layouts_filepath, version); - } - else if (mode == "groups") { - if (argc != 4) - FATAL_ERROR("USAGE: dungeonjson groups <game-version> <groups_file>\n"); - - string filepath(argv[3]); - - process_groups(filepath); - } - else if (mode == "layouts") { - if (argc != 4) - FATAL_ERROR("USAGE: dungeonjson layouts <game-version> <layouts_file>\n"); - - string filepath(argv[3]); - - process_layouts(filepath); - } - else if (mode == "dungeon") { - if (argc != 4) - FATAL_ERROR("USAGE: dungeonjson dungeon <game-version> <dungeon_file>\n"); - - string filepath(argv[3]); - - process_dungeon(filepath); - } - else if (mode == "floor") { + } else { if (argc != 4) - FATAL_ERROR("USAGE: dungeonjson dungeon <game-version> <floor_file>\n"); - - string filepath(argv[3]); - - process_floorID(filepath); + FATAL_ERROR("USAGE: dungeonjson <mode> <game-version> <file>\n"); + + if (mode == "groups") { + process_groups(filepath); + } else if (mode == "layouts") { + process_layouts(filepath); + } else if (mode == "dungeon") { + process_json(filepath, "pokemon_found.inc", generate_pokemon_table_text); + } else if (mode == "floor") { + process_json(filepath, "floor_id.inc", generate_floorID_table_text); + } else if (mode == "species_data") { + process_json(filepath, "species_data.inc", generate_species_data_text); + } else if (mode == "item_data") { + process_json(filepath, "item_data.inc", generate_item_data_text); + } else { + FATAL_ERROR("ERROR: <mode> must be 'layouts', 'map', 'groups', 'dungeon', 'floor', 'species_data', or 'item_data'.\n"); + } } - - return 0; } |