summaryrefslogtreecommitdiff
path: root/tools/dungeonjson/dungeonjson.cpp
diff options
context:
space:
mode:
authorCheng Hann Gan <chenghanngan.us@gmail.com>2021-09-28 12:50:36 -0400
committerGitHub <noreply@github.com>2021-09-28 09:50:36 -0700
commit12aec1bb718eb7b04d4a5506030154b0cce454a0 (patch)
treecc460ac2d94ec83522565fd11127df0fa172d5a4 /tools/dungeonjson/dungeonjson.cpp
parent0d3b11e81a215875fc533db17895613c47a4da73 (diff)
Created species/item data JSONs (#57)
* Created species data JSON * Added item data JSON * Removed address field from JSONs -Moved constants/item.h import to item.h. * Used default values for some JSON fields -Use item ID macros for item evolutions.
Diffstat (limited to 'tools/dungeonjson/dungeonjson.cpp')
-rw-r--r--tools/dungeonjson/dungeonjson.cpp241
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;
}