From a174aa52f105603874690c59c8b752949d3f87e4 Mon Sep 17 00:00:00 2001 From: krogenth Date: Wed, 12 Apr 2023 19:25:49 -0400 Subject: [PATCH 1/7] updated project structure, fixed several bugs --- src/ItemsClass.cpp | 475 ---------- src/LevelupsClass.cpp | 133 --- src/ManaEggsClass.cpp | 169 ---- src/MdtsClass.cpp | 839 ----------------- src/MovesClass.cpp | 309 ------- src/SkillBooksClass.cpp | 166 ---- src/SkillsClass.cpp | 171 ---- src/SpecialsClass.cpp | 144 --- src/StartStatsClass.cpp | 343 ------- src/bosses/Boss.h | 17 + src/{BossesClass.cpp => bosses/Bosses.cpp} | 307 +++---- src/bosses/Bosses.h | 43 + src/common/BaseDataInterface.h | 15 + src/{include => common}/JsonDefinitions.h | 1 + src/common/copypaste_obj.cpp | 2 +- src/{include => }/common/copypaste_obj.h | 0 src/common/difficulty.h | 19 + src/{include => }/common/io_util.h | 0 src/common/string_manip.cpp | 2 +- src/{include => }/common/string_manip.h | 0 src/common/structs/Vector2.h | 8 + src/common/structs/Vector3.h | 9 + src/{include => }/common/version_check.h | 0 src/{EnemiesClass.cpp => enemies/Enemies.cpp} | 290 +++--- src/enemies/Enemies.h | 45 + src/enemies/Enemy.h | 17 + src/enemies/EnemyAI.h | 13 + src/enemies/EnemyMoves.h | 44 + src/enemies/EnemyStats.h | 49 + src/include/BaseDataClass.h | 16 - src/include/BossesClass.h | 58 -- src/include/EnemiesClass.h | 163 ---- src/include/ItemsClass.h | 120 --- src/include/LevelupsClass.h | 63 -- src/include/ManaEggsClass.h | 51 -- src/include/MdtsClass.h | 356 -------- src/include/MovesClass.h | 76 -- src/include/SkillBooksClass.h | 52 -- src/include/SpecialsClass.h | 49 - src/items/Item.h | 18 + src/items/ItemEquipment.h | 29 + src/items/ItemStats.h | 14 + src/items/ItemUsable.h | 31 + src/items/Items.cpp | 476 ++++++++++ src/items/Items.h | 39 + src/levelups/CharacterLevelups.h | 24 + src/levelups/Levelups.cpp | 135 +++ src/levelups/Levelups.h | 38 + src/main.cpp | 51 +- src/maps/EnemyGroup.h | 63 ++ src/maps/EnemyPosition.h | 22 + src/maps/HTA.h | 26 + src/maps/Header.h | 81 ++ src/maps/Icon.h | 21 + src/maps/Instance.h | 16 + src/maps/MOS.h | 18 + src/maps/MapEntry.h | 15 + src/maps/Maps.cpp | 846 ++++++++++++++++++ src/maps/Maps.h | 76 ++ src/{ => maps}/ModelClass.cpp | 0 src/{include => maps}/ModelClass.h | 4 +- src/{include => maps}/ModelStruct.h | 0 src/{ => maps}/Model_IO.cpp | 0 src/maps/Shop.h | 27 + src/moves/ManaEgg.h | 17 + src/moves/ManaEggs.cpp | 170 ++++ src/moves/ManaEggs.h | 37 + src/moves/Move.h | 45 + src/moves/Moves.cpp | 309 +++++++ src/moves/Moves.h | 35 + src/moves/Special.h | 16 + src/moves/Specials.cpp | 147 +++ src/moves/Specials.h | 35 + src/{include/SkillsClass.h => skills/Skill.h} | 42 +- src/skills/SkillBook.h | 17 + src/skills/SkillBooks.cpp | 167 ++++ src/skills/SkillBooks.h | 38 + src/skills/Skills.cpp | 171 ++++ src/skills/Skills.h | 34 + .../CharacterStartStats.h} | 43 +- src/stats/StartStats.cpp | 344 +++++++ src/stats/StartStats.h | 36 + src/{ => ui}/ImGuiInstance.cpp | 245 ++--- src/{include => ui}/ImGuiInstance.h | 0 src/{include/common => ui}/imgui_wrappers.h | 4 + vs/G2DataGUI/G2DataGUI.vcxproj | 94 +- vs/G2DataGUI/G2DataGUI.vcxproj.filters | 260 ++++-- 87 files changed, 4624 insertions(+), 4386 deletions(-) delete mode 100644 src/ItemsClass.cpp delete mode 100644 src/LevelupsClass.cpp delete mode 100644 src/ManaEggsClass.cpp delete mode 100644 src/MdtsClass.cpp delete mode 100644 src/MovesClass.cpp delete mode 100644 src/SkillBooksClass.cpp delete mode 100644 src/SkillsClass.cpp delete mode 100644 src/SpecialsClass.cpp delete mode 100644 src/StartStatsClass.cpp create mode 100644 src/bosses/Boss.h rename src/{BossesClass.cpp => bosses/Bosses.cpp} (51%) create mode 100644 src/bosses/Bosses.h create mode 100644 src/common/BaseDataInterface.h rename src/{include => common}/JsonDefinitions.h (98%) rename src/{include => }/common/copypaste_obj.h (100%) create mode 100644 src/common/difficulty.h rename src/{include => }/common/io_util.h (100%) rename src/{include => }/common/string_manip.h (100%) create mode 100644 src/common/structs/Vector2.h create mode 100644 src/common/structs/Vector3.h rename src/{include => }/common/version_check.h (100%) rename src/{EnemiesClass.cpp => enemies/Enemies.cpp} (50%) create mode 100644 src/enemies/Enemies.h create mode 100644 src/enemies/Enemy.h create mode 100644 src/enemies/EnemyAI.h create mode 100644 src/enemies/EnemyMoves.h create mode 100644 src/enemies/EnemyStats.h delete mode 100644 src/include/BaseDataClass.h delete mode 100644 src/include/BossesClass.h delete mode 100644 src/include/EnemiesClass.h delete mode 100644 src/include/ItemsClass.h delete mode 100644 src/include/LevelupsClass.h delete mode 100644 src/include/ManaEggsClass.h delete mode 100644 src/include/MdtsClass.h delete mode 100644 src/include/MovesClass.h delete mode 100644 src/include/SkillBooksClass.h delete mode 100644 src/include/SpecialsClass.h create mode 100644 src/items/Item.h create mode 100644 src/items/ItemEquipment.h create mode 100644 src/items/ItemStats.h create mode 100644 src/items/ItemUsable.h create mode 100644 src/items/Items.cpp create mode 100644 src/items/Items.h create mode 100644 src/levelups/CharacterLevelups.h create mode 100644 src/levelups/Levelups.cpp create mode 100644 src/levelups/Levelups.h create mode 100644 src/maps/EnemyGroup.h create mode 100644 src/maps/EnemyPosition.h create mode 100644 src/maps/HTA.h create mode 100644 src/maps/Header.h create mode 100644 src/maps/Icon.h create mode 100644 src/maps/Instance.h create mode 100644 src/maps/MOS.h create mode 100644 src/maps/MapEntry.h create mode 100644 src/maps/Maps.cpp create mode 100644 src/maps/Maps.h rename src/{ => maps}/ModelClass.cpp (100%) rename src/{include => maps}/ModelClass.h (97%) rename src/{include => maps}/ModelStruct.h (100%) rename src/{ => maps}/Model_IO.cpp (100%) create mode 100644 src/maps/Shop.h create mode 100644 src/moves/ManaEgg.h create mode 100644 src/moves/ManaEggs.cpp create mode 100644 src/moves/ManaEggs.h create mode 100644 src/moves/Move.h create mode 100644 src/moves/Moves.cpp create mode 100644 src/moves/Moves.h create mode 100644 src/moves/Special.h create mode 100644 src/moves/Specials.cpp create mode 100644 src/moves/Specials.h rename src/{include/SkillsClass.h => skills/Skill.h} (53%) create mode 100644 src/skills/SkillBook.h create mode 100644 src/skills/SkillBooks.cpp create mode 100644 src/skills/SkillBooks.h create mode 100644 src/skills/Skills.cpp create mode 100644 src/skills/Skills.h rename src/{include/StartStatsClass.h => stats/CharacterStartStats.h} (55%) create mode 100644 src/stats/StartStats.cpp create mode 100644 src/stats/StartStats.h rename src/{ => ui}/ImGuiInstance.cpp (64%) rename src/{include => ui}/ImGuiInstance.h (100%) rename src/{include/common => ui}/imgui_wrappers.h (91%) diff --git a/src/ItemsClass.cpp b/src/ItemsClass.cpp deleted file mode 100644 index 2f6cc89..0000000 --- a/src/ItemsClass.cpp +++ /dev/null @@ -1,475 +0,0 @@ -#include -#include -#include -#include -#include - -#include "./include/ItemsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Items::write() { - ImU32 dataOffset = 0x0000F9B0; // 80 * 799 - ImU32 badOffset = 0xFFFFFFFF; - - std::ofstream stream; - stream.open(this->_filename, std::ios::binary); - - if (!stream.is_open()) { - throw new std::exception("ITEM.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_items.size(); i++) { - stream.write(this->_items.at(i).name, 18); - stream.write(this->_items.at(i).description, 40); - - writeRaw(stream, this->_items.at(i).stats); - - if (!this->_items.at(i).equipmentOffset) { - writeRaw(stream, badOffset); - } - else { - writeRaw(stream, dataOffset); - dataOffset += sizeof(EquipmentStruct); - } - - if (!this->_items.at(i).usableOffset) { - writeRaw(stream, badOffset); - } - else { - writeRaw(stream, dataOffset); - dataOffset += sizeof(UsableStruct); - } - - writeRaw(stream, this->_items.at(i).id); - } - - for (size_t i = 0; i < this->_items.size(); i++) { - if (this->_items.at(i).equipmentOffset) { - writeRaw(stream, *(this->_items.at(i).equipmentOffset)); - } - if (this->_items.at(i).usableOffset) { - writeRaw(stream, *(this->_items.at(i).usableOffset)); - } - } - - stream.close(); -} - -void Items::read() { - std::ifstream stream(this->_filename, std::ios::binary); - - if (!stream.is_open()) { - throw new std::exception("ITEM.BIN not found to be read!"); - } - - std::streampos pos = 0; - this->_items.resize(0x31F); // entries are broken down into 3 possible parts(first is always there, 80 bytes long; second is equipment, 28 bytes long; third is usables, 32 bytes long) - - for (size_t i = 0; i < this->_items.size(); i++) { - stream.read(this->_items.at(i).name, 18); - replaceNulls(this->_items.at(i).name, 18); - stream.read(this->_items.at(i).description, 40); - replaceNulls(this->_items.at(i).description, 40); - this->_items.at(i).stats = readRaw(stream); - - // check if equipment offset is available - int32_t equipOffset = readRaw(stream); - pos = stream.tellg(); - if (equipOffset > 0) { - this->_items.at(i).equipmentOffset = new EquipmentStruct; - stream.seekg(equipOffset, std::ios::beg); - *(this->_items.at(i).equipmentOffset) = readRaw(stream); - } - - // check if usable offset is available - stream.seekg(pos, std::ios::beg); - - int32_t usableOffset = readRaw(stream); - pos = stream.tellg(); - if (usableOffset > 0) { - this->_items.at(i).usableOffset = new UsableStruct; - stream.seekg(usableOffset, std::ios::beg); - *(this->_items.at(i).usableOffset) = readRaw(stream); - } - - stream.seekg(pos, std::ios::beg); - readRaw(stream); // read in last four bytes, they represent the id but can be overwritten - this->_items.at(i).id = (uint32_t)i; - } - - stream.close(); - - // set starting states for equipment and usable - if (this->_items.at(0).equipmentOffset) { - this->_hasEquip = true; - for (size_t i = 0; i < 7; i++) { - this->EquipmentCharacterBitFlags[i] = (this->_items.at(0).equipmentOffset->characterBitflag & (1 << i)) > 0; - } - for (size_t i = 0; i < 8; i++) { - this->EquipmentAilmentBitFlags[i] = (this->_items.at(0).equipmentOffset->ailmentsBitflag & (1 << i)) > 0; - } - } - if (this->_items.at(0).usableOffset) { - this->_hasUsable = true; - for (size_t i = 0; i < 8; i++) { - this->UsableAilmentBitFlags[i] = (this->_items.at(0).usableOffset->ailmentsBitflag & (1 << i)) > 0; - } - } -} - -void Items::draw() { - ImGui::Begin("ITEMS"); - - auto itemEntryDefs = JsonDefinitions::getInstance().getDefinitions("itemEntries"); - auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); - auto effectiveOnDefs = JsonDefinitions::getInstance().getDefinitions("effectiveOn"); - auto statusDefs = JsonDefinitions::getInstance().getDefinitions("statuses"); - auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); - auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); - auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); - auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); - - if (ImGui::Button("Save")) { - this->write(); - } - - ImGui::SameLine(); - if (ImGui::Button("Copy")) { - copyObj(&this->_items.at(this->_itemIndex), "Item"); - } - - ImGui::SameLine(); - if (ImGui::Button("Paste") && checkObjType("Item")) { - ItemStruct* tempObj = ((ItemStruct*)pasteObj()); - this->_items.at(this->_itemIndex) = *tempObj; - - if (tempObj->equipmentOffset) { - if (!this->_items.at(this->_itemIndex).equipmentOffset) { - this->_items.at(this->_itemIndex).equipmentOffset = new EquipmentStruct; - } - - *(this->_items.at(this->_itemIndex).equipmentOffset) = *(tempObj->equipmentOffset); - - for (size_t i = 0; i < 7; i++) { - EquipmentCharacterBitFlags[i] = this->_items.at(this->_itemIndex).equipmentOffset->characterBitflag & (1 << i); - } - - for (size_t i = 0; i < 8; i++) { - EquipmentAilmentBitFlags[i] = this->_items.at(this->_itemIndex).equipmentOffset->ailmentsBitflag & (1 << i); - } - - this->_hasEquip = true; - } - else if (this->_items.at(this->_itemIndex).equipmentOffset) { - this->_hasEquip = false; - delete this->_items.at(this->_itemIndex).equipmentOffset; - } - - if (tempObj->usableOffset) { - if (!this->_items.at(this->_itemIndex).usableOffset) { - this->_items.at(this->_itemIndex).usableOffset = new UsableStruct; - } - - *(this->_items.at(this->_itemIndex).usableOffset) = *(tempObj->usableOffset); - - for (size_t i = 0; i < 8; i++) { - UsableAilmentBitFlags[i] = this->_items.at(this->_itemIndex).usableOffset->ailmentsBitflag & (1 << i); - } - - this->_hasUsable = true; - } - else if (this->_items.at(this->_itemIndex).usableOffset) { - delete this->_items.at(this->_itemIndex).usableOffset; - this->_hasUsable = false; - } - } - - if (ImGui::BeginCombo("Item Index", this->_items.at(this->_itemIndex).name)) { - for (size_t i = 0; i < this->_items.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_itemIndex); - if (ImGui::Selectable(this->_items.at(i).name, is_selected)) { - this->_itemIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - (this->_items.at(this->_itemIndex).equipmentOffset) ? this->_hasEquip = true : this->_hasEquip = false; - (this->_items.at(this->_itemIndex).usableOffset) ? this->_hasUsable = true : this->_hasUsable = false; - - if (this->_hasEquip) { - for (size_t i = 0; i < 7; i++) { - EquipmentCharacterBitFlags[i] = this->_items.at(this->_itemIndex).equipmentOffset->characterBitflag & (1 << i); - } - for (size_t i = 0; i < 8; i++) { - EquipmentAilmentBitFlags[i] = this->_items.at(this->_itemIndex).equipmentOffset->ailmentsBitflag & (1 << i); - } - } - else { - for (size_t i = 0; i < 7; i++) { - EquipmentCharacterBitFlags[i] = false; - } - - for (size_t i = 0; i < 8; i++) { - EquipmentAilmentBitFlags[i] = false; - } - - } - - if (this->_hasUsable) { - for (size_t i = 0; i < 8; i++) { - UsableAilmentBitFlags[i] = this->_items.at(this->_itemIndex).usableOffset->ailmentsBitflag & (1 << i); - } - } - else { - for (size_t i = 0; i < 8; i++) { - UsableAilmentBitFlags[i] = 0; - } - } - - ImGui::EndCombo(); - } - - ImGui::InputText("Name", this->_items.at(this->_itemIndex).name, 19); - ImGui::InputText("Description", this->_items.at(this->_itemIndex).description, 41); - - if (ImGui::BeginCombo("Entry Type", itemEntryDefs.at(this->_items.at(this->_itemIndex).stats.entryType).c_str())) { - for (size_t i = 0; i < itemEntryDefs.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).stats.entryType); - if (ImGui::Selectable(itemEntryDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).stats.entryType = (uint8_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Unknown #1", &this->_items.at(this->_itemIndex).stats.unknown1); - drawInput("Unknown #2", &this->_items.at(this->_itemIndex).stats.unknown2); - drawInput("Unknown #3", &this->_items.at(this->_itemIndex).stats.unknown3); - drawInput("Icon", &this->_items.at(this->_itemIndex).stats.icon); - drawInput("Unknown #5", &this->_items.at(this->_itemIndex).stats.unknown4); - drawInput("Price", &this->_items.at(this->_itemIndex).stats.price); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("sell = price / 2"); - - if (ImGui::Checkbox("Equipment", &this->_hasEquip)) { - if (this->_hasEquip) { - this->_items.at(this->_itemIndex).equipmentOffset = new EquipmentStruct; - } - else { - delete this->_items.at(this->_itemIndex).equipmentOffset; - this->_items.at(this->_itemIndex).equipmentOffset = nullptr; - - for (size_t i = 0; i < 8; i++) { - EquipmentAilmentBitFlags[i] = false; - } - } - } - - ImGui::SameLine(); - if (ImGui::Checkbox("Usable", &this->_hasUsable)) { - if (this->_hasUsable) { - this->_items.at(this->_itemIndex).usableOffset = new UsableStruct; - } - else { - delete this->_items.at(this->_itemIndex).usableOffset; - this->_items.at(this->_itemIndex).usableOffset = nullptr; - - for (size_t i = 0; i < 8; i++) { - UsableAilmentBitFlags[i] = false; - } - } - } - - ImGui::End(); - - if (this->_hasEquip) { - ImGui::Begin("ITEM EQUIPMENT"); - for (size_t i = 0; i < 7; i++) { - if (ImGui::Checkbox(characterDefs.at(i).c_str(), &EquipmentCharacterBitFlags[i])) { - this->_items.at(this->_itemIndex).equipmentOffset->characterBitflag ^= (1 << i); - } - if ((i+1) % 4 && (i+1) < 7) { - ImGui::SameLine(); - } - } - - drawInput("Strength", &this->_items.at(this->_itemIndex).equipmentOffset->str); - drawInput("Vitality", &this->_items.at(this->_itemIndex).equipmentOffset->vit); - drawInput("Action", &this->_items.at(this->_itemIndex).equipmentOffset->act); - drawInput("Movement", &this->_items.at(this->_itemIndex).equipmentOffset->mov); - - if (ImGui::BeginCombo("Effective On", effectiveOnDefs.at(this->_items.at(this->_itemIndex).equipmentOffset->effectiveOn).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - bool is_selected = (i == this->_items.at(this->_itemIndex).equipmentOffset->effectiveOn); - if (ImGui::Selectable(effectiveOnDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).equipmentOffset->effectiveOn = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - } - - ImGui::EndCombo(); - } - - drawInput("Fire %", &this->_items.at(this->_itemIndex).equipmentOffset->fireAffinity); - drawInput("Wind %", &this->_items.at(this->_itemIndex).equipmentOffset->windAffinity); - drawInput("Earth %", &this->_items.at(this->_itemIndex).equipmentOffset->earthAffinity); - drawInput("Lightning %", &this->_items.at(this->_itemIndex).equipmentOffset->lightningAffinity); - drawInput("Blizzard %", &this->_items.at(this->_itemIndex).equipmentOffset->blizzardAffinity); - - for (size_t i = 0; i < 8; i++) { - if (ImGui::Checkbox(statusDefs.at(i).c_str(), &EquipmentAilmentBitFlags[i])) { - this->_items.at(this->_itemIndex).equipmentOffset->ailmentsBitflag ^= (EquipmentAilmentBitFlags[i] << i); - } - if ((i+1) % 4) { - ImGui::SameLine(); - } - } - - drawInput("Ailments Chance", &this->_items.at(this->_itemIndex).equipmentOffset->ailmentsChance); - drawInput("Increase Fire %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseFirePercent); - drawInput("Increase Wind %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseWindPercent); - drawInput("Increase Earth %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseEarthPercent); - drawInput("Increase Lightning %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseLightningPercent); - drawInput("Increase Blizzard %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseBlizzardPercent); - drawInput("Increase Water %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseWaterPercent); - drawInput("Increase Explosion %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseExplosionPercent); - drawInput("Increase Forest %", &this->_items.at(this->_itemIndex).equipmentOffset->increaseForestPercent); - drawInput("Special", &this->_items.at(this->_itemIndex).equipmentOffset->special); - - ImGui::End(); - } - - if (this->_hasUsable) { - ImGui::Begin("ITEM USABLE"); - if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(this->_items.at(this->_itemIndex).usableOffset->targetEffect).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).usableOffset->targetEffect); - if (ImGui::Selectable(targetEffectDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).usableOffset->targetEffect = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(this->_items.at(this->_itemIndex).usableOffset->targetType).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).usableOffset->targetType); - if (ImGui::Selectable(targetTypeDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).usableOffset->targetType = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Power", &this->_items.at(this->_itemIndex).usableOffset->power); - drawInput("Range", &this->_items.at(this->_itemIndex).usableOffset->range); - drawInput("Cast Time", &this->_items.at(this->_itemIndex).usableOffset->castTime); - drawInput("Recovery", &this->_items.at(this->_itemIndex).usableOffset->recoveryTime); - - if (ImGui::BeginCombo("Animation", animationDefs.at(this->_items.at(this->_itemIndex).usableOffset->animation).c_str())) { - for (size_t i = 0; i < this->_moves->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).usableOffset->animation); - if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).usableOffset->animation = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Effective On", effectiveOnDefs.at(this->_items.at(this->_itemIndex).usableOffset->effectiveOn).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).usableOffset->effectiveOn); - if (ImGui::Selectable(effectiveOnDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).usableOffset->effectiveOn = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Unknown #1", &this->_items.at(this->_itemIndex).usableOffset->unknown1); - drawInputN("IP Damage/IP Cancel Damage", &this->_items.at(this->_itemIndex).usableOffset->ipDamage, 2); - drawInput("Knockback", &this->_items.at(this->_itemIndex).usableOffset->knockback); - - if (ImGui::BeginCombo("Element", elementDefs.at(this->_items.at(this->_itemIndex).usableOffset->element).c_str())) { - for (uint8_t i = 0; i < 5; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_items.at(this->_itemIndex).usableOffset->element); - if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { - this->_items.at(this->_itemIndex).usableOffset->element = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Element Strength", &this->_items.at(this->_itemIndex).usableOffset->elementStr); - - for (size_t i = 0; i < 8; i++) { - if (ImGui::Checkbox(statusDefs.at(i).c_str(), &UsableAilmentBitFlags[i])) { - this->_items.at(this->_itemIndex).usableOffset->ailmentsBitflag ^= (UsableAilmentBitFlags[i] << i); - } - if ((i+1) % 4) { - ImGui::SameLine(); - } - } - - drawInputN("Atk/Def/Act/Mov Mods", &this->_items.at(this->_itemIndex).usableOffset->atkMod, 4); - drawInput("Break Chance", &this->_items.at(this->_itemIndex).usableOffset->breakChance); - drawInput("Special", &this->_items.at(this->_itemIndex).usableOffset->special); - drawInput("Unknown #2", &this->_items.at(this->_itemIndex).usableOffset->unknown2); - drawInput("Unknown #3", &this->_items.at(this->_itemIndex).usableOffset->unknown3); - - ImGui::End(); - } -} - -void Items::outputToCSV() { - -} \ No newline at end of file diff --git a/src/LevelupsClass.cpp b/src/LevelupsClass.cpp deleted file mode 100644 index a611801..0000000 --- a/src/LevelupsClass.cpp +++ /dev/null @@ -1,133 +0,0 @@ -#include -#include -#include - -#include "./include/LevelupsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Levelups::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("TB_LVUP.BIN not found to be written!"); - } - - for (size_t characterIndex = 0; characterIndex < this->_levelups.size(); characterIndex++) { - for (size_t levelupIndex = 0; levelupIndex < maxLevel; levelupIndex++) { - writeRaw(output, this->_levelups.at(characterIndex).levelups[levelupIndex]); - } - } -} - -void Levelups::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("TB_LVUP.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - auto fileSize = std::filesystem::file_size(filePath); - this->_levelups.resize(fileSize / (24 * maxLevel)); // entries are 24 bytes long, and 99 entries per character - - for (size_t characterIndex = 0; characterIndex < this->_levelups.size(); characterIndex++) { - for (size_t levelupIndex = 0; levelupIndex < maxLevel; levelupIndex++) { - this->_levelups.at(characterIndex).levelups[levelupIndex] = readRaw(input); - } - } - - input.close(); -} - -void Levelups::draw() { - ImGui::Begin("LEVEUPS"); - - auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); - - if (ImGui::Button("Save")) { - this->write(); - } - - if (ImGui::BeginCombo("Character", characterDefs.at(this->_characterIndex).c_str())) { - for (size_t index = 0; index < this->_levelups.size(); index++) { - ImGui::PushID((int)index); - bool is_selected = (index == this->_characterIndex); - if (ImGui::Selectable(characterDefs.at(index).c_str(), is_selected)) { - this->_characterIndex = index; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Level", std::format("Level {}", this->_characterLevelupIndex + 1).c_str())) { - for (size_t index = 0; index < maxLevel; index ++) { - ImGui::PushID((int)index); - bool is_selected = (index == this->_characterLevelupIndex); - if (ImGui::Selectable(std::format("Level {}", index + 1).c_str(), is_selected)) { - this->_characterLevelupIndex = index; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - ImGui::EndCombo(); - } - - drawInput("EXP", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].exp); - drawInput("HP Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].hpIncrease); - drawInput("MP Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].mpIncrease); - drawInput("SP Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].spIncrease); - drawInput("STR Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].strIncrease); - drawInput("VIT Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].vitIncrease); - drawInput("MAG Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].magIncrease); - drawInput("MEN Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].menIncrease); - drawInput("ACT Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].actIncrease); - drawInput("MOV Increase", &this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].movIncrease); - drawInput("Skill Slot Increase",&this->_levelups.at(this->_characterIndex).levelups[this->_characterLevelupIndex].skillSlotIncrease); - - ImGui::End(); -} - -void Levelups::outputToCSV() { - auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); - std::ofstream output; - output.open("./csv/TB_LVUP.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Name,EXP,HP Increase,MP Increase,SP Increase,STR Increase,VIT Increase,ACT Increase,MOV Increase,MAG Increase,MEN Increase,Skill Slot Increase\n"; - - for (size_t characterIndex = 0; characterIndex < this->_levelups.size(); characterIndex++) { - for (size_t characterLevelupIndex = 0; characterLevelupIndex < maxLevel; characterLevelupIndex++) { - output << characterDefs.at(characterIndex) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].exp) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].hpIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].mpIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].spIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].strIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].vitIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].actIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].movIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].magIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].menIncrease) << ',' - << std::to_string(this->_levelups.at(characterIndex).levelups[characterLevelupIndex].skillSlotIncrease) << '\n'; - } - } - - output.close(); -} \ No newline at end of file diff --git a/src/ManaEggsClass.cpp b/src/ManaEggsClass.cpp deleted file mode 100644 index c0459d7..0000000 --- a/src/ManaEggsClass.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include -#include -#include -#include - -#include "./include/ManaEggsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void ManaEggs::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("TB_MAGIC.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_manaeggs.size(); i++) { - for (size_t j = 0; j < 18; j++) { - writeRaw(output, this->_manaeggs.at(i).spells[j]); - } - } - - output.close(); -} - -void ManaEggs::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("TB_MAGIC.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - this->_manaeggs.resize(fileSize / 72); // entries are 72 bytes long(each spell is 4 bytes long, 18 spells per egg) - - for (size_t i = 0; i < this->_manaeggs.size(); i++) { - for (size_t j = 0; j < 18; j++) { - this->_manaeggs.at(i).spells[j] = readRaw(input); - } - } - - input.close(); -} - -void ManaEggs::draw() { - ImGui::Begin("MANAEGGS"); - - auto eggDefs = JsonDefinitions::getInstance().getDefinitions("eggs"); - - if (ImGui::Button("Save")) { - this->write(); - } - - // ManaEgg names are stored inside ITEMS.BIN, so until we find a way to track that, we stick with a hardcoded version - if (ImGui::BeginCombo("ManaEgg Index", eggDefs.at(this->_eggIndex).c_str())) { - for (size_t i = 0; i < this->_manaeggs.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_eggIndex); - if (ImGui::Selectable(eggDefs.at(i).c_str(), is_selected)) { - this->_eggIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Index", std::format("Index {}", this->_spellIndex + 1).c_str())) { - for (size_t i = 0; i < 18; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_spellIndex); - if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { - this->_spellIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Spell", this->_moves->at(this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].spellOffset).name)) { - for (size_t i = 0; i < this->_moves->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].spellOffset); - if (ImGui::Selectable(this->_moves->at(i).name, is_selected)) { - this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].spellOffset = (uint8_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Starting Level", &this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].startingLevel); - drawInput("Egg Level Required", &this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].eggLevelRequired); - drawInput("Unknown #1", &this->_manaeggs.at(this->_eggIndex).spells[this->_spellIndex].unknown1); - - ImGui::End(); -} - -void ManaEggs::outputToCSV() { - auto eggDefs = JsonDefinitions::getInstance().getDefinitions("eggs"); - std::ofstream output; - output.open("./csv/TB_MAGIC.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Manaegg"; - for(size_t i = 0; i < 18; i++) { - output << ",Move,Starting Level,Level Required,???"; - } - output << '\n'; - - for (size_t i = 0; i < this->_manaeggs.size(); i++) { - output << eggDefs.at(i).c_str(); - for (size_t j = 0; j < 18; j++) { - output << ',' << this->_moves->at(this->_manaeggs.at(i).spells[j].spellOffset).name - << ',' << std::to_string(this->_manaeggs.at(i).spells[j].startingLevel) - << ',' << std::to_string(this->_manaeggs.at(i).spells[j].eggLevelRequired) - << ',' << std::to_string(this->_manaeggs.at(i).spells[j].unknown1); - } - - output << '\n'; - } - - output.close(); -} - -void ManaEggs::randomize() { - std::random_device rd; - std::mt19937 g(rd()); - - for (auto& manaegg : this->_manaeggs) { - std::unordered_map usedIndices; - for (size_t i = 0; i < 18; i++) { - do { - manaegg.spells[i].spellOffset = (g() % (50 - 1)) + 1; - } while (std::string(this->_moves->at(manaegg.spells[i].spellOffset).name).find_first_not_of(' ') == std::string::npos || usedIndices.find(manaegg.spells[i].spellOffset) != usedIndices.end()); - usedIndices.insert(std::make_pair(manaegg.spells[i].spellOffset, manaegg.spells[i].spellOffset)); - manaegg.spells[i].startingLevel = (g() % 2) ? g() % 6 : 0; - if (manaegg.spells[i].startingLevel == 0) { - manaegg.spells[i].eggLevelRequired = g() % 41; - } - else { - manaegg.spells[i].eggLevelRequired = 0; - } - } - } -} \ No newline at end of file diff --git a/src/MdtsClass.cpp b/src/MdtsClass.cpp deleted file mode 100644 index dbc08a2..0000000 --- a/src/MdtsClass.cpp +++ /dev/null @@ -1,839 +0,0 @@ -#include -#include -#include -#include - -#include "./include/MdtsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Mdts::write() { - std::fstream output; - uint32_t offset = 0; - - for (size_t i = 0; i < this->_mdts.size(); i++) { - output.open(this->_mdts.at(i).filename, std::ios::binary | std::ios::in | std::ios::out); - - if (!output.is_open()) { - throw new std::exception(this->_mdts.at(i).filename.c_str()); - } - - // write in map entries - output.seekg(this->_mdts.at(i).header.offsetMapEntries, std::ios::beg); - for (auto& val : this->_mdts.at(i).mapEntries) { - writeRaw(output, val); - } - - // write in instances - output.seekg(this->_mdts.at(i).header.offsetInstances, std::ios::beg); - for (auto& val : this->_mdts.at(i).instances) { - writeRaw(output, val); - } - - // write in HTA - output.seekg(this->_mdts.at(i).header.offsetHTA, std::ios::beg); - for (auto& val : this->_mdts.at(i).HTA) { - writeRaw(output, val); - } - - // write in enemy positions - output.seekg(this->_mdts.at(i).header.offsetEnemyPos, std::ios::beg); - for (auto& val : this->_mdts.at(i).enemyPositions) { - writeRaw(output, val); - } - - // write in enemy groups - output.seekg(this->_mdts.at(i).header.offsetEnemyGroup, std::ios::beg); - for (auto& val : this->_mdts.at(i).enemyGroups) { - writeRaw(output, val); - } - - // write in MOS - output.seekg(this->_mdts.at(i).header.offsetMOS, std::ios::beg); - for (auto& val : this->_mdts.at(i).MOS) { - writeRaw(output, val); - } - - // write in icons - output.seekg(this->_mdts.at(i).header.offsetIcons, std::ios::beg); - for (auto& val : this->_mdts.at(i).icons) { - writeRaw(output, val); - } - - // write in shop - if (this->_mdts.at(i).shop.size()) { - for (ImU16 j = 0; j < 12; j++) { - if (this->_mdts.at(i).shop[0].weapons[j].item) { - this->_mdts.at(i).shop[0].weapons[j].item += 0x0800; - } - - if (this->_mdts.at(i).shop[0].armors[j].item) { - this->_mdts.at(i).shop[0].armors[j].item += 0x0800; - } - - if (this->_mdts.at(i).shop[0].jewelry[j].item) { - this->_mdts.at(i).shop[0].jewelry[j].item += 0x0800; - } - - if (this->_mdts.at(i).shop[0].items[j].item) { - this->_mdts.at(i).shop[0].items[j].item += 0x0800; - } - - if (this->_mdts.at(i).shop[0].regionals[j].item) { - this->_mdts.at(i).shop[0].regionals[j].item += 0x0800; - } - } - - output.seekg(this->_mdts[i].header.offsetShop, std::ios::beg); - writeRaw(output, this->_mdts[i].shop[0]); - - for (ImU16 j = 0; j < 12; j++) { - if (this->_mdts.at(i).shop[0].weapons[j].item) { - this->_mdts.at(i).shop[0].weapons[j].item -= 0x0800; - } - - if (this->_mdts.at(i).shop[0].armors[j].item) { - this->_mdts.at(i).shop[0].armors[j].item -= 0x0800; - } - - if (this->_mdts.at(i).shop[0].jewelry[j].item) { - this->_mdts.at(i).shop[0].jewelry[j].item -= 0x0800; - } - - if (this->_mdts.at(i).shop[0].items[j].item) { - this->_mdts.at(i).shop[0].items[j].item -= 0x0800; - } - - if (this->_mdts.at(i).shop[0].regionals[j].item) { - this->_mdts.at(i).shop[0].regionals[j].item -= 0x0800; - } - } - } - - output.close(); - } -} - -void Mdts::read() { - uint8_t readChar = 0; - std::ifstream input; - uint32_t offset = 0; - - for (const auto& p : std::filesystem::directory_iterator(this->_directory)) { - if (std::filesystem::is_directory(p)) { - for (const auto& q : std::filesystem::directory_iterator(p)) { - std::string filename = q.path().string(); - - if (!std::strstr(filename.c_str(), ".mdt")) { - continue; - } - - input.open(filename.c_str(), std::ios::binary); - - if (!input.is_open()) { - throw new std::exception(filename.c_str()); - } - - this->_mdts.emplace_back(MdtStruct()); - this->_mdts.back().header = readRaw(input); - - // read in map entries - this->_mdts.back().mapEntries.resize(this->_mdts.back().header.numMapEntries); - input.seekg(this->_mdts.back().header.offsetMapEntries, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().mapEntries.size(); i++) { - this->_mdts.back().mapEntries[i] = readRaw(input); - } - - // read in instances - this->_mdts.back().instances.resize(this->_mdts.back().header.numInstances); - input.seekg(this->_mdts.back().header.offsetInstances, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().instances.size(); i++) { - this->_mdts.back().instances[i] = readRaw(input); - } - - // read in HTA - this->_mdts.back().HTA.resize(this->_mdts.back().header.numHTA); - input.seekg(this->_mdts.back().header.offsetHTA, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().HTA.size(); i++) { - this->_mdts.back().HTA[i] = readRaw(input); - } - - // read in enemy positions - this->_mdts.back().enemyPositions.resize(this->_mdts.back().header.numEnemyPos); - input.seekg(this->_mdts.back().header.offsetEnemyPos, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().enemyPositions.size(); i++) { - this->_mdts.back().enemyPositions[i] = readRaw(input); - } - - // read in enemy groups - this->_mdts.back().enemyGroups.resize(this->_mdts.back().header.numEnemyGroup); - input.seekg(this->_mdts.back().header.offsetEnemyGroup, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().enemyGroups.size(); i++) { - this->_mdts.back().enemyGroups[i] = readRaw(input); - } - - // read in MOS - this->_mdts.back().MOS.resize(this->_mdts.back().header.numMOS); - input.seekg(this->_mdts.back().header.offsetMOS, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().MOS.size(); i++) - this->_mdts.back().MOS[i] = readRaw(input); - - // read in icons - this->_mdts.back().icons.resize(this->_mdts.back().header.numIcons); - input.seekg(this->_mdts.back().header.offsetIcons, std::ios::beg); - for (size_t i = 0; i < this->_mdts.back().icons.size(); i++) { - this->_mdts.back().icons[i] = readRaw(input); - } - - - // read in shop - if (this->_mdts.back().header.offsetShop) { - this->_mdts.back().shop.resize(1); - input.seekg(this->_mdts.back().header.offsetShop, std::ios::beg); - - this->_mdts.back().shop[0] = readRaw(input); - - for (ImU16 i = 0; i < 12; i++) { - if (this->_mdts.back().shop[0].weapons[i].item) { - this->_mdts.back().shop[0].weapons[i].item -= 0x0800; - } - - if (this->_mdts.back().shop[0].armors[i].item) { - this->_mdts.back().shop[0].armors[i].item -= 0x0800; - } - - if (this->_mdts.back().shop[0].jewelry[i].item) { - this->_mdts.back().shop[0].jewelry[i].item -= 0x0800; - } - - if (this->_mdts.back().shop[0].items[i].item) { - this->_mdts.back().shop[0].items[i].item -= 0x0800; - } - - if (this->_mdts.back().shop[0].regionals[i].item) { - this->_mdts.back().shop[0].regionals[i].item -= 0x0800; - } - } - } - - input.seekg(0x78, std::ios::beg); - uint32_t sectionLength = readRaw(input); - uint32_t sectionOffset = readRaw(input); - - // dialogue section exists, lets do our thing - if (sectionLength && sectionOffset) { - input.seekg(sectionOffset, std::ios::beg); - uint32_t diagHeaderSize = readRaw(input); - input.seekg(sectionOffset, std::ios::beg); - - for (size_t offset = 10; offset < diagHeaderSize; offset += 4) { - input.seekg(offset, std::ios::cur); - uint16_t diagOffset = readRaw(input); - // check if it's padding, if so, ignore it - if (diagOffset == 0xFFFF) { - continue; - } - input.seekg(sectionOffset + diagHeaderSize, std::ios::beg); - input.seekg(diagOffset * 8, std::ios::cur); - - // check if it's the proper bytecode for a map name textbox - if ((readRaw(input) == (uint8_t)0x17) && (readRaw(input) == (uint8_t)0x80)) { - input.seekg(2, std::ios::cur); - readChar = readRaw(input); - while (readChar != 0x17) { - this->_mdts.back().mapname.push_back(readChar); - readChar = readRaw(input); - } - - // anything that contains the string "to " is not the current map name - if (this->_mdts.back().mapname.find("to ") != std::string::npos) { - this->_mdts.back().mapname.erase(this->_mdts.back().mapname.begin(), this->_mdts.back().mapname.end()); - input.seekg(sectionOffset, std::ios::beg); - continue; - } - else break; - - } - else { - input.seekg(sectionOffset, std::ios::beg); - } - - } - - } - - this->_mdts.back().filename = filename; - this->_mdts.back().filenameChr = filename.substr(0, filename.length() - 4) + ".chr"; - - input.close(); - } - } - } -} - -void Mdts::draw() { - ImGui::Begin("AREAS"); - - if (ImGui::Button("Save")) { - this->write(); - } - - if (ImGui::BeginCombo("MDT Index", this->_mdts.at(this->_mdtIndex).mapname.c_str())) { - for (size_t i = 0; i < this->_mdts.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdtIndex); - if (ImGui::Selectable(this->_mdts.at(i).mapname.c_str(), is_selected)) { - this->_mdtIndex = i; - this->_mapEntryIndex = 0; - this->_instanceIndex = 0; - this->_htaIndex = 0; - this->_ePosIndex = 0; - this->_eGroupIndex = 0; - this->_eGroupPosIndex = 0; - this->_mosIndex = 0; - this->_iconIndex = 0; - this->_shopIndex = 0; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (this->_mdts.at(this->_mdtIndex).mapEntries.size()) { - if (ImGui::CollapsingHeader("Map Entries")) { - if (ImGui::BeginCombo("Map Entry #", std::to_string(this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].ID).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).mapEntries.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mapEntryIndex); - if (ImGui::Selectable(std::to_string(this->_mdts.at(this->_mdtIndex).mapEntries[i].ID).c_str(), is_selected)) { - this->_mapEntryIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Connected Map", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].ID); - drawInputN("X/Y/Z Position", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].xPos, 3); - drawInput("Direction", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].direction); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].unknown); - drawInput("Unknown #2", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].unknown1); - drawInput("Unknown #3", &this->_mdts.at(this->_mdtIndex).mapEntries[this->_mapEntryIndex].unknown2); - } - } - - if (this->_mdts.at(this->_mdtIndex).instances.size()) { - if (ImGui::CollapsingHeader("Instances")) { - if (ImGui::BeginCombo("Instance #", std::to_string(this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].ID).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).mapEntries.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_instanceIndex); - if (ImGui::Selectable(std::to_string(this->_mdts.at(this->_mdtIndex).instances[i].ID).c_str(), is_selected)) { - this->_instanceIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("ID", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].ID); - drawInput("Index", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].index); - drawInput("Unknown", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].unknown); - drawInput("Translation", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].translation); - drawInputN("X/Y/Z Position", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].xPos, 3); - drawInputN("X/Y/Z Angle", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].xAngle, 3); - drawInputN("CX/CY/CZ", &this->_mdts.at(this->_mdtIndex).instances[this->_instanceIndex].cx, 3); - } - } - - if (this->_mdts.at(this->_mdtIndex).HTA.size()) { - if (ImGui::CollapsingHeader("HTA")) { - if (ImGui::BeginCombo("HTA #", std::format("HTA {}", this->_htaIndex + 1).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).HTA.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_htaIndex); - if (ImGui::Selectable(std::format("HTA {}", i + 1).c_str(), is_selected)) { - this->_htaIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Shape", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].shape); - drawInput("Type", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].type); - drawInput("Trigger", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].trigger); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown); - drawInput("Unknown #2", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown1); - drawInputN("X/Y/Z Min", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].xMin, 3); - drawInputN("X/Y/Z Max", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].xMax, 3); - drawInput("Unknown #3", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown2); - drawInput("Unknown #4", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown3); - drawInput("Unknown #5", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown4); - drawInput("Unknown #6", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown5); - drawInput("Unknown #7", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown6); - drawInput("Unknown #8", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown7); - drawInput("Unknown #9", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown8); - drawInput("Unknown #10", &this->_mdts.at(this->_mdtIndex).HTA[this->_htaIndex].unknown9); - } - } - - if (this->_mdts.at(this->_mdtIndex).enemyPositions.size()) { - if (ImGui::CollapsingHeader("Enemy Positions")) { - if (ImGui::BeginCombo("Enemy Pos #", std::format("Enemy Position {}", this->_ePosIndex + 1).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).enemyPositions.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_ePosIndex); - if (ImGui::Selectable(std::format("Enemy Position {}", i + 1).c_str(), is_selected)) { - this->_ePosIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Index", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].index); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].unknown); - drawInputN("X/Z Min", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].xPosMin, 2); - drawInputN("X/Z Max", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].xPosMax, 2); - drawInputN("X/Y/Z Pos", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].xPos, 3); - drawInputN("X/Y/Z #1", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].unknownX, 3); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #2", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].unknownX1, 3); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #3", &this->_mdts.at(this->_mdtIndex).enemyPositions[this->_ePosIndex].unknownX2, 3); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - } - } - - if (this->_mdts.at(this->_mdtIndex).enemyGroups.size()) { - if (ImGui::CollapsingHeader("Enemy Groups")) { - if (ImGui::BeginCombo("Enemy Group #", std::format("Enemy Group {}", this->_eGroupIndex + 1).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).enemyGroups.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_eGroupIndex); - if (ImGui::Selectable(std::format("Enemy Group {}", i + 1).c_str(), is_selected)) { - this->_eGroupIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Group Index", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].index); - - if (ImGui::BeginCombo("Enemy #", std::format("Enemy {}", this->_eGroupPosIndex + 1).c_str())) { - // there can only ever be 4 unique enemies in a group, as far as I can tell - for (size_t i = 0; i < 4; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_eGroupPosIndex); - if (ImGui::Selectable(std::format("Enemy {}", i+ 1).c_str(), is_selected)) { - this->_eGroupPosIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Enemy Index", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].index); - drawInput("# of Enemy", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].numEnemy); - drawInput("Enemy Offset", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].enemyOffset); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("References enemy/boss.csv"); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].unknown); - drawInput("Unknown #2", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].unknown1); - drawInput("Unknown #3", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].unknown2); - drawInput("Unknown #4", &this->_mdts.at(this->_mdtIndex).enemyGroups[this->_eGroupIndex].enemies[this->_eGroupPosIndex].unknown3); - } - } - - if (this->_mdts.at(this->_mdtIndex).MOS.size()) { - if (ImGui::CollapsingHeader("MOS")) { - if (ImGui::BeginCombo("MOS #", std::format("MOS {}", this->_mosIndex + 1).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).MOS.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mosIndex); - if (ImGui::Selectable(std::format("MOS {}", i + 1).c_str(), is_selected)) { - this->_mosIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("ID", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].ID); - drawInput("Index", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].index); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown); - drawInputN("X/Y/Z Pos", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].xPos, 3); - drawInput("Unknown #2", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown1); - drawInput("Unknown #3", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown2); - drawInput("Unknown #4", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown3); - drawInput("Unknown #5", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown4); - drawInput("Unknown #6", &this->_mdts.at(this->_mdtIndex).MOS[this->_mosIndex].unknown5); - } - } - - if (this->_mdts.at(this->_mdtIndex).icons.size()) { - if (ImGui::CollapsingHeader("Icons")) { - if (ImGui::BeginCombo("Icon #", std::format("Icon {}", this->_iconIndex + 1).c_str())) { - for (size_t i = 0; i < this->_mdts.at(this->_mdtIndex).icons.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_iconIndex); - if (ImGui::Selectable(std::format("Icon {}", i + 1).c_str(), is_selected)) { - this->_iconIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("ID", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].ID); - drawInput("Unknown #1", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].unknown); - drawInput("Unknown #2", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].unknown1); - drawInputN("X/Y/Z Pos", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].xPos, 3); - drawInput("Unknown #3", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].unknown2); - drawInput("Y Angle", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].yAngle); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unsure"); - - if (ImGui::BeginCombo("Item #1", this->_items->at(this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item1).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item1); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item1 = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Item #2", this->_items->at(this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item2).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item2); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) - this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item2 = (uint16_t)i; - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Item #3", this->_items->at(this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item3).name)) { - - for (size_t i = 0; i < this->_items->size(); i++) { - - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item3); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].item3 = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Flag", &this->_mdts.at(this->_mdtIndex).icons[this->_iconIndex].flag); - } - } - - if (this->_mdts.at(this->_mdtIndex).shop.size()) { - if (ImGui::CollapsingHeader("Shops")) { - if (ImGui::BeginCombo("Weapons #", std::format("Weapons {}", this->_shopWeaponIndex + 1).c_str())) { - for (size_t i = 0; i < 12; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_shopWeaponIndex); - if (ImGui::Selectable(std::format("Weapons {}", i + 1).c_str(), is_selected)) { - this->_shopWeaponIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Weapon Item", this->_items->at(this->_mdts.at(this->_mdtIndex).shop[0].weapons[this->_shopWeaponIndex].item).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).shop[0].weapons[this->_shopWeaponIndex].item); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).shop[0].weapons[this->_shopWeaponIndex].item = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Armors #", std::format("Armors {}", this->_shopArmorIndex + 1).c_str())) { - for (size_t i = 0; i < 12; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_shopArmorIndex); - if (ImGui::Selectable(std::format("Armors {}", i + 1).c_str(), is_selected)) { - this->_shopArmorIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Armor Item", this->_items->at(this->_mdts.at(this->_mdtIndex).shop[0].armors[this->_shopArmorIndex].item).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).shop[0].armors[this->_shopArmorIndex].item); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).shop[0].armors[this->_shopArmorIndex].item = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Jewelry #", std::format("Jewelry {}", this->_shopJewelIndex + 1).c_str())) { - for (size_t i = 0; i < 12; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_shopJewelIndex); - if (ImGui::Selectable(std::format("Jewelry {}", i + 1).c_str(), is_selected)) { - this->_shopJewelIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Jewelry Item", this->_items->at(this->_mdts.at(this->_mdtIndex).shop[0].jewelry[this->_shopJewelIndex].item).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).shop[0].jewelry[this->_shopJewelIndex].item); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).shop[0].jewelry[this->_shopJewelIndex].item = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Items #", std::format("Item {}", this->_shopItemIndex + 1).c_str())) { - for (size_t i = 0; i < 12; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_shopItemIndex); - if (ImGui::Selectable(std::format("Item {}", i + 1).c_str(), is_selected)) { - this->_shopItemIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Item Item", this->_items->at(this->_mdts.at(this->_mdtIndex).shop[0].items[this->_shopItemIndex].item).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).shop[0].items[this->_shopItemIndex].item); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).shop[0].items[this->_shopItemIndex].item = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Regionals #", std::format("Regionals {}", this->_shopRegionalIndex + 1).c_str())) { - for (size_t i = 0; i < 12; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_shopRegionalIndex); - if (ImGui::Selectable(std::format("Regionals {}", i + 1).c_str(), is_selected)) { - this->_shopRegionalIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Regional Item", this->_items->at(this->_mdts.at(this->_mdtIndex).shop[0].regionals[this->_shopRegionalIndex].item).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_mdts.at(this->_mdtIndex).shop[0].regionals[this->_shopRegionalIndex].item); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_mdts.at(this->_mdtIndex).shop[0].regionals[this->_shopRegionalIndex].item = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - } - } - - // we are ignoring models for now until we understand the NJCM format - //drawModel(models, &mdt[mapID], canClose); - - ImGui::End(); - -} - -void Mdts::outputToCSV() { - std::ofstream output; - output.open("./csv/MAP_NAMES.CSV"); - output << "File,Map\n"; - - for (const auto& val : this->_mdts) { - output << val.filename << ",\"" << val.mapname << "\"\n"; - } - - output.close(); -} - -void Mdts::randomize() { - std::random_device rd; - std::mt19937 g(rd()); - - for (auto& mdt : this->_mdts) { - for (auto& icon : mdt.icons) { - if (icon.item1) { - do { - icon.item1 = (uint16_t)(g() % this->_items->size()); - } while (std::string(this->_items->at(icon.item1).name).find_first_not_of(' ') == std::string::npos); - } - - if (icon.item2) { - do { - icon.item2 = (uint16_t)(g() % this->_items->size()); - } while (std::string(this->_items->at(icon.item2).name).find_first_not_of(' ') == std::string::npos); - - } - - if (icon.item3) { - do { - icon.item3 = (uint16_t)(g() % this->_items->size()); - } while (std::string(this->_items->at(icon.item3).name).find_first_not_of(' ') == std::string::npos); - } - } - - for (auto& shop : mdt.shop) { - // weapons - for (size_t i = 0; i < 12; i++) { - do { - shop.weapons[i].item = 300 + g() % 200; - } while (std::string(this->_items->at(shop.weapons[i].item).name).find_first_not_of(' ') == std::string::npos); - } - - // armors - for (size_t i = 0; i < 12; i++) { - do { - shop.armors[i].item = 500 + g() % 200; - } while (std::string(this->_items->at(shop.armors[i].item).name).find_first_not_of(' ') == std::string::npos); - } - - // accessories - for (size_t i = 0; i < 12; i++) { - do { - shop.jewelry[i].item = 700 + g() % 99; - } while (std::string(this->_items->at(shop.jewelry[i].item).name).find_first_not_of(' ') == std::string::npos); - } - - // items - for (size_t i = 0; i < 12; i++) { - do { - shop.items[i].item = 100 + g() % 100; - } while (std::string(this->_items->at(shop.items[i].item).name).find_first_not_of(' ') == std::string::npos); - } - - // regionals - for (size_t i = 0; i < 12; i++) { - do { - shop.regionals[i].item = 200 + g() % 100; - } while (std::string(this->_items->at(shop.regionals[i].item).name).find_first_not_of(' ') == std::string::npos); - } - } - } -} \ No newline at end of file diff --git a/src/MovesClass.cpp b/src/MovesClass.cpp deleted file mode 100644 index 0dd4dd8..0000000 --- a/src/MovesClass.cpp +++ /dev/null @@ -1,309 +0,0 @@ -#include -#include -#include -#include -#include - -#include "./include/MovesClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Moves::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("MS_PARAM.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_moves.size(); i++) { - this->_moves.at(i).icon++; // icon is offset by 1, adjust first - this->_moves.at(i).stats.atkMod %= 6; // stat changes are limited to between -5 and 5 - this->_moves.at(i).stats.defMod %= 6; - this->_moves.at(i).stats.actMod %= 6; - this->_moves.at(i).stats.movMod %= 6; - - writeRaw(output, this->_moves.at(i).id); - writeRaw(output, this->_moves.at(i).icon); - output.write((char*)this->_moves[i].name, 18); - writeRaw(output, this->_moves.at(i).stats); - output.write((char*)this->_moves.at(i).description, 40); - - this->_moves.at(i).icon--; - } - - output.close(); -} - -void Moves::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("MS_PARAM.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - this->_moves.resize(fileSize / 108); // entries are 108 bytes long - - for (int i = 0; i < this->_moves.size(); i++) { - readRaw(input); - this->_moves.at(i).id = i; // overwrite all IDs, we want them to be equal to the offset of the entry in the file - - this->_moves.at(i).icon = readRaw(input); - - // strings are not null terminated, we cannot read them from the file like everything else - input.read(&this->_moves.at(i).name[0], 18); - replaceNulls(this->_moves.at(i).name, 18); - - this->_moves[i].stats = readRaw(input); - - input.read(&this->_moves.at(i).description[0], 40); - replaceNulls(this->_moves.at(i).description, 40); - - if (this->_moves.at(i).icon != 0) { - this->_moves.at(i).icon--; - } - } - - input.close(); - - // set default starting state - if (this->_moves.size()) { - for (size_t i = 0; i < 8; i++) { - this->AilmentBitFlags[i] = (this->_moves.at(0).stats.ailmentsBitflag & (1 << i)) > 0; - } - } -} - -void Moves::draw() { - ImGui::Begin("MS_PARAM"); - - auto iconDefs = JsonDefinitions::getInstance().getDefinitions("icons"); - auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); - auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); - auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); - auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); - auto statusDefs = JsonDefinitions::getInstance().getDefinitions("statuses"); - - if (ImGui::Button("Save")) { - this->write(); - } - - ImGui::SameLine(); - if (ImGui::Button("Copy")) { - copyObj(&this->_moves.at(this->_moveIndex), "Move"); - } - - ImGui::SameLine(); - if (ImGui::Button("Paste")) { - if (checkObjType("Move")) { - this->_moves.at(this->_moveIndex) = *((MoveStruct*)pasteObj()); - - for (size_t i = 0; i < 8; i++) { - AilmentBitFlags[i] = this->_moves.at(this->_moveIndex).stats.ailmentsBitflag & (1 << i); - } - } - } - - if (ImGui::BeginCombo("Move Index", this->_moves.at(this->_moveIndex).name)) { - for (size_t i = 0; i < this->_moves.size() - 1; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moveIndex); - if (ImGui::Selectable(this->_moves.at(i).name, is_selected)) { - this->_moveIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - for (size_t i = 0; i < 8; i++) { - AilmentBitFlags[i] = this->_moves.at(this->_moveIndex).stats.ailmentsBitflag & (1 << i); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Icon", iconDefs.at(this->_moves.at(this->_moveIndex).icon).c_str())) { - for (size_t i = 0; i < iconDefs.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moves.at(this->_moveIndex).icon); - if (ImGui::Selectable(iconDefs.at(i).c_str(), is_selected)) { - this->_moves.at(this->_moveIndex).icon = (uint8_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - ImGui::InputText("Name", this->_moves.at(this->_moveIndex).name, 19); - drawInput("Cost", &this->_moves.at(this->_moveIndex).stats.cost); - - if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(this->_moves.at(this->_moveIndex).stats.targetEffect).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moves.at(this->_moveIndex).stats.targetEffect); - if (ImGui::Selectable(targetEffectDefs.at(i).c_str(), is_selected)) { - this->_moves.at(this->_moveIndex).stats.targetEffect = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(this->_moves.at(this->_moveIndex).stats.targetType).c_str())) { - for (uint8_t i = 0; i < 16; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moves.at(this->_moveIndex).stats.targetType); - if (ImGui::Selectable(targetTypeDefs.at(i).c_str(), is_selected)) { - this->_moves.at(this->_moveIndex).stats.targetType = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Strength", &this->_moves.at(this->_moveIndex).stats.str); - drawInput("Power", &this->_moves.at(this->_moveIndex).stats.pow); - drawInput("Range", &this->_moves.at(this->_moveIndex).stats.range); - drawInputN("Cast Time Lv1/Lv5", &this->_moves.at(this->_moveIndex).stats.cast1, 2); - drawInput("Recovery", &this->_moves.at(this->_moveIndex).stats.recovery); - - if (ImGui::BeginCombo("Animation", animationDefs.at(this->_moves.at(this->_moveIndex).stats.animation).c_str())) { - for (size_t i = 0; i < this->_moves.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moves.at(this->_moveIndex).stats.animation); - if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { - this->_moves.at(this->_moveIndex).stats.animation = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Unknown #1", &this->_moves.at(this->_moveIndex).stats.unknown1); - drawInput("Knockdown", &this->_moves.at(this->_moveIndex).stats.knockDown); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Will this move knockdown those hit?"); - drawInputN("IP Stun/IP Cancel Stun", &this->_moves.at(this->_moveIndex).stats.ipStun, 2); - drawInput("Knockback", &this->_moves.at(this->_moveIndex).stats.knockback); - if (ImGui::IsItemHovered()) ImGui::SetTooltip("How much move will knockback those hit."); - - if (ImGui::BeginCombo("Element", elementDefs.at(this->_moves.at(this->_moveIndex).stats.element).c_str())) { - for (uint8_t i = 0; i < 5; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moves.at(this->_moveIndex).stats.element); - if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { - this->_moves.at(this->_moveIndex).stats.element = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Element Strength", &this->_moves.at(this->_moveIndex).stats.elementStr); - - for (size_t i = 0; i < 8; i++) { - if (ImGui::Checkbox(statusDefs.at(i).c_str(), &AilmentBitFlags[i])) { - this->_moves.at(this->_moveIndex).stats.ailmentsBitflag ^= (1 << i); - } - if ((i+1) % 4) { - ImGui::SameLine(); - } - } - - drawInput("Ailments Chance", &this->_moves.at(this->_moveIndex).stats.ailmentsChance); - drawInputN("Atk/Def/Act/Mov Mods", &this->_moves.at(this->_moveIndex).stats.atkMod, 4); - drawInput("Special", &this->_moves.at(this->_moveIndex).stats.special); - drawInput("Coin Cost Lv1", &this->_moves.at(this->_moveIndex).stats.coinCost1); - drawInput("Coin Cost Lv2", &this->_moves.at(this->_moveIndex).stats.coinCost2); - drawInput("Coin Cost Lv3", &this->_moves.at(this->_moveIndex).stats.coinCost3); - drawInput("Coin Cost Lv4", &this->_moves.at(this->_moveIndex).stats.coinCost4); - drawInput("Coin Cost Lv5", &this->_moves.at(this->_moveIndex).stats.coinCost5); - drawInput("Multiplier", &this->_moves.at(this->_moveIndex).stats.multiplier); - ImGui::InputText("Description", this->_moves.at(this->_moveIndex).description, 41); - - ImGui::End(); -} - -void Moves::outputToCSV() { - auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); - auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); - auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); - std::ofstream output; - output.open("./csv/MS_PARAM.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Index,Icon,Name,Cost,Target Effect,Target Type,Strength,Power,Range,Cast Lv1,Cast Lv5,Recovery,Animation,???,Knockdown,IP Damage,IP Cancel Damage,Knockback,Element,Element Strength,Status Effect Bitflag," - << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special Effect,Cost Lv1,Cost Lv2,Cost Lv3,Cost Lv4,Cost Lv5,Power Multiplier,Description\n"; - - for (const auto& val : this->_moves) { - output << std::to_string(val.id) << ',' - << std::to_string(val.icon) << ',' - << val.name << ',' - << std::to_string(val.stats.cost) << ',' - << targetEffectDefs.at(val.stats.targetEffect) << ',' - << targetTypeDefs.at(val.stats.targetType) << ',' - << std::to_string(val.stats.str) << ',' - << std::to_string(val.stats.pow) << ',' - << std::to_string(val.stats.range) << ',' - << std::to_string(val.stats.cast1) << ',' - << std::to_string(val.stats.cast5) << ',' - << std::to_string(val.stats.recovery) << ',' - << this->_moves.at(val.stats.animation).name << ',' - << std::to_string(val.stats.unknown1) << ',' - << std::to_string(val.stats.knockDown) << ',' - << std::to_string(val.stats.ipStun) << ',' - << std::to_string(val.stats.ipCancelStun) << ',' - << std::to_string(val.stats.knockback) << ',' - << elementDefs.at(val.stats.element) << ',' - << std::to_string(val.stats.elementStr) << ',' - << std::to_string(val.stats.ailmentsBitflag) << ',' - << std::to_string(val.stats.ailmentsChance) << ',' - << std::to_string(val.stats.atkMod) << ',' - << std::to_string(val.stats.defMod) << ',' - << std::to_string(val.stats.actMod) << ',' - << std::to_string(val.stats.movMod) << ',' - << std::to_string(val.stats.special) << ',' - << std::to_string(val.stats.coinCost1) << ',' - << std::to_string(val.stats.coinCost2) << ',' - << std::to_string(val.stats.coinCost3) << ',' - << std::to_string(val.stats.coinCost4) << ',' - << std::to_string(val.stats.coinCost5) << ',' - << std::to_string(val.stats.multiplier) << ',' - << val.description << '\n'; - } - - output.close(); -} \ No newline at end of file diff --git a/src/SkillBooksClass.cpp b/src/SkillBooksClass.cpp deleted file mode 100644 index 0036c15..0000000 --- a/src/SkillBooksClass.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include -#include -#include -#include - -#include "./include/SkillBooksClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void SkillBooks::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("TB_SKILL.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_skillbooks.size(); i++) { - for (size_t j = 0; j < 6; j++) { - writeRaw(output, this->_skillbooks.at(i).skills[j]); - } - } - - output.close(); -} - -void SkillBooks::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("TB_SKILL.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - - this->_skillbooks.resize(fileSize / 24); // entries are 24 bytes long(each skill is 4 bytes long, 6 skills per book) - - for (size_t i = 0; i < this->_skillbooks.size(); i++) { - for (size_t j = 0; j < 6; j++) { - this->_skillbooks.at(i).skills[j] = readRaw(input); - } - } - - input.close(); -} - -void SkillBooks::draw() { - ImGui::Begin("SKILLBOOKS"); - - auto bookDefs = JsonDefinitions::getInstance().getDefinitions("books"); - - if (ImGui::Button("Save")) { - this->write(); - } - - if (ImGui::BeginCombo("SkillBook Index", bookDefs.at(this->_bookIndex).c_str())) { - for (size_t i = 0; i < this->_skillbooks.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_bookIndex); - if (ImGui::Selectable(bookDefs.at(i).c_str(), is_selected)) { - this->_bookIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Index", std::format("Index {}", this->_skillIndex + 1).c_str())) { - for (size_t i = 0; i < 6; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_skillIndex); - if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { - this->_skillIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Skill", this->_skills->at(this->_skillbooks.at(this->_bookIndex).skills[this->_skillIndex].skillOffset).name)) { - for (size_t i = 0; i < this->_skills->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_skillbooks.at(this->_bookIndex).skills[this->_skillIndex].skillOffset); - if (ImGui::Selectable(this->_skills->at(i).name, is_selected)) { - this->_skillbooks.at(this->_bookIndex).skills[this->_skillIndex].skillOffset = (uint8_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Starting Level", &this->_skillbooks[this->_bookIndex].skills[this->_skillIndex].startingLevel); - drawInput("Book Level Required", &this->_skillbooks[this->_bookIndex].skills[this->_skillIndex].bookLevelRequired); - drawInput("Unknown #1", &this->_skillbooks[this->_bookIndex].skills[this->_skillIndex].unknown1); - - ImGui::End(); -} - -void SkillBooks::outputToCSV() { - auto bookDefs = JsonDefinitions::getInstance().getDefinitions("books"); - std::ofstream output; - output.open("./csv/TB_SKILL.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Skillbook"; - for (size_t i = 0; i < 6; i++) { - output << ",Skill,Starting Level,Level Required,???"; - } - output << '\n'; - - for (size_t i = 0; i < this->_skillbooks.size(); i++) { - output << bookDefs.at(i); - - for (size_t j = 0; j < 6; j++) { - output << ',' << this->_skills->at(this->_skillbooks.at(i).skills[j].skillOffset).name - << ',' << std::to_string(this->_skillbooks.at(i).skills[j].startingLevel) - << ',' << std::to_string(this->_skillbooks.at(i).skills[j].bookLevelRequired) - << ',' << std::to_string(this->_skillbooks.at(i).skills[j].unknown1); - } - - output << '\n'; - } - - output.close(); -} - -void SkillBooks::randomize() { - std::random_device rd; - std::mt19937 g(rd()); - - for (auto& skillbook : this->_skillbooks) { - for (size_t i = 0; i < 6; i++) { - do { - skillbook.skills[i].skillOffset = (uint8_t)(g() % (this->_skills->size() - 1)) + 1; - } while (std::string(this->_skills->at(skillbook.skills[i].skillOffset).name).find_first_not_of(' ') == std::string::npos); - - skillbook.skills[i].startingLevel = (g() % 2) ? g() % 6 : 0; - if (skillbook.skills[i].startingLevel == 0) { - skillbook.skills[i].bookLevelRequired = g() % 16; - } - } - } -} \ No newline at end of file diff --git a/src/SkillsClass.cpp b/src/SkillsClass.cpp deleted file mode 100644 index fab0ea0..0000000 --- a/src/SkillsClass.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include -#include -#include -#include -#include - -#include "./include/SkillsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Skills::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("SK_PARAM.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_skills.size(); i++) { - output.write((char*)this->_skills.at(i).name, 18); - writeRaw(output, this->_skills.at(i).stats); - output.write((char*)this->_skills.at(i).description, 40); - } - - output.close(); -} - -void Skills::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("SK_PARAM.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - - this->_skills.resize(fileSize / 104); //entries are 104 bytes long - - for (size_t i = 0; i < this->_skills.size(); i++) { - input.read(this->_skills.at(i).name, 18); - this->_skills.at(i).stats = readRaw(input); - input.read(this->_skills.at(i).description, 40); - } - - input.close(); -} - -void Skills::draw() { - ImGui::Begin("SKILLS"); - - if (ImGui::Button("Save")) { - this->write(); - } - - ImGui::SameLine(); - if (ImGui::Button("Copy")) { - copyObj(&this->_skills.at(this->_skillIndex), "Skill"); - } - - ImGui::SameLine(); - if (ImGui::Button("Paste") && checkObjType("Skill")) { - this->_skills.at(this->_skillIndex) = *((SkillStruct*)pasteObj()); - } - - if (ImGui::BeginCombo("Skill Index", this->_skills.at(this->_skillIndex).name)) { - for (size_t i = 0; i < this->_skills.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_skillIndex); - if (ImGui::Selectable(this->_skills.at(i).name, is_selected)) { - this->_skillIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - ImGui::InputText("Name", this->_skills.at(this->_skillIndex).name, 19); - drawInput("Cost Type #1", &this->_skills.at(this->_skillIndex).stats.cost1); - drawInput("Cost Type #2", &this->_skills.at(this->_skillIndex).stats.cost2); - drawInput("Base HP", &this->_skills.at(this->_skillIndex).stats.baseHp); - drawInput("Base MP", &this->_skills.at(this->_skillIndex).stats.baseMp); - drawInput("Base SP", &this->_skills.at(this->_skillIndex).stats.baseSp); - drawInput("Base STR", &this->_skills.at(this->_skillIndex).stats.baseStr); - drawInput("Base VIT", &this->_skills.at(this->_skillIndex).stats.baseVit); - drawInput("Base ACT", &this->_skills.at(this->_skillIndex).stats.baseAct); - drawInput("Base MOV", &this->_skills.at(this->_skillIndex).stats.baseMov); - drawInput("Base MAG", &this->_skills.at(this->_skillIndex).stats.baseMag); - drawInput("Base MEN", &this->_skills.at(this->_skillIndex).stats.baseMen); - drawInput("Unknown #1", &this->_skills.at(this->_skillIndex).stats.unknown1); - drawInput("Unknown #2", &this->_skills.at(this->_skillIndex).stats.unknown2); - drawInput("Unknown #3", &this->_skills.at(this->_skillIndex).stats.unknown3); - drawInput("Unknown #4", &this->_skills.at(this->_skillIndex).stats.unknown4); - drawInput("Unknown #5", &this->_skills.at(this->_skillIndex).stats.unknown5); - drawInput("Increase Fire %", &this->_skills.at(this->_skillIndex).stats.increaseFirePercent); - drawInput("Increase Wind %", &this->_skills.at(this->_skillIndex).stats.increaseWindPercent); - drawInput("Increase Earth %", &this->_skills.at(this->_skillIndex).stats.increaseEarthPercent); - drawInput("Increase Lightning %", &this->_skills.at(this->_skillIndex).stats.increaseLightningPercent); - drawInput("Increase Blizzard %", &this->_skills.at(this->_skillIndex).stats.increaseBlizzardPercent); - drawInput("Increase Water %", &this->_skills.at(this->_skillIndex).stats.increaseWaterPercent); - drawInput("Increase Explosion %", &this->_skills.at(this->_skillIndex).stats.increaseExplosionPercent); - drawInput("Increase Forest %", &this->_skills.at(this->_skillIndex).stats.increaseForestPercent); - drawInput("Special", &this->_skills.at(this->_skillIndex).stats.special); - drawInput("Coin Cost Lv1", &this->_skills.at(this->_skillIndex).stats.coinCost1); - drawInput("Coin Cost Lv2", &this->_skills.at(this->_skillIndex).stats.coinCost2); - drawInput("Coin Cost Lv3", &this->_skills.at(this->_skillIndex).stats.coinCost3); - drawInput("Coin Cost Lv4", &this->_skills.at(this->_skillIndex).stats.coinCost4); - drawInput("Coin Cost Lv5", &this->_skills.at(this->_skillIndex).stats.coinCost5); - drawInput("Multiplier", &this->_skills.at(this->_skillIndex).stats.multiplier); - ImGui::InputText("Description", this->_skills.at(this->_skillIndex).description, 41); - - ImGui::End(); -} - -void Skills::outputToCSV() { - std::ofstream output; - output.open("./csv/SK_PARAM.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Name,Cost Type,Cost Type,Base HP Inc,Base MP Inc,Base SP Inc,Base STR Inc,Base VIT Inc,Base ACT Inc,Base MOV Inc,Base MAG Inc,Base MEN Inc,???,???,???,???,???," - << "Fire Pow Inc %,Wind Pow Inc %,Earth Pow Inc %,Blizzard Pow Inc %,Water Pow Inc %,Explosion Pow Inc %,Forest Pow Inc %,Special,Cost Lv1,Cost Lv2,Cost Lv3,Cost Lv4,Cost Lv5,Multiplier,Description\n"; - - for (const auto& val : this->_skills) { - output << val.name << ',' - << std::to_string(val.stats.cost1) << ',' - << std::to_string(val.stats.cost2) << ',' - << std::to_string(val.stats.baseHp) << ',' - << std::to_string(val.stats.baseMp) << ',' - << std::to_string(val.stats.baseSp) << ',' - << std::to_string(val.stats.baseStr) << ',' - << std::to_string(val.stats.baseVit) << ',' - << std::to_string(val.stats.baseAct) << ',' - << std::to_string(val.stats.baseMov) << ',' - << std::to_string(val.stats.baseMag) << ',' - << std::to_string(val.stats.baseMen) << ',' - << std::to_string(val.stats.unknown1) << ',' - << std::to_string(val.stats.unknown2) << ',' - << std::to_string(val.stats.unknown3) << ',' - << std::to_string(val.stats.unknown4) << ',' - << std::to_string(val.stats.unknown5) << ',' - << std::to_string(val.stats.increaseFirePercent) << ',' - << std::to_string(val.stats.increaseWindPercent) << ',' - << std::to_string(val.stats.increaseEarthPercent) << ',' - << std::to_string(val.stats.increaseBlizzardPercent) << ',' - << std::to_string(val.stats.increaseWaterPercent) << ',' - << std::to_string(val.stats.increaseExplosionPercent) << ',' - << std::to_string(val.stats.increaseForestPercent) << ',' - << std::to_string(val.stats.special) << ',' - << std::to_string(val.stats.coinCost1) << ',' - << std::to_string(val.stats.coinCost2) << ',' - << std::to_string(val.stats.coinCost3) << ',' - << std::to_string(val.stats.coinCost4) << ',' - << std::to_string(val.stats.coinCost5) << ',' - << std::to_string(val.stats.multiplier) << ',' - << val.description << '\n'; - } - - output.close(); -} \ No newline at end of file diff --git a/src/SpecialsClass.cpp b/src/SpecialsClass.cpp deleted file mode 100644 index 7a1020f..0000000 --- a/src/SpecialsClass.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include -#include -#include -#include - -#include "./include/SpecialsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void Specials::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("TB_SPCL.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_specials.size(); i++) { - for (size_t j = 0; j < 6; j++) { - writeRaw(output, this->_specials.at(i).moves[j]); - } - } - - output.close(); -} - -void Specials::read() { - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("TB_SPCL.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - this->_specials.resize(fileSize / 24); // entries are 24 bytes long(each special is 4 bytes long, 6 specials per book) - - for (size_t i = 0; i < this->_specials.size(); i++) { - for (size_t j = 0; j < 6; j++) { - this->_specials.at(i).moves[j] = readRaw(input); - } - } - - input.close(); -} - -void Specials::draw() { - ImGui::Begin("SPECIALS"); - - auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); - - if (ImGui::Button("Save")) { - this->write(); - } - - if (ImGui::BeginCombo("Special Index", specialDefs.at(this->_specialIndex).c_str())) { - for (size_t i = 0; i < this->_specials.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_specialIndex); - if (ImGui::Selectable(specialDefs.at(i).c_str(), is_selected)) { - this->_specialIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Index", std::format("Index {}", this->_moveIndex + 1).c_str())) { - for (size_t i = 0; i < 6; i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_moveIndex); - if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { - this->_moveIndex = i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Move", this->_moves->at(this->_specials.at(this->_specialIndex).moves[this->_moveIndex].moveOffset).name)) { - for (size_t i = 0; i < this->_moves->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_specials.at(this->_specialIndex).moves[this->_moveIndex].moveOffset); - if (ImGui::Selectable(this->_moves->at(i).name, is_selected)) { - this->_specials.at(this->_specialIndex).moves[this->_moveIndex].moveOffset = (uint8_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Starting Level", &this->_specials[this->_specialIndex].moves[this->_moveIndex].startingLevel); - drawInput("Story Flag", &this->_specials[this->_specialIndex].moves[this->_moveIndex].storyFlag); - - ImGui::End(); -} - -void Specials::outputToCSV() { - auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); - std::ofstream output; - output.open("./csv/TB_SPCL.CSV"); - - if (!output.is_open()) { - return; - } - - output << "Character"; - for (size_t i = 0; i < 6; i++) { - output << ",Move,Starting Level,Story Flag"; - } - output << '\n'; - - for (size_t i = 0; i < this->_specials.size(); i++) { - output << specialDefs.at(i); - for (size_t j = 0; j < 6; j++) { - output << ',' << this->_moves->at(this->_specials.at(i).moves[j].moveOffset).name - << ',' << std::to_string(this->_specials.at(i).moves[j].startingLevel) - << ',' << std::to_string(this->_specials.at(i).moves[j].storyFlag); - } - - output << '\n'; - } - - output.close(); -} \ No newline at end of file diff --git a/src/StartStatsClass.cpp b/src/StartStatsClass.cpp deleted file mode 100644 index 75d2bfe..0000000 --- a/src/StartStatsClass.cpp +++ /dev/null @@ -1,343 +0,0 @@ -#include -#include -#include - -#include "./include/StartStatsClass.h" - -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" - -#include "./include/JsonDefinitions.h" - -#include "./include/common/imgui_wrappers.h" -#include "./imgui.h" - -void StartStats::write() { - std::ofstream output; - output.open(this->_filename, std::ios::binary); - - if (!output.is_open()) { - throw new std::exception("PC_INIT.BIN not found to be written!"); - } - - for (size_t i = 0; i < this->_startStats.size(); i++) { - writeRaw(output, this->_startStats.at(i)); - } - - output.close(); -} - -void StartStats::read() { - // Upon starting a new game, all characters gain EXP together. - // The EXP value displayed is what each character starts the game at. - std::ifstream input(this->_filename, std::ios::binary); - - if (!input.is_open()) { - throw new std::exception("PC_INIT.BIN not found to be read!"); - } - - std::filesystem::path filePath(this->_filename); - size_t fileSize = std::filesystem::file_size(filePath); - this->_startStats.resize(fileSize / 80); // entries are 80 bytes long - - for (size_t i = 0; i < this->_startStats.size(); i++) { - this->_startStats.at(i) = readRaw(input); - } - - input.close(); -} - -void StartStats::draw() { - ImGui::Begin("STARTING STATS"); - - auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); - - if (ImGui::Button("Save")) { - this->write(); - } - - if (ImGui::BeginCombo("Start Stat Index", characterDefs.at(this->_statIndex).c_str())) { - for (size_t i = 0; i < this->_startStats.size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_statIndex); - if (ImGui::Selectable(characterDefs.at(i).c_str(), is_selected)) - this->_statIndex = i; - if (is_selected) - ImGui::SetItemDefaultFocus(); - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("EXP", &this->_startStats[this->_statIndex].exp); - - if (ImGui::BeginCombo("Weapon", this->_items->at(this->_startStats.at(this->_statIndex).weapon).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).weapon); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).weapon = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Armour", this->_items->at(this->_startStats.at(this->_statIndex).armour).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).armour); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).armour = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Headgear", this->_items->at(this->_startStats.at(this->_statIndex).headgear).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).headgear); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).headgear = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Footwear", this->_items->at(this->_startStats.at(this->_statIndex).footwear).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).footwear); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).footwear = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Accessory", this->_items->at(this->_startStats.at(this->_statIndex).accessory).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).accessory); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).accessory = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Mana Egg", this->_items->at(this->_startStats.at(this->_statIndex).manaEgg).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { - ImGui::PushID((int)i); - bool is_selected = (i == this->_startStats.at(this->_statIndex).manaEgg); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_startStats.at(this->_statIndex).manaEgg = (uint16_t)i; - } - if (is_selected) { - ImGui::SetItemDefaultFocus(); - } - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - drawInput("Stamina", &this->_startStats[this->_statIndex].stamina); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("How long can they move without tiring?"); - } - - drawInput("Unknown #1", &this->_startStats[this->_statIndex].unknown1); - drawInput("Unknown #2", &this->_startStats[this->_statIndex].unknown2); - drawInput("Unknown #3", &this->_startStats[this->_statIndex].unknown3); - drawInput("Unknown #4", &this->_startStats[this->_statIndex].unknown4); - drawInput("Unknown #5", &this->_startStats[this->_statIndex].unknown5); - drawInput("Unknown #6", &this->_startStats[this->_statIndex].unknown6); - drawInput("Unknown #7", &this->_startStats[this->_statIndex].unknown7); - drawInput("Unknown #8", &this->_startStats[this->_statIndex].unknown8); - drawInput("Unknown #9", &this->_startStats[this->_statIndex].unknown9); - drawInput("Unknown #10", &this->_startStats[this->_statIndex].unknown10); - - drawInputN("IP Stun/IP Cancel Stun", &this->_startStats[this->_statIndex].ipStun, 2); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("IP Stun/IP Cancel Stun Resistance."); - } - - drawInput("Combo SP Regen", &this->_startStats[this->_statIndex].comboSpRegen); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("SP regen from combo hit."); - } - - drawInput("Critical SP Regen", &this->_startStats[this->_statIndex].critSpRegen); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("SP regen from critical hit."); - } - - drawInput("Unknown #11", &this->_startStats[this->_statIndex].unknown11); - - drawInput("Damaged SP Regen", &this->_startStats[this->_statIndex].hitSpRegen); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("SP regen from taking damage."); - } - - drawInput("Unknown #12", &this->_startStats[this->_statIndex].unknown12); - - drawInput("Still Evasion Rate", &this->_startStats[this->_statIndex].evasionStillRate); - drawInput("Move Evasion Rate", &this->_startStats[this->_statIndex].evasionMovingRate); - drawInput("Knockback Resist Rate", &this->_startStats[this->_statIndex].ResistKnockback); - - drawInput("Unknown #13", &this->_startStats[this->_statIndex].unknown13); - - drawInput("T_REC", &this->_startStats[this->_statIndex].TREC); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Time to recover from status effects(lower is better)."); - } - - drawInput("T_DMG", &this->_startStats[this->_statIndex].TDMG); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Time to recover from being hit(lower is better)?"); - } - - drawInput("Unknown #14", &this->_startStats[this->_statIndex].unknown14); - - drawInput("T_HEAL", &this->_startStats[this->_statIndex].THEAL); - - drawInput("Size", &this->_startStats[this->_statIndex].size); - - drawInput("Unknown #15", &this->_startStats[this->_statIndex].unknown15); - drawInput("Unknown #16", &this->_startStats[this->_statIndex].unknown16); - drawInput("Unknown #17", &this->_startStats[this->_statIndex].unknown17); - drawInput("Unknown #18", &this->_startStats[this->_statIndex].unknown18); - drawInput("Unknown #19", &this->_startStats[this->_statIndex].unknown19); - drawInput("Unknown #20", &this->_startStats[this->_statIndex].unknown20); - drawInput("Unknown #21", &this->_startStats[this->_statIndex].unknown21); - drawInput("Unknown #22", &this->_startStats[this->_statIndex].unknown22); - drawInput("Unknown #23", &this->_startStats[this->_statIndex].unknown23); - - ImGui::End(); -} - -void StartStats::outputToCSV() { - std::ofstream output; - output.open("./csv/PC_INIT.CSV"); - - if (!output.is_open()) { - return; - } - - output << "EXP,weapon,armor,headgear,footwear,accessory,manaegg,stamina,???,???,???,???,???,???,???,???,???,???,hit IP Stun,cancel IP Stun,combo SP regen,crit SP regen,???," - << "hit SP regen,???,evasion,moveing evasion,R_KB,???,T_REC,T_DMG,???,T_HEAL,Size,???,???,???,???,???,???,???,???,???\n"; - - for (const auto& val : this->_startStats) { - output << std::to_string(val.exp) << ',' - << this->_items->at(val.weapon).name << ',' - << this->_items->at(val.armour).name << ',' - << this->_items->at(val.headgear).name << ',' - << this->_items->at(val.footwear).name << ',' - << this->_items->at(val.accessory).name << ',' - << this->_items->at(val.manaEgg).name << ',' - << std::to_string(val.stamina) << ',' - << std::to_string(val.unknown1) << ',' - << std::to_string(val.unknown2) << ',' - << std::to_string(val.unknown3) << ',' - << std::to_string(val.unknown4) << ',' - << std::to_string(val.unknown5) << ',' - << std::to_string(val.unknown6) << ',' - << std::to_string(val.unknown7) << ',' - << std::to_string(val.unknown8) << ',' - << std::to_string(val.unknown9) << ',' - << std::to_string(val.unknown10) << ',' - << std::to_string(val.ipStun) << ',' - << std::to_string(val.ipCancelStun) << ',' - << std::to_string(val.comboSpRegen) << ',' - << std::to_string(val.critSpRegen) << ',' - << std::to_string(val.unknown11) << ',' - << std::to_string(val.hitSpRegen) << ',' - << std::to_string(val.unknown12) << ',' - << std::to_string(val.evasionStillRate) << ',' - << std::to_string(val.evasionMovingRate) << ',' - << std::to_string(val.ResistKnockback) << ',' - << std::to_string(val.unknown13) << ',' - << std::to_string(val.TREC) << ',' - << std::to_string(val.TDMG) << ',' - << std::to_string(val.unknown14) << ',' - << std::to_string(val.THEAL) << ',' - << std::to_string(val.size) << ',' - << std::to_string(val.unknown15) << ',' - << std::to_string(val.unknown16) << ',' - << std::to_string(val.unknown17) << ',' - << std::to_string(val.unknown18) << ',' - << std::to_string(val.unknown19) << ',' - << std::to_string(val.unknown20) << ',' - << std::to_string(val.unknown21) << ',' - << std::to_string(val.unknown22) << ',' - << std::to_string(val.unknown23) << '\n'; - } - - output.close(); -} - -void StartStats::randomize() { - std::random_device rd; - std::mt19937 g(rd()); - size_t charIndex = 0; - - for (auto& startStat : this->_startStats) { - do { - startStat.weapon = (uint16_t)(300 + (30 * charIndex) + (g() % 30)); - } while (std::string(this->_items->at(startStat.weapon).name).find_first_not_of(' ') == std::string::npos); - - do { - startStat.armour = (uint16_t)(500 + (g() % 70)); - } while (std::string(this->_items->at(startStat.armour).name).find_first_not_of(' ') == std::string::npos); - - do { - startStat.headgear = (uint16_t)(570 + (g() % 70)); - } while (std::string(this->_items->at(startStat.headgear).name).find_first_not_of(' ') == std::string::npos); - - do { - startStat.footwear = (uint16_t)(650 + (g() % 50)); - } while (std::string(this->_items->at(startStat.footwear).name).find_first_not_of(' ') == std::string::npos); - - do { - startStat.accessory = (uint16_t)(700 + (g() % 99)); - } while (std::string(this->_items->at(startStat.accessory).name).find_first_not_of(' ') == std::string::npos || std::string(this->_items->at(startStat.accessory).name).find("Egg") != std::string::npos); - - if (g() % 3 != 0) - startStat.manaEgg = 0; - else { - do { - startStat.manaEgg = (uint16_t)(700 + g() % 99); - } while (std::string(this->_items->at(startStat.manaEgg).name).find("Egg") == std::string::npos); - } - - ++charIndex; - } -} \ No newline at end of file diff --git a/src/bosses/Boss.h b/src/bosses/Boss.h new file mode 100644 index 0000000..bb91090 --- /dev/null +++ b/src/bosses/Boss.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +#include "../enemies/EnemyStats.h" +#include "../enemies/EnemyAI.h" +#include "../enemies/EnemyMoves.h" + +struct Boss { + char* name = new char[19]{}; + EnemyStats stats; + EnemyAI ai[6]{}; + std::vector moveSets{}; + bool isSecond = false; + + std::string filename = ""; +}; \ No newline at end of file diff --git a/src/BossesClass.cpp b/src/bosses/Bosses.cpp similarity index 51% rename from src/BossesClass.cpp rename to src/bosses/Bosses.cpp index cfac2c8..6a9b556 100644 --- a/src/BossesClass.cpp +++ b/src/bosses/Bosses.cpp @@ -3,24 +3,27 @@ #include #include -#include "./include/BossesClass.h" +#include "./Bosses.h" +#include "../items/Items.h" +#include "../moves/Moves.h" -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" +#include "../common/difficulty.h" -#include "./include/JsonDefinitions.h" +#include "../common/JsonDefinitions.h" -#include "./include/common/imgui_wrappers.h" +#include "../ui/imgui_wrappers.h" #include "./imgui.h" -void Bosses::writeBoss(std::fstream& stream, const BossStruct& boss, bool isSecond) { +void Bosses::writeBoss(std::fstream& stream, const Boss& boss, bool isSecond) { stream.write((char*)boss.name, 18); - writeRaw(stream, boss.stats); + writeRaw(stream, boss.stats); // write AI data for (size_t aiIndex = 0; aiIndex < 5; aiIndex++) { - writeRaw(stream, boss.ai[aiIndex]); + writeRaw(stream, boss.ai[aiIndex]); } if (isSecond) { @@ -35,7 +38,7 @@ void Bosses::writeBoss(std::fstream& stream, const BossStruct& boss, bool isSeco for (size_t k = 0; k < 5; k++) { stream.write((char*)boss.moveSets.front().moves[k].name, 18); - writeRaw(stream, boss.moveSets.front().moves[k].stats); + writeRaw(stream, boss.moveSets.front().moves[k].stats); } } @@ -43,7 +46,7 @@ void Bosses::write() { std::fstream stream; uint32_t offset = 0; - for (const auto& boss : this->_bosses) { + for (const auto& boss : _bosses) { stream.open(boss.filename, std::ios::binary | std::ios::in | std::ios::out); if (!stream.is_open()) { throw new std::exception(boss.filename.c_str()); @@ -58,22 +61,23 @@ void Bosses::write() { uint32_t offset = readRaw(stream); if (offset) { stream.seekg(offset, std::ios::beg); - this->writeBoss(stream, boss, boss.isSecond); + writeBoss(stream, boss, boss.isSecond); } + stream.close(); } } void Bosses::readBoss(std::ifstream& stream, std::string& filename, bool isSecond) { - this->_bosses.emplace_back(BossStruct()); - stream.read(this->_bosses.back().name, 18); - replaceNulls(this->_bosses.back().name, 18); - this->_bosses.back().stats = readRaw(stream); - this->_bosses.back().filename = filename; // we need the filename for writing data - this->_bosses.back().isSecond = isSecond; + _bosses.emplace_back(Boss()); + stream.read(_bosses.back().name, 18); + replaceNulls(_bosses.back().name, 18); + _bosses.back().stats = readRaw(stream); + _bosses.back().filename = filename; // we need the filename for writing data + _bosses.back().isSecond = isSecond; // read in enemy AI data for (size_t aiIndex = 0; aiIndex < 5; aiIndex++) { - this->_bosses.back().ai[aiIndex] = readRaw(stream); + _bosses.back().ai[aiIndex] = readRaw(stream); } if (isSecond) { @@ -87,22 +91,21 @@ void Bosses::readBoss(std::ifstream& stream, std::string& filename, bool isSecon stream.seekg(movesOffset, std::ios::beg); // don't bother checking if the move data segment is non-null, if the enemy data exists, the move data should too - this->_bosses.back().moveSets.emplace_back(EnemyMovesStruct()); + _bosses.back().moveSets.emplace_back(EnemyMoves()); for (size_t moveIndex = 0; moveIndex < 5; moveIndex++) { - stream.read(this->_bosses.back().moveSets.back().moves[moveIndex].name, 18); - replaceNulls(this->_bosses.back().moveSets.back().moves[moveIndex].name, 18); - this->_bosses.back().moveSets.back().moves[moveIndex].stats = readRaw(stream); + stream.read(_bosses.back().moveSets.back().moves[moveIndex].name, 18); + replaceNulls(_bosses.back().moveSets.back().moves[moveIndex].name, 18); + _bosses.back().moveSets.back().moves[moveIndex].stats = readRaw(stream); } } -void Bosses::read(bool isHardmode) { - this->isHardmode = isHardmode; +void Bosses::read() { std::ifstream stream; uint32_t offset = 0; - std::string directory = this->_directory + "boss" + (isHardmode ? "_hardmode" : ""); + std::string directory = _directory + "boss" + (Difficulty::getInstance().isHardMode() ? "_hardmode" : ""); // clear out any existing data, we are re-reading data - this->_bosses.clear(); + _bosses.clear(); for (const auto& p : std::filesystem::directory_iterator(directory)) { std::string filename = p.path().string(); @@ -119,24 +122,24 @@ void Bosses::read(bool isHardmode) { offset = readRaw(stream); if (offset > 0) { stream.seekg(offset, std::ios::beg); - this->readBoss(stream, filename); + readBoss(stream, filename); } stream.seekg(0x44, std::ios::beg); // second copy data offset is always at 0x44 offset = readRaw(stream); if (offset > 0) { stream.seekg(offset, std::ios::beg); - this->readBoss(stream, filename, true); + readBoss(stream, filename, true); } stream.close(); } // set default starting state - if (this->_bosses.size()) { + if (_bosses.size()) { for (size_t i = 0; i < 8; i++) { - this->AilmentBitFlags[i] = (this->_bosses.at(0).stats.ailmentsBitflag & (1 << i)) > 0; - this->MoveAilmentBitFlags[i] = (this->_bosses.at(0).moveSets.at(0).moves[0].stats.ailmentsBitflag & (1 << i)) > 0; + AilmentBitFlags[i] = (_bosses.at(0).stats.ailmentsBitflag & (1 << i)) > 0; + MoveAilmentBitFlags[i] = (_bosses.at(0).moveSets.at(0).moves[0].stats.ailmentsBitflag & (1 << i)) > 0; } } } @@ -151,15 +154,15 @@ void Bosses::draw() { auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); if (ImGui::Button("Save")) { - this->write(); + write(); } - if (ImGui::BeginCombo("Enemy Index", this->_bosses.at(this->_bossIndex).name)) { - for (size_t i = 0; i < this->_bosses.size(); i++) { + if (ImGui::BeginCombo("Enemy Index", _bosses.at(_bossIndex).name)) { + for (size_t i = 0; i < _bosses.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bossIndex); - if (ImGui::Selectable(this->_bosses.at(i).name, is_selected)) { - this->_bossIndex = i; + bool is_selected = (i == _bossIndex); + if (ImGui::Selectable(_bosses.at(i).name, is_selected)) { + _bossIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -167,12 +170,12 @@ void Bosses::draw() { ImGui::PopID(); } - this->_moveSetIndex = 0; - this->_moveIndex = 0; + _moveSetIndex = 0; + _moveIndex = 0; for (size_t i = 0; i < 8; i++) { - AilmentBitFlags[i] = this->_bosses.at(this->_bossIndex).stats.ailmentsBitflag & (1 << i); - MoveAilmentBitFlags[i] = this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ailmentsBitflag & (1 << i); + AilmentBitFlags[i] = _bosses.at(_bossIndex).stats.ailmentsBitflag & (1 << i); + MoveAilmentBitFlags[i] = _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ailmentsBitflag & (1 << i); } ImGui::EndCombo(); @@ -180,32 +183,32 @@ void Bosses::draw() { - ImGui::InputText("Name", this->_bosses.at(this->_bossIndex).name, 19); - drawInput("Type1", &this->_bosses.at(this->_bossIndex).stats.type1); - drawInput("Type2", &this->_bosses.at(this->_bossIndex).stats.type2); - drawInput("Level", &this->_bosses.at(this->_bossIndex).stats.level); - drawInput("Health", &this->_bosses.at(this->_bossIndex).stats.health); - drawInput("MP", &this->_bosses.at(this->_bossIndex).stats.mp); - drawInput("SP", &this->_bosses.at(this->_bossIndex).stats.sp); - drawInput("VIT", &this->_bosses.at(this->_bossIndex).stats.vit); - drawInput("AGI", &this->_bosses.at(this->_bossIndex).stats.agi); - drawInput("SPD", &this->_bosses.at(this->_bossIndex).stats.spd); - drawInput("MEN", &this->_bosses.at(this->_bossIndex).stats.men); - drawInput("Stamina", &this->_bosses.at(this->_bossIndex).stats.stamina); + ImGui::InputText("Name", _bosses.at(_bossIndex).name, 19); + drawInput("Type1", &_bosses.at(_bossIndex).stats.type1); + drawInput("Type2", &_bosses.at(_bossIndex).stats.type2); + drawInput("Level", &_bosses.at(_bossIndex).stats.level); + drawInput("Health", &_bosses.at(_bossIndex).stats.health); + drawInput("MP", &_bosses.at(_bossIndex).stats.mp); + drawInput("SP", &_bosses.at(_bossIndex).stats.sp); + drawInput("VIT", &_bosses.at(_bossIndex).stats.vit); + drawInput("AGI", &_bosses.at(_bossIndex).stats.agi); + drawInput("SPD", &_bosses.at(_bossIndex).stats.spd); + drawInput("MEN", &_bosses.at(_bossIndex).stats.men); + drawInput("Stamina", &_bosses.at(_bossIndex).stats.stamina); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How long can they move without tiring?"); - drawInputN("IP Stun/IP Cancel Stun", &this->_bosses.at(this->_bossIndex).stats.ipStun, 2); + drawInputN("IP Stun/IP Cancel Stun", &_bosses.at(_bossIndex).stats.ipStun, 2); if (ImGui::IsItemHovered()) ImGui::SetTooltip("IP Stun/IP Cancel Stun Resistance."); - drawInput("Still Evasion Rate", &this->_bosses.at(this->_bossIndex).stats.evasionStillRate); - drawInput("Moving Evasion Rate", &this->_bosses.at(this->_bossIndex).stats.evasionMovingRate); - drawInput("Fire Resist", &this->_bosses.at(this->_bossIndex).stats.fireResist); - drawInput("Wind Resist", &this->_bosses.at(this->_bossIndex).stats.windResist); - drawInput("Earth Resist", &this->_bosses.at(this->_bossIndex).stats.earthResist); - drawInput("Lightning Resist", &this->_bosses.at(this->_bossIndex).stats.lightningResist); - drawInput("Blizzard Resist", &this->_bosses.at(this->_bossIndex).stats.blizzardResist); + drawInput("Still Evasion Rate", &_bosses.at(_bossIndex).stats.evasionStillRate); + drawInput("Moving Evasion Rate", &_bosses.at(_bossIndex).stats.evasionMovingRate); + drawInput("Fire Resist", &_bosses.at(_bossIndex).stats.fireResist); + drawInput("Wind Resist", &_bosses.at(_bossIndex).stats.windResist); + drawInput("Earth Resist", &_bosses.at(_bossIndex).stats.earthResist); + drawInput("Lightning Resist", &_bosses.at(_bossIndex).stats.lightningResist); + drawInput("Blizzard Resist", &_bosses.at(_bossIndex).stats.blizzardResist); for (size_t i = 0; i < 8; i++) { if (ImGui::Checkbox(statusDefs.at(i).c_str(), &AilmentBitFlags[i])) { - this->_bosses.at(this->_bossIndex).stats.ailmentsBitflag ^= (AilmentBitFlags[i] << i); + _bosses.at(_bossIndex).stats.ailmentsBitflag ^= (AilmentBitFlags[i] << i); } if (ImGui::IsItemHovered()) ImGui::SetTooltip("Do they resist this ailment?"); if ((i+1) % 4) { @@ -213,20 +216,20 @@ void Bosses::draw() { } } - drawInput("Knockback Resist Rate", &this->_bosses.at(this->_bossIndex).stats.knockbackResist); - drawInput("Size", &this->_bosses.at(this->_bossIndex).stats.size); - drawInput("No Run", &this->_bosses.at(this->_bossIndex).stats.noRunFlag); - drawInput("EXP", &this->_bosses.at(this->_bossIndex).stats.exp); - drawInput("Skill Coins", &this->_bosses.at(this->_bossIndex).stats.skillCoins); - drawInput("Magic Coins", &this->_bosses.at(this->_bossIndex).stats.magicCoins); - drawInput("Gold Coins", &this->_bosses.at(this->_bossIndex).stats.goldCoins); + drawInput("Knockback Resist Rate", &_bosses.at(_bossIndex).stats.knockbackResist); + drawInput("Size", &_bosses.at(_bossIndex).stats.size); + drawInput("No Run", &_bosses.at(_bossIndex).stats.noRunFlag); + drawInput("EXP", &_bosses.at(_bossIndex).stats.exp); + drawInput("Skill Coins", &_bosses.at(_bossIndex).stats.skillCoins); + drawInput("Magic Coins", &_bosses.at(_bossIndex).stats.magicCoins); + drawInput("Gold Coins", &_bosses.at(_bossIndex).stats.goldCoins); - if (ImGui::BeginCombo("Item #1", this->_items->at(this->_bosses.at(this->_bossIndex).stats.item1).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { + if (ImGui::BeginCombo("Item #1", Items::getInstance().getItems().at(_bosses.at(_bossIndex).stats.item1).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).stats.item1); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) - this->_bosses.at(this->_bossIndex).stats.item1 = (uint16_t)i; + bool is_selected = (i == _bosses.at(_bossIndex).stats.item1); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) + _bosses.at(_bossIndex).stats.item1 = (uint16_t)i; if (is_selected) ImGui::SetItemDefaultFocus(); ImGui::PopID(); @@ -235,12 +238,12 @@ void Bosses::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Item #2", this->_items->at(this->_bosses.at(this->_bossIndex).stats.item2).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { + if (ImGui::BeginCombo("Item #2", Items::getInstance().getItems().at(_bosses.at(_bossIndex).stats.item2).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).stats.item2); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_bosses.at(this->_bossIndex).stats.item2 = (uint16_t)i; + bool is_selected = (i == _bosses.at(_bossIndex).stats.item2); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _bosses.at(_bossIndex).stats.item2 = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -251,24 +254,24 @@ void Bosses::draw() { ImGui::EndCombo(); } - drawInput("Item #1 Chance", &this->_bosses.at(this->_bossIndex).stats.item1Chance); - drawInput("Item #2 Chance", &this->_bosses.at(this->_bossIndex).stats.item2Chance); + drawInput("Item #1 Chance", &_bosses.at(_bossIndex).stats.item1Chance); + drawInput("Item #2 Chance", &_bosses.at(_bossIndex).stats.item2Chance); - ImGui::Checkbox("Moves", &this->_showMoves); + ImGui::Checkbox("Moves", &_showMoves); ImGui::SameLine(); - ImGui::Checkbox("AI", &this->_showAI); + ImGui::Checkbox("AI", &_showAI); ImGui::End(); - if (this->_showMoves) { + if (_showMoves) { ImGui::Begin("BOSS MOVES"); - if (ImGui::BeginCombo("Moveset Index", std::format("Moveset Index {}", this->_moveSetIndex + 1).c_str())) { - for (size_t i = 0; i < this->_bosses.at(this->_bossIndex).moveSets.size(); i++) { + if (ImGui::BeginCombo("Moveset Index", std::format("Moveset Index {}", _moveSetIndex + 1).c_str())) { + for (size_t i = 0; i < _bosses.at(_bossIndex).moveSets.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_moveSetIndex); + bool is_selected = (i == _moveSetIndex); if (ImGui::Selectable(std::format("Moveset Index {}", i + 1).c_str(), is_selected)) { - this->_moveSetIndex = i; + _moveSetIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -279,12 +282,12 @@ void Bosses::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Move Index", this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].name)) { + if (ImGui::BeginCombo("Move Index", _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].name)) { for (size_t i = 0; i < 5; i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_moveIndex); - if (ImGui::Selectable(this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[i].name, is_selected)) { - this->_moveIndex = i; + bool is_selected = (i == _moveIndex); + if (ImGui::Selectable(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[i].name, is_selected)) { + _moveIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -293,23 +296,23 @@ void Bosses::draw() { } for (size_t i = 0; i < 8; i++) { - MoveAilmentBitFlags[i] = this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ailmentsBitflag & (1 << i); + MoveAilmentBitFlags[i] = _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ailmentsBitflag & (1 << i); } ImGui::EndCombo(); } - ImGui::InputText("Name", this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].name, 19); - drawInput("MP Cost", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.mp); - drawInput("SP Cost", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.sp); - drawInput("Unknown #1", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.unknown); + ImGui::InputText("Name", _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].name, 19); + drawInput("MP Cost", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.mp); + drawInput("SP Cost", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.sp); + drawInput("Unknown #1", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.unknown); - if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetEffect).c_str())) { + if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetEffect).c_str())) { for (size_t i = 0; i < targetEffectDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetEffect); + bool is_selected = (i == _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetEffect); if (ImGui::Selectable(targetEffectDefs.at(i).c_str())) { - this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetEffect = (uint8_t)i; + _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetEffect = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -319,16 +322,16 @@ void Bosses::draw() { ImGui::EndCombo(); } - drawInput("Strength", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.str); - drawInput("Power", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.pow); - drawInput("Damage(?)", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ad); + drawInput("Strength", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.strength); + drawInput("Power", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.power); + drawInput("Damage(?)", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ad); - if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetType).c_str())) { + if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetType).c_str())) { for (size_t i = 0; i < targetTypeDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetType); + bool is_selected = (i == _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetType); if (ImGui::Selectable(targetTypeDefs.at(i).c_str())) { - this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.targetType = (uint8_t)i; + _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetType = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -338,21 +341,21 @@ void Bosses::draw() { ImGui::EndCombo(); } - drawInput("Unknown #2", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.normalAttackFlag); - drawInput("Distance", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.distance); + drawInput("Unknown #2", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.normalAttackFlag); + drawInput("Distance", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.distance); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How far away to use move?"); - drawInput("Accuracy", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.accuracy); - drawInput("Range", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.range); + drawInput("Accuracy", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.accuracy); + drawInput("Range", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.range); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How big is the move area?"); - drawInput("Cast Time", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.castTime); - drawInput("Recovery", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.recovery); + drawInput("Cast Time", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.castTime); + drawInput("Recovery", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.recovery); - if (ImGui::BeginCombo("Animation", animationDefs.at(this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.animation).c_str())) { - for (size_t i = 0; i < this->_moves->size(); i++) { + if (ImGui::BeginCombo("Animation", animationDefs.at(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.animation).c_str())) { + for (size_t i = 0; i < Moves::getInstance().getMoves().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.animation); + bool is_selected = (i == _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.animation); if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { - this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.animation = (uint8_t)i; + _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.animation = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -363,18 +366,18 @@ void Bosses::draw() { ImGui::EndCombo(); } - drawInput("Knockdown", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.knockDown); + drawInput("Knockdown", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.knockDown); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Will this move knockdown those hit?"); - drawInputN("IP Stun/IP Cancel Stun", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ipStun, 2); - drawInput("Knockback", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.knockback); + drawInputN("IP Stun/IP Cancel Stun", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ipStun, 2); + drawInput("Knockback", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.knockback); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How much move will knockback those hit."); - if (ImGui::BeginCombo("Element", elementDefs.at(this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.element).c_str())) { + if (ImGui::BeginCombo("Element", elementDefs.at(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.element).c_str())) { for (size_t i = 0; i < elementDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.element); + bool is_selected = (i == _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.element); if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { - this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.element = (uint8_t)i; + _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.element = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -385,34 +388,34 @@ void Bosses::draw() { ImGui::EndCombo(); } - drawInput("Element Strength", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.elementStr); + drawInput("Element Strength", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.elementStrength); if (ImGui::IsItemHovered()) ImGui::SetTooltip("* 10 percent of damage is this element."); for (size_t i = 0; i < 8; i++) { if (auto ret = ImGui::Checkbox(statusDefs.at(i).c_str(), &MoveAilmentBitFlags[i])) { - this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ailmentsBitflag ^= (1 << i); + _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ailmentsBitflag ^= (1 << i); } if ((i+1) % 4) { ImGui::SameLine(); } } - drawInput("Ailments Chance", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ailmentsChance); - drawInputN("Atk/Def/Act/Mov Mods", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.atkMod, 4); - drawInput("Special", &this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.special); + drawInput("Ailments Chance", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ailmentsChance); + drawInputN("Atk/Def/Act/Mov Mods", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.atkMod, 4); + drawInput("Special", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.special); if (ImGui::IsItemHovered()) ImGui::SetTooltip("In Beta, use at your own peril."); ImGui::End(); } - if (this->_showAI) { + if (_showAI) { ImGui::Begin("BOSS AI"); - if (ImGui::BeginCombo("AI Index", std::format("AI Index {}", this->_aiIndex + 1).c_str())) { + if (ImGui::BeginCombo("AI Index", std::format("AI Index {}", _aiIndex + 1).c_str())) { for (size_t i = 0; i < 5; i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_aiIndex); + bool is_selected = (i == _aiIndex); if (ImGui::Selectable(std::format("AI Index {}", i + 1).c_str(), is_selected)) { - this->_aiIndex = i; + _aiIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -421,18 +424,18 @@ void Bosses::draw() { } for (size_t i = 0; i < 8; i++) { - MoveAilmentBitFlags[i] = this->_bosses.at(this->_bossIndex).moveSets.at(_moveSetIndex).moves[this->_moveIndex].stats.ailmentsBitflag & (1 << i); + MoveAilmentBitFlags[i] = _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.ailmentsBitflag & (1 << i); } ImGui::EndCombo(); } - drawInput("AI Type", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].aiType); - drawInput("Move #1 Chance", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].move1Chance); - drawInput("Move #2 Chance", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].move2Chance); - drawInput("Move #3 Chance", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].move3Chance); - drawInput("Move #4 Chance", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].move4Chance); - drawInput("Move #5 Chance", &this->_bosses.at(this->_bossIndex).ai[this->_aiIndex].move5Chance); + drawInput("AI Type", &_bosses.at(_bossIndex).ai[_aiIndex].aiType); + drawInput("Move #1 Chance", &_bosses.at(_bossIndex).ai[_aiIndex].move1Chance); + drawInput("Move #2 Chance", &_bosses.at(_bossIndex).ai[_aiIndex].move2Chance); + drawInput("Move #3 Chance", &_bosses.at(_bossIndex).ai[_aiIndex].move3Chance); + drawInput("Move #4 Chance", &_bosses.at(_bossIndex).ai[_aiIndex].move4Chance); + drawInput("Move #5 Chance", &_bosses.at(_bossIndex).ai[_aiIndex].move5Chance); ImGui::End(); } @@ -443,10 +446,10 @@ void Bosses::outputToCSV() { auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); std::ofstream stream; - stream.open(this->isHardmode ? "./csv/BOSS_HARDMODE.CSV" : "./csv/BOSS.CSV"); + stream.open(Difficulty::getInstance().isHardMode() ? "./csv/BOSS_HARDMODE.CSV" : "./csv/BOSS.CSV"); std::ofstream stream2; - stream2.open(this->isHardmode ? "./csv/BOSS_HARDMODE_MOVES.CSV" : "./csv/BOSS_MOVES.CSV"); + stream2.open(Difficulty::getInstance().isHardMode() ? "./csv/BOSS_HARDMODE_MOVES.CSV" : "./csv/BOSS_MOVES.CSV"); if (!stream.is_open() || !stream2.is_open()) { return; @@ -458,7 +461,7 @@ void Bosses::outputToCSV() { stream2 << "Enemy,Move,MP,SP,???,Target Effect,STR,POW,AD,Target Type,???,Distance,Accuracy,Range,Cast Time,Recovery,Animation,Knockdown,IP Stun,IP Cancel Stun,Knockback,Element,Element Strength,Status Effect Bitflag," << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special\n"; - for (const auto& val : this->_bosses) { + for (const auto& val : _bosses) { stream << val.name << ',' << std::to_string(val.stats.type1) << ',' << std::to_string(val.stats.type2) << ',' @@ -491,8 +494,8 @@ void Bosses::outputToCSV() { << std::to_string(val.stats.skillCoins) << ',' << std::to_string(val.stats.magicCoins) << ',' << std::to_string(val.stats.goldCoins) << ',' - << this->_items->at(val.stats.item1).name << ',' - << this->_items->at(val.stats.item2).name << ',' + << Items::getInstance().getItems().at(val.stats.item1).name << ',' + << Items::getInstance().getItems().at(val.stats.item2).name << ',' << std::to_string(val.stats.item1Chance) << ',' << std::to_string(val.stats.item2Chance) << '\n'; @@ -508,8 +511,8 @@ void Bosses::outputToCSV() { << std::to_string(moveSet.moves[moveIndex].stats.sp) << ',' << std::to_string(moveSet.moves[moveIndex].stats.unknown) << ',' << targetEffectDefs.at(moveSet.moves[moveIndex].stats.targetEffect) << ',' - << std::to_string(moveSet.moves[moveIndex].stats.str) << ',' - << std::to_string(moveSet.moves[moveIndex].stats.pow) << ',' + << std::to_string(moveSet.moves[moveIndex].stats.strength) << ',' + << std::to_string(moveSet.moves[moveIndex].stats.power) << ',' << std::to_string(moveSet.moves[moveIndex].stats.ad) << ',' << targetTypeDefs.at(moveSet.moves[moveIndex].stats.targetType) << ',' << std::to_string(moveSet.moves[moveIndex].stats.normalAttackFlag) << ',' @@ -524,7 +527,7 @@ void Bosses::outputToCSV() { << std::to_string(moveSet.moves[moveIndex].stats.ipCancelStun) << ',' << std::to_string(moveSet.moves[moveIndex].stats.knockback) << ',' << elementDefs.at(moveSet.moves[moveIndex].stats.element) << ',' - << std::to_string(moveSet.moves[moveIndex].stats.elementStr) << ',' + << std::to_string(moveSet.moves[moveIndex].stats.elementStrength) << ',' << std::to_string(moveSet.moves[moveIndex].stats.ailmentsBitflag) << ',' << std::to_string(moveSet.moves[moveIndex].stats.ailmentsChance) << ',' << std::to_string(moveSet.moves[moveIndex].stats.atkMod) << ',' @@ -544,19 +547,19 @@ void Bosses::randomize() { std::random_device rd; std::mt19937 g(rd()); - for (auto& enemy : this->_bosses) { + for (auto& enemy : _bosses) { // keep going until an item is hit do { - enemy.stats.item1 = (uint16_t)((size_t)g() % this->_items->size()); - } while (std::string(this->_items->at(enemy.stats.item1).name).find_first_not_of(' ') == std::string::npos); + enemy.stats.item1 = (uint16_t)((size_t)g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(enemy.stats.item1).name).find_first_not_of(' ') == std::string::npos); // random chance for the item to be removed if (g() % 10 == 0) enemy.stats.item1 = 0; do { - enemy.stats.item2 = (uint16_t)((size_t)g() % this->_items->size()); - } while (std::string(this->_items->at(enemy.stats.item2).name).find_first_not_of(' ') == std::string::npos); + enemy.stats.item2 = (uint16_t)((size_t)g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(enemy.stats.item2).name).find_first_not_of(' ') == std::string::npos); // random chance for the item to be removed if (g() % 10 == 0) { diff --git a/src/bosses/Bosses.h b/src/bosses/Bosses.h new file mode 100644 index 0000000..8e7345f --- /dev/null +++ b/src/bosses/Bosses.h @@ -0,0 +1,43 @@ +#pragma once + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./Boss.h" + +class Bosses : public BaseDataInterface { +public: + Bosses(const Bosses&) = delete; + Bosses(const Bosses&&) = delete; + + static Bosses& getInstance() { + static Bosses instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + const std::vector& getBosses() { return _bosses; }; + +private: + Bosses() { + _directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/" : "./data/afs/"); + read(); + }; + + void writeBoss(std::fstream& stream, const Boss& boss, bool isSecond = false); + void readBoss(std::ifstream& stream, std::string& filename, bool isSecond = false); + + std::vector _bosses; + size_t _bossIndex = 0; + bool AilmentBitFlags[8] = {}; + bool MoveAilmentBitFlags[8] = {}; + size_t _moveSetIndex = 0; + size_t _moveIndex = 0; + size_t _aiIndex = 0; + bool _showMoves = false; + bool _showAI = false; +}; \ No newline at end of file diff --git a/src/common/BaseDataInterface.h b/src/common/BaseDataInterface.h new file mode 100644 index 0000000..ac7e3e9 --- /dev/null +++ b/src/common/BaseDataInterface.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +class BaseDataInterface { +public: + virtual void write() = 0; + virtual void read() = 0; + virtual void draw() = 0; + virtual void outputToCSV() = 0; + +protected: + std::string _filename; + std::string _directory; +}; \ No newline at end of file diff --git a/src/include/JsonDefinitions.h b/src/common/JsonDefinitions.h similarity index 98% rename from src/include/JsonDefinitions.h rename to src/common/JsonDefinitions.h index 76d5eba..b2a6e4a 100644 --- a/src/include/JsonDefinitions.h +++ b/src/common/JsonDefinitions.h @@ -1,5 +1,6 @@ #include #include +#include #include diff --git a/src/common/copypaste_obj.cpp b/src/common/copypaste_obj.cpp index 8145a96..2cb1159 100644 --- a/src/common/copypaste_obj.cpp +++ b/src/common/copypaste_obj.cpp @@ -1,4 +1,4 @@ -#include "..\include\common\copypaste_obj.h" +#include "./copypaste_obj.h" void* clipboard = nullptr; std::string objType = ""; diff --git a/src/include/common/copypaste_obj.h b/src/common/copypaste_obj.h similarity index 100% rename from src/include/common/copypaste_obj.h rename to src/common/copypaste_obj.h diff --git a/src/common/difficulty.h b/src/common/difficulty.h new file mode 100644 index 0000000..60862e2 --- /dev/null +++ b/src/common/difficulty.h @@ -0,0 +1,19 @@ +#pragma once + +class Difficulty { +public: + Difficulty(const Difficulty&) = delete; + Difficulty(const Difficulty&&) = delete; + + static Difficulty& getInstance() { + static Difficulty instance; + return instance; + } + + void setDifficulty(bool isHardMode = false) { isHard = isHardMode; } + bool isHardMode() { return isHard; } +private: + Difficulty() {} + + bool isHard = false; +}; \ No newline at end of file diff --git a/src/include/common/io_util.h b/src/common/io_util.h similarity index 100% rename from src/include/common/io_util.h rename to src/common/io_util.h diff --git a/src/common/string_manip.cpp b/src/common/string_manip.cpp index 0df8ae7..386f895 100644 --- a/src/common/string_manip.cpp +++ b/src/common/string_manip.cpp @@ -1,4 +1,4 @@ -#include "..\include\common\string_manip.h" +#include "./string_manip.h" void replaceNulls(char* str, uint32_t size) { for (uint32_t count = 0; count < size; count++) { diff --git a/src/include/common/string_manip.h b/src/common/string_manip.h similarity index 100% rename from src/include/common/string_manip.h rename to src/common/string_manip.h diff --git a/src/common/structs/Vector2.h b/src/common/structs/Vector2.h new file mode 100644 index 0000000..db76e18 --- /dev/null +++ b/src/common/structs/Vector2.h @@ -0,0 +1,8 @@ +#pragma once + +#pragma pack(1) +struct Vector2 { + float x = 0.0f; + float z = 0.0f; +}; +#pragma pack() \ No newline at end of file diff --git a/src/common/structs/Vector3.h b/src/common/structs/Vector3.h new file mode 100644 index 0000000..28da41a --- /dev/null +++ b/src/common/structs/Vector3.h @@ -0,0 +1,9 @@ +#pragma once + +#pragma pack(1) +struct Vector3 { + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; +}; +#pragma pack() \ No newline at end of file diff --git a/src/include/common/version_check.h b/src/common/version_check.h similarity index 100% rename from src/include/common/version_check.h rename to src/common/version_check.h diff --git a/src/EnemiesClass.cpp b/src/enemies/Enemies.cpp similarity index 50% rename from src/EnemiesClass.cpp rename to src/enemies/Enemies.cpp index 1df2162..fd53e61 100644 --- a/src/EnemiesClass.cpp +++ b/src/enemies/Enemies.cpp @@ -3,24 +3,27 @@ #include #include -#include "./include/EnemiesClass.h" +#include "./Enemies.h" +#include "../items/Items.h" +#include "../moves/Moves.h" -#include "./include/common/io_util.h" -#include "./include/common/string_manip.h" -#include "./include/common/copypaste_obj.h" +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" +#include "../common/difficulty.h" -#include "./include/JsonDefinitions.h" +#include "../common/JsonDefinitions.h" -#include "./include/common/imgui_wrappers.h" +#include "../ui/imgui_wrappers.h" #include "./imgui.h" -void Enemies::writeEnemy(std::fstream& stream, const EnemyStruct& enemy, bool isSecond) { +void Enemies::writeEnemy(std::fstream& stream, const Enemy& enemy, bool isSecond) { stream.write((char*)enemy.name, 18); - writeRaw(stream, enemy.stats); + writeRaw(stream, enemy.stats); // write AI data for (size_t aiIndex = 0; aiIndex < 5; aiIndex++) { - writeRaw(stream, enemy.ai[aiIndex]); + writeRaw(stream, enemy.ai[aiIndex]); } if (isSecond) { @@ -35,14 +38,14 @@ void Enemies::writeEnemy(std::fstream& stream, const EnemyStruct& enemy, bool is for (size_t k = 0; k < 5; k++) { stream.write((char*)enemy.moveSet.moves[k].name, 18); - writeRaw(stream, enemy.moveSet.moves[k].stats); + writeRaw(stream, enemy.moveSet.moves[k].stats); } } void Enemies::write() { std::fstream stream; - for (const auto& enemy : this->_enemies) { + for (const auto& enemy : _enemies) { stream.open(enemy.filename, std::ios::binary | std::ios::in | std::ios::out); if (!stream.is_open()) { throw new std::exception(enemy.filename.c_str()); @@ -57,7 +60,7 @@ void Enemies::write() { uint32_t offset = readRaw(stream); if (offset) { stream.seekg(offset, std::ios::beg); - this->writeEnemy(stream, enemy, enemy.isSecond); + writeEnemy(stream, enemy, enemy.isSecond); } stream.close(); @@ -65,15 +68,15 @@ void Enemies::write() { } void Enemies::readEnemy(std::ifstream& stream, std::string& filename, bool isSecond) { - this->_enemies.emplace_back(EnemyStruct()); - stream.read(this->_enemies.back().name, 18); - replaceNulls(this->_enemies.back().name, 18); - this->_enemies.back().stats = readRaw(stream); - this->_enemies.back().filename = filename; + _enemies.emplace_back(Enemy()); + stream.read(_enemies.back().name, 18); + replaceNulls(_enemies.back().name, 18); + _enemies.back().stats = readRaw(stream); + _enemies.back().filename = filename; // read in enemy AI data for (size_t aiIndex = 0; aiIndex < 5; aiIndex++) { - this->_enemies.back().ai[aiIndex] = readRaw(stream); + _enemies.back().ai[aiIndex] = readRaw(stream); } if (isSecond) { @@ -87,20 +90,19 @@ void Enemies::readEnemy(std::ifstream& stream, std::string& filename, bool isSec // don't bother checking if the move data segment is non-null, if the enemy data exists, the move data should too for (size_t moveIndex = 0; moveIndex < 5; moveIndex++) { - stream.read(this->_enemies.back().moveSet.moves[moveIndex].name, 18); - replaceNulls(this->_enemies.back().moveSet.moves[moveIndex].name, 18); - this->_enemies.back().moveSet.moves[moveIndex].stats = readRaw(stream); + stream.read(_enemies.back().moveSet.moves[moveIndex].name, 18); + replaceNulls(_enemies.back().moveSet.moves[moveIndex].name, 18); + _enemies.back().moveSet.moves[moveIndex].stats = readRaw(stream); } } -void Enemies::read(bool isHardmode) { - this->isHardmode = isHardmode; +void Enemies::read() { std::ifstream stream; uint32_t offset = 0; - std::string directory = this->_directory + "enemy" + (isHardmode ? "_hardmode" : ""); + std::string directory = _directory + "enemy" + (Difficulty::getInstance().isHardMode() ? "_hardmode" : ""); // clear out any existing data, we are re-reading data - this->_enemies.clear(); + _enemies.clear(); for (const auto& p : std::filesystem::directory_iterator(directory)) { std::string filename = p.path().string(); @@ -117,24 +119,24 @@ void Enemies::read(bool isHardmode) { offset = readRaw(stream); if (offset > 0) { stream.seekg(offset, std::ios::beg); - this->readEnemy(stream, filename); + readEnemy(stream, filename); } stream.seekg(0x44, std::ios::beg); // second copy data offset is always at 0x44 offset = readRaw(stream); if (offset > 0) { stream.seekg(offset, std::ios::beg); - this->readEnemy(stream, filename, true); + readEnemy(stream, filename, true); } stream.close(); } // set default starting state - if (this->_enemies.size()) { + if (_enemies.size()) { for (size_t i = 0; i < 8; i++) { - this->AilmentBitFlags[i] = (this->_enemies.at(0).stats.ailmentsBitflag & (1 << i)) > 0; - this->MoveAilmentBitFlags[i] = (this->_enemies.at(0).moveSet.moves[0].stats.ailmentsBitflag & (1 << i)) > 0; + AilmentBitFlags[i] = (_enemies.at(0).stats.ailmentsBitflag & (1 << i)) > 0; + MoveAilmentBitFlags[i] = (_enemies.at(0).moveSet.moves[0].stats.ailmentsBitflag & (1 << i)) > 0; } } } @@ -149,15 +151,15 @@ void Enemies::draw() { auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); if (ImGui::Button("Save")) { - this->write(); + write(); } - if (ImGui::BeginCombo("Enemy Index", this->_enemies.at(this->_enemyIndex).name)) { - for (size_t i = 0; i < this->_enemies.size(); i++) { + if (ImGui::BeginCombo("Enemy Index", _enemies.at(_enemyIndex).name)) { + for (size_t i = 0; i < _enemies.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemyIndex); - if (ImGui::Selectable(this->_enemies.at(i).name, is_selected)) { - this->_enemyIndex = i; + bool is_selected = (i == _enemyIndex); + if (ImGui::Selectable(_enemies.at(i).name, is_selected)) { + _enemyIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -165,42 +167,42 @@ void Enemies::draw() { ImGui::PopID(); } - this->_moveIndex = 0; + _moveIndex = 0; for (size_t i = 0; i < 8; i++) { - AilmentBitFlags[i] = this->_enemies.at(this->_enemyIndex).stats.ailmentsBitflag & (1 << i); - MoveAilmentBitFlags[i] = this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ailmentsBitflag & (1 << i); + AilmentBitFlags[i] = _enemies.at(_enemyIndex).stats.ailmentsBitflag & (1 << i); + MoveAilmentBitFlags[i] = _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ailmentsBitflag & (1 << i); } ImGui::EndCombo(); } - ImGui::InputText("Name", this->_enemies.at(this->_enemyIndex).name, 19); - drawInput("Type1", &this->_enemies.at(this->_enemyIndex).stats.type1); - drawInput("Type2", &this->_enemies.at(this->_enemyIndex).stats.type2); - drawInput("Level", &this->_enemies.at(this->_enemyIndex).stats.level); - drawInput("Health", &this->_enemies.at(this->_enemyIndex).stats.health); - drawInput("MP", &this->_enemies.at(this->_enemyIndex).stats.mp); - drawInput("SP", &this->_enemies.at(this->_enemyIndex).stats.sp); - drawInput("VIT", &this->_enemies.at(this->_enemyIndex).stats.vit); - drawInput("AGI", &this->_enemies.at(this->_enemyIndex).stats.agi); - drawInput("SPD", &this->_enemies.at(this->_enemyIndex).stats.spd); - drawInput("MEN", &this->_enemies.at(this->_enemyIndex).stats.men); - drawInput("Stamina", &this->_enemies.at(this->_enemyIndex).stats.stamina); + ImGui::InputText("Name", _enemies.at(_enemyIndex).name, 19); + drawInput("Type1", &_enemies.at(_enemyIndex).stats.type1); + drawInput("Type2", &_enemies.at(_enemyIndex).stats.type2); + drawInput("Level", &_enemies.at(_enemyIndex).stats.level); + drawInput("Health", &_enemies.at(_enemyIndex).stats.health); + drawInput("MP", &_enemies.at(_enemyIndex).stats.mp); + drawInput("SP", &_enemies.at(_enemyIndex).stats.sp); + drawInput("VIT", &_enemies.at(_enemyIndex).stats.vit); + drawInput("AGI", &_enemies.at(_enemyIndex).stats.agi); + drawInput("SPD", &_enemies.at(_enemyIndex).stats.spd); + drawInput("MEN", &_enemies.at(_enemyIndex).stats.men); + drawInput("Stamina", &_enemies.at(_enemyIndex).stats.stamina); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How long can they move without tiring?"); - drawInputN("IP Stun/IP Cancel Stun", &this->_enemies.at(this->_enemyIndex).stats.ipStun, 2); + drawInputN("IP Stun/IP Cancel Stun", &_enemies.at(_enemyIndex).stats.ipStun, 2); if (ImGui::IsItemHovered()) ImGui::SetTooltip("IP Stun/IP Cancel Stun Resistance."); - drawInput("Still Evasion Rate", &this->_enemies.at(this->_enemyIndex).stats.evasionStillRate); - drawInput("Moving Evasion Rate", &this->_enemies.at(this->_enemyIndex).stats.evasionMovingRate); - drawInput("Fire Resist", &this->_enemies.at(this->_enemyIndex).stats.fireResist); - drawInput("Wind Resist", &this->_enemies.at(this->_enemyIndex).stats.windResist); - drawInput("Earth Resist", &this->_enemies.at(this->_enemyIndex).stats.earthResist); - drawInput("Lightning Resist", &this->_enemies.at(this->_enemyIndex).stats.lightningResist); - drawInput("Blizzard Resist", &this->_enemies.at(this->_enemyIndex).stats.blizzardResist); + drawInput("Still Evasion Rate", &_enemies.at(_enemyIndex).stats.evasionStillRate); + drawInput("Moving Evasion Rate", &_enemies.at(_enemyIndex).stats.evasionMovingRate); + drawInput("Fire Resist", &_enemies.at(_enemyIndex).stats.fireResist); + drawInput("Wind Resist", &_enemies.at(_enemyIndex).stats.windResist); + drawInput("Earth Resist", &_enemies.at(_enemyIndex).stats.earthResist); + drawInput("Lightning Resist", &_enemies.at(_enemyIndex).stats.lightningResist); + drawInput("Blizzard Resist", &_enemies.at(_enemyIndex).stats.blizzardResist); for (size_t i = 0; i < 8; i++) { if (ImGui::Checkbox(statusDefs.at(i).c_str(), &AilmentBitFlags[i])) { - this->_enemies.at(this->_enemyIndex).stats.ailmentsBitflag ^= (1 << i); + _enemies.at(_enemyIndex).stats.ailmentsBitflag ^= (1 << i); } if (ImGui::IsItemHovered()) ImGui::SetTooltip("Do they resist this ailment?"); if ((i+1) % 4) { @@ -208,20 +210,20 @@ void Enemies::draw() { } } - drawInput("Knockback Resist Rate", &this->_enemies.at(this->_enemyIndex).stats.knockbackResist); - drawInput("Size", &this->_enemies.at(this->_enemyIndex).stats.size); - drawInput("No Run", &this->_enemies.at(this->_enemyIndex).stats.noRunFlag); - drawInput("EXP", &this->_enemies.at(this->_enemyIndex).stats.exp); - drawInput("Skill Coins", &this->_enemies.at(this->_enemyIndex).stats.skillCoins); - drawInput("Magic Coins", &this->_enemies.at(this->_enemyIndex).stats.magicCoins); - drawInput("Gold Coins", &this->_enemies.at(this->_enemyIndex).stats.goldCoins); + drawInput("Knockback Resist Rate", &_enemies.at(_enemyIndex).stats.knockbackResist); + drawInput("Size", &_enemies.at(_enemyIndex).stats.size); + drawInput("No Run", &_enemies.at(_enemyIndex).stats.noRunFlag); + drawInput("EXP", &_enemies.at(_enemyIndex).stats.exp); + drawInput("Skill Coins", &_enemies.at(_enemyIndex).stats.skillCoins); + drawInput("Magic Coins", &_enemies.at(_enemyIndex).stats.magicCoins); + drawInput("Gold Coins", &_enemies.at(_enemyIndex).stats.goldCoins); - if (ImGui::BeginCombo("Item #1", this->_items->at(this->_enemies.at(this->_enemyIndex).stats.item1).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { + if (ImGui::BeginCombo("Item #1", Items::getInstance().getItems().at(_enemies.at(_enemyIndex).stats.item1).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).stats.item1); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) - this->_enemies.at(this->_enemyIndex).stats.item1 = (uint16_t)i; + bool is_selected = (i == _enemies.at(_enemyIndex).stats.item1); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) + _enemies.at(_enemyIndex).stats.item1 = (uint16_t)i; if (is_selected) ImGui::SetItemDefaultFocus(); ImGui::PopID(); @@ -230,12 +232,12 @@ void Enemies::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Item #2", this->_items->at(this->_enemies.at(this->_enemyIndex).stats.item2).name)) { - for (size_t i = 0; i < this->_items->size(); i++) { + if (ImGui::BeginCombo("Item #2", Items::getInstance().getItems().at(_enemies.at(_enemyIndex).stats.item2).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).stats.item2); - if (ImGui::Selectable(this->_items->at(i).name, is_selected)) { - this->_enemies.at(this->_enemyIndex).stats.item2 = (uint16_t)i; + bool is_selected = (i == _enemies.at(_enemyIndex).stats.item2); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _enemies.at(_enemyIndex).stats.item2 = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -246,23 +248,23 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Item #1 Chance", &this->_enemies.at(this->_enemyIndex).stats.item1Chance); - drawInput("Item #2 Chance", &this->_enemies.at(this->_enemyIndex).stats.item2Chance); + drawInput("Item #1 Chance", &_enemies.at(_enemyIndex).stats.item1Chance); + drawInput("Item #2 Chance", &_enemies.at(_enemyIndex).stats.item2Chance); - ImGui::Checkbox("Moves", &this->_showMoves); + ImGui::Checkbox("Moves", &_showMoves); ImGui::SameLine(); - ImGui::Checkbox("AI", &this->_showAI); + ImGui::Checkbox("AI", &_showAI); ImGui::End(); - if (this->_showMoves) { + if (_showMoves) { ImGui::Begin("ENEMY MOVES"); - if (ImGui::BeginCombo("Move Index", this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].name)) { + if (ImGui::BeginCombo("Move Index", _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].name)) { for (size_t i = 0; i < 5; i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_moveIndex); - if (ImGui::Selectable(this->_enemies.at(this->_enemyIndex).moveSet.moves[i].name, is_selected)) { - this->_moveIndex = i; + bool is_selected = (i == _moveIndex); + if (ImGui::Selectable(_enemies.at(_enemyIndex).moveSet.moves[i].name, is_selected)) { + _moveIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -271,23 +273,23 @@ void Enemies::draw() { } for (size_t i = 0; i < 8; i++) { - MoveAilmentBitFlags[i] = this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ailmentsBitflag & (1 << i); + MoveAilmentBitFlags[i] = _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ailmentsBitflag & (1 << i); } ImGui::EndCombo(); } - ImGui::InputText("Name", this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].name, 19); - drawInput("MP Cost", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.mp); - drawInput("SP Cost", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.sp); - drawInput("Unknown #1", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.unknown); + ImGui::InputText("Name", _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].name, 19); + drawInput("MP Cost", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.mp); + drawInput("SP Cost", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.sp); + drawInput("Unknown #1", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.unknown); - if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetEffect).c_str())) { + if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetEffect).c_str())) { for (size_t i = 0; i < targetEffectDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetEffect); + bool is_selected = (i == _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetEffect); if (ImGui::Selectable(targetEffectDefs.at(i).c_str())) { - this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetEffect = (uint8_t)i; + _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetEffect = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -297,16 +299,16 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Strength", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.str); - drawInput("Power", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.pow); - drawInput("Damage(?)", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ad); + drawInput("Strength", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.strength); + drawInput("Power", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.power); + drawInput("Damage(?)", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ad); - if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetType).c_str())) { + if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetType).c_str())) { for (size_t i = 0; i < targetTypeDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetType); + bool is_selected = (i == _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetType); if (ImGui::Selectable(targetTypeDefs.at(i).c_str())) { - this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.targetType = (uint8_t)i; + _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetType = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -316,21 +318,21 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Unknown #2", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.normalAttackFlag); - drawInput("Distance", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.distance); + drawInput("Unknown #2", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.normalAttackFlag); + drawInput("Distance", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.distance); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How far away to use move?"); - drawInput("Accuracy", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.accuracy); - drawInput("Range", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.range); + drawInput("Accuracy", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.accuracy); + drawInput("Range", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.range); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How big is the move area?"); - drawInput("Cast Time", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.castTime); - drawInput("Recovery", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.recovery); + drawInput("Cast Time", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.castTime); + drawInput("Recovery", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.recovery); - if (ImGui::BeginCombo("Animation", animationDefs.at(this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.animation).c_str())) { - for (size_t i = 0; i < this->_moves->size(); i++) { + if (ImGui::BeginCombo("Animation", animationDefs.at(_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.animation).c_str())) { + for (size_t i = 0; i < Moves::getInstance().getMoves().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.animation); + bool is_selected = (i == _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.animation); if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { - this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.animation = (uint8_t)i; + _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.animation = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -341,18 +343,18 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Knockdown", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.knockDown); + drawInput("Knockdown", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.knockDown); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Will this move knockdown those hit?"); - drawInput("IP Stun/IP Cancel Stun", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ipStun); - drawInput("Knockback", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.knockback); + drawInput("IP Stun/IP Cancel Stun", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ipStun); + drawInput("Knockback", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.knockback); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How much move will knockback those hit."); - if (ImGui::BeginCombo("Element", elementDefs.at(this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.element).c_str())) { + if (ImGui::BeginCombo("Element", elementDefs.at(_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.element).c_str())) { for (size_t i = 0; i < elementDefs.size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.element); + bool is_selected = (i == _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.element); if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { - this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.element = (uint8_t)i; + _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.element = (uint8_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -363,34 +365,34 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Element Strength", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.elementStr); + drawInput("Element Strength", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.elementStrength); if (ImGui::IsItemHovered()) ImGui::SetTooltip("* 10 percent of damage is this element."); for (size_t i = 0; i < 8; i++) { if (ImGui::Checkbox(statusDefs.at(i).c_str(), &MoveAilmentBitFlags[i])) { - this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ailmentsBitflag ^= (1 << i); + _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ailmentsBitflag ^= (1 << i); } if ((i+1) % 4) { ImGui::SameLine(); } } - drawInput("Ailments Chance", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.ailmentsChance); - drawInputN("Atk/Def/Act/Mov Mods", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.atkMod, 4); - drawInput("Special", &this->_enemies.at(this->_enemyIndex).moveSet.moves[this->_moveIndex].stats.special); + drawInput("Ailments Chance", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.ailmentsChance); + drawInputN("Atk/Def/Act/Mov Mods", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.atkMod, 4); + drawInput("Special", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.special); if (ImGui::IsItemHovered()) ImGui::SetTooltip("In Beta, use at your own peril."); ImGui::End(); } - if (this->_showAI) { + if (_showAI) { ImGui::Begin("ENEMY AI"); - if (ImGui::BeginCombo("AI Index", std::format("AI Index {}", this->_aiIndex + 1).c_str())) { + if (ImGui::BeginCombo("AI Index", std::format("AI Index {}", _aiIndex + 1).c_str())) { for (size_t i = 0; i < 5; i++) { ImGui::PushID((int)i); - bool is_selected = (i == this->_aiIndex); + bool is_selected = (i == _aiIndex); if (ImGui::Selectable(std::format("AI Index {}", i + 1).c_str(), is_selected)) { - this->_aiIndex = i; + _aiIndex = i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -401,12 +403,12 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("AI Type", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].aiType); - drawInput("Move #1 Chance", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].move1Chance); - drawInput("Move #2 Chance", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].move2Chance); - drawInput("Move #3 Chance", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].move3Chance); - drawInput("Move #4 Chance", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].move4Chance); - drawInput("Move #5 Chance", &this->_enemies.at(this->_enemyIndex).ai[this->_aiIndex].move5Chance); + drawInput("AI Type", &_enemies.at(_enemyIndex).ai[_aiIndex].aiType); + drawInput("Move #1 Chance", &_enemies.at(_enemyIndex).ai[_aiIndex].move1Chance); + drawInput("Move #2 Chance", &_enemies.at(_enemyIndex).ai[_aiIndex].move2Chance); + drawInput("Move #3 Chance", &_enemies.at(_enemyIndex).ai[_aiIndex].move3Chance); + drawInput("Move #4 Chance", &_enemies.at(_enemyIndex).ai[_aiIndex].move4Chance); + drawInput("Move #5 Chance", &_enemies.at(_enemyIndex).ai[_aiIndex].move5Chance); ImGui::End(); } @@ -417,10 +419,10 @@ void Enemies::outputToCSV() { auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); std::ofstream stream; - stream.open(this->isHardmode ? "./csv/ENEMIES_HARDMODE.CSV" : "./csv/ENEMIES.CSV"); + stream.open(Difficulty::getInstance().isHardMode() ? "./csv/ENEMIES_HARDMODE.CSV" : "./csv/ENEMIES.CSV"); std::ofstream output2; - output2.open(this->isHardmode ? "./csv/ENEMY_HARDMODE_MOVES.CSV" : "./csv/ENEMY_MOVES.CSV"); + output2.open(Difficulty::getInstance().isHardMode() ? "./csv/ENEMY_HARDMODE_MOVES.CSV" : "./csv/ENEMY_MOVES.CSV"); if (!stream.is_open() || !output2.is_open()) { return; @@ -432,7 +434,7 @@ void Enemies::outputToCSV() { output2 << "Enemy,Move,MP,SP,???,Target Effect,STR,POW,AD,Target Type,???,Distance,Accuracy,Range,Cast Time,Recovery,Animation,Knockdown,IP Stun,IP Cancel Stun,Knockback,Element,Element Strength,Status Effect Bitflag," << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special\n"; - for (const auto& val : this->_enemies) { + for (const auto& val : _enemies) { stream << val.name << ',' << std::to_string(val.stats.type1) << ',' << std::to_string(val.stats.type2) << ',' @@ -465,8 +467,8 @@ void Enemies::outputToCSV() { << std::to_string(val.stats.skillCoins) << ',' << std::to_string(val.stats.magicCoins) << ',' << std::to_string(val.stats.goldCoins) << ',' - << this->_items->at(val.stats.item1).name << ',' - << this->_items->at(val.stats.item2).name << ',' + << Items::getInstance().getItems().at(val.stats.item1).name << ',' + << Items::getInstance().getItems().at(val.stats.item2).name << ',' << std::to_string(val.stats.item1Chance) << ',' << std::to_string(val.stats.item2Chance) << '\n'; @@ -481,8 +483,8 @@ void Enemies::outputToCSV() { << std::to_string(val.moveSet.moves[i].stats.sp) << ',' << std::to_string(val.moveSet.moves[i].stats.unknown) << ',' << targetEffectDefs.at(val.moveSet.moves[i].stats.targetEffect) << ',' - << std::to_string(val.moveSet.moves[i].stats.str) << ',' - << std::to_string(val.moveSet.moves[i].stats.pow) << ',' + << std::to_string(val.moveSet.moves[i].stats.strength) << ',' + << std::to_string(val.moveSet.moves[i].stats.power) << ',' << std::to_string(val.moveSet.moves[i].stats.ad) << ',' << targetTypeDefs.at(val.moveSet.moves[i].stats.targetType) << ',' << std::to_string(val.moveSet.moves[i].stats.normalAttackFlag) << ',' @@ -497,7 +499,7 @@ void Enemies::outputToCSV() { << std::to_string(val.moveSet.moves[i].stats.ipCancelStun) << ',' << std::to_string(val.moveSet.moves[i].stats.knockback) << ',' << elementDefs.at(val.moveSet.moves[i].stats.element) << ',' - << std::to_string(val.moveSet.moves[i].stats.elementStr) << ',' + << std::to_string(val.moveSet.moves[i].stats.elementStrength) << ',' << std::to_string(val.moveSet.moves[i].stats.ailmentsBitflag) << ',' << std::to_string(val.moveSet.moves[i].stats.ailmentsChance) << ',' << std::to_string(val.moveSet.moves[i].stats.atkMod) << ',' @@ -516,19 +518,19 @@ void Enemies::randomize() { std::random_device rd; std::mt19937 g(rd()); - for (auto& enemy : this->_enemies) { + for (auto& enemy : _enemies) { // keep going until an item is hit do { - enemy.stats.item1 = (uint16_t)((size_t)g() % this->_items->size()); - } while (std::string(this->_items->at(enemy.stats.item1).name).find_first_not_of(' ') == std::string::npos); + enemy.stats.item1 = (uint16_t)((size_t)g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(enemy.stats.item1).name).find_first_not_of(' ') == std::string::npos); // random chance for the item to be removed if (g() % 10 == 0) enemy.stats.item1 = 0; do { - enemy.stats.item2 = (uint16_t)((size_t)g() % this->_items->size()); - } while (std::string(this->_items->at(enemy.stats.item2).name).find_first_not_of(' ') == std::string::npos); + enemy.stats.item2 = (uint16_t)((size_t)g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(enemy.stats.item2).name).find_first_not_of(' ') == std::string::npos); // random chance for the item to be removed if (g() % 10 == 0) { diff --git a/src/enemies/Enemies.h b/src/enemies/Enemies.h new file mode 100644 index 0000000..83570c8 --- /dev/null +++ b/src/enemies/Enemies.h @@ -0,0 +1,45 @@ +#pragma once +#include +#include + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./Enemy.h" + +class Enemies : public BaseDataInterface { +public: + Enemies(const Enemies&) = delete; + Enemies(const Enemies&&) = delete; + + static Enemies& getInstance() { + static Enemies instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + + const std::vector& getEnemies() { return _enemies; }; + +private: + Enemies() { + _directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/" : "./data/afs/"); + read(); + }; + + void writeEnemy(std::fstream& stream, const Enemy& enemy, bool isSecond = false); + void readEnemy(std::ifstream& stream, std::string& filename, bool isSecond = false); + + std::vector _enemies; + size_t _enemyIndex = 0; + bool AilmentBitFlags[8] = {}; + bool MoveAilmentBitFlags[8] = {}; + size_t _moveIndex = 0; + size_t _aiIndex = 0; + bool _showMoves = false; + bool _showAI = false; +}; \ No newline at end of file diff --git a/src/enemies/Enemy.h b/src/enemies/Enemy.h new file mode 100644 index 0000000..844e4fd --- /dev/null +++ b/src/enemies/Enemy.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +#include "./EnemyMoves.h" +#include "./EnemyStats.h" +#include "./EnemyAI.h" + +struct Enemy { + char* name = new char[19]{}; + EnemyStats stats; + EnemyAI ai[6]{}; + EnemyMoves moveSet{}; + bool isSecond = false; + + std::string filename = ""; +}; \ No newline at end of file diff --git a/src/enemies/EnemyAI.h b/src/enemies/EnemyAI.h new file mode 100644 index 0000000..458afce --- /dev/null +++ b/src/enemies/EnemyAI.h @@ -0,0 +1,13 @@ +#pragma once +#include + +#pragma pack(1) +struct EnemyAI { + uint8_t aiType = 0; + uint8_t move1Chance = 0; + uint8_t move2Chance = 0; + uint8_t move3Chance = 0; + uint8_t move4Chance = 0; + uint8_t move5Chance = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/enemies/EnemyMoves.h b/src/enemies/EnemyMoves.h new file mode 100644 index 0000000..db5b916 --- /dev/null +++ b/src/enemies/EnemyMoves.h @@ -0,0 +1,44 @@ +#pragma once +#include + +#pragma pack(1) +struct EnemyMoveStats { + uint16_t mp = 0; + uint16_t sp = 0; + uint8_t unknown = 0; + uint8_t targetEffect = 0; + uint16_t strength = 0; + uint16_t power = 0; + uint16_t ad = 0; + uint8_t targetType = 0; + uint8_t normalAttackFlag = 0; + uint16_t distance = 0; + uint16_t accuracy = 0; + uint16_t range = 0; + uint16_t castTime = 0; + uint16_t recovery = 0; + uint8_t animation = 0; + uint8_t knockDown = 0; + int16_t ipStun = 0; + int16_t ipCancelStun = 0; + int16_t knockback = 0; + uint8_t element = 0; + uint8_t elementStrength = 0; + uint8_t ailmentsBitflag = 0; + uint8_t ailmentsChance = 0; + int8_t atkMod = 0; + int8_t defMod = 0; + int8_t actMod = 0; + int8_t movMod = 0; + uint16_t special = 0; +}; +#pragma pack() + +struct EnemyMove { + char* name = new char[19]{}; + EnemyMoveStats stats; +}; + +struct EnemyMoves { + EnemyMove moves[5]{}; +}; \ No newline at end of file diff --git a/src/enemies/EnemyStats.h b/src/enemies/EnemyStats.h new file mode 100644 index 0000000..29378b9 --- /dev/null +++ b/src/enemies/EnemyStats.h @@ -0,0 +1,49 @@ +#pragma once +#include + +#pragma pack(1) +struct EnemyStats { + uint8_t unknown = 0; + uint8_t unknown1 = 0; + uint8_t type1 = 0; + uint8_t type2 = 0; + int16_t level = 0; + int32_t health = 0; + int16_t mp = 0; + int16_t sp = 0; + int16_t vit = 0; + int16_t agi = 0; + int16_t spd = 0; + int16_t men = 0; + int16_t stamina = 0; + int16_t ipStun = 0; + int16_t ipCancelStun = 0; + int8_t evasionStillRate = 0; + int8_t evasionMovingRate = 0; + int8_t fireResist = 0; + int8_t windResist = 0; + int8_t earthResist = 0; + int8_t lightningResist = 0; + int8_t blizzardResist = 0; + uint8_t ailmentsBitflag = 0; + int16_t knockbackResist = 0; + int16_t T_REC = 0; + int16_t T_DMG = 0; + int16_t unknown2 = 0; + int16_t T_HEAL = 0; + int16_t size = 0; + int16_t unknown3 = 0; + int8_t unknown4 = 0; + int8_t noRunFlag = 0; + int16_t unknown5 = 0; + int32_t exp = 0; + int32_t skillCoins = 0; + int32_t magicCoins = 0; + int32_t goldCoins = 0; + uint16_t item1 = 0; + uint16_t item2 = 0; + int8_t item1Chance = 0; + int8_t item2Chance = 0; + uint16_t unknown6 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/include/BaseDataClass.h b/src/include/BaseDataClass.h deleted file mode 100644 index 33d310e..0000000 --- a/src/include/BaseDataClass.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include - -class BaseDataClass { - -public: - virtual void write() {}; - virtual void read(std::string) {}; - virtual void draw() {}; - virtual void outputToCSV() {}; - -protected: - std::string _filename; - std::string _directory; -}; \ No newline at end of file diff --git a/src/include/BossesClass.h b/src/include/BossesClass.h deleted file mode 100644 index d34a857..0000000 --- a/src/include/BossesClass.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "./common/version_check.h" - -#include "./BaseDataClass.h" -#include "./EnemiesClass.h" - -struct BossStruct { - char* name = new char[19]{}; - EnemyStatsStruct stats; - EnemyAIStruct ai[6]{}; - std::vector moveSets{}; - bool isSecond = false; - - std::string filename = ""; -}; - -class Bosses : public BaseDataClass { -public: - Bosses(const Bosses&) = delete; - Bosses(const Bosses&&) = delete; - - static Bosses& getInstance() { - static Bosses instance; - return instance; - }; - - void write(); - void read(bool isHardmode = false); - void draw(); - void outputToCSV(); - void randomize(); - void storeMoves(const std::vector* moves) { _moves = moves; }; - void storeItems(const std::vector* items) { _items = items; }; - const std::vector* getBosses() { return &_bosses; }; - -private: - Bosses() { - this->_directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/" : "./data/afs/"); - }; - - void writeBoss(std::fstream& stream, const BossStruct& boss, bool isSecond = false); - void readBoss(std::ifstream& stream, std::string& filename, bool isSecond = false); - - std::vector _bosses; - size_t _bossIndex = 0; - bool AilmentBitFlags[8] = {}; - bool MoveAilmentBitFlags[8] = {}; - size_t _moveSetIndex = 0; - size_t _moveIndex = 0; - size_t _aiIndex = 0; - bool isHardmode = false; - bool _showMoves = false; - bool _showAI = false; - - const std::vector* _moves = nullptr; - const std::vector* _items = nullptr; -}; \ No newline at end of file diff --git a/src/include/EnemiesClass.h b/src/include/EnemiesClass.h deleted file mode 100644 index 3d39c2a..0000000 --- a/src/include/EnemiesClass.h +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include -#include - -#include "./common/version_check.h" - -#include "./BaseDataClass.h" -#include "./MovesClass.h" -#include "./ItemsClass.h" - -#pragma pack(1) -struct EnemyAIStruct { - uint8_t aiType = 0; - uint8_t move1Chance = 0; - uint8_t move2Chance = 0; - uint8_t move3Chance = 0; - uint8_t move4Chance = 0; - uint8_t move5Chance = 0; -}; -#pragma pack() - -#pragma pack(1) -struct EnemyMoveStatsStruct { - - uint16_t mp = 0; - uint16_t sp = 0; - uint8_t unknown = 0; - uint8_t targetEffect = 0; - uint16_t str = 0; - uint16_t pow = 0; - uint16_t ad = 0; - uint8_t targetType = 0; - uint8_t normalAttackFlag = 0; - uint16_t distance = 0; - uint16_t accuracy = 0; - uint16_t range = 0; - uint16_t castTime = 0; - uint16_t recovery = 0; - uint8_t animation = 0; - uint8_t knockDown = 0; - int16_t ipStun = 0; - int16_t ipCancelStun = 0; - int16_t knockback = 0; - uint8_t element = 0; - uint8_t elementStr = 0; - uint8_t ailmentsBitflag = 0; - uint8_t ailmentsChance = 0; - int8_t atkMod = 0; - int8_t defMod = 0; - int8_t actMod = 0; - int8_t movMod = 0; - uint16_t special = 0; - -}; -#pragma pack() - -struct EnemyMoveStruct { - char* name = new char[19]{}; - EnemyMoveStatsStruct stats; -}; - -#pragma pack(1) -struct EnemyStatsStruct { - uint8_t unknown = 0; - uint8_t unknown1 = 0; - uint8_t type1 = 0; - uint8_t type2 = 0; - int16_t level = 0; - int32_t health = 0; - int16_t mp = 0; - int16_t sp = 0; - int16_t vit = 0; - int16_t agi = 0; - int16_t spd = 0; - int16_t men = 0; - int16_t stamina = 0; - int16_t ipStun = 0; - int16_t ipCancelStun = 0; - int8_t evasionStillRate = 0; - int8_t evasionMovingRate = 0; - int8_t fireResist = 0; - int8_t windResist = 0; - int8_t earthResist = 0; - int8_t lightningResist = 0; - int8_t blizzardResist = 0; - uint8_t ailmentsBitflag = 0; - int16_t knockbackResist = 0; - int16_t T_REC = 0; - int16_t T_DMG = 0; - int16_t unknown2 = 0; - int16_t T_HEAL = 0; - int16_t size = 0; - int16_t unknown3 = 0; - int8_t unknown4 = 0; - int8_t noRunFlag = 0; - int16_t unknown5 = 0; - int32_t exp = 0; - int32_t skillCoins = 0; - int32_t magicCoins = 0; - int32_t goldCoins = 0; - uint16_t item1 = 0; - uint16_t item2 = 0; - int8_t item1Chance = 0; - int8_t item2Chance = 0; - uint16_t unknown6 = 0; -}; -#pragma pack() - -struct EnemyMovesStruct { - EnemyMoveStruct moves[5]{}; -}; - -struct EnemyStruct { - char* name = new char[19]{}; - EnemyStatsStruct stats; - EnemyAIStruct ai[6]{}; - EnemyMovesStruct moveSet{}; - bool isSecond = false; - - std::string filename = ""; -}; - -class Enemies : public BaseDataClass { -public: - Enemies(const Enemies&) = delete; - Enemies(const Enemies&&) = delete; - - static Enemies& getInstance() { - static Enemies instance; - return instance; - }; - - void write(); - void read(bool isHardmode = false); - void draw(); - void outputToCSV(); - void randomize(); - - void storeMoves(const std::vector* moves) { _moves = moves; }; - void storeItems(const std::vector* items) { _items = items; }; - const std::vector* getEnemies() { return &_enemies; }; - -private: - Enemies() { - this->_directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/" : "./data/afs/"); - }; - - void writeEnemy(std::fstream& stream, const EnemyStruct& enemy, bool isSecond = false); - void readEnemy(std::ifstream& stream, std::string& filename, bool isSecond = false); - - std::vector _enemies; - size_t _enemyIndex = 0; - bool AilmentBitFlags[8] = {}; - bool MoveAilmentBitFlags[8] = {}; - size_t _moveIndex = 0; - size_t _aiIndex = 0; - bool isHardmode = false; - bool _showMoves = false; - bool _showAI = false; - - const std::vector* _moves = nullptr; - const std::vector* _items = nullptr; -}; \ No newline at end of file diff --git a/src/include/ItemsClass.h b/src/include/ItemsClass.h deleted file mode 100644 index 8db2532..0000000 --- a/src/include/ItemsClass.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "BaseDataClass.h" -#include "MovesClass.h" - -#pragma pack(1) -struct EquipmentStruct { - uint16_t characterBitflag = 0b00000000; - int16_t str = 0; - int16_t vit = 0; - int16_t act = 0; - int16_t mov = 0; - uint8_t effectiveOn = 0; - int8_t fireAffinity = 0; - int8_t windAffinity = 0; - int8_t earthAffinity = 0; - int8_t lightningAffinity = 0; - int8_t blizzardAffinity = 0; - uint8_t ailmentsBitflag = 0b00000000; - uint8_t ailmentsChance = 0; - int8_t increaseFirePercent = 0; - int8_t increaseWindPercent = 0; - int8_t increaseEarthPercent = 0; - int8_t increaseLightningPercent = 0; - int8_t increaseBlizzardPercent = 0; - int8_t increaseWaterPercent = 0; - int8_t increaseExplosionPercent = 0; - int8_t increaseForestPercent = 0; - uint16_t special = 0; -}; -#pragma pack() - -#pragma pack(1) -struct UsableStruct { - uint8_t targetEffect = 0; - uint8_t targetType = 0; - uint16_t power = 0; - uint16_t range = 0; - uint16_t castTime = 0; - uint16_t recoveryTime = 0; - uint16_t animation = 0; - uint8_t effectiveOn = 0; - uint8_t unknown1 = 0; - int16_t ipDamage = 0; - int16_t ipCancelDamage = 0; - int16_t knockback = 0; - uint8_t element = 0; - uint8_t elementStr = 0; - uint8_t ailmentsBitflag = 0b00000000; - uint8_t ailmentsChance = 0; - int8_t atkMod = 0; - int8_t defMod = 0; - int8_t actMod = 0; - int8_t movMod = 0; - uint8_t breakChance = 0; - uint8_t special = 0; - uint8_t unknown2 = 0; - uint8_t unknown3 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct ItemStatsStruct { - uint8_t entryType = 0; - uint8_t unknown1 = 0; - uint8_t unknown2 = 0; - uint8_t unknown3 = 0; - uint8_t icon = 0; - uint8_t unknown4 = 0; - uint32_t price = 0; -}; -#pragma pack() - -// the game only has 700 items total, and this is split into segments with 100 entries(items) each -struct ItemStruct { - char name[19]; - char description[41]; - ItemStatsStruct stats; - EquipmentStruct* equipmentOffset = nullptr; // 0xFFFFFFFF means null - UsableStruct* usableOffset = nullptr; // 0xFFFFFFFF means null - uint32_t id = 0; // overwrite this to array index, index is used for overworld items and enemy drops -}; - - -class Items : public BaseDataClass { -public: - Items(const Items&) = delete; - Items(const Items&&) = delete; - - static Items& getInstance() { - static Items instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - - void storeMoves(const std::vector* moves) { _moves = moves; }; - const std::vector* getItems() { return &_items; }; - -private: - Items() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/ITEM.BIN" : "./data/afs/xls_data/ITEM.BIN"); - }; - std::vector _items; - size_t _itemIndex = 0; - bool _hasEquip = false; - bool _hasUsable = false; - bool EquipmentCharacterBitFlags[7] = {}; - bool EquipmentAilmentBitFlags[8] = {}; - bool UsableAilmentBitFlags[8] = {}; - - const std::vector* _moves = nullptr; -}; \ No newline at end of file diff --git a/src/include/LevelupsClass.h b/src/include/LevelupsClass.h deleted file mode 100644 index fefa98a..0000000 --- a/src/include/LevelupsClass.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "./BaseDataClass.h" - -static const size_t maxLevel = 99; - -#pragma pack(1) -struct LevelupStruct { - int32_t exp = 0; - int16_t hpIncrease = 0; - int16_t mpIncrease = 0; - int16_t spIncrease = 0; - int16_t strIncrease = 0; - int16_t vitIncrease = 0; - int16_t actIncrease = 0; - int16_t movIncrease = 0; - int16_t magIncrease = 0; - int16_t menIncrease = 0; - int16_t skillSlotIncrease = 0; -}; -#pragma pack() - -struct CharacterLevelupStruct { - LevelupStruct levelups[99]; -}; - -class Levelups : public BaseDataClass { -public: - Levelups(const Levelups&) = delete; - Levelups(const Levelups&&) = delete; - - static Levelups& getInstance() { - static Levelups instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - - CharacterLevelupStruct* getLevelUps() { - if (_levelups.size()) { - return &_levelups.at(0); - } else { - return nullptr; - } - }; - - size_t getNumCharacterLevelUps() { return _levelups.size(); }; -private: - Levelups() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_LVUP.BIN" : "./data/afs/xls_data/TB_LVUP.BIN"); - }; - - std::vector _levelups; - size_t _characterIndex = 0; - size_t _characterLevelupIndex = 0; -}; \ No newline at end of file diff --git a/src/include/ManaEggsClass.h b/src/include/ManaEggsClass.h deleted file mode 100644 index 0d4994f..0000000 --- a/src/include/ManaEggsClass.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "BaseDataClass.h" -#include "MovesClass.h" - -struct SpellImplementationStruct { - uint8_t spellOffset = 0; - uint8_t startingLevel = 0; - uint8_t eggLevelRequired = 0; - uint8_t unknown1 = 0; -}; - -struct ManaEggStruct { - SpellImplementationStruct spells[18]; -}; - -class ManaEggs : public BaseDataClass { -public: - ManaEggs(const ManaEggs&) = delete; - ManaEggs(const ManaEggs&&) = delete; - - static ManaEggs& getInstance() { - static ManaEggs instance; - return instance; - }; - - - void write(); - void read(); - void draw(); - void outputToCSV(); - void randomize(); - - void storeMoves(const std::vector* moves) { _moves = moves; }; - const std::vector* getManaEggs() { return &_manaeggs; }; - -private: - ManaEggs() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_MAGIC.BIN" : "./data/afs/xls_data/TB_MAGIC.BIN"); - }; - - std::vector _manaeggs; - size_t _eggIndex = 0; - size_t _spellIndex = 0; - - const std::vector* _moves = nullptr; -}; \ No newline at end of file diff --git a/src/include/MdtsClass.h b/src/include/MdtsClass.h deleted file mode 100644 index b34c770..0000000 --- a/src/include/MdtsClass.h +++ /dev/null @@ -1,356 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "./BaseDataClass.h" - -#include "./ItemsClass.h" -#include "./EnemiesClass.h" -#include "./ModelClass.h" - -#pragma pack(1) -struct MapEntriesStruct { // 0x00000008 && 0x0000000C - - uint32_t ID = 0; // first is always 0x1000 - float xPos = 0.0f; - float yPos = 0.0f; - float zPos = 0.0f; - float direction = 0.0f; - float unknown = 0.0f; - uint32_t unknown1 = 0; - uint32_t unknown2 = 0; - -}; -#pragma pack() - -#pragma pack(1) -struct InstancesStruct { // 0x00000018 && 0x0000001C - uint16_t ID = 0; - uint16_t index = 0; - uint16_t unknown = 0; - uint16_t translation = 0; - float xPos = 0.0f; - float yPos = 0.0f; - float zPos = 0.0f; - float xAngle = 0.0f; - float yAngle = 0.0f; - float zAngle = 0.0f; - float cx = 0.0f; - float cy = 0.0f; - float cz = 0.0f; -}; -#pragma pack() - -#pragma pack(1) -struct HTAStruct { // 0x00000020 && 0x00000024 - uint8_t shape = 0; - uint8_t type = 0; - uint8_t trigger = 0; - uint32_t unknown = 0; - uint8_t unknown1 = 0; - float xMin = 0.0f; - float yMin = 0.0f; - float zMin = 0.0f; - float xMax = 0.0f; - float yMax = 0.0f; - float zMax = 0.0f; - uint32_t unknown2 = 0; - uint32_t unknown3 = 0; - uint32_t unknown4 = 0; - uint32_t unknown5 = 0; - uint32_t unknown6 = 0; - uint32_t unknown7 = 0; - uint32_t unknown8 = 0; - uint32_t unknown9 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct EnemyPositionStruct { // 0x00000038 && 0x0000003C - uint16_t index = 0; - uint16_t unknown = 0; - float xPosMin = 0.0f; - float zPosMin = 0.0f; - float xPosMax = 0.0f; - float zPosMax = 0.0f; - float xPos = 0.0f; - float yPos = 0.0f; - float zPos = 0.0f; - - float unknownX = 0.0f; - float unknownY = 0.0f; - float unknownZ = 0.0f; - float unknownX1 = 0.0f; - float unknownY1 = 0.0f; - float unknownZ1 = 0.0f; - float unknownX2 = 0.0f; - float unknownY2 = 0.0f; - float unknownZ2 = 0.0f; -}; -#pragma pack() - -#pragma pack(1) -struct EnemyFirstUnknownStruct { - uint16_t unknown = 0; - uint16_t unknown1 = 0; - uint16_t unknown2 = 0; - uint16_t unknown3 = 0; - uint16_t unknown4 = 0; - float unknown5 = 0; - uint16_t unknown6 = 0; - uint16_t unknown7 = 0; - uint16_t unknown8 = 0; - uint16_t unknown9 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct EnemyTypeStruct { - uint16_t index = 0; // unsure about this - uint16_t numEnemy = 0; - uint16_t enemyOffset = 0; - uint16_t unknown = 0; - uint16_t unknown1 = 0; - uint16_t unknown2 = 0; - uint16_t unknown3 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct EnemySecondUnknownStruct { - uint16_t unknown = 0; - uint16_t unknown1 = 0; - uint16_t unknown2 = 0; - uint16_t unknown3 = 0; - uint16_t unknown4 = 0; - uint16_t unknown5 = 0; - uint16_t unknown6 = 0; - uint16_t unknown7 = 0; - uint16_t unknown8 = 0; - uint16_t unknown9 = 0; - uint16_t unknown10 = 0; - uint16_t unknown11 = 0; - uint16_t unknown12 = 0; - uint16_t unknown13 = 0; - uint16_t unknown14 = 0; - uint16_t unknown15 = 0; - uint16_t unknown16 = 0; - uint16_t unknown17 = 0; - uint16_t unknown18 = 0; - uint16_t unknown19 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct EnemyGroupStruct { // 0x00000048 && 0x0000004C - uint16_t index = 0; - EnemyFirstUnknownStruct unknown; - EnemyTypeStruct enemies[4]; - EnemySecondUnknownStruct unknown1; -}; -#pragma pack() - -#pragma pack(1) -struct MOSStruct { // 0x00000050 && 0x00000054 - uint16_t ID = 0; - uint16_t index = 0; - uint32_t unknown = 0; - int16_t xPos = 0; - int16_t yPos = 0; - int16_t zPos = 0; - uint32_t unknown1 = 0; - uint32_t unknown2 = 0; - uint32_t unknown3 = 0; - uint32_t unknown4 = 0; - uint16_t unknown5 = 0; -}; -#pragma pack() - -#pragma pack(1) -struct IconStruct { // 0x00000098 && 0x0000009C - uint8_t ID = 0; - uint16_t unknown = 0; - uint8_t unknown1 = 0; - float xPos = 0.0f; - float yPos = 0.0f; - float zPos = 0.0f; - float unknown2 = 0; - float yAngle = 0; - uint16_t item1 = 0; - uint16_t item2 = 0; - uint16_t item3 = 0; - uint16_t flag = 0; -}; -#pragma pack() - -#pragma pack(1) -struct ShopItemStruct { - uint16_t item = 0; // offset by 0x0800 -}; -#pragma pack() - -#pragma pack(1) -struct ShopStruct { // 0x000000A8 && 0x000000AC - uint16_t mapID = 0; - uint16_t catagories = 0; - char weaponChar[8]; - ShopItemStruct weapons[12]; - char armorChar[8]; - ShopItemStruct armors[12]; - char jewelryChar[8]; - ShopItemStruct jewelry[12]; - char itemsChar[8]; - ShopItemStruct items[12]; - char regionalChar[8]; - ShopItemStruct regionals[12]; -}; -#pragma pack() - -#pragma pack(1) -struct mdtHeader { - uint32_t headerLength = 0; - uint32_t unknown = 0; - - uint32_t numMapEntries = 0; - uint32_t offsetMapEntries = 0; - - uint32_t unknown1 = 0; - uint32_t unknown2 = 0; - - uint32_t numInstances = 0; - uint32_t offsetInstances = 0; - - uint32_t numHTA = 0; - uint32_t offsetHTA = 0; - - uint32_t numScripts = 0; - uint32_t offsetScripts = 0; - - uint32_t unknown3 = 0; - uint32_t unknown4 = 0; - - uint32_t numEnemyPos = 0; - uint32_t offsetEnemyPos = 0; - - uint32_t unknown5 = 0; - uint32_t unknown6 = 0; - - uint32_t numEnemyGroup = 0; - uint32_t offsetEnemyGroup = 0; - - uint32_t numMOS = 0; - uint32_t offsetMOS = 0; - - uint32_t unknown7 = 0; - uint32_t unknown8 = 0; - - uint32_t unknown9 = 0; - uint32_t unknown10 = 0; - - uint32_t unknown11 = 0; - uint32_t unknown12 = 0; - - uint32_t unknown13 = 0; // check D800.mdt - uint32_t unknown14 = 0; - - uint32_t lengthDialogue = 0; - uint32_t offsetDialogue = 0; - - uint32_t unknown15 = 0; - uint32_t unknown16 = 0; - - uint32_t unknown17 = 0; - uint32_t unknown18 = 0; - - uint32_t unknown19 = 0; - uint32_t unknown20 = 0; - - uint32_t numIcons = 0; - uint32_t offsetIcons = 0; - - uint32_t unknown21 = 0; - uint32_t unknown22 = 0; - - uint32_t lengthShop = 0; - uint32_t offsetShop = 0; - - uint32_t unknown23 = 0; // so far always 0x0000 - uint32_t unknown24 = 0; // so far always 0x0000 - - uint32_t unknown25 = 0; - uint32_t unknown26 = 0; - - uint32_t unknown27 = 0; - uint32_t unknown28 = 0; -}; -#pragma pack() - -struct MdtStruct { - mdtHeader header; - std::vector mapEntries; - std::vector instances; - std::vector HTA; - std::vector enemyPositions; - std::vector enemyGroups; - std::vector MOS; - std::vector icons; - std::vector shop; - - //std::vector models; - - std::string mapname = ""; - std::string filename = ""; - std::string filenameChr = ""; -}; - -class Mdts : public BaseDataClass { -public: - Mdts(const Mdts&) = delete; - Mdts(const Mdts&&) = delete; - - static Mdts& getInstance() { - static Mdts instance; - return instance; - }; - - - void write(); - void read(); - void draw(); - void outputToCSV(); - void randomize(); - - void storeItems(const std::vector* items) { _items = items; }; - void storeEnemies(const std::vector* enemies) { _enemies = enemies; }; - void storeModels(const std::vector* models) { _models = models; }; - const std::vector* getMdts() { return &_mdts; }; - -private: - Mdts() { - this->_directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/map/" : "./data/afs/map/"); - }; - - std::vector _mdts; - size_t _mdtIndex = 0; - size_t _mapEntryIndex = 0; - size_t _instanceIndex = 0; - size_t _htaIndex = 0; - size_t _ePosIndex = 0; - size_t _eGroupIndex = 0; - size_t _eGroupPosIndex = 0; - size_t _mosIndex = 0; - size_t _iconIndex = 0; - size_t _shopIndex = 0; - - size_t _shopWeaponIndex = 0; - size_t _shopArmorIndex = 0; - size_t _shopJewelIndex = 0; - size_t _shopItemIndex = 0; - size_t _shopRegionalIndex = 0; - - const std::vector* _items = nullptr; - const std::vector* _enemies = nullptr; - const std::vector* _models = nullptr; -}; \ No newline at end of file diff --git a/src/include/MovesClass.h b/src/include/MovesClass.h deleted file mode 100644 index faf9a19..0000000 --- a/src/include/MovesClass.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" -#include "BaseDataClass.h" - -#pragma pack(1) -struct MoveStatsStruct { - uint16_t cost = 0; - uint8_t targetEffect = 0; - uint8_t targetType = 0; - uint16_t str = 0; - uint16_t pow = 0; - uint16_t range = 0; - uint16_t cast1 = 0; - uint16_t cast5 = 0; - uint16_t recovery = 0; - uint16_t animation = 0; - uint8_t unknown1 = 0; - uint8_t knockDown = 0; - int16_t ipStun = 0; - int16_t ipCancelStun = 0; - int16_t knockback = 0; - uint8_t element = 0; - uint8_t elementStr = 0; - uint8_t ailmentsBitflag = 0; - uint8_t ailmentsChance = 0; - int8_t atkMod = 0; - int8_t defMod = 0; - int8_t actMod = 0; - int8_t movMod = 0; - uint16_t special = 0; - uint16_t coinCost1 = 0; - uint16_t coinCost2 = 0; - uint16_t coinCost3 = 0; - uint16_t coinCost4 = 0; - uint16_t coinCost5 = 0; - uint16_t multiplier = 0; -}; -#pragma pack() - -struct MoveStruct { - uint8_t id = 0; // overwrite this with array index, used to reference which move manaeggs and specials reference - uint8_t icon = 0; - char name[19]; - MoveStatsStruct stats; - char description[41]; -}; - -class Moves : public BaseDataClass{ -public: - Moves(const Moves&) = delete; - Moves(const Moves&&) = delete; - - static Moves& getInstance() { - static Moves instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - - const std::vector* getMoves() { return &_moves; }; - -private: - Moves() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/MS_PARAM.BIN" : "./data/afs/xls_data/MS_PARAM.BIN"); - }; - - std::vector _moves; - size_t _moveIndex = 0; - bool AilmentBitFlags[8] = {}; -}; \ No newline at end of file diff --git a/src/include/SkillBooksClass.h b/src/include/SkillBooksClass.h deleted file mode 100644 index 766f174..0000000 --- a/src/include/SkillBooksClass.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "BaseDataClass.h" -#include "SkillsClass.h" - -struct SkillImplementationStruct { - uint8_t skillOffset = 0; - uint8_t startingLevel = 0; - uint8_t bookLevelRequired = 0; - uint8_t unknown1 = 0; -}; - -struct SkillBookStruct { - SkillImplementationStruct skills[6]; -}; - -class SkillBooks : public BaseDataClass { -public: - SkillBooks(const SkillBooks&) = delete; - SkillBooks(const SkillBooks&&) = delete; - - static SkillBooks& getInstance() { - static SkillBooks instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - void randomize(); - - void storeSkills(const std::vector* skills) { _skills = skills; }; - const std::vector* getSkillBooks() { return &_skillbooks; }; - size_t getNumSKillBooks() { return _skillbooks.size(); }; - - -private: - SkillBooks() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_SKILL.BIN" : "./data/afs/xls_data/TB_SKILL.BIN"); - }; - - std::vector _skillbooks; - size_t _bookIndex = 0; - size_t _skillIndex = 0; - - const std::vector* _skills = nullptr; -}; \ No newline at end of file diff --git a/src/include/SpecialsClass.h b/src/include/SpecialsClass.h deleted file mode 100644 index 66f81b5..0000000 --- a/src/include/SpecialsClass.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include - -#include "./common/version_check.h" - -#include "BaseDataClass.h" -#include "MovesClass.h" - -struct MoveImplementationStruct { - uint8_t moveOffset = 0; - uint8_t startingLevel = 0; - uint16_t storyFlag = 0; -}; - -struct SpecialMoveStruct { - MoveImplementationStruct moves[6]; -}; - -class Specials : public BaseDataClass { -public: - Specials(const Specials&) = delete; - Specials(const Specials&&) = delete; - - static Specials& getInstance() { - static Specials instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - - void storeMoves(const std::vector* moves) { _moves = moves; }; - const std::vector* getSpecials() { return &_specials; }; - size_t getNumSpecials() { return _specials.size(); }; - -private: - Specials() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_SPCL.BIN" : "./data/afs/xls_data/TB_SPCL.BIN"); - }; - - std::vector _specials; - size_t _specialIndex = 0; - size_t _moveIndex = 0; - - const std::vector* _moves = nullptr; -}; \ No newline at end of file diff --git a/src/items/Item.h b/src/items/Item.h new file mode 100644 index 0000000..5c456b9 --- /dev/null +++ b/src/items/Item.h @@ -0,0 +1,18 @@ +#pragma once +#include + +#include "./ItemStats.h" +#include "./ItemEquipment.h" +#include "./ItemUsable.h" + +// the game only has 700 items total, and this is split into segments with 100 entries(items) each +#pragma pack(1) +struct Item { + char name[19]; + char description[41]; + ItemStats stats; + ItemEquipment* equipmentOffset = nullptr; // 0xFFFFFFFF means null + ItemUsable* usableOffset = nullptr; // 0xFFFFFFFF means null + uint32_t id = 0; // overwrite this to array index, index is used for overworld items and enemy drops +}; +#pragma pack() \ No newline at end of file diff --git a/src/items/ItemEquipment.h b/src/items/ItemEquipment.h new file mode 100644 index 0000000..4ca159b --- /dev/null +++ b/src/items/ItemEquipment.h @@ -0,0 +1,29 @@ +#pragma once +#include + +#pragma pack(1) +struct ItemEquipment { + uint16_t characterBitflag = 0; + int16_t str = 0; + int16_t vit = 0; + int16_t act = 0; + int16_t mov = 0; + uint8_t effectiveOn = 0; + int8_t fireAffinity = 0; + int8_t windAffinity = 0; + int8_t earthAffinity = 0; + int8_t lightningAffinity = 0; + int8_t blizzardAffinity = 0; + uint8_t ailmentsBitflag = 0b00000000; + uint8_t ailmentsChance = 0; + int8_t increaseFirePercent = 0; + int8_t increaseWindPercent = 0; + int8_t increaseEarthPercent = 0; + int8_t increaseLightningPercent = 0; + int8_t increaseBlizzardPercent = 0; + int8_t increaseWaterPercent = 0; + int8_t increaseExplosionPercent = 0; + int8_t increaseForestPercent = 0; + uint16_t special = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/items/ItemStats.h b/src/items/ItemStats.h new file mode 100644 index 0000000..2701600 --- /dev/null +++ b/src/items/ItemStats.h @@ -0,0 +1,14 @@ +#pragma once +#include + +#pragma pack(1) +struct ItemStats { + uint8_t entryType = 0; + uint8_t unknown1 = 0; + uint8_t unknown2 = 0; + uint8_t unknown3 = 0; + uint8_t icon = 0; + uint8_t unknown4 = 0; + uint32_t price = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/items/ItemUsable.h b/src/items/ItemUsable.h new file mode 100644 index 0000000..e3e7fb8 --- /dev/null +++ b/src/items/ItemUsable.h @@ -0,0 +1,31 @@ +#pragma once +#include + +#pragma pack(1) +struct ItemUsable { + uint8_t targetEffect = 0; + uint8_t targetType = 0; + uint16_t power = 0; + uint16_t range = 0; + uint16_t castTime = 0; + uint16_t recoveryTime = 0; + uint16_t animation = 0; + uint8_t effectiveOn = 0; + uint8_t unknown1 = 0; + int16_t ipDamage = 0; + int16_t ipCancelDamage = 0; + int16_t knockback = 0; + uint8_t element = 0; + uint8_t elementStr = 0; + uint8_t ailmentsBitflag = 0b00000000; + uint8_t ailmentsChance = 0; + int8_t atkMod = 0; + int8_t defMod = 0; + int8_t actMod = 0; + int8_t movMod = 0; + uint8_t breakChance = 0; + uint8_t special = 0; + uint8_t unknown2 = 0; + uint8_t unknown3 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/items/Items.cpp b/src/items/Items.cpp new file mode 100644 index 0000000..33b1f92 --- /dev/null +++ b/src/items/Items.cpp @@ -0,0 +1,476 @@ +#include +#include +#include +#include +#include + +#include "./Items.h" +#include "../moves/Moves.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void Items::write() { + ImU32 dataOffset = 0x0000F9B0; // 80 * 799 + ImU32 badOffset = 0xFFFFFFFF; + + std::ofstream stream; + stream.open(_filename, std::ios::binary); + + if (!stream.is_open()) { + throw new std::exception("ITEM.BIN not found to be written!"); + } + + for (size_t i = 0; i < _items.size(); i++) { + stream.write(_items.at(i).name, 18); + stream.write(_items.at(i).description, 40); + + writeRaw(stream, _items.at(i).stats); + + if (!_items.at(i).equipmentOffset) { + writeRaw(stream, badOffset); + } + else { + writeRaw(stream, dataOffset); + dataOffset += sizeof(ItemEquipment); + } + + if (!_items.at(i).usableOffset) { + writeRaw(stream, badOffset); + } + else { + writeRaw(stream, dataOffset); + dataOffset += sizeof(ItemUsable); + } + + writeRaw(stream, _items.at(i).id); + } + + for (size_t i = 0; i < _items.size(); i++) { + if (_items.at(i).equipmentOffset) { + writeRaw(stream, *(_items.at(i).equipmentOffset)); + } + if (_items.at(i).usableOffset) { + writeRaw(stream, *(_items.at(i).usableOffset)); + } + } + + stream.close(); +} + +void Items::read() { + std::ifstream stream(_filename, std::ios::binary); + + if (!stream.is_open()) { + throw new std::exception("ITEM.BIN not found to be read!"); + } + + std::streampos pos = 0; + _items.resize(0x31F); // entries are broken down into 3 possible parts(first is always there, 80 bytes long; second is equipment, 28 bytes long; third is usables, 32 bytes long) + + for (size_t i = 0; i < _items.size(); i++) { + stream.read(_items.at(i).name, 18); + replaceNulls(_items.at(i).name, 18); + stream.read(_items.at(i).description, 40); + replaceNulls(_items.at(i).description, 40); + _items.at(i).stats = readRaw(stream); + + // check if equipment offset is available + int32_t equipOffset = readRaw(stream); + pos = stream.tellg(); + if (equipOffset > 0) { + _items.at(i).equipmentOffset = new ItemEquipment; + stream.seekg(equipOffset, std::ios::beg); + *(_items.at(i).equipmentOffset) = readRaw(stream); + } + + // check if usable offset is available + stream.seekg(pos, std::ios::beg); + + int32_t usableOffset = readRaw(stream); + pos = stream.tellg(); + if (usableOffset > 0) { + _items.at(i).usableOffset = new ItemUsable; + stream.seekg(usableOffset, std::ios::beg); + *(_items.at(i).usableOffset) = readRaw(stream); + } + + stream.seekg(pos, std::ios::beg); + readRaw(stream); // read in last four bytes, they represent the id but can be overwritten + _items.at(i).id = (uint32_t)i; + } + + stream.close(); + + // set starting states for equipment and usable + if (_items.at(0).equipmentOffset) { + _hasEquip = true; + for (size_t i = 0; i < 7; i++) { + EquipmentCharacterBitFlags[i] = (_items.at(0).equipmentOffset->characterBitflag & (1 << i)) > 0; + } + for (size_t i = 0; i < 8; i++) { + EquipmentAilmentBitFlags[i] = (_items.at(0).equipmentOffset->ailmentsBitflag & (1 << i)) > 0; + } + } + if (_items.at(0).usableOffset) { + _hasUsable = true; + for (size_t i = 0; i < 8; i++) { + UsableAilmentBitFlags[i] = (_items.at(0).usableOffset->ailmentsBitflag & (1 << i)) > 0; + } + } +} + +void Items::draw() { + ImGui::Begin("ITEMS"); + + auto itemEntryDefs = JsonDefinitions::getInstance().getDefinitions("itemEntries"); + auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); + auto effectiveOnDefs = JsonDefinitions::getInstance().getDefinitions("effectiveOn"); + auto statusDefs = JsonDefinitions::getInstance().getDefinitions("statuses"); + auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); + auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); + auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); + auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); + + if (ImGui::Button("Save")) { + write(); + } + + ImGui::SameLine(); + if (ImGui::Button("Copy")) { + copyObj(&_items.at(_itemIndex), "Item"); + } + + ImGui::SameLine(); + if (ImGui::Button("Paste") && checkObjType("Item")) { + Item* tempObj = ((Item*)pasteObj()); + _items.at(_itemIndex) = *tempObj; + + if (tempObj->equipmentOffset) { + if (!_items.at(_itemIndex).equipmentOffset) { + _items.at(_itemIndex).equipmentOffset = new ItemEquipment; + } + + *(_items.at(_itemIndex).equipmentOffset) = *(tempObj->equipmentOffset); + + for (size_t i = 0; i < 7; i++) { + EquipmentCharacterBitFlags[i] = _items.at(_itemIndex).equipmentOffset->characterBitflag & (1 << i); + } + + for (size_t i = 0; i < 8; i++) { + EquipmentAilmentBitFlags[i] = _items.at(_itemIndex).equipmentOffset->ailmentsBitflag & (1 << i); + } + + _hasEquip = true; + } + else if (_items.at(_itemIndex).equipmentOffset) { + _hasEquip = false; + delete _items.at(_itemIndex).equipmentOffset; + } + + if (tempObj->usableOffset) { + if (!_items.at(_itemIndex).usableOffset) { + _items.at(_itemIndex).usableOffset = new ItemUsable; + } + + *(_items.at(_itemIndex).usableOffset) = *(tempObj->usableOffset); + + for (size_t i = 0; i < 8; i++) { + UsableAilmentBitFlags[i] = _items.at(_itemIndex).usableOffset->ailmentsBitflag & (1 << i); + } + + _hasUsable = true; + } + else if (_items.at(_itemIndex).usableOffset) { + delete _items.at(_itemIndex).usableOffset; + _hasUsable = false; + } + } + + if (ImGui::BeginCombo("Item Index", _items.at(_itemIndex).name)) { + for (size_t i = 0; i < _items.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _itemIndex); + if (ImGui::Selectable(_items.at(i).name, is_selected)) { + _itemIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + (_items.at(_itemIndex).equipmentOffset) ? _hasEquip = true : _hasEquip = false; + (_items.at(_itemIndex).usableOffset) ? _hasUsable = true : _hasUsable = false; + + if (_hasEquip) { + for (size_t i = 0; i < 7; i++) { + EquipmentCharacterBitFlags[i] = _items.at(_itemIndex).equipmentOffset->characterBitflag & (1 << i); + } + for (size_t i = 0; i < 8; i++) { + EquipmentAilmentBitFlags[i] = _items.at(_itemIndex).equipmentOffset->ailmentsBitflag & (1 << i); + } + } + else { + for (size_t i = 0; i < 7; i++) { + EquipmentCharacterBitFlags[i] = false; + } + + for (size_t i = 0; i < 8; i++) { + EquipmentAilmentBitFlags[i] = false; + } + + } + + if (_hasUsable) { + for (size_t i = 0; i < 8; i++) { + UsableAilmentBitFlags[i] = _items.at(_itemIndex).usableOffset->ailmentsBitflag & (1 << i); + } + } + else { + for (size_t i = 0; i < 8; i++) { + UsableAilmentBitFlags[i] = 0; + } + } + + ImGui::EndCombo(); + } + + ImGui::InputText("Name", _items.at(_itemIndex).name, 19); + ImGui::InputText("Description", _items.at(_itemIndex).description, 41); + + if (ImGui::BeginCombo("Entry Type", itemEntryDefs.at(_items.at(_itemIndex).stats.entryType).c_str())) { + for (size_t i = 0; i < itemEntryDefs.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).stats.entryType); + if (ImGui::Selectable(itemEntryDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).stats.entryType = (uint8_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Unknown #1", &_items.at(_itemIndex).stats.unknown1); + drawInput("Unknown #2", &_items.at(_itemIndex).stats.unknown2); + drawInput("Unknown #3", &_items.at(_itemIndex).stats.unknown3); + drawInput("Icon", &_items.at(_itemIndex).stats.icon); + drawInput("Unknown #5", &_items.at(_itemIndex).stats.unknown4); + drawInput("Price", &_items.at(_itemIndex).stats.price); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("sell = price / 2"); + + if (ImGui::Checkbox("Equipment", &_hasEquip)) { + if (_hasEquip) { + _items.at(_itemIndex).equipmentOffset = new ItemEquipment; + } + else { + delete _items.at(_itemIndex).equipmentOffset; + _items.at(_itemIndex).equipmentOffset = nullptr; + + for (size_t i = 0; i < 8; i++) { + EquipmentAilmentBitFlags[i] = false; + } + } + } + + ImGui::SameLine(); + if (ImGui::Checkbox("Usable", &_hasUsable)) { + if (_hasUsable) { + _items.at(_itemIndex).usableOffset = new ItemUsable; + } + else { + delete _items.at(_itemIndex).usableOffset; + _items.at(_itemIndex).usableOffset = nullptr; + + for (size_t i = 0; i < 8; i++) { + UsableAilmentBitFlags[i] = false; + } + } + } + + ImGui::End(); + + if (_hasEquip) { + ImGui::Begin("ITEM EQUIPMENT"); + for (size_t i = 0; i < 7; i++) { + if (ImGui::Checkbox(characterDefs.at(i).c_str(), &EquipmentCharacterBitFlags[i])) { + _items.at(_itemIndex).equipmentOffset->characterBitflag ^= (1 << i); + } + if ((i+1) % 4 && (i+1) < 7) { + ImGui::SameLine(); + } + } + + drawInput("Strength", &_items.at(_itemIndex).equipmentOffset->str); + drawInput("Vitality", &_items.at(_itemIndex).equipmentOffset->vit); + drawInput("Action", &_items.at(_itemIndex).equipmentOffset->act); + drawInput("Movement", &_items.at(_itemIndex).equipmentOffset->mov); + + if (ImGui::BeginCombo("Effective On", effectiveOnDefs.at(_items.at(_itemIndex).equipmentOffset->effectiveOn).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + bool is_selected = (i == _items.at(_itemIndex).equipmentOffset->effectiveOn); + if (ImGui::Selectable(effectiveOnDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).equipmentOffset->effectiveOn = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + } + + ImGui::EndCombo(); + } + + drawInput("Fire %", &_items.at(_itemIndex).equipmentOffset->fireAffinity); + drawInput("Wind %", &_items.at(_itemIndex).equipmentOffset->windAffinity); + drawInput("Earth %", &_items.at(_itemIndex).equipmentOffset->earthAffinity); + drawInput("Lightning %", &_items.at(_itemIndex).equipmentOffset->lightningAffinity); + drawInput("Blizzard %", &_items.at(_itemIndex).equipmentOffset->blizzardAffinity); + + for (size_t i = 0; i < 8; i++) { + if (ImGui::Checkbox(statusDefs.at(i).c_str(), &EquipmentAilmentBitFlags[i])) { + _items.at(_itemIndex).equipmentOffset->ailmentsBitflag ^= (EquipmentAilmentBitFlags[i] << i); + } + if ((i+1) % 4) { + ImGui::SameLine(); + } + } + + drawInput("Ailments Chance", &_items.at(_itemIndex).equipmentOffset->ailmentsChance); + drawInput("Increase Fire %", &_items.at(_itemIndex).equipmentOffset->increaseFirePercent); + drawInput("Increase Wind %", &_items.at(_itemIndex).equipmentOffset->increaseWindPercent); + drawInput("Increase Earth %", &_items.at(_itemIndex).equipmentOffset->increaseEarthPercent); + drawInput("Increase Lightning %", &_items.at(_itemIndex).equipmentOffset->increaseLightningPercent); + drawInput("Increase Blizzard %", &_items.at(_itemIndex).equipmentOffset->increaseBlizzardPercent); + drawInput("Increase Water %", &_items.at(_itemIndex).equipmentOffset->increaseWaterPercent); + drawInput("Increase Explosion %", &_items.at(_itemIndex).equipmentOffset->increaseExplosionPercent); + drawInput("Increase Forest %", &_items.at(_itemIndex).equipmentOffset->increaseForestPercent); + drawInput("Special", &_items.at(_itemIndex).equipmentOffset->special); + + ImGui::End(); + } + + if (_hasUsable) { + ImGui::Begin("ITEM USABLE"); + if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_items.at(_itemIndex).usableOffset->targetEffect).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).usableOffset->targetEffect); + if (ImGui::Selectable(targetEffectDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).usableOffset->targetEffect = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(_items.at(_itemIndex).usableOffset->targetType).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).usableOffset->targetType); + if (ImGui::Selectable(targetTypeDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).usableOffset->targetType = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Power", &_items.at(_itemIndex).usableOffset->power); + drawInput("Range", &_items.at(_itemIndex).usableOffset->range); + drawInput("Cast Time", &_items.at(_itemIndex).usableOffset->castTime); + drawInput("Recovery", &_items.at(_itemIndex).usableOffset->recoveryTime); + + if (ImGui::BeginCombo("Animation", animationDefs.at(_items.at(_itemIndex).usableOffset->animation).c_str())) { + for (size_t i = 0; i < Moves::getInstance().getMoves().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).usableOffset->animation); + if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).usableOffset->animation = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Effective On", effectiveOnDefs.at(_items.at(_itemIndex).usableOffset->effectiveOn).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).usableOffset->effectiveOn); + if (ImGui::Selectable(effectiveOnDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).usableOffset->effectiveOn = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Unknown #1", &_items.at(_itemIndex).usableOffset->unknown1); + drawInputN("IP Damage/IP Cancel Damage", &_items.at(_itemIndex).usableOffset->ipDamage, 2); + drawInput("Knockback", &_items.at(_itemIndex).usableOffset->knockback); + + if (ImGui::BeginCombo("Element", elementDefs.at(_items.at(_itemIndex).usableOffset->element).c_str())) { + for (uint8_t i = 0; i < 5; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _items.at(_itemIndex).usableOffset->element); + if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).usableOffset->element = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Element Strength", &_items.at(_itemIndex).usableOffset->elementStr); + + for (size_t i = 0; i < 8; i++) { + if (ImGui::Checkbox(statusDefs.at(i).c_str(), &UsableAilmentBitFlags[i])) { + _items.at(_itemIndex).usableOffset->ailmentsBitflag ^= (UsableAilmentBitFlags[i] << i); + } + if ((i+1) % 4) { + ImGui::SameLine(); + } + } + + drawInputN("Atk/Def/Act/Mov Mods", &_items.at(_itemIndex).usableOffset->atkMod, 4); + drawInput("Break Chance", &_items.at(_itemIndex).usableOffset->breakChance); + drawInput("Special", &_items.at(_itemIndex).usableOffset->special); + drawInput("Unknown #2", &_items.at(_itemIndex).usableOffset->unknown2); + drawInput("Unknown #3", &_items.at(_itemIndex).usableOffset->unknown3); + + ImGui::End(); + } +} + +void Items::outputToCSV() { + +} \ No newline at end of file diff --git a/src/items/Items.h b/src/items/Items.h new file mode 100644 index 0000000..98c5545 --- /dev/null +++ b/src/items/Items.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./Item.h" + +class Items : public BaseDataInterface { +public: + Items(const Items&) = delete; + Items(const Items&&) = delete; + + static Items& getInstance() { + static Items instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + + const std::vector& getItems() { return _items; }; + +private: + Items() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/ITEM.BIN" : "./data/afs/xls_data/ITEM.BIN"); + read(); + }; + std::vector _items; + size_t _itemIndex = 0; + bool _hasEquip = false; + bool _hasUsable = false; + bool EquipmentCharacterBitFlags[7] = {}; + bool EquipmentAilmentBitFlags[8] = {}; + bool UsableAilmentBitFlags[8] = {}; +}; \ No newline at end of file diff --git a/src/levelups/CharacterLevelups.h b/src/levelups/CharacterLevelups.h new file mode 100644 index 0000000..5100a02 --- /dev/null +++ b/src/levelups/CharacterLevelups.h @@ -0,0 +1,24 @@ +#pragma once +#include + +#pragma pack(1) +struct Levelup { + int32_t exp = 0; + int16_t hpIncrease = 0; + int16_t mpIncrease = 0; + int16_t spIncrease = 0; + int16_t strIncrease = 0; + int16_t vitIncrease = 0; + int16_t actIncrease = 0; + int16_t movIncrease = 0; + int16_t magIncrease = 0; + int16_t menIncrease = 0; + int16_t skillSlotIncrease = 0; +}; +#pragma pack() + +#pragma pack(1) +struct CharacterLevelups { + Levelup levelups[99]; +}; +#pragma pack() \ No newline at end of file diff --git a/src/levelups/Levelups.cpp b/src/levelups/Levelups.cpp new file mode 100644 index 0000000..0ace11f --- /dev/null +++ b/src/levelups/Levelups.cpp @@ -0,0 +1,135 @@ +#include +#include +#include + +#include "./Levelups.h" + +#include "../common/io_util.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void Levelups::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("TB_LVUP.BIN not found to be written!"); + } + + for (size_t characterIndex = 0; characterIndex < _levelups.size(); characterIndex++) { + writeRaw(output, _levelups.at(characterIndex)); + // for (size_t levelupIndex = 0; levelupIndex < MAX_LEVEL; levelupIndex++) { + // writeRaw(output, _levelups.at(characterIndex).levelups[levelupIndex]); + // } + } +} + +void Levelups::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("TB_LVUP.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + auto fileSize = std::filesystem::file_size(filePath); + _levelups.resize(fileSize / (24 * MAX_LEVEL)); // entries are 24 bytes long, and 99 entries per character + + for (size_t characterIndex = 0; characterIndex < _levelups.size(); characterIndex++) { + _levelups.at(characterIndex) = readRaw(input); + // for (size_t levelupIndex = 0; levelupIndex < MAX_LEVEL; levelupIndex++) { + // _levelups.at(characterIndex).levelups[levelupIndex] = readRaw(input); + // } + } + + input.close(); +} + +void Levelups::draw() { + ImGui::Begin("LEVEUPS"); + + auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); + + if (ImGui::Button("Save")) { + write(); + } + + if (ImGui::BeginCombo("Character", characterDefs.at(_characterIndex).c_str())) { + for (size_t index = 0; index < _levelups.size(); index++) { + ImGui::PushID((int)index); + bool is_selected = (index == _characterIndex); + if (ImGui::Selectable(characterDefs.at(index).c_str(), is_selected)) { + _characterIndex = index; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Level", std::format("Level {}", _characterLevelupIndex + 1).c_str())) { + for (size_t index = 0; index < MAX_LEVEL; index ++) { + ImGui::PushID((int)index); + bool is_selected = (index == _characterLevelupIndex); + if (ImGui::Selectable(std::format("Level {}", index + 1).c_str(), is_selected)) { + _characterLevelupIndex = index; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + ImGui::EndCombo(); + } + + drawInput("EXP", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].exp); + drawInput("HP Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].hpIncrease); + drawInput("MP Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].mpIncrease); + drawInput("SP Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].spIncrease); + drawInput("STR Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].strIncrease); + drawInput("VIT Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].vitIncrease); + drawInput("MAG Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].magIncrease); + drawInput("MEN Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].menIncrease); + drawInput("ACT Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].actIncrease); + drawInput("MOV Increase", &_levelups.at(_characterIndex).levelups[_characterLevelupIndex].movIncrease); + drawInput("Skill Slot Increase",&_levelups.at(_characterIndex).levelups[_characterLevelupIndex].skillSlotIncrease); + + ImGui::End(); +} + +void Levelups::outputToCSV() { + auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); + std::ofstream output; + output.open("./csv/TB_LVUP.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Name,EXP,HP Increase,MP Increase,SP Increase,STR Increase,VIT Increase,ACT Increase,MOV Increase,MAG Increase,MEN Increase,Skill Slot Increase\n"; + + for (size_t characterIndex = 0; characterIndex < _levelups.size(); characterIndex++) { + for (size_t characterLevelupIndex = 0; characterLevelupIndex < MAX_LEVEL; characterLevelupIndex++) { + output << characterDefs.at(characterIndex) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].exp) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].hpIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].mpIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].spIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].strIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].vitIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].actIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].movIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].magIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].menIncrease) << ',' + << std::to_string(_levelups.at(characterIndex).levelups[characterLevelupIndex].skillSlotIncrease) << '\n'; + } + } + + output.close(); +} \ No newline at end of file diff --git a/src/levelups/Levelups.h b/src/levelups/Levelups.h new file mode 100644 index 0000000..ea48151 --- /dev/null +++ b/src/levelups/Levelups.h @@ -0,0 +1,38 @@ +#pragma once + +#include + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./CharacterLevelups.h" + +static const size_t MAX_LEVEL = 99; + +class Levelups : public BaseDataInterface { +public: + Levelups(const Levelups&) = delete; + Levelups(const Levelups&&) = delete; + + static Levelups& getInstance() { + static Levelups instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + + const std::vector getLevelUps() { return _levelups; }; + +private: + Levelups() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_LVUP.BIN" : "./data/afs/xls_data/TB_LVUP.BIN"); + read(); + }; + + std::vector _levelups; + size_t _characterIndex = 0; + size_t _characterLevelupIndex = 0; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 2ea92d3..c5b2e12 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,46 +3,21 @@ #include #include -#include "./include/MovesClass.h" -#include "./include/ManaEggsClass.h" -#include "./include/SkillsClass.h" -#include "./include/SkillBooksClass.h" -#include "./include/SpecialsClass.h" -#include "./include/ItemsClass.h" -#include "./include/StartStatsClass.h" -#include "./include/EnemiesClass.h" -#include "./include/BossesClass.h" -#include "./include/MdtsClass.h" -#include "./include/LevelupsClass.h" - -#include "./include/ImGuiInstance.h" +#include "./moves/Moves.h" +#include "./moves/ManaEggs.h" +#include "./moves/Specials.h" +#include "./skills/Skills.h" +#include "./skills/SkillBooks.h" +#include "./items/Items.h" +#include "./stats/StartStats.h" +#include "./enemies/Enemies.h" +#include "./bosses/Bosses.h" +#include "./maps/Maps.h" +#include "./levelups/Levelups.h" + +#include "./ui/ImGuiInstance.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { - // read data - Moves::getInstance().read(); - ManaEggs::getInstance().read(); - Skills::getInstance().read(); - SkillBooks::getInstance().read(); - Specials::getInstance().read(); - Items::getInstance().read(); - StartStats::getInstance().read(); - Enemies::getInstance().read(); - Bosses::getInstance().read(); - Mdts::getInstance().read(); - Levelups::getInstance().read(); - - // now store all needed data into relevant classes - ManaEggs::getInstance().storeMoves(Moves::getInstance().getMoves()); - SkillBooks::getInstance().storeSkills(Skills::getInstance().getSkills()); - Specials::getInstance().storeMoves(Moves::getInstance().getMoves()); - Items::getInstance().storeMoves(Moves::getInstance().getMoves()); - StartStats::getInstance().storeItems(Items::getInstance().getItems()); - Enemies::getInstance().storeMoves(Moves::getInstance().getMoves()); - Enemies::getInstance().storeItems(Items::getInstance().getItems()); - Bosses::getInstance().storeMoves(Moves::getInstance().getMoves()); - Bosses::getInstance().storeItems(Items::getInstance().getItems()); - Mdts::getInstance().storeItems(Items::getInstance().getItems()); - if (!StartImGui()) { return EXIT_FAILURE; } diff --git a/src/maps/EnemyGroup.h b/src/maps/EnemyGroup.h new file mode 100644 index 0000000..b443276 --- /dev/null +++ b/src/maps/EnemyGroup.h @@ -0,0 +1,63 @@ +#pragma once +#include + +#pragma pack(1) +struct EnemyFirstUnknown { + uint16_t unknown = 0; + uint16_t unknown1 = 0; + uint16_t unknown2 = 0; + uint16_t unknown3 = 0; + uint16_t unknown4 = 0; + float unknown5 = 0.0f; + uint16_t unknown6 = 0; + uint16_t unknown7 = 0; + uint16_t unknown8 = 0; + uint16_t unknown9 = 0; +}; +#pragma pack() + +#pragma pack(1) +struct EnemyType { + uint16_t index = 0; // unsure about this + uint16_t numEnemy = 0; + uint16_t enemyOffset = 0; + uint16_t unknown = 0; + uint16_t unknown1 = 0; + uint16_t unknown2 = 0; + uint16_t unknown3 = 0; +}; +#pragma pack() + +#pragma pack(1) +struct EnemySecondUnknown { + uint16_t unknown = 0; + uint16_t unknown1 = 0; + uint16_t unknown2 = 0; + uint16_t unknown3 = 0; + uint16_t unknown4 = 0; + uint16_t unknown5 = 0; + uint16_t unknown6 = 0; + uint16_t unknown7 = 0; + uint16_t unknown8 = 0; + uint16_t unknown9 = 0; + uint16_t unknown10 = 0; + uint16_t unknown11 = 0; + uint16_t unknown12 = 0; + uint16_t unknown13 = 0; + uint16_t unknown14 = 0; + uint16_t unknown15 = 0; + uint16_t unknown16 = 0; + uint16_t unknown17 = 0; + uint16_t unknown18 = 0; + uint16_t unknown19 = 0; +}; +#pragma pack() + +#pragma pack(1) +struct EnemyGroup { + uint16_t index = 0; + EnemyFirstUnknown unknown; + EnemyType enemies[4]; + EnemySecondUnknown unknown1; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/EnemyPosition.h b/src/maps/EnemyPosition.h new file mode 100644 index 0000000..e872bd3 --- /dev/null +++ b/src/maps/EnemyPosition.h @@ -0,0 +1,22 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" +#include "../common/structs/Vector2.h" + +#pragma pack(1) +struct EnemyPosition { + uint16_t index = 0; + uint16_t unknown1 = 0; + Vector2 minimum; + Vector2 maximum; + Vector3 position; + + Vector3 unknown2; + Vector3 unknown3; + Vector3 unknown4; + Vector3 unknown5; + Vector3 unknown6; + Vector3 unknown7; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/HTA.h b/src/maps/HTA.h new file mode 100644 index 0000000..91d8e3e --- /dev/null +++ b/src/maps/HTA.h @@ -0,0 +1,26 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" + +#pragma pack(1) +struct HTA { + uint8_t shape = 0; + uint8_t type = 0; + uint8_t trigger = 0; + uint8_t unknown1 = 0; + uint32_t unknown2 = 0; + uint8_t attribute = 0; + uint8_t unknown3 = 0; + uint16_t unknown4 = 0; + uint32_t unknown5 = 0; + Vector3 minimum; + Vector3 maximum; + Vector3 unknown6; + uint32_t unknown7 = 0; + uint32_t unknown8 = 0; + uint32_t unknown9 = 0; + uint32_t unknown10 = 0; + uint32_t unknown11 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/Header.h b/src/maps/Header.h new file mode 100644 index 0000000..4c9e9bb --- /dev/null +++ b/src/maps/Header.h @@ -0,0 +1,81 @@ +#pragma once +#include + +#pragma pack(1) +struct Header { + uint32_t headerLength = 0; + uint32_t unknown1 = 0; + + uint32_t numMapEntries = 0; + uint32_t offsetMapEntries = 0; + + uint32_t unknown2 = 0; + uint32_t unknown3 = 0; + + uint32_t numInstances = 0; + uint32_t offsetInstances = 0; + + uint32_t numHTA = 0; + uint32_t offsetHTA = 0; + + uint32_t numScripts = 0; + uint32_t offsetScripts = 0; + + uint32_t unknown4 = 0; + uint32_t unknown5 = 0; + + uint32_t numEnemyPos = 0; + uint32_t offsetEnemyPos = 0; + + uint32_t unknown6 = 0; + uint32_t unknown7 = 0; + + uint32_t numEnemyGroups = 0; + uint32_t offsetEnemyGroups = 0; + + uint32_t numMOS = 0; + uint32_t offsetMOS = 0; + + uint32_t unknown8 = 0; + uint32_t unknown9 = 0; + + uint32_t unknown10 = 0; + uint32_t unknown11 = 0; + + uint32_t unknown12 = 0; + uint32_t unknown13 = 0; + + uint32_t unknown14 = 0; // check D800.mdt + uint32_t unknown15 = 0; + + uint32_t lengthDialogue = 0; + uint32_t offsetDialogue = 0; + + uint32_t unknown16 = 0; + uint32_t unknown17 = 0; + + uint32_t unknown18 = 0; + uint32_t unknown19 = 0; + + uint32_t unknown20 = 0; + uint32_t unknown21 = 0; + + uint32_t numIcons = 0; + uint32_t offsetIcons = 0; + + uint32_t unknown22 = 0; + uint32_t unknown23 = 0; + + uint32_t lengthShop = 0; + uint32_t offsetShop = 0; + + uint32_t unknown24 = 0; // so far always 0x0000 + uint32_t unknown25 = 0; // so far always 0x0000 + + uint32_t unknown26 = 0; + uint32_t unknown27 = 0; + + uint32_t unknown28 = 0; + uint32_t unknown29 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/Icon.h b/src/maps/Icon.h new file mode 100644 index 0000000..5f22fec --- /dev/null +++ b/src/maps/Icon.h @@ -0,0 +1,21 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" + +#pragma pack(1) +struct Icon { + uint8_t ID = 0; + uint16_t unknown = 0; + uint8_t unknown1 = 0; + float xPos = 0.0f; + float yPos = 0.0f; + float zPos = 0.0f; + float unknown2 = 0; + float yAngle = 0; + uint16_t item1 = 0; + uint16_t item2 = 0; + uint16_t item3 = 0; + uint16_t flag = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/Instance.h b/src/maps/Instance.h new file mode 100644 index 0000000..f82877e --- /dev/null +++ b/src/maps/Instance.h @@ -0,0 +1,16 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" + +#pragma pack(1) +struct Instance { + uint16_t ID = 0; + uint16_t index = 0; + uint16_t unknown = 0; + uint16_t translation = 0; + Vector3 position; + Vector3 angle; + Vector3 c; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/MOS.h b/src/maps/MOS.h new file mode 100644 index 0000000..b4f9bd8 --- /dev/null +++ b/src/maps/MOS.h @@ -0,0 +1,18 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" + +#pragma pack(1) +struct MOS { + uint16_t ID = 0; + uint16_t index = 0; + uint32_t unknown1 = 0; + Vector3 position; + uint32_t unknown2 = 0; + uint32_t unknown3 = 0; + uint32_t unknown4 = 0; + uint32_t unknown5 = 0; + uint16_t unknown6 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/MapEntry.h b/src/maps/MapEntry.h new file mode 100644 index 0000000..de35399 --- /dev/null +++ b/src/maps/MapEntry.h @@ -0,0 +1,15 @@ +#pragma once +#include + +#include "../common/structs/Vector3.h" + +#pragma pack(1) +struct MapEntry { + uint32_t ID = 0; // first is always 0x1000 + Vector3 position; + float direction = 0.0f; + float unknown1 = 0.0f; + uint32_t unknown2 = 0; + uint32_t unknown3 = 0; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/Maps.cpp b/src/maps/Maps.cpp new file mode 100644 index 0000000..f8d826d --- /dev/null +++ b/src/maps/Maps.cpp @@ -0,0 +1,846 @@ +#include +#include +#include +#include + +#include "./maps.h" +#include "../items/Items.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "./imgui.h" +#include "../ui/imgui_wrappers.h" + +void Mdts::write() { + std::fstream output; + uint32_t offset = 0; + + for (size_t i = 0; i < _mdts.size(); i++) { + output.open(_mdts.at(i).filename, std::ios::binary | std::ios::in | std::ios::out); + + if (!output.is_open()) { + throw new std::exception(_mdts.at(i).filename.c_str()); + } + + // write in map entries + output.seekg(_mdts.at(i).header.offsetMapEntries, std::ios::beg); + for (auto& val : _mdts.at(i).mapEntries) { + writeRaw(output, val); + } + + // write in instances + output.seekg(_mdts.at(i).header.offsetInstances, std::ios::beg); + for (auto& val : _mdts.at(i).instances) { + writeRaw(output, val); + } + + // write in HTA + output.seekg(_mdts.at(i).header.offsetHTA, std::ios::beg); + for (auto& val : _mdts.at(i).HTA) { + writeRaw(output, val); + } + + // write in enemy positions + output.seekg(_mdts.at(i).header.offsetEnemyPos, std::ios::beg); + for (auto& val : _mdts.at(i).enemyPositions) { + writeRaw(output, val); + } + + // write in enemy groups + output.seekg(_mdts.at(i).header.offsetEnemyGroups, std::ios::beg); + for (auto& val : _mdts.at(i).enemyGroups) { + writeRaw(output, val); + } + + // write in MOS + output.seekg(_mdts.at(i).header.offsetMOS, std::ios::beg); + for (auto& val : _mdts.at(i).MOS) { + writeRaw(output, val); + } + + // write in icons + output.seekg(_mdts.at(i).header.offsetIcons, std::ios::beg); + for (auto& val : _mdts.at(i).icons) { + writeRaw(output, val); + } + + // write in shop + if (_mdts.at(i).shop.size()) { + for (ImU16 j = 0; j < 12; j++) { + if (_mdts.at(i).shop[0].weapons.items[j].item) { + _mdts.at(i).shop[0].weapons.items[j].item += 0x0800; + } + + if (_mdts.at(i).shop[0].armors.items[j].item) { + _mdts.at(i).shop[0].armors.items[j].item += 0x0800; + } + + if (_mdts.at(i).shop[0].jewelry.items[j].item) { + _mdts.at(i).shop[0].jewelry.items[j].item += 0x0800; + } + + if (_mdts.at(i).shop[0].items.items[j].item) { + _mdts.at(i).shop[0].items.items[j].item += 0x0800; + } + + if (_mdts.at(i).shop[0].regionals.items[j].item) { + _mdts.at(i).shop[0].regionals.items[j].item += 0x0800; + } + } + + output.seekg(_mdts[i].header.offsetShop, std::ios::beg); + writeRaw(output, _mdts[i].shop[0]); + + for (ImU16 j = 0; j < 12; j++) { + if (_mdts.at(i).shop[0].weapons.items[j].item) { + _mdts.at(i).shop[0].weapons.items[j].item -= 0x0800; + } + + if (_mdts.at(i).shop[0].armors.items[j].item) { + _mdts.at(i).shop[0].armors.items[j].item -= 0x0800; + } + + if (_mdts.at(i).shop[0].jewelry.items[j].item) { + _mdts.at(i).shop[0].jewelry.items[j].item -= 0x0800; + } + + if (_mdts.at(i).shop[0].items.items[j].item) { + _mdts.at(i).shop[0].items.items[j].item -= 0x0800; + } + + if (_mdts.at(i).shop[0].regionals.items[j].item) { + _mdts.at(i).shop[0].regionals.items[j].item -= 0x0800; + } + } + } + + output.close(); + } +} + +void Mdts::read() { + uint8_t readChar = 0; + std::ifstream input; + uint32_t offset = 0; + + for (const auto& p : std::filesystem::directory_iterator(_directory)) { + if (std::filesystem::is_directory(p)) { + for (const auto& q : std::filesystem::directory_iterator(p)) { + std::string filename = q.path().string(); + + if (!std::strstr(filename.c_str(), ".mdt")) { + continue; + } + + input.open(filename.c_str(), std::ios::binary); + + if (!input.is_open()) { + throw new std::exception(filename.c_str()); + } + + _mdts.emplace_back(MdtStruct()); + _mdts.back().header = readRaw
(input); + + // read in map entries + _mdts.back().mapEntries.resize(_mdts.back().header.numMapEntries); + input.seekg(_mdts.back().header.offsetMapEntries, std::ios::beg); + for (size_t i = 0; i < _mdts.back().mapEntries.size(); i++) { + _mdts.back().mapEntries[i] = readRaw(input); + } + + // read in instances + _mdts.back().instances.resize(_mdts.back().header.numInstances); + input.seekg(_mdts.back().header.offsetInstances, std::ios::beg); + for (size_t i = 0; i < _mdts.back().instances.size(); i++) { + _mdts.back().instances[i] = readRaw(input); + } + + // read in HTA + _mdts.back().HTA.resize(_mdts.back().header.numHTA); + input.seekg(_mdts.back().header.offsetHTA, std::ios::beg); + for (size_t i = 0; i < _mdts.back().HTA.size(); i++) { + _mdts.back().HTA[i] = readRaw(input); + } + + // read in enemy positions + _mdts.back().enemyPositions.resize(_mdts.back().header.numEnemyPos); + input.seekg(_mdts.back().header.offsetEnemyPos, std::ios::beg); + for (size_t i = 0; i < _mdts.back().enemyPositions.size(); i++) { + _mdts.back().enemyPositions[i] = readRaw(input); + } + + // read in enemy groups + _mdts.back().enemyGroups.resize(_mdts.back().header.numEnemyGroups); + input.seekg(_mdts.back().header.offsetEnemyGroups, std::ios::beg); + for (size_t i = 0; i < _mdts.back().enemyGroups.size(); i++) { + _mdts.back().enemyGroups[i] = readRaw(input); + } + + // read in MOS + _mdts.back().MOS.resize(_mdts.back().header.numMOS); + input.seekg(_mdts.back().header.offsetMOS, std::ios::beg); + for (size_t i = 0; i < _mdts.back().MOS.size(); i++) + _mdts.back().MOS[i] = readRaw(input); + + // read in icons + _mdts.back().icons.resize(_mdts.back().header.numIcons); + input.seekg(_mdts.back().header.offsetIcons, std::ios::beg); + for (size_t i = 0; i < _mdts.back().icons.size(); i++) { + _mdts.back().icons[i] = readRaw(input); + } + + + // read in shop + if (_mdts.back().header.offsetShop) { + _mdts.back().shop.resize(1); + input.seekg(_mdts.back().header.offsetShop, std::ios::beg); + + _mdts.back().shop[0] = readRaw(input); + + for (ImU16 i = 0; i < 12; i++) { + if (_mdts.back().shop[0].weapons.items[i].item) { + _mdts.back().shop[0].weapons.items[i].item -= 0x0800; + } + + if (_mdts.back().shop[0].armors.items[i].item) { + _mdts.back().shop[0].armors.items[i].item -= 0x0800; + } + + if (_mdts.back().shop[0].jewelry.items[i].item) { + _mdts.back().shop[0].jewelry.items[i].item -= 0x0800; + } + + if (_mdts.back().shop[0].items.items[i].item) { + _mdts.back().shop[0].items.items[i].item -= 0x0800; + } + + if (_mdts.back().shop[0].regionals.items[i].item) { + _mdts.back().shop[0].regionals.items[i].item -= 0x0800; + } + } + } + + input.seekg(0x78, std::ios::beg); + uint32_t sectionLength = readRaw(input); + uint32_t sectionOffset = readRaw(input); + + // dialogue section exists, lets do our thing + if (sectionLength && sectionOffset) { + input.seekg(sectionOffset, std::ios::beg); + uint32_t diagHeaderSize = readRaw(input); + input.seekg(sectionOffset, std::ios::beg); + + for (size_t offset = 10; offset < diagHeaderSize; offset += 4) { + input.seekg(offset, std::ios::cur); + uint16_t diagOffset = readRaw(input); + // check if it's padding, if so, ignore it + if (diagOffset == 0xFFFF) { + continue; + } + input.seekg(sectionOffset + diagHeaderSize, std::ios::beg); + input.seekg(diagOffset * 8, std::ios::cur); + + // check if it's the proper bytecode for a map name textbox + if ((readRaw(input) == (uint8_t)0x17) && (readRaw(input) == (uint8_t)0x80)) { + input.seekg(2, std::ios::cur); + readChar = readRaw(input); + while (readChar != 0x17) { + _mdts.back().mapname.push_back(readChar); + readChar = readRaw(input); + } + + // anything that contains the string "to " is not the current map name + if (_mdts.back().mapname.find("to ") != std::string::npos) { + _mdts.back().mapname.erase(_mdts.back().mapname.begin(), _mdts.back().mapname.end()); + input.seekg(sectionOffset, std::ios::beg); + continue; + } + else break; + + } + else { + input.seekg(sectionOffset, std::ios::beg); + } + + } + + } + + _mdts.back().filename = filename; + _mdts.back().filenameChr = filename.substr(0, filename.length() - 4) + ".chr"; + + input.close(); + } + } + } +} + +void Mdts::draw() { + ImGui::Begin("AREAS"); + + if (ImGui::Button("Save")) { + write(); + } + + if (ImGui::BeginCombo("MDT Index", _mdts.at(_mdtIndex).mapname.c_str())) { + for (size_t i = 0; i < _mdts.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdtIndex); + if (ImGui::Selectable(_mdts.at(i).mapname.c_str(), is_selected)) { + _mdtIndex = i; + _mapEntryIndex = 0; + _instanceIndex = 0; + _htaIndex = 0; + _ePosIndex = 0; + _eGroupIndex = 0; + _eGroupPosIndex = 0; + _mosIndex = 0; + _iconIndex = 0; + _shopIndex = 0; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (_mdts.at(_mdtIndex).mapEntries.size()) { + if (ImGui::CollapsingHeader("Map Entries")) { + if (ImGui::BeginCombo("Map Entry #", std::to_string(_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).mapEntries.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mapEntryIndex); + if (ImGui::Selectable(std::to_string(_mdts.at(_mdtIndex).mapEntries[i].ID).c_str(), is_selected)) { + _mapEntryIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Connected Map", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID); + drawInputN("X/Y/Z Position", (float*) & _mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).position, 3); + drawInput("Direction", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).direction); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown1); + drawInput("Unknown #2", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown2); + drawInput("Unknown #3", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown3); + } + } + + if (_mdts.at(_mdtIndex).instances.size()) { + if (ImGui::CollapsingHeader("Instances")) { + if (ImGui::BeginCombo("Instance #", std::to_string(_mdts.at(_mdtIndex).instances.at(_instanceIndex).ID).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).mapEntries.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _instanceIndex); + if (ImGui::Selectable(std::to_string(_mdts.at(_mdtIndex).instances[i].ID).c_str(), is_selected)) { + _instanceIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("ID", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).ID); + drawInput("Index", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).index); + drawInput("Unknown", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).unknown); + drawInput("Translation", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).translation); + drawInputN("X/Y/Z Position", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).position, 3); + drawInputN("X/Y/Z Angle", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).angle, 3); + drawInputN("CX/CY/CZ", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).c, 3); + } + } + + if (_mdts.at(_mdtIndex).HTA.size()) { + if (ImGui::CollapsingHeader("HTA")) { + if (ImGui::BeginCombo("HTA #", std::format("HTA {}", _htaIndex + 1).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).HTA.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _htaIndex); + if (ImGui::Selectable(std::format("HTA {}", i + 1).c_str(), is_selected)) { + _htaIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Shape", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).shape); + drawInput("Type", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).type); + drawInput("Trigger", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).trigger); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown1); + drawInput("Unknown #2", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown2); + drawInput("attribute", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).attribute); + drawInputN("X/Y/Z Min", (float*)&_mdts.at(_mdtIndex).HTA.at(_htaIndex).minimum, 3); + drawInputN("X/Y/Z Max", (float*)&_mdts.at(_mdtIndex).HTA.at(_htaIndex).maximum, 3); + drawInput("Unknown #3", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown3); + drawInput("Unknown #4", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown4); + drawInput("Unknown #5", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown5); + drawInput("Unknown #6", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown6); + drawInput("Unknown #7", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown7); + drawInput("Unknown #8", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown8); + drawInput("Unknown #9", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown9); + drawInput("Unknown #10", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown10); + } + } + + if (_mdts.at(_mdtIndex).enemyPositions.size()) { + if (ImGui::CollapsingHeader("Enemy Positions")) { + if (ImGui::BeginCombo("Enemy Pos #", std::format("Enemy Position {}", _ePosIndex + 1).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).enemyPositions.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _ePosIndex); + if (ImGui::Selectable(std::format("Enemy Position {}", i + 1).c_str(), is_selected)) { + _ePosIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Index", &_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).index); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown1); + drawInputN("X/Z Min", (float*)& _mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).minimum, 2); + drawInputN("X/Z Max", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).maximum, 2); + drawInputN("X/Y/Z Pos", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).position, 3); + drawInputN("X/Y/Z #1", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown2, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + drawInputN("X/Y/Z #2", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown3, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + drawInputN("X/Y/Z #3", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown4, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + drawInputN("X/Y/Z #4", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown5, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + drawInputN("X/Y/Z #5", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown6, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + drawInputN("X/Y/Z #6", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown7, 3); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); + } + } + + if (_mdts.at(_mdtIndex).enemyGroups.size()) { + if (ImGui::CollapsingHeader("Enemy Groups")) { + if (ImGui::BeginCombo("Enemy Group #", std::format("Enemy Group {}", _eGroupIndex + 1).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).enemyGroups.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _eGroupIndex); + if (ImGui::Selectable(std::format("Enemy Group {}", i + 1).c_str(), is_selected)) { + _eGroupIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Group Index", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).index); + + if (ImGui::BeginCombo("Enemy #", std::format("Enemy {}", _eGroupPosIndex + 1).c_str())) { + // there can only ever be 4 unique enemies in a group, as far as I can tell + for (size_t i = 0; i < 4; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _eGroupPosIndex); + if (ImGui::Selectable(std::format("Enemy {}", i+ 1).c_str(), is_selected)) { + _eGroupPosIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Enemy Index", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].index); + drawInput("# of Enemy", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].numEnemy); + drawInput("Enemy Offset", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].enemyOffset); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("References enemy/boss.csv"); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown); + drawInput("Unknown #2", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown1); + drawInput("Unknown #3", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown2); + drawInput("Unknown #4", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown3); + } + } + + if (_mdts.at(_mdtIndex).MOS.size()) { + if (ImGui::CollapsingHeader("MOS")) { + if (ImGui::BeginCombo("MOS #", std::format("MOS {}", _mosIndex + 1).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).MOS.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mosIndex); + if (ImGui::Selectable(std::format("MOS {}", i + 1).c_str(), is_selected)) { + _mosIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("ID", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).ID); + drawInput("Index", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).index); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown1); + drawInputN("X/Y/Z Pos", (float*)&_mdts.at(_mdtIndex).MOS.at(_mosIndex).position, 3); + drawInput("Unknown #2", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown2); + drawInput("Unknown #3", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown3); + drawInput("Unknown #4", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown4); + drawInput("Unknown #5", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown5); + drawInput("Unknown #6", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown6); + } + } + + if (_mdts.at(_mdtIndex).icons.size()) { + if (ImGui::CollapsingHeader("Icons")) { + if (ImGui::BeginCombo("Icon #", std::format("Icon {}", _iconIndex + 1).c_str())) { + for (size_t i = 0; i < _mdts.at(_mdtIndex).icons.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _iconIndex); + if (ImGui::Selectable(std::format("Icon {}", i + 1).c_str(), is_selected)) { + _iconIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("ID", &_mdts.at(_mdtIndex).icons.at(_iconIndex).ID); + drawInput("Unknown #1", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown); + drawInput("Unknown #2", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown1); + drawInputN("X/Y/Z Pos", &_mdts.at(_mdtIndex).icons.at(_iconIndex).xPos, 3); + drawInput("Unknown #3", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown2); + drawInput("Y Angle", &_mdts.at(_mdtIndex).icons.at(_iconIndex).yAngle); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unsure"); + + if (ImGui::BeginCombo("Item #1", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item1).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item1); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).icons.at(_iconIndex).item1 = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Item #2", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item2).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item2); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) + _mdts.at(_mdtIndex).icons.at(_iconIndex).item2 = (uint16_t)i; + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Item #3", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item3).name)) { + + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item3); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).icons.at(_iconIndex).item3 = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Flag", &_mdts.at(_mdtIndex).icons.at(_iconIndex).flag); + } + } + + if (_mdts.at(_mdtIndex).shop.size()) { + if (ImGui::CollapsingHeader("Shops")) { + if (ImGui::BeginCombo("Weapons #", std::format("Weapons {}", _shopWeaponIndex + 1).c_str())) { + for (size_t i = 0; i < 12; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _shopWeaponIndex); + if (ImGui::Selectable(std::format("Weapons {}", i + 1).c_str(), is_selected)) { + _shopWeaponIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Weapon Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Armors #", std::format("Armors {}", _shopArmorIndex + 1).c_str())) { + for (size_t i = 0; i < 12; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _shopArmorIndex); + if (ImGui::Selectable(std::format("Armors {}", i + 1).c_str(), is_selected)) { + _shopArmorIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Armor Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Jewelry #", std::format("Jewelry {}", _shopJewelIndex + 1).c_str())) { + for (size_t i = 0; i < 12; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _shopJewelIndex); + if (ImGui::Selectable(std::format("Jewelry {}", i + 1).c_str(), is_selected)) { + _shopJewelIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Jewelry Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Items #", std::format("Item {}", _shopItemIndex + 1).c_str())) { + for (size_t i = 0; i < 12; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _shopItemIndex); + if (ImGui::Selectable(std::format("Item {}", i + 1).c_str(), is_selected)) { + _shopItemIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Item Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Regionals #", std::format("Regionals {}", _shopRegionalIndex + 1).c_str())) { + for (size_t i = 0; i < 12; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _shopRegionalIndex); + if (ImGui::Selectable(std::format("Regionals {}", i + 1).c_str(), is_selected)) { + _shopRegionalIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Regional Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + } + } + + // we are ignoring models for now until we understand the NJCM format + //drawModel(models, &mdt[mapID], canClose); + + ImGui::End(); +} + +void Mdts::outputToCSV() { + std::ofstream output; + output.open("./csv/MAP_NAMES.CSV"); + output << "File,Map\n"; + + for (const auto& val : _mdts) { + output << val.filename << ",\"" << val.mapname << "\"\n"; + } + + output.close(); +} + +void Mdts::randomize() { + std::random_device rd; + std::mt19937 g(rd()); + + for (auto& mdt : _mdts) { + for (auto& icon : mdt.icons) { + if (icon.item1) { + do { + icon.item1 = (uint16_t)(g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(icon.item1).name).find_first_not_of(' ') == std::string::npos); + } + + if (icon.item2) { + do { + icon.item2 = (uint16_t)(g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(icon.item2).name).find_first_not_of(' ') == std::string::npos); + + } + + if (icon.item3) { + do { + icon.item3 = (uint16_t)(g() % Items::getInstance().getItems().size()); + } while (std::string(Items::getInstance().getItems().at(icon.item3).name).find_first_not_of(' ') == std::string::npos); + } + } + + for (auto& shop : mdt.shop) { + // weapons + for (size_t i = 0; i < 12; i++) { + do { + shop.weapons.items[i].item = 300 + g() % 200; + } while (std::string(Items::getInstance().getItems().at(shop.weapons.items[i].item).name).find_first_not_of(' ') == std::string::npos); + } + + // armors + for (size_t i = 0; i < 12; i++) { + do { + shop.armors.items[i].item = 500 + g() % 200; + } while (std::string(Items::getInstance().getItems().at(shop.armors.items[i].item).name).find_first_not_of(' ') == std::string::npos); + } + + // accessories + for (size_t i = 0; i < 12; i++) { + do { + shop.jewelry.items[i].item = 700 + g() % 99; + } while (std::string(Items::getInstance().getItems().at(shop.jewelry.items[i].item).name).find_first_not_of(' ') == std::string::npos); + } + + // items + for (size_t i = 0; i < 12; i++) { + do { + shop.items.items[i].item = 100 + g() % 100; + } while (std::string(Items::getInstance().getItems().at(shop.items.items[i].item).name).find_first_not_of(' ') == std::string::npos); + } + + // regionals + for (size_t i = 0; i < 12; i++) { + do { + shop.regionals.items[i].item = 200 + g() % 100; + } while (std::string(Items::getInstance().getItems().at(shop.regionals.items[i].item).name).find_first_not_of(' ') == std::string::npos); + } + } + } +} \ No newline at end of file diff --git a/src/maps/Maps.h b/src/maps/Maps.h new file mode 100644 index 0000000..bb0a36e --- /dev/null +++ b/src/maps/Maps.h @@ -0,0 +1,76 @@ +#pragma once +#include + +#include "../common/BaseDataInterface.h" +#include "./EnemyGroup.h" +#include "./EnemyPosition.h" +#include "./Header.h" +#include "./HTA.h" +#include "./Icon.h" +#include "./Instance.h" +#include "./MapEntry.h" +#include "./MOS.h" +#include "./Shop.h" + +#include "../common/version_check.h" + +struct MdtStruct { + Header header; + std::vector mapEntries; + std::vector instances; + std::vector HTA; + std::vector enemyPositions; + std::vector enemyGroups; + std::vector MOS; + std::vector icons; + std::vector shop; + + //std::vector models; + + std::string mapname = ""; + std::string filename = ""; + std::string filenameChr = ""; +}; + +class Mdts : public BaseDataInterface { +public: + Mdts(const Mdts&) = delete; + Mdts(const Mdts&&) = delete; + + static Mdts& getInstance() { + static Mdts instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + + const std::vector& getMdts() { return _mdts; }; + +private: + Mdts() { + _directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/map/" : "./data/afs/map/"); + read(); + }; + + std::vector _mdts; + size_t _mdtIndex = 0; + size_t _mapEntryIndex = 0; + size_t _instanceIndex = 0; + size_t _htaIndex = 0; + size_t _ePosIndex = 0; + size_t _eGroupIndex = 0; + size_t _eGroupPosIndex = 0; + size_t _mosIndex = 0; + size_t _iconIndex = 0; + size_t _shopIndex = 0; + + size_t _shopWeaponIndex = 0; + size_t _shopArmorIndex = 0; + size_t _shopJewelIndex = 0; + size_t _shopItemIndex = 0; + size_t _shopRegionalIndex = 0; +}; \ No newline at end of file diff --git a/src/ModelClass.cpp b/src/maps/ModelClass.cpp similarity index 100% rename from src/ModelClass.cpp rename to src/maps/ModelClass.cpp diff --git a/src/include/ModelClass.h b/src/maps/ModelClass.h similarity index 97% rename from src/include/ModelClass.h rename to src/maps/ModelClass.h index b7908c3..6e8adbe 100644 --- a/src/include/ModelClass.h +++ b/src/maps/ModelClass.h @@ -2,7 +2,7 @@ #include -#include "BaseDataClass.h" +#include "BaseDataInterface.h" struct POF0 { uint32_t length = 0; @@ -96,7 +96,7 @@ struct modelStruct { std::string filename = ""; }; -class ModelClass : public BaseDataClass { +class ModelClass : public BaseDataInterface { public: ModelClass() {}; void write(); diff --git a/src/include/ModelStruct.h b/src/maps/ModelStruct.h similarity index 100% rename from src/include/ModelStruct.h rename to src/maps/ModelStruct.h diff --git a/src/Model_IO.cpp b/src/maps/Model_IO.cpp similarity index 100% rename from src/Model_IO.cpp rename to src/maps/Model_IO.cpp diff --git a/src/maps/Shop.h b/src/maps/Shop.h new file mode 100644 index 0000000..96408b9 --- /dev/null +++ b/src/maps/Shop.h @@ -0,0 +1,27 @@ +#pragma once +#include + +#pragma pack(1) +struct ShopItem { + uint16_t item = 0; // offset by 0x0800 +}; +#pragma pack() + +#pragma pack(1) +struct ShopSection { + char title[8]; + ShopItem items[12]; +}; +#pragma pack() + +#pragma pack(1) +struct ShopStruct { + uint16_t mapID = 0; + uint16_t catagories = 0; + ShopSection weapons; + ShopSection armors; + ShopSection jewelry; + ShopSection items; + ShopSection regionals; +}; +#pragma pack() \ No newline at end of file diff --git a/src/moves/ManaEgg.h b/src/moves/ManaEgg.h new file mode 100644 index 0000000..f42a707 --- /dev/null +++ b/src/moves/ManaEgg.h @@ -0,0 +1,17 @@ +#pragma once +#include + +#pragma pack(1) +struct SpellImplementation { + uint8_t spellOffset = 0; + uint8_t startingLevel = 0; + uint8_t eggLevelRequired = 0; + uint8_t unknown1 = 0; +}; +#pragma pack() + +#pragma pack(1) +struct ManaEgg { + SpellImplementation spells[18]; +}; +#pragma pack() \ No newline at end of file diff --git a/src/moves/ManaEggs.cpp b/src/moves/ManaEggs.cpp new file mode 100644 index 0000000..ef49d57 --- /dev/null +++ b/src/moves/ManaEggs.cpp @@ -0,0 +1,170 @@ +#include +#include +#include +#include + +#include "./ManaEggs.h" +#include "./Moves.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void ManaEggs::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("TB_MAGIC.BIN not found to be written!"); + } + + for (size_t i = 0; i < _manaeggs.size(); i++) { + for (size_t j = 0; j < 18; j++) { + writeRaw(output, _manaeggs.at(i).spells[j]); + } + } + + output.close(); +} + +void ManaEggs::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("TB_MAGIC.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + _manaeggs.resize(fileSize / 72); // entries are 72 bytes long(each spell is 4 bytes long, 18 spells per egg) + + for (size_t i = 0; i < _manaeggs.size(); i++) { + for (size_t j = 0; j < 18; j++) { + _manaeggs.at(i).spells[j] = readRaw(input); + } + } + + input.close(); +} + +void ManaEggs::draw() { + ImGui::Begin("MANAEGGS"); + + auto eggDefs = JsonDefinitions::getInstance().getDefinitions("eggs"); + + if (ImGui::Button("Save")) { + write(); + } + + // ManaEgg names are stored inside ITEMS.BIN, so until we find a way to track that, we stick with a hardcoded version + if (ImGui::BeginCombo("ManaEgg Index", eggDefs.at(_eggIndex).c_str())) { + for (size_t i = 0; i < _manaeggs.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _eggIndex); + if (ImGui::Selectable(eggDefs.at(i).c_str(), is_selected)) { + _eggIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Index", std::format("Index {}", _spellIndex + 1).c_str())) { + for (size_t i = 0; i < 18; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _spellIndex); + if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { + _spellIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Spell", Moves::getInstance().getMoves().at(_manaeggs.at(_eggIndex).spells[_spellIndex].spellOffset).name)) { + for (size_t i = 0; i < Moves::getInstance().getMoves().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _manaeggs.at(_eggIndex).spells[_spellIndex].spellOffset); + if (ImGui::Selectable(Moves::getInstance().getMoves().at(i).name, is_selected)) { + _manaeggs.at(_eggIndex).spells[_spellIndex].spellOffset = (uint8_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Starting Level", &_manaeggs.at(_eggIndex).spells[_spellIndex].startingLevel); + drawInput("Egg Level Required", &_manaeggs.at(_eggIndex).spells[_spellIndex].eggLevelRequired); + drawInput("Unknown #1", &_manaeggs.at(_eggIndex).spells[_spellIndex].unknown1); + + ImGui::End(); +} + +void ManaEggs::outputToCSV() { + auto eggDefs = JsonDefinitions::getInstance().getDefinitions("eggs"); + std::ofstream output; + output.open("./csv/TB_MAGIC.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Manaegg"; + for(size_t i = 0; i < 18; i++) { + output << ",Move,Starting Level,Level Required,???"; + } + output << '\n'; + + for (size_t i = 0; i < _manaeggs.size(); i++) { + output << eggDefs.at(i).c_str(); + for (size_t j = 0; j < 18; j++) { + output << ',' << Moves::getInstance().getMoves().at(_manaeggs.at(i).spells[j].spellOffset).name + << ',' << std::to_string(_manaeggs.at(i).spells[j].startingLevel) + << ',' << std::to_string(_manaeggs.at(i).spells[j].eggLevelRequired) + << ',' << std::to_string(_manaeggs.at(i).spells[j].unknown1); + } + + output << '\n'; + } + + output.close(); +} + +void ManaEggs::randomize() { + std::random_device rd; + std::mt19937 g(rd()); + + for (auto& manaegg : _manaeggs) { + std::unordered_map usedIndices; + for (size_t i = 0; i < 18; i++) { + do { + manaegg.spells[i].spellOffset = (g() % (50 - 1)) + 1; + } while (std::string(Moves::getInstance().getMoves().at(manaegg.spells[i].spellOffset).name).find_first_not_of(' ') == std::string::npos || usedIndices.find(manaegg.spells[i].spellOffset) != usedIndices.end()); + usedIndices.insert(std::make_pair(manaegg.spells[i].spellOffset, manaegg.spells[i].spellOffset)); + manaegg.spells[i].startingLevel = (g() % 2) ? g() % 6 : 0; + if (manaegg.spells[i].startingLevel == 0) { + manaegg.spells[i].eggLevelRequired = g() % 41; + } + else { + manaegg.spells[i].eggLevelRequired = 0; + } + } + } +} \ No newline at end of file diff --git a/src/moves/ManaEggs.h b/src/moves/ManaEggs.h new file mode 100644 index 0000000..50298e6 --- /dev/null +++ b/src/moves/ManaEggs.h @@ -0,0 +1,37 @@ +#pragma once +#include + +#include "./ManaEgg.h" + +#include "../common/version_check.h" +#include "../common/BaseDataInterface.h" + +class ManaEggs : public BaseDataInterface { +public: + ManaEggs(const ManaEggs&) = delete; + ManaEggs(const ManaEggs&&) = delete; + + static ManaEggs& getInstance() { + static ManaEggs instance; + return instance; + }; + + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + + const std::vector& getManaEggs() { return _manaeggs; }; + +private: + ManaEggs() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_MAGIC.BIN" : "./data/afs/xls_data/TB_MAGIC.BIN"); + read(); + }; + + std::vector _manaeggs; + size_t _eggIndex = 0; + size_t _spellIndex = 0; +}; \ No newline at end of file diff --git a/src/moves/Move.h b/src/moves/Move.h new file mode 100644 index 0000000..e3f0b8e --- /dev/null +++ b/src/moves/Move.h @@ -0,0 +1,45 @@ +#pragma once +#include + +#pragma pack(1) +struct MoveStats { + uint16_t cost = 0; + uint8_t targetEffect = 0; + uint8_t targetType = 0; + uint16_t strength = 0; + uint16_t power = 0; + uint16_t range = 0; + uint16_t cast1Time = 0; + uint16_t cast5Time = 0; + uint16_t recovery = 0; + uint16_t animation = 0; + uint8_t unknown1 = 0; + uint8_t knockDown = 0; + int16_t ipStun = 0; + int16_t ipCancelStun = 0; + int16_t knockback = 0; + uint8_t element = 0; + uint8_t elementStrength = 0; + uint8_t ailmentsBitflag = 0; + uint8_t ailmentsChance = 0; + int8_t atkMod = 0; + int8_t defMod = 0; + int8_t actMod = 0; + int8_t movMod = 0; + uint16_t special = 0; + uint16_t coinCost1 = 0; + uint16_t coinCost2 = 0; + uint16_t coinCost3 = 0; + uint16_t coinCost4 = 0; + uint16_t coinCost5 = 0; + uint16_t multiplier = 0; +}; +#pragma pack() + +struct Move { + uint8_t id = 0; // overwrite this with array index, used to reference which move manaeggs and specials reference + uint8_t icon = 0; + char name[19]; + MoveStats stats; + char description[41]; +}; \ No newline at end of file diff --git a/src/moves/Moves.cpp b/src/moves/Moves.cpp new file mode 100644 index 0000000..4b1d9a2 --- /dev/null +++ b/src/moves/Moves.cpp @@ -0,0 +1,309 @@ +#include +#include +#include +#include +#include + +#include "./Moves.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void Moves::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("MS_PARAM.BIN not found to be written!"); + } + + for (size_t i = 0; i < _moves.size(); i++) { + _moves.at(i).icon++; // icon is offset by 1, adjust first + _moves.at(i).stats.atkMod %= 6; // stat changes are limited to between -5 and 5 + _moves.at(i).stats.defMod %= 6; + _moves.at(i).stats.actMod %= 6; + _moves.at(i).stats.movMod %= 6; + + writeRaw(output, _moves.at(i).id); + writeRaw(output, _moves.at(i).icon); + output.write((char*)_moves[i].name, 18); + writeRaw(output, _moves.at(i).stats); + output.write((char*)_moves.at(i).description, 40); + + _moves.at(i).icon--; + } + + output.close(); +} + +void Moves::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("MS_PARAM.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + _moves.resize(fileSize / 108); // entries are 108 bytes long + + for (int i = 0; i < _moves.size(); i++) { + readRaw(input); + _moves.at(i).id = i; // overwrite all IDs, we want them to be equal to the offset of the entry in the file + + _moves.at(i).icon = readRaw(input); + + // strings are not null terminated, we cannot read them from the file like everything else + input.read(&_moves.at(i).name[0], 18); + replaceNulls(_moves.at(i).name, 18); + + _moves[i].stats = readRaw(input); + + input.read(&_moves.at(i).description[0], 40); + replaceNulls(_moves.at(i).description, 40); + + if (_moves.at(i).icon != 0) { + _moves.at(i).icon--; + } + } + + input.close(); + + // set default starting state + if (_moves.size()) { + for (size_t i = 0; i < 8; i++) { + AilmentBitFlags[i] = (_moves.at(0).stats.ailmentsBitflag & (1 << i)) > 0; + } + } +} + +void Moves::draw() { + ImGui::Begin("MS_PARAM"); + + auto iconDefs = JsonDefinitions::getInstance().getDefinitions("icons"); + auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); + auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); + auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); + auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); + auto statusDefs = JsonDefinitions::getInstance().getDefinitions("statuses"); + + if (ImGui::Button("Save")) { + write(); + } + + ImGui::SameLine(); + if (ImGui::Button("Copy")) { + copyObj(&_moves.at(_moveIndex), "Move"); + } + + ImGui::SameLine(); + if (ImGui::Button("Paste")) { + if (checkObjType("Move")) { + _moves.at(_moveIndex) = *((Move*)pasteObj()); + + for (size_t i = 0; i < 8; i++) { + AilmentBitFlags[i] = _moves.at(_moveIndex).stats.ailmentsBitflag & (1 << i); + } + } + } + + if (ImGui::BeginCombo("Move Index", _moves.at(_moveIndex).name)) { + for (size_t i = 0; i < _moves.size() - 1; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moveIndex); + if (ImGui::Selectable(_moves.at(i).name, is_selected)) { + _moveIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + for (size_t i = 0; i < 8; i++) { + AilmentBitFlags[i] = _moves.at(_moveIndex).stats.ailmentsBitflag & (1 << i); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Icon", iconDefs.at(_moves.at(_moveIndex).icon).c_str())) { + for (size_t i = 0; i < iconDefs.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moves.at(_moveIndex).icon); + if (ImGui::Selectable(iconDefs.at(i).c_str(), is_selected)) { + _moves.at(_moveIndex).icon = (uint8_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + ImGui::InputText("Name", _moves.at(_moveIndex).name, 19); + drawInput("Cost", &_moves.at(_moveIndex).stats.cost); + + if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_moves.at(_moveIndex).stats.targetEffect).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moves.at(_moveIndex).stats.targetEffect); + if (ImGui::Selectable(targetEffectDefs.at(i).c_str(), is_selected)) { + _moves.at(_moveIndex).stats.targetEffect = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Target Type", targetTypeDefs.at(_moves.at(_moveIndex).stats.targetType).c_str())) { + for (uint8_t i = 0; i < 16; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moves.at(_moveIndex).stats.targetType); + if (ImGui::Selectable(targetTypeDefs.at(i).c_str(), is_selected)) { + _moves.at(_moveIndex).stats.targetType = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Strength", &_moves.at(_moveIndex).stats.strength); + drawInput("Power", &_moves.at(_moveIndex).stats.power); + drawInput("Range", &_moves.at(_moveIndex).stats.range); + drawInputN("Cast Time Lv1/Lv5", &_moves.at(_moveIndex).stats.cast1Time, 2); + drawInput("Recovery", &_moves.at(_moveIndex).stats.recovery); + + if (ImGui::BeginCombo("Animation", animationDefs.at(_moves.at(_moveIndex).stats.animation).c_str())) { + for (size_t i = 0; i < _moves.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moves.at(_moveIndex).stats.animation); + if (ImGui::Selectable(animationDefs.at(i).c_str(), is_selected)) { + _moves.at(_moveIndex).stats.animation = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Unknown #1", &_moves.at(_moveIndex).stats.unknown1); + drawInput("Knockdown", &_moves.at(_moveIndex).stats.knockDown); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Will this move knockdown those hit?"); + drawInputN("IP Stun/IP Cancel Stun", &_moves.at(_moveIndex).stats.ipStun, 2); + drawInput("Knockback", &_moves.at(_moveIndex).stats.knockback); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("How much move will knockback those hit."); + + if (ImGui::BeginCombo("Element", elementDefs.at(_moves.at(_moveIndex).stats.element).c_str())) { + for (uint8_t i = 0; i < 5; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moves.at(_moveIndex).stats.element); + if (ImGui::Selectable(elementDefs.at(i).c_str(), is_selected)) { + _moves.at(_moveIndex).stats.element = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Element Strength", &_moves.at(_moveIndex).stats.elementStrength); + + for (size_t i = 0; i < 8; i++) { + if (ImGui::Checkbox(statusDefs.at(i).c_str(), &AilmentBitFlags[i])) { + _moves.at(_moveIndex).stats.ailmentsBitflag ^= (1 << i); + } + if ((i+1) % 4) { + ImGui::SameLine(); + } + } + + drawInput("Ailments Chance", &_moves.at(_moveIndex).stats.ailmentsChance); + drawInputN("Atk/Def/Act/Mov Mods", &_moves.at(_moveIndex).stats.atkMod, 4); + drawInput("Special", &_moves.at(_moveIndex).stats.special); + drawInput("Coin Cost Lv1", &_moves.at(_moveIndex).stats.coinCost1); + drawInput("Coin Cost Lv2", &_moves.at(_moveIndex).stats.coinCost2); + drawInput("Coin Cost Lv3", &_moves.at(_moveIndex).stats.coinCost3); + drawInput("Coin Cost Lv4", &_moves.at(_moveIndex).stats.coinCost4); + drawInput("Coin Cost Lv5", &_moves.at(_moveIndex).stats.coinCost5); + drawInput("Multiplier", &_moves.at(_moveIndex).stats.multiplier); + ImGui::InputText("Description", _moves.at(_moveIndex).description, 41); + + ImGui::End(); +} + +void Moves::outputToCSV() { + auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); + auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); + auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); + std::ofstream output; + output.open("./csv/MS_PARAM.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Index,Icon,Name,Cost,Target Effect,Target Type,Strength,Power,Range,Cast Lv1,Cast Lv5,Recovery,Animation,???,Knockdown,IP Damage,IP Cancel Damage,Knockback,Element,Element Strength,Status Effect Bitflag," + << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special Effect,Cost Lv1,Cost Lv2,Cost Lv3,Cost Lv4,Cost Lv5,Power Multiplier,Description\n"; + + for (const auto& val : _moves) { + output << std::to_string(val.id) << ',' + << std::to_string(val.icon) << ',' + << val.name << ',' + << std::to_string(val.stats.cost) << ',' + << targetEffectDefs.at(val.stats.targetEffect) << ',' + << targetTypeDefs.at(val.stats.targetType) << ',' + << std::to_string(val.stats.strength) << ',' + << std::to_string(val.stats.power) << ',' + << std::to_string(val.stats.range) << ',' + << std::to_string(val.stats.cast1Time) << ',' + << std::to_string(val.stats.cast5Time) << ',' + << std::to_string(val.stats.recovery) << ',' + << _moves.at(val.stats.animation).name << ',' + << std::to_string(val.stats.unknown1) << ',' + << std::to_string(val.stats.knockDown) << ',' + << std::to_string(val.stats.ipStun) << ',' + << std::to_string(val.stats.ipCancelStun) << ',' + << std::to_string(val.stats.knockback) << ',' + << elementDefs.at(val.stats.element) << ',' + << std::to_string(val.stats.elementStrength) << ',' + << std::to_string(val.stats.ailmentsBitflag) << ',' + << std::to_string(val.stats.ailmentsChance) << ',' + << std::to_string(val.stats.atkMod) << ',' + << std::to_string(val.stats.defMod) << ',' + << std::to_string(val.stats.actMod) << ',' + << std::to_string(val.stats.movMod) << ',' + << std::to_string(val.stats.special) << ',' + << std::to_string(val.stats.coinCost1) << ',' + << std::to_string(val.stats.coinCost2) << ',' + << std::to_string(val.stats.coinCost3) << ',' + << std::to_string(val.stats.coinCost4) << ',' + << std::to_string(val.stats.coinCost5) << ',' + << std::to_string(val.stats.multiplier) << ',' + << val.description << '\n'; + } + + output.close(); +} \ No newline at end of file diff --git a/src/moves/Moves.h b/src/moves/Moves.h new file mode 100644 index 0000000..f0248aa --- /dev/null +++ b/src/moves/Moves.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include "../common/version_check.h" +#include "../common/BaseDataInterface.h" +#include "./Move.h" + +class Moves : public BaseDataInterface { +public: + Moves(const Moves&) = delete; + Moves(const Moves&&) = delete; + + static Moves& getInstance() { + static Moves instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + + const std::vector& getMoves() { return _moves; }; + +private: + Moves() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/MS_PARAM.BIN" : "./data/afs/xls_data/MS_PARAM.BIN"); + read(); + }; + + std::vector _moves; + size_t _moveIndex = 0; + bool AilmentBitFlags[8] = {}; +}; \ No newline at end of file diff --git a/src/moves/Special.h b/src/moves/Special.h new file mode 100644 index 0000000..34330df --- /dev/null +++ b/src/moves/Special.h @@ -0,0 +1,16 @@ +#pragma once +#include + +#pragma pack(1) +struct MoveImplementation { + uint8_t moveOffset = 0; + uint8_t startingLevel = 0; + uint16_t storyFlag = 0; +}; +#pragma pack() + +#pragma pack(1) +struct SpecialMove { + MoveImplementation moves[6]; +}; +#pragma pack() \ No newline at end of file diff --git a/src/moves/Specials.cpp b/src/moves/Specials.cpp new file mode 100644 index 0000000..53fabc7 --- /dev/null +++ b/src/moves/Specials.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include + +#include "./Specials.h" +#include "./Moves.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "./imgui.h" +#include "../ui/imgui_wrappers.h" + +#include "./Moves.h" + +void Specials::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("TB_SPCL.BIN not found to be written!"); + } + + for (size_t i = 0; i < _specials.size(); i++) { + for (size_t j = 0; j < 6; j++) { + writeRaw(output, _specials.at(i).moves[j]); + } + } + + output.close(); +} + +void Specials::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("TB_SPCL.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + _specials.resize(fileSize / 24); // entries are 24 bytes long(each special is 4 bytes long, 6 specials per book) + + for (size_t i = 0; i < _specials.size(); i++) { + for (size_t j = 0; j < 6; j++) { + _specials.at(i).moves[j] = readRaw(input); + } + } + + input.close(); +} + +void Specials::draw() { + ImGui::Begin("SPECIALS"); + + auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); + + if (ImGui::Button("Save")) { + write(); + } + + if (ImGui::BeginCombo("Special Index", specialDefs.at(_specialIndex).c_str())) { + for (size_t i = 0; i < _specials.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _specialIndex); + if (ImGui::Selectable(specialDefs.at(i).c_str(), is_selected)) { + _specialIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Index", std::format("Index {}", _moveIndex + 1).c_str())) { + for (size_t i = 0; i < 6; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _moveIndex); + if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { + _moveIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Move", Moves::getInstance().getMoves().at(_specials.at(_specialIndex).moves[_moveIndex].moveOffset).name)) { + for (size_t i = 0; i < Moves::getInstance().getMoves().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _specials.at(_specialIndex).moves[_moveIndex].moveOffset); + if (ImGui::Selectable(Moves::getInstance().getMoves().at(i).name, is_selected)) { + _specials.at(_specialIndex).moves[_moveIndex].moveOffset = (uint8_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Starting Level", &_specials[_specialIndex].moves[_moveIndex].startingLevel); + drawInput("Story Flag", &_specials[_specialIndex].moves[_moveIndex].storyFlag); + + ImGui::End(); +} + +void Specials::outputToCSV() { + auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); + std::ofstream output; + output.open("./csv/TB_SPCL.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Character"; + for (size_t i = 0; i < 6; i++) { + output << ",Move,Starting Level,Story Flag"; + } + output << '\n'; + + for (size_t i = 0; i < _specials.size(); i++) { + output << specialDefs.at(i); + for (size_t j = 0; j < 6; j++) { + output << ',' << Moves::getInstance().getMoves().at(_specials.at(i).moves[j].moveOffset).name + << ',' << std::to_string(_specials.at(i).moves[j].startingLevel) + << ',' << std::to_string(_specials.at(i).moves[j].storyFlag); + } + + output << '\n'; + } + + output.close(); +} \ No newline at end of file diff --git a/src/moves/Specials.h b/src/moves/Specials.h new file mode 100644 index 0000000..9d68b1d --- /dev/null +++ b/src/moves/Specials.h @@ -0,0 +1,35 @@ +#pragma once +#include + +#include "Special.h" + +#include "../common/version_check.h" +#include "../common/BaseDataInterface.h" + +class Specials : public BaseDataInterface { +public: + Specials(const Specials&) = delete; + Specials(const Specials&&) = delete; + + static Specials& getInstance() { + static Specials instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + + const std::vector& getSpecials() { return _specials; }; + +private: + Specials() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_SPCL.BIN" : "./data/afs/xls_data/TB_SPCL.BIN"); + read(); + }; + + std::vector _specials; + size_t _specialIndex = 0; + size_t _moveIndex = 0; +}; \ No newline at end of file diff --git a/src/include/SkillsClass.h b/src/skills/Skill.h similarity index 53% rename from src/include/SkillsClass.h rename to src/skills/Skill.h index f8dabd8..e712461 100644 --- a/src/include/SkillsClass.h +++ b/src/skills/Skill.h @@ -1,13 +1,8 @@ #pragma once - -#include - -#include "./common/version_check.h" - -#include "./BaseDataClass.h" +#include #pragma pack(1) -struct SkillStatsStruct { +struct SkillStats { uint8_t cost1 = 0; uint8_t cost2 = 0; uint16_t baseHp = 0; @@ -42,35 +37,10 @@ struct SkillStatsStruct { }; #pragma pack() -struct SkillStruct { +#pragma pack(1) +struct Skill { char name[19]; - SkillStatsStruct stats; + SkillStats stats; char description[41]; }; - -class Skills : public BaseDataClass { -public: - Skills(const Skills&) = delete; - Skills(const Skills&&) = delete; - - static Skills& getInstance() { - static Skills instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - - const std::vector* getSkills() { return &_skills; }; - size_t getNumSkills() { return _skills.size(); }; - -private: - Skills() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/SK_PARAM.BIN" : "./data/afs/xls_data/SK_PARAM.BIN"); - }; - - std::vector _skills; - size_t _skillIndex = 0; -}; \ No newline at end of file +#pragma pack() \ No newline at end of file diff --git a/src/skills/SkillBook.h b/src/skills/SkillBook.h new file mode 100644 index 0000000..08246b6 --- /dev/null +++ b/src/skills/SkillBook.h @@ -0,0 +1,17 @@ +#pragma once +#include + +#pragma pack(1) +struct SkillImplementation { + uint8_t skillOffset = 0; + uint8_t startingLevel = 0; + uint8_t bookLevelRequired = 0; + uint8_t unknown1 = 0; +}; +#pragma pack() + +#pragma pack(1) +struct SkillBook { + SkillImplementation skills[6]; +}; +#pragma pack() \ No newline at end of file diff --git a/src/skills/SkillBooks.cpp b/src/skills/SkillBooks.cpp new file mode 100644 index 0000000..78a20ba --- /dev/null +++ b/src/skills/SkillBooks.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include + +#include "./SkillBooks.h" +#include "./Skills.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void SkillBooks::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("TB_SKILL.BIN not found to be written!"); + } + + for (size_t i = 0; i < _skillbooks.size(); i++) { + for (size_t j = 0; j < 6; j++) { + writeRaw(output, _skillbooks.at(i).skills[j]); + } + } + + output.close(); +} + +void SkillBooks::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("TB_SKILL.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + + _skillbooks.resize(fileSize / 24); // entries are 24 bytes long(each skill is 4 bytes long, 6 skills per book) + + for (size_t i = 0; i < _skillbooks.size(); i++) { + for (size_t j = 0; j < 6; j++) { + _skillbooks.at(i).skills[j] = readRaw(input); + } + } + + input.close(); +} + +void SkillBooks::draw() { + ImGui::Begin("SKILLBOOKS"); + + auto bookDefs = JsonDefinitions::getInstance().getDefinitions("books"); + + if (ImGui::Button("Save")) { + write(); + } + + if (ImGui::BeginCombo("SkillBook Index", bookDefs.at(_bookIndex).c_str())) { + for (size_t i = 0; i < _skillbooks.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _bookIndex); + if (ImGui::Selectable(bookDefs.at(i).c_str(), is_selected)) { + _bookIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Index", std::format("Index {}", _skillIndex + 1).c_str())) { + for (size_t i = 0; i < 6; i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _skillIndex); + if (ImGui::Selectable(std::format("Index {}", i + 1).c_str(), is_selected)) { + _skillIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Skill", Skills::getInstance().getSkills().at(_skillbooks.at(_bookIndex).skills[_skillIndex].skillOffset).name)) { + for (size_t i = 0; i < Skills::getInstance().getSkills().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _skillbooks.at(_bookIndex).skills[_skillIndex].skillOffset); + if (ImGui::Selectable(Skills::getInstance().getSkills().at(i).name, is_selected)) { + _skillbooks.at(_bookIndex).skills[_skillIndex].skillOffset = (uint8_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Starting Level", &_skillbooks[_bookIndex].skills[_skillIndex].startingLevel); + drawInput("Book Level Required", &_skillbooks[_bookIndex].skills[_skillIndex].bookLevelRequired); + drawInput("Unknown #1", &_skillbooks[_bookIndex].skills[_skillIndex].unknown1); + + ImGui::End(); +} + +void SkillBooks::outputToCSV() { + auto bookDefs = JsonDefinitions::getInstance().getDefinitions("books"); + std::ofstream output; + output.open("./csv/TB_SKILL.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Skillbook"; + for (size_t i = 0; i < 6; i++) { + output << ",Skill,Starting Level,Level Required,???"; + } + output << '\n'; + + for (size_t i = 0; i < _skillbooks.size(); i++) { + output << bookDefs.at(i); + + for (size_t j = 0; j < 6; j++) { + output << ',' << Skills::getInstance().getSkills().at(_skillbooks.at(i).skills[j].skillOffset).name + << ',' << std::to_string(_skillbooks.at(i).skills[j].startingLevel) + << ',' << std::to_string(_skillbooks.at(i).skills[j].bookLevelRequired) + << ',' << std::to_string(_skillbooks.at(i).skills[j].unknown1); + } + + output << '\n'; + } + + output.close(); +} + +void SkillBooks::randomize() { + std::random_device rd; + std::mt19937 g(rd()); + + for (auto& skillbook : _skillbooks) { + for (size_t i = 0; i < 6; i++) { + do { + skillbook.skills[i].skillOffset = (uint8_t)(g() % (Skills::getInstance().getSkills().size() - 1)) + 1; + } while (std::string(Skills::getInstance().getSkills().at(skillbook.skills[i].skillOffset).name).find_first_not_of(' ') == std::string::npos); + + skillbook.skills[i].startingLevel = (g() % 2) ? g() % 6 : 0; + if (skillbook.skills[i].startingLevel == 0) { + skillbook.skills[i].bookLevelRequired = g() % 16; + } + } + } +} \ No newline at end of file diff --git a/src/skills/SkillBooks.h b/src/skills/SkillBooks.h new file mode 100644 index 0000000..f55c827 --- /dev/null +++ b/src/skills/SkillBooks.h @@ -0,0 +1,38 @@ +#pragma once + +#include + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./SkillBook.h" + + +class SkillBooks : public BaseDataInterface { +public: + SkillBooks(const SkillBooks&) = delete; + SkillBooks(const SkillBooks&&) = delete; + + static SkillBooks& getInstance() { + static SkillBooks instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + + const std::vector& getSkillBooks() { return _skillbooks; }; + +private: + SkillBooks() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/TB_SKILL.BIN" : "./data/afs/xls_data/TB_SKILL.BIN"); + read(); + }; + + std::vector _skillbooks; + size_t _bookIndex = 0; + size_t _skillIndex = 0; +}; \ No newline at end of file diff --git a/src/skills/Skills.cpp b/src/skills/Skills.cpp new file mode 100644 index 0000000..6a5bd20 --- /dev/null +++ b/src/skills/Skills.cpp @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include + +#include "./Skills.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void Skills::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("SK_PARAM.BIN not found to be written!"); + } + + for (size_t i = 0; i < _skills.size(); i++) { + output.write((char*)_skills.at(i).name, 18); + writeRaw(output, _skills.at(i).stats); + output.write((char*)_skills.at(i).description, 40); + } + + output.close(); +} + +void Skills::read() { + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("SK_PARAM.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + + _skills.resize(fileSize / 104); //entries are 104 bytes long + + for (size_t i = 0; i < _skills.size(); i++) { + input.read(_skills.at(i).name, 18); + _skills.at(i).stats = readRaw(input); + input.read(_skills.at(i).description, 40); + } + + input.close(); +} + +void Skills::draw() { + ImGui::Begin("SKILLS"); + + if (ImGui::Button("Save")) { + write(); + } + + ImGui::SameLine(); + if (ImGui::Button("Copy")) { + copyObj(&_skills.at(_skillIndex), "Skill"); + } + + ImGui::SameLine(); + if (ImGui::Button("Paste") && checkObjType("Skill")) { + _skills.at(_skillIndex) = *((Skill*)pasteObj()); + } + + if (ImGui::BeginCombo("Skill Index", _skills.at(_skillIndex).name)) { + for (size_t i = 0; i < _skills.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _skillIndex); + if (ImGui::Selectable(_skills.at(i).name, is_selected)) { + _skillIndex = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + ImGui::InputText("Name", _skills.at(_skillIndex).name, 19); + drawInput("Cost Type #1", &_skills.at(_skillIndex).stats.cost1); + drawInput("Cost Type #2", &_skills.at(_skillIndex).stats.cost2); + drawInput("Base HP", &_skills.at(_skillIndex).stats.baseHp); + drawInput("Base MP", &_skills.at(_skillIndex).stats.baseMp); + drawInput("Base SP", &_skills.at(_skillIndex).stats.baseSp); + drawInput("Base STR", &_skills.at(_skillIndex).stats.baseStr); + drawInput("Base VIT", &_skills.at(_skillIndex).stats.baseVit); + drawInput("Base ACT", &_skills.at(_skillIndex).stats.baseAct); + drawInput("Base MOV", &_skills.at(_skillIndex).stats.baseMov); + drawInput("Base MAG", &_skills.at(_skillIndex).stats.baseMag); + drawInput("Base MEN", &_skills.at(_skillIndex).stats.baseMen); + drawInput("Unknown #1", &_skills.at(_skillIndex).stats.unknown1); + drawInput("Unknown #2", &_skills.at(_skillIndex).stats.unknown2); + drawInput("Unknown #3", &_skills.at(_skillIndex).stats.unknown3); + drawInput("Unknown #4", &_skills.at(_skillIndex).stats.unknown4); + drawInput("Unknown #5", &_skills.at(_skillIndex).stats.unknown5); + drawInput("Increase Fire %", &_skills.at(_skillIndex).stats.increaseFirePercent); + drawInput("Increase Wind %", &_skills.at(_skillIndex).stats.increaseWindPercent); + drawInput("Increase Earth %", &_skills.at(_skillIndex).stats.increaseEarthPercent); + drawInput("Increase Lightning %", &_skills.at(_skillIndex).stats.increaseLightningPercent); + drawInput("Increase Blizzard %", &_skills.at(_skillIndex).stats.increaseBlizzardPercent); + drawInput("Increase Water %", &_skills.at(_skillIndex).stats.increaseWaterPercent); + drawInput("Increase Explosion %", &_skills.at(_skillIndex).stats.increaseExplosionPercent); + drawInput("Increase Forest %", &_skills.at(_skillIndex).stats.increaseForestPercent); + drawInput("Special", &_skills.at(_skillIndex).stats.special); + drawInput("Coin Cost Lv1", &_skills.at(_skillIndex).stats.coinCost1); + drawInput("Coin Cost Lv2", &_skills.at(_skillIndex).stats.coinCost2); + drawInput("Coin Cost Lv3", &_skills.at(_skillIndex).stats.coinCost3); + drawInput("Coin Cost Lv4", &_skills.at(_skillIndex).stats.coinCost4); + drawInput("Coin Cost Lv5", &_skills.at(_skillIndex).stats.coinCost5); + drawInput("Multiplier", &_skills.at(_skillIndex).stats.multiplier); + ImGui::InputText("Description", _skills.at(_skillIndex).description, 41); + + ImGui::End(); +} + +void Skills::outputToCSV() { + std::ofstream output; + output.open("./csv/SK_PARAM.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Name,Cost Type,Cost Type,Base HP Inc,Base MP Inc,Base SP Inc,Base STR Inc,Base VIT Inc,Base ACT Inc,Base MOV Inc,Base MAG Inc,Base MEN Inc,???,???,???,???,???," + << "Fire Pow Inc %,Wind Pow Inc %,Earth Pow Inc %,Blizzard Pow Inc %,Water Pow Inc %,Explosion Pow Inc %,Forest Pow Inc %,Special,Cost Lv1,Cost Lv2,Cost Lv3,Cost Lv4,Cost Lv5,Multiplier,Description\n"; + + for (const auto& val : _skills) { + output << val.name << ',' + << std::to_string(val.stats.cost1) << ',' + << std::to_string(val.stats.cost2) << ',' + << std::to_string(val.stats.baseHp) << ',' + << std::to_string(val.stats.baseMp) << ',' + << std::to_string(val.stats.baseSp) << ',' + << std::to_string(val.stats.baseStr) << ',' + << std::to_string(val.stats.baseVit) << ',' + << std::to_string(val.stats.baseAct) << ',' + << std::to_string(val.stats.baseMov) << ',' + << std::to_string(val.stats.baseMag) << ',' + << std::to_string(val.stats.baseMen) << ',' + << std::to_string(val.stats.unknown1) << ',' + << std::to_string(val.stats.unknown2) << ',' + << std::to_string(val.stats.unknown3) << ',' + << std::to_string(val.stats.unknown4) << ',' + << std::to_string(val.stats.unknown5) << ',' + << std::to_string(val.stats.increaseFirePercent) << ',' + << std::to_string(val.stats.increaseWindPercent) << ',' + << std::to_string(val.stats.increaseEarthPercent) << ',' + << std::to_string(val.stats.increaseBlizzardPercent) << ',' + << std::to_string(val.stats.increaseWaterPercent) << ',' + << std::to_string(val.stats.increaseExplosionPercent) << ',' + << std::to_string(val.stats.increaseForestPercent) << ',' + << std::to_string(val.stats.special) << ',' + << std::to_string(val.stats.coinCost1) << ',' + << std::to_string(val.stats.coinCost2) << ',' + << std::to_string(val.stats.coinCost3) << ',' + << std::to_string(val.stats.coinCost4) << ',' + << std::to_string(val.stats.coinCost5) << ',' + << std::to_string(val.stats.multiplier) << ',' + << val.description << '\n'; + } + + output.close(); +} \ No newline at end of file diff --git a/src/skills/Skills.h b/src/skills/Skills.h new file mode 100644 index 0000000..0715d64 --- /dev/null +++ b/src/skills/Skills.h @@ -0,0 +1,34 @@ +#pragma once +#include + +#include "./Skill.h" + +#include "../common/BaseDataInterface.h" +#include "../common/version_check.h" + +class Skills : public BaseDataInterface { +public: + Skills(const Skills&) = delete; + Skills(const Skills&&) = delete; + + static Skills& getInstance() { + static Skills instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + + const std::vector& getSkills() { return _skills; }; + +private: + Skills() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/SK_PARAM.BIN" : "./data/afs/xls_data/SK_PARAM.BIN"); + read(); + }; + + std::vector _skills; + size_t _skillIndex = 0; +}; \ No newline at end of file diff --git a/src/include/StartStatsClass.h b/src/stats/CharacterStartStats.h similarity index 55% rename from src/include/StartStatsClass.h rename to src/stats/CharacterStartStats.h index 7a32c27..ca40a1e 100644 --- a/src/include/StartStatsClass.h +++ b/src/stats/CharacterStartStats.h @@ -1,13 +1,8 @@ #pragma once +#include -#include - -#include "./common/version_check.h" - -#include "BaseDataClass.h" -#include "./include/ItemsClass.h" - -struct StartStatsStruct { +#pragma pack(1) +struct CharacterStartStats { uint32_t exp = 0; uint16_t weapon = 0; uint16_t armour = 0; @@ -52,34 +47,4 @@ struct StartStatsStruct { uint16_t unknown22 = 0; uint16_t unknown23 = 0; }; - -class StartStats : public BaseDataClass { -public: - StartStats(const StartStats&) = delete; - StartStats(const StartStats&&) = delete; - - static StartStats& getInstance() { - static StartStats instance; - return instance; - }; - - void write(); - void read(); - void draw(); - void outputToCSV(); - void randomize(); - - void storeItems(const std::vector* items) { _items = items; }; - const std::vector* getStartStats() { return &_startStats; }; - size_t getNumStartStats() { return _startStats.size(); }; - -private: - StartStats() { - this->_filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/PC_INIT.BIN" : "./data/afs/xls_data/PC_INIT.BIN"); - }; - - std::vector _startStats; - size_t _statIndex = 0; - - const std::vector* _items = nullptr; -}; \ No newline at end of file +#pragma pack() \ No newline at end of file diff --git a/src/stats/StartStats.cpp b/src/stats/StartStats.cpp new file mode 100644 index 0000000..484bf4a --- /dev/null +++ b/src/stats/StartStats.cpp @@ -0,0 +1,344 @@ +#include +#include +#include + +#include "./StartStats.h" +#include "../items/Items.h" + +#include "../common/io_util.h" +#include "../common/string_manip.h" +#include "../common/copypaste_obj.h" + +#include "../common/JsonDefinitions.h" + +#include "../ui/imgui_wrappers.h" +#include "./imgui.h" + +void StartStats::write() { + std::ofstream output; + output.open(_filename, std::ios::binary); + + if (!output.is_open()) { + throw new std::exception("PC_INIT.BIN not found to be written!"); + } + + for (size_t i = 0; i < _startStats.size(); i++) { + writeRaw(output, _startStats.at(i)); + } + + output.close(); +} + +void StartStats::read() { + // Upon starting a new game, all characters gain EXP together. + // The EXP value displayed is what each character starts the game at. + std::ifstream input(_filename, std::ios::binary); + + if (!input.is_open()) { + throw new std::exception("PC_INIT.BIN not found to be read!"); + } + + std::filesystem::path filePath(_filename); + size_t fileSize = std::filesystem::file_size(filePath); + _startStats.resize(fileSize / 80); // entries are 80 bytes long + + for (size_t i = 0; i < _startStats.size(); i++) { + _startStats.at(i) = readRaw(input); + } + + input.close(); +} + +void StartStats::draw() { + ImGui::Begin("STARTING STATS"); + + auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); + + if (ImGui::Button("Save")) { + write(); + } + + if (ImGui::BeginCombo("Start Stat Index", characterDefs.at(_statIndex).c_str())) { + for (size_t i = 0; i < _startStats.size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _statIndex); + if (ImGui::Selectable(characterDefs.at(i).c_str(), is_selected)) + _statIndex = i; + if (is_selected) + ImGui::SetItemDefaultFocus(); + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("EXP", &_startStats[_statIndex].exp); + + if (ImGui::BeginCombo("Weapon", Items::getInstance().getItems().at(_startStats.at(_statIndex).weapon).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).weapon); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).weapon = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Armour", Items::getInstance().getItems().at(_startStats.at(_statIndex).armour).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).armour); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).armour = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Headgear", Items::getInstance().getItems().at(_startStats.at(_statIndex).headgear).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).headgear); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).headgear = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Footwear", Items::getInstance().getItems().at(_startStats.at(_statIndex).footwear).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).footwear); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).footwear = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Accessory", Items::getInstance().getItems().at(_startStats.at(_statIndex).accessory).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).accessory); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).accessory = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + if (ImGui::BeginCombo("Mana Egg", Items::getInstance().getItems().at(_startStats.at(_statIndex).manaEgg).name)) { + for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { + ImGui::PushID((int)i); + bool is_selected = (i == _startStats.at(_statIndex).manaEgg); + if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { + _startStats.at(_statIndex).manaEgg = (uint16_t)i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + drawInput("Stamina", &_startStats[_statIndex].stamina); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("How long can they move without tiring?"); + } + + drawInput("Unknown #1", &_startStats[_statIndex].unknown1); + drawInput("Unknown #2", &_startStats[_statIndex].unknown2); + drawInput("Unknown #3", &_startStats[_statIndex].unknown3); + drawInput("Unknown #4", &_startStats[_statIndex].unknown4); + drawInput("Unknown #5", &_startStats[_statIndex].unknown5); + drawInput("Unknown #6", &_startStats[_statIndex].unknown6); + drawInput("Unknown #7", &_startStats[_statIndex].unknown7); + drawInput("Unknown #8", &_startStats[_statIndex].unknown8); + drawInput("Unknown #9", &_startStats[_statIndex].unknown9); + drawInput("Unknown #10", &_startStats[_statIndex].unknown10); + + drawInputN("IP Stun/IP Cancel Stun", &_startStats[_statIndex].ipStun, 2); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("IP Stun/IP Cancel Stun Resistance."); + } + + drawInput("Combo SP Regen", &_startStats[_statIndex].comboSpRegen); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("SP regen from combo hit."); + } + + drawInput("Critical SP Regen", &_startStats[_statIndex].critSpRegen); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("SP regen from critical hit."); + } + + drawInput("Unknown #11", &_startStats[_statIndex].unknown11); + + drawInput("Damaged SP Regen", &_startStats[_statIndex].hitSpRegen); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("SP regen from taking damage."); + } + + drawInput("Unknown #12", &_startStats[_statIndex].unknown12); + + drawInput("Still Evasion Rate", &_startStats[_statIndex].evasionStillRate); + drawInput("Move Evasion Rate", &_startStats[_statIndex].evasionMovingRate); + drawInput("Knockback Resist Rate", &_startStats[_statIndex].ResistKnockback); + + drawInput("Unknown #13", &_startStats[_statIndex].unknown13); + + drawInput("T_REC", &_startStats[_statIndex].TREC); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Time to recover from status effects(lower is better)."); + } + + drawInput("T_DMG", &_startStats[_statIndex].TDMG); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Time to recover from being hit(lower is better)?"); + } + + drawInput("Unknown #14", &_startStats[_statIndex].unknown14); + + drawInput("T_HEAL", &_startStats[_statIndex].THEAL); + + drawInput("Size", &_startStats[_statIndex].size); + + drawInput("Unknown #15", &_startStats[_statIndex].unknown15); + drawInput("Unknown #16", &_startStats[_statIndex].unknown16); + drawInput("Unknown #17", &_startStats[_statIndex].unknown17); + drawInput("Unknown #18", &_startStats[_statIndex].unknown18); + drawInput("Unknown #19", &_startStats[_statIndex].unknown19); + drawInput("Unknown #20", &_startStats[_statIndex].unknown20); + drawInput("Unknown #21", &_startStats[_statIndex].unknown21); + drawInput("Unknown #22", &_startStats[_statIndex].unknown22); + drawInput("Unknown #23", &_startStats[_statIndex].unknown23); + + ImGui::End(); +} + +void StartStats::outputToCSV() { + std::ofstream output; + output.open("./csv/PC_INIT.CSV"); + + if (!output.is_open()) { + return; + } + + output << "EXP,weapon,armor,headgear,footwear,accessory,manaegg,stamina,???,???,???,???,???,???,???,???,???,???,hit IP Stun,cancel IP Stun,combo SP regen,crit SP regen,???," + << "hit SP regen,???,evasion,moveing evasion,R_KB,???,T_REC,T_DMG,???,T_HEAL,Size,???,???,???,???,???,???,???,???,???\n"; + + for (const auto& val : _startStats) { + output << std::to_string(val.exp) << ',' + << Items::getInstance().getItems().at(val.weapon).name << ',' + << Items::getInstance().getItems().at(val.armour).name << ',' + << Items::getInstance().getItems().at(val.headgear).name << ',' + << Items::getInstance().getItems().at(val.footwear).name << ',' + << Items::getInstance().getItems().at(val.accessory).name << ',' + << Items::getInstance().getItems().at(val.manaEgg).name << ',' + << std::to_string(val.stamina) << ',' + << std::to_string(val.unknown1) << ',' + << std::to_string(val.unknown2) << ',' + << std::to_string(val.unknown3) << ',' + << std::to_string(val.unknown4) << ',' + << std::to_string(val.unknown5) << ',' + << std::to_string(val.unknown6) << ',' + << std::to_string(val.unknown7) << ',' + << std::to_string(val.unknown8) << ',' + << std::to_string(val.unknown9) << ',' + << std::to_string(val.unknown10) << ',' + << std::to_string(val.ipStun) << ',' + << std::to_string(val.ipCancelStun) << ',' + << std::to_string(val.comboSpRegen) << ',' + << std::to_string(val.critSpRegen) << ',' + << std::to_string(val.unknown11) << ',' + << std::to_string(val.hitSpRegen) << ',' + << std::to_string(val.unknown12) << ',' + << std::to_string(val.evasionStillRate) << ',' + << std::to_string(val.evasionMovingRate) << ',' + << std::to_string(val.ResistKnockback) << ',' + << std::to_string(val.unknown13) << ',' + << std::to_string(val.TREC) << ',' + << std::to_string(val.TDMG) << ',' + << std::to_string(val.unknown14) << ',' + << std::to_string(val.THEAL) << ',' + << std::to_string(val.size) << ',' + << std::to_string(val.unknown15) << ',' + << std::to_string(val.unknown16) << ',' + << std::to_string(val.unknown17) << ',' + << std::to_string(val.unknown18) << ',' + << std::to_string(val.unknown19) << ',' + << std::to_string(val.unknown20) << ',' + << std::to_string(val.unknown21) << ',' + << std::to_string(val.unknown22) << ',' + << std::to_string(val.unknown23) << '\n'; + } + + output.close(); +} + +void StartStats::randomize() { + std::random_device rd; + std::mt19937 g(rd()); + size_t charIndex = 0; + + for (auto& startStat : _startStats) { + do { + startStat.weapon = (uint16_t)(300 + (30 * charIndex) + (g() % 30)); + } while (std::string(Items::getInstance().getItems().at(startStat.weapon).name).find_first_not_of(' ') == std::string::npos); + + do { + startStat.armour = (uint16_t)(500 + (g() % 70)); + } while (std::string(Items::getInstance().getItems().at(startStat.armour).name).find_first_not_of(' ') == std::string::npos); + + do { + startStat.headgear = (uint16_t)(570 + (g() % 70)); + } while (std::string(Items::getInstance().getItems().at(startStat.headgear).name).find_first_not_of(' ') == std::string::npos); + + do { + startStat.footwear = (uint16_t)(650 + (g() % 50)); + } while (std::string(Items::getInstance().getItems().at(startStat.footwear).name).find_first_not_of(' ') == std::string::npos); + + do { + startStat.accessory = (uint16_t)(700 + (g() % 99)); + } while (std::string(Items::getInstance().getItems().at(startStat.accessory).name).find_first_not_of(' ') == std::string::npos || std::string(Items::getInstance().getItems().at(startStat.accessory).name).find("Egg") != std::string::npos); + + if (g() % 3 != 0) + startStat.manaEgg = 0; + else { + do { + startStat.manaEgg = (uint16_t)(700 + g() % 99); + } while (std::string(Items::getInstance().getItems().at(startStat.manaEgg).name).find("Egg") == std::string::npos); + } + + ++charIndex; + } +} \ No newline at end of file diff --git a/src/stats/StartStats.h b/src/stats/StartStats.h new file mode 100644 index 0000000..94f2f72 --- /dev/null +++ b/src/stats/StartStats.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "../common/version_check.h" + +#include "../common/BaseDataInterface.h" +#include "./CharacterStartStats.h" + +class StartStats : public BaseDataInterface { +public: + StartStats(const StartStats&) = delete; + StartStats(const StartStats&&) = delete; + + static StartStats& getInstance() { + static StartStats instance; + return instance; + }; + + void write(); + void read(); + void draw(); + void outputToCSV(); + void randomize(); + + const std::vector& getStartStats() { return _startStats; }; + +private: + StartStats() { + _filename = (Version::getInstance().isHDVersion() ? "./content/data/afs/xls_data/PC_INIT.BIN" : "./data/afs/xls_data/PC_INIT.BIN"); + read(); + }; + + std::vector _startStats; + size_t _statIndex = 0; +}; \ No newline at end of file diff --git a/src/ImGuiInstance.cpp b/src/ui/ImGuiInstance.cpp similarity index 64% rename from src/ImGuiInstance.cpp rename to src/ui/ImGuiInstance.cpp index 8fc4a86..d7e4215 100644 --- a/src/ImGuiInstance.cpp +++ b/src/ui/ImGuiInstance.cpp @@ -1,23 +1,24 @@ #include #include -#include ".\include/ImGuiInstance.h" +#include "./ImGuiInstance.h" #include ".\imgui.h" #include ".\imgui_impl_win32.h" #include ".\imgui_impl_dx12.h" -#include "./include/MovesClass.h" -#include "./include/ManaEggsClass.h" -#include "./include/SkillsClass.h" -#include "./include/SkillBooksClass.h" -#include "./include/SpecialsClass.h" -#include "./include/ItemsClass.h" -#include "./include/StartStatsClass.h" -#include "./include/EnemiesClass.h" -#include "./include/BossesClass.h" -#include "./include/MdtsClass.h" -#include "./include/LevelupsClass.h" +#include "../moves/Moves.h" +#include "../moves/ManaEggs.h" +#include "../moves/Specials.h" +#include "../skills/Skills.h" +#include "../skills/SkillBooks.h" +#include "../items/Items.h" +#include "../stats/StartStats.h" +#include "../enemies/Enemies.h" +#include "../bosses/Bosses.h" +#include "../maps/Maps.h" +#include "../levelups/Levelups.h" +#include "../common/difficulty.h" WNDCLASSEX wc; HWND hwnd = nullptr; @@ -75,9 +76,11 @@ void StartFrame() { void EndFrame() { // Rendering - FrameContext* frameCtxt = WaitForNextFrameResources(); + ImGui::Render(); + + FrameContext* frameCtx = WaitForNextFrameResources(); UINT backBufferIdx = g_pSwapChain->GetCurrentBackBufferIndex(); - frameCtxt->CommandAllocator->Reset(); + frameCtx->CommandAllocator->Reset(); D3D12_RESOURCE_BARRIER barrier = {}; barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; @@ -86,13 +89,14 @@ void EndFrame() { barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; - - g_pd3dCommandList->Reset(frameCtxt->CommandAllocator, NULL); + g_pd3dCommandList->Reset(frameCtx->CommandAllocator, nullptr); g_pd3dCommandList->ResourceBarrier(1, &barrier); - g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], (float*)&clear_color, 0, NULL); - g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, NULL); + + // Render Dear ImGui graphics + const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], clear_color_with_alpha, 0, nullptr); + g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, nullptr); g_pd3dCommandList->SetDescriptorHeaps(1, &g_pd3dSrvDescHeap); - ImGui::Render(); ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_pd3dCommandList); barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT; @@ -107,105 +111,138 @@ void EndFrame() { UINT64 fenceValue = g_fenceLastSignaledValue + 1; g_pd3dCommandQueue->Signal(g_fence, fenceValue); g_fenceLastSignaledValue = fenceValue; - frameCtxt->FenceValue = fenceValue; + frameCtx->FenceValue = fenceValue; + + //// Rendering + //FrameContext* frameCtxt = WaitForNextFrameResources(); + //UINT backBufferIdx = g_pSwapChain->GetCurrentBackBufferIndex(); + //frameCtxt->CommandAllocator->Reset(); + + //D3D12_RESOURCE_BARRIER barrier = {}; + //barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + //barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + //barrier.Transition.pResource = g_mainRenderTargetResource[backBufferIdx]; + //barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + //barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; + //barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; + + //g_pd3dCommandList->Reset(frameCtxt->CommandAllocator, NULL); + //g_pd3dCommandList->ResourceBarrier(1, &barrier); + //g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], (float*)&clear_color, 0, NULL); + //g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, NULL); + //g_pd3dCommandList->SetDescriptorHeaps(1, &g_pd3dSrvDescHeap); + //ImGui::Render(); + //ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_pd3dCommandList); + //barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; + //barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT; + //g_pd3dCommandList->ResourceBarrier(1, &barrier); + //g_pd3dCommandList->Close(); + + //g_pd3dCommandQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&g_pd3dCommandList); + + //g_pSwapChain->Present(1, 0); // Present with vsync + ////g_pSwapChain->Present(0, 0); // Present without vsync + + //UINT64 fenceValue = g_fenceLastSignaledValue + 1; + //g_pd3dCommandQueue->Signal(g_fence, fenceValue); + //g_fenceLastSignaledValue = fenceValue; + //frameCtxt->FenceValue = fenceValue; } void DrawMenuBar(_In_ LPTSTR lpCmdLine) { - static bool readHardmode = false; - - ImGui::BeginMainMenuBar(); - - if (ImGui::BeginMenu("File")) { - if (ImGui::MenuItem("Launch G2", "Ctrl+L")) { - STARTUPINFO si; - PROCESS_INFORMATION pi; - LPCWSTR path = L"grandia2.exe"; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - CreateProcess(path, // the path - lpCmdLine, // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) - ); - - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } + if (ImGui::BeginMainMenuBar()) { + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Launch G2", "Ctrl+L")) { + STARTUPINFO si; + PROCESS_INFORMATION pi; + LPCWSTR path = L"grandia2.exe"; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // start the program up + CreateProcess(path, // the path + lpCmdLine, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) + ); + + // Close process and thread handles. + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } - if (readHardmode ) { - if (ImGui::MenuItem("Read Normal Mode")) { - readHardmode = false; - Enemies::getInstance().read(readHardmode); - Bosses::getInstance().read(readHardmode); + if (Difficulty::getInstance().isHardMode()) { + if (ImGui::MenuItem("Read Normal Mode")) { + Difficulty::getInstance().setDifficulty(false); + Enemies::getInstance().read(); + Bosses::getInstance().read(); + } + + } else if (ImGui::MenuItem("Read Hard Mode")) { + Difficulty::getInstance().setDifficulty(true); + Enemies::getInstance().read(); + Bosses::getInstance().read(); } - - } else if (ImGui::MenuItem("Read Hard Mode")) { - readHardmode = true; - Enemies::getInstance().read(readHardmode); - Bosses::getInstance().read(readHardmode); - } - if (ImGui::MenuItem("Save All", "Ctrl+S")) { - Moves::getInstance().write(); - ManaEggs::getInstance().write(); - Skills::getInstance().write(); - SkillBooks::getInstance().write(); - Specials::getInstance().write(); - Items::getInstance().write(); - StartStats::getInstance().write(); - Enemies::getInstance().write(); - Bosses::getInstance().write(); - Mdts::getInstance().write(); - Levelups::getInstance().write(); - } + if (ImGui::MenuItem("Save All", "Ctrl+S")) { + Moves::getInstance().write(); + ManaEggs::getInstance().write(); + Skills::getInstance().write(); + SkillBooks::getInstance().write(); + Specials::getInstance().write(); + Items::getInstance().write(); + StartStats::getInstance().write(); + Enemies::getInstance().write(); + Bosses::getInstance().write(); + Mdts::getInstance().write(); + Levelups::getInstance().write(); + } - if (ImGui::MenuItem("Export All to CSV", "Ctrl+E")) { - if(!std::filesystem::exists("./csv")) { - std::filesystem::create_directory("./csv"); + if (ImGui::MenuItem("Export All to CSV", "Ctrl+E")) { + if(!std::filesystem::exists("./csv")) { + std::filesystem::create_directory("./csv"); + } + + Moves::getInstance().outputToCSV(); + ManaEggs::getInstance().outputToCSV(); + Skills::getInstance().outputToCSV(); + SkillBooks::getInstance().outputToCSV(); + Specials::getInstance().outputToCSV(); + Items::getInstance().outputToCSV(); + StartStats::getInstance().outputToCSV(); + Enemies::getInstance().outputToCSV(); + Bosses::getInstance().outputToCSV(); + Mdts::getInstance().outputToCSV(); + Levelups::getInstance().outputToCSV(); } - Moves::getInstance().outputToCSV(); - ManaEggs::getInstance().outputToCSV(); - Skills::getInstance().outputToCSV(); - SkillBooks::getInstance().outputToCSV(); - Specials::getInstance().outputToCSV(); - Items::getInstance().outputToCSV(); - StartStats::getInstance().outputToCSV(); - Enemies::getInstance().outputToCSV(); - Bosses::getInstance().outputToCSV(); - Mdts::getInstance().outputToCSV(); - Levelups::getInstance().outputToCSV(); - } + if (ImGui::MenuItem("Randomize")) { + ManaEggs::getInstance().randomize(); + SkillBooks::getInstance().randomize(); + StartStats::getInstance().randomize(); + Enemies::getInstance().randomize(); + Bosses::getInstance().randomize(); + Mdts::getInstance().randomize(); + } - if (ImGui::MenuItem("Randomize")) { - ManaEggs::getInstance().randomize(); - SkillBooks::getInstance().randomize(); - StartStats::getInstance().randomize(); - Enemies::getInstance().randomize(); - Bosses::getInstance().randomize(); - Mdts::getInstance().randomize(); - } + if (ImGui::MenuItem("Close", "Ctrl+W")) { + exit(0); + } - if (ImGui::MenuItem("Close", "Ctrl+W")) { - exit(0); + ImGui::EndMenu(); } - ImGui::EndMenu(); + ImGui::EndMainMenuBar(); } - - ImGui::EndMenuBar(); } bool CreateDeviceD3D(HWND hWnd) { diff --git a/src/include/ImGuiInstance.h b/src/ui/ImGuiInstance.h similarity index 100% rename from src/include/ImGuiInstance.h rename to src/ui/ImGuiInstance.h diff --git a/src/include/common/imgui_wrappers.h b/src/ui/imgui_wrappers.h similarity index 91% rename from src/include/common/imgui_wrappers.h rename to src/ui/imgui_wrappers.h index b7cdce6..8faa9dd 100644 --- a/src/include/common/imgui_wrappers.h +++ b/src/ui/imgui_wrappers.h @@ -5,6 +5,10 @@ template ImGuiDataType getDataType(const T* data) { + if constexpr (std::is_floating_point_v) { + return ImGuiDataType_Float; + } + bool is_signed = std::is_signed::value; switch(sizeof(T)) { case 2: { diff --git a/vs/G2DataGUI/G2DataGUI.vcxproj b/vs/G2DataGUI/G2DataGUI.vcxproj index f6e356c..c956412 100644 --- a/vs/G2DataGUI/G2DataGUI.vcxproj +++ b/vs/G2DataGUI/G2DataGUI.vcxproj @@ -159,22 +159,21 @@ - + - - - + + + - - - - - - - - - + + + + + + + + @@ -185,27 +184,53 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -235,6 +260,7 @@ + diff --git a/vs/G2DataGUI/G2DataGUI.vcxproj.filters b/vs/G2DataGUI/G2DataGUI.vcxproj.filters index 864be4a..bfc7a9f 100644 --- a/vs/G2DataGUI/G2DataGUI.vcxproj.filters +++ b/vs/G2DataGUI/G2DataGUI.vcxproj.filters @@ -1,14 +1,6 @@  - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms @@ -25,11 +17,38 @@ {2c39e753-1663-49e3-92f6-fea8e54500b8} + + {41fe1a33-4748-4abb-9011-5aac67af241b} + + + {2076ef95-013a-45ea-bd78-8ade013c43d7} + + + {e3dc59d2-98ed-43ca-8056-1ae6a1a73303} + + + {9c6e280d-77a7-43e3-8270-b0a6ec2c5cbc} + + + {c6332735-490b-43a2-9227-b67e67081a0d} + + + {13eff0e0-d273-42e3-8699-813a066c83b0} + + + {e9f978b5-38b1-469f-8494-687f17315bc5} + + + {dec0ca77-db19-43ed-a287-6f83d976bccf} + + + {c89c1291-4a67-4ec1-aa7b-f25b00747560} + + + {190ca2e2-ade7-4eac-9917-ccd2c99e8ab1} + - - Source Files - imgui @@ -48,51 +67,49 @@ imgui - - Source Files + + common common - - Source Files - - - Source Files + + items - - Source Files + + levelups - - Source Files + + maps - - Source Files + + moves - - Source Files + + moves - - common + + moves - - Source Files + + enemies - - Source Files + + skills - - Source Files + + skills - - Source Files + + stats - - Source Files + + ui - - Source Files + + bosses + @@ -119,68 +136,146 @@ imgui - - Header Files - - - Header Files - - - Header Files - - - Header Files + + common\structs - - Header Files + + common\structs - - Header Files - - - Header Files + + common - - Header Files + + common - - Header Files + + common - + common - + common - + common - + common - - Header Files + + items - - Header Files + + items - - Header Files + + items - - Header Files + + items - - Header Files + + items - - common + + levelups + + + levelups + + + maps + + + maps + + + maps + + + maps + + + maps + + + maps + + + maps + + + maps + + + maps + + + maps + + + moves + + + moves + + + moves + + + moves + + + moves + + + moves + + + enemies + + + enemies + + + enemies + + + enemies + + + enemies + + + skills + + + skills + + + skills + + + skills + + + stats + + + stats + + + ui + + + ui - - Header Files + + bosses - - Header Files + + bosses @@ -265,5 +360,6 @@ docs + \ No newline at end of file From e3737c738e521011d020f91b7c611402dba478db Mon Sep 17 00:00:00 2001 From: krogenth Date: Wed, 12 Apr 2023 20:10:34 -0400 Subject: [PATCH 2/7] various bugfixes, add unknown fields for enemies and bosses --- src/bosses/Bosses.cpp | 27 ++- src/common/JsonDefinitions.h | 2 +- src/enemies/Enemies.cpp | 29 ++- src/enemies/EnemyMoves.h | 2 +- src/enemies/EnemyStats.h | 12 +- src/main.cpp | 2 +- src/maps/EnemyGroup.h | 14 +- src/maps/Icon.h | 6 +- src/maps/Instance.h | 5 +- src/maps/Map.h | 33 +++ src/maps/MapEntry.h | 4 +- src/maps/Maps.cpp | 413 ++++++++++++++++++----------------- src/maps/Maps.h | 44 +--- src/ui/ImGuiInstance.cpp | 6 +- 14 files changed, 321 insertions(+), 278 deletions(-) create mode 100644 src/maps/Map.h diff --git a/src/bosses/Bosses.cpp b/src/bosses/Bosses.cpp index 6a9b556..4a9b8d1 100644 --- a/src/bosses/Bosses.cpp +++ b/src/bosses/Bosses.cpp @@ -184,6 +184,8 @@ void Bosses::draw() { ImGui::InputText("Name", _bosses.at(_bossIndex).name, 19); + drawInput("Unknown #1", &_bosses.at(_bossIndex).stats.unknown1); + drawInput("Unknown #2", &_bosses.at(_bossIndex).stats.unknown2); drawInput("Type1", &_bosses.at(_bossIndex).stats.type1); drawInput("Type2", &_bosses.at(_bossIndex).stats.type2); drawInput("Level", &_bosses.at(_bossIndex).stats.level); @@ -217,8 +219,15 @@ void Bosses::draw() { } drawInput("Knockback Resist Rate", &_bosses.at(_bossIndex).stats.knockbackResist); + drawInput("Status Recovery Time", &_bosses.at(_bossIndex).stats.T_REC); + drawInput("T_DMG", &_bosses.at(_bossIndex).stats.T_DMG); + drawInput("Unknown #3", &_bosses.at(_bossIndex).stats.unknown3); + drawInput("T_HEAL", &_bosses.at(_bossIndex).stats.T_HEAL); drawInput("Size", &_bosses.at(_bossIndex).stats.size); + drawInput("Unknown #4", &_bosses.at(_bossIndex).stats.unknown4); + drawInput("Unknown #5", &_bosses.at(_bossIndex).stats.unknown5); drawInput("No Run", &_bosses.at(_bossIndex).stats.noRunFlag); + drawInput("Unknown #6", &_bosses.at(_bossIndex).stats.unknown6); drawInput("EXP", &_bosses.at(_bossIndex).stats.exp); drawInput("Skill Coins", &_bosses.at(_bossIndex).stats.skillCoins); drawInput("Magic Coins", &_bosses.at(_bossIndex).stats.magicCoins); @@ -256,6 +265,7 @@ void Bosses::draw() { drawInput("Item #1 Chance", &_bosses.at(_bossIndex).stats.item1Chance); drawInput("Item #2 Chance", &_bosses.at(_bossIndex).stats.item2Chance); + drawInput("Unknown #7", &_bosses.at(_bossIndex).stats.unknown7); ImGui::Checkbox("Moves", &_showMoves); ImGui::SameLine(); @@ -305,7 +315,7 @@ void Bosses::draw() { ImGui::InputText("Name", _bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].name, 19); drawInput("MP Cost", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.mp); drawInput("SP Cost", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.sp); - drawInput("Unknown #1", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.unknown); + drawInput("Unknown #1", &_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.unknown1); if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_bosses.at(_bossIndex).moveSets.at(_moveSetIndex).moves[_moveIndex].stats.targetEffect).c_str())) { for (size_t i = 0; i < targetEffectDefs.size(); i++) { @@ -455,14 +465,16 @@ void Bosses::outputToCSV() { return; } - stream << "Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %," - << "Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance\n"; + stream << "Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %," + << "Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7\n"; stream2 << "Enemy,Move,MP,SP,???,Target Effect,STR,POW,AD,Target Type,???,Distance,Accuracy,Range,Cast Time,Recovery,Animation,Knockdown,IP Stun,IP Cancel Stun,Knockback,Element,Element Strength,Status Effect Bitflag," << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special\n"; for (const auto& val : _bosses) { stream << val.name << ',' + << std::to_string(val.stats.unknown1) << ',' + << std::to_string(val.stats.unknown2) << ',' << std::to_string(val.stats.type1) << ',' << std::to_string(val.stats.type2) << ',' << std::to_string(val.stats.level) << ',' @@ -487,9 +499,13 @@ void Bosses::outputToCSV() { << std::to_string(val.stats.knockbackResist) << ',' << std::to_string(val.stats.T_REC) << ',' << std::to_string(val.stats.T_DMG) << ',' + << std::to_string(val.stats.unknown3) << ',' << std::to_string(val.stats.T_HEAL) << ',' << std::to_string(val.stats.size) << ',' + << std::to_string(val.stats.unknown4) << ',' + << std::to_string(val.stats.unknown5) << ',' << std::to_string(val.stats.noRunFlag) << ',' + << std::to_string(val.stats.unknown6) << ',' << std::to_string(val.stats.exp) << ',' << std::to_string(val.stats.skillCoins) << ',' << std::to_string(val.stats.magicCoins) << ',' @@ -497,7 +513,8 @@ void Bosses::outputToCSV() { << Items::getInstance().getItems().at(val.stats.item1).name << ',' << Items::getInstance().getItems().at(val.stats.item2).name << ',' << std::to_string(val.stats.item1Chance) << ',' - << std::to_string(val.stats.item2Chance) << '\n'; + << std::to_string(val.stats.item2Chance) << ',' + << std::to_string(val.stats.unknown7) << '\n'; for (const auto& moveSet : val.moveSets) { for (size_t moveIndex = 0; moveIndex < 5; moveIndex++) { @@ -509,7 +526,7 @@ void Bosses::outputToCSV() { << moveSet.moves[moveIndex].name << ',' << std::to_string(moveSet.moves[moveIndex].stats.mp) << ',' << std::to_string(moveSet.moves[moveIndex].stats.sp) << ',' - << std::to_string(moveSet.moves[moveIndex].stats.unknown) << ',' + << std::to_string(moveSet.moves[moveIndex].stats.unknown1) << ',' << targetEffectDefs.at(moveSet.moves[moveIndex].stats.targetEffect) << ',' << std::to_string(moveSet.moves[moveIndex].stats.strength) << ',' << std::to_string(moveSet.moves[moveIndex].stats.power) << ',' diff --git a/src/common/JsonDefinitions.h b/src/common/JsonDefinitions.h index b2a6e4a..21cd3e3 100644 --- a/src/common/JsonDefinitions.h +++ b/src/common/JsonDefinitions.h @@ -34,7 +34,7 @@ class JsonDefinitions { void readJson() { std::ifstream file("definitions.json"); if (!file.is_open()) { - throw std::exception("Unable to fine definitions.json!"); + throw std::exception("Unable to find definitions.json!"); } auto json = nlohmann::json::parse(file); diff --git a/src/enemies/Enemies.cpp b/src/enemies/Enemies.cpp index fd53e61..db2f3c0 100644 --- a/src/enemies/Enemies.cpp +++ b/src/enemies/Enemies.cpp @@ -178,6 +178,8 @@ void Enemies::draw() { } ImGui::InputText("Name", _enemies.at(_enemyIndex).name, 19); + drawInput("Unknown #1", &_enemies.at(_enemyIndex).stats.unknown1); + drawInput("Unknown #2", &_enemies.at(_enemyIndex).stats.unknown2); drawInput("Type1", &_enemies.at(_enemyIndex).stats.type1); drawInput("Type2", &_enemies.at(_enemyIndex).stats.type2); drawInput("Level", &_enemies.at(_enemyIndex).stats.level); @@ -211,8 +213,15 @@ void Enemies::draw() { } drawInput("Knockback Resist Rate", &_enemies.at(_enemyIndex).stats.knockbackResist); + drawInput("T_REC", &_enemies.at(_enemyIndex).stats.T_REC); + drawInput("T_DMG", &_enemies.at(_enemyIndex).stats.T_DMG); + drawInput("Unknown #3", &_enemies.at(_enemyIndex).stats.unknown3); + drawInput("T_HEAL", &_enemies.at(_enemyIndex).stats.T_HEAL); drawInput("Size", &_enemies.at(_enemyIndex).stats.size); + drawInput("Unknwon #4", &_enemies.at(_enemyIndex).stats.unknown4); + drawInput("Unknown #5", &_enemies.at(_enemyIndex).stats.unknown5); drawInput("No Run", &_enemies.at(_enemyIndex).stats.noRunFlag); + drawInput("Unknown #6", &_enemies.at(_enemyIndex).stats.unknown6); drawInput("EXP", &_enemies.at(_enemyIndex).stats.exp); drawInput("Skill Coins", &_enemies.at(_enemyIndex).stats.skillCoins); drawInput("Magic Coins", &_enemies.at(_enemyIndex).stats.magicCoins); @@ -250,6 +259,7 @@ void Enemies::draw() { drawInput("Item #1 Chance", &_enemies.at(_enemyIndex).stats.item1Chance); drawInput("Item #2 Chance", &_enemies.at(_enemyIndex).stats.item2Chance); + drawInput("Unknown #7", &_enemies.at(_enemyIndex).stats.unknown7); ImGui::Checkbox("Moves", &_showMoves); ImGui::SameLine(); @@ -282,7 +292,7 @@ void Enemies::draw() { ImGui::InputText("Name", _enemies.at(_enemyIndex).moveSet.moves[_moveIndex].name, 19); drawInput("MP Cost", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.mp); drawInput("SP Cost", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.sp); - drawInput("Unknown #1", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.unknown); + drawInput("Unknown #1", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.unknown1); if (ImGui::BeginCombo("Target Effect", targetEffectDefs.at(_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.targetEffect).c_str())) { for (size_t i = 0; i < targetEffectDefs.size(); i++) { @@ -318,7 +328,7 @@ void Enemies::draw() { ImGui::EndCombo(); } - drawInput("Unknown #2", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.normalAttackFlag); + drawInput("Is Normal Attack", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.normalAttackFlag); drawInput("Distance", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.distance); if (ImGui::IsItemHovered()) ImGui::SetTooltip("How far away to use move?"); drawInput("Accuracy", &_enemies.at(_enemyIndex).moveSet.moves[_moveIndex].stats.accuracy); @@ -428,14 +438,16 @@ void Enemies::outputToCSV() { return; } - stream << "Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %," - << "Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance\n"; + stream << "Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %," + << "Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7\n"; output2 << "Enemy,Move,MP,SP,???,Target Effect,STR,POW,AD,Target Type,???,Distance,Accuracy,Range,Cast Time,Recovery,Animation,Knockdown,IP Stun,IP Cancel Stun,Knockback,Element,Element Strength,Status Effect Bitflag," << "Status Effect Chance,ATK Change,DEF Change,ACT Change,MOV Change,Special\n"; for (const auto& val : _enemies) { stream << val.name << ',' + << std::to_string(val.stats.unknown1) << ',' + << std::to_string(val.stats.unknown2) << ',' << std::to_string(val.stats.type1) << ',' << std::to_string(val.stats.type2) << ',' << std::to_string(val.stats.level) << ',' @@ -460,9 +472,13 @@ void Enemies::outputToCSV() { << std::to_string(val.stats.knockbackResist) << ',' << std::to_string(val.stats.T_REC) << ',' << std::to_string(val.stats.T_DMG) << ',' + << std::to_string(val.stats.unknown3) << ',' << std::to_string(val.stats.T_HEAL) << ',' << std::to_string(val.stats.size) << ',' + << std::to_string(val.stats.unknown4) << ',' + << std::to_string(val.stats.unknown5) << ',' << std::to_string(val.stats.noRunFlag) << ',' + << std::to_string(val.stats.unknown6) << ',' << std::to_string(val.stats.exp) << ',' << std::to_string(val.stats.skillCoins) << ',' << std::to_string(val.stats.magicCoins) << ',' @@ -470,7 +486,8 @@ void Enemies::outputToCSV() { << Items::getInstance().getItems().at(val.stats.item1).name << ',' << Items::getInstance().getItems().at(val.stats.item2).name << ',' << std::to_string(val.stats.item1Chance) << ',' - << std::to_string(val.stats.item2Chance) << '\n'; + << std::to_string(val.stats.item2Chance) << ',' + << std::to_string(val.stats.unknown7) << '\n'; for (size_t i = 0; i < 5; i++) { if (std::string(val.moveSet.moves[i].name).find_first_not_of(' ') == std::string::npos) { @@ -481,7 +498,7 @@ void Enemies::outputToCSV() { << val.moveSet.moves[i].name << ',' << std::to_string(val.moveSet.moves[i].stats.mp) << ',' << std::to_string(val.moveSet.moves[i].stats.sp) << ',' - << std::to_string(val.moveSet.moves[i].stats.unknown) << ',' + << std::to_string(val.moveSet.moves[i].stats.unknown1) << ',' << targetEffectDefs.at(val.moveSet.moves[i].stats.targetEffect) << ',' << std::to_string(val.moveSet.moves[i].stats.strength) << ',' << std::to_string(val.moveSet.moves[i].stats.power) << ',' diff --git a/src/enemies/EnemyMoves.h b/src/enemies/EnemyMoves.h index db5b916..339473a 100644 --- a/src/enemies/EnemyMoves.h +++ b/src/enemies/EnemyMoves.h @@ -5,7 +5,7 @@ struct EnemyMoveStats { uint16_t mp = 0; uint16_t sp = 0; - uint8_t unknown = 0; + uint8_t unknown1 = 0; uint8_t targetEffect = 0; uint16_t strength = 0; uint16_t power = 0; diff --git a/src/enemies/EnemyStats.h b/src/enemies/EnemyStats.h index 29378b9..f17399c 100644 --- a/src/enemies/EnemyStats.h +++ b/src/enemies/EnemyStats.h @@ -3,8 +3,8 @@ #pragma pack(1) struct EnemyStats { - uint8_t unknown = 0; uint8_t unknown1 = 0; + uint8_t unknown2 = 0; uint8_t type1 = 0; uint8_t type2 = 0; int16_t level = 0; @@ -29,13 +29,13 @@ struct EnemyStats { int16_t knockbackResist = 0; int16_t T_REC = 0; int16_t T_DMG = 0; - int16_t unknown2 = 0; + int16_t unknown3 = 0; int16_t T_HEAL = 0; int16_t size = 0; - int16_t unknown3 = 0; - int8_t unknown4 = 0; + int16_t unknown4 = 0; + int8_t unknown5 = 0; int8_t noRunFlag = 0; - int16_t unknown5 = 0; + int16_t unknown6 = 0; int32_t exp = 0; int32_t skillCoins = 0; int32_t magicCoins = 0; @@ -44,6 +44,6 @@ struct EnemyStats { uint16_t item2 = 0; int8_t item1Chance = 0; int8_t item2Chance = 0; - uint16_t unknown6 = 0; + uint16_t unknown7 = 0; }; #pragma pack() \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c5b2e12..01172da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,7 +50,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance StartStats::getInstance().draw(); Enemies::getInstance().draw(); Bosses::getInstance().draw(); - Mdts::getInstance().draw(); + Maps::getInstance().draw(); Levelups::getInstance().draw(); EndFrame(); diff --git a/src/maps/EnemyGroup.h b/src/maps/EnemyGroup.h index b443276..87e4ac1 100644 --- a/src/maps/EnemyGroup.h +++ b/src/maps/EnemyGroup.h @@ -3,16 +3,16 @@ #pragma pack(1) struct EnemyFirstUnknown { - uint16_t unknown = 0; uint16_t unknown1 = 0; uint16_t unknown2 = 0; uint16_t unknown3 = 0; uint16_t unknown4 = 0; - float unknown5 = 0.0f; - uint16_t unknown6 = 0; + uint16_t unknown5 = 0; + float unknown6 = 0.0f; uint16_t unknown7 = 0; uint16_t unknown8 = 0; uint16_t unknown9 = 0; + uint16_t unknown10 = 0; }; #pragma pack() @@ -21,16 +21,15 @@ struct EnemyType { uint16_t index = 0; // unsure about this uint16_t numEnemy = 0; uint16_t enemyOffset = 0; - uint16_t unknown = 0; uint16_t unknown1 = 0; uint16_t unknown2 = 0; uint16_t unknown3 = 0; + uint16_t unknown4 = 0; }; #pragma pack() #pragma pack(1) struct EnemySecondUnknown { - uint16_t unknown = 0; uint16_t unknown1 = 0; uint16_t unknown2 = 0; uint16_t unknown3 = 0; @@ -50,14 +49,15 @@ struct EnemySecondUnknown { uint16_t unknown17 = 0; uint16_t unknown18 = 0; uint16_t unknown19 = 0; + uint16_t unknown20 = 0; }; #pragma pack() #pragma pack(1) struct EnemyGroup { uint16_t index = 0; - EnemyFirstUnknown unknown; + EnemyFirstUnknown unknown1; EnemyType enemies[4]; - EnemySecondUnknown unknown1; + EnemySecondUnknown unknown2; }; #pragma pack() \ No newline at end of file diff --git a/src/maps/Icon.h b/src/maps/Icon.h index 5f22fec..302c3f1 100644 --- a/src/maps/Icon.h +++ b/src/maps/Icon.h @@ -6,12 +6,12 @@ #pragma pack(1) struct Icon { uint8_t ID = 0; - uint16_t unknown = 0; - uint8_t unknown1 = 0; + uint16_t unknown1 = 0; + uint8_t unknown2 = 0; float xPos = 0.0f; float yPos = 0.0f; float zPos = 0.0f; - float unknown2 = 0; + float unknown3 = 0; float yAngle = 0; uint16_t item1 = 0; uint16_t item2 = 0; diff --git a/src/maps/Instance.h b/src/maps/Instance.h index f82877e..097c00b 100644 --- a/src/maps/Instance.h +++ b/src/maps/Instance.h @@ -7,8 +7,9 @@ struct Instance { uint16_t ID = 0; uint16_t index = 0; - uint16_t unknown = 0; - uint16_t translation = 0; + uint16_t unknown1 = 0; + uint8_t translation = 0; + uint8_t unknown2 = 0; Vector3 position; Vector3 angle; Vector3 c; diff --git a/src/maps/Map.h b/src/maps/Map.h new file mode 100644 index 0000000..aa95201 --- /dev/null +++ b/src/maps/Map.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include + +#include "./EnemyGroup.h" +#include "./EnemyPosition.h" +#include "./Header.h" +#include "./HTA.h" +#include "./Icon.h" +#include "./Instance.h" +#include "./MapEntry.h" +#include "./MOS.h" +#include "./Shop.h" + +#pragma pack(1) +struct MdtStruct { + Header header; + std::vector mapEntries; + std::vector instances; + std::vector HTA; + std::vector enemyPositions; + std::vector enemyGroups; + std::vector MOS; + std::vector icons; + std::vector shop; + + //std::vector models; + + std::string mapname = ""; + std::string filename = ""; + std::string filenameChr = ""; +}; +#pragma pack() \ No newline at end of file diff --git a/src/maps/MapEntry.h b/src/maps/MapEntry.h index de35399..6a8fd41 100644 --- a/src/maps/MapEntry.h +++ b/src/maps/MapEntry.h @@ -9,7 +9,7 @@ struct MapEntry { Vector3 position; float direction = 0.0f; float unknown1 = 0.0f; - uint32_t unknown2 = 0; - uint32_t unknown3 = 0; + int32_t unknown2 = 0; + int32_t unknown3 = 0; }; #pragma pack() \ No newline at end of file diff --git a/src/maps/Maps.cpp b/src/maps/Maps.cpp index f8d826d..30f16ce 100644 --- a/src/maps/Maps.cpp +++ b/src/maps/Maps.cpp @@ -15,105 +15,105 @@ #include "./imgui.h" #include "../ui/imgui_wrappers.h" -void Mdts::write() { +void Maps::write() { std::fstream output; uint32_t offset = 0; - for (size_t i = 0; i < _mdts.size(); i++) { - output.open(_mdts.at(i).filename, std::ios::binary | std::ios::in | std::ios::out); + for (size_t i = 0; i < _maps.size(); i++) { + output.open(_maps.at(i).filename, std::ios::binary | std::ios::in | std::ios::out); if (!output.is_open()) { - throw new std::exception(_mdts.at(i).filename.c_str()); + throw new std::exception(_maps.at(i).filename.c_str()); } // write in map entries - output.seekg(_mdts.at(i).header.offsetMapEntries, std::ios::beg); - for (auto& val : _mdts.at(i).mapEntries) { + output.seekg(_maps.at(i).header.offsetMapEntries, std::ios::beg); + for (auto& val : _maps.at(i).mapEntries) { writeRaw(output, val); } // write in instances - output.seekg(_mdts.at(i).header.offsetInstances, std::ios::beg); - for (auto& val : _mdts.at(i).instances) { + output.seekg(_maps.at(i).header.offsetInstances, std::ios::beg); + for (auto& val : _maps.at(i).instances) { writeRaw(output, val); } // write in HTA - output.seekg(_mdts.at(i).header.offsetHTA, std::ios::beg); - for (auto& val : _mdts.at(i).HTA) { + output.seekg(_maps.at(i).header.offsetHTA, std::ios::beg); + for (auto& val : _maps.at(i).HTA) { writeRaw(output, val); } // write in enemy positions - output.seekg(_mdts.at(i).header.offsetEnemyPos, std::ios::beg); - for (auto& val : _mdts.at(i).enemyPositions) { + output.seekg(_maps.at(i).header.offsetEnemyPos, std::ios::beg); + for (auto& val : _maps.at(i).enemyPositions) { writeRaw(output, val); } // write in enemy groups - output.seekg(_mdts.at(i).header.offsetEnemyGroups, std::ios::beg); - for (auto& val : _mdts.at(i).enemyGroups) { + output.seekg(_maps.at(i).header.offsetEnemyGroups, std::ios::beg); + for (auto& val : _maps.at(i).enemyGroups) { writeRaw(output, val); } // write in MOS - output.seekg(_mdts.at(i).header.offsetMOS, std::ios::beg); - for (auto& val : _mdts.at(i).MOS) { + output.seekg(_maps.at(i).header.offsetMOS, std::ios::beg); + for (auto& val : _maps.at(i).MOS) { writeRaw(output, val); } // write in icons - output.seekg(_mdts.at(i).header.offsetIcons, std::ios::beg); - for (auto& val : _mdts.at(i).icons) { + output.seekg(_maps.at(i).header.offsetIcons, std::ios::beg); + for (auto& val : _maps.at(i).icons) { writeRaw(output, val); } // write in shop - if (_mdts.at(i).shop.size()) { + if (_maps.at(i).shop.size()) { for (ImU16 j = 0; j < 12; j++) { - if (_mdts.at(i).shop[0].weapons.items[j].item) { - _mdts.at(i).shop[0].weapons.items[j].item += 0x0800; + if (_maps.at(i).shop[0].weapons.items[j].item) { + _maps.at(i).shop[0].weapons.items[j].item += 0x0800; } - if (_mdts.at(i).shop[0].armors.items[j].item) { - _mdts.at(i).shop[0].armors.items[j].item += 0x0800; + if (_maps.at(i).shop[0].armors.items[j].item) { + _maps.at(i).shop[0].armors.items[j].item += 0x0800; } - if (_mdts.at(i).shop[0].jewelry.items[j].item) { - _mdts.at(i).shop[0].jewelry.items[j].item += 0x0800; + if (_maps.at(i).shop[0].jewelry.items[j].item) { + _maps.at(i).shop[0].jewelry.items[j].item += 0x0800; } - if (_mdts.at(i).shop[0].items.items[j].item) { - _mdts.at(i).shop[0].items.items[j].item += 0x0800; + if (_maps.at(i).shop[0].items.items[j].item) { + _maps.at(i).shop[0].items.items[j].item += 0x0800; } - if (_mdts.at(i).shop[0].regionals.items[j].item) { - _mdts.at(i).shop[0].regionals.items[j].item += 0x0800; + if (_maps.at(i).shop[0].regionals.items[j].item) { + _maps.at(i).shop[0].regionals.items[j].item += 0x0800; } } - output.seekg(_mdts[i].header.offsetShop, std::ios::beg); - writeRaw(output, _mdts[i].shop[0]); + output.seekg(_maps[i].header.offsetShop, std::ios::beg); + writeRaw(output, _maps[i].shop[0]); for (ImU16 j = 0; j < 12; j++) { - if (_mdts.at(i).shop[0].weapons.items[j].item) { - _mdts.at(i).shop[0].weapons.items[j].item -= 0x0800; + if (_maps.at(i).shop[0].weapons.items[j].item) { + _maps.at(i).shop[0].weapons.items[j].item -= 0x0800; } - if (_mdts.at(i).shop[0].armors.items[j].item) { - _mdts.at(i).shop[0].armors.items[j].item -= 0x0800; + if (_maps.at(i).shop[0].armors.items[j].item) { + _maps.at(i).shop[0].armors.items[j].item -= 0x0800; } - if (_mdts.at(i).shop[0].jewelry.items[j].item) { - _mdts.at(i).shop[0].jewelry.items[j].item -= 0x0800; + if (_maps.at(i).shop[0].jewelry.items[j].item) { + _maps.at(i).shop[0].jewelry.items[j].item -= 0x0800; } - if (_mdts.at(i).shop[0].items.items[j].item) { - _mdts.at(i).shop[0].items.items[j].item -= 0x0800; + if (_maps.at(i).shop[0].items.items[j].item) { + _maps.at(i).shop[0].items.items[j].item -= 0x0800; } - if (_mdts.at(i).shop[0].regionals.items[j].item) { - _mdts.at(i).shop[0].regionals.items[j].item -= 0x0800; + if (_maps.at(i).shop[0].regionals.items[j].item) { + _maps.at(i).shop[0].regionals.items[j].item -= 0x0800; } } } @@ -122,7 +122,7 @@ void Mdts::write() { } } -void Mdts::read() { +void Maps::read() { uint8_t readChar = 0; std::ifstream input; uint32_t offset = 0; @@ -142,84 +142,84 @@ void Mdts::read() { throw new std::exception(filename.c_str()); } - _mdts.emplace_back(MdtStruct()); - _mdts.back().header = readRaw
(input); + _maps.emplace_back(MdtStruct()); + _maps.back().header = readRaw
(input); // read in map entries - _mdts.back().mapEntries.resize(_mdts.back().header.numMapEntries); - input.seekg(_mdts.back().header.offsetMapEntries, std::ios::beg); - for (size_t i = 0; i < _mdts.back().mapEntries.size(); i++) { - _mdts.back().mapEntries[i] = readRaw(input); + _maps.back().mapEntries.resize(_maps.back().header.numMapEntries); + input.seekg(_maps.back().header.offsetMapEntries, std::ios::beg); + for (size_t i = 0; i < _maps.back().mapEntries.size(); i++) { + _maps.back().mapEntries[i] = readRaw(input); } // read in instances - _mdts.back().instances.resize(_mdts.back().header.numInstances); - input.seekg(_mdts.back().header.offsetInstances, std::ios::beg); - for (size_t i = 0; i < _mdts.back().instances.size(); i++) { - _mdts.back().instances[i] = readRaw(input); + _maps.back().instances.resize(_maps.back().header.numInstances); + input.seekg(_maps.back().header.offsetInstances, std::ios::beg); + for (size_t i = 0; i < _maps.back().instances.size(); i++) { + _maps.back().instances[i] = readRaw(input); } // read in HTA - _mdts.back().HTA.resize(_mdts.back().header.numHTA); - input.seekg(_mdts.back().header.offsetHTA, std::ios::beg); - for (size_t i = 0; i < _mdts.back().HTA.size(); i++) { - _mdts.back().HTA[i] = readRaw(input); + _maps.back().HTA.resize(_maps.back().header.numHTA); + input.seekg(_maps.back().header.offsetHTA, std::ios::beg); + for (size_t i = 0; i < _maps.back().HTA.size(); i++) { + _maps.back().HTA[i] = readRaw(input); } // read in enemy positions - _mdts.back().enemyPositions.resize(_mdts.back().header.numEnemyPos); - input.seekg(_mdts.back().header.offsetEnemyPos, std::ios::beg); - for (size_t i = 0; i < _mdts.back().enemyPositions.size(); i++) { - _mdts.back().enemyPositions[i] = readRaw(input); + _maps.back().enemyPositions.resize(_maps.back().header.numEnemyPos); + input.seekg(_maps.back().header.offsetEnemyPos, std::ios::beg); + for (size_t i = 0; i < _maps.back().enemyPositions.size(); i++) { + _maps.back().enemyPositions[i] = readRaw(input); } // read in enemy groups - _mdts.back().enemyGroups.resize(_mdts.back().header.numEnemyGroups); - input.seekg(_mdts.back().header.offsetEnemyGroups, std::ios::beg); - for (size_t i = 0; i < _mdts.back().enemyGroups.size(); i++) { - _mdts.back().enemyGroups[i] = readRaw(input); + _maps.back().enemyGroups.resize(_maps.back().header.numEnemyGroups); + input.seekg(_maps.back().header.offsetEnemyGroups, std::ios::beg); + for (size_t i = 0; i < _maps.back().enemyGroups.size(); i++) { + _maps.back().enemyGroups[i] = readRaw(input); } // read in MOS - _mdts.back().MOS.resize(_mdts.back().header.numMOS); - input.seekg(_mdts.back().header.offsetMOS, std::ios::beg); - for (size_t i = 0; i < _mdts.back().MOS.size(); i++) - _mdts.back().MOS[i] = readRaw(input); + _maps.back().MOS.resize(_maps.back().header.numMOS); + input.seekg(_maps.back().header.offsetMOS, std::ios::beg); + for (size_t i = 0; i < _maps.back().MOS.size(); i++) + _maps.back().MOS[i] = readRaw(input); // read in icons - _mdts.back().icons.resize(_mdts.back().header.numIcons); - input.seekg(_mdts.back().header.offsetIcons, std::ios::beg); - for (size_t i = 0; i < _mdts.back().icons.size(); i++) { - _mdts.back().icons[i] = readRaw(input); + _maps.back().icons.resize(_maps.back().header.numIcons); + input.seekg(_maps.back().header.offsetIcons, std::ios::beg); + for (size_t i = 0; i < _maps.back().icons.size(); i++) { + _maps.back().icons[i] = readRaw(input); } // read in shop - if (_mdts.back().header.offsetShop) { - _mdts.back().shop.resize(1); - input.seekg(_mdts.back().header.offsetShop, std::ios::beg); + if (_maps.back().header.offsetShop) { + _maps.back().shop.resize(1); + input.seekg(_maps.back().header.offsetShop, std::ios::beg); - _mdts.back().shop[0] = readRaw(input); + _maps.back().shop[0] = readRaw(input); for (ImU16 i = 0; i < 12; i++) { - if (_mdts.back().shop[0].weapons.items[i].item) { - _mdts.back().shop[0].weapons.items[i].item -= 0x0800; + if (_maps.back().shop[0].weapons.items[i].item) { + _maps.back().shop[0].weapons.items[i].item -= 0x0800; } - if (_mdts.back().shop[0].armors.items[i].item) { - _mdts.back().shop[0].armors.items[i].item -= 0x0800; + if (_maps.back().shop[0].armors.items[i].item) { + _maps.back().shop[0].armors.items[i].item -= 0x0800; } - if (_mdts.back().shop[0].jewelry.items[i].item) { - _mdts.back().shop[0].jewelry.items[i].item -= 0x0800; + if (_maps.back().shop[0].jewelry.items[i].item) { + _maps.back().shop[0].jewelry.items[i].item -= 0x0800; } - if (_mdts.back().shop[0].items.items[i].item) { - _mdts.back().shop[0].items.items[i].item -= 0x0800; + if (_maps.back().shop[0].items.items[i].item) { + _maps.back().shop[0].items.items[i].item -= 0x0800; } - if (_mdts.back().shop[0].regionals.items[i].item) { - _mdts.back().shop[0].regionals.items[i].item -= 0x0800; + if (_maps.back().shop[0].regionals.items[i].item) { + _maps.back().shop[0].regionals.items[i].item -= 0x0800; } } } @@ -249,13 +249,13 @@ void Mdts::read() { input.seekg(2, std::ios::cur); readChar = readRaw(input); while (readChar != 0x17) { - _mdts.back().mapname.push_back(readChar); + _maps.back().mapname.push_back(readChar); readChar = readRaw(input); } // anything that contains the string "to " is not the current map name - if (_mdts.back().mapname.find("to ") != std::string::npos) { - _mdts.back().mapname.erase(_mdts.back().mapname.begin(), _mdts.back().mapname.end()); + if (_maps.back().mapname.find("to ") != std::string::npos) { + _maps.back().mapname.erase(_maps.back().mapname.begin(), _maps.back().mapname.end()); input.seekg(sectionOffset, std::ios::beg); continue; } @@ -270,8 +270,8 @@ void Mdts::read() { } - _mdts.back().filename = filename; - _mdts.back().filenameChr = filename.substr(0, filename.length() - 4) + ".chr"; + _maps.back().filename = filename; + _maps.back().filenameChr = filename.substr(0, filename.length() - 4) + ".chr"; input.close(); } @@ -279,18 +279,18 @@ void Mdts::read() { } } -void Mdts::draw() { +void Maps::draw() { ImGui::Begin("AREAS"); if (ImGui::Button("Save")) { write(); } - if (ImGui::BeginCombo("MDT Index", _mdts.at(_mdtIndex).mapname.c_str())) { - for (size_t i = 0; i < _mdts.size(); i++) { + if (ImGui::BeginCombo("MDT Index", _maps.at(_mdtIndex).mapname.c_str())) { + for (size_t i = 0; i < _maps.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _mdtIndex); - if (ImGui::Selectable(_mdts.at(i).mapname.c_str(), is_selected)) { + if (ImGui::Selectable(_maps.at(i).mapname.c_str(), is_selected)) { _mdtIndex = i; _mapEntryIndex = 0; _instanceIndex = 0; @@ -311,13 +311,13 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (_mdts.at(_mdtIndex).mapEntries.size()) { + if (_maps.at(_mdtIndex).mapEntries.size()) { if (ImGui::CollapsingHeader("Map Entries")) { - if (ImGui::BeginCombo("Map Entry #", std::to_string(_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).mapEntries.size(); i++) { + if (ImGui::BeginCombo("Map Entry #", std::to_string(_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID).c_str())) { + for (size_t i = 0; i < _maps.at(_mdtIndex).mapEntries.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _mapEntryIndex); - if (ImGui::Selectable(std::to_string(_mdts.at(_mdtIndex).mapEntries[i].ID).c_str(), is_selected)) { + if (ImGui::Selectable(std::to_string(_maps.at(_mdtIndex).mapEntries[i].ID).c_str(), is_selected)) { _mapEntryIndex = i; } if (is_selected) { @@ -329,22 +329,22 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Connected Map", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID); - drawInputN("X/Y/Z Position", (float*) & _mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).position, 3); - drawInput("Direction", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).direction); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown1); - drawInput("Unknown #2", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown2); - drawInput("Unknown #3", &_mdts.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown3); + drawInput("Connected Map", &_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).ID); + drawInputN("X/Y/Z Position", (float*) & _maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).position, 3); + drawInput("Direction", &_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).direction); + drawInput("Unknown #1", &_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown1); + drawInput("Unknown #2", &_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown2); + drawInput("Unknown #3", &_maps.at(_mdtIndex).mapEntries.at(_mapEntryIndex).unknown3); } } - if (_mdts.at(_mdtIndex).instances.size()) { + if (_maps.at(_mdtIndex).instances.size()) { if (ImGui::CollapsingHeader("Instances")) { - if (ImGui::BeginCombo("Instance #", std::to_string(_mdts.at(_mdtIndex).instances.at(_instanceIndex).ID).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).mapEntries.size(); i++) { + if (ImGui::BeginCombo("Instance #", std::format("Instance {}", _instanceIndex + 1).c_str())) { + for (size_t i = 0; i < _maps.at(_mdtIndex).instances.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _instanceIndex); - if (ImGui::Selectable(std::to_string(_mdts.at(_mdtIndex).instances[i].ID).c_str(), is_selected)) { + if (ImGui::Selectable(std::format("Instance {}", i + 1).c_str(), is_selected)) { _instanceIndex = i; } if (is_selected) { @@ -356,20 +356,21 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("ID", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).ID); - drawInput("Index", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).index); - drawInput("Unknown", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).unknown); - drawInput("Translation", &_mdts.at(_mdtIndex).instances.at(_instanceIndex).translation); - drawInputN("X/Y/Z Position", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).position, 3); - drawInputN("X/Y/Z Angle", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).angle, 3); - drawInputN("CX/CY/CZ", (float*)&_mdts.at(_mdtIndex).instances.at(_instanceIndex).c, 3); + drawInput("ID", &_maps.at(_mdtIndex).instances.at(_instanceIndex).ID); + drawInput("Index", &_maps.at(_mdtIndex).instances.at(_instanceIndex).index); + drawInput("Unknown #1", &_maps.at(_mdtIndex).instances.at(_instanceIndex).unknown1); + drawInput("Translation", &_maps.at(_mdtIndex).instances.at(_instanceIndex).translation); + drawInput("Unknown #2", &_maps.at(_mdtIndex).instances.at(_instanceIndex).unknown2); + drawInputN("X/Y/Z Position", (float*)&_maps.at(_mdtIndex).instances.at(_instanceIndex).position, 3); + drawInputN("X/Y/Z Angle", (float*)&_maps.at(_mdtIndex).instances.at(_instanceIndex).angle, 3); + drawInputN("CX/CY/CZ", (float*)&_maps.at(_mdtIndex).instances.at(_instanceIndex).c, 3); } } - if (_mdts.at(_mdtIndex).HTA.size()) { + if (_maps.at(_mdtIndex).HTA.size()) { if (ImGui::CollapsingHeader("HTA")) { if (ImGui::BeginCombo("HTA #", std::format("HTA {}", _htaIndex + 1).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).HTA.size(); i++) { + for (size_t i = 0; i < _maps.at(_mdtIndex).HTA.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _htaIndex); if (ImGui::Selectable(std::format("HTA {}", i + 1).c_str(), is_selected)) { @@ -384,29 +385,29 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Shape", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).shape); - drawInput("Type", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).type); - drawInput("Trigger", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).trigger); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown1); - drawInput("Unknown #2", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown2); - drawInput("attribute", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).attribute); - drawInputN("X/Y/Z Min", (float*)&_mdts.at(_mdtIndex).HTA.at(_htaIndex).minimum, 3); - drawInputN("X/Y/Z Max", (float*)&_mdts.at(_mdtIndex).HTA.at(_htaIndex).maximum, 3); - drawInput("Unknown #3", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown3); - drawInput("Unknown #4", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown4); - drawInput("Unknown #5", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown5); - drawInput("Unknown #6", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown6); - drawInput("Unknown #7", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown7); - drawInput("Unknown #8", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown8); - drawInput("Unknown #9", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown9); - drawInput("Unknown #10", &_mdts.at(_mdtIndex).HTA.at(_htaIndex).unknown10); + drawInput("Shape", &_maps.at(_mdtIndex).HTA.at(_htaIndex).shape); + drawInput("Type", &_maps.at(_mdtIndex).HTA.at(_htaIndex).type); + drawInput("Trigger", &_maps.at(_mdtIndex).HTA.at(_htaIndex).trigger); + drawInput("Unknown #1", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown1); + drawInput("Unknown #2", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown2); + drawInput("attribute", &_maps.at(_mdtIndex).HTA.at(_htaIndex).attribute); + drawInputN("X/Y/Z Min", (float*)&_maps.at(_mdtIndex).HTA.at(_htaIndex).minimum, 3); + drawInputN("X/Y/Z Max", (float*)&_maps.at(_mdtIndex).HTA.at(_htaIndex).maximum, 3); + drawInput("Unknown #3", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown3); + drawInput("Unknown #4", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown4); + drawInput("Unknown #5", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown5); + drawInput("Unknown #6", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown6); + drawInput("Unknown #7", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown7); + drawInput("Unknown #8", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown8); + drawInput("Unknown #9", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown9); + drawInput("Unknown #10", &_maps.at(_mdtIndex).HTA.at(_htaIndex).unknown10); } } - if (_mdts.at(_mdtIndex).enemyPositions.size()) { + if (_maps.at(_mdtIndex).enemyPositions.size()) { if (ImGui::CollapsingHeader("Enemy Positions")) { if (ImGui::BeginCombo("Enemy Pos #", std::format("Enemy Position {}", _ePosIndex + 1).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).enemyPositions.size(); i++) { + for (size_t i = 0; i < _maps.at(_mdtIndex).enemyPositions.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _ePosIndex); if (ImGui::Selectable(std::format("Enemy Position {}", i + 1).c_str(), is_selected)) { @@ -421,30 +422,30 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Index", &_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).index); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown1); - drawInputN("X/Z Min", (float*)& _mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).minimum, 2); - drawInputN("X/Z Max", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).maximum, 2); - drawInputN("X/Y/Z Pos", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).position, 3); - drawInputN("X/Y/Z #1", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown2, 3); + drawInput("Index", &_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).index); + drawInput("Unknown #1", &_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown1); + drawInputN("X/Z Min", (float*)& _maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).minimum, 2); + drawInputN("X/Z Max", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).maximum, 2); + drawInputN("X/Y/Z Pos", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).position, 3); + drawInputN("X/Y/Z #1", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown2, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #2", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown3, 3); + drawInputN("X/Y/Z #2", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown3, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #3", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown4, 3); + drawInputN("X/Y/Z #3", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown4, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #4", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown5, 3); + drawInputN("X/Y/Z #4", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown5, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #5", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown6, 3); + drawInputN("X/Y/Z #5", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown6, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); - drawInputN("X/Y/Z #6", (float*)&_mdts.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown7, 3); + drawInputN("X/Y/Z #6", (float*)&_maps.at(_mdtIndex).enemyPositions.at(_ePosIndex).unknown7, 3); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unknown"); } } - if (_mdts.at(_mdtIndex).enemyGroups.size()) { + if (_maps.at(_mdtIndex).enemyGroups.size()) { if (ImGui::CollapsingHeader("Enemy Groups")) { if (ImGui::BeginCombo("Enemy Group #", std::format("Enemy Group {}", _eGroupIndex + 1).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).enemyGroups.size(); i++) { + for (size_t i = 0; i < _maps.at(_mdtIndex).enemyGroups.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _eGroupIndex); if (ImGui::Selectable(std::format("Enemy Group {}", i + 1).c_str(), is_selected)) { @@ -459,7 +460,7 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Group Index", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).index); + drawInput("Group Index", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).index); if (ImGui::BeginCombo("Enemy #", std::format("Enemy {}", _eGroupPosIndex + 1).c_str())) { // there can only ever be 4 unique enemies in a group, as far as I can tell @@ -478,21 +479,21 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Enemy Index", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].index); - drawInput("# of Enemy", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].numEnemy); - drawInput("Enemy Offset", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].enemyOffset); + drawInput("Enemy Index", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].index); + drawInput("# of Enemy", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].numEnemy); + drawInput("Enemy Offset", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].enemyOffset); if (ImGui::IsItemHovered()) ImGui::SetTooltip("References enemy/boss.csv"); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown); - drawInput("Unknown #2", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown1); - drawInput("Unknown #3", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown2); - drawInput("Unknown #4", &_mdts.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown3); + drawInput("Unknown #1", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown1); + drawInput("Unknown #2", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown2); + drawInput("Unknown #3", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown3); + drawInput("Unknown #4", &_maps.at(_mdtIndex).enemyGroups.at(_eGroupIndex).enemies[_eGroupPosIndex].unknown4); } } - if (_mdts.at(_mdtIndex).MOS.size()) { + if (_maps.at(_mdtIndex).MOS.size()) { if (ImGui::CollapsingHeader("MOS")) { if (ImGui::BeginCombo("MOS #", std::format("MOS {}", _mosIndex + 1).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).MOS.size(); i++) { + for (size_t i = 0; i < _maps.at(_mdtIndex).MOS.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _mosIndex); if (ImGui::Selectable(std::format("MOS {}", i + 1).c_str(), is_selected)) { @@ -507,22 +508,22 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("ID", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).ID); - drawInput("Index", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).index); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown1); - drawInputN("X/Y/Z Pos", (float*)&_mdts.at(_mdtIndex).MOS.at(_mosIndex).position, 3); - drawInput("Unknown #2", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown2); - drawInput("Unknown #3", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown3); - drawInput("Unknown #4", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown4); - drawInput("Unknown #5", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown5); - drawInput("Unknown #6", &_mdts.at(_mdtIndex).MOS.at(_mosIndex).unknown6); + drawInput("ID", &_maps.at(_mdtIndex).MOS.at(_mosIndex).ID); + drawInput("Index", &_maps.at(_mdtIndex).MOS.at(_mosIndex).index); + drawInput("Unknown #1", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown1); + drawInputN("X/Y/Z Pos", (float*)&_maps.at(_mdtIndex).MOS.at(_mosIndex).position, 3); + drawInput("Unknown #2", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown2); + drawInput("Unknown #3", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown3); + drawInput("Unknown #4", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown4); + drawInput("Unknown #5", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown5); + drawInput("Unknown #6", &_maps.at(_mdtIndex).MOS.at(_mosIndex).unknown6); } } - if (_mdts.at(_mdtIndex).icons.size()) { + if (_maps.at(_mdtIndex).icons.size()) { if (ImGui::CollapsingHeader("Icons")) { if (ImGui::BeginCombo("Icon #", std::format("Icon {}", _iconIndex + 1).c_str())) { - for (size_t i = 0; i < _mdts.at(_mdtIndex).icons.size(); i++) { + for (size_t i = 0; i < _maps.at(_mdtIndex).icons.size(); i++) { ImGui::PushID((int)i); bool is_selected = (i == _iconIndex); if (ImGui::Selectable(std::format("Icon {}", i + 1).c_str(), is_selected)) { @@ -537,20 +538,20 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("ID", &_mdts.at(_mdtIndex).icons.at(_iconIndex).ID); - drawInput("Unknown #1", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown); - drawInput("Unknown #2", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown1); - drawInputN("X/Y/Z Pos", &_mdts.at(_mdtIndex).icons.at(_iconIndex).xPos, 3); - drawInput("Unknown #3", &_mdts.at(_mdtIndex).icons.at(_iconIndex).unknown2); - drawInput("Y Angle", &_mdts.at(_mdtIndex).icons.at(_iconIndex).yAngle); + drawInput("ID", &_maps.at(_mdtIndex).icons.at(_iconIndex).ID); + drawInput("Unknown #1", &_maps.at(_mdtIndex).icons.at(_iconIndex).unknown1); + drawInput("Unknown #2", &_maps.at(_mdtIndex).icons.at(_iconIndex).unknown2); + drawInputN("X/Y/Z Pos", &_maps.at(_mdtIndex).icons.at(_iconIndex).xPos, 3); + drawInput("Unknown #3", &_maps.at(_mdtIndex).icons.at(_iconIndex).unknown3); + drawInput("Y Angle", &_maps.at(_mdtIndex).icons.at(_iconIndex).yAngle); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Unsure"); - if (ImGui::BeginCombo("Item #1", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item1).name)) { + if (ImGui::BeginCombo("Item #1", Items::getInstance().getItems().at(_maps.at(_mdtIndex).icons.at(_iconIndex).item1).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item1); + bool is_selected = (i == _maps.at(_mdtIndex).icons.at(_iconIndex).item1); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).icons.at(_iconIndex).item1 = (uint16_t)i; + _maps.at(_mdtIndex).icons.at(_iconIndex).item1 = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -561,12 +562,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Item #2", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item2).name)) { + if (ImGui::BeginCombo("Item #2", Items::getInstance().getItems().at(_maps.at(_mdtIndex).icons.at(_iconIndex).item2).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item2); + bool is_selected = (i == _maps.at(_mdtIndex).icons.at(_iconIndex).item2); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) - _mdts.at(_mdtIndex).icons.at(_iconIndex).item2 = (uint16_t)i; + _maps.at(_mdtIndex).icons.at(_iconIndex).item2 = (uint16_t)i; if (is_selected) { ImGui::SetItemDefaultFocus(); } @@ -576,14 +577,14 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Item #3", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).icons.at(_iconIndex).item3).name)) { + if (ImGui::BeginCombo("Item #3", Items::getInstance().getItems().at(_maps.at(_mdtIndex).icons.at(_iconIndex).item3).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).icons.at(_iconIndex).item3); + bool is_selected = (i == _maps.at(_mdtIndex).icons.at(_iconIndex).item3); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).icons.at(_iconIndex).item3 = (uint16_t)i; + _maps.at(_mdtIndex).icons.at(_iconIndex).item3 = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -594,11 +595,11 @@ void Mdts::draw() { ImGui::EndCombo(); } - drawInput("Flag", &_mdts.at(_mdtIndex).icons.at(_iconIndex).flag); + drawInput("Flag", &_maps.at(_mdtIndex).icons.at(_iconIndex).flag); } } - if (_mdts.at(_mdtIndex).shop.size()) { + if (_maps.at(_mdtIndex).shop.size()) { if (ImGui::CollapsingHeader("Shops")) { if (ImGui::BeginCombo("Weapons #", std::format("Weapons {}", _shopWeaponIndex + 1).c_str())) { for (size_t i = 0; i < 12; i++) { @@ -616,12 +617,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Weapon Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item).name)) { + if (ImGui::BeginCombo("Weapon Item", Items::getInstance().getItems().at(_maps.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item); + bool is_selected = (i == _maps.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item = (uint16_t)i; + _maps.at(_mdtIndex).shop[0].weapons.items[_shopWeaponIndex].item = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -648,12 +649,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Armor Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item).name)) { + if (ImGui::BeginCombo("Armor Item", Items::getInstance().getItems().at(_maps.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item); + bool is_selected = (i == _maps.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item = (uint16_t)i; + _maps.at(_mdtIndex).shop[0].armors.items[_shopArmorIndex].item = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -680,12 +681,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Jewelry Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item).name)) { + if (ImGui::BeginCombo("Jewelry Item", Items::getInstance().getItems().at(_maps.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item); + bool is_selected = (i == _maps.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item = (uint16_t)i; + _maps.at(_mdtIndex).shop[0].jewelry.items[_shopJewelIndex].item = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -712,12 +713,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Item Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item).name)) { + if (ImGui::BeginCombo("Item Item", Items::getInstance().getItems().at(_maps.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item); + bool is_selected = (i == _maps.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item = (uint16_t)i; + _maps.at(_mdtIndex).shop[0].items.items[_shopItemIndex].item = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -744,12 +745,12 @@ void Mdts::draw() { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Regional Item", Items::getInstance().getItems().at(_mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item).name)) { + if (ImGui::BeginCombo("Regional Item", Items::getInstance().getItems().at(_maps.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item).name)) { for (size_t i = 0; i < Items::getInstance().getItems().size(); i++) { ImGui::PushID((int)i); - bool is_selected = (i == _mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item); + bool is_selected = (i == _maps.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item); if (ImGui::Selectable(Items::getInstance().getItems().at(i).name, is_selected)) { - _mdts.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item = (uint16_t)i; + _maps.at(_mdtIndex).shop[0].regionals.items[_shopRegionalIndex].item = (uint16_t)i; } if (is_selected) { ImGui::SetItemDefaultFocus(); @@ -768,23 +769,23 @@ void Mdts::draw() { ImGui::End(); } -void Mdts::outputToCSV() { +void Maps::outputToCSV() { std::ofstream output; output.open("./csv/MAP_NAMES.CSV"); output << "File,Map\n"; - for (const auto& val : _mdts) { + for (const auto& val : _maps) { output << val.filename << ",\"" << val.mapname << "\"\n"; } output.close(); } -void Mdts::randomize() { +void Maps::randomize() { std::random_device rd; std::mt19937 g(rd()); - for (auto& mdt : _mdts) { + for (auto& mdt : _maps) { for (auto& icon : mdt.icons) { if (icon.item1) { do { diff --git a/src/maps/Maps.h b/src/maps/Maps.h index bb0a36e..420e62c 100644 --- a/src/maps/Maps.h +++ b/src/maps/Maps.h @@ -2,43 +2,17 @@ #include #include "../common/BaseDataInterface.h" -#include "./EnemyGroup.h" -#include "./EnemyPosition.h" -#include "./Header.h" -#include "./HTA.h" -#include "./Icon.h" -#include "./Instance.h" -#include "./MapEntry.h" -#include "./MOS.h" -#include "./Shop.h" +#include "./Map.h" #include "../common/version_check.h" -struct MdtStruct { - Header header; - std::vector mapEntries; - std::vector instances; - std::vector HTA; - std::vector enemyPositions; - std::vector enemyGroups; - std::vector MOS; - std::vector icons; - std::vector shop; - - //std::vector models; - - std::string mapname = ""; - std::string filename = ""; - std::string filenameChr = ""; -}; - -class Mdts : public BaseDataInterface { +class Maps : public BaseDataInterface { public: - Mdts(const Mdts&) = delete; - Mdts(const Mdts&&) = delete; + Maps(const Maps&) = delete; + Maps(const Maps&&) = delete; - static Mdts& getInstance() { - static Mdts instance; + static Maps& getInstance() { + static Maps instance; return instance; }; @@ -48,15 +22,15 @@ class Mdts : public BaseDataInterface { void outputToCSV(); void randomize(); - const std::vector& getMdts() { return _mdts; }; + const std::vector& getMaps() { return _maps; }; private: - Mdts() { + Maps() { _directory = (Version::getInstance().isHDVersion() ? "./content/data/afs/map/" : "./data/afs/map/"); read(); }; - std::vector _mdts; + std::vector _maps; size_t _mdtIndex = 0; size_t _mapEntryIndex = 0; size_t _instanceIndex = 0; diff --git a/src/ui/ImGuiInstance.cpp b/src/ui/ImGuiInstance.cpp index d7e4215..e6e3577 100644 --- a/src/ui/ImGuiInstance.cpp +++ b/src/ui/ImGuiInstance.cpp @@ -203,7 +203,7 @@ void DrawMenuBar(_In_ LPTSTR lpCmdLine) { StartStats::getInstance().write(); Enemies::getInstance().write(); Bosses::getInstance().write(); - Mdts::getInstance().write(); + Maps::getInstance().write(); Levelups::getInstance().write(); } @@ -221,7 +221,7 @@ void DrawMenuBar(_In_ LPTSTR lpCmdLine) { StartStats::getInstance().outputToCSV(); Enemies::getInstance().outputToCSV(); Bosses::getInstance().outputToCSV(); - Mdts::getInstance().outputToCSV(); + Maps::getInstance().outputToCSV(); Levelups::getInstance().outputToCSV(); } @@ -231,7 +231,7 @@ void DrawMenuBar(_In_ LPTSTR lpCmdLine) { StartStats::getInstance().randomize(); Enemies::getInstance().randomize(); Bosses::getInstance().randomize(); - Mdts::getInstance().randomize(); + Maps::getInstance().randomize(); } if (ImGui::MenuItem("Close", "Ctrl+W")) { From 4f3af283f85f44d1630b76363be0436c1d2de065 Mon Sep 17 00:00:00 2001 From: krogenth Date: Wed, 12 Apr 2023 20:15:50 -0400 Subject: [PATCH 3/7] update enemy csv files --- docs/BOSS.CSV | 84 ++++++++++++------------ docs/BOSS_HARDMODE.CSV | 84 ++++++++++++------------ docs/ENEMIES.CSV | 132 +++++++++++++++++++------------------- docs/ENEMIES_HARDMODE.CSV | 130 ++++++++++++++++++------------------- 4 files changed, 215 insertions(+), 215 deletions(-) diff --git a/docs/BOSS.CSV b/docs/BOSS.CSV index 5af5429..6647a01 100644 --- a/docs/BOSS.CSV +++ b/docs/BOSS.CSV @@ -1,42 +1,42 @@ -Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance - Right Hand,22,8,25,4000,0,480,162,98,40,80,288,10,50,0,0,-3,0,3,0,0,139,35,480,240,500,100,1,0,0,0,0, , Ancient Cuirass,0,100 - Right Hand,22,8,52,18000,0,600,352,93,40,369,288,10,20,0,0,0,0,0,0,0,137,35,480,240,500,100,1,0,0,0,0, , Golden Potion,0,100 - Left Hand,23,8,25,4000,0,480,153,118,40,90,288,10,50,0,0,4,0,0,0,-5,138,35,480,240,500,100,1,0,0,0,0, , Revival Gem,0,100 - Left Hand,23,8,52,18000,0,600,352,93,40,369,288,10,20,0,0,0,0,0,0,0,136,35,480,240,500,100,1,0,0,0,0, , Potion of Azure,0,100 - Head,24,8,25,5000,880,360,107,83,40,165,288,10,50,0,0,0,0,0,0,0,172,35,360,300,500,100,1,0,0,0,800, , ,0,0 - Head,24,8,52,9000,580,330,684,146,40,578,288,10,20,0,0,0,0,0,0,0,42,35,360,300,500,100,1,0,0,0,0, , Indigo Potion,0,100 - Valmar's Tongue,21,8,25,8000,360,880,131,129,40,153,288,10,50,0,0,-5,0,0,0,3,222,35,240,420,500,200,1,500,1200,800,0, , Book of Wizards,0,100 - Valmar's Tongue,21,8,52,27000,240,520,261,125,40,137,288,10,20,0,0,0,0,0,0,0,222,35,240,420,500,200,1,3000,4000,1000,0, , Starlight Tiara,0,100 - Right Tendril,27,8,30,6000,0,600,157,128,40,103,288,10,50,0,0,0,0,0,0,0,140,30,480,240,500,90,1,0,0,0,0, , Warp Knife,0,100 - Right Tendril,27,8,53,20000,0,720,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,500,90,1,0,0,0,0, , Indigo Potion,0,100 - Left Tendril,28,8,30,6000,0,600,157,94,40,103,288,10,50,0,0,0,0,0,0,0,138,30,480,240,500,90,1,0,0,0,0, , Gravity Egg,0,100 - Left Tendril,28,8,53,20000,0,720,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,500,90,1,0,0,0,0, , Potion of Azure,0,100 - Eyeball Bat,29,8,30,3000,0,370,149,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,500,70,1,0,0,0,300, , ,0,0 - Eyeball Bat,29,8,53,20000,0,560,224,274,100,235,192,10,20,0,0,0,0,0,0,0,16,5,360,360,500,70,1,0,0,0,0, , Scarlet Potion,0,100 - Valmar's Eye,26,8,30,12000,660,720,176,145,40,132,288,10,50,0,0,0,0,8,0,0,254,30,300,360,500,200,1,800,1800,1800,0, , Demon's Tears,0,100 - Valmar's Eye,26,8,53,20000,620,640,281,108,40,186,288,10,20,0,0,0,0,0,0,0,254,30,300,480,500,200,1,3000,4000,1000,0, , Queen Heels,0,100 - Right Arm,32,8,35,8000,440,540,352,126,50,95,288,10,30,0,0,0,0,-3,0,7,154,40,480,240,500,90,1,0,0,0,0, , Mana Insignia,0,100 - Left Arm,33,8,35,9000,560,450,234,143,50,237,288,10,30,0,0,0,0,-7,5,0,188,40,480,240,500,90,1,0,0,0,2100, , ,0,0 - Valmar's Claw,31,8,35,14000,490,840,273,161,50,158,288,10,30,0,0,0,0,-5,0,0,254,40,240,480,500,170,1,1000,2400,1200,0, , Book of Gales,0,100 - Sword,37,8,40,11000,0,0,523,75,450,100,96,10,30,0,0,-3,-3,-3,-3,-3,223,25,360,540,500,70,1,0,0,0,0, , Maken Valborg,0,100 - Sword,37,8,40,11000,0,0,999,150,150,999,192,10,30,100,0,0,7,0,0,0,255,4121,360,540,500,70,1,0,0,0,0, , ,0,0 - Regenerator,38,8,40,13000,600,0,174,138,450,461,96,10,30,0,0,0,0,0,0,0,184,25,240,540,500,60,1,0,0,0,0, , Book of Swords,0,100 - Regenerator,38,8,40,13000,600,0,999,174,150,999,192,10,30,100,0,0,0,3,-3,0,255,4121,240,540,500,60,1,0,0,0,0, , ,0,0 - Melfice,36,8,40,19000,840,950,289,187,450,172,96,10,30,100,0,0,0,0,0,0,254,25,120,480,500,80,1,1500,3600,1800,0, , Soul of Asura,0,100 - Melfice,36,8,40,19000,840,950,999,316,150,999,192,10,30,100,0,5,-5,0,0,0,255,4121,120,480,500,80,1,0,0,0,0, , ,0,0 - Right Tentacle,42,8,44,14000,0,0,315,172,0,183,192,15,30,0,0,6,0,-7,0,0,152,0,360,240,500,300,1,0,0,0,0, , Angel Circle,0,100 - Left Tentacle,43,8,44,14000,0,0,315,172,0,183,192,15,30,0,0,0,0,-4,0,8,152,0,360,240,500,300,1,0,0,0,4000, , ,0,0 - Valmar's Body,41,8,44,24000,840,720,315,172,0,183,192,10,50,0,0,-2,0,0,3,0,254,0,300,300,500,300,1,1600,6000,6000,0, , Relief Tag,0,100 - Left Eye,48,8,45,13000,580,0,324,129,100,175,192,10,30,0,0,0,0,6,0,-5,168,30,240,300,500,90,1,0,0,0,0, , Goddess Hi-Heels,0,100 - Left Eye,48,8,54,16000,560,0,273,124,100,176,192,10,20,0,0,10,10,10,10,10,44,30,120,360,500,90,1,0,0,0,0, , Mystic Potion,0,100 - Right Eye,47,8,45,13000,580,0,293,231,100,148,192,10,30,0,0,-5,0,7,0,0,168,30,240,300,500,90,1,0,0,0,4500, , ,0,0 - Right Eye,47,8,54,16000,560,0,338,101,100,102,192,10,20,0,0,10,10,10,10,10,44,30,120,360,500,90,1,0,0,0,0, , Potion of Azure,0,100 - Valmar's Heart,46,8,45,21000,0,840,337,198,100,192,192,10,50,0,0,0,-5,5,0,0,254,30,240,360,500,220,1,1800,8000,8000,0, , Holy Clothes,0,100 - Valmar's Heart,46,8,54,25000,560,920,308,119,100,215,192,10,20,0,0,10,10,10,10,10,255,30,120,360,500,220,1,3000,4000,1000,0, , Tenma's Dress,0,100 - Bit,52,8,48,4800,0,280,251,112,100,154,192,15,50,15,0,0,0,5,0,0,16,10,480,120,500,60,1,0,0,0,900, , ,0,0 - Egg Guardian,51,8,48,28000,620,720,306,184,0,203,0,10,30,0,0,3,6,-10,0,0,246,0,180,420,500,120,1,2000,10000,10000,0, , Angel's Robe,0,100 - Middle Head,57,8,55,42000,0,880,382,65,30,254,288,0,15,0,0,0,0,0,0,0,251,50,150,360,500,60,1,0,0,0,0, , ,0,0 - Right Head,59,8,55,28000,480,420,341,123,30,271,288,0,15,0,0,0,0,0,0,0,255,50,150,360,600,60,1,0,0,0,0, , ,0,0 - Left Head,58,8,55,35000,480,420,326,162,30,249,288,0,15,0,0,0,0,0,0,0,249,50,150,360,500,60,1,0,0,0,0, , ,0,0 - Valmar Core,56,8,55,48000,0,960,365,218,30,267,288,0,15,0,0,0,0,0,0,0,255,50,120,480,500,160,1,0,0,0,0, , ,0,0 - Zera Valmar,61,8,56,36000,1500,0,237,168,40,156,288,5,20,0,0,0,0,0,0,0,255,30,150,420,500,90,1,0,0,0,0, , ,0,0 +Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7 + Right Hand,0,4,22,8,25,4000,0,480,162,98,40,80,288,10,50,0,0,-3,0,3,0,0,139,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Ancient Cuirass,0,100,0 + Right Hand,0,4,22,8,52,18000,0,600,352,93,40,369,288,10,20,0,0,0,0,0,0,0,137,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Golden Potion,0,100,0 + Left Hand,0,4,23,8,25,4000,0,480,153,118,40,90,288,10,50,0,0,4,0,0,0,-5,138,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Revival Gem,0,100,0 + Left Hand,0,4,23,8,52,18000,0,600,352,93,40,369,288,10,20,0,0,0,0,0,0,0,136,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Head,0,4,24,8,25,5000,880,360,107,83,40,165,288,10,50,0,0,0,0,0,0,0,172,35,360,300,0,500,100,200,0,1,0,0,0,0,800, , ,0,0,0 + Head,0,4,24,8,52,9000,580,330,684,146,40,578,288,10,20,0,0,0,0,0,0,0,42,35,360,300,0,500,100,200,85,1,0,0,0,0,0, , Indigo Potion,0,100,0 + Valmar's Tongue,1,3,21,8,25,8000,360,880,131,129,40,153,288,10,50,0,0,-5,0,0,0,3,222,35,240,420,0,500,200,200,0,1,0,500,1200,800,0, , Book of Wizards,0,100,0 + Valmar's Tongue,1,3,21,8,52,27000,240,520,261,125,40,137,288,10,20,0,0,0,0,0,0,0,222,35,240,420,0,500,200,200,0,1,0,3000,4000,1000,0, , Starlight Tiara,0,100,0 + Right Tendril,0,4,27,8,30,6000,0,600,157,128,40,103,288,10,50,0,0,0,0,0,0,0,140,30,480,240,0,500,90,200,0,1,0,0,0,0,0, , Warp Knife,0,100,0 + Right Tendril,0,4,27,8,53,20000,0,720,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,0,500,90,200,0,1,0,0,0,0,0, , Indigo Potion,0,100,0 + Left Tendril,0,4,28,8,30,6000,0,600,157,94,40,103,288,10,50,0,0,0,0,0,0,0,138,30,480,240,0,500,90,200,0,1,0,0,0,0,0, , Gravity Egg,0,100,0 + Left Tendril,0,4,28,8,53,20000,0,720,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,0,500,90,200,0,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Eyeball Bat,0,5,29,8,30,3000,0,370,149,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,0,500,70,200,0,1,0,0,0,0,300, , ,0,0,0 + Eyeball Bat,0,5,29,8,53,20000,0,560,224,274,100,235,192,10,20,0,0,0,0,0,0,0,16,5,360,360,0,500,70,200,85,1,0,0,0,0,0, , Scarlet Potion,0,100,0 + Valmar's Eye,2,3,26,8,30,12000,660,720,176,145,40,132,288,10,50,0,0,0,0,8,0,0,254,30,300,360,0,500,200,200,0,1,0,800,1800,1800,0, , Demon's Tears,0,100,0 + Valmar's Eye,2,3,26,8,53,20000,620,640,281,108,40,186,288,10,20,0,0,0,0,0,0,0,254,30,300,480,0,500,200,200,0,1,0,3000,4000,1000,0, , Queen Heels,0,100,0 + Right Arm,0,4,32,8,35,8000,440,540,352,126,50,95,288,10,30,0,0,0,0,-3,0,7,154,40,480,240,0,500,90,200,0,1,0,0,0,0,0, , Mana Insignia,0,100,0 + Left Arm,0,4,33,8,35,9000,560,450,234,143,50,237,288,10,30,0,0,0,0,-7,5,0,188,40,480,240,0,500,90,200,0,1,0,0,0,0,2100, , ,0,0,0 + Valmar's Claw,3,3,31,8,35,14000,490,840,273,161,50,158,288,10,30,0,0,0,0,-5,0,0,254,40,240,480,0,500,170,200,0,1,0,1000,2400,1200,0, , Book of Gales,0,100,0 + Sword,0,4,37,8,40,11000,0,0,523,75,450,100,96,10,30,0,0,-3,-3,-3,-3,-3,223,25,360,540,0,500,70,200,83,1,0,0,0,0,0, , Maken Valborg,0,100,0 + Sword,0,4,37,8,40,11000,0,0,999,150,150,999,192,10,30,100,0,0,7,0,0,0,255,4121,360,540,0,500,70,200,83,1,0,0,0,0,0, , ,0,0,0 + Regenerator,0,4,38,8,40,13000,600,0,174,138,450,461,96,10,30,0,0,0,0,0,0,0,184,25,240,540,0,500,60,200,83,1,0,0,0,0,0, , Book of Swords,0,100,0 + Regenerator,0,4,38,8,40,13000,600,0,999,174,150,999,192,10,30,100,0,0,0,3,-3,0,255,4121,240,540,0,500,60,200,83,1,0,0,0,0,0, , ,0,0,0 + Melfice,4,3,36,8,40,19000,840,950,289,187,450,172,96,10,30,100,0,0,0,0,0,0,254,25,120,480,0,500,80,200,83,1,0,1500,3600,1800,0, , Soul of Asura,0,100,0 + Melfice,4,3,36,8,40,19000,840,950,999,316,150,999,192,10,30,100,0,5,-5,0,0,0,255,4121,120,480,0,500,80,200,83,1,0,0,0,0,0, , ,0,0,0 + Right Tentacle,0,5,42,8,44,14000,0,0,315,172,0,183,192,15,30,0,0,6,0,-7,0,0,152,0,360,240,0,500,300,200,0,1,0,0,0,0,0, , Angel Circle,0,100,0 + Left Tentacle,0,5,43,8,44,14000,0,0,315,172,0,183,192,15,30,0,0,0,0,-4,0,8,152,0,360,240,0,500,300,200,0,1,0,0,0,0,4000, , ,0,0,0 + Valmar's Body,5,3,41,8,44,24000,840,720,315,172,0,183,192,10,50,0,0,-2,0,0,3,0,254,0,300,300,0,500,300,200,0,1,0,1600,6000,6000,0, , Relief Tag,0,100,0 + Left Eye,0,4,48,8,45,13000,580,0,324,129,100,175,192,10,30,0,0,0,0,6,0,-5,168,30,240,300,0,500,90,200,0,1,0,0,0,0,0, , Goddess Hi-Heels,0,100,0 + Left Eye,0,4,48,8,54,16000,560,0,273,124,100,176,192,10,20,0,0,10,10,10,10,10,44,30,120,360,0,500,90,200,85,1,0,0,0,0,0, , Mystic Potion,0,100,0 + Right Eye,0,4,47,8,45,13000,580,0,293,231,100,148,192,10,30,0,0,-5,0,7,0,0,168,30,240,300,0,500,90,200,0,1,0,0,0,0,4500, , ,0,0,0 + Right Eye,0,4,47,8,54,16000,560,0,338,101,100,102,192,10,20,0,0,10,10,10,10,10,44,30,120,360,0,500,90,200,85,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Valmar's Heart,6,3,46,8,45,21000,0,840,337,198,100,192,192,10,50,0,0,0,-5,5,0,0,254,30,240,360,0,500,220,200,0,1,0,1800,8000,8000,0, , Holy Clothes,0,100,0 + Valmar's Heart,6,3,46,8,54,25000,560,920,308,119,100,215,192,10,20,0,0,10,10,10,10,10,255,30,120,360,0,500,220,200,0,1,0,3000,4000,1000,0, , Tenma's Dress,0,100,0 + Bit,0,5,52,8,48,4800,0,280,251,112,100,154,192,15,50,15,0,0,0,5,0,0,16,10,480,120,0,500,60,200,0,1,0,0,0,0,900, , ,0,0,0 + Egg Guardian,7,2,51,8,48,28000,620,720,306,184,0,203,0,10,30,0,0,3,6,-10,0,0,246,0,180,420,0,500,120,200,0,1,0,2000,10000,10000,0, , Angel's Robe,0,100,0 + Middle Head,0,4,57,8,55,42000,0,880,382,65,30,254,288,0,15,0,0,0,0,0,0,0,251,50,150,360,0,500,60,200,121,1,0,0,0,0,0, , ,0,0,0 + Right Head,0,4,59,8,55,28000,480,420,341,123,30,271,288,0,15,0,0,0,0,0,0,0,255,50,150,360,0,600,60,200,85,1,0,0,0,0,0, , ,0,0,0 + Left Head,0,4,58,8,55,35000,480,420,326,162,30,249,288,0,15,0,0,0,0,0,0,0,249,50,150,360,0,500,60,200,85,1,0,0,0,0,0, , ,0,0,0 + Valmar Core,8,3,56,8,55,48000,0,960,365,218,30,267,288,0,15,0,0,0,0,0,0,0,255,50,120,480,0,500,160,200,85,1,0,0,0,0,0, , ,0,0,0 + Zera Valmar,9,3,61,8,56,36000,1500,0,237,168,40,156,288,5,20,0,0,0,0,0,0,0,255,30,150,420,0,500,90,200,85,1,0,0,0,0,0, , ,0,0,0 diff --git a/docs/BOSS_HARDMODE.CSV b/docs/BOSS_HARDMODE.CSV index c35986c..90fbe3d 100644 --- a/docs/BOSS_HARDMODE.CSV +++ b/docs/BOSS_HARDMODE.CSV @@ -1,42 +1,42 @@ -Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance - Right Hand,22,8,25,4600,0,480,164,105,40,80,288,10,50,0,0,-2,0,3,0,0,139,35,480,240,500,100,1,0,0,0,0, , Ancient Cuirass,0,100 - Right Hand,22,8,52,18000,0,600,352,105,40,369,288,10,20,0,0,0,0,0,0,0,137,35,480,240,500,100,1,0,0,0,0, , Golden Potion,0,100 - Left Hand,23,8,25,4600,0,480,155,125,40,90,288,10,50,0,0,4,0,0,0,-4,138,35,480,240,500,100,1,0,0,0,0, , Revival Gem,0,100 - Left Hand,23,8,52,18000,0,600,352,125,40,369,288,10,20,0,0,0,0,0,0,0,136,35,480,240,500,100,1,0,0,0,0, , Potion of Azure,0,100 - Head,24,8,25,5300,880,360,109,88,40,165,288,10,50,0,0,0,0,0,0,0,172,35,360,300,500,100,1,0,0,0,800, , ,0,0 - Head,24,8,52,12000,880,360,684,160,40,578,288,10,20,0,0,0,0,0,0,0,42,35,360,300,500,100,1,0,0,0,0, , Indigo Potion,0,100 - Valmar's Tongue,21,8,25,8500,360,880,133,140,40,153,288,10,50,0,0,-4,0,0,0,3,222,35,240,420,500,200,1,500,1200,800,0, , Book of Wizards,0,100 - Valmar's Tongue,21,8,52,27000,360,880,261,140,40,137,288,10,20,0,0,0,0,0,0,0,222,35,240,420,500,200,1,3000,4000,1000,0, , Starlight Tiara,0,100 - Right Tendril,27,8,30,8500,0,900,176,148,40,125,288,10,50,0,0,0,0,0,0,0,140,30,480,240,500,90,1,0,0,0,0, , Warp Knife,0,100 - Right Tendril,27,8,53,25000,0,900,247,148,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,500,90,1,0,0,0,0, , Indigo Potion,0,100 - Left Tendril,28,8,30,8500,0,900,176,110,40,125,288,10,50,0,0,0,0,0,0,0,138,30,480,240,500,90,1,0,0,0,0, , Gravity Egg,0,100 - Left Tendril,28,8,53,25000,0,900,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,500,90,1,0,0,0,0, , Potion of Azure,0,100 - Eyeball Bat,29,8,30,4000,0,450,151,175,110,140,192,15,50,0,0,0,0,5,0,0,145,5,360,360,500,70,1,0,0,0,300, , ,0,0 - Eyeball Bat,29,8,53,25000,0,560,224,274,100,235,192,10,20,0,0,0,0,0,0,0,16,5,360,360,500,70,1,0,0,0,0, , Scarlet Potion,0,100 - Valmar's Eye,26,8,30,16000,900,1300,190,181,40,145,288,10,50,0,0,0,0,8,0,0,254,30,300,360,500,200,1,800,1800,1800,0, , Demon's Tears,0,100 - Valmar's Eye,26,8,53,25000,900,1300,281,181,40,186,288,10,20,0,0,0,0,0,0,0,254,30,300,480,500,200,1,3000,4000,1000,0, , Queen Heels,0,100 - Right Arm,32,8,35,10000,500,600,352,139,50,95,288,10,30,0,0,0,0,-3,0,7,154,40,480,240,500,90,1,0,0,0,0, , Mana Insignia,0,100 - Left Arm,33,8,35,11000,660,550,234,157,50,237,288,10,30,0,0,0,0,-7,5,0,188,40,480,240,500,90,1,0,0,0,2100, , ,0,0 - Valmar's Claw,31,8,35,16000,590,1100,273,177,50,158,288,10,30,0,0,0,0,-5,0,0,254,40,240,480,500,170,1,1000,2400,1200,0, , Book of Gales,0,100 - Sword,37,8,40,14000,0,0,576,125,450,110,96,10,30,0,0,-3,-3,-3,-3,-3,223,25,360,540,500,70,1,0,0,0,0, , Maken Valborg,0,100 - Sword,37,8,40,11000,0,0,999,150,150,999,192,10,30,100,0,0,7,0,0,0,255,4121,360,540,500,70,1,0,0,0,0, , ,0,0 - Regenerator,38,8,40,17000,650,0,192,170,450,508,96,10,30,0,0,0,0,0,0,0,184,25,240,540,500,60,1,0,0,0,0, , Book of Swords,0,100 - Regenerator,38,8,40,13000,600,0,999,174,150,999,192,10,30,100,0,0,0,3,-3,0,255,4121,240,540,500,60,1,0,0,0,0, , ,0,0 - Melfice,36,8,40,20000,1000,1100,318,250,450,195,96,10,30,100,0,0,0,0,0,0,254,25,120,480,500,80,1,1500,3600,1800,0, , Soul of Asura,0,100 - Melfice,36,8,40,19000,840,950,999,316,150,999,192,10,30,100,0,5,-5,0,0,0,255,4121,120,480,500,80,1,0,0,0,0, , ,0,0 - Right Tentacle,42,8,44,23000,0,0,330,300,0,200,192,15,30,0,0,6,0,-6,0,0,152,0,360,240,500,300,1,0,0,0,0, , Angel Circle,0,100 - Left Tentacle,43,8,44,23000,0,0,330,300,0,200,192,15,30,0,0,0,0,-3,0,8,152,0,360,240,500,300,1,0,0,0,4000, , ,0,0 - Valmar's Body,41,8,44,35000,1500,1500,330,250,0,200,192,10,50,0,0,-2,0,0,3,0,254,0,300,300,500,300,1,1600,6000,6000,0, , Relief Tag,0,100 - Left Eye,48,8,45,20000,800,0,324,150,100,175,192,10,30,0,0,0,0,6,0,-4,168,30,240,300,500,90,1,0,0,0,0, , Goddess Hi-Heels,0,100 - Left Eye,48,8,54,20000,800,0,273,150,100,176,192,10,20,0,0,10,10,10,10,10,44,30,120,360,500,90,1,0,0,0,0, , Mystic Potion,0,100 - Right Eye,47,8,45,20000,800,0,293,250,100,155,192,10,30,0,0,-4,0,7,0,0,168,30,240,300,500,90,1,0,0,0,4500, , ,0,0 - Right Eye,47,8,54,20000,800,0,338,250,100,155,192,10,20,0,0,10,10,10,10,10,44,30,120,360,500,90,1,0,0,0,0, , Potion of Azure,0,100 - Valmar's Heart,46,8,45,25000,0,1000,337,250,100,205,192,10,50,0,0,0,-4,5,0,2,254,30,240,360,500,220,1,1800,8000,8000,0, , Holy Clothes,0,100 - Valmar's Heart,46,8,54,25000,560,1200,308,250,100,215,192,10,20,0,0,10,10,10,10,10,255,30,120,360,500,220,1,3000,4000,1000,0, , Tenma's Dress,0,100 - Bit,52,8,48,6000,0,280,251,250,100,154,192,15,50,15,0,0,0,5,0,0,16,10,480,120,500,60,1,0,0,0,900, , ,0,0 - Egg Guardian,51,8,48,40000,620,720,306,350,0,203,0,10,30,0,0,3,6,-6,0,0,246,0,180,420,500,120,1,2000,10000,10000,0, , Angel's Robe,0,100 - Middle Head,57,8,55,52000,0,900,459,110,30,336,288,0,15,0,0,2,0,0,5,0,251,50,150,360,500,60,1,0,0,0,0, , ,0,0 - Right Head,59,8,55,40000,520,460,410,162,30,359,288,0,15,0,0,2,0,0,5,0,255,50,150,360,600,60,1,0,0,0,0, , ,0,0 - Left Head,58,8,55,45000,520,460,392,214,30,329,288,0,15,0,0,2,0,0,5,0,249,50,150,360,500,60,1,0,0,0,0, , ,0,0 - Valmar Core,56,8,55,65000,0,1200,438,288,30,354,288,0,15,0,0,2,0,0,5,0,255,50,120,480,500,160,1,0,0,0,0, , ,0,0 - Zera Valmar,61,8,56,99999,5000,0,237,500,40,156,288,5,20,0,0,0,0,0,0,0,255,30,150,420,500,90,1,0,0,0,0, , ,0,0 +Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7 + Right Hand,0,4,22,8,25,4600,0,480,164,105,40,80,288,10,50,0,0,-2,0,3,0,0,139,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Ancient Cuirass,0,100,0 + Right Hand,0,4,22,8,52,18000,0,600,352,105,40,369,288,10,20,0,0,0,0,0,0,0,137,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Golden Potion,0,100,0 + Left Hand,0,4,23,8,25,4600,0,480,155,125,40,90,288,10,50,0,0,4,0,0,0,-4,138,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Revival Gem,0,100,0 + Left Hand,0,4,23,8,52,18000,0,600,352,125,40,369,288,10,20,0,0,0,0,0,0,0,136,35,480,240,0,500,100,200,0,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Head,0,4,24,8,25,5300,880,360,109,88,40,165,288,10,50,0,0,0,0,0,0,0,172,35,360,300,0,500,100,200,0,1,0,0,0,0,800, , ,0,0,0 + Head,0,4,24,8,52,12000,880,360,684,160,40,578,288,10,20,0,0,0,0,0,0,0,42,35,360,300,0,500,100,200,85,1,0,0,0,0,0, , Indigo Potion,0,100,0 + Valmar's Tongue,1,3,21,8,25,8500,360,880,133,140,40,153,288,10,50,0,0,-4,0,0,0,3,222,35,240,420,0,500,200,200,0,1,0,500,1200,800,0, , Book of Wizards,0,100,0 + Valmar's Tongue,1,3,21,8,52,27000,360,880,261,140,40,137,288,10,20,0,0,0,0,0,0,0,222,35,240,420,0,500,200,200,0,1,0,3000,4000,1000,0, , Starlight Tiara,0,100,0 + Right Tendril,0,4,27,8,30,8500,0,900,176,148,40,125,288,10,50,0,0,0,0,0,0,0,140,30,480,240,0,500,90,200,0,1,0,0,0,0,0, , Warp Knife,0,100,0 + Right Tendril,0,4,27,8,53,25000,0,900,247,148,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,0,500,90,200,0,1,0,0,0,0,0, , Indigo Potion,0,100,0 + Left Tendril,0,4,28,8,30,8500,0,900,176,110,40,125,288,10,50,0,0,0,0,0,0,0,138,30,480,240,0,500,90,200,0,1,0,0,0,0,0, , Gravity Egg,0,100,0 + Left Tendril,0,4,28,8,53,25000,0,900,247,132,40,213,288,10,20,0,0,0,0,0,0,0,136,30,60,420,0,500,90,200,0,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Eyeball Bat,0,5,29,8,30,4000,0,450,151,175,110,140,192,15,50,0,0,0,0,5,0,0,145,5,360,360,0,500,70,200,0,1,0,0,0,0,300, , ,0,0,0 + Eyeball Bat,0,5,29,8,53,25000,0,560,224,274,100,235,192,10,20,0,0,0,0,0,0,0,16,5,360,360,0,500,70,200,85,1,0,0,0,0,0, , Scarlet Potion,0,100,0 + Valmar's Eye,2,3,26,8,30,16000,900,1300,190,181,40,145,288,10,50,0,0,0,0,8,0,0,254,30,300,360,0,500,200,200,0,1,0,800,1800,1800,0, , Demon's Tears,0,100,0 + Valmar's Eye,2,3,26,8,53,25000,900,1300,281,181,40,186,288,10,20,0,0,0,0,0,0,0,254,30,300,480,0,500,200,200,0,1,0,3000,4000,1000,0, , Queen Heels,0,100,0 + Right Arm,0,4,32,8,35,10000,500,600,352,139,50,95,288,10,30,0,0,0,0,-3,0,7,154,40,480,240,0,500,90,200,0,1,0,0,0,0,0, , Mana Insignia,0,100,0 + Left Arm,0,4,33,8,35,11000,660,550,234,157,50,237,288,10,30,0,0,0,0,-7,5,0,188,40,480,240,0,500,90,200,0,1,0,0,0,0,2100, , ,0,0,0 + Valmar's Claw,3,3,31,8,35,16000,590,1100,273,177,50,158,288,10,30,0,0,0,0,-5,0,0,254,40,240,480,0,500,170,200,0,1,0,1000,2400,1200,0, , Book of Gales,0,100,0 + Sword,0,4,37,8,40,14000,0,0,576,125,450,110,96,10,30,0,0,-3,-3,-3,-3,-3,223,25,360,540,0,500,70,200,83,1,0,0,0,0,0, , Maken Valborg,0,100,0 + Sword,0,4,37,8,40,11000,0,0,999,150,150,999,192,10,30,100,0,0,7,0,0,0,255,4121,360,540,0,500,70,200,83,1,0,0,0,0,0, , ,0,0,0 + Regenerator,0,4,38,8,40,17000,650,0,192,170,450,508,96,10,30,0,0,0,0,0,0,0,184,25,240,540,0,500,60,200,83,1,0,0,0,0,0, , Book of Swords,0,100,0 + Regenerator,0,4,38,8,40,13000,600,0,999,174,150,999,192,10,30,100,0,0,0,3,-3,0,255,4121,240,540,0,500,60,200,83,1,0,0,0,0,0, , ,0,0,0 + Melfice,4,3,36,8,40,20000,1000,1100,318,250,450,195,96,10,30,100,0,0,0,0,0,0,254,25,120,480,0,500,80,200,83,1,0,1500,3600,1800,0, , Soul of Asura,0,100,0 + Melfice,4,3,36,8,40,19000,840,950,999,316,150,999,192,10,30,100,0,5,-5,0,0,0,255,4121,120,480,0,500,80,200,83,1,0,0,0,0,0, , ,0,0,0 + Right Tentacle,0,5,42,8,44,23000,0,0,330,300,0,200,192,15,30,0,0,6,0,-6,0,0,152,0,360,240,0,500,300,200,0,1,0,0,0,0,0, , Angel Circle,0,100,0 + Left Tentacle,0,5,43,8,44,23000,0,0,330,300,0,200,192,15,30,0,0,0,0,-3,0,8,152,0,360,240,0,500,300,200,0,1,0,0,0,0,4000, , ,0,0,0 + Valmar's Body,5,3,41,8,44,35000,1500,1500,330,250,0,200,192,10,50,0,0,-2,0,0,3,0,254,0,300,300,0,500,300,200,0,1,0,1600,6000,6000,0, , Relief Tag,0,100,0 + Left Eye,0,4,48,8,45,20000,800,0,324,150,100,175,192,10,30,0,0,0,0,6,0,-4,168,30,240,300,0,500,90,200,0,1,0,0,0,0,0, , Goddess Hi-Heels,0,100,0 + Left Eye,0,4,48,8,54,20000,800,0,273,150,100,176,192,10,20,0,0,10,10,10,10,10,44,30,120,360,0,500,90,200,85,1,0,0,0,0,0, , Mystic Potion,0,100,0 + Right Eye,0,4,47,8,45,20000,800,0,293,250,100,155,192,10,30,0,0,-4,0,7,0,0,168,30,240,300,0,500,90,200,0,1,0,0,0,0,4500, , ,0,0,0 + Right Eye,0,4,47,8,54,20000,800,0,338,250,100,155,192,10,20,0,0,10,10,10,10,10,44,30,120,360,0,500,90,200,85,1,0,0,0,0,0, , Potion of Azure,0,100,0 + Valmar's Heart,6,3,46,8,45,25000,0,1000,337,250,100,205,192,10,50,0,0,0,-4,5,0,2,254,30,240,360,0,500,220,200,0,1,0,1800,8000,8000,0, , Holy Clothes,0,100,0 + Valmar's Heart,6,3,46,8,54,25000,560,1200,308,250,100,215,192,10,20,0,0,10,10,10,10,10,255,30,120,360,0,500,220,200,0,1,0,3000,4000,1000,0, , Tenma's Dress,0,100,0 + Bit,0,5,52,8,48,6000,0,280,251,250,100,154,192,15,50,15,0,0,0,5,0,0,16,10,480,120,0,500,60,200,0,1,0,0,0,0,900, , ,0,0,0 + Egg Guardian,7,2,51,8,48,40000,620,720,306,350,0,203,0,10,30,0,0,3,6,-6,0,0,246,0,180,420,0,500,120,200,0,1,0,2000,10000,10000,0, , Angel's Robe,0,100,0 + Middle Head,0,4,57,8,55,52000,0,900,459,110,30,336,288,0,15,0,0,2,0,0,5,0,251,50,150,360,0,500,60,200,121,1,0,0,0,0,0, , ,0,0,0 + Right Head,0,4,59,8,55,40000,520,460,410,162,30,359,288,0,15,0,0,2,0,0,5,0,255,50,150,360,0,600,60,200,85,1,0,0,0,0,0, , ,0,0,0 + Left Head,0,4,58,8,55,45000,520,460,392,214,30,329,288,0,15,0,0,2,0,0,5,0,249,50,150,360,0,500,60,200,85,1,0,0,0,0,0, , ,0,0,0 + Valmar Core,8,3,56,8,55,65000,0,1200,438,288,30,354,288,0,15,0,0,2,0,0,5,0,255,50,120,480,0,500,160,200,85,1,0,0,0,0,0, , ,0,0,0 + Zera Valmar,9,3,61,8,56,99999,5000,0,237,500,40,156,288,5,20,0,0,0,0,0,0,0,255,30,150,420,0,500,90,200,85,1,0,0,0,0,0, , ,0,0,0 diff --git a/docs/ENEMIES.CSV b/docs/ENEMIES.CSV index 7c0b78e..68cb5df 100644 --- a/docs/ENEMIES.CSV +++ b/docs/ENEMIES.CSV @@ -1,66 +1,66 @@ -Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance - Big Foot,5,5,19,750,0,0,162,82,70,107,250,20,50,0,0,-8,0,0,0,9,0,20,660,240,500,90,0,29,47,35,46, Myriad Power Nut, Lumir Flower,10,3 - Huge Caterpillar,2,2,19,630,0,0,131,72,50,97,288,20,50,0,0,0,0,0,0,0,6,10,600,270,500,100,0,21,33,36,5, Poison Antidote, Pretty Ring,15,2 - Chameleon,3,3,24,780,0,0,165,83,61,125,269,20,50,0,0,0,0,0,0,0,1,5,600,330,500,100,0,14,27,13,50, Purifying Herb, Mirage Earring,15,3 - Granas Knight,5,5,40,2430,0,0,246,104,45,137,307,20,50,0,0,0,0,0,0,0,0,10,600,240,500,80,1,90,150,0,200, Paladin Helmet, Paladin Armor,15,5 - Frost Frog,3,3,13,400,0,0,113,73,98,67,192,20,50,0,0,-3,0,0,0,5,0,5,840,240,500,90,0,11,26,17,37, Eye Drops, Toad Oil,30,8 - Star Mirage,1,1,21,720,0,160,129,80,78,112,230,20,50,0,0,0,0,6,0,-5,8,0,600,240,500,100,0,16,39,19,73, Eye Drops, Seed of Running,10,2 - Giga Mantis,2,2,34,1460,0,0,218,88,80,102,230,20,50,0,0,0,0,-4,6,0,0,10,480,420,500,100,0,42,49,16,53, Healing Fruit, Dragon Bone Helm,15,5 - Fenny Bird,1,1,35,1570,0,0,186,108,100,152,192,20,50,25,0,8,-6,0,0,-8,0,0,540,240,500,100,0,49,14,76,26, Silver Feather, Seed of Swift,5,1 - Crag Snake,3,3,11,280,0,0,125,76,99,53,192,20,50,0,0,0,0,5,0,0,1,5,720,450,500,100,0,12,24,20,27, Poison Antidote, Snake Earrings,20,5 - Hammerhead,3,3,20,830,0,180,156,88,102,93,192,20,50,0,0,0,0,0,7,-2,0,20,780,360,500,130,0,33,48,38,48, Paralysis Salve, Seed of Life,15,3 - Durham Minotaur,11,5,19,4200,0,360,140,120,60,110,269,20,50,0,0,0,-3,10,-6,0,130,25,300,540,500,150,1,210,720,0,0, , Adventure Book,0,100 - Troglodyte,5,5,13,980,0,210,118,70,40,90,288,20,50,10,0,-3,0,0,0,4,128,10,420,300,500,80,1,24,40,10,160, Whirlwind Scroll, Mist Egg,10,120 - Twin Ogre,5,5,20,680,0,130,150,77,70,117,250,20,50,0,0,0,0,0,0,0,0,10,540,240,500,80,0,27,52,29,38, Hand Grenade, Ogre Helm,15,3 - Warp Warrior,7,7,27,850,0,280,194,78,62,136,269,20,50,0,0,0,7,-8,0,0,130,10,600,300,500,80,0,28,59,3,41, Move Blessing, Dark Ring,10,2 - Mottled Spider,2,2,10,250,0,60,100,50,59,60,269,20,50,0,0,0,0,0,0,0,0,5,780,300,500,90,0,8,15,5,2, Medicinal Herb, Slowpoke Nut,20,5 - Man-Eating Tree,6,6,31,1340,0,140,240,76,72,82,250,20,50,0,0,-6,0,0,0,0,136,15,540,420,500,70,0,54,63,51,70, Healing Incense, Divine Talisman,15,125 - Crimson Claw,2,2,30,1230,0,170,212,92,71,108,250,20,50,0,0,0,0,6,-5,0,2,5,600,300,500,60,0,31,41,28,65, Patience Nut, Blessing Scroll,10,5 - Land Cougar,4,4,26,1000,180,0,170,112,103,142,192,20,50,20,0,0,8,0,0,0,8,10,480,480,500,120,0,25,17,49,22, Scroll of Alheal, Gale Stone,20,5 - Sandman,4,4,15,340,0,120,103,65,60,94,269,20,50,0,0,0,0,8,0,0,0,5,720,240,500,70,0,13,16,15,25, Hand Grenade, Sandman Whiskers,10,2 - Crimson Tail,12,2,36,9800,0,620,230,149,73,128,250,15,30,0,0,0,0,7,-5,0,202,10,210,450,500,190,1,250,1200,300,1000, All-Around Seed, Soul Egg,2,120 - Skull Snail,7,7,27,920,150,110,168,73,51,144,288,20,50,0,0,-4,0,0,0,7,2,10,720,300,500,120,0,30,25,46,15, Icefang Stone, Bone Harp,15,5 - Clay Bird,1,1,32,1800,140,150,221,101,79,133,192,20,50,0,0,0,-7,9,0,0,128,5,360,300,500,120,0,72,89,127,119, Scattering Stone, Silver Feather,10,1 - Hellhound,4,4,22,580,110,0,159,97,82,138,192,20,50,0,0,7,0,0,0,-7,0,5,420,240,500,120,0,19,22,53,54, Firebomb, Ogre Slayer,15,1 - Ghoul,7,7,17,670,70,100,135,75,42,115,288,20,50,0,0,-3,0,0,0,6,2,5,540,360,500,70,0,15,19,30,34, Weakness Nut, Yomi's Elixir,10,5 - Brain Bat,7,7,41,1480,250,0,176,109,80,236,230,20,50,0,0,0,9,0,0,0,0,0,600,300,500,90,0,60,32,135,103, Yomi's Elixir, Seed of Spells,10,3 - Gargoyle,6,6,10,380,80,0,115,45,69,135,250,20,50,0,0,0,0,0,0,0,30,5,480,240,500,90,0,18,54,21,12, Holy Ashes, Sword of Purity,20,1 - Dragonoid,3,3,26,960,50,80,182,93,94,132,192,20,50,0,0,6,0,-5,0,0,0,10,600,300,500,120,0,32,31,42,63, Flame Stone, Seed of Power,15,3 - Naga Queen,13,6,43,12500,120,480,248,193,74,184,250,15,30,0,0,0,0,-7,0,8,234,15,180,420,500,150,1,375,0,640,800, All-Around Seed, Star Egg,2,120 - Valmar Young,14,8,49,7200,300,560,312,171,83,145,230,15,30,0,0,0,0,0,0,0,224,10,120,480,500,170,1,300,750,0,425, Yomi's Elixir, Soul of Asura,10,125 - Valmar Fly,8,8,48,3600,0,0,258,152,139,134,192,20,50,0,0,0,0,0,0,0,0,5,300,300,500,80,1,75,375,0,125, Scarlet Potion, Platinum Feather,10,125 - Yeti,5,5,44,2130,0,0,245,102,68,153,250,20,50,0,0,0,5,8,-6,0,128,20,600,360,500,100,0,74,9,4,117, Serpentine, Charming Heels,10,125 - Venomous Larva,2,2,38,1620,0,0,204,85,52,130,288,20,50,0,0,7,0,0,0,-4,0,10,600,420,500,110,0,57,72,52,56, Healing Incense, Caterpillar Soup,15,5 - Salamadile,3,3,41,1500,0,0,254,95,60,128,269,20,50,0,0,10,-6,0,0,-5,0,5,600,330,500,110,0,70,30,84,68, Red Bird Stone, Salamander Tail,10,3 - Flame Toad,3,3,30,940,0,0,178,87,100,118,192,20,50,0,0,8,0,0,-2,-6,0,5,660,480,500,90,0,35,20,32,18, Dynamite, Pretty Bracelet,15,5 - Immune Cell,1,1,39,1540,0,200,215,115,80,156,230,20,50,0,0,0,-4,0,10,0,8,0,600,300,500,110,0,64,84,41,64, Sympathy Nut, Binding Circle,10,122 - Giant Mantis,2,2,15,420,0,0,122,78,78,80,230,20,50,0,0,-4,7,0,0,0,0,10,780,240,500,100,0,5,11,18,23, Wound Salve, Seed of Defense,15,3 - Dodo,1,1,10,230,0,0,110,55,98,110,192,20,50,0,0,0,0,0,0,0,0,0,840,270,500,100,0,6,10,8,7, Medicinal Herb, Healing Herb,20,5 - Pit Viper,3,3,32,1080,0,0,197,96,101,122,192,20,50,0,0,5,0,-5,0,0,4,5,540,300,500,100,0,52,45,47,47, Purifying Herb, Red Goblin Toad,20,5 - Dino Freezer,3,3,39,1830,0,240,270,105,99,186,192,20,50,0,0,-7,0,0,0,8,128,20,600,240,500,140,0,78,122,48,134, Dynamite, Tundra Battleax,10,122 - Leck Guarder,11,5,42,15000,0,750,273,209,62,139,269,15,30,0,0,9,0,0,0,0,201,25,240,600,500,160,1,400,1250,0,0, , Inferno Battleax,0,100 - Scaly Warrior,5,5,30,1160,0,230,195,103,41,124,288,20,50,0,0,0,0,0,-4,0,0,10,360,240,500,80,0,45,51,23,93, Holy Wound Salve, Seed of Moves,15,3 - Nyarmot,5,5,41,1670,0,220,235,81,70,162,250,20,50,0,0,7,0,-3,0,0,0,10,600,300,500,80,0,81,67,39,97, Tight Dress, Panacea,125,10 - Ancient Warrior,7,7,45,2040,0,360,327,122,63,146,269,20,50,15,0,8,0,0,0,-7,130,10,600,270,500,80,0,97,86,14,196, Golden Potion, Reflect Mail,10,125 - Tarantula,2,2,38,1270,0,90,231,94,60,116,269,20,50,0,0,0,0,0,0,0,4,5,600,360,500,100,0,53,94,43,45, Panacea, Spiderweb,15,10 - Killer Tree,6,6,44,2310,0,280,382,134,71,75,250,20,50,0,0,9,0,-6,0,0,128,15,600,180,500,80,0,117,34,6,186, All-Around Seed, Omnipotent Seed,1,125 - Giant Crab,2,2,19,560,0,70,152,67,69,86,250,20,50,0,0,0,0,5,0,0,0,5,720,240,500,60,0,36,37,37,12, Healing Herb, Quake Stone,10,2 - Snow Leopard,4,4,42,4600,320,0,267,182,102,165,192,20,50,30,0,-5,0,0,0,10,130,10,420,300,500,120,0,150,175,160,150, Icefang Stone, Pretty Necklace,10,1 - Desert Diver,4,4,37,1300,0,250,173,90,60,127,269,20,50,0,0,6,-8,10,0,0,0,5,300,210,500,70,0,56,58,44,126, Vaccine, Revival Gem,10,2 - Dual Fist,12,2,50,19000,0,660,346,145,73,158,250,15,30,0,0,0,-5,0,0,9,202,10,360,540,500,200,1,450,1600,0,1200, Omnipotent Seed, Elf King's Boots,2,120 - Evil Maneuver,7,7,42,1950,240,260,282,110,53,103,288,20,50,0,0,0,0,-3,8,0,10,10,600,240,500,130,0,105,114,59,32, Thor Stone, Seed of Psyche,10,3 - Emerald Bird,1,1,45,1860,160,320,309,117,81,244,192,20,50,0,0,-4,0,0,0,7,128,5,480,330,500,120,0,108,96,156,271, Magical Medicine, Gold Feather,10,125 - Death Doberman,4,4,44,1790,270,0,291,132,80,173,192,20,50,0,0,-3,10,0,0,0,0,5,600,270,500,130,0,83,13,115,106, Yomi's Elixir, Red Hair Ribbon,10,125 - Mind Eater,7,7,47,2200,280,330,263,128,43,285,288,20,50,0,0,0,0,0,9,-3,10,5,420,300,500,80,0,128,12,27,142, Mana Crystals, Magical Medicine,121,10 - Vein Brain,7,7,28,800,130,0,153,116,80,196,230,20,50,0,0,-5,0,0,7,0,12,0,960,390,500,90,0,17,8,65,72, Electrum Stone, Seed of Magic,15,3 - Devil,6,6,50,5800,630,0,303,158,72,204,250,20,50,5,0,5,0,0,0,-2,160,5,30,240,500,100,1,20,270,320,240, Jet-Black Cape, Demon Ash,122,2 - Dragon Knight,3,3,42,2130,60,290,315,124,95,158,192,20,50,0,0,0,-6,0,6,0,128,10,600,300,500,120,0,92,98,73,171, Dragon Wand, Scarlet Potion,122,10 - Guardian,13,6,50,17000,260,690,324,185,74,213,250,10,30,0,0,0,0,-5,8,5,237,15,150,300,500,150,1,500,0,2000,1600, Omnipotent Seed, Phoenix Ring,2,120 - Valmar Magna,14,8,51,20000,440,700,336,214,79,178,230,10,30,0,0,5,0,0,0,0,224,10,270,300,500,180,1,600,50,300,1500, Brave Dirk, Mystic Potion,1,20 - Valmar Moth,8,8,51,3200,0,0,303,230,142,104,192,15,50,0,0,7,0,0,0,0,128,5,60,120,500,90,0,100,60,50,80, Yomi's Elixir, Meteor Scroll,10,1 - Millenia,16,5,11,100000,80,77,106,127,66,70,192,15,30,5,15,0,0,0,0,0,255,10,825,310,210,60,1,0,0,0,0, , ,0,0 - Beast-Man,17,5,16,4800,49,144,150,144,88,61,192,15,30,5,15,0,0,0,0,0,202,40,750,320,210,80,1,150,100,0,0, , ,0,0 - Eyeball Bat,29,8,30,3000,0,370,148,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,500,70,1,50,225,225,195, , Book of Warriors,0,120 - Tio Clone,18,5,43,30000,190,165,274,282,196,168,192,10,30,100,0,0,0,0,0,0,219,15,850,300,210,60,1,900,4000,4000,0, , Balor,0,100 - Millenia,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,210,60,1,0,3000,0,0, , Black Angel Bow,0,100 - MNLLEHNR,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,210,60,1,0,3000,0,0, , Black Angel Bow,0,100 +Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7 + Big Foot,1,1,5,5,19,750,0,0,162,82,70,107,250,20,50,0,0,-8,0,0,0,9,0,20,660,240,0,500,90,200,0,0,0,29,47,35,46, Myriad Power Nut, Lumir Flower,10,3,0 + Huge Caterpillar,2,1,2,2,19,630,0,0,131,72,50,97,288,20,50,0,0,0,0,0,0,0,6,10,600,270,0,500,100,200,0,0,0,21,33,36,5, Poison Antidote, Pretty Ring,15,2,0 + Chameleon,3,1,3,3,24,780,0,0,165,83,61,125,269,20,50,0,0,0,0,0,0,0,1,5,600,330,0,500,100,200,0,0,0,14,27,13,50, Purifying Herb, Mirage Earring,15,3,0 + Granas Knight,4,1,5,5,40,2430,0,0,246,104,45,137,307,20,50,0,0,0,0,0,0,0,0,10,600,240,0,500,80,200,0,1,0,90,150,0,200, Paladin Helmet, Paladin Armor,15,5,0 + Frost Frog,6,1,3,3,13,400,0,0,113,73,98,67,192,20,50,0,0,-3,0,0,0,5,0,5,840,240,0,500,90,200,0,0,0,11,26,17,37, Eye Drops, Toad Oil,30,8,0 + Star Mirage,7,1,1,1,21,720,0,160,129,80,78,112,230,20,50,0,0,0,0,6,0,-5,8,0,600,240,0,500,100,200,0,0,0,16,39,19,73, Eye Drops, Seed of Running,10,2,0 + Giga Mantis,8,1,2,2,34,1460,0,0,218,88,80,102,230,20,50,0,0,0,0,-4,6,0,0,10,480,420,0,500,100,200,0,0,0,42,49,16,53, Healing Fruit, Dragon Bone Helm,15,5,0 + Fenny Bird,9,1,1,1,35,1570,0,0,186,108,100,152,192,20,50,25,0,8,-6,0,0,-8,0,0,540,240,0,500,100,200,0,0,0,49,14,76,26, Silver Feather, Seed of Swift,5,1,0 + Crag Snake,10,1,3,3,11,280,0,0,125,76,99,53,192,20,50,0,0,0,0,5,0,0,1,5,720,450,0,500,100,200,0,0,0,12,24,20,27, Poison Antidote, Snake Earrings,20,5,0 + Hammerhead,12,1,3,3,20,830,0,180,156,88,102,93,192,20,50,0,0,0,0,0,7,-2,0,20,780,360,0,500,130,200,0,0,0,33,48,38,48, Paralysis Salve, Seed of Life,15,3,0 + Durham Minotaur,13,2,11,5,19,4200,0,360,140,120,60,110,269,20,50,0,0,0,-3,10,-6,0,130,25,300,540,0,500,150,200,0,1,0,210,720,0,0, , Adventure Book,0,100,0 + Troglodyte,14,1,5,5,13,980,0,210,118,70,40,90,288,20,50,10,0,-3,0,0,0,4,128,10,420,300,0,500,80,200,0,1,0,24,40,10,160, Whirlwind Scroll, Mist Egg,10,120,0 + Twin Ogre,16,1,5,5,20,680,0,130,150,77,70,117,250,20,50,0,0,0,0,0,0,0,0,10,540,240,0,500,80,200,0,0,0,27,52,29,38, Hand Grenade, Ogre Helm,15,3,0 + Warp Warrior,17,1,7,7,27,850,0,280,194,78,62,136,269,20,50,0,0,0,7,-8,0,0,130,10,600,300,0,500,80,200,0,0,0,28,59,3,41, Move Blessing, Dark Ring,10,2,0 + Mottled Spider,18,1,2,2,10,250,0,60,100,50,59,60,269,20,50,0,0,0,0,0,0,0,0,5,780,300,0,500,90,200,0,0,0,8,15,5,2, Medicinal Herb, Slowpoke Nut,20,5,0 + Man-Eating Tree,19,1,6,6,31,1340,0,140,240,76,72,82,250,20,50,0,0,-6,0,0,0,0,136,15,540,420,0,500,70,200,0,0,0,54,63,51,70, Healing Incense, Divine Talisman,15,125,0 + Crimson Claw,20,1,2,2,30,1230,0,170,212,92,71,108,250,20,50,0,0,0,0,6,-5,0,2,5,600,300,0,500,60,200,0,0,0,31,41,28,65, Patience Nut, Blessing Scroll,10,5,0 + Land Cougar,21,1,4,4,26,1000,180,0,170,112,103,142,192,20,50,20,0,0,8,0,0,0,8,10,480,480,0,500,120,200,0,0,0,25,17,49,22, Scroll of Alheal, Gale Stone,20,5,0 + Sandman,22,1,4,4,15,340,0,120,103,65,60,94,269,20,50,0,0,0,0,8,0,0,0,5,720,240,0,500,70,200,0,0,0,13,16,15,25, Hand Grenade, Sandman Whiskers,10,2,0 + Crimson Tail,23,2,12,2,36,9800,0,620,230,149,73,128,250,15,30,0,0,0,0,7,-5,0,202,10,210,450,0,500,190,200,0,1,0,250,1200,300,1000, All-Around Seed, Soul Egg,2,120,0 + Skull Snail,24,1,7,7,27,920,150,110,168,73,51,144,288,20,50,0,0,-4,0,0,0,7,2,10,720,300,0,500,120,200,0,0,0,30,25,46,15, Icefang Stone, Bone Harp,15,5,0 + Clay Bird,25,1,1,1,32,1800,140,150,221,101,79,133,192,20,50,0,0,0,-7,9,0,0,128,5,360,300,0,500,120,200,0,0,0,72,89,127,119, Scattering Stone, Silver Feather,10,1,0 + Hellhound,26,1,4,4,22,580,110,0,159,97,82,138,192,20,50,0,0,7,0,0,0,-7,0,5,420,240,0,500,120,200,0,0,0,19,22,53,54, Firebomb, Ogre Slayer,15,1,0 + Ghoul,27,1,7,7,17,670,70,100,135,75,42,115,288,20,50,0,0,-3,0,0,0,6,2,5,540,360,0,500,70,200,0,0,0,15,19,30,34, Weakness Nut, Yomi's Elixir,10,5,0 + Brain Bat,28,1,7,7,41,1480,250,0,176,109,80,236,230,20,50,0,0,0,9,0,0,0,0,0,600,300,0,500,90,200,0,0,0,60,32,135,103, Yomi's Elixir, Seed of Spells,10,3,0 + Gargoyle,29,1,6,6,10,380,80,0,115,45,69,135,250,20,50,0,0,0,0,0,0,0,30,5,480,240,0,500,90,200,0,0,0,18,54,21,12, Holy Ashes, Sword of Purity,20,1,0 + Dragonoid,30,1,3,3,26,960,50,80,182,93,94,132,192,20,50,0,0,6,0,-5,0,0,0,10,600,300,0,500,120,200,0,0,0,32,31,42,63, Flame Stone, Seed of Power,15,3,0 + Naga Queen,31,2,13,6,43,12500,120,480,248,193,74,184,250,15,30,0,0,0,0,-7,0,8,234,15,180,420,0,500,150,200,0,1,0,375,0,640,800, All-Around Seed, Star Egg,2,120,0 + Valmar Young,34,2,14,8,49,7200,300,560,312,171,83,145,230,15,30,0,0,0,0,0,0,0,224,10,120,480,0,500,170,200,0,1,0,300,750,0,425, Yomi's Elixir, Soul of Asura,10,125,0 + Valmar Fly,35,1,8,8,48,3600,0,0,258,152,139,134,192,20,50,0,0,0,0,0,0,0,0,5,300,300,0,500,80,200,0,1,0,75,375,0,125, Scarlet Potion, Platinum Feather,10,125,0 + Yeti,51,1,5,5,44,2130,0,0,245,102,68,153,250,20,50,0,0,0,5,8,-6,0,128,20,600,360,0,500,100,200,0,0,0,74,9,4,117, Serpentine, Charming Heels,10,125,0 + Venomous Larva,52,1,2,2,38,1620,0,0,204,85,52,130,288,20,50,0,0,7,0,0,0,-4,0,10,600,420,0,500,110,200,0,0,0,57,72,52,56, Healing Incense, Caterpillar Soup,15,5,0 + Salamadile,53,1,3,3,41,1500,0,0,254,95,60,128,269,20,50,0,0,10,-6,0,0,-5,0,5,600,330,0,500,110,200,0,0,0,70,30,84,68, Red Bird Stone, Salamander Tail,10,3,0 + Flame Toad,56,1,3,3,30,940,0,0,178,87,100,118,192,20,50,0,0,8,0,0,-2,-6,0,5,660,480,0,500,90,200,0,0,0,35,20,32,18, Dynamite, Pretty Bracelet,15,5,0 + Immune Cell,57,1,1,1,39,1540,0,200,215,115,80,156,230,20,50,0,0,0,-4,0,10,0,8,0,600,300,0,500,110,200,0,0,0,64,84,41,64, Sympathy Nut, Binding Circle,10,122,0 + Giant Mantis,58,1,2,2,15,420,0,0,122,78,78,80,230,20,50,0,0,-4,7,0,0,0,0,10,780,240,0,500,100,200,0,0,0,5,11,18,23, Wound Salve, Seed of Defense,15,3,0 + Dodo,59,1,1,1,10,230,0,0,110,55,98,110,192,20,50,0,0,0,0,0,0,0,0,0,840,270,0,500,100,200,0,0,0,6,10,8,7, Medicinal Herb, Healing Herb,20,5,0 + Pit Viper,60,1,3,3,32,1080,0,0,197,96,101,122,192,20,50,0,0,5,0,-5,0,0,4,5,540,300,0,500,100,200,0,0,0,52,45,47,47, Purifying Herb, Red Goblin Toad,20,5,0 + Dino Freezer,62,1,3,3,39,1830,0,240,270,105,99,186,192,20,50,0,0,-7,0,0,0,8,128,20,600,240,0,500,140,200,0,0,0,78,122,48,134, Dynamite, Tundra Battleax,10,122,0 + Leck Guarder,63,2,11,5,42,15000,0,750,273,209,62,139,269,15,30,0,0,9,0,0,0,0,201,25,240,600,0,500,160,200,0,1,0,400,1250,0,0, , Inferno Battleax,0,100,0 + Scaly Warrior,64,1,5,5,30,1160,0,230,195,103,41,124,288,20,50,0,0,0,0,0,-4,0,0,10,360,240,0,500,80,200,0,0,0,45,51,23,93, Holy Wound Salve, Seed of Moves,15,3,0 + Nyarmot,66,1,5,5,41,1670,0,220,235,81,70,162,250,20,50,0,0,7,0,-3,0,0,0,10,600,300,0,500,80,200,0,0,0,81,67,39,97, Tight Dress, Panacea,125,10,0 + Ancient Warrior,67,1,7,7,45,2040,0,360,327,122,63,146,269,20,50,15,0,8,0,0,0,-7,130,10,600,270,0,500,80,200,0,0,0,97,86,14,196, Golden Potion, Reflect Mail,10,125,0 + Tarantula,68,1,2,2,38,1270,0,90,231,94,60,116,269,20,50,0,0,0,0,0,0,0,4,5,600,360,0,500,100,200,0,0,0,53,94,43,45, Panacea, Spiderweb,15,10,0 + Killer Tree,69,1,6,6,44,2310,0,280,382,134,71,75,250,20,50,0,0,9,0,-6,0,0,128,15,600,180,0,500,80,200,0,0,0,117,34,6,186, All-Around Seed, Omnipotent Seed,1,125,0 + Giant Crab,70,1,2,2,19,560,0,70,152,67,69,86,250,20,50,0,0,0,0,5,0,0,0,5,720,240,0,500,60,200,0,0,0,36,37,37,12, Healing Herb, Quake Stone,10,2,0 + Snow Leopard,71,1,4,4,42,4600,320,0,267,182,102,165,192,20,50,30,0,-5,0,0,0,10,130,10,420,300,0,500,120,200,0,0,0,150,175,160,150, Icefang Stone, Pretty Necklace,10,1,0 + Desert Diver,72,1,4,4,37,1300,0,250,173,90,60,127,269,20,50,0,0,6,-8,10,0,0,0,5,300,210,0,500,70,200,0,0,0,56,58,44,126, Vaccine, Revival Gem,10,2,0 + Dual Fist,73,2,12,2,50,19000,0,660,346,145,73,158,250,15,30,0,0,0,-5,0,0,9,202,10,360,540,0,500,200,200,0,1,0,450,1600,0,1200, Omnipotent Seed, Elf King's Boots,2,120,0 + Evil Maneuver,74,1,7,7,42,1950,240,260,282,110,53,103,288,20,50,0,0,0,0,-3,8,0,10,10,600,240,0,500,130,200,0,0,0,105,114,59,32, Thor Stone, Seed of Psyche,10,3,0 + Emerald Bird,75,1,1,1,45,1860,160,320,309,117,81,244,192,20,50,0,0,-4,0,0,0,7,128,5,480,330,0,500,120,200,0,0,0,108,96,156,271, Magical Medicine, Gold Feather,10,125,0 + Death Doberman,76,1,4,4,44,1790,270,0,291,132,80,173,192,20,50,0,0,-3,10,0,0,0,0,5,600,270,0,500,130,200,0,0,0,83,13,115,106, Yomi's Elixir, Red Hair Ribbon,10,125,0 + Mind Eater,77,1,7,7,47,2200,280,330,263,128,43,285,288,20,50,0,0,0,0,0,9,-3,10,5,420,300,0,500,80,200,0,0,0,128,12,27,142, Mana Crystals, Magical Medicine,121,10,0 + Vein Brain,78,1,7,7,28,800,130,0,153,116,80,196,230,20,50,0,0,-5,0,0,7,0,12,0,960,390,0,500,90,200,0,0,0,17,8,65,72, Electrum Stone, Seed of Magic,15,3,0 + Devil,79,1,6,6,50,5800,630,0,303,158,72,204,250,20,50,5,0,5,0,0,0,-2,160,5,30,240,0,500,100,200,0,1,0,20,270,320,240, Jet-Black Cape, Demon Ash,122,2,0 + Dragon Knight,80,1,3,3,42,2130,60,290,315,124,95,158,192,20,50,0,0,0,-6,0,6,0,128,10,600,300,0,500,120,200,0,0,0,92,98,73,171, Dragon Wand, Scarlet Potion,122,10,0 + Guardian,81,2,13,6,50,17000,260,690,324,185,74,213,250,10,30,0,0,0,0,-5,8,5,237,15,150,300,0,500,150,200,0,1,0,500,0,2000,1600, Omnipotent Seed, Phoenix Ring,2,120,0 + Valmar Magna,84,2,14,8,51,20000,440,700,336,214,79,178,230,10,30,0,0,5,0,0,0,0,224,10,270,300,0,500,180,200,0,1,0,600,50,300,1500, Brave Dirk, Mystic Potion,1,20,0 + Valmar Moth,85,1,8,8,51,3200,0,0,303,230,142,104,192,15,50,0,0,7,0,0,0,0,128,5,60,120,0,500,90,200,0,0,0,100,60,50,80, Yomi's Elixir, Meteor Scroll,10,1,0 + Millenia,0,2,16,5,11,100000,80,77,106,127,66,70,192,15,30,5,15,0,0,0,0,0,255,10,825,310,480,210,60,170,0,1,0,0,0,0,0, , ,0,0,0 + Beast-Man,0,2,17,5,16,4800,49,144,150,144,88,61,192,15,30,5,15,0,0,0,0,0,202,40,750,320,480,210,80,200,0,1,0,150,100,0,0, , ,0,0,0 + Eyeball Bat,0,1,29,8,30,3000,0,370,148,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,0,500,70,200,0,1,0,50,225,225,195, , Book of Warriors,0,120,0 + Tio Clone,0,2,18,5,43,30000,190,165,274,282,196,168,192,10,30,100,0,0,0,0,0,0,219,15,850,300,480,210,60,155,85,1,0,900,4000,4000,0, , Balor,0,100,0 + Millenia,0,2,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,480,210,60,170,0,1,0,0,3000,0,0, , Black Angel Bow,0,100,0 + MNLLEHNR,0,2,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,480,210,60,170,0,1,0,0,3000,0,0, , Black Angel Bow,0,100,0 diff --git a/docs/ENEMIES_HARDMODE.CSV b/docs/ENEMIES_HARDMODE.CSV index 369fab1..40af763 100644 --- a/docs/ENEMIES_HARDMODE.CSV +++ b/docs/ENEMIES_HARDMODE.CSV @@ -1,65 +1,65 @@ -Name,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,T_HEAL,Size,No Run,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance - Big Foot,5,5,19,863,0,0,162,86,70,107,250,20,50,0,0,-8,0,0,0,9,0,20,660,240,500,90,0,29,47,35,46, Myriad Power Nut, Lumir Flower,10,3 - Huge Caterpillar,2,2,19,725,0,0,131,76,50,97,288,20,50,0,0,0,0,0,0,0,6,10,600,270,500,100,0,21,33,36,5, Poison Antidote, Pretty Ring,15,2 - Chameleon,3,3,24,897,0,0,167,87,64,125,269,20,50,0,0,0,0,0,0,0,1,5,600,330,500,100,0,14,27,13,50, Purifying Herb, Mirage Earring,15,3 - Granas Knight,5,5,40,2795,0,0,246,109,45,137,307,20,50,0,0,0,0,0,0,0,0,10,600,240,500,80,1,90,150,0,200, Paladin Helmet, Paladin Armor,15,5 - Frost Frog,3,3,13,460,0,0,113,77,98,67,192,20,50,0,0,-3,0,0,0,5,0,5,840,240,500,90,0,11,26,17,37, Eye Drops, Toad Oil,30,8 - Star Mirage,1,1,21,828,0,160,129,84,78,112,230,20,50,0,0,0,0,6,0,-5,8,0,600,240,500,100,0,16,39,19,73, Eye Drops, Seed of Running,10,2 - Giga Mantis,2,2,34,1679,0,0,218,92,80,102,230,20,50,0,0,0,0,-4,6,0,0,10,480,420,500,100,0,42,49,16,53, Healing Fruit, Dragon Bone Helm,15,5 - Fenny Bird,1,1,35,1806,0,0,186,113,100,152,192,20,50,25,0,8,-6,0,0,-8,0,0,540,240,500,100,0,49,14,76,26, Silver Feather, Seed of Swift,5,1 - Crag Snake,3,3,11,322,0,0,125,80,99,53,192,20,50,0,0,0,0,5,0,0,1,5,720,450,500,100,0,12,24,20,27, Poison Antidote, Snake Earrings,20,5 - Hammerhead,3,3,20,955,0,180,165,92,102,93,192,20,50,0,0,0,0,0,7,-2,0,20,780,360,500,130,0,33,48,38,48, Paralysis Salve, Seed of Life,15,3 - Durham Minotaur,11,5,19,4830,0,360,140,126,60,110,269,20,50,0,0,0,-3,10,-6,0,130,25,300,540,500,150,1,210,720,0,0, , Adventure Book,0,100 - Troglodyte,5,5,13,1127,0,210,118,74,40,90,288,20,50,10,0,-3,0,0,0,4,128,10,420,300,500,80,1,24,40,10,160, Whirlwind Scroll, Mist Egg,10,120 - Twin Ogre,5,5,20,782,0,130,150,81,70,117,250,20,50,0,0,0,0,0,0,0,0,10,540,240,500,80,0,27,52,29,38, Hand Grenade, Ogre Helm,15,3 - Warp Warrior,7,7,27,978,0,280,194,82,66,136,269,20,50,0,0,0,7,-8,0,0,130,10,600,300,500,80,0,28,59,3,41, Move Blessing, Dark Ring,10,2 - Mottled Spider,2,2,10,300,0,60,110,53,59,60,269,20,50,0,0,0,0,0,0,0,0,5,780,300,500,90,0,8,15,5,2, Medicinal Herb, Slowpoke Nut,20,5 - Man-Eating Tree,6,6,31,1541,0,140,240,80,72,82,250,20,50,0,0,-6,0,0,0,0,136,15,540,420,500,70,0,54,63,51,70, Healing Incense, Divine Talisman,15,125 - Crimson Claw,2,2,30,1415,0,170,220,97,71,108,250,20,50,0,0,0,0,6,-5,0,2,5,600,300,500,60,0,31,41,28,65, Patience Nut, Blessing Scroll,10,5 - Land Cougar,4,4,26,1150,180,0,170,118,103,142,192,20,50,20,0,0,8,3,0,0,8,10,480,480,500,120,0,25,17,49,22, Scroll of Alheal, Gale Stone,20,5 - Sandman,4,4,15,391,0,120,103,68,60,94,269,20,50,0,0,0,0,8,0,0,0,5,720,240,500,70,0,13,16,15,25, Hand Grenade, Sandman Whiskers,10,2 - Crimson Tail,12,2,36,11270,0,620,230,156,73,128,250,15,30,0,0,0,0,7,-5,0,202,10,210,450,500,190,1,250,1200,300,1000, All-Around Seed, Soul Egg,2,120 - Skull Snail,7,7,27,1058,150,110,170,77,51,144,288,20,50,0,0,-4,0,7,0,7,2,10,720,300,500,120,0,30,25,46,15, Icefang Stone, Bone Harp,15,5 - Clay Bird,1,1,32,2070,140,150,221,106,79,133,192,20,50,0,0,0,-7,9,0,0,128,5,360,300,500,120,0,72,89,127,119, Scattering Stone, Silver Feather,10,1 - Hellhound,4,4,22,667,110,0,159,102,82,138,192,20,50,0,0,7,0,0,0,-7,0,5,420,240,500,120,0,19,22,53,54, Firebomb, Ogre Slayer,15,1 - Ghoul,7,7,17,771,70,100,135,79,42,115,288,20,50,0,0,-3,0,0,0,6,2,5,540,360,500,70,0,15,19,30,34, Weakness Nut, Yomi's Elixir,10,5 - Brain Bat,7,7,41,1702,250,0,176,114,80,236,230,20,50,0,0,0,9,0,0,0,0,0,600,300,500,90,0,60,32,135,103, Yomi's Elixir, Seed of Spells,10,3 - Gargoyle,6,6,10,437,80,0,115,47,69,135,250,20,50,0,0,0,0,0,0,0,30,5,480,240,500,90,0,18,54,21,12, Holy Ashes, Sword of Purity,20,1 - Dragonoid,3,3,26,1104,50,80,195,98,94,132,192,20,50,0,0,6,0,-5,0,0,0,10,600,300,500,120,0,32,31,42,63, Flame Stone, Seed of Power,15,3 - Naga Queen,13,6,43,14375,120,480,248,203,74,184,250,15,30,0,0,0,0,-7,0,8,234,15,180,420,500,150,1,375,0,640,800, All-Around Seed, Star Egg,2,120 - Valmar Young,14,8,49,8280,300,560,312,180,83,145,230,15,30,0,0,0,0,0,0,0,224,10,120,480,500,170,1,300,750,0,425, Yomi's Elixir, Soul of Asura,10,125 - Valmar Fly,8,8,48,4140,0,0,258,160,139,134,192,20,50,0,0,0,0,0,0,0,0,5,300,300,500,80,1,75,375,0,125, Scarlet Potion, Platinum Feather,10,125 - Yeti,5,5,44,2450,0,0,245,107,68,153,250,20,50,0,0,0,5,8,-6,0,128,20,600,360,500,100,0,74,9,4,117, Serpentine, Charming Heels,10,125 - Venomous Larva,2,2,38,1863,0,0,204,89,52,130,288,20,50,0,0,7,0,0,0,-4,0,10,600,420,500,110,0,57,72,52,56, Healing Incense, Caterpillar Soup,15,5 - Salamadile,3,3,41,1725,0,0,254,100,60,128,269,20,50,0,0,10,-6,0,0,-5,0,5,600,330,500,110,0,70,30,84,68, Red Bird Stone, Salamander Tail,10,3 - Flame Toad,3,3,30,1081,0,0,185,91,100,118,192,20,50,0,0,8,0,3,-2,-6,0,5,660,480,500,90,0,35,20,32,18, Dynamite, Pretty Bracelet,15,5 - Immune Cell,1,1,39,1771,0,200,215,121,80,156,230,20,50,0,0,0,-4,0,10,0,8,0,600,300,500,110,0,64,84,41,64, Sympathy Nut, Binding Circle,10,122 - Giant Mantis,2,2,15,483,0,0,122,82,78,80,230,20,50,0,0,-4,7,0,0,0,0,10,780,240,500,100,0,5,11,18,23, Wound Salve, Seed of Defense,15,3 - Dodo,1,1,10,265,0,0,110,58,98,110,192,20,50,0,0,0,0,0,0,0,0,0,840,270,500,100,0,6,10,8,7, Medicinal Herb, Healing Herb,20,5 - Pit Viper,3,3,32,1242,0,0,197,101,101,122,192,20,50,0,0,5,0,-5,0,0,4,5,540,300,500,100,0,52,45,47,47, Purifying Herb, Red Goblin Toad,20,5 - Dino Freezer,3,3,39,2105,0,240,270,110,99,186,192,20,50,0,0,-7,0,0,0,8,128,20,600,240,500,140,0,78,122,48,134, Dynamite, Tundra Battleax,10,122 - Leck Guarder,11,5,42,17250,0,750,273,219,62,139,269,15,30,0,0,9,0,0,0,0,201,25,240,600,500,160,1,400,1250,0,0, , Inferno Battleax,0,100 - Scaly Warrior,5,5,30,1334,0,230,195,108,41,124,288,20,50,0,0,0,0,0,-4,0,0,10,360,240,500,80,0,45,51,23,93, Holy Wound Salve, Seed of Moves,15,3 - Nyarmot,5,5,41,1921,0,220,235,85,70,162,250,20,50,0,0,7,0,-3,0,0,0,10,600,300,500,80,0,81,67,39,97, Tight Dress, Panacea,125,10 - Ancient Warrior,7,7,45,2346,0,360,327,128,63,146,269,20,50,15,0,8,0,0,0,-7,130,10,600,270,500,80,0,97,86,14,196, Golden Potion, Reflect Mail,10,125 - Tarantula,2,2,38,1461,0,90,231,99,60,116,269,20,50,0,0,0,0,0,0,0,4,5,600,360,500,100,0,53,94,43,45, Panacea, Spiderweb,15,10 - Killer Tree,6,6,44,2657,0,280,382,141,71,75,250,20,50,0,0,9,0,-6,0,0,128,15,600,180,500,80,0,117,34,6,186, All-Around Seed, Omnipotent Seed,1,125 - Giant Crab,2,2,19,644,0,80,152,70,69,86,250,20,50,0,0,0,0,5,0,0,0,5,720,240,500,60,0,36,37,37,12, Healing Herb, Quake Stone,10,2 - Snow Leopard,4,4,42,5290,320,0,267,191,102,165,192,20,50,30,0,-5,0,0,0,10,130,10,420,300,500,120,0,150,175,160,150, Icefang Stone, Pretty Necklace,10,1 - Desert Diver,4,4,37,1495,0,250,173,95,60,127,269,20,50,0,0,6,-8,10,0,0,0,5,300,210,500,70,0,56,58,44,126, Vaccine, Revival Gem,10,2 - Dual Fist,12,2,50,21850,0,660,346,152,73,158,250,15,30,0,0,0,-5,0,0,9,202,10,360,540,500,200,1,450,1600,0,1200, Omnipotent Seed, Elf King's Boots,2,120 - Evil Maneuver,7,7,42,2243,240,260,282,116,53,103,288,20,50,0,0,0,0,-3,8,0,10,10,600,240,500,130,0,105,114,59,32, Thor Stone, Seed of Psyche,10,3 - Emerald Bird,1,1,45,2139,160,320,309,123,81,244,192,20,50,0,0,-4,0,0,0,7,128,5,480,330,500,120,0,108,96,156,271, Magical Medicine, Gold Feather,10,125 - Death Doberman,4,4,44,2059,270,0,291,139,80,173,192,20,50,0,0,-3,10,0,0,0,0,5,600,270,500,130,0,83,13,115,106, Yomi's Elixir, Red Hair Ribbon,10,125 - Mind Eater,7,7,47,2530,280,330,263,134,43,285,288,20,50,0,0,0,0,0,9,-3,10,5,420,300,500,80,0,128,12,27,142, Mana Crystals, Magical Medicine,121,10 - Vein Brain,7,7,28,920,130,0,153,122,80,196,230,20,50,0,0,-5,0,0,7,0,12,0,960,390,500,90,0,17,8,65,72, Electrum Stone, Seed of Magic,15,3 - Devil,6,6,50,6670,630,0,303,166,72,204,250,20,50,5,0,5,0,0,0,-2,160,5,30,240,500,100,1,20,270,320,240, Jet-Black Cape, Demon Ash,122,2 - Dragon Knight,3,3,42,2450,60,290,315,130,95,158,192,20,50,0,0,0,-6,0,6,0,128,10,600,300,500,120,0,92,98,73,171, Dragon Wand, Scarlet Potion,122,10 - Guardian,13,6,50,19550,260,690,324,194,74,213,250,10,30,0,0,0,0,-5,8,5,237,15,150,300,500,150,1,500,0,2000,1600, Omnipotent Seed, Phoenix Ring,2,120 - Valmar Magna,14,8,51,23000,440,700,336,225,79,178,230,10,30,0,0,5,0,0,0,0,224,10,270,300,500,180,1,600,50,300,1500, Brave Dirk, Mystic Potion,1,20 - Valmar Moth,8,8,51,3680,0,0,303,242,142,104,192,15,50,0,0,7,0,0,0,0,128,5,60,120,500,90,0,100,60,50,80, Yomi's Elixir, Meteor Scroll,10,1 - Millenia,16,5,11,100000,80,77,106,127,66,70,192,15,30,5,15,0,0,0,0,0,255,10,825,310,210,60,1,0,0,0,0, , ,0,0 - Beast-Man,17,5,16,4800,49,144,150,144,88,61,192,15,30,5,15,0,0,0,0,0,202,40,750,320,210,80,1,150,100,0,0, , ,0,0 - Eyeball Bat,29,8,30,3500,0,370,148,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,500,70,1,50,225,225,195, , Book of Warriors,0,120 - Tio Clone,18,5,43,30000,190,165,274,282,196,168,192,10,30,100,0,0,0,0,0,0,219,15,850,300,210,60,1,900,4000,4000,0, , Balor,0,100 - Millenia,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,210,60,1,0,3000,0,0, , Black Angel Bow,0,100 +Name,Unknown #1,Unknown #2,Type 1,Type 2,Level,Health,MP,SP,VIT,AGI,SPD,MEN,Stamina,IP Stun,IP Cancel Stun,Evasion Still %,Evasion Moving %,Fire Resist %,Wind Resist %,Earth Resist %,Lightning Resist %,Blizzard Resist %,Status Effect Resist Bitflag,Knockback Resist,Status Recovery Time,T_DMG,Unknown #3,T_HEAL,Size,Unknown #4,Unknown #5,No Run,Unknown #6,EXP,Skill Coins,Magic Coins,Gold Coins,Item 1,Item 2,Item 1 Chance,Item 2 Chance,Unknown #7 + Big Foot,1,1,5,5,19,863,0,0,162,86,70,107,250,20,50,0,0,-8,0,0,0,9,0,20,660,240,0,500,90,200,0,0,0,29,47,35,46, Myriad Power Nut, Lumir Flower,10,3,0 + Huge Caterpillar,2,1,2,2,19,725,0,0,131,76,50,97,288,20,50,0,0,0,0,0,0,0,6,10,600,270,0,500,100,200,0,0,0,21,33,36,5, Poison Antidote, Pretty Ring,15,2,0 + Chameleon,3,1,3,3,24,897,0,0,167,87,64,125,269,20,50,0,0,0,0,0,0,0,1,5,600,330,0,500,100,200,0,0,0,14,27,13,50, Purifying Herb, Mirage Earring,15,3,0 + Granas Knight,4,1,5,5,40,2795,0,0,246,109,45,137,307,20,50,0,0,0,0,0,0,0,0,10,600,240,0,500,80,200,0,1,0,90,150,0,200, Paladin Helmet, Paladin Armor,15,5,0 + Frost Frog,6,1,3,3,13,460,0,0,113,77,98,67,192,20,50,0,0,-3,0,0,0,5,0,5,840,240,0,500,90,200,0,0,0,11,26,17,37, Eye Drops, Toad Oil,30,8,0 + Star Mirage,7,1,1,1,21,828,0,160,129,84,78,112,230,20,50,0,0,0,0,6,0,-5,8,0,600,240,0,500,100,200,0,0,0,16,39,19,73, Eye Drops, Seed of Running,10,2,0 + Giga Mantis,8,1,2,2,34,1679,0,0,218,92,80,102,230,20,50,0,0,0,0,-4,6,0,0,10,480,420,0,500,100,200,0,0,0,42,49,16,53, Healing Fruit, Dragon Bone Helm,15,5,0 + Fenny Bird,9,1,1,1,35,1806,0,0,186,113,100,152,192,20,50,25,0,8,-6,0,0,-8,0,0,540,240,0,500,100,200,0,0,0,49,14,76,26, Silver Feather, Seed of Swift,5,1,0 + Crag Snake,10,1,3,3,11,322,0,0,125,80,99,53,192,20,50,0,0,0,0,5,0,0,1,5,720,450,0,500,100,200,0,0,0,12,24,20,27, Poison Antidote, Snake Earrings,20,5,0 + Hammerhead,12,1,3,3,20,955,0,180,165,92,102,93,192,20,50,0,0,0,0,0,7,-2,0,20,780,360,0,500,130,200,0,0,0,33,48,38,48, Paralysis Salve, Seed of Life,15,3,0 + Durham Minotaur,13,2,11,5,19,4830,0,360,140,126,60,110,269,20,50,0,0,0,-3,10,-6,0,130,25,300,540,0,500,150,200,0,1,0,210,720,0,0, , Adventure Book,0,100,0 + Troglodyte,14,1,5,5,13,1127,0,210,118,74,40,90,288,20,50,10,0,-3,0,0,0,4,128,10,420,300,0,500,80,200,0,1,0,24,40,10,160, Whirlwind Scroll, Mist Egg,10,120,0 + Twin Ogre,16,1,5,5,20,782,0,130,150,81,70,117,250,20,50,0,0,0,0,0,0,0,0,10,540,240,0,500,80,200,0,0,0,27,52,29,38, Hand Grenade, Ogre Helm,15,3,0 + Warp Warrior,17,1,7,7,27,978,0,280,194,82,66,136,269,20,50,0,0,0,7,-8,0,0,130,10,600,300,0,500,80,200,0,0,0,28,59,3,41, Move Blessing, Dark Ring,10,2,0 + Mottled Spider,18,1,2,2,10,300,0,60,110,53,59,60,269,20,50,0,0,0,0,0,0,0,0,5,780,300,0,500,90,200,0,0,0,8,15,5,2, Medicinal Herb, Slowpoke Nut,20,5,0 + Man-Eating Tree,19,1,6,6,31,1541,0,140,240,80,72,82,250,20,50,0,0,-6,0,0,0,0,136,15,540,420,0,500,70,200,0,0,0,54,63,51,70, Healing Incense, Divine Talisman,15,125,0 + Crimson Claw,20,1,2,2,30,1415,0,170,220,97,71,108,250,20,50,0,0,0,0,6,-5,0,2,5,600,300,0,500,60,200,0,0,0,31,41,28,65, Patience Nut, Blessing Scroll,10,5,0 + Land Cougar,21,1,4,4,26,1150,180,0,170,118,103,142,192,20,50,20,0,0,8,3,0,0,8,10,480,480,0,500,120,200,0,0,0,25,17,49,22, Scroll of Alheal, Gale Stone,20,5,0 + Sandman,22,1,4,4,15,391,0,120,103,68,60,94,269,20,50,0,0,0,0,8,0,0,0,5,720,240,0,500,70,200,0,0,0,13,16,15,25, Hand Grenade, Sandman Whiskers,10,2,0 + Crimson Tail,23,2,12,2,36,11270,0,620,230,156,73,128,250,15,30,0,0,0,0,7,-5,0,202,10,210,450,0,500,190,200,0,1,0,250,1200,300,1000, All-Around Seed, Soul Egg,2,120,0 + Skull Snail,24,1,7,7,27,1058,150,110,170,77,51,144,288,20,50,0,0,-4,0,7,0,7,2,10,720,300,0,500,120,200,0,0,0,30,25,46,15, Icefang Stone, Bone Harp,15,5,0 + Clay Bird,25,1,1,1,32,2070,140,150,221,106,79,133,192,20,50,0,0,0,-7,9,0,0,128,5,360,300,0,500,120,200,0,0,0,72,89,127,119, Scattering Stone, Silver Feather,10,1,0 + Hellhound,26,1,4,4,22,667,110,0,159,102,82,138,192,20,50,0,0,7,0,0,0,-7,0,5,420,240,0,500,120,200,0,0,0,19,22,53,54, Firebomb, Ogre Slayer,15,1,0 + Ghoul,27,1,7,7,17,771,70,100,135,79,42,115,288,20,50,0,0,-3,0,0,0,6,2,5,540,360,0,500,70,200,0,0,0,15,19,30,34, Weakness Nut, Yomi's Elixir,10,5,0 + Brain Bat,28,1,7,7,41,1702,250,0,176,114,80,236,230,20,50,0,0,0,9,0,0,0,0,0,600,300,0,500,90,200,0,0,0,60,32,135,103, Yomi's Elixir, Seed of Spells,10,3,0 + Gargoyle,29,1,6,6,10,437,80,0,115,47,69,135,250,20,50,0,0,0,0,0,0,0,30,5,480,240,0,500,90,200,0,0,0,18,54,21,12, Holy Ashes, Sword of Purity,20,1,0 + Dragonoid,30,1,3,3,26,1104,50,80,195,98,94,132,192,20,50,0,0,6,0,-5,0,0,0,10,600,300,0,500,120,200,0,0,0,32,31,42,63, Flame Stone, Seed of Power,15,3,0 + Naga Queen,31,2,13,6,43,14375,120,480,248,203,74,184,250,15,30,0,0,0,0,-7,0,8,234,15,180,420,0,500,150,200,0,1,0,375,0,640,800, All-Around Seed, Star Egg,2,120,0 + Valmar Young,34,2,14,8,49,8280,300,560,312,180,83,145,230,15,30,0,0,0,0,0,0,0,224,10,120,480,0,500,170,200,0,1,0,300,750,0,425, Yomi's Elixir, Soul of Asura,10,125,0 + Valmar Fly,35,1,8,8,48,4140,0,0,258,160,139,134,192,20,50,0,0,0,0,0,0,0,0,5,300,300,0,500,80,200,0,1,0,75,375,0,125, Scarlet Potion, Platinum Feather,10,125,0 + Yeti,51,1,5,5,44,2450,0,0,245,107,68,153,250,20,50,0,0,0,5,8,-6,0,128,20,600,360,0,500,100,200,0,0,0,74,9,4,117, Serpentine, Charming Heels,10,125,0 + Venomous Larva,52,1,2,2,38,1863,0,0,204,89,52,130,288,20,50,0,0,7,0,0,0,-4,0,10,600,420,0,500,110,200,0,0,0,57,72,52,56, Healing Incense, Caterpillar Soup,15,5,0 + Salamadile,53,1,3,3,41,1725,0,0,254,100,60,128,269,20,50,0,0,10,-6,0,0,-5,0,5,600,330,0,500,110,200,0,0,0,70,30,84,68, Red Bird Stone, Salamander Tail,10,3,0 + Flame Toad,56,1,3,3,30,1081,0,0,185,91,100,118,192,20,50,0,0,8,0,3,-2,-6,0,5,660,480,0,500,90,200,0,0,0,35,20,32,18, Dynamite, Pretty Bracelet,15,5,0 + Immune Cell,57,1,1,1,39,1771,0,200,215,121,80,156,230,20,50,0,0,0,-4,0,10,0,8,0,600,300,0,500,110,200,0,0,0,64,84,41,64, Sympathy Nut, Binding Circle,10,122,0 + Giant Mantis,58,1,2,2,15,483,0,0,122,82,78,80,230,20,50,0,0,-4,7,0,0,0,0,10,780,240,0,500,100,200,0,0,0,5,11,18,23, Wound Salve, Seed of Defense,15,3,0 + Dodo,59,1,1,1,10,265,0,0,110,58,98,110,192,20,50,0,0,0,0,0,0,0,0,0,840,270,0,500,100,200,0,0,0,6,10,8,7, Medicinal Herb, Healing Herb,20,5,0 + Pit Viper,60,1,3,3,32,1242,0,0,197,101,101,122,192,20,50,0,0,5,0,-5,0,0,4,5,540,300,0,500,100,200,0,0,0,52,45,47,47, Purifying Herb, Red Goblin Toad,20,5,0 + Dino Freezer,62,1,3,3,39,2105,0,240,270,110,99,186,192,20,50,0,0,-7,0,0,0,8,128,20,600,240,0,500,140,200,0,0,0,78,122,48,134, Dynamite, Tundra Battleax,10,122,0 + Leck Guarder,63,2,11,5,42,17250,0,750,273,219,62,139,269,15,30,0,0,9,0,0,0,0,201,25,240,600,0,500,160,200,0,1,0,400,1250,0,0, , Inferno Battleax,0,100,0 + Scaly Warrior,64,1,5,5,30,1334,0,230,195,108,41,124,288,20,50,0,0,0,0,0,-4,0,0,10,360,240,0,500,80,200,0,0,0,45,51,23,93, Holy Wound Salve, Seed of Moves,15,3,0 + Nyarmot,66,1,5,5,41,1921,0,220,235,85,70,162,250,20,50,0,0,7,0,-3,0,0,0,10,600,300,0,500,80,200,0,0,0,81,67,39,97, Tight Dress, Panacea,125,10,0 + Ancient Warrior,67,1,7,7,45,2346,0,360,327,128,63,146,269,20,50,15,0,8,0,0,0,-7,130,10,600,270,0,500,80,200,0,0,0,97,86,14,196, Golden Potion, Reflect Mail,10,125,0 + Tarantula,68,1,2,2,38,1461,0,90,231,99,60,116,269,20,50,0,0,0,0,0,0,0,4,5,600,360,0,500,100,200,0,0,0,53,94,43,45, Panacea, Spiderweb,15,10,0 + Killer Tree,69,1,6,6,44,2657,0,280,382,141,71,75,250,20,50,0,0,9,0,-6,0,0,128,15,600,180,0,500,80,200,0,0,0,117,34,6,186, All-Around Seed, Omnipotent Seed,1,125,0 + Giant Crab,70,1,2,2,19,644,0,80,152,70,69,86,250,20,50,0,0,0,0,5,0,0,0,5,720,240,0,500,60,200,0,0,0,36,37,37,12, Healing Herb, Quake Stone,10,2,0 + Snow Leopard,71,1,4,4,42,5290,320,0,267,191,102,165,192,20,50,30,0,-5,0,0,0,10,130,10,420,300,0,500,120,200,0,0,0,150,175,160,150, Icefang Stone, Pretty Necklace,10,1,0 + Desert Diver,72,1,4,4,37,1495,0,250,173,95,60,127,269,20,50,0,0,6,-8,10,0,0,0,5,300,210,0,500,70,200,0,0,0,56,58,44,126, Vaccine, Revival Gem,10,2,0 + Dual Fist,73,2,12,2,50,21850,0,660,346,152,73,158,250,15,30,0,0,0,-5,0,0,9,202,10,360,540,0,500,200,200,0,1,0,450,1600,0,1200, Omnipotent Seed, Elf King's Boots,2,120,0 + Evil Maneuver,74,1,7,7,42,2243,240,260,282,116,53,103,288,20,50,0,0,0,0,-3,8,0,10,10,600,240,0,500,130,200,0,0,0,105,114,59,32, Thor Stone, Seed of Psyche,10,3,0 + Emerald Bird,75,1,1,1,45,2139,160,320,309,123,81,244,192,20,50,0,0,-4,0,0,0,7,128,5,480,330,0,500,120,200,0,0,0,108,96,156,271, Magical Medicine, Gold Feather,10,125,0 + Death Doberman,76,1,4,4,44,2059,270,0,291,139,80,173,192,20,50,0,0,-3,10,0,0,0,0,5,600,270,0,500,130,200,0,0,0,83,13,115,106, Yomi's Elixir, Red Hair Ribbon,10,125,0 + Mind Eater,77,1,7,7,47,2530,280,330,263,134,43,285,288,20,50,0,0,0,0,0,9,-3,10,5,420,300,0,500,80,200,0,0,0,128,12,27,142, Mana Crystals, Magical Medicine,121,10,0 + Vein Brain,78,1,7,7,28,920,130,0,153,122,80,196,230,20,50,0,0,-5,0,0,7,0,12,0,960,390,0,500,90,200,0,0,0,17,8,65,72, Electrum Stone, Seed of Magic,15,3,0 + Devil,79,1,6,6,50,6670,630,0,303,166,72,204,250,20,50,5,0,5,0,0,0,-2,160,5,30,240,0,500,100,200,0,1,0,20,270,320,240, Jet-Black Cape, Demon Ash,122,2,0 + Dragon Knight,80,1,3,3,42,2450,60,290,315,130,95,158,192,20,50,0,0,0,-6,0,6,0,128,10,600,300,0,500,120,200,0,0,0,92,98,73,171, Dragon Wand, Scarlet Potion,122,10,0 + Guardian,81,2,13,6,50,19550,260,690,324,194,74,213,250,10,30,0,0,0,0,-5,8,5,237,15,150,300,0,500,150,200,0,1,0,500,0,2000,1600, Omnipotent Seed, Phoenix Ring,2,120,0 + Valmar Magna,84,2,14,8,51,23000,440,700,336,225,79,178,230,10,30,0,0,5,0,0,0,0,224,10,270,300,0,500,180,200,0,1,0,600,50,300,1500, Brave Dirk, Mystic Potion,1,20,0 + Valmar Moth,85,1,8,8,51,3680,0,0,303,242,142,104,192,15,50,0,0,7,0,0,0,0,128,5,60,120,0,500,90,200,0,0,0,100,60,50,80, Yomi's Elixir, Meteor Scroll,10,1,0 + Millenia,0,2,16,5,11,100000,80,77,106,127,66,70,192,15,30,5,15,0,0,0,0,0,255,10,825,310,480,210,60,170,0,1,0,0,0,0,0, , ,0,0,0 + Beast-Man,0,2,17,5,16,4800,49,144,150,144,88,61,192,15,30,5,15,0,0,0,0,0,202,40,750,320,480,210,80,200,0,1,0,150,100,0,0, , ,0,0,0 + Eyeball Bat,0,1,29,8,30,3500,0,370,148,105,100,126,192,15,50,0,0,0,0,5,0,0,145,5,360,360,0,500,70,200,0,1,0,50,225,225,195, , Book of Warriors,0,120,0 + Tio Clone,0,2,18,5,43,30000,190,165,274,282,196,168,192,10,30,100,0,0,0,0,0,0,219,15,850,300,480,210,60,155,85,1,0,900,4000,4000,0, , Balor,0,100,0 + Millenia,0,2,19,5,48,23000,247,192,291,224,104,155,192,10,30,0,0,0,0,0,0,0,224,10,825,310,480,210,60,170,0,1,0,0,3000,0,0, , Black Angel Bow,0,100,0 From 2130a8ec3a1c5340c8917ea85fc9573d504b01da Mon Sep 17 00:00:00 2001 From: krogenth Date: Thu, 13 Apr 2023 11:53:33 -0400 Subject: [PATCH 4/7] add equipment specials dropdown, add items csv generation --- definitions.json | 731 ++++++++++++++++++------------- docs/ITEMS.CSV | 800 ++++++++++++++++++++++++++++++++++ src/items/Items.cpp | 110 ++++- src/moves/Specials.cpp | 4 +- vs/G2DataGUI/definitions.json | 428 ------------------ 5 files changed, 1348 insertions(+), 725 deletions(-) create mode 100644 docs/ITEMS.CSV delete mode 100644 vs/G2DataGUI/definitions.json diff --git a/definitions.json b/definitions.json index ee85633..1b81e63 100644 --- a/definitions.json +++ b/definitions.json @@ -1,296 +1,439 @@ { - "icons": [ - "Fire", - "Wind", - "Earth", - "Lightning", - "Blizzard", - "Water", - "Explosion", - "Forest", - "Light", - "Darkness", - "Sword", - "Staff", - "Crossbow", - "Dagger", - "Poleaxe", - "Chakram", - "Red Shoe" - ], - "targetEffects": [ - "NULL", - "Restore HP(MEN)", - "Restore MP", - "Restore SP", - "Ally Buff/Debuff", - "Physical Damage(STR)", - "Magical Damage(MAG)", - "Enemy Buff/Debuff", - "Status Change", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Special" - ], - "targetTypes": [ - "NULL", - "One Ally", - "Area Allies", - "All Allies", - "One Enemy", - "Area Enemies", - "All Enemies", - "Enemy Line", - "Self", - "Unknown", - "Area Around Self", - "Unknown", - "Unknown", - "Area Around Self", - "Unknown", - "Unknown" - ], - "elements": [ - "Fire", - "Wind", - "Earth", - "Lightning", - "Blizzard" - ], - "itemEntries": [ - "NULL", - "Item", - "Item", - "Perm. Stat Modifier(?)", - "Weapon", - "Armour", - "Headgear", - "Footwear", - "Accessory", - "Mana Egg", - "Unknown", - "Valuable", - "Skillbook", - "Special", - "Unknown", - "Unknown" - ], - "effectiveOn": [ - "NULL", - "Bird", - "Bug/Crustacean", - "Reptile", - "Animal", - "Humanoid", - "Unknown", - "Undead", - "Valmar", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown" - ], - "books": [ - "NULL", - "Adventure Book", - "Book of Wizards", - "Book of Warriors", - "Book of Priests", - "Book of Gales", - "Book of Swords", - "Book of War", - "Book of Sages", - "Book of Learning" - ], - "eggs": [ - "NULL", - "Holy Egg", - "Chaos Egg", - "Mist Egg", - "Gravity Egg", - "Soul Egg", - "Star Egg", - "Tutor Egg", - "Change Egg", - "Fairy Egg", - "Dragon Egg" - ], - "specials": [ - "NULL", - "Ryudo", - "Elena", - "Millenia", - "Roan", - "Tio", - "Mareg", - "Prince Roan", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL" - ], - "characters": [ - "Ryudo", - "Elena", - "Millenia", - "Roan", - "Tio", - "Mareg", - "Prince Roan", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL" - ], - "animations": [ - "Physical Attack", - "Burn!", - "Burnflame", - "Burnstrike", - "Hellburner", - "Howl", - "Howlslash", - "Howlnado", - "Runner", - "Shhh!", - "Snooze", - "Heal", - "Healer", - "Healer+", - "Alhealer", - "Resurrect", - "Tremor", - "Quake", - "Diggin'", - "Def-Loss", - "Gravity", - "BOOM!", - "BA-BOOM!", - "Meteor Strike", - "WOW!", - "Zap!", - "Zap All", - "GadZap", - "DragonZap", - "Stram", - "Poizn", - "Speedy", - "Craze", - "Cure", - "Refresh", - "Halvah", - "Crackle", - "Crackling", - "Cold", - "Freeze!", - "Fiora", - "unknown 1", - "unknown 2", - "unknown 3", - "unknown 4", - "unknown 5", - "Alhealer", - "unknown 7", - "unknown 8", - "Glitter/Confetti", - "Alheal", - "Healer(Teal)", - "Healer+(Teal)", - "Healer(Green)", - "Alhealer(Green)", - "unknown 15", - "Bomb", - "Vanish", - "unknown17", - "unknown 18", - "unknown 19", - "Tenseiken Slash", - "Flying Tenseiken", - "Purple Lightning", - "Sky Dragon Slash", - "unknown 20", - "unknown 21", - "Impact Bomb", - "Nightmare Ball", - "Droplets of Life", - "White Apocalypse", - "unknown 22", - "unknown 23", - "Arrow Shot", - "Heel Crush", - "Fallen Wings", - "Starving Tongue", - "Spellbinding Eye", - "Grudging Claws", - "Golden Hammer", - "Snowball Fight!", - "Dragon Rise", - "Vitality March", - "unknown 24", - "unknown 25", - "Lotus Flower", - "Tornado", - "Fast Dance-Whirl", - "Whisper to Stars", - "unknown 26", - "unknown 27", - "Beast-Fang Cut", - "Beat-King Blast", - "Beast-King Smash", - "Lion's Roar", - "unknown 28", - "unknown 29", - "Golden Hammer", - "Ice Prison", - "True Dragon Rise", - "Vitality March", - "Taint of Wind", - "unknown 30", - "unknown 31", - "unknown 32", - "unknown 33", - "unknown 34", - "unknown 35", - "unknown 36", - "unknown 37", - "unknown 38", - "unknown 39", - "unknown 40", - "unknown 41", - "unknown 42", - "unknown 43", - "unknown 44", - "unknown 45", - "unknown 46", - "unknown 47", - "unknown 48", - "unknown 49", - "unknown 50", - "unknown 51", - "unknown 52", - "unknown 53", - "unknown 54", - "unknown 55" - ], - "statuses": [ - "Poison", - "Sleep", - "Paralysis", - "Confusion", - "Plague", - "Magic Block", - "Move Block", - "Death" - ] + "icons": [ + "Fire", + "Wind", + "Earth", + "Lightning", + "Blizzard", + "Water", + "Explosion", + "Forest", + "Light", + "Darkness", + "Sword", + "Staff", + "Crossbow", + "Dagger", + "Poleaxe", + "Chakram", + "Red Shoe" + ], + "targetEffects": [ + "NULL", + "Restore HP(MEN)", + "Restore MP", + "Restore SP", + "Ally Buff/Debuff", + "Physical Damage(STR)", + "Magical Damage(MAG)", + "Enemy Buff/Debuff", + "Status Change", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Special" + ], + "targetTypes": [ + "NULL", + "One Ally", + "Area Allies", + "All Allies", + "One Enemy", + "Area Enemies", + "All Enemies", + "Enemy Line", + "Self", + "Unknown", + "Area Around Self", + "Unknown", + "Unknown", + "Area Around Self", + "Unknown", + "Unknown" + ], + "elements": [ + "Fire", + "Wind", + "Earth", + "Lightning", + "Blizzard" + ], + "itemEntries": [ + "NULL", + "Item", + "Item", + "Perm. Stat Modifier(?)", + "Weapon", + "Armour", + "Headgear", + "Footwear", + "Accessory", + "Mana Egg", + "Unknown", + "Valuable", + "Skillbook", + "Special", + "Unknown", + "Unknown" + ], + "effectiveOn": [ + "NULL", + "Bird", + "Bug/Crustacean", + "Reptile", + "Animal", + "Humanoid", + "Unknown", + "Undead", + "Valmar", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown", + "Unknown" + ], + "books": [ + "NULL", + "Adventure Book", + "Book of Wizards", + "Book of Warriors", + "Book of Priests", + "Book of Gales", + "Book of Swords", + "Book of War", + "Book of Sages", + "Book of Learning" + ], + "eggs": [ + "NULL", + "Holy Egg", + "Chaos Egg", + "Mist Egg", + "Gravity Egg", + "Soul Egg", + "Star Egg", + "Tutor Egg", + "Change Egg", + "Fairy Egg", + "Dragon Egg" + ], + "specialChars": [ + "NULL", + "Ryudo", + "Elena", + "Millenia", + "Roan", + "Tio", + "Mareg", + "Prince Roan", + "NULL", + "NULL", + "NULL", + "NULL", + "NULL", + "NULL" + ], + "characters": [ + "Ryudo", + "Elena", + "Millenia", + "Roan", + "Tio", + "Mareg", + "Prince Roan", + "NULL", + "NULL", + "NULL", + "NULL", + "NULL", + "NULL" + ], + "statuses": [ + "Poison", + "Sleep", + "Paralysis", + "Confusion", + "Plague", + "Magic Block", + "Move Block", + "Death" + ], + "animations": [ + "Physical Attack", + "Burn!", + "Burnflame", + "Burnstrike", + "Hellburner", + "Howl", + "Howlslash", + "Howlnado", + "Runner", + "Shhh!", + "Snooze", + "Heal", + "Healer", + "Healer+", + "Alhealer", + "Resurrect", + "Tremor", + "Quake", + "Diggin'", + "Def-Loss", + "Gravity", + "BOOM!", + "BA-BOOM!", + "Meteor Strike", + "WOW!", + "Zap!", + "Zap All", + "GadZap", + "DragonZap", + "Stram", + "Poizn", + "Speedy", + "Craze", + "Cure", + "Refresh", + "Halvah", + "Crackle", + "Crackling", + "Cold", + "Freeze!", + "Fiora", + "unknown 1", + "unknown 2", + "unknown 3", + "unknown 4", + "unknown 5", + "Alhealer", + "unknown 7", + "unknown 8", + "Glitter/Confetti", + "Alheal", + "Healer(Teal)", + "Healer+(Teal)", + "Healer(Green)", + "Alhealer(Green)", + "unknown 15", + "Bomb", + "Vanish", + "unknown17", + "unknown 18", + "unknown 19", + "Tenseiken Slash", + "Flying Tenseiken", + "Purple Lightning", + "Sky Dragon Slash", + "unknown 20", + "unknown 21", + "Impact Bomb", + "Nightmare Ball", + "Droplets of Life", + "White Apocalypse", + "unknown 22", + "unknown 23", + "Arrow Shot", + "Heel Crush", + "Fallen Wings", + "Starving Tongue", + "Spellbinding Eye", + "Grudging Claws", + "Golden Hammer", + "Snowball Fight!", + "Dragon Rise", + "Vitality March", + "unknown 24", + "unknown 25", + "Lotus Flower", + "Tornado", + "Fast Dance-Whirl", + "Whisper to Stars", + "unknown 26", + "unknown 27", + "Beast-Fang Cut", + "Beat-King Blast", + "Beast-King Smash", + "Lion's Roar", + "unknown 28", + "unknown 29", + "Golden Hammer", + "Ice Prison", + "True Dragon Rise", + "Vitality March", + "Taint of Wind", + "unknown 30", + "unknown 31", + "unknown 32", + "unknown 33", + "unknown 34", + "unknown 35", + "unknown 36", + "unknown 37", + "unknown 38", + "unknown 39", + "unknown 40", + "unknown 41", + "unknown 42", + "unknown 43", + "unknown 44", + "unknown 45", + "unknown 46", + "unknown 47", + "unknown 48", + "unknown 49", + "unknown 50", + "unknown 51", + "unknown 52", + "unknown 53", + "unknown 54", + "unknown 55" + ], + "equipmentSpecials": [ + "NULL", + "unknown 1", + "unknown 2", + "unknown 3", + "unknown 4", + "unknown 5", + "unknown 6", + "unknown 7", + "unknown 8", + "unknown 9", + "unknown 10", + "unknown 11", + "unknown 12", + "unknown 13", + "unknown 14", + "unknown 15", + "unknown 16", + "unknown 17", + "unknown 18", + "unknown 19", + "unknown 20", + "unknown 21", + "unknown 22", + "unknown 23", + "unknown 24", + "unknown 25", + "unknown 26", + "unknown 27", + "unknown 28", + "unknown 29", + "unknown 30", + "10% damage as HP", + "20% damage as HP", + "30% damage as HP", + "40% damage as HP", + "50% damage as HP", + "60% damage as HP", + "70% damage as HP", + "80% damage as HP", + "90% damage as HP", + "100% damage as HP", + "10% damage as MP(Broken)", + "20% damage as MP(Broken)", + "30% damage as MP(Broken)", + "40% damage as MP(Broken)", + "50% damage as MP(Broken)", + "60% damage as MP(Broken)", + "70% damage as MP(Broken)", + "80% damage as MP(Broken)", + "90% damage as MP(Broken)", + "100% damage as MP(Broken)", + "+1 SP regen", + "+2 SP regen", + "+3 SP regen", + "+4 SP regen", + "+5 SP regen", + "Up power of Moves", + "unknown 31", + "Ups power of Moves", + "unknown 32", + "Raises power of Moves", + "-1 ATK from hit", + "-1 DEF from hit", + "-1 MOV from hit", + "-1 ACT from hit", + "unknown 33", + "unknown 34", + "unknown 35", + "unknown 36", + "unknown 37", + "unknown 38", + "unknown 39", + "Evade attacks", + "unknown 40", + "unknown 41", + "unknown 42", + "+5% evasion", + "+10% evasion", + "+15% evasion", + "+20% evasion", + "+25% evasion", + "Reduce IP slowing", + "Reduce IP slowing", + "Suppress IP slowing", + "Suppress IP slowing", + "Suppress IP slowing", + "+1 SP recover when hit", + "+2 SP recover when hit", + "+3 SP recover when hit", + "+4 SP recover when hit", + "+5 SP recover when hit", + "Negate < 50 damage", + "Negate < 100 damage", + "Negate < 150 damage", + "Negate < 200 damage", + "Negate < 250 damage", + "1% HP regen", + "2% HP regen", + "3% HP regen", + "4% HP regen", + "5% HP regen", + "-5% SP consumption", + "-10% SP consumption", + "-15% SP consumption", + "-20% SP consumption", + "-25% SP consumption", + "-5% MP consumption", + "-10% MP consumption", + "-15% MP consumption", + "-20% MP consumption", + "-25% MP consumption", + "Reflect damage", + "Reflect damage", + "Reflect damage", + "Reflect damage", + "Reflect damage", + "+1 combo attack", + "+2 combo attack", + "Warp", + "Negate knockback", + "Revives character", + "unknown 43", + "Null magic", + "unknown 44", + "unknown 45", + "unknown 46", + "1% MP regen", + "2% MP regen", + "3% MP regen", + "4% MP regen", + "5% MP regen", + "unknown 47", + "unknown 48", + "unknown 49", + "unknown 50", + "unknown 51", + "unknown 52", + "unknown 53", + "unknown 54", + "unknown 55", + "unknown 56" + ] } \ No newline at end of file diff --git a/docs/ITEMS.CSV b/docs/ITEMS.CSV new file mode 100644 index 0000000..39fec49 --- /dev/null +++ b/docs/ITEMS.CSV @@ -0,0 +1,800 @@ +Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Price,"Equipment",Characters Bitflag,Strength,Vitality,Action,Movement,Effective On,Fire Affinity,Wind Affinity,Earth Affinity,Lightning Affinity,Blizzard Affinity,Ailments Bitflag,Ailments Chance,Increase Fire %,Increase Wind %,Increase Earth %,Increase Lightning %,Increase Blizzard %,Increase Water %,Increase Explosion %,Increase Forest %,Special,"Usable",Target Effect,Target Type,Power,Range,Cast Time,Recovery Time,Animation,Effective On,Unknown #1,IP Damage,IP Cancel Damage,Knockback,Element,Element Strength,Ailments Bitflag,Ailments Chance,Attack Mod,Defense Mod,Action Mod,Movement Mod,Break Chance,Special,Unknown #2,Unknown #3 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Date 8/16,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,100,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,72,0,0 + Debug Item,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,50,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,73,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Roan's Medal,A memento of Roan's mother ,Valuable,3,53,53,3,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Poff Nut,A fuzzy nut Not edible ,Valuable,3,44,44,44,0,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Missanga,Returns SC used on Mareg's moves ,Special,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,74,0,0 + Xô|óœðwñ²ñ,‹öë÷ ,Valuable,3,53,53,45,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Adventure Book,Lets you learn combat skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 1,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Wizards,Lets you learn wizardry skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 2,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Warriors,Lets you learn warrior skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 3,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Priests,Lets you learn priestly skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 4,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Gales,Lets you learn wind-control skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 5,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Swords,Lets you learn swordsmanship skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 6,,,,,,,,,,,,,,,,,,,,,,,,, + Book of War,Lets you learn martial art skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 7,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Sages,Lets you learn magical skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 8,,,,,,,,,,,,,,,,,,,,,,,,, + Book of Learning,A textbook used in tutorials ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 9,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Seed of Life,+10 Maximum HP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,63,0,0 + Seed of Spells,+10 Maximum MP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,64,0,0 + Seed of Moves,+10 Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,65,0,0 + Seed of Power,+3 STR ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,66,0,0 + Seed of Defense,+3 VIT ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,67,0,0 + Seed of Swift,+3 AGI ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,68,0,0 + Seed of Running,+3 SPD ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,69,0,0 + Seed of Magic,+3 MAG ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,70,0,0 + Seed of Psyche,+3 MEN ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,71,0,0 + All-Around Seed,+10 Maximum HP/Maximum MP/Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,72,0,0 + Omnipotent Seed,+3 STR/VIT/AGI/SPD/MAG/MEN ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,73,0,0 + Lore of Moves,+1000 Special Coins (SC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,61,0,0 + Lore of Magic,+1000 Magic Coins (MC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,62,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Miracle Scales,Carrying it doubles gold earned ,Unknown,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Soul of a Hero,Carrying it doubles EXP earned ,Unknown,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Astral Miracle,Carrying it doubles SC earned ,Unknown,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Ethereal Miracle,Carrying it doubles MC earned ,Unknown,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Mystic Potion,Restores all HP ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,9999,0,180,30, Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Scarlet Potion,Restores 1600 HP ,Item,1,47,47,47,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1600,0,150,30, Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Fruit,Restores 1200 HP ,Item,0,44,44,42,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1200,0,150,30, Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Holy Wound Salve,Restores 800 HP ,Item,0,47,47,47,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,800,0,120,0, Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Wound Salve,Restores 400 HP ,Item,0,47,47,47,0,24,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,400,0,120,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Medicinal Herb,Restores 200 HP ,Item,0,43,43,43,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,200,0,90,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Potion of Azure,Restores 1500 HP ,Item,2,47,47,47,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1500,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Incense,Restores 1000 HP ,Item,1,43,43,43,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1000,0,150,30, Alhealer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Scroll of Alheal,Restores 500 HP ,Item,0,53,53,45,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,500,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Herb,Restores 250 HP ,Item,0,43,43,43,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,250,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Miracle Elixir,Revives character |right to COM ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,9999,0,240,60, Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,21,0,0 + Hero's Elixir,Revives character |+5 all levels ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,240,60, Resurrect,NULL,0,0,0,0,Fire,0,128,100,5,5,5,5,100,0,0,0 + Yomi's Elixir,Revives a fallen character ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,180,30, Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,0,0,0 + Panacea,Cures all status disorders ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,150,30, Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,100,0,0,0 + Purifying Herb,Cures poison and paralysis ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 + Poison Antidote,Cures poison ,Item,0,43,43,43,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Cure,NULL,0,0,0,0,Fire,0,1,100,0,0,0,0,100,0,0,0 + Paralysis Salve,Cures paralysis ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Cure,NULL,0,0,0,0,Fire,0,4,100,0,0,0,0,100,0,0,0 + Torte's Reedpipe,Awakens sleeping characters ,Item,0,43,43,43,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,0,600,120,0, ,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 + Eye Drops,Awakens sleeping characters ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, ,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 + Smelling Salts,Cures confusion ,Item,0,47,47,47,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, ,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,100,0,0,0 + Blessing Scroll,Releases move/ |magic blocks ,Item,0,53,53,45,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,100,0,0,0 + Move Blessing,Releases move blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Refresh,NULL,0,0,0,0,Fire,0,64,100,0,0,0,0,100,0,0,0 + Magic Blessing,Releases magic blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Refresh,NULL,0,0,0,0,Fire,0,32,100,0,0,0,0,100,0,0,0 + Vaccine,Cures plague ,Item,0,47,47,47,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Halvah,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Indigo Potion,Restores all MP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,999,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Magical Medicine,Restores 100 MP ,Item,1,47,47,47,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,100,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Grail Fruit,Restores 50 MP ,Item,0,44,44,42,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,50,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Lumir Flower,Restores 25 MP ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Nut of Light,Restores all SP Glows faintly ,Item,2,44,44,42,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,All Allies,9999,0,240,60, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Golden Potion,Restores all SP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,999,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Baobab Fruit,Restores 100 SP ,Item,1,44,44,42,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,100,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Butter Roll,Restores 50 SP ,Item,0,53,53,41,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,50,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Blueberry,Restores 25 SP ,Item,0,44,44,42,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Caterpillar Soup,Restores 1000 HP Cures plague ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,1000,600,180,30, ,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 + Fresh Sandwich,Restores 600 HP |Cures poison/para. ,Item,1,53,53,41,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,600,0,150,30, Healer,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 + Toad Oil,Restores 300 HP +2 DEF level ,Item,2,47,47,47,0,80,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,300,0,120,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Calming Harp,Restores 200 HP Chance of breaking ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,200,600,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,25,0,0,0 + Mana Harp,Restores 25 MP Might break ,Item,2,53,53,50,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 + Lion Harp,Restores 25 SP Might break ,Item,2,53,53,50,0,800,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Golden Nut,Restores 72 HP ,Item,2,44,44,44,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,72,0,90,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Golden Statue,Restores 5 MP |Statue of Granas ,Item,2,53,53,2,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,5,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Hyper Mogay Bomb,Power: 2000 Cancel effect ,Item,3,48,48,48,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,2000,0,360,120, ,NULL,0,9999,9999,100,Fire,0,0,0,0,0,0,0,100,0,0,0 + Super Mogay Bomb,Power: 1000 Powerful IP damage effect ,Item,2,48,48,48,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,240,60, ,NULL,0,5000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Mogay Bomb,Power: 500 IP damage effect ,Item,1,48,48,48,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,500,600,150,30, ,NULL,0,2500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Meteor Scroll,Power: 2500 Like |Meteor Strike ,Item,3,53,53,45,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,2500,0,360,120, Meteor Strike,NULL,1,1500,0,120,Fire,0,0,0,0,0,0,0,100,0,0,0 + Thor Stone,Power: 1500 |Lgtning-based ,Item,2,46,46,46,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),All Enemies,1500,0,300,90, Zap All,Unknown,1,750,0,80,Lightning,10,0,0,0,0,0,0,100,0,0,0 + Red Bird Stone,Power: 1200 Fire-based attack ,Item,2,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60, Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,100,0,0,0 + Icefang Stone,Power: 1200 Blizzard-based attack ,Item,0,46,46,46,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60, Crackle,NULL,1,2000,0,50,Blizzard,10,0,0,0,0,0,0,100,0,0,0 + Electrum Stone,Power: 750 Lgtning-based +Paralysys ,Item,0,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,750,600,210,60, Zap!,NULL,0,500,0,50,Lightning,10,4,30,0,0,0,0,100,0,0,0 + Gale Stone,Power: 700 Wind-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Enemy Line,700,300,180,30, Howlslash,NULL,1,500,0,200,Wind,10,0,0,0,0,0,0,100,0,0,0 + Flame Stone,Power: 650 Fire-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30, Burnflame,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Quake Stone,Power: 650 Earth-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30, Tremor,NULL,0,1000,0,50,Earth,10,0,0,0,0,0,0,100,0,0,0 + Fireball Scroll,Power: 400 Fire-based attack ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,400,0,120,0, Burn!,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Whirlwind Scroll,Power: 300 Wind-based attack ,Item,0,53,53,45,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,300,600,150,30, Howl,NULL,0,0,0,0,Wind,10,0,0,0,0,0,0,100,0,0,0 + Serpentine,Power: 1500 Bombs launched on arrows ,Item,2,48,48,48,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,1500,0,240,60, ,NULL,1,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Spiderweb,Power: 1200 -1 MOV level ,Item,2,53,53,53,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1200,600,180,30, ,NULL,0,1000,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 + Dynamite,Power: 1000 ,Item,1,48,48,48,0,240,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,210,60, ,NULL,0,1500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Red Goblin Toad,Power: 900 Poison effect ,Item,0,40,40,40,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,900,0,180,30, ,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 + Holy Ashes,Power: 700 Good |vs. undead ,Item,0,48,48,48,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,700,600,150,30, ,Undead,0,0,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Insecticide Bomb,Power: 650 Fire-based Good vs. bugs ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,650,0,150,30, ,Bug/Crustacean,0,1000,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Makibishi,Power: 600 -1 MOV level ,Item,0,48,48,48,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,600,600,180,30, ,NULL,1,1250,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 + Sandman Whiskers,Power: 500 -1 DEF level Expensive ,Item,2,53,53,53,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,500,0,150,30, ,NULL,0,1250,0,100,Fire,0,0,0,0,-1,0,0,100,0,0,0 + Mushroom Cloud,Power: 400 Fire-based ,Item,0,40,40,40,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,400,0,120,0, ,NULL,0,1250,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Firebomb,Power: 300 Fire-based attack ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30, ,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Hand Grenade,Power: 300 ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30, ,NULL,0,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Goblin Toadstool,Power: 250 Poison effect bomb ,Item,0,40,40,40,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,250,0,120,0, ,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 + Platinum Feather,Greatly increases IP ,Item,3,53,53,49,0,2500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,All Allies,7500,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Gold Feather,Greatly increases IP ,Item,3,53,53,49,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,7500,600,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Silver Feather,Greatly increases IP ,Item,2,53,53,49,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,7500,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Scattering Stone,Scatters bunched-up friends ,Item,1,46,46,46,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,600,120,0, ,NULL,0,0,0,800,Fire,0,0,0,0,0,0,0,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Battle Manicure,+5 ATK level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,5,0,0,0,100,0,0,0 + Face Paint,+5 ACT level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,5,0,100,0,0,0 + Demon Ash,-1 all variable levels ,Item,2,53,53,53,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,-1,-1,-1,-1,100,0,0,0 + Muscle Mushroom,+2 ATK level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 + Guard Mushroom,+2 DEF level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 + Speed Mushroom,+2 ACT level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 + Runner Mushroom,+2 MOV level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,2,100,0,0,0 + WOW! Scroll,+2 ATK level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0, WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 + Diggin' Scroll,+1 DEF level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0, Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 + Speedy Scroll,+2 ACT level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0, Speedy,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 + Runner Scroll,+1 MOV level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0, Runner,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 + Myriad Power Nut,+1 ATK level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,1,0,0,0,100,0,0,0 + Patience Nut,+1 DEF level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 + Sympathy Nut,+1 ACT level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,1,0,100,0,0,0 + Swiftness Nut,+1 MOV level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 + Powerless Nut,-1 ATK level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,-1,0,0,0,100,0,0,0 + Weakness Nut,-1 DEF level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,-1,0,0,100,0,0,0 + Exhaustion Nut,-1 ACT level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 + Slowpoke Nut,-1 MOV level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Kuko Berry,Confusion effect causes intoxication ,Item,0,44,44,44,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,90,0, ,NULL,0,0,0,0,Fire,0,8,90,0,0,0,0,100,0,0,0 + Sleeping Harp,Sleep effect |Might break ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30, ,NULL,0,0,0,0,Fire,0,2,70,0,0,0,0,40,0,0,0 + Silence Lute,Magic block effect Chance of breaking ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30, ,NULL,0,0,0,0,Fire,0,32,70,0,0,0,0,40,0,0,0 + Mermaid Harp,Confusion effect Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30, ,NULL,0,0,0,0,Fire,0,8,70,0,0,0,0,40,0,0,0 + Bone Harp,-2 DEF level |Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,-2,0,0,40,0,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Granasaber,+150 ATK Cuts SP consumption by 15% ,Weapon,3,1,1,1,0,0,,1,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-15% SP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Thor Sword,+125 ATK Lightning-based ,Weapon,2,15,15,15,0,19000,,1,125,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Icefang Sword,+122 ATK Blizzard-based ,Weapon,2,15,15,15,0,18000,,1,122,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Blazing Sword,+120 ATK Fire-based ,Weapon,2,15,15,15,0,17000,,1,120,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Soul Blade,+112 ATK Attack drops enemy's DEF lv ,Weapon,2,15,15,15,0,14000,,1,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 DEF from hit,,,,,,,,,,,,,,,,,,,,,,,,, + Maken Valborg,+100 ATK Drains HP as 10% of damage ,Weapon,3,15,15,15,0,12000,,1,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as HP,,,,,,,,,,,,,,,,,,,,,,,,, + Silence Sword,+85 ATK Magic block ability ,Weapon,2,15,15,15,0,8500,,1,85,0,0,0,0,0,0,0,0,0,32,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Silver Freeze,+80 ATK Blizzard-based [Freeze!] ,Weapon,3,15,15,14,0,7480,,1,80,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Enemy Buff/Debuff,All Enemies,0,0,150,30, Freeze!,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,0,0,0,0 + Sword of Mikage,+77 ATK Prized 1st-class katana ,Weapon,2,15,15,14,0,6900,,1,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Fine Broadsword,+70 ATK Forged by a craftsman ,Weapon,1,15,15,14,0,4500,,1,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Claymore,+60 ATK Huge two-handed sword ,Weapon,1,15,15,14,0,3600,,1,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ogre Slayer,+55 ATK Effective on humanoids ,Weapon,3,15,15,14,0,2600,,1,55,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Swordfish Sword,+52 ATK Made from a swordfish ,Weapon,1,15,15,14,0,2200,,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Shadowblade,+44 ATK -4 MOV Sudden death power ,Weapon,1,15,15,14,0,4000,,1,44,0,0,-4,0,0,0,0,0,0,128,15,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Flamberge,+44 ATK Fire-based sword [Burn!] ,Weapon,3,15,15,14,0,1440,,1,44,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30, Burn!,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 + Sword of Purity,+40 ATK Effective on the undead ,Weapon,3,15,15,14,0,1200,,1,40,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Samurai Blade,+38 ATK Samurai sword ,Weapon,1,15,15,14,0,900,,1,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Army Saber,+32 ATK Sword used in the army ,Weapon,1,15,15,14,0,750,,1,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Shamshir,+26 ATK Lion's tail-shaped curved sword ,Weapon,1,15,15,14,0,620,,1,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Falx,+22 ATK A scythe-shaped curved sword ,Weapon,1,15,15,14,0,500,,1,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Geoblade,+18 ATK A common Geohound's sword ,Weapon,1,15,15,14,0,400,,1,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Zero Broadsword,+0 ATK Powerless curved sword ,Weapon,1,15,15,14,0,0,,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Ghost Staff,+138 ATK Cuts MP consumption by 10% ,Weapon,3,16,16,16,0,0,,2,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Huge Flail,+128 ATK -5 MOV An enormous flail ,Weapon,2,16,16,16,0,17000,,2,128,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Guardian Staff,+118 ATK Earth-based [Diggin'] ,Weapon,2,16,16,16,0,15500,,2,118,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,All Allies,0,0,180,30, Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,0,0,0,0 + Decalogue Staff,+108 ATK Magic/move block effect ,Weapon,2,16,16,16,0,11800,,2,108,0,0,0,0,0,0,0,0,0,96,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Priest's Staff,+99 ATK [Halvah] ,Weapon,2,16,16,16,0,12000,,2,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,240,60, Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,0,0,0,0 + Golden Flail,+92 ATK -5 MOV WAY too heavy ,Weapon,2,16,16,16,0,8200,,2,92,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Silver Flail,+82 ATK -5 MOV ,Weapon,2,16,16,16,0,6800,,2,82,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Aromatic Root,+75 ATK [Refresh] Aromatic tree root ,Weapon,1,16,16,16,0,7200,,2,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,30, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 + Buster Flail,+70 ATK -5 MOV |Very destructive ,Weapon,2,16,16,16,0,4400,,2,70,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Lullaby Staff,+65 ATK Sleep effect ,Weapon,3,16,16,16,0,5880,,2,65,0,0,0,0,0,0,0,0,0,2,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Quarry Staff,+60 ATK Earth-based [Tremor] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60, Tremor,NULL,1,2000,0,50,Earth,10,0,0,0,0,0,0,0,0,0,0 + Whirlwind Staff,+60 ATK Wind-based [Howlslash] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,700,250,240,60, Howlslash,NULL,1,1000,0,200,Wind,10,0,0,0,0,0,0,0,0,0,0 + Blazing Staff,+60 ATK Fire-based [Burnflame] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60, Burnflame,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 + Sister's Staff,+55 ATK [Cure] ,Weapon,1,16,16,16,0,3500,,2,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60, Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,0,0,0,0 + Oracle's Staff,+50 ATK [Cures confusion] ,Weapon,1,16,16,16,0,1800,,2,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,180,30, ,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,0,0,0,0 + Battle Rod,+45 ATK A light nimble combat staff ,Weapon,1,16,16,16,0,960,,2,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Flame Staff,+40 ATK Fire-based [Burn!] ,Weapon,1,16,16,16,0,1250,,2,40,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30, Burn!,NULL,0,0,0,0,Fire,10,0,0,0,0,0,0,0,0,0,0 + Iron Rod,+30 ATK A heavy iron rod ,Weapon,1,16,16,16,0,720,,2,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Prayer Staff,+22 ATK An acolyte's staff ,Weapon,1,16,16,16,0,500,,2,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dragon Wand,+11 ATK Lightning-based [DragonZap] ,Weapon,3,16,16,16,0,15000,,2,11,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,2200,300,420,150, DragonZap,NULL,1,1500,0,120,Lightning,10,4,15,0,0,0,0,0,0,0,0 + Useless Staff,+0 ATK Useless ,Weapon,1,16,16,16,0,0,,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Black Angel Bow,+135 ATK Drains MP as 10% of damage ,Weapon,3,17,17,17,0,22000,,4,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as MP(Broken),,,,,,,,,,,,,,,,,,,,,,,,, + Exorcism Bow,+105 ATK Effective on the undead ,Weapon,3,17,17,17,0,11500,,4,105,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dread Bow,+85 ATK ,Weapon,2,17,17,17,0,7400,,4,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Arbalest,+70 ATK A huge crossbow ,Weapon,1,17,17,17,0,4500,,4,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Flying Fish Bow,+55 ATK |Good on birds ,Weapon,1,17,17,17,0,2400,,4,55,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Burning Bow,+45 ATK Fire-based ,Weapon,3,17,17,17,0,1440,,4,45,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Crossbow,+35 ATK A powerful missile weapon ,Weapon,1,17,17,17,0,860,,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Unstrung Bow,+0 ATK Bow with a loose bowstring ,Weapon,1,17,17,17,0,0,,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Brave Dirk,+145 ATK +5 SP |recov. during combat ,Weapon,3,18,18,19,0,26000,,64,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+5 SP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Dirk,+140 ATK A large dagger [WOW!] ,Weapon,3,18,18,19,0,23000,,64,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,One Ally,0,0,180,30, WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,0,0,0,0 + Gladius,+125 ATK A royal treasure ,Weapon,3,18,18,19,0,0,,64,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sword Breaker,+110 ATK Attack drops enemy ATK lvl. ,Weapon,2,18,18,19,0,14500,,64,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 ATK from hit,,,,,,,,,,,,,,,,,,,,,,,,, + Soul Eater,+75 ATK Drains HP as 10% of damage ,Weapon,3,18,18,18,0,6800,,72,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as HP,,,,,,,,,,,,,,,,,,,,,,,,, + Main Gauche,+62 ATK +10 DEF ,Weapon,2,18,18,18,0,4600,,72,62,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Warp Knife,+55 ATK Warps |during combat ,Weapon,3,18,18,18,0,2750,,72,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Warp,,,,,,,,,,,,,,,,,,,,,,,,, + Poisoned Knife,+50 ATK Poison effect ,Weapon,2,18,18,18,0,2980,,72,50,0,0,0,0,0,0,0,0,0,1,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Flint Knife,+48 ATK Knife made of obsidian ,Weapon,1,18,18,18,0,2000,,72,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ice Pick,+44 ATK Blizzard effect ,Weapon,1,18,18,18,0,1440,,72,44,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hunter's Knife,+36 ATK Effective against animals ,Weapon,1,18,18,18,0,880,,72,36,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Multiple Knife,+28 ATK A multi-function knife ,Weapon,1,18,18,18,0,650,,72,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dull Knife,+0 ATK Knife that cannot cut ,Weapon,1,18,18,18,0,0,,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Phoenix Ring,+142 ATK +1 SP recovery ,Weapon,3,21,21,21,0,25000,,16,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+1 SP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Demon Shuriken,+128 ATK +5 ACT ,Weapon,2,21,21,21,0,19800,,16,128,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Wind Cutter,+122 ATK Wind-based ,Weapon,3,21,21,21,0,18000,,16,122,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Angel Circle,+116 ATK Effective on the undead ,Weapon,3,21,21,21,0,15500,,16,116,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Balor,+108 ATK -5% SP consumption ,Weapon,3,21,21,21,0,13800,,16,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5% SP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Binding Circle,+92 ATK Lightning-based Paralysis ,Weapon,3,21,21,21,0,12000,,16,92,0,0,0,0,0,0,0,8,0,4,50,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Bloody Saucer,+90 ATK Drains HP as 10% of damage ,Weapon,3,21,21,21,0,9200,,16,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as HP,,,,,,,,,,,,,,,,,,,,,,,,, + Discus,+86 ATK Effective on bugs/crustaceans ,Weapon,2,21,21,21,0,8400,,16,86,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Double Moon,+77 ATK Weapon with 2 bladed discs ,Weapon,2,21,21,21,0,6900,,16,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Moon Claw,+68 ATK Crescent-shaped blade weapon ,Weapon,2,21,21,21,0,4480,,16,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Rusty Hoop,+0 ATK Rusty iron hoop a child's toy ,Weapon,1,21,21,21,0,0,,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Leo Rex Battleax,+120 ATK +3 SP |recov. during combat ,Weapon,3,20,20,20,0,16000,,32,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+3 SP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Rune Axe,+107 ATK Reduces IP slowing ,Weapon,2,20,20,20,0,13500,,32,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Tundra Battleax,+101 ATK Blizzard-based [Crackle] ,Weapon,3,20,20,20,0,10000,,32,101,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90, Crackle,NULL,1,4000,0,50,Blizzard,10,0,0,0,0,0,0,0,0,0,0 + Inferno Battleax,+98 ATK Fire-based [Burnstrike] ,Weapon,3,20,20,20,0,9800,,32,98,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90, Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,0,0,0,0 + Bardiche,+86 ATK Battleax with a long blade ,Weapon,2,20,20,20,0,8000,,32,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Earthen Axe,+78 ATK +10 DEF Earth-based ,Weapon,3,20,20,20,0,7500,,32,78,10,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Halberd,+68 ATK Large long-shafted axe ,Weapon,1,20,20,20,0,4400,,32,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dragonfly Slayer,+60 ATK Effective on bugs/crustaceans ,Weapon,2,20,20,20,0,4120,,32,60,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dragonslayer Axe,+58 ATK Effective on reptiles ,Weapon,2,20,20,20,0,3680,,32,58,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hammer Axe,+52 ATK Huge axe used by strongmen ,Weapon,1,20,20,20,0,2200,,32,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Battleax,+42 ATK A broadax used in combat ,Weapon,1,20,20,20,0,1180,,32,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Powerless Axe,+0 ATK |Useless ,Weapon,1,20,20,20,0,0,,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Sword Armor,+75 DEF Raises power of moves ,Armour,3,24,24,24,0,32000,,33,0,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Raises power of Moves,,,,,,,,,,,,,,,,,,,,,,,,, + Moonstone Armor,+65 DEF +Magic |block resis. ,Armour,3,24,24,24,0,20000,,33,0,65,0,0,0,0,0,0,0,0,32,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Paladin Armor,+60 DEF Pois./|para./plag. resis. ,Armour,3,24,24,24,0,18000,,33,0,60,0,0,0,0,0,0,0,0,21,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Halo Armor,+55 DEF Level 2 lightning resis. ,Armour,3,24,24,24,0,16500,,33,0,55,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dragonscale Mail,+50 DEF Made of dragon scale ,Armour,2,24,24,24,0,9800,,33,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Warrior Mail,+45 DEF ,Armour,2,24,24,24,0,8500,,33,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + BlackQuartz Mail,+38 DEF Black magical armor ,Armour,2,24,24,24,0,5500,,33,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Swordfish Armor,+30 DEF Swordfish scale mail ,Armour,1,24,24,24,0,2800,,33,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Plate Mail,+25 DEF Full-body steel armor ,Armour,1,24,24,24,0,1400,,33,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Shoulder Guards,+23 DEF Huge shoulder pads ,Armour,1,24,24,24,0,1280,,33,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Hero's Cuirass,+72 DEF Restores some HP in combat ,Armour,3,24,24,23,0,29000,,121,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Reflect Mail,+68 DEF Sometimes reflects damage ,Armour,3,24,24,23,0,25000,,121,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reflect damage,,,,,,,,,,,,,,,,,,,,,,,,, + Aura Armor,+64 DEF Ups power of moves ,Armour,2,24,24,23,0,19800,,121,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Ups power of Moves,,,,,,,,,,,,,,,,,,,,,,,,, + Dark Armor,+52 DEF +1 SP |Recov. when damaged ,Armour,3,24,24,23,0,13000,,121,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+1 SP recover on hit,,,,,,,,,,,,,,,,,,,,,,,,, + Flame Armor,+46 DEF Level 2 fire resistance ,Armour,3,24,24,23,0,9200,,121,0,46,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Earthen Cuirass,+42 DEF Level 2 earth resis. ,Armour,3,24,24,23,0,8200,,121,0,42,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ancient Cuirass,+32 DEF Reduces IP slowing ,Armour,3,24,24,23,0,3600,,121,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Shell Armor,+26 DEF ,Armour,2,24,24,23,0,1500,,121,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Chain Mail,+20 DEF ,Armour,1,24,24,23,0,950,,121,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Leather Armor,+17 DEF Tanned leather armor ,Armour,1,24,24,23,0,750,,121,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Valkyrie Dress,+74 DEF +5 ACT |Pure white dress ,Armour,3,53,53,26,0,30000,,22,0,74,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Tenma's Dress,+72 DEF Level 2 all attack resistance ,Armour,3,53,53,26,0,28000,,22,0,72,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Resist Dress,+56 DEF Level 1 all attack resistance ,Armour,3,53,53,26,0,17800,,22,0,56,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sylph's Robe,+48 DEF Level 2 wind resistance ,Armour,3,53,53,26,0,12800,,22,0,48,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Red Fur Coat,+46 DEF Level 2 blizzard resistance ,Armour,2,53,53,26,0,9200,,22,0,46,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Mithril Dress,+40 DEF ,Armour,2,53,53,26,0,8000,,22,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Flare Dress,+30 DEF Level 2 fire resistance ,Armour,3,53,53,26,0,2980,,22,0,30,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Crimson Bolero,+22 DEF Passionate red jacket ,Armour,1,53,53,26,0,1120,,22,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Tight Dress,+0 DEF Nulls magic |of friends & foes ,Armour,3,53,53,26,0,10,,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Null magic,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Priestess' Robe,+68 DEF All status disorder resistance ,Armour,3,53,53,25,0,27000,,2,0,68,0,0,0,0,0,0,0,0,127,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Angel's Robe,+62 DEF Restores some HP in combat ,Armour,3,53,53,25,0,18800,,94,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Imperial Garb,+60 DEF Cyrum royal family toga ,Armour,3,53,53,25,0,0,,64,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Priest's Robe,+54 DEF Pois./|para./plag. resis. ,Armour,2,53,53,25,0,16000,,94,0,54,0,0,0,0,0,0,0,0,21,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Purple Robe,+35 DEF Gives paralysis resistance ,Armour,2,53,53,25,0,4500,,94,0,35,0,0,0,0,0,0,0,0,4,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sister's Robe,+35 DEF Poison resist. ,Armour,2,53,53,25,0,4500,,94,0,35,0,0,0,0,0,0,0,0,1,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Pixie's Robe,+26 DEF Sleep/confusion resistance ,Armour,1,53,53,25,0,2600,,94,0,26,0,0,0,0,0,0,0,0,10,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Guardian Robe,+22 DEF +Poison resistance ,Armour,1,53,53,25,0,1200,,94,0,22,0,0,0,0,0,0,0,0,1,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Sun Robe,+70 DEF Reduces IP slowing ,Armour,3,53,53,22,0,27500,,127,0,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Clothes,+58 DEF Gives plague resistance ,Armour,2,53,53,22,0,17200,,127,0,58,0,0,0,0,0,0,0,0,16,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ninja Clothes,+54 DEF |+Evasion by 10% ,Armour,3,53,53,22,0,11500,,127,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+10% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Dragon Vest,+48 DEF +5 MOV ,Armour,2,53,53,22,0,9500,,127,0,48,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ancient Suit,+40 DEF |worn by automata ,Armour,2,53,53,22,0,8000,,127,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Lion Field Garb,+35 DEF +5 ATK ,Armour,2,53,53,22,0,5980,,127,5,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Illusion Clothes,+32 DEF Ups Evasion by 5% ,Armour,2,53,53,22,0,3480,,127,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+5% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Quilted Silk,+18 DEF A magical suit made of silk ,Armour,1,53,53,22,0,800,,127,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Adventure Suit,+16 DEF A heavy suit for adventuring ,Armour,1,53,53,22,0,720,,127,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Leather Jacket,+14 DEF A cowhide jacket ,Armour,1,53,53,22,0,650,,127,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Cuir Bouilli,+12 DEF Boiled leather armor ,Armour,1,53,53,22,0,500,,127,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + God of War Helm,+50 DEF Reduces IP slowing ,Headgear,3,27,27,27,0,12400,,97,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Reflect Helm,+45 DEF Sometimes reflects damage ,Headgear,3,27,27,27,0,11000,,97,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reflect damage,,,,,,,,,,,,,,,,,,,,,,,,, + Paladin Helmet,+44 DEF Gives magic block resistance ,Headgear,3,27,27,27,0,7000,,97,0,44,0,0,0,0,0,0,0,0,64,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Adamantine Helm,+42 DEF Reduces IP slowing ,Headgear,3,27,27,27,0,6200,,97,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Charisma Helm,+38 DEF +5 ACT Cyrum's finest ,Headgear,2,27,27,27,0,8000,,97,0,38,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dragon Bone Helm,+36 DEF Helm carved of dragon backbone ,Headgear,2,27,27,27,0,4000,,97,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Battle Helm,+30 DEF A combat helmet ,Headgear,2,27,27,27,0,3400,,97,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + BlackQuartz Helm,+25 DEF Black magical helmet ,Headgear,2,27,27,27,0,2200,,97,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ogre Helm,+25 DEF -5 MOV A helm with huge horns ,Headgear,1,27,27,27,0,1450,,97,0,25,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Swordfish Helmet,+20 DEF Swordfish scale helmet ,Headgear,1,27,27,27,0,1250,,97,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Iron Helm,+15 DEF Helmet made of iron plate ,Headgear,1,27,27,27,0,600,,97,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Stone Head,+11 DEF |knock-back ,Headgear,1,27,27,27,0,450,,97,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate knockback,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Crown,+48 DEF Suppresses IP slowing ,Headgear,3,53,53,30,0,12000,,86,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Loving Ribbon,+46 DEF Restores some HP in combat ,Headgear,3,53,53,30,0,11500,,22,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Starlight Tiara,+45 DEF Cuts MP consumption by 15% ,Headgear,3,53,53,30,0,11800,,22,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-15% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Moonlight Tiara,+42 DEF Lv 1 conf./|blizzard resis. ,Headgear,2,53,53,30,0,9200,,22,0,42,0,0,0,0,0,0,0,1,8,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Fairy Ribbon,+32 DEF Confusion resistance ,Headgear,3,53,53,30,0,3500,,22,0,32,0,0,0,0,0,0,0,0,8,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Azure Barrette,+30 DEF Lapis lazuli hair ornament ,Headgear,2,53,53,30,0,3400,,22,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Lightning Tiara,+26 DEF Level 1 lightning resistance ,Headgear,2,53,53,30,0,3100,,22,0,26,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Magnolia Bandana,+16 DEF Level 1 earth resistance ,Headgear,1,53,53,30,0,1080,,22,0,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ruby Barrette,+8 DEF Level 1 fire resistance ,Headgear,1,53,53,30,0,350,,22,0,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Silk Hair Band,+2 DEF Elena's favorite hair band ,Headgear,1,53,53,30,0,200,,22,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Red Hair Ribbon,+0 DEF Restores some HP in combat ,Headgear,3,53,53,30,0,10,,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Illusion Bandana,+48 DEF Sometimes evades attacks ,Headgear,3,53,53,29,0,11800,,121,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Evade attacks,,,,,,,,,,,,,,,,,,,,,,,,, + Man's Headband,+36 DEF +10 ATK Suppresses IP slowing ,Headgear,3,53,53,29,0,4200,,105,10,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Flame Bandana,+30 DEF Level 1 fire resistance ,Headgear,2,53,53,29,0,3600,,121,0,30,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Mercury Bandana,+26 DEF +10 MOV Makes you run faster ,Headgear,2,53,53,29,0,3200,,121,0,26,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Black Band,+24 DEF sleep resistance ,Headgear,2,53,53,29,0,2250,,121,0,24,0,0,0,0,0,0,0,0,2,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Bravery Bandana,+22 DEF +5 ACT Banishes fear ,Headgear,2,53,53,29,0,2800,,121,0,22,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hide Turban,+14 DEF Made of demon-beast hide ,Headgear,1,53,53,29,0,550,,121,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Iron Bandana,+12 DEF Has iron plates on forehead ,Headgear,1,53,53,29,0,480,,121,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Leather Bandana,+8 DEF Made of tanned leather ,Headgear,1,53,53,29,0,350,,121,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Bandana,+5 DEF Helps you concentrate ,Headgear,1,53,53,29,0,250,,121,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hair Band,+2 DEF A band for tying hair back ,Headgear,1,53,53,29,0,200,,121,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Sage's Hat,+38 DEF Cuts MP consumption by 5% ,Headgear,3,28,28,28,0,6980,,127,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Priest's Hat,+36 DEF Magic/move block resis. ,Headgear,2,28,28,28,0,5800,,127,0,36,0,0,0,0,0,0,0,0,96,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Phoenix Hat,+34 DEF Reduces IP slowing ,Headgear,3,28,28,28,0,4800,,127,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Wizard's Hat,+22 DEF Magic block resistance ,Headgear,2,28,28,28,0,2000,,127,0,22,0,0,0,0,0,0,0,0,32,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sister's Hat,+20 DEF Paralysis resistance ,Headgear,2,28,28,28,0,1750,,127,0,20,0,0,0,0,0,0,0,0,4,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Feathered Hat,+18 DEF With |waterfowl feather ,Headgear,1,28,28,28,0,1120,,127,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Guardian Hat,+10 DEF Gives sleep resistance ,Headgear,1,28,28,28,0,450,,127,0,10,0,0,0,0,0,0,0,0,2,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Traveler's Hat,+6 DEF Worn by travelers ,Headgear,1,28,28,28,0,300,,127,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Climbing Hat,+4 DEF A hat for mountain climbing ,Headgear,1,28,28,28,0,240,,127,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Lion Boots,+20 MOV +20 DEF Has a lion insignia ,Footwear,2,32,32,32,0,5000,,127,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Elf King's Boots,+5 MOV +20 DEF Lvl 2 attack resist. ,Footwear,3,32,32,32,0,6200,,127,0,20,0,5,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Royal Boots,+18 MOV +18 DEF The King's boots ,Footwear,2,32,32,32,0,0,,127,0,18,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Wolf Boots,+15 MOV +15 DEF Ups Evasion by 5% ,Footwear,2,32,32,32,0,3100,,127,0,15,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+5% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Battle Boots,+12 MOV +12 DEF Warrior's boots ,Footwear,2,32,32,32,0,1800,,127,0,12,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Warrior Leggings,+10 MOV +10 DEF ,Footwear,1,32,32,32,0,1400,,127,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Mach Boots,+20 MOV +6 DEF |Supersonic speed ,Footwear,1,32,32,32,0,1100,,127,0,6,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Heavy Boots,+10 MOV +6 DEF Negates knock-back ,Footwear,1,32,32,32,0,800,,127,0,6,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate knockback,,,,,,,,,,,,,,,,,,,,,,,,, + Wing Boots,+15 MOV +5 DEF Lv 2 earth resis. ,Footwear,1,32,32,32,0,720,,127,0,5,0,15,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hunter's Boots,+8 MOV +4 DEF Lace-up boots ,Footwear,1,32,32,32,0,400,,127,0,4,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Leather Leggings,+0 MOV +4 DEF Light leather ,Footwear,1,32,32,32,0,280,,127,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Glass Slippers,+10 MOV +20 ACT |Very delicate ,Footwear,3,32,32,33,0,8000,,22,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Queen Heels,+10 MOV +10 ACT Reduces IP slowing ,Footwear,3,32,32,33,0,4000,,22,0,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Red Shoes,+10 MOV +5 ACT Bright red shoes ,Footwear,3,32,32,33,0,2000,,22,0,0,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Goddess Hi-Heels,+5 MOV +10 DEF Lvl 1 attack resist. ,Footwear,2,32,32,33,0,2000,,22,0,10,0,5,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Rainbow Hi-Heels,+14 MOV +14 DEF Gives warp evasion ,Footwear,2,32,32,33,0,1750,,22,0,14,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Evade attacks,,,,,,,,,,,,,,,,,,,,,,,,, + Magic Hi-Heels,+12 MOV +8 DEF Magical shoes ,Footwear,1,32,32,33,0,1100,,22,0,8,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hi-Heels,+2 MOV Red women's shoes ,Footwear,1,32,32,33,0,150,,22,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Charming Heels,+0 MOV Ups Evasion by 25% ,Footwear,3,32,32,33,0,10,,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+25% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Ogre Shoes,+50 MOV +10 DEF Move like an ogre ,Footwear,2,32,32,31,0,2000,,127,0,10,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Shadow Shoes,+15 MOV +10 DEF Ups Evasion by 10% ,Footwear,2,32,32,31,0,1550,,127,0,10,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+10% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Warp Shoes,+0 MOV +10 DEF Warp movement ,Footwear,3,32,32,31,0,1600,,127,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Warp,,,,,,,,,,,,,,,,,,,,,,,,, + Man's Iron Clogs,-5 MOV +10 ATK Negates knock-back ,Footwear,2,32,32,31,0,820,,105,10,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate knockback,,,,,,,,,,,,,,,,,,,,,,,,, + Flame Shoes,+5 MOV +5 DEF |Lv. 2 fire resis. ,Footwear,2,32,32,31,0,600,,127,0,5,0,5,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Odd Wooden Clogs,+5 MOV +5 DEF |May evade attacks ,Footwear,2,32,32,31,0,580,,127,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Evade attacks,,,,,,,,,,,,,,,,,,,,,,,,, + Giant's Shoes,+5 MOV +5 DEF Huge shoes ,Footwear,1,32,32,31,0,520,,32,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Dash Shoes,+10 MOV +4 DEF Give dash power ,Footwear,1,32,32,31,0,460,,127,0,4,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Climbing Boots,+6 MOV +2 DEF Sturdy shoes ,Footwear,1,32,32,31,0,200,,127,0,2,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Children's Shoes,+8 MOV Comfy sneakers ,Footwear,1,32,32,31,0,180,,95,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Crampons,+4 MOV Level 2 blizzard resistance ,Footwear,1,32,32,31,0,420,,127,0,0,0,4,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Pumps,+4 MOV ,Footwear,1,32,32,31,0,160,,95,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Holy Egg,Water/Earth/Forest Priestly Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 1,,,,,,,,,,,,,,,,,,,,,,,,, + Chaos Egg,Fire/Wind/Lightning Demonic Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 2,,,,,,,,,,,,,,,,,,,,,,,,, + Mist Egg,Wind/Water/Blizzard Airy Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 3,,,,,,,,,,,,,,,,,,,,,,,,, + Gravity Egg,Fire/Earth/Explosion Earthy Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 4,,,,,,,,,,,,,,,,,,,,,,,,, + Soul Egg,Wind/Water/Lightning Sagacious ManaEgg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 5,,,,,,,,,,,,,,,,,,,,,,,,, + Star Egg,Lightning/Explosion Ultimate Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 6,,,,,,,,,,,,,,,,,,,,,,,,, + Tutor Egg,A sample Mana Egg used in tutorials ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 7,,,,,,,,,,,,,,,,,,,,,,,,, + Change Egg,A sample Mana Egg used in tutorials ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 8,,,,,,,,,,,,,,,,,,,,,,,,, + Fairy Egg,Recovery/Assistance Defensive ManaEgg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 9,,,,,,,,,,,,,,,,,,,,,,,,, + Dragon Egg,All attack magic Offensive Mana Egg ,Mana Egg,3,52,52,52,0,0,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 10,,,,,,,,,,,,,,,,,,,,,,,,, + Mana Crystals,Restores some MP in combat ,Accessory,3,46,46,46,0,25000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1% MP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Demon Necklace,Cuts MP consumption by 25% ,Accessory,3,53,53,36,0,20000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-25% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Mana Insignia,Cuts MP consumption by 15% ,Accessory,3,34,34,34,0,7500,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-15% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Energy Charm,Cuts SP consumption by 25% ,Accessory,3,34,34,34,0,18000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-25% SP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Divine Talisman,Cuts SP consumption by 15% ,Accessory,3,37,37,37,0,6000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-15% SP consumption,,,,,,,,,,,,,,,,,,,,,,,,, + Soul of Asura,+2 Combo attacks ,Accessory,3,53,53,53,0,12000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+2 combo attack,,,,,,,,,,,,,,,,,,,,,,,,, + Demon's Tears,+1 Combo attacks ,Accessory,3,53,53,53,0,5000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+1 combo attack,,,,,,,,,,,,,,,,,,,,,,,,, + Angel's Ring,+5 DEF Restores some HP in combat ,Accessory,3,34,34,34,0,10000,,127,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + Relief Tag,Restores some HP in combat ,Accessory,3,37,37,37,0,4000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1% HP regen,,,,,,,,,,,,,,,,,,,,,,,,, + King's Pride,+25 ATK Ups power of moves ,Accessory,3,53,53,53,0,0,,127,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Ups power of Moves,,,,,,,,,,,,,,,,,,,,,,,,, + Black Belt,+15 ATK Ups power of moves ,Accessory,3,53,53,38,0,2200,,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Up power of Moves,,,,,,,,,,,,,,,,,,,,,,,,, + Energy Ring,+15 DEF Damage ups SP recovery by 5 ,Accessory,3,34,34,34,0,3000,,127,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+5 SP recover on hit,,,,,,,,,,,,,,,,,,,,,,,,, + Rage Ring,+10 ATK Damage ups SP recovery by 3 ,Accessory,3,34,34,34,0,1200,,127,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+3 SP recover on hit,,,,,,,,,,,,,,,,,,,,,,,,, + Dragon Scales,Negates damage under 200 ,Accessory,3,53,53,53,0,1500,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate < 200 damage,,,,,,,,,,,,,,,,,,,,,,,,, + Dark Ring,Negates damage under 100 ,Accessory,3,34,34,34,0,750,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate < 100 damage,,,,,,,,,,,,,,,,,,,,,,,,, + Forbear Necklace,+10 ACT Suppresses IP slowing ,Accessory,3,53,53,36,0,2000,,127,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Suppress IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Rune Necklace,+5 ACT Suppresses IP slowing ,Accessory,3,34,34,34,0,750,,127,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Suppress IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, + Meteor Earring,+20 MOV Ups Evasion by 25% ,Accessory,3,34,34,34,0,1500,,127,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+25% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Mirage Earring,+10 MOV Ups Evasion by 15% ,Accessory,3,34,34,34,0,600,,127,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+15% evasion,,,,,,,,,,,,,,,,,,,,,,,,, + Reflection Ring,+10 DEF Sometimes reflects damage ,Accessory,3,34,34,34,0,750,,127,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reflect damage,,,,,,,,,,,,,,,,,,,,,,,,, + Heavy Stone,+5 DEF -5 MOV Nulls knock-back ,Accessory,1,53,53,53,0,120,,127,0,5,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate knockback,,,,,,,,,,,,,,,,,,,,,,,,, + Healing Ring,+5 DEF [Heal] ,Accessory,1,34,34,34,0,500,,127,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Restore HP(MEN),One Ally,300,0,210,60, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 + Revival Gem,+5 DEF Revives |character once ,Accessory,2,34,34,34,0,5000,,127,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Revives character,,,,,,,,,,,,,,,,,,,,,,,,, + Bonds of Trust,+5 ACT [Raises IP] ,Accessory,2,53,53,49,0,2,,127,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,5000,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,21,0,0 + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Jet-Black Cape,All status resist./Lv 5 attack resist. ,Accessory,3,53,53,39,0,15000,,127,0,0,0,0,0,5,5,5,5,5,255,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Kojin Charm,Level 3 all attack resistance ,Accessory,3,37,37,37,0,10000,,127,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Salamander Tail,+20 ATK Level 10 fire resistance ,Accessory,2,53,53,38,0,800,,127,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Fire Pendant,+10 DEF Level 3 fire resistance ,Accessory,2,53,53,36,0,800,,127,0,10,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + North Wind Cape,+10 MOV Level 3 wind resistance ,Accessory,2,53,53,39,0,600,,127,0,0,0,10,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Crystal Brooch,+10 DEF Level 3 earth resistance ,Accessory,2,53,53,36,0,800,,127,0,10,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Thunder Ring,+10 DEF Lvl. 3 Lgtning Para. Res. ,Accessory,2,34,34,34,0,1000,,127,0,10,0,0,0,0,0,0,3,0,4,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Arctic Cape,+10 DEF Level 3 blizzard resistance ,Accessory,2,53,53,39,0,800,,127,0,10,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Fire Charm,Level 5 fire resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Wind Charm,Level 5 wind resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Earth Charm,Level 5 earth resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Lightning Charm,Level 5 lightning resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Blizzard Charm,Level 5 blizzard resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Mystic Veil,All status disorder resistance ,Accessory,3,39,39,39,0,12000,,127,0,0,0,0,0,0,0,0,0,0,127,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Ring of Guarding,+5 DEF Pois/slp/|para/conf/plag res. ,Accessory,3,34,34,34,0,5000,,127,0,5,0,0,0,0,0,0,0,0,31,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Mars Talisman,Move/magic block resistance [Refresh] ,Accessory,2,37,37,37,0,2000,,127,0,0,0,0,0,0,0,0,0,0,96,100,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 + Coral Necklace,+10 DEF Poison/|sleep/conf. resist. ,Accessory,2,53,53,36,0,1800,,127,0,10,0,0,0,0,0,0,0,0,11,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Talisman,+15 ATK Poison/paralysis resistance ,Accessory,2,34,34,34,0,1500,,127,15,0,0,0,0,0,0,0,0,0,5,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Crescent Jade,+15 DEF Sleep/confusion resis. ,Accessory,2,34,34,34,0,1500,,127,0,15,0,0,0,0,0,0,0,0,10,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Raincoat,+10 DEF Sleep resistance ,Accessory,2,53,53,39,0,800,,127,0,10,0,0,0,0,0,0,0,0,2,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Snake Earrings,+10 DEF Poison resistance ,Accessory,2,34,34,34,0,800,,127,0,10,0,0,0,0,0,0,0,0,1,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Poison Charm,Poison resistance ,Accessory,1,37,37,37,0,250,,127,0,0,0,0,0,0,0,0,0,0,1,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sleep Charm,Sleep resistance ,Accessory,1,37,37,37,0,250,,127,0,0,0,0,0,0,0,0,0,0,2,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Confusion Charm,Confusion resistance ,Accessory,1,37,37,37,0,250,,127,0,0,0,0,0,0,0,0,0,0,8,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Paralysis Charm,Paralysis resistance ,Accessory,1,37,37,37,0,250,,127,0,0,0,0,0,0,0,0,0,0,4,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Move Block Charm,Move block resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,0,0,0,0,64,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + MagicBlock Charm,Magic block resistance ,Accessory,1,37,37,37,0,400,,127,0,0,0,0,0,0,0,0,0,0,32,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Plague Charm,Plague resistance ,Accessory,1,37,37,37,0,600,,127,0,0,0,0,0,0,0,0,0,0,16,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + Heracles' Belt,+40 ATK ,Accessory,1,53,53,38,0,6200,,127,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Titan's Ring,+20 ATK ,Accessory,1,34,34,34,0,1800,,127,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hercules' Brace,+5 ATK ,Accessory,1,35,35,35,0,660,,127,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Jade Charm,+2 ATK/DEF ,Accessory,1,34,34,34,0,420,,127,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Shogun's Brace,+40 DEF ,Accessory,1,35,35,35,0,5000,,127,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Magical Brace,+20 DEF ,Accessory,1,35,35,35,0,1500,,127,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Gauntlet,+15 DEF ,Accessory,1,35,35,35,0,800,,127,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Silver Bracelet,+8 DEF ,Accessory,1,35,35,35,0,400,,127,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Leather Brace,+4 DEF ,Accessory,1,35,35,35,0,240,,127,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Sonic Belt,+40 ACT ,Accessory,3,53,53,38,0,15000,,127,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Hurricane Belt,+20 ACT ,Accessory,1,53,53,38,0,6000,,127,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Godspeed Ring,+15 ACT ,Accessory,1,34,34,34,0,2500,,127,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Anklet,+40 MOV ,Accessory,1,35,35,35,0,1000,,127,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Moebius Ring,+2 ATK/DEF/ACT/MOV ,Accessory,1,34,34,34,0,750,,127,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Pretty Necklace,Very valuable necklace ,Accessory,1,53,53,36,0,10000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Pretty Bracelet,Very valuable bracelet ,Accessory,1,35,35,35,0,5000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Pretty Ring,Very valuable ring ,Accessory,1,34,34,34,0,1000,,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, + Friends Necklace,+25 DEF Symbol of earnest friendship ,Accessory,1,53,53,36,0,2500,,127,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/src/items/Items.cpp b/src/items/Items.cpp index 33b1f92..4906947 100644 --- a/src/items/Items.cpp +++ b/src/items/Items.cpp @@ -137,6 +137,7 @@ void Items::draw() { auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); + auto equipmentSpecialDefs = JsonDefinitions::getInstance().getDefinitions("equipmentSpecials"); if (ImGui::Button("Save")) { write(); @@ -354,7 +355,20 @@ void Items::draw() { drawInput("Increase Water %", &_items.at(_itemIndex).equipmentOffset->increaseWaterPercent); drawInput("Increase Explosion %", &_items.at(_itemIndex).equipmentOffset->increaseExplosionPercent); drawInput("Increase Forest %", &_items.at(_itemIndex).equipmentOffset->increaseForestPercent); - drawInput("Special", &_items.at(_itemIndex).equipmentOffset->special); + + if (ImGui::BeginCombo("Special", equipmentSpecialDefs.at(_items.at(_itemIndex).equipmentOffset->special).c_str())) { + for (uint8_t i = 0; i < equipmentSpecialDefs.size(); i++) { + bool is_selected = (i == _items.at(_itemIndex).equipmentOffset->special); + if (ImGui::Selectable(equipmentSpecialDefs.at(i).c_str(), is_selected)) { + _items.at(_itemIndex).equipmentOffset->special = i; + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + } + } + + //drawInput("Special", &_items.at(_itemIndex).equipmentOffset->special); ImGui::End(); } @@ -472,5 +486,99 @@ void Items::draw() { } void Items::outputToCSV() { + auto itemEntryDefs = JsonDefinitions::getInstance().getDefinitions("itemEntries"); + auto characterDefs = JsonDefinitions::getInstance().getDefinitions("characters"); + auto effectiveOnDefs = JsonDefinitions::getInstance().getDefinitions("effectiveOn"); + auto statusDefs = JsonDefinitions::getInstance().getDefinitions("statuses"); + auto targetEffectDefs = JsonDefinitions::getInstance().getDefinitions("targetEffects"); + auto targetTypeDefs = JsonDefinitions::getInstance().getDefinitions("targetTypes"); + auto animationDefs = JsonDefinitions::getInstance().getDefinitions("animations"); + auto elementDefs = JsonDefinitions::getInstance().getDefinitions("elements"); + auto equipmentSpecialDefs = JsonDefinitions::getInstance().getDefinitions("equipmentSpecials"); + + std::ofstream output; + output.open("./csv/ITEMS.CSV"); + + if (!output.is_open()) { + return; + } + + output << "Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Price," + << "\"Equipment\",Characters Bitflag,Strength,Vitality,Action,Movement,Effective On," + << "Fire Affinity,Wind Affinity,Earth Affinity,Lightning Affinity,Blizzard Affinity," + << "Ailments Bitflag,Ailments Chance,Increase Fire %,Increase Wind %,Increase Earth %,Increase Lightning %,Increase Blizzard %,Increase Water %,Increase Explosion %,Increase Forest %,Special," + << "\"Usable\",Target Effect,Target Type,Power,Range,Cast Time,Recovery Time,Animation,Effective On,Unknown #1,IP Damage,IP Cancel Damage,Knockback," + << "Element,Element Strength,Ailments Bitflag,Ailments Chance,Attack Mod,Defense Mod,Action Mod,Movement Mod,Break Chance,Special,Unknown #2,Unknown #3\n"; + + for (const auto& item : _items) { + output << item.name << ',' + << item.description << ',' + << itemEntryDefs.at(item.stats.entryType) << ',' + << std::to_string(item.stats.unknown1) << ',' + << std::to_string(item.stats.unknown2) << ',' + << std::to_string(item.stats.unknown3) << ',' + << std::to_string(item.stats.icon) << ',' + << std::to_string(item.stats.unknown4) << ',' + << std::to_string(item.stats.price) << ','; + + if (item.equipmentOffset) { + output << ',' << std::to_string(item.equipmentOffset->characterBitflag) << ',' + << std::to_string(item.equipmentOffset->str) << ',' + << std::to_string(item.equipmentOffset->vit) << ',' + << std::to_string(item.equipmentOffset->act) << ',' + << std::to_string(item.equipmentOffset->mov) << ',' + << std::to_string(item.equipmentOffset->effectiveOn) << ',' + << std::to_string(item.equipmentOffset->fireAffinity) << ',' + << std::to_string(item.equipmentOffset->windAffinity) << ',' + << std::to_string(item.equipmentOffset->earthAffinity) << ',' + << std::to_string(item.equipmentOffset->lightningAffinity) << ',' + << std::to_string(item.equipmentOffset->blizzardAffinity) << ',' + << std::to_string(item.equipmentOffset->ailmentsBitflag) << ',' + << std::to_string(item.equipmentOffset->ailmentsChance) << ',' + << std::to_string(item.equipmentOffset->increaseFirePercent) << ',' + << std::to_string(item.equipmentOffset->increaseWindPercent) << ',' + << std::to_string(item.equipmentOffset->increaseEarthPercent) << ',' + << std::to_string(item.equipmentOffset->increaseLightningPercent) << ',' + << std::to_string(item.equipmentOffset->increaseBlizzardPercent) << ',' + << std::to_string(item.equipmentOffset->increaseWaterPercent) << ',' + << std::to_string(item.equipmentOffset->increaseExplosionPercent) << ',' + << std::to_string(item.equipmentOffset->increaseForestPercent) << ',' + << equipmentSpecialDefs.at(item.equipmentOffset->special) << ','; + } + else { + output << ",,,,,,,,,,,,,,,,,,,,,,,"; + } + + if (item.usableOffset) { + output << ',' << targetEffectDefs.at(item.usableOffset->targetEffect) << ',' + << targetTypeDefs.at(item.usableOffset->targetType) << ',' + << std::to_string(item.usableOffset->power) << ',' + << std::to_string(item.usableOffset->range) << ',' + << std::to_string(item.usableOffset->castTime) << ',' + << std::to_string(item.usableOffset->recoveryTime) << ',' + << Moves::getInstance().getMoves().at(item.usableOffset->animation).name << ',' + << effectiveOnDefs.at(item.usableOffset->effectiveOn) << ',' + << std::to_string(item.usableOffset->unknown1) << ',' + << std::to_string(item.usableOffset->ipDamage) << ',' + << std::to_string(item.usableOffset->ipCancelDamage) << ',' + << std::to_string(item.usableOffset->knockback) << ',' + << elementDefs.at(item.usableOffset->element) << ',' + << std::to_string(item.usableOffset->elementStr) << ',' + << std::to_string(item.usableOffset->ailmentsBitflag) << ',' + << std::to_string(item.usableOffset->ailmentsChance) << ',' + << std::to_string(item.usableOffset->atkMod) << ',' + << std::to_string(item.usableOffset->defMod) << ',' + << std::to_string(item.usableOffset->actMod) << ',' + << std::to_string(item.usableOffset->movMod) << ',' + << std::to_string(item.usableOffset->breakChance) << ',' + << std::to_string(item.usableOffset->special) << ',' + << std::to_string(item.usableOffset->unknown2) << ',' + << std::to_string(item.usableOffset->unknown3) << '\n'; + } + else { + output << ",,,,,,,,,,,,,,,,,,,,,,,,\n"; + } + } + output.close(); } \ No newline at end of file diff --git a/src/moves/Specials.cpp b/src/moves/Specials.cpp index 53fabc7..c771753 100644 --- a/src/moves/Specials.cpp +++ b/src/moves/Specials.cpp @@ -57,7 +57,7 @@ void Specials::read() { void Specials::draw() { ImGui::Begin("SPECIALS"); - auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); + auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specialChars"); if (ImGui::Button("Save")) { write(); @@ -118,7 +118,7 @@ void Specials::draw() { } void Specials::outputToCSV() { - auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specials"); + auto specialDefs = JsonDefinitions::getInstance().getDefinitions("specialChars"); std::ofstream output; output.open("./csv/TB_SPCL.CSV"); diff --git a/vs/G2DataGUI/definitions.json b/vs/G2DataGUI/definitions.json deleted file mode 100644 index 0499c16..0000000 --- a/vs/G2DataGUI/definitions.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "icons": [ - "Fire", - "Wind", - "Earth", - "Lightning", - "Blizzard", - "Water", - "Explosion", - "Forest", - "Light", - "Darkness", - "Sword", - "Staff", - "Crossbow", - "Dagger", - "Poleaxe", - "Chakram", - "Red Shoe" - ], - "targetEffects": [ - "NULL", - "Restore HP(MEN)", - "Restore MP", - "Restore SP", - "Ally Buff/Debuff", - "Physical Damage(STR)", - "Magical Damage(MAG)", - "Enemy Buff/Debuff", - "Status Change", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Special" - ], - "targetTypes": [ - "NULL", - "One Ally", - "Area Allies", - "All Allies", - "One Enemy", - "Area Enemies", - "All Enemies", - "Enemy Line", - "Self", - "Unknown", - "Area Around Self", - "Unknown", - "Unknown", - "Area Around Self", - "Unknown", - "Unknown" - ], - "elements": [ - "Fire", - "Wind", - "Earth", - "Lightning", - "Blizzard" - ], - "slots": [ - "Slot 1", - "Slot 2", - "Slot 3", - "Slot 4", - "Slot 5", - "Slot 6", - "Slot 7", - "Slot 8", - "Slot 9", - "Slot 10", - "Slot 11", - "Slot 12", - "Slot 13", - "Slot 14", - "Slot 15", - "Slot 16", - "Slot 17", - "Slot 18", - "Slot 19", - "Slot 20", - "Slot 21", - "Slot 22", - "Slot 23", - "Slot 24", - "Slot 25", - "Slot 26", - "Slot 27", - "Slot 28", - "Slot 29", - "Slot 30", - "Slot 31", - "Slot 32", - "Slot 33", - "Slot 34", - "Slot 35", - "Slot 36", - "Slot 37", - "Slot 38", - "Slot 39", - "Slot 40", - "Slot 41", - "Slot 42", - "Slot 43", - "Slot 44", - "Slot 45", - "Slot 46", - "Slot 47", - "Slot 48", - "Slot 49", - "Slot 50", - "Slot 51", - "Slot 52", - "Slot 53", - "Slot 54", - "Slot 55", - "Slot 56", - "Slot 57", - "Slot 58", - "Slot 59", - "Slot 60", - "Slot 61" , - "Slot 62", - "Slot 63", - "Slot 64", - "Slot 65", - "Slot 66", - "Slot 67", - "Slot 68", - "Slot 69", - "Slot 70", - "Slot 71", - "Slot 72", - "Slot 73", - "Slot 74", - "Slot 75", - "Slot 76", - "Slot 77", - "Slot 78", - "Slot 79", - "Slot 80", - "Slot 81", - "Slot 82", - "Slot 83", - "Slot 84", - "Slot 85", - "Slot 86" , - "Slot 87", - "Slot 88", - "Slot 89", - "Slot 90", - "Slot 91", - "Slot 92", - "Slot 93", - "Slot 94", - "Slot 95", - "Slot 96", - "Slot 97", - "Slot 98", - "Slot 99", - "Slot 100", - "Slot 101", - "Slot 102", - "Slot 103", - "Slot 104", - "Slot 105", - "Slot 106", - "Slot 107", - "Slot 108", - "Slot 109", - "Slot 110", - "Slot 111", - "Slot 112", - "Slot 113", - "Slot 114", - "Slot 115", - "Slot 116", - "Slot 117", - "Slot 118", - "Slot 119", - "Slot 120", - "Slot 121", - "Slot 122", - "Slot 123", - "Slot 124", - "Slot 125", - "Slot 126", - "Slot 127", - "Slot 128", - "Slot 129", - "Slot 130" - ], - "itemEntries": [ - "NULL", - "Item", - "Item", - "Perm. Stat Modifier(?)", - "Weapon", - "Armour", - "Headgear", - "Footwear", - "Accessory", - "Mana Egg", - "Unknown", - "Valuable", - "Skillbook", - "Special", - "Unknown", - "Unknown" - ], - "effectiveOn": [ - "NULL", - "Bird", - "Bug/Crustacean", - "Reptile", - "Animal", - "Humanoid", - "Unknown", - "Undead", - "Valmar", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown" - ], - "books": [ - "NULL", - "Adventure Book", - "Book of Wizards", - "Book of Warriors", - "Book of Priests", - "Book of Gales", - "Book of Swords", - "Book of War", - "Book of Sages", - "Book of Learning" - ], - "eggs": [ - "NULL", - "Holy Egg", - "Chaos Egg", - "Mist Egg", - "Gravity Egg", - "Soul Egg", - "Star Egg", - "Tutor Egg", - "Change Egg", - "Fairy Egg", - "Dragon Egg" - ], - "specials": [ - "Ryudo", - "Ryudo", - "Elena", - "Millenia", - "Roan", - "Tio", - "Mareg", - "Prince Roan", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL" - ], - "characters": [ - "Ryudo", - "Elena", - "Millenia", - "Roan", - "Tio", - "Mareg", - "Prince Roan", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL", - "NULL" - ], - "animations": [ - "Physical Attack", - "Burn!", - "Burnflame", - "Burnstrike", - "Hellburner", - "Howl", - "Howlslash", - "Howlnado", - "Runner", - "Shhh!", - "Snooze", - "Heal", - "Healer", - "Healer+", - "Alhealer", - "Resurrect", - "Tremor", - "Quake", - "Diggin'", - "Def-Loss", - "Gravity", - "BOOM!", - "BA-BOOM!", - "Meteor Strike", - "WOW!", - "Zap!", - "Zap All", - "GadZap", - "DragonZap", - "Stram", - "Poizn", - "Speedy", - "Craze", - "Cure", - "Refresh", - "Halvah", - "Crackle", - "Crackling", - "Cold", - "Freeze!", - "Fiora", - "unknown 1", - "unknown 2", - "unknown 3", - "unknown 4", - "unknown 5", - "Alhealer", - "unknown 7", - "unknown 8", - "Glitter/Confetti", - "Alheal", - "Healer(Teal)", - "Healer+(Teal)", - "Healer(Green)", - "Alhealer(Green)", - "unknown 15", - "Bomb", - "Vanish", - "unknown17", - "unknown 18", - "unknown 19", - "Tenseiken Slash", - "Flying Tenseiken", - "Purple Lightning", - "Sky Dragon Slash", - "unknown 20", - "unknown 21", - "Impact Bomb", - "Nightmare Ball", - "Droplets of Life", - "White Apocalypse", - "unknown 22", - "unknown 23", - "Arrow Shot", - "Heel Crush", - "Fallen Wings", - "Starving Tongue", - "Spellbinding Eye", - "Grudging Claws", - "Golden Hammer", - "Snowball Fight!", - "Dragon Rise", - "Vitality March", - "unknown 24", - "unknown 25", - "Lotus Flower", - "Tornado", - "Fast Dance-Whirl", - "Whisper to Stars", - "unknown 26", - "unknown 27", - "Beast-Fang Cut", - "Beat-King Blast", - "Beast-King Smash", - "Lion's Roar", - "unknown 28", - "unknown 29", - "Golden Hammer", - "Ice Prison", - "True Dragon Rise", - "Vitality March", - "Taint of Wind", - "unknown 30", - "unknown 31", - "unknown 32", - "unknown 33", - "unknown 34", - "unknown 35", - "unknown 36", - "unknown 37", - "unknown 38", - "unknown 39", - "unknown 40", - "unknown 41", - "unknown 42", - "unknown 43", - "unknown 44", - "unknown 45", - "unknown 46", - "unknown 47", - "unknown 48", - "unknown 49", - "unknown 50", - "unknown 51", - "unknown 52", - "unknown 53", - "unknown 54", - "unknown 55" - ], - "statuses": [ - "Poison", - "Sleep", - "Paralysis", - "Confusion", - "Plague", - "Magic Block", - "Move Block", - "Death" - ] -} \ No newline at end of file From 6575aecfa98fbb428c28bb348265824394c42261 Mon Sep 17 00:00:00 2001 From: krogenth Date: Thu, 13 Apr 2023 11:54:07 -0400 Subject: [PATCH 5/7] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1e1cc57..deeb9c7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ # ignored specific files /vs/G2DataGUI/*.ini +/vs/G2DataGUI/*.json *.pdb *.ilk From dd9d465e7aef010df29bbb87a589fd0f21509309 Mon Sep 17 00:00:00 2001 From: krogenth Date: Thu, 13 Apr 2023 11:56:39 -0400 Subject: [PATCH 6/7] fix item usable animation reference --- docs/ITEMS.CSV | 256 ++++++++++++++++++++++---------------------- src/items/Items.cpp | 2 +- 2 files changed, 129 insertions(+), 129 deletions(-) diff --git a/docs/ITEMS.CSV b/docs/ITEMS.CSV index 39fec49..896afe0 100644 --- a/docs/ITEMS.CSV +++ b/docs/ITEMS.CSV @@ -1,7 +1,7 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Price,"Equipment",Characters Bitflag,Strength,Vitality,Action,Movement,Effective On,Fire Affinity,Wind Affinity,Earth Affinity,Lightning Affinity,Blizzard Affinity,Ailments Bitflag,Ailments Chance,Increase Fire %,Increase Wind %,Increase Earth %,Increase Lightning %,Increase Blizzard %,Increase Water %,Increase Explosion %,Increase Forest %,Special,"Usable",Target Effect,Target Type,Power,Range,Cast Time,Recovery Time,Animation,Effective On,Unknown #1,IP Damage,IP Cancel Damage,Knockback,Element,Element Strength,Ailments Bitflag,Ailments Chance,Attack Mod,Defense Mod,Action Mod,Movement Mod,Break Chance,Special,Unknown #2,Unknown #3 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Date 8/16,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,100,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,72,0,0 - Debug Item,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,50,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,73,0,0 + Date 8/16,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,100,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,72,0,0 + Debug Item,Debug Item ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,50,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,73,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -12,7 +12,7 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Roan's Medal,A memento of Roan's mother ,Valuable,3,53,53,3,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Poff Nut,A fuzzy nut Not edible ,Valuable,3,44,44,44,0,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Missanga,Returns SC used on Mareg's moves ,Special,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,74,0,0 + Missanga,Returns SC used on Mareg's moves ,Special,3,53,53,53,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,74,0,0 Xô|óœðwñ²ñ,‹öë÷ ,Valuable,3,53,53,45,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -60,19 +60,19 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri Book of Sages,Lets you learn magical skills ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 8,,,,,,,,,,,,,,,,,,,,,,,,, Book of Learning,A textbook used in tutorials ,Skillbook,3,51,51,51,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,unknown 9,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Seed of Life,+10 Maximum HP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,63,0,0 - Seed of Spells,+10 Maximum MP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,64,0,0 - Seed of Moves,+10 Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,65,0,0 - Seed of Power,+3 STR ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,66,0,0 - Seed of Defense,+3 VIT ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,67,0,0 - Seed of Swift,+3 AGI ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,68,0,0 - Seed of Running,+3 SPD ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,69,0,0 - Seed of Magic,+3 MAG ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,70,0,0 - Seed of Psyche,+3 MEN ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,71,0,0 - All-Around Seed,+10 Maximum HP/Maximum MP/Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,72,0,0 - Omnipotent Seed,+3 STR/VIT/AGI/SPD/MAG/MEN ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,73,0,0 - Lore of Moves,+1000 Special Coins (SC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,61,0,0 - Lore of Magic,+1000 Magic Coins (MC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,62,0,0 + Seed of Life,+10 Maximum HP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,63,0,0 + Seed of Spells,+10 Maximum MP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,64,0,0 + Seed of Moves,+10 Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,65,0,0 + Seed of Power,+3 STR ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,66,0,0 + Seed of Defense,+3 VIT ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,67,0,0 + Seed of Swift,+3 AGI ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,68,0,0 + Seed of Running,+3 SPD ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,69,0,0 + Seed of Magic,+3 MAG ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,70,0,0 + Seed of Psyche,+3 MEN ,Perm. Stat Modifier(?),3,44,44,44,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,71,0,0 + All-Around Seed,+10 Maximum HP/Maximum MP/Maximum SP ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,10,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,72,0,0 + Omnipotent Seed,+3 STR/VIT/AGI/SPD/MAG/MEN ,Perm. Stat Modifier(?),3,44,44,44,0,0,,,,,,,,,,,,,,,,,,,,,,,,,Special,One Ally,3,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,73,0,0 + Lore of Moves,+1000 Special Coins (SC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,61,0,0 + Lore of Magic,+1000 Magic Coins (MC) ,Special,3,53,53,53,0,10000,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,1000,0,0,0,Physical Attack,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,62,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -100,69 +100,69 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Mystic Potion,Restores all HP ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,9999,0,180,30, Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Scarlet Potion,Restores 1600 HP ,Item,1,47,47,47,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1600,0,150,30, Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Healing Fruit,Restores 1200 HP ,Item,0,44,44,42,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1200,0,150,30, Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Holy Wound Salve,Restores 800 HP ,Item,0,47,47,47,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,800,0,120,0, Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Wound Salve,Restores 400 HP ,Item,0,47,47,47,0,24,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,400,0,120,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Medicinal Herb,Restores 200 HP ,Item,0,43,43,43,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,200,0,90,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Mystic Potion,Restores all HP ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,9999,0,180,30,Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Scarlet Potion,Restores 1600 HP ,Item,1,47,47,47,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1600,0,150,30,Healer+,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Fruit,Restores 1200 HP ,Item,0,44,44,42,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,1200,0,150,30,Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Holy Wound Salve,Restores 800 HP ,Item,0,47,47,47,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,800,0,120,0,Healer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Wound Salve,Restores 400 HP ,Item,0,47,47,47,0,24,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,400,0,120,0,Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Medicinal Herb,Restores 200 HP ,Item,0,43,43,43,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,200,0,90,0,Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Potion of Azure,Restores 1500 HP ,Item,2,47,47,47,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1500,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Healing Incense,Restores 1000 HP ,Item,1,43,43,43,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1000,0,150,30, Alhealer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Scroll of Alheal,Restores 500 HP ,Item,0,53,53,45,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,500,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Healing Herb,Restores 250 HP ,Item,0,43,43,43,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,250,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Potion of Azure,Restores 1500 HP ,Item,2,47,47,47,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1500,0,180,30,Alhealer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Incense,Restores 1000 HP ,Item,1,43,43,43,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,1000,0,150,30,Alhealer,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Scroll of Alheal,Restores 500 HP ,Item,0,53,53,45,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,500,0,150,30,Alheal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Healing Herb,Restores 250 HP ,Item,0,43,43,43,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),All Allies,250,0,120,0,Alheal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Miracle Elixir,Revives character |right to COM ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,9999,0,240,60, Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,21,0,0 - Hero's Elixir,Revives character |+5 all levels ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,240,60, Resurrect,NULL,0,0,0,0,Fire,0,128,100,5,5,5,5,100,0,0,0 - Yomi's Elixir,Revives a fallen character ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,180,30, Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,0,0,0 - Panacea,Cures all status disorders ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,150,30, Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,100,0,0,0 - Purifying Herb,Cures poison and paralysis ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 - Poison Antidote,Cures poison ,Item,0,43,43,43,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Cure,NULL,0,0,0,0,Fire,0,1,100,0,0,0,0,100,0,0,0 - Paralysis Salve,Cures paralysis ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Cure,NULL,0,0,0,0,Fire,0,4,100,0,0,0,0,100,0,0,0 - Torte's Reedpipe,Awakens sleeping characters ,Item,0,43,43,43,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,0,600,120,0, ,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 - Eye Drops,Awakens sleeping characters ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, ,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 - Smelling Salts,Cures confusion ,Item,0,47,47,47,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, ,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,100,0,0,0 - Blessing Scroll,Releases move/ |magic blocks ,Item,0,53,53,45,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,100,0,0,0 - Move Blessing,Releases move blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Refresh,NULL,0,0,0,0,Fire,0,64,100,0,0,0,0,100,0,0,0 - Magic Blessing,Releases magic blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0, Refresh,NULL,0,0,0,0,Fire,0,32,100,0,0,0,0,100,0,0,0 - Vaccine,Cures plague ,Item,0,47,47,47,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0, Halvah,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 + Miracle Elixir,Revives character |right to COM ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,9999,0,240,60,Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,21,0,0 + Hero's Elixir,Revives character |+5 all levels ,Item,3,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,240,60,Resurrect,NULL,0,0,0,0,Fire,0,128,100,5,5,5,5,100,0,0,0 + Yomi's Elixir,Revives a fallen character ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,180,30,Resurrect,NULL,0,0,0,0,Fire,0,128,100,0,0,0,0,100,0,0,0 + Panacea,Cures all status disorders ,Item,1,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,150,30,Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,100,0,0,0 + Purifying Herb,Cures poison and paralysis ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0,Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 + Poison Antidote,Cures poison ,Item,0,43,43,43,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Cure,NULL,0,0,0,0,Fire,0,1,100,0,0,0,0,100,0,0,0 + Paralysis Salve,Cures paralysis ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Cure,NULL,0,0,0,0,Fire,0,4,100,0,0,0,0,100,0,0,0 + Torte's Reedpipe,Awakens sleeping characters ,Item,0,43,43,43,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,0,600,120,0,Glitter/Confetti,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 + Eye Drops,Awakens sleeping characters ,Item,0,47,47,47,0,14,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Glitter/Confetti,NULL,0,0,0,0,Fire,0,2,100,0,0,0,0,100,0,0,0 + Smelling Salts,Cures confusion ,Item,0,47,47,47,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Glitter/Confetti,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,100,0,0,0 + Blessing Scroll,Releases move/ |magic blocks ,Item,0,53,53,45,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0,Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,100,0,0,0 + Move Blessing,Releases move blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Refresh,NULL,0,0,0,0,Fire,0,64,100,0,0,0,0,100,0,0,0 + Magic Blessing,Releases magic blocks ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,90,0,Refresh,NULL,0,0,0,0,Fire,0,32,100,0,0,0,0,100,0,0,0 + Vaccine,Cures plague ,Item,0,47,47,47,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,0,0,120,0,Halvah,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Indigo Potion,Restores all MP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,999,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Magical Medicine,Restores 100 MP ,Item,1,47,47,47,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,100,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Grail Fruit,Restores 50 MP ,Item,0,44,44,42,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,50,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Lumir Flower,Restores 25 MP ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Indigo Potion,Restores all MP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,999,0,180,30,Healer+(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Magical Medicine,Restores 100 MP ,Item,1,47,47,47,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,100,0,150,30,Healer+(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Grail Fruit,Restores 50 MP ,Item,0,44,44,42,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,50,0,150,30,Healer(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Lumir Flower,Restores 25 MP ,Item,0,43,43,43,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,120,0,Healer(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Nut of Light,Restores all SP Glows faintly ,Item,2,44,44,42,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,All Allies,9999,0,240,60, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Golden Potion,Restores all SP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,999,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Baobab Fruit,Restores 100 SP ,Item,1,44,44,42,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,100,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Butter Roll,Restores 50 SP ,Item,0,53,53,41,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,50,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Blueberry,Restores 25 SP ,Item,0,44,44,42,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Nut of Light,Restores all SP Glows faintly ,Item,2,44,44,42,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,All Allies,9999,0,240,60,Alhealer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Golden Potion,Restores all SP ,Item,2,47,47,47,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,999,0,180,30,Alhealer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Baobab Fruit,Restores 100 SP ,Item,1,44,44,42,0,360,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,100,0,150,30,Alhealer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Butter Roll,Restores 50 SP ,Item,0,53,53,41,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,50,0,150,30,Healer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Blueberry,Restores 25 SP ,Item,0,44,44,42,0,40,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,120,0,Healer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Caterpillar Soup,Restores 1000 HP Cures plague ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,1000,600,180,30, ,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 - Fresh Sandwich,Restores 600 HP |Cures poison/para. ,Item,1,53,53,41,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,600,0,150,30, Healer,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 - Toad Oil,Restores 300 HP +2 DEF level ,Item,2,47,47,47,0,80,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,300,0,120,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 + Caterpillar Soup,Restores 1000 HP Cures plague ,Item,2,47,47,47,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,1000,600,180,30,Alheal,NULL,0,0,0,0,Fire,0,16,100,0,0,0,0,100,0,0,0 + Fresh Sandwich,Restores 600 HP |Cures poison/para. ,Item,1,53,53,41,0,100,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,600,0,150,30,Healer,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,100,0,0,0 + Toad Oil,Restores 300 HP +2 DEF level ,Item,2,47,47,47,0,80,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,300,0,120,0,Heal,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -170,9 +170,9 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Calming Harp,Restores 200 HP Chance of breaking ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,200,600,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,25,0,0,0 - Mana Harp,Restores 25 MP Might break ,Item,2,53,53,50,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 - Lion Harp,Restores 25 SP Might break ,Item,2,53,53,50,0,800,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 + Calming Harp,Restores 200 HP Chance of breaking ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),Area Allies,200,600,150,30,Alheal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,25,0,0,0 + Mana Harp,Restores 25 MP Might break ,Item,2,53,53,50,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,25,0,150,30,Healer(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 + Lion Harp,Restores 25 SP Might break ,Item,2,53,53,50,0,800,,,,,,,,,,,,,,,,,,,,,,,,,Restore SP,One Ally,25,0,150,30,Healer(Green),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,30,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -197,64 +197,64 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Golden Nut,Restores 72 HP ,Item,2,44,44,44,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,72,0,90,0, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 - Golden Statue,Restores 5 MP |Statue of Granas ,Item,2,53,53,2,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,5,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 + Golden Nut,Restores 72 HP ,Item,2,44,44,44,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Restore HP(MEN),One Ally,72,0,90,0,Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,0,0,0 + Golden Statue,Restores 5 MP |Statue of Granas ,Item,2,53,53,2,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Restore MP,One Ally,5,0,120,0,Healer(Teal),NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Hyper Mogay Bomb,Power: 2000 Cancel effect ,Item,3,48,48,48,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,2000,0,360,120, ,NULL,0,9999,9999,100,Fire,0,0,0,0,0,0,0,100,0,0,0 - Super Mogay Bomb,Power: 1000 Powerful IP damage effect ,Item,2,48,48,48,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,240,60, ,NULL,0,5000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Mogay Bomb,Power: 500 IP damage effect ,Item,1,48,48,48,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,500,600,150,30, ,NULL,0,2500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Meteor Scroll,Power: 2500 Like |Meteor Strike ,Item,3,53,53,45,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,2500,0,360,120, Meteor Strike,NULL,1,1500,0,120,Fire,0,0,0,0,0,0,0,100,0,0,0 - Thor Stone,Power: 1500 |Lgtning-based ,Item,2,46,46,46,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),All Enemies,1500,0,300,90, Zap All,Unknown,1,750,0,80,Lightning,10,0,0,0,0,0,0,100,0,0,0 - Red Bird Stone,Power: 1200 Fire-based attack ,Item,2,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60, Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,100,0,0,0 - Icefang Stone,Power: 1200 Blizzard-based attack ,Item,0,46,46,46,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60, Crackle,NULL,1,2000,0,50,Blizzard,10,0,0,0,0,0,0,100,0,0,0 - Electrum Stone,Power: 750 Lgtning-based +Paralysys ,Item,0,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,750,600,210,60, Zap!,NULL,0,500,0,50,Lightning,10,4,30,0,0,0,0,100,0,0,0 - Gale Stone,Power: 700 Wind-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Enemy Line,700,300,180,30, Howlslash,NULL,1,500,0,200,Wind,10,0,0,0,0,0,0,100,0,0,0 - Flame Stone,Power: 650 Fire-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30, Burnflame,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 - Quake Stone,Power: 650 Earth-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30, Tremor,NULL,0,1000,0,50,Earth,10,0,0,0,0,0,0,100,0,0,0 - Fireball Scroll,Power: 400 Fire-based attack ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,400,0,120,0, Burn!,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 - Whirlwind Scroll,Power: 300 Wind-based attack ,Item,0,53,53,45,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,300,600,150,30, Howl,NULL,0,0,0,0,Wind,10,0,0,0,0,0,0,100,0,0,0 - Serpentine,Power: 1500 Bombs launched on arrows ,Item,2,48,48,48,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,1500,0,240,60, ,NULL,1,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Spiderweb,Power: 1200 -1 MOV level ,Item,2,53,53,53,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1200,600,180,30, ,NULL,0,1000,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 - Dynamite,Power: 1000 ,Item,1,48,48,48,0,240,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,210,60, ,NULL,0,1500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Red Goblin Toad,Power: 900 Poison effect ,Item,0,40,40,40,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,900,0,180,30, ,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 - Holy Ashes,Power: 700 Good |vs. undead ,Item,0,48,48,48,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,700,600,150,30, ,Undead,0,0,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Insecticide Bomb,Power: 650 Fire-based Good vs. bugs ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,650,0,150,30, ,Bug/Crustacean,0,1000,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 - Makibishi,Power: 600 -1 MOV level ,Item,0,48,48,48,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,600,600,180,30, ,NULL,1,1250,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 - Sandman Whiskers,Power: 500 -1 DEF level Expensive ,Item,2,53,53,53,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,500,0,150,30, ,NULL,0,1250,0,100,Fire,0,0,0,0,-1,0,0,100,0,0,0 - Mushroom Cloud,Power: 400 Fire-based ,Item,0,40,40,40,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,400,0,120,0, ,NULL,0,1250,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 - Firebomb,Power: 300 Fire-based attack ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30, ,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 - Hand Grenade,Power: 300 ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30, ,NULL,0,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 - Goblin Toadstool,Power: 250 Poison effect bomb ,Item,0,40,40,40,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,250,0,120,0, ,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 - Platinum Feather,Greatly increases IP ,Item,3,53,53,49,0,2500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,All Allies,7500,0,180,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 - Gold Feather,Greatly increases IP ,Item,3,53,53,49,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,7500,600,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 - Silver Feather,Greatly increases IP ,Item,2,53,53,49,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,7500,0,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 - Scattering Stone,Scatters bunched-up friends ,Item,1,46,46,46,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,600,120,0, ,NULL,0,0,0,800,Fire,0,0,0,0,0,0,0,100,0,0,0 + Hyper Mogay Bomb,Power: 2000 Cancel effect ,Item,3,48,48,48,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,2000,0,360,120,Bomb,NULL,0,9999,9999,100,Fire,0,0,0,0,0,0,0,100,0,0,0 + Super Mogay Bomb,Power: 1000 Powerful IP damage effect ,Item,2,48,48,48,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,240,60,Bomb,NULL,0,5000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Mogay Bomb,Power: 500 IP damage effect ,Item,1,48,48,48,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,500,600,150,30,Bomb,NULL,0,2500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Meteor Scroll,Power: 2500 Like |Meteor Strike ,Item,3,53,53,45,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,2500,0,360,120,Meteor Strike,NULL,1,1500,0,120,Fire,0,0,0,0,0,0,0,100,0,0,0 + Thor Stone,Power: 1500 |Lgtning-based ,Item,2,46,46,46,0,750,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),All Enemies,1500,0,300,90,Zap All,Unknown,1,750,0,80,Lightning,10,0,0,0,0,0,0,100,0,0,0 + Red Bird Stone,Power: 1200 Fire-based attack ,Item,2,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60,Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,100,0,0,0 + Icefang Stone,Power: 1200 Blizzard-based attack ,Item,0,46,46,46,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,1200,0,210,60,Crackle,NULL,1,2000,0,50,Blizzard,10,0,0,0,0,0,0,100,0,0,0 + Electrum Stone,Power: 750 Lgtning-based +Paralysys ,Item,0,46,46,46,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,750,600,210,60,Zap!,NULL,0,500,0,50,Lightning,10,4,30,0,0,0,0,100,0,0,0 + Gale Stone,Power: 700 Wind-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Enemy Line,700,300,180,30,Howlslash,NULL,1,500,0,200,Wind,10,0,0,0,0,0,0,100,0,0,0 + Flame Stone,Power: 650 Fire-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30,Burnflame,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Quake Stone,Power: 650 Earth-based attack ,Item,0,46,46,46,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,650,600,180,30,Tremor,NULL,0,1000,0,50,Earth,10,0,0,0,0,0,0,100,0,0,0 + Fireball Scroll,Power: 400 Fire-based attack ,Item,0,53,53,45,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),One Enemy,400,0,120,0,Burn!,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Whirlwind Scroll,Power: 300 Wind-based attack ,Item,0,53,53,45,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Magical Damage(MAG),Area Enemies,300,600,150,30,Howl,NULL,0,0,0,0,Wind,10,0,0,0,0,0,0,100,0,0,0 + Serpentine,Power: 1500 Bombs launched on arrows ,Item,2,48,48,48,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),All Enemies,1500,0,240,60,Bomb,NULL,1,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Spiderweb,Power: 1200 -1 MOV level ,Item,2,53,53,53,0,400,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1200,600,180,30,unknown 15,NULL,0,1000,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 + Dynamite,Power: 1000 ,Item,1,48,48,48,0,240,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,1000,600,210,60,Bomb,NULL,0,1500,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Red Goblin Toad,Power: 900 Poison effect ,Item,0,40,40,40,0,120,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,900,0,180,30,unknown 15,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 + Holy Ashes,Power: 700 Good |vs. undead ,Item,0,48,48,48,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,700,600,150,30,unknown 15,Undead,0,0,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Insecticide Bomb,Power: 650 Fire-based Good vs. bugs ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,650,0,150,30,unknown 15,Bug/Crustacean,0,1000,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Makibishi,Power: 600 -1 MOV level ,Item,0,48,48,48,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,600,600,180,30,Bomb,NULL,1,1250,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 + Sandman Whiskers,Power: 500 -1 DEF level Expensive ,Item,2,53,53,53,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,500,0,150,30,unknown 15,NULL,0,1250,0,100,Fire,0,0,0,0,-1,0,0,100,0,0,0 + Mushroom Cloud,Power: 400 Fire-based ,Item,0,40,40,40,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,400,0,120,0,Bomb,NULL,0,1250,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Firebomb,Power: 300 Fire-based attack ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30,Bomb,NULL,0,0,0,50,Fire,10,0,0,0,0,0,0,100,0,0,0 + Hand Grenade,Power: 300 ,Item,0,48,48,48,0,60,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),Area Enemies,300,600,150,30,Bomb,NULL,0,1000,0,50,Fire,0,0,0,0,0,0,0,100,0,0,0 + Goblin Toadstool,Power: 250 Poison effect bomb ,Item,0,40,40,40,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Physical Damage(STR),One Enemy,250,0,120,0,unknown 15,NULL,0,0,0,50,Fire,0,1,80,0,0,0,0,100,0,0,0 + Platinum Feather,Greatly increases IP ,Item,3,53,53,49,0,2500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,All Allies,7500,0,180,30,unknown 1,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Gold Feather,Greatly increases IP ,Item,3,53,53,49,0,1000,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,Area Allies,7500,600,150,30,unknown 1,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Silver Feather,Greatly increases IP ,Item,2,53,53,49,0,500,,,,,,,,,,,,,,,,,,,,,,,,,Status Change,One Ally,7500,0,120,0,unknown 1,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,100,21,0,0 + Scattering Stone,Scatters bunched-up friends ,Item,1,46,46,46,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Special,Unknown,0,600,120,0,unknown17,NULL,0,0,0,800,Fire,0,0,0,0,0,0,0,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Battle Manicure,+5 ATK level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,5,0,0,0,100,0,0,0 - Face Paint,+5 ACT level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,5,0,100,0,0,0 - Demon Ash,-1 all variable levels ,Item,2,53,53,53,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,-1,-1,-1,-1,100,0,0,0 - Muscle Mushroom,+2 ATK level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 - Guard Mushroom,+2 DEF level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 - Speed Mushroom,+2 ACT level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 - Runner Mushroom,+2 MOV level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,2,100,0,0,0 - WOW! Scroll,+2 ATK level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0, WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 - Diggin' Scroll,+1 DEF level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0, Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 - Speedy Scroll,+2 ACT level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0, Speedy,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 - Runner Scroll,+1 MOV level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0, Runner,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 - Myriad Power Nut,+1 ATK level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,1,0,0,0,100,0,0,0 - Patience Nut,+1 DEF level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 - Sympathy Nut,+1 ACT level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,1,0,100,0,0,0 - Swiftness Nut,+1 MOV level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 - Powerless Nut,-1 ATK level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,-1,0,0,0,100,0,0,0 - Weakness Nut,-1 DEF level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,-1,0,0,100,0,0,0 - Exhaustion Nut,-1 ACT level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 - Slowpoke Nut,-1 MOV level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 + Battle Manicure,+5 ATK level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30,unknown 7,NULL,0,0,0,0,Fire,0,0,0,5,0,0,0,100,0,0,0 + Face Paint,+5 ACT level ,Item,2,53,53,53,0,150,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,150,30,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,0,5,0,100,0,0,0 + Demon Ash,-1 all variable levels ,Item,2,53,53,53,0,200,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,150,30,unknown 8,NULL,0,0,0,0,Fire,0,0,0,-1,-1,-1,-1,100,0,0,0 + Muscle Mushroom,+2 ATK level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 + Guard Mushroom,+2 DEF level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,2,0,0,100,0,0,0 + Speed Mushroom,+2 ACT level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 + Runner Mushroom,+2 MOV level ,Item,1,40,40,40,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,90,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,0,0,2,100,0,0,0 + WOW! Scroll,+2 ATK level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0,WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,100,0,0,0 + Diggin' Scroll,+1 DEF level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0,Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 + Speedy Scroll,+2 ACT level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,One Ally,0,0,90,0,Speedy,NULL,0,0,0,0,Fire,0,0,0,0,0,2,0,100,0,0,0 + Runner Scroll,+1 MOV level ,Item,0,53,53,45,0,30,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,All Allies,0,0,90,0,Runner,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 + Myriad Power Nut,+1 ATK level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,1,0,0,0,100,0,0,0 + Patience Nut,+1 DEF level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,100,0,0,0 + Sympathy Nut,+1 ACT level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,0,1,0,100,0,0,0 + Swiftness Nut,+1 MOV level ,Item,0,44,44,42,0,20,,,,,,,,,,,,,,,,,,,,,,,,,Ally Buff/Debuff,Area Allies,0,500,120,0,unknown 7,NULL,0,0,0,0,Fire,0,0,0,0,0,0,1,100,0,0,0 + Powerless Nut,-1 ATK level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0,unknown 8,NULL,0,0,0,0,Fire,0,0,0,-1,0,0,0,100,0,0,0 + Weakness Nut,-1 DEF level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0,unknown 8,NULL,0,0,0,0,Fire,0,0,0,0,-1,0,0,100,0,0,0 + Exhaustion Nut,-1 ACT level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0,unknown 8,NULL,0,0,0,0,Fire,0,0,0,0,0,-1,0,100,0,0,0 + Slowpoke Nut,-1 MOV level ,Item,0,44,44,42,0,50,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,500,120,0,unknown 8,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,100,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, - Kuko Berry,Confusion effect causes intoxication ,Item,0,44,44,44,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,90,0, ,NULL,0,0,0,0,Fire,0,8,90,0,0,0,0,100,0,0,0 - Sleeping Harp,Sleep effect |Might break ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30, ,NULL,0,0,0,0,Fire,0,2,70,0,0,0,0,40,0,0,0 - Silence Lute,Magic block effect Chance of breaking ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30, ,NULL,0,0,0,0,Fire,0,32,70,0,0,0,0,40,0,0,0 - Mermaid Harp,Confusion effect Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30, ,NULL,0,0,0,0,Fire,0,8,70,0,0,0,0,40,0,0,0 - Bone Harp,-2 DEF level |Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,-2,0,0,40,0,0,0 + Kuko Berry,Confusion effect causes intoxication ,Item,0,44,44,44,0,10,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,One Enemy,0,0,90,0,unknown 15,NULL,0,0,0,0,Fire,0,8,90,0,0,0,0,100,0,0,0 + Sleeping Harp,Sleep effect |Might break ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30,Glitter/Confetti,NULL,0,0,0,0,Fire,0,2,70,0,0,0,0,40,0,0,0 + Silence Lute,Magic block effect Chance of breaking ,Item,1,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30,Glitter/Confetti,NULL,0,0,0,0,Fire,0,32,70,0,0,0,0,40,0,0,0 + Mermaid Harp,Confusion effect Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,600,150,30,Glitter/Confetti,NULL,0,0,0,0,Fire,0,8,70,0,0,0,0,40,0,0,0 + Bone Harp,-2 DEF level |Might break ,Item,2,53,53,50,0,250,,,,,,,,,,,,,,,,,,,,,,,,,Enemy Buff/Debuff,Area Enemies,0,800,150,30,unknown 8,NULL,0,0,0,0,Fire,0,0,0,0,-2,0,0,40,0,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -307,14 +307,14 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri Holy Soul Blade,+112 ATK Attack drops enemy's DEF lv ,Weapon,2,15,15,15,0,14000,,1,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 DEF from hit,,,,,,,,,,,,,,,,,,,,,,,,, Maken Valborg,+100 ATK Drains HP as 10% of damage ,Weapon,3,15,15,15,0,12000,,1,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as HP,,,,,,,,,,,,,,,,,,,,,,,,, Silence Sword,+85 ATK Magic block ability ,Weapon,2,15,15,15,0,8500,,1,85,0,0,0,0,0,0,0,0,0,32,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Silver Freeze,+80 ATK Blizzard-based [Freeze!] ,Weapon,3,15,15,14,0,7480,,1,80,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Enemy Buff/Debuff,All Enemies,0,0,150,30, Freeze!,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,0,0,0,0 + Silver Freeze,+80 ATK Blizzard-based [Freeze!] ,Weapon,3,15,15,14,0,7480,,1,80,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Enemy Buff/Debuff,All Enemies,0,0,150,30,Freeze!,NULL,0,0,0,0,Fire,0,0,0,0,0,0,-1,0,0,0,0 Sword of Mikage,+77 ATK Prized 1st-class katana ,Weapon,2,15,15,14,0,6900,,1,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Fine Broadsword,+70 ATK Forged by a craftsman ,Weapon,1,15,15,14,0,4500,,1,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Claymore,+60 ATK Huge two-handed sword ,Weapon,1,15,15,14,0,3600,,1,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Ogre Slayer,+55 ATK Effective on humanoids ,Weapon,3,15,15,14,0,2600,,1,55,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Swordfish Sword,+52 ATK Made from a swordfish ,Weapon,1,15,15,14,0,2200,,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Shadowblade,+44 ATK -4 MOV Sudden death power ,Weapon,1,15,15,14,0,4000,,1,44,0,0,-4,0,0,0,0,0,0,128,15,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Flamberge,+44 ATK Fire-based sword [Burn!] ,Weapon,3,15,15,14,0,1440,,1,44,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30, Burn!,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 + Flamberge,+44 ATK Fire-based sword [Burn!] ,Weapon,3,15,15,14,0,1440,,1,44,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30,Burn!,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 Sword of Purity,+40 ATK Effective on the undead ,Weapon,3,15,15,14,0,1200,,1,40,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Samurai Blade,+38 ATK Samurai sword ,Weapon,1,15,15,14,0,900,,1,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Army Saber,+32 ATK Sword used in the army ,Weapon,1,15,15,14,0,750,,1,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, @@ -332,24 +332,24 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Holy Ghost Staff,+138 ATK Cuts MP consumption by 10% ,Weapon,3,16,16,16,0,0,,2,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10% MP consumption,,,,,,,,,,,,,,,,,,,,,,,,, Huge Flail,+128 ATK -5 MOV An enormous flail ,Weapon,2,16,16,16,0,17000,,2,128,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Guardian Staff,+118 ATK Earth-based [Diggin'] ,Weapon,2,16,16,16,0,15500,,2,118,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,All Allies,0,0,180,30, Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,0,0,0,0 + Guardian Staff,+118 ATK Earth-based [Diggin'] ,Weapon,2,16,16,16,0,15500,,2,118,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,All Allies,0,0,180,30,Diggin',NULL,0,0,0,0,Fire,0,0,0,0,1,0,0,0,0,0,0 Decalogue Staff,+108 ATK Magic/move block effect ,Weapon,2,16,16,16,0,11800,,2,108,0,0,0,0,0,0,0,0,0,96,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Priest's Staff,+99 ATK [Halvah] ,Weapon,2,16,16,16,0,12000,,2,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,240,60, Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,0,0,0,0 + Priest's Staff,+99 ATK [Halvah] ,Weapon,2,16,16,16,0,12000,,2,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,240,60,Halvah,NULL,0,0,0,0,Fire,0,127,100,0,0,0,0,0,0,0,0 Golden Flail,+92 ATK -5 MOV WAY too heavy ,Weapon,2,16,16,16,0,8200,,2,92,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Silver Flail,+82 ATK -5 MOV ,Weapon,2,16,16,16,0,6800,,2,82,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Aromatic Root,+75 ATK [Refresh] Aromatic tree root ,Weapon,1,16,16,16,0,7200,,2,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,30, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 + Aromatic Root,+75 ATK [Refresh] Aromatic tree root ,Weapon,1,16,16,16,0,7200,,2,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,30,Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 Buster Flail,+70 ATK -5 MOV |Very destructive ,Weapon,2,16,16,16,0,4400,,2,70,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Lullaby Staff,+65 ATK Sleep effect ,Weapon,3,16,16,16,0,5880,,2,65,0,0,0,0,0,0,0,0,0,2,25,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Quarry Staff,+60 ATK Earth-based [Tremor] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60, Tremor,NULL,1,2000,0,50,Earth,10,0,0,0,0,0,0,0,0,0,0 - Whirlwind Staff,+60 ATK Wind-based [Howlslash] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,700,250,240,60, Howlslash,NULL,1,1000,0,200,Wind,10,0,0,0,0,0,0,0,0,0,0 - Blazing Staff,+60 ATK Fire-based [Burnflame] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60, Burnflame,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 - Sister's Staff,+55 ATK [Cure] ,Weapon,1,16,16,16,0,3500,,2,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60, Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,0,0,0,0 - Oracle's Staff,+50 ATK [Cures confusion] ,Weapon,1,16,16,16,0,1800,,2,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,180,30, ,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,0,0,0,0 + Quarry Staff,+60 ATK Earth-based [Tremor] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60,Tremor,NULL,1,2000,0,50,Earth,10,0,0,0,0,0,0,0,0,0,0 + Whirlwind Staff,+60 ATK Wind-based [Howlslash] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,700,250,240,60,Howlslash,NULL,1,1000,0,200,Wind,10,0,0,0,0,0,0,0,0,0,0 + Blazing Staff,+60 ATK Fire-based [Burnflame] ,Weapon,1,16,16,16,0,4200,,2,60,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Area Enemies,650,600,240,60,Burnflame,NULL,1,0,0,50,Fire,10,0,0,0,0,0,0,0,0,0,0 + Sister's Staff,+55 ATK [Cure] ,Weapon,1,16,16,16,0,3500,,2,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60,Cure,NULL,0,0,0,0,Fire,0,5,100,0,0,0,0,0,0,0,0 + Oracle's Staff,+50 ATK [Cures confusion] ,Weapon,1,16,16,16,0,1800,,2,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,180,30,Glitter/Confetti,NULL,0,0,0,0,Fire,0,8,100,0,0,0,0,0,0,0,0 Battle Rod,+45 ATK A light nimble combat staff ,Weapon,1,16,16,16,0,960,,2,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Flame Staff,+40 ATK Fire-based [Burn!] ,Weapon,1,16,16,16,0,1250,,2,40,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30, Burn!,NULL,0,0,0,0,Fire,10,0,0,0,0,0,0,0,0,0,0 + Flame Staff,+40 ATK Fire-based [Burn!] ,Weapon,1,16,16,16,0,1250,,2,40,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,400,0,180,30,Burn!,NULL,0,0,0,0,Fire,10,0,0,0,0,0,0,0,0,0,0 Iron Rod,+30 ATK A heavy iron rod ,Weapon,1,16,16,16,0,720,,2,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Prayer Staff,+22 ATK An acolyte's staff ,Weapon,1,16,16,16,0,500,,2,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Dragon Wand,+11 ATK Lightning-based [DragonZap] ,Weapon,3,16,16,16,0,15000,,2,11,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,2200,300,420,150, DragonZap,NULL,1,1500,0,120,Lightning,10,4,15,0,0,0,0,0,0,0,0 + Dragon Wand,+11 ATK Lightning-based [DragonZap] ,Weapon,3,16,16,16,0,15000,,2,11,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),Enemy Line,2200,300,420,150,DragonZap,NULL,1,1500,0,120,Lightning,10,4,15,0,0,0,0,0,0,0,0 Useless Staff,+0 ATK Useless ,Weapon,1,16,16,16,0,0,,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -391,7 +391,7 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Brave Dirk,+145 ATK +5 SP |recov. during combat ,Weapon,3,18,18,19,0,26000,,64,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+5 SP regen,,,,,,,,,,,,,,,,,,,,,,,,, - Dirk,+140 ATK A large dagger [WOW!] ,Weapon,3,18,18,19,0,23000,,64,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,One Ally,0,0,180,30, WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,0,0,0,0 + Dirk,+140 ATK A large dagger [WOW!] ,Weapon,3,18,18,19,0,23000,,64,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Ally Buff/Debuff,One Ally,0,0,180,30,WOW!,NULL,0,0,0,0,Fire,0,0,0,2,0,0,0,0,0,0,0 Gladius,+125 ATK A royal treasure ,Weapon,3,18,18,19,0,0,,64,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Sword Breaker,+110 ATK Attack drops enemy ATK lvl. ,Weapon,2,18,18,19,0,14500,,64,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 ATK from hit,,,,,,,,,,,,,,,,,,,,,,,,, Soul Eater,+75 ATK Drains HP as 10% of damage ,Weapon,3,18,18,18,0,6800,,72,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10% damage as HP,,,,,,,,,,,,,,,,,,,,,,,,, @@ -452,8 +452,8 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Leo Rex Battleax,+120 ATK +3 SP |recov. during combat ,Weapon,3,20,20,20,0,16000,,32,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+3 SP regen,,,,,,,,,,,,,,,,,,,,,,,,, Rune Axe,+107 ATK Reduces IP slowing ,Weapon,2,20,20,20,0,13500,,32,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reduce IP slowing,,,,,,,,,,,,,,,,,,,,,,,,, - Tundra Battleax,+101 ATK Blizzard-based [Crackle] ,Weapon,3,20,20,20,0,10000,,32,101,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90, Crackle,NULL,1,4000,0,50,Blizzard,10,0,0,0,0,0,0,0,0,0,0 - Inferno Battleax,+98 ATK Fire-based [Burnstrike] ,Weapon,3,20,20,20,0,9800,,32,98,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90, Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,0,0,0,0 + Tundra Battleax,+101 ATK Blizzard-based [Crackle] ,Weapon,3,20,20,20,0,10000,,32,101,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90,Crackle,NULL,1,4000,0,50,Blizzard,10,0,0,0,0,0,0,0,0,0,0 + Inferno Battleax,+98 ATK Fire-based [Burnstrike] ,Weapon,3,20,20,20,0,9800,,32,98,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Magical Damage(MAG),One Enemy,1200,0,300,90,Burnstrike,NULL,1,0,0,100,Fire,10,0,0,0,0,0,0,0,0,0,0 Bardiche,+86 ATK Battleax with a long blade ,Weapon,2,20,20,20,0,8000,,32,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Earthen Axe,+78 ATK +10 DEF Earth-based ,Weapon,3,20,20,20,0,7500,,32,78,10,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Halberd,+68 ATK Large long-shafted axe ,Weapon,1,20,20,20,0,4400,,32,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, @@ -731,9 +731,9 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri Mirage Earring,+10 MOV Ups Evasion by 15% ,Accessory,3,34,34,34,0,600,,127,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,+15% evasion,,,,,,,,,,,,,,,,,,,,,,,,, Reflection Ring,+10 DEF Sometimes reflects damage ,Accessory,3,34,34,34,0,750,,127,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reflect damage,,,,,,,,,,,,,,,,,,,,,,,,, Heavy Stone,+5 DEF -5 MOV Nulls knock-back ,Accessory,1,53,53,53,0,120,,127,0,5,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Negate knockback,,,,,,,,,,,,,,,,,,,,,,,,, - Healing Ring,+5 DEF [Heal] ,Accessory,1,34,34,34,0,500,,127,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Restore HP(MEN),One Ally,300,0,210,60, Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 + Healing Ring,+5 DEF [Heal] ,Accessory,1,34,34,34,0,500,,127,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Restore HP(MEN),One Ally,300,0,210,60,Heal,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,0,0,0 Revival Gem,+5 DEF Revives |character once ,Accessory,2,34,34,34,0,5000,,127,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Revives character,,,,,,,,,,,,,,,,,,,,,,,,, - Bonds of Trust,+5 ACT [Raises IP] ,Accessory,2,53,53,49,0,2,,127,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,5000,0,150,30, ,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,21,0,0 + Bonds of Trust,+5 ACT [Raises IP] ,Accessory,2,53,53,49,0,2,,127,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,5000,0,150,30,unknown 1,NULL,0,0,0,0,Fire,0,0,0,0,0,0,0,0,21,0,0 , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -762,7 +762,7 @@ Name,Description,Entry Type,Unknown #1,Unknown #2,Unknown #3,Icon,Unknown #4,Pri , ,NULL,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Mystic Veil,All status disorder resistance ,Accessory,3,39,39,39,0,12000,,127,0,0,0,0,0,0,0,0,0,0,127,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Ring of Guarding,+5 DEF Pois/slp/|para/conf/plag res. ,Accessory,3,34,34,34,0,5000,,127,0,5,0,0,0,0,0,0,0,0,31,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, - Mars Talisman,Move/magic block resistance [Refresh] ,Accessory,2,37,37,37,0,2000,,127,0,0,0,0,0,0,0,0,0,0,96,100,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60, Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 + Mars Talisman,Move/magic block resistance [Refresh] ,Accessory,2,37,37,37,0,2000,,127,0,0,0,0,0,0,0,0,0,0,96,100,0,0,0,0,0,0,0,0,NULL,,Status Change,One Ally,0,0,210,60,Refresh,NULL,0,0,0,0,Fire,0,96,100,0,0,0,0,0,0,0,0 Coral Necklace,+10 DEF Poison/|sleep/conf. resist. ,Accessory,2,53,53,36,0,1800,,127,0,10,0,0,0,0,0,0,0,0,11,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Talisman,+15 ATK Poison/paralysis resistance ,Accessory,2,34,34,34,0,1500,,127,15,0,0,0,0,0,0,0,0,0,5,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, Crescent Jade,+15 DEF Sleep/confusion resis. ,Accessory,2,34,34,34,0,1500,,127,0,15,0,0,0,0,0,0,0,0,10,100,0,0,0,0,0,0,0,0,NULL,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/src/items/Items.cpp b/src/items/Items.cpp index 4906947..c2b596f 100644 --- a/src/items/Items.cpp +++ b/src/items/Items.cpp @@ -556,7 +556,7 @@ void Items::outputToCSV() { << std::to_string(item.usableOffset->range) << ',' << std::to_string(item.usableOffset->castTime) << ',' << std::to_string(item.usableOffset->recoveryTime) << ',' - << Moves::getInstance().getMoves().at(item.usableOffset->animation).name << ',' + << animationDefs.at(item.usableOffset->animation) << ',' << effectiveOnDefs.at(item.usableOffset->effectiveOn) << ',' << std::to_string(item.usableOffset->unknown1) << ',' << std::to_string(item.usableOffset->ipDamage) << ',' From c734cd3e2b3033a4f84951bd743c6c7304fa7fb9 Mon Sep 17 00:00:00 2001 From: krogenth Date: Thu, 13 Apr 2023 12:02:30 -0400 Subject: [PATCH 7/7] fix post-build copy event --- vs/G2DataGUI/G2DataGUI.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vs/G2DataGUI/G2DataGUI.vcxproj b/vs/G2DataGUI/G2DataGUI.vcxproj index c956412..804c2b7 100644 --- a/vs/G2DataGUI/G2DataGUI.vcxproj +++ b/vs/G2DataGUI/G2DataGUI.vcxproj @@ -127,7 +127,7 @@ d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - copy /Y "definitions.json" "$(SolutionDir)../build/$(Configuration)/definitions.json" + copy /Y "$(SolutionDir)..\definitions.json" "$(SolutionDir)..\build\$(Configuration)\definitions.json" @@ -149,7 +149,7 @@ d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - copy /Y "definitions.json" "$(SolutionDir)../build/$(Configuration)/definitions.json" + copy /Y "$(SolutionDir)..\definitions.json" "$(SolutionDir)..\build\$(Configuration)\definitions.json"