diff --git a/.gitignore b/.gitignore index 6fdae60..4a19f11 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ cmake_install.cmake Makefile saland !src/saland -nbproject \ No newline at end of file +!data/saland +nbproject diff --git a/data/saland/items/base_items.json b/data/saland/items/base_items.json new file mode 100644 index 0000000..002212f --- /dev/null +++ b/data/saland/items/base_items.json @@ -0,0 +1,58 @@ +{ + "items": [ + { + "name": "spell_fireball", + "icon": "effect_fireball", + "item_name": "", + "tile": 0, + "_comment_tile": "Number reference to a tile, we might also need a tileset at some point", + "type": "dot" + } + ,{ + "icon": "item_weapon_long_knife", + "name": "weapon_slash_long_knife" + } + ,{ + "name": "spell_create_block", + "tile": 607, + "type": "tile" + } + ,{ + "icon": "", + "name" : "spell_create_block", + "tile" : 28, + "type" : "tile" + } + ,{ + "icon" : "", + "name" : "spell_create_block", + "tile" : 16, + "type" : "tile" + } + ,{ + "icon" : "item_food_potato", + "name" : "spell_spawn_item", + "item_name" : "food_potato" + } + ,{ + "icon" : "item_barrel", + "name" : "spell_spawn_item", + "item_name" : "barrel" + } + ,{ + "icon" : "tree_palm_icon", + "name" : "spell_spawn_item", + "item_name" : "tree_palm" + } + ,{ + "icon" : "cactus_one", + "name" : "spell_spawn_item", + "item_name" : "cactus_full" + } + ,{ + "icon" : "tree_pine_icon", + "name" : "spell_spawn_item", + "item_name" : "tree_pine" + } + ] +} diff --git a/src/saland/model/spells.cpp b/src/saland/model/spells.cpp index a250b93..0b5400a 100644 --- a/src/saland/model/spells.cpp +++ b/src/saland/model/spells.cpp @@ -22,6 +22,9 @@ https://github.com/sago007/saland */ #include "spells.hpp" +#include "../../sago/SagoMisc.hpp" +#include "rapidjson/document.h" +#include void SpellHolder::add_spell(const Spell &spell) { @@ -38,62 +41,70 @@ void SpellHolder::add_spell(const Spell &spell) spellIndex[name] = spells.size() - 1; } +void SpellHolder::ReadSpellFile(const std::string& filename) { + std::string fullfile = filename; + std::string content = sago::GetFileContent(fullfile.c_str()); + rapidjson::Document document; + document.Parse(content.c_str()); + if ( !document.IsObject() ) { + std::cerr << "Failed to parse: " << fullfile << "\n"; + return; + } + for (auto& m : document.GetObject()) { + const std::string& itemHeader = m.name.GetString(); + if (itemHeader == "items") { + const auto& items = m.value; + if (!items.IsArray()) { + std::cerr << "Failure reading " << filename << ": 'items' must be an array" << "\n"; + } + for (const auto& item : items.GetArray()) { + if (item.IsObject()) { + Spell spell = blankSpell; + for (const auto& member : item.GetObject()) { + if (member.name == "name") { + spell.name = member.value.GetString(); + } + if (member.name == "icon") { + spell.icon = member.value.GetString(); + } + if (member.name == "item_name") { + spell.item_name = member.value.GetString(); + } + if (member.name == "tile") { + spell.tile = member.value.GetInt64(); + } + if (member.name == "type") { + std::string type_value = member.value.GetString(); + if (type_value == "dot") { + spell.type = SpellCursorType::dot; + } + else if (type_value == "tile") { + spell.type = SpellCursorType::tile; + } + else { + std::cerr << filename << ": unsupported tile type: " << type_value << "\n"; + } + } + } + add_spell(spell); + } + } + } + if (!m.value.IsArray()) { + if (itemHeader[0] != '_') { + std::cerr << "Missing top array: " << itemHeader << "\n"; + } + continue; + } + } +} + void SpellHolder::init() { - Spell slot0; - slot0.icon = "effect_fireball"; - slot0.name = "spell_fireball"; - Spell slot1; - slot1.icon = "item_weapon_long_knife"; - slot1.name = "weapon_slash_long_knife"; - Spell slot2; - slot2.icon = ""; - slot2.name = "spell_create_block"; - slot2.tile = 607; - slot2.type = SpellCursorType::tile; - Spell slot3; - slot3.icon = ""; - slot3.name = "spell_create_block"; - slot3.tile = 28; - slot3.type = SpellCursorType::tile; - Spell slot4; - slot4.icon = ""; - slot4.name = "spell_create_block"; - slot4.tile = 16; - slot4.type = SpellCursorType::tile; - Spell slot5; - slot5.icon = "item_food_potato"; - slot5.name = "spell_spawn_item"; - slot5.item_name = "food_potato"; - Spell slot6; - slot6.icon = "item_barrel"; - slot6.name = "spell_spawn_item"; - slot6.item_name = "barrel"; - Spell slot7; - slot7.icon = "tree_palm_icon"; - slot7.name = "spell_spawn_item"; - slot7.item_name = "tree_palm"; - Spell slot8; - slot8.icon = "cactus_one"; - slot8.name = "spell_spawn_item"; - slot8.item_name = "cactus_full"; - Spell slot9; - slot9.icon = "tree_pine_icon"; - slot9.name = "spell_spawn_item"; - slot9.item_name = "tree_pine"; clearTileSpell.icon = "icon_trash_can"; clearTileSpell.name = "spell_clear_block"; clearTileSpell.type = SpellCursorType::tile; - add_spell(slot0); - add_spell(slot1); - add_spell(slot2); - add_spell(slot3); - add_spell(slot4); - add_spell(slot5); - add_spell(slot6); - add_spell(slot7); - add_spell(slot8); - add_spell(slot9); + ReadSpellFile("saland/items/base_items.json"); } size_t SpellHolder::get_spell_count() const diff --git a/src/saland/model/spells.hpp b/src/saland/model/spells.hpp index 9291232..2764525 100644 --- a/src/saland/model/spells.hpp +++ b/src/saland/model/spells.hpp @@ -55,6 +55,7 @@ public: const Spell& get_spell(size_t index) const; const Spell& get_spell_by_name(const std::string&) const; const Spell& get_spell_clear_tile() const; + void ReadSpellFile(const std::string& filename); }; #endif //MODEL_SPELLS_HPP \ No newline at end of file