From 76b589a646ec7d718abd447e026149c4489e478e Mon Sep 17 00:00:00 2001 From: Mosch0512 Date: Thu, 12 Nov 2026 01:51:15 +0100 Subject: [PATCH] feat(items): the excellent options in data The excellent options move from code into data, as OpenMU's three excellent definitions in Options/Excellent.json, linked by the option rules, and "excellent" comes to mean "has an active excellent option" (HasExcellentOptions). - The option type "excellent": the excellent byte turns a definition's options 1 to 6 on. A value can add terms on hero attributes (level, totalLevel, masterLevel), resolved when the options load and stopping at 0 and 65535. - The game gives an item its excellent options from the definitions it links; the effect table maps each attribute to the slot the stat code reads, and the stats add the damage, wizardry and defense rate per cent from the slots. - The stat formulas, the name, the excellent durability, the tooltip state and the ground label ask for active excellent options. Wings with wing options and the Horn of Fenrir (whose byte is its kind) aren't excellent by the byte; Fenrir with a kind keeps the excellent ground label of the original client. - The formula texts show their numbers from the data ({value}, the new {divisor}). - Data Checks: wings and horn mounts that link excellent options, and {divisor} texts without one divisor term. - Picking a character forgets the master level of the hero before until the server sends the new hero's. - Arrows and bolts and the other items that can't be excellent no longer show excellent looks when the byte is set. - Item Requirements counts excellent from the draft's own links; docs and tests for all of it. --- docs/item-data.md | 122 +- .../UI/ItemTools/ItemRequirementTable.cpp | 49 +- src/MuEditor/UI/ItemTools/MuItemTooltipUI.cpp | 5 +- src/bin/Data/Items/Group00_Sword.json | 68 +- src/bin/Data/Items/Group01_Axe.json | 18 +- src/bin/Data/Items/Group02_Mace.json | 38 +- src/bin/Data/Items/Group03_Spear.json | 24 +- src/bin/Data/Items/Group04_Bow.json | 46 +- src/bin/Data/Items/Group05_Staff.json | 58 +- src/bin/Data/Items/Group06_Shield.json | 44 +- src/bin/Data/Items/Group07_Helm.json | 120 +- src/bin/Data/Items/Group08_Armor.json | 136 +- src/bin/Data/Items/Group09_Pants.json | 136 +- src/bin/Data/Items/Group10_Gloves.json | 126 +- src/bin/Data/Items/Group11_Boots.json | 136 +- src/bin/Data/Items/Group13_Helper.json | 24 +- src/bin/Data/Items/Options/Excellent.json | 86 + src/bin/Data/Items/Options/OptionRules.json | 20 +- src/bin/Data/Items/Tooltips/GroundLabels.json | 3 +- src/bin/Data/Items/Tooltips/OptionTexts.json | 182 + src/source/Character/CharacterManager.cpp | 15 + src/source/Character/CharacterManager.h | 6 + .../Data/GameData/ItemData/ItemEnumNames.cpp | 3 +- .../GameData/ItemData/ItemOptionDatabase.cpp | 19 +- .../GameData/ItemData/ItemOptionDatabase.h | 11 +- .../GameData/ItemData/ItemOptionDefinition.h | 44 +- .../GameData/ItemData/ItemOptionEffects.cpp | 19 +- .../GameData/ItemData/ItemOptionEffects.h | 37 + .../ItemData/ItemOptionValidation.cpp | 46 +- .../GameData/ItemData/ItemOptionsJson.cpp | 77 +- .../GameData/ItemData/OptionTextsJson.cpp | 9 +- .../Data/GameData/ItemData/OptionTextsJson.h | 6 +- src/source/Engine/Object/ItemOptionLines.cpp | 20 +- src/source/Engine/Object/ItemOptionLines.h | 18 +- .../Engine/Object/ItemTooltipSnapshot.cpp | 12 + .../Engine/Object/ItemTooltipValues.cpp | 2 +- src/source/Engine/Object/ZzzInfomation.cpp | 182 +- src/source/Engine/Object/ZzzInfomation.h | 2 + src/source/Engine/Object/ZzzInventory.cpp | 21 +- src/source/GameLogic/Items/ItemOptions.cpp | 146 +- src/source/GameLogic/Items/ItemOptions.h | 17 + src/source/GameLogic/Items/ItemStats.cpp | 24 +- src/source/GameLogic/Items/ItemStats.h | 19 +- src/source/Scenes/MainScene.cpp | 3 + tests/data/item_tooltip_snapshot.txt | 3644 ++++++++--------- tests/data/test_item_database_files.cpp | 26 +- tests/data/test_item_option_links.cpp | 89 + tests/data/test_item_option_slots.cpp | 419 ++ tests/data/test_item_options_json.cpp | 66 +- tests/data/test_item_stats.cpp | 20 +- tests/data/test_item_tooltips.cpp | 20 +- 51 files changed, 3914 insertions(+), 2569 deletions(-) create mode 100644 src/bin/Data/Items/Options/Excellent.json diff --git a/docs/item-data.md b/docs/item-data.md index 97eaaea735..224a36f577 100644 --- a/docs/item-data.md +++ b/docs/item-data.md @@ -20,7 +20,7 @@ fields, so it can be exchanged with the server (see [Item Sync](#item-sync)). | `Tooltips/Tooltip.json` | The item tooltip's shared texts and layouts: which stat and requirement lines a tooltip shows; see [Tooltip layouts](#tooltip-layouts) | | `Tooltips/GroundLabels.json` | The looks of the item names on the ground: the label styles and the standard rules; see [Ground labels](#ground-labels) | | `Tooltips/NameCases.json` | The cases each language declines item names in, for texts that name items with a case; see [Name forms](#name-forms) | -| `Options/*.json` | The option definitions, one file per option group (luck and the additional option so far); see [Item options](#item-options) | +| `Options/*.json` | The option definitions, one file per option group (luck, the additional option and the excellent options so far); see [Item options](#item-options) | | `Options/OptionRules.json` | Not read by the game: which option definitions an item's data gives it, for the editor; see [Option rules](#option-rules) | | `Tooltips/OptionTexts.json` | The texts of the options' tooltip lines; see [Item options](#item-options) | | `Sync/KnownDifferences.json` | Not read by the game: the differences from the server that MuEditor's Item Sync marks as wrong in the client or wrong in the server; see [Item Sync](#item-sync) | @@ -579,8 +579,9 @@ background (opaque black when left out) and bold. of its own: the first rule whose `when` holds, with the [conditions](#tooltip-layouts) of the tooltip lines. They are the level ladder of the original client: the set items, the divine archangel weapons, the - socket items, the excellent items (not the second- and third-tier wings and - capes), from +7, with a skill, luck or option, then by level. A tag is read + socket items, the excellent items (the `excellent` condition: active + excellent options, as for the name) and the Horn of Fenrir with a kind, + from +7, with a skill, luck or option, then by level. A tag is read from the item the drop is drawn as: the Weapon of Archangel at +0 to +2 is drawn as a divine archangel weapon. Without a rule that holds the label is white on black. @@ -926,10 +927,11 @@ definitions: the files of `Data/Items/Options` hold the definitions, one file per option group, and each item names the ones it can have in its `options` list. Which of them an item has comes from the server: its item data turns them on (luck by the luck flag, the additional option by its -level). Luck and the additional option of the items that are no wings are in -data so far; the wings' and the Horn of Dinorant's options, the excellent, -harmony, guardian, socket and pet options and the ancient bonus are still -code and move into data one group at a time. +level, the excellent options by the excellent byte). Luck, the additional +option of the items that are no wings and the excellent options are in data +so far; the wings' and the Horn of Dinorant's options, the Wizard's rings', +the harmony, guardian, socket and pet options and the ancient bonus are +still code and move into data one group at a time. ```json { @@ -956,7 +958,8 @@ code and move into data one group at a time. a number; `option` is the additional option's level (the option byte's low four bits, 1 to 15; Season 6 sends 1 to 4), its options numbered (`"number": 0`) by the option type the server sends in the byte's high - four bits, their value by that level. + four bits, their value by that level; `excellent` is the excellent byte, + its options numbered 1 to 6, each turned on by the byte's bit number - 1. Each option group brings its type when it moves into data. An item links at most one definition of a type. - `displayName`: the definition's name by language, English first. @@ -968,7 +971,16 @@ code and move into data one group at a time. and adds its value as it is (`add`), after the other additions (`addFinal`) or in per cent (`percent`). The value is an object: `{"values": 5}` is 5 at every level, `{"values": [4, 8, 12, 16]}` one - value per level from level 1, the last one also above the list. `text` + value per level from level 1, the last one also above the list. `per` + adds terms on the hero's attributes, each rounded down on its own: + `{"values": 0, "per": [{"attribute": "level", "divisor": 20}]}` is the + hero's level / 20 (`times` multiplies instead). The client reads `level`, + `totalLevel` (level plus master level) and `masterLevel`, the master + level only for a hero whose class has one (0 after a character is picked + until the server sends the new hero's); a term on another attribute + adds nothing. Such a value is computed again whenever + the tooltip or the stats ask, so it grows with the hero, and stops at 0 + and 65535, what an option slot holds. `text` names its tooltip lines in `Tooltips/OptionTexts.json`, one name or a list in their order. @@ -1001,6 +1013,50 @@ Feather and the others) have no additional option, as on OpenMU. The wings, the capes and the Horn of Dinorant keep their additional options in code until they move into data. +`Options/Excellent.json` holds the excellent options, as OpenMU's (OpenMU's +server values: a 0.1 % chance, two per item). Each option is the byte's bit +number - 1; the tooltip lists them from number 6 down, as before. + +| Number | `excellentDefense` | `excellentPhysicalAttack` / `excellentWizardryAttack` | +|---|---|---| +| 1 | `moneyAmountRate` 30 %: Zen after hunting | `manaAfterMonsterKillMultiplier` 8: Mana after hunting (mana / 8) | +| 2 | `defenseRatePvm` 10 %: Defense success rate | `healthAfterMonsterKillMultiplier` 8: Life after hunting (life / 8) | +| 3 | `damageReflection` 5 % | `attackSpeedAny` +7 | +| 4 | `armorDamageDecrease` 4 % | `physicalBaseDmgIncrease` / `wizardryBaseDmgIncrease` 2 % | +| 5 | `maximumMana` 4 % | `physicalBaseDmg` / `wizardryBaseDmg` + level / 20 | +| 6 | `maximumHealth` 4 % | `excellentDamageChance` 10 % | + +The client's stats add the damage and wizardry per cent, the defense rate +per cent and level / 20 with the definitions' values; the server computes +the other options (the attack speed among them), whose lines the tooltip +shows. + +The defensive options go to groups 6 to 11 and the rings 13/8, 13/9 and +13/21 to 13/24; the physical attack options to groups 0 to 4 and the +pendants 13/13, 13/26 and 13/28; the wizardry attack options to group 5 +(the summoner's books too, whose stats add them to the curse damage, a +known difference from OpenMU) and the pendants 13/12, 13/25 and 13/27. +Arrows and bolts have none, as on Season 6 and OpenMU. + +The Zen option is +30 %, Season 6's value; OpenMU has +40 %. "Level / 20" +divides the hero's level, as the client did; OpenMU divides level plus +master level (`totalLevel`). + +"Excellent" (the name's prefix and green colour, the excellent +15 +durability, the tooltip state `excellent`, the ground label's excellent +style, the excellent stat bonus and level requirement) means an active excellent option: the item links an +excellent definition with an option its byte turns on. Wings with wing +options use the byte for those, and the Horn of Fenrir for its kind +(Destroy, Protect, Illusion), so they are not excellent by it; the Horn of +Fenrir with a kind keeps the ground label's excellent style, as in the +original client (a rule of the [ground labels](#ground-labels) only it +meets: the other horns' byte is never set). The mixes, the MU +Helper's excellent pick-up, the excellent glow, the durability per cent and +the drop level's excellent bonus still read the byte. The durability per +cent (what wear takes off the stats) reads it only for weapons, shields +and armour, whose byte holds excellent options; wings pass no excellent +flags to it. + `Tooltips/OptionTexts.json` holds the lines' texts: ```json @@ -1015,8 +1071,11 @@ code until they move into data. } ``` -`{value}` is the option's value at the item's level (luck's is 5). The -lines are in the UI's language, English where a text has no translation. +`{value}` is the option's value at the item's level (luck's is 5), and +`{divisor}` the divisor of its first term that has one: the excellent +"+level/{divisor}" shows the 20 of its `{"attribute": "level", "divisor": +20}`, and "+Mana/{value}" the 8 of the mana option. The lines are in the +UI's language, English where a text has no translation. ### Critical damage rate @@ -1090,18 +1149,20 @@ The game does not read it: the editor writes the items' lists from it. "formatVersion": 1, "rules": [ {"options": [], "tags": ["ammunition"]}, - {"options": ["luck", "physicalAndWizardryDamageOption"], "tags": ["magicSword"]}, - {"options": ["luck", "physicalDamageOption"], "group": [0, 1, 2, 3, 4]}, - {"options": ["luck", "curseDamageOption"], "group": [5], "tags": ["summonerBook"]}, - {"options": ["luck", "wizardryDamageOption"], "group": [5]}, - {"options": ["luck", "defenseRateOption"], "group": [6]}, - {"options": ["luck", "defenseOption"], "group": [7, 8, 9, 10, 11]}, + {"options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "tags": ["magicSword"]}, + {"options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "group": [0, 1, 2, 3, 4]}, + {"options": ["luck", "curseDamageOption", "excellentWizardryAttack"], "group": [5], "tags": ["summonerBook"]}, + {"options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "group": [5]}, + {"options": ["luck", "defenseRateOption", "excellentDefense"], "group": [6]}, + {"options": ["luck", "defenseOption", "excellentDefense"], "group": [7, 8, 9, 10, 11]}, {"options": ["luck"], "group": [12], "numbers": [0, 1, 2, 3, 4, 5, 6, 41, 42, 49]}, {"options": ["luck"], "slot": ["wings"], "wingTier": ["third"]}, {"options": ["luck"], "group": [13], "numbers": [30]}, - {"options": ["jewelryHealthRecovery"], "group": [13], "numbers": [8, 9, 12, 13, 21, 22, 23, 25, 26, 27]}, - {"options": ["ringOfMagicMana"], "group": [13], "numbers": [24]}, - {"options": ["pendantOfAbilityAg"], "group": [13], "numbers": [28]} + {"options": ["jewelryHealthRecovery", "excellentDefense"], "group": [13], "numbers": [8, 9, 21, 22, 23]}, + {"options": ["ringOfMagicMana", "excellentDefense"], "group": [13], "numbers": [24]}, + {"options": ["jewelryHealthRecovery", "excellentWizardryAttack"], "group": [13], "numbers": [12, 25, 27]}, + {"options": ["jewelryHealthRecovery", "excellentPhysicalAttack"], "group": [13], "numbers": [13, 26]}, + {"options": ["pendantOfAbilityAg", "excellentPhysicalAttack"], "group": [13], "numbers": [28]} ] } ``` @@ -1114,7 +1175,7 @@ more: `numbers`, item numbers (with `group`), and a tag with `!` before it shipped rules give luck to the items the client gave it before: groups 0 to 11 but arrows and bolts, the wings 12/0 to 12/6, 12/41 and 12/42, the Cape of Fighter (12/49), the Cape of Lord (13/30) and the third tier -wings; and the additional options of the table above. Since the first +wings; and the additional and excellent options above. Since the first rule counts, a rule lists all of its items' definitions. A test checks that every shipped item's list is the one its rules give. @@ -1124,15 +1185,24 @@ file that cannot be read or is no JSON, a missing or newer English) or `options`, a type the game does not know, a name used twice, an option without `attribute` or with none or more than one of `add`, `addFinal` and `percent`, a value that is no object of whole numbers from -0 to 65535 or that has `perLevel`, a number used twice in a definition, a -luck definition with more than one option or a numbered one, OpenMU +0 to 65535 or that has `perLevel`, a term (`per`) without `attribute` or +without exactly one of `times` and `divisor` (whole numbers from 1), a +number used twice in a definition, an additional option's number above 15, +an excellent option's number outside 1 to 6, a luck definition with more +than one option or a numbered one, OpenMU labels or server values of the wrong kind, and a rule naming a definition that does not exist or a condition it does not have. Errors: an item linking a definition that does not exist (the link is left out) -or two of one type (the later one is left out), an option naming a text +or two of one type (the later one is left out), wings or a horn +mount linking excellent options (the excellent byte of wings holds their +wing options, the Horn of Fenrir's its kind; no horn is excellent), an option naming a text the texts do not have, and a text without English or with a placeholder -other than `{value}` (the lines that name it are left out). Warnings: -unknown fields, an attribute the client does not compute, a definition no +other than `{value}` and `{divisor}` (the lines that name it are left +out). Warnings: +unknown fields, an attribute the client does not compute, a term on a hero +attribute the client does not read, a text with `{divisor}` on an option +without a term that has a divisor (the line shows 0 there) or with several +(it shows the first one's), a definition no item and no rule links, a text no option names and a text in a language the game has no texts in. diff --git a/src/MuEditor/UI/ItemTools/ItemRequirementTable.cpp b/src/MuEditor/UI/ItemTools/ItemRequirementTable.cpp index c1e285f847..21cd79fecb 100644 --- a/src/MuEditor/UI/ItemTools/ItemRequirementTable.cpp +++ b/src/MuEditor/UI/ItemTools/ItemRequirementTable.cpp @@ -31,26 +31,40 @@ std::string OrDefault(std::string name) return name.empty() ? std::string(Data::Items::StatProfileNames::Default) : name; } -GameLogic::Items::ItemStatValues ComputeValuesAt(const ItemDefinition& item, const ITEM_ATTRIBUTE& attribute, - const Data::Items::ItemStatProfile& profile, - const RequirementVariant& variant, int level) +// What a variant's option level and excellent options give, the same at every level. +struct VariantOptions { - const GameLogic::Items::ItemStatSources sources{attribute, &item, profile, - item.slot == Data::Items::ItemSlot::Wings}; - const int itemType = Data::Items::MakeItemType(item.group, item.number); - // The option level counts as the game counts it (option type 0), from the draft's own option links and slot: the - // value list's last level above the list. Resolved only for a level: the table and the weight searches ask - // mostly without one. + std::vector links; int optionLevel = 0; - if (variant.optionLevel > 0) +}; + +// The option level and the excellent options count as the game counts them (option type 0), from the draft's own +// option links and slot: the value list's last level above the list. Resolved only for a level or excellent: the +// table and the weight searches ask mostly without them. +VariantOptions ResolveVariantOptions(const ItemDefinition& item, const RequirementVariant& variant) +{ + VariantOptions options; + if (variant.optionLevel > 0 || variant.excellent) { - const std::vector links = g_ItemDatabase.GetOptions().ResolveLinks(item.options); - optionLevel = GameLogic::Items::CountAdditionalOptionLevel(links, item.slot == Data::Items::ItemSlot::Wings, - variant.optionLevel, 0); + options.links = g_ItemDatabase.GetOptions().ResolveLinks(item.options); + options.optionLevel = GameLogic::Items::CountAdditionalOptionLevel( + options.links, item.slot == Data::Items::ItemSlot::Wings, variant.optionLevel, 0); } - const GameLogic::Items::ItemStatInput input{itemType, level, static_cast(variant.excellent ? 1 : 0), + return options; +} + +GameLogic::Items::ItemStatValues ComputeValuesAt(const ItemDefinition& item, const ITEM_ATTRIBUTE& attribute, + const Data::Items::ItemStatProfile& profile, + const RequirementVariant& variant, const VariantOptions& options, + int level) +{ + const int itemType = Data::Items::MakeItemType(item.group, item.number); + // Excellent: every excellent option on, so a draft whose excellent definition lacks one of them is excellent too. + const BYTE excellentFlags = variant.excellent ? Data::Items::AllExcellentOptionFlags : 0; + const GameLogic::Items::ItemStatSources sources{attribute, &item, profile, options.links}; + const GameLogic::Items::ItemStatInput input{itemType, level, excellentFlags, static_cast(variant.ancient ? 1 : 0), - static_cast(std::clamp(optionLevel, 0, 255))}; + static_cast(std::clamp(options.optionLevel, 0, 255))}; return GameLogic::Items::ComputeItemStats(sources, input); } @@ -194,10 +208,11 @@ ItemLevelValues ComputeItemLevelValues(const ItemDefinition& item, const Require ITEM_ATTRIBUTE attribute{}; Data::Items::ToItemAttribute(item, attribute); const Data::Items::ItemStatProfile& profile = FindStatProfile(item); + const VariantOptions options = ResolveVariantOptions(item, variant); ItemLevelValues values{}; for (int level = 0; level < Data::Items::ItemLevelCount; ++level) { - values[static_cast(level)] = ComputeValuesAt(item, attribute, profile, variant, level); + values[static_cast(level)] = ComputeValuesAt(item, attribute, profile, variant, options, level); } return values; } @@ -207,7 +222,7 @@ GameLogic::Items::ItemStatValues ComputeItemValuesAt(const ItemDefinition& item, { ITEM_ATTRIBUTE attribute{}; Data::Items::ToItemAttribute(item, attribute); - return ComputeValuesAt(item, attribute, FindStatProfile(item), variant, level); + return ComputeValuesAt(item, attribute, FindStatProfile(item), variant, ResolveVariantOptions(item, variant), level); } RequirementTable ComputeRequirementTable(const ItemDefinition& item, const RequirementVariant& variant) diff --git a/src/MuEditor/UI/ItemTools/MuItemTooltipUI.cpp b/src/MuEditor/UI/ItemTools/MuItemTooltipUI.cpp index e201319e14..f55390a3cf 100644 --- a/src/MuEditor/UI/ItemTools/MuItemTooltipUI.cpp +++ b/src/MuEditor/UI/ItemTools/MuItemTooltipUI.cpp @@ -15,6 +15,7 @@ #include "../MuEditor/UI/Common/MuEditorWindowIds.h" #include "Core/Text/Utf8.h" #include "Data/GameData/ItemData/ItemDatabase.h" +#include "Data/GameData/ItemData/ItemOptionDefinition.h" #include "Data/GameData/ItemData/ItemTooltipLayouts.h" #include "Data/GameData/ItemData/ItemType.h" #include "Engine/Object/ItemDropModel.h" @@ -40,8 +41,6 @@ constexpr float LevelFieldWidth = 40.0f; constexpr float SetComboWidth = 200.0f; constexpr float LayoutComboWidth = 240.0f; constexpr int MaxLevel = Data::Items::ItemLevelCount - 1; -// Every excellent option: the label only asks whether the item has one. -constexpr BYTE AllExcellentOptions = 0x3F; // The option level the preview gives: the label only asks whether the item has one. constexpr BYTE PreviewOptionLevel = 1; @@ -406,7 +405,7 @@ ITEM CMuItemTooltipUI::MakePreviewItem(int itemType) const params.WithOption = m_option; params.OptionLevel = m_option ? PreviewOptionLevel : 0; params.HasExcellentOption = m_excellent; - params.ExcellentFlags = m_excellent ? AllExcellentOptions : 0; + params.ExcellentFlags = m_excellent ? Data::Items::AllExcellentOptionFlags : 0; params.IsAncient = m_set > 0; params.AncientDiscriminator = static_cast(m_set); ITEM item; diff --git a/src/bin/Data/Items/Group00_Sword.json b/src/bin/Data/Items/Group00_Sword.json index 8a18d08e10..7b9d64d6c1 100644 --- a/src/bin/Data/Items/Group00_Sword.json +++ b/src/bin/Data/Items/Group00_Sword.json @@ -11,7 +11,7 @@ "pl": "Kris", "pt": "Cris" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 2, "slot": "mainHand", @@ -46,7 +46,7 @@ "pl": "Krótki miecz", "pt": "Espada curta" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -80,7 +80,7 @@ "pl": "Rapier", "pt": "Rapieira" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -113,7 +113,7 @@ "pl": "Katana", "pt": "Cataná" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -145,7 +145,7 @@ "pl": "Miecz Zabójcy", "pt": "Espada do assassino" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -177,7 +177,7 @@ "pl": "Ostrze", "pt": "Lâmina" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -211,7 +211,7 @@ "pl": "Gladius", "pt": "Gládio" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -243,7 +243,7 @@ "pl": "Falchion", "pt": "Cimitarra" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -274,7 +274,7 @@ "pl": "Wężowy miecz", "pt": "Espada da serpente" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -305,7 +305,7 @@ "pl": "Miecz Salamandry", "pt": "Espada da salamandra" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -336,7 +336,7 @@ "pl": "Miecz świetlny", "pt": "Sabre de luz" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -369,7 +369,7 @@ "pl": "Legendarny miecz", "pt": "Espada lendária" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -400,7 +400,7 @@ "pl": "Słoneczny miecz", "pt": "Espada helíaca" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -431,7 +431,7 @@ "pl": "Podwójne ostrze", "pt": "Lâmina dupla" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -463,7 +463,7 @@ "pl": "Miecz błyskawic", "pt": "Espada de luz" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -495,7 +495,7 @@ "pl": "Miecz olbrzyma", "pt": "Espada gigante" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -526,7 +526,7 @@ "pl": "Miecz Zniszczenia", "pt": "Espada da destruição" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -557,7 +557,7 @@ "pl": "Mroczny Łamacz", "pt": "Destruidora Negra" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -588,7 +588,7 @@ "pl": "Ostrze Gromu", "pt": "Lâmina do trovão" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -620,7 +620,7 @@ "pt": "Espada divina do arcanjo" }, "tags": ["divineArchangelWeapon", "valuable"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "nameLines": [ { "text": { @@ -666,7 +666,7 @@ "pl": "Ostrze Rycerza", "pt": "Lâmina do cavaleiro" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -697,7 +697,7 @@ "pt": "Lâmina do Império negro" }, "tags": ["magicSword"], - "options": ["luck", "physicalAndWizardryDamageOption"], + "options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -730,7 +730,7 @@ "pl": "Kościane ostrze", "pt": "Lâmina de osso" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -762,7 +762,7 @@ "pt": "Lâmina da explosão" }, "tags": ["magicSword"], - "options": ["luck", "physicalAndWizardryDamageOption"], + "options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -796,7 +796,7 @@ "pl": "Świt", "pt": "Aurora" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -827,7 +827,7 @@ "pt": "Dançarino da espada" }, "tags": ["magicSword"], - "options": ["luck", "physicalAndWizardryDamageOption"], + "options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -859,7 +859,7 @@ "pl": "Flamberga", "pt": "Flameberge" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -889,7 +889,7 @@ "pl": "Łamacz mieczy", "pt": "Destruidora de Espadas" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -920,7 +920,7 @@ "pt": "Espada bastarda das runas" }, "tags": ["magicSword"], - "options": ["luck", "physicalAndWizardryDamageOption"], + "options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -953,7 +953,7 @@ "pt": "Lâmina das runas" }, "tags": ["magicSword"], - "options": ["luck", "physicalAndWizardryDamageOption"], + "options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -986,7 +986,7 @@ "pl": "Święta rękawica", "pt": "Luvas Sagradas" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 2, "slot": "mainHand", @@ -1016,7 +1016,7 @@ "pl": "Pazur Świętej Burzy", "pt": "Garra de Tempestade Sagrada" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 2, "slot": "mainHand", @@ -1045,7 +1045,7 @@ "pl": "Rękawica Przeszywającego Ostrza", "pt": "Luvas de Lâmina Perfurante" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 2, "slot": "mainHand", @@ -1074,7 +1074,7 @@ "pl": "Gwiazda Duszy Feniksa", "pt": "Estrela de Alma de Fênix" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 2, "slot": "mainHand", diff --git a/src/bin/Data/Items/Group01_Axe.json b/src/bin/Data/Items/Group01_Axe.json index 944f7712d8..a05550f87f 100644 --- a/src/bin/Data/Items/Group01_Axe.json +++ b/src/bin/Data/Items/Group01_Axe.json @@ -11,7 +11,7 @@ "pl": "Mały topór", "pt": "Machado pequeno" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -45,7 +45,7 @@ "pl": "Toporek", "pt": "Machado de mão" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -79,7 +79,7 @@ "pl": "Podwójny topór", "pt": "Machado duplo" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -110,7 +110,7 @@ "pl": "Tomahawk", "pt": "Machadinha" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -142,7 +142,7 @@ "pl": "Elfi topór", "pt": "Machado élfico" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -174,7 +174,7 @@ "pl": "Topór bojowy", "pt": "Machado de batalha" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -206,7 +206,7 @@ "pl": "Topór Nikei", "pt": "Machado de Nikea" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -238,7 +238,7 @@ "pl": "Topór Larkana", "pt": "Machado de Larkan" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -269,7 +269,7 @@ "pl": "Topór półksiężyca", "pt": "Machado crescente" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", diff --git a/src/bin/Data/Items/Group02_Mace.json b/src/bin/Data/Items/Group02_Mace.json index bbd1723906..fa8b5fbe80 100644 --- a/src/bin/Data/Items/Group02_Mace.json +++ b/src/bin/Data/Items/Group02_Mace.json @@ -11,7 +11,7 @@ "pl": "Buława", "pt": "Maça" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -42,7 +42,7 @@ "pl": "Morgenstern", "pt": "Estrela da manhã" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -74,7 +74,7 @@ "pl": "Cep bojowy", "pt": "Mangual" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -106,7 +106,7 @@ "pl": "Wielki młot", "pt": "Martelo grande" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -138,7 +138,7 @@ "pl": "Kryształowy morgenstern", "pt": "Estrela da manhã de cristal" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -172,7 +172,7 @@ "pl": "Kryształowy miecz", "pt": "Espada de cristal" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -206,7 +206,7 @@ "pl": "Topór Smoka Chaosu", "pt": "Machado do dragão do caos" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -238,7 +238,7 @@ "pl": "Buława żywiołów", "pt": "Maça elemental" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -268,7 +268,7 @@ "pt": "Cetro de batalha" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -300,7 +300,7 @@ "pt": "Cetro do mestre" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -332,7 +332,7 @@ "pt": "Grande cetro" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -364,7 +364,7 @@ "pt": "Cetro do Lorde" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -396,7 +396,7 @@ "pt": "Grande cetro do Lorde" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -428,7 +428,7 @@ "pt": "Cetro divino do arcanjo" }, "tags": ["divineArchangelWeapon", "sceptre", "valuable"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "nameLines": [ { "text": { @@ -475,7 +475,7 @@ "pt": "Cetro Soleil" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -508,7 +508,7 @@ "pt": "Cetro brilhante" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -538,7 +538,7 @@ "pl": "Mroźna buława", "pt": "Maça de gelo" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -569,7 +569,7 @@ "pt": "Cetro absoluto" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -601,7 +601,7 @@ "pt": "Cetro golpeador" }, "tags": ["sceptre"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 1, "height": 4, "slot": "mainHand", diff --git a/src/bin/Data/Items/Group03_Spear.json b/src/bin/Data/Items/Group03_Spear.json index 535b83e3f1..7e9e18e72b 100644 --- a/src/bin/Data/Items/Group03_Spear.json +++ b/src/bin/Data/Items/Group03_Spear.json @@ -11,7 +11,7 @@ "pl": "Lekka włócznia", "pt": "Lança de luz" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -44,7 +44,7 @@ "pl": "Włócznia", "pt": "Lança" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -76,7 +76,7 @@ "pl": "Smocza lanca", "pt": "Lança do dragão" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -108,7 +108,7 @@ "pl": "Trójząb olbrzyma", "pt": "Tridente gigante" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -140,7 +140,7 @@ "pl": "Wężowa włócznia", "pt": "Lança da serpente" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -173,7 +173,7 @@ "pl": "Podwójny czekan", "pt": "Gadanha dupla" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -205,7 +205,7 @@ "pl": "Halabarda", "pt": "Alabarda" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -237,7 +237,7 @@ "pl": "Berdysz", "pt": "Berdysh" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -270,7 +270,7 @@ "pl": "Wielka kosa", "pt": "Grande foice" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -303,7 +303,7 @@ "pl": "Gizarma Balroga", "pt": "Gancho de Balrog" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -336,7 +336,7 @@ "pl": "Smocza włócznia", "pt": "Lança do dragão" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -367,7 +367,7 @@ "pl": "Brova", "pt": "Brova" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", diff --git a/src/bin/Data/Items/Group04_Bow.json b/src/bin/Data/Items/Group04_Bow.json index 5421e510d1..28f34c9d1d 100644 --- a/src/bin/Data/Items/Group04_Bow.json +++ b/src/bin/Data/Items/Group04_Bow.json @@ -11,7 +11,7 @@ "pl": "Krótki łuk", "pt": "Arco curto" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "offHand", @@ -42,7 +42,7 @@ "pl": "Łuk", "pt": "Arco" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "offHand", @@ -73,7 +73,7 @@ "pl": "Elfi łuk", "pt": "Arco élfico" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "offHand", @@ -104,7 +104,7 @@ "pl": "Łuk bojowy", "pt": "Arco de batalha" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "offHand", @@ -135,7 +135,7 @@ "pl": "Tygrysi łuk", "pt": "Arco do tigre" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -166,7 +166,7 @@ "pl": "Srebrny łuk", "pt": "Arco de prata" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -197,7 +197,7 @@ "pl": "Łuk Natury Chaosu", "pt": "Arco da natureza do caos" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -264,7 +264,7 @@ "pl": "Kusza", "pt": "Besta" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 2, "slot": "mainHand", @@ -295,7 +295,7 @@ "pl": "Złota kusza", "pt": "Besta dourada" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 2, "slot": "mainHand", @@ -326,7 +326,7 @@ "pl": "Arkebuz", "pt": "Arquebus" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 2, "slot": "mainHand", @@ -357,7 +357,7 @@ "pl": "Lekka kusza", "pt": "Besta leve" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -388,7 +388,7 @@ "pl": "Wężowa kusza", "pt": "Besta da serpente" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -419,7 +419,7 @@ "pl": "Kusza Błękitnego Skrzydła", "pt": "Besta Bluewing" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -450,7 +450,7 @@ "pl": "Kusza Wodnego Złota", "pt": "Besta Aquagold" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -517,7 +517,7 @@ "pl": "Święta kusza", "pt": "Besta do santo" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -548,7 +548,7 @@ "pl": "Niebiański łuk", "pt": "Arco celestial" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -580,7 +580,7 @@ "pt": "Besta divina do arcanjo" }, "tags": ["divineArchangelWeapon", "valuable"], - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "nameLines": [ { "text": { @@ -625,7 +625,7 @@ "pl": "Kusza Wielkich Rządów", "pt": "Grande besta do Império" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -656,7 +656,7 @@ "pl": "Łuk Żmii", "pt": "Arco víbora de flecha" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -687,7 +687,7 @@ "pl": "Łuk Wiatru Sylfy", "pt": "Arco vento da silfe" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -719,7 +719,7 @@ "pl": "Łuk Albatrosa", "pt": "Arco do albatroz" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -749,7 +749,7 @@ "pl": "Mroczne Żądło", "pt": "Golpeador negro" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", @@ -781,7 +781,7 @@ "pl": "Łuk Aileen", "pt": "Arco do Aileen" }, - "options": ["luck", "physicalDamageOption"], + "options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "width": 2, "height": 4, "slot": "offHand", diff --git a/src/bin/Data/Items/Group05_Staff.json b/src/bin/Data/Items/Group05_Staff.json index 203e0b19bd..507788e6cc 100644 --- a/src/bin/Data/Items/Group05_Staff.json +++ b/src/bin/Data/Items/Group05_Staff.json @@ -11,7 +11,7 @@ "pl": "Kostur czaszki", "pt": "Bastão da caveira" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 3, "slot": "mainHand", @@ -42,7 +42,7 @@ "pl": "Anielski kostur", "pt": "Bastão angelical" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -73,7 +73,7 @@ "pl": "Wężowy kostur", "pt": "Bastão da serpente" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 3, "slot": "mainHand", @@ -104,7 +104,7 @@ "pl": "Kostur gromu", "pt": "Bastão do trovão" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -136,7 +136,7 @@ "pl": "Kostur Gorgony", "pt": "Bastão da górgone" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -167,7 +167,7 @@ "pl": "Legendarny kostur", "pt": "Bastão lendário" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -197,7 +197,7 @@ "pl": "Kostur Wskrzeszenia", "pt": "Bastão da ressurreição" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -228,7 +228,7 @@ "pl": "Kostur Błyskawic Chaosu", "pt": "Bastão do relâmpago do caos" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -260,7 +260,7 @@ "pl": "Kostur Zniszczenia", "pt": "Bastão da destruição" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 2, "height": 4, "slot": "mainHand", @@ -292,7 +292,7 @@ "pl": "Kostur Smoczej Duszy", "pt": "Bastão da alma do dragão" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -323,7 +323,7 @@ "pt": "Bastão divino do arcanjo" }, "tags": ["divineArchangelWeapon", "valuable"], - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "nameLines": [ { "text": { @@ -368,7 +368,7 @@ "pl": "Kostur Kunduna", "pt": "Bastão de Kundun" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -398,7 +398,7 @@ "pl": "Kostur Wielkiej Żmii", "pt": "Grande bastão da víbora" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -429,7 +429,7 @@ "pl": "Platynowy kostur", "pt": "Bastão de platina" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -458,7 +458,7 @@ "pl": "Różdżka tajemnic", "pt": "Cajado misterioso" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -487,7 +487,7 @@ "pl": "Różdżka Gwałtownego Wiatru", "pt": "Cajado do vento violento" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -516,7 +516,7 @@ "pl": "Różdżka Czerwonego Skrzydła", "pt": "Cajado da asa vermelha" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -545,7 +545,7 @@ "pl": "Pradawna różdżka", "pt": "Cajado ancestral" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -574,7 +574,7 @@ "pl": "Demoniczna różdżka", "pt": "Cajado demoníaco" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -603,7 +603,7 @@ "pl": "Różdżka Burzowego Błysku", "pt": "Caj. Relâmpago de Tempestade" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -634,7 +634,7 @@ "pl": "Różdżka Wiecznego Skrzydła", "pt": "Cajado da asa eterna" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -665,7 +665,7 @@ "pt": "Livro de Samut" }, "tags": ["summonerBook"], - "options": ["luck", "curseDamageOption"], + "options": ["luck", "curseDamageOption", "excellentWizardryAttack"], "width": 1, "height": 2, "slot": "offHand", @@ -694,7 +694,7 @@ "pt": "Livro de Neil" }, "tags": ["summonerBook"], - "options": ["luck", "curseDamageOption"], + "options": ["luck", "curseDamageOption", "excellentWizardryAttack"], "width": 1, "height": 2, "slot": "offHand", @@ -723,7 +723,7 @@ "pt": "Livro de Lagle" }, "tags": ["summonerBook"], - "options": ["luck", "curseDamageOption"], + "options": ["luck", "curseDamageOption", "excellentWizardryAttack"], "width": 1, "height": 2, "slot": "offHand", @@ -751,7 +751,7 @@ "pl": "Śmiercionośny kostur", "pt": "Bastão letal" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -782,7 +782,7 @@ "pl": "Imperialny kostur", "pt": "Bastão inberial" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -815,7 +815,7 @@ "pl": "Chromatyczny kostur", "pt": "Bastão cromático" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -845,7 +845,7 @@ "pl": "Różdżka Kruka", "pt": "Cajado do corvo" }, - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "width": 1, "height": 4, "slot": "mainHand", @@ -875,7 +875,7 @@ "pt": "Bastão Divino do Arcanjo" }, "tags": ["divineArchangelWeapon", "valuable"], - "options": ["luck", "wizardryDamageOption"], + "options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "nameLines": [ { "text": { diff --git a/src/bin/Data/Items/Group06_Shield.json b/src/bin/Data/Items/Group06_Shield.json index 0f91ef234b..4accabdacd 100644 --- a/src/bin/Data/Items/Group06_Shield.json +++ b/src/bin/Data/Items/Group06_Shield.json @@ -11,7 +11,7 @@ "pl": "Mała tarcza", "pt": "Escudo pequeno" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -42,7 +42,7 @@ "pl": "Rogowa tarcza", "pt": "Escudo de chifre" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -71,7 +71,7 @@ "pl": "Tarcza migdałowa", "pt": "Escudo ogival" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -100,7 +100,7 @@ "pl": "Elfia tarcza", "pt": "Escudo élfico" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -128,7 +128,7 @@ "pl": "Puklerz", "pt": "Broquel" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -160,7 +160,7 @@ "pl": "Tarcza Pogromcy Smoków", "pt": "Escudo do matador de dragões" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -191,7 +191,7 @@ "pl": "Tarcza czaszki", "pt": "Escudo da caveira" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -223,7 +223,7 @@ "pl": "Kolczasta tarcza", "pt": "Escudo com espinhos" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -253,7 +253,7 @@ "pl": "Tarcza wieżowa", "pt": "Escudo de torre" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -284,7 +284,7 @@ "pl": "Płytowa tarcza", "pt": "Escudo de placa" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -314,7 +314,7 @@ "pl": "Duża okrągła tarcza", "pt": "Grande escudo redondo" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -344,7 +344,7 @@ "pl": "Wężowa tarcza", "pt": "Escudo da serpente" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -375,7 +375,7 @@ "pl": "Brązowa tarcza", "pt": "Escudo de bronze" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -404,7 +404,7 @@ "pl": "Smocza tarcza", "pt": "Escudo do dragão" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -434,7 +434,7 @@ "pl": "Legendarna tarcza", "pt": "Escudo lendário" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 3, "slot": "offHand", @@ -464,7 +464,7 @@ "pl": "Tarcza Wielkiej Duszy", "pt": "Grande escudo da alma" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 3, "slot": "offHand", @@ -492,7 +492,7 @@ "pl": "Tarcza żywiołów", "pt": "Escudo elemental" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -521,7 +521,7 @@ "pl": "Szkarłatna Chwała", "pt": "Glória carmesim" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -551,7 +551,7 @@ "pl": "Tarcza Salamandry", "pt": "Escudo da salamandra" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -581,7 +581,7 @@ "pl": "Mroźna Bariera", "pt": "Barreira gelada" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -611,7 +611,7 @@ "pl": "Tarcza Strażnika", "pt": "Escudo do guardião" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", @@ -641,7 +641,7 @@ "pl": "Tarcza z krzyżem", "pt": "Escudo em cruz" }, - "options": ["luck", "defenseRateOption"], + "options": ["luck", "defenseRateOption", "excellentDefense"], "width": 2, "height": 2, "slot": "offHand", diff --git a/src/bin/Data/Items/Group07_Helm.json b/src/bin/Data/Items/Group07_Helm.json index 60bdf5c272..e8adc3e699 100644 --- a/src/bin/Data/Items/Group07_Helm.json +++ b/src/bin/Data/Items/Group07_Helm.json @@ -11,7 +11,7 @@ "pl": "Brązowy hełm", "pt": "Elmo de bronze" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -38,7 +38,7 @@ "pl": "Smoczy hełm", "pt": "Elmo do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -64,7 +64,7 @@ "pl": "Pikowany hełm", "pt": "Elmo acolchoado" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -89,7 +89,7 @@ "pl": "Legendarny hełm", "pt": "Elmo lendário" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -114,7 +114,7 @@ "pl": "Kościany hełm", "pt": "Elmo de osso" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -139,7 +139,7 @@ "pl": "Skórzany hełm", "pt": "Elmo de couro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -166,7 +166,7 @@ "pl": "Łuskowy hełm", "pt": "Elmo de escamas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -193,7 +193,7 @@ "pl": "Maska Sfinksa", "pt": "Máscara da esfinge" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -218,7 +218,7 @@ "pl": "Mosiężny hełm", "pt": "Elmo de latão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -245,7 +245,7 @@ "pl": "Płytowy hełm", "pt": "Elmo de placa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -271,7 +271,7 @@ "pl": "Hełm z pnączy", "pt": "Elmo da vinha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -297,7 +297,7 @@ "pl": "Jedwabny hełm", "pt": "Elmo de seda" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -323,7 +323,7 @@ "pl": "Hełm Wiatru", "pt": "Elmo do vento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -349,7 +349,7 @@ "pl": "Hełm Ducha", "pt": "Elmo do espírito" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -375,7 +375,7 @@ "pl": "Hełm Strażnika", "pt": "Elmo do guardião" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -401,7 +401,7 @@ "pl": "Hełm Czarnego Smoka", "pt": "Elmo do dragão negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -427,7 +427,7 @@ "pl": "Hełm Mrocznego Feniksa", "pt": "Elmo da fênix negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -453,7 +453,7 @@ "pl": "Hełm Wielkiej Duszy", "pt": "Grande elmo da alma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -479,7 +479,7 @@ "pl": "Boski hełm", "pt": "Elmo divino" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -505,7 +505,7 @@ "pl": "Hełm Wielkiego Smoka", "pt": "Grande elmo do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -531,7 +531,7 @@ "pl": "Hełm Mrocznej Duszy", "pt": "Elmo da alma negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -557,7 +557,7 @@ "pl": "Hełm Czerwonego Ducha", "pt": "Elmo do espírito vermelho" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -583,7 +583,7 @@ "pl": "Lekka maska płytowa", "pt": "Máscara de placa leve" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -609,7 +609,7 @@ "pl": "Adamantytowa maska", "pt": "Máscara de adamantina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -635,7 +635,7 @@ "pl": "Maska z mrocznej stali", "pt": "Máscara de aço negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -661,7 +661,7 @@ "pl": "Maska Mrocznego Mistrza", "pt": "Máscara do Mestre Negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -687,7 +687,7 @@ "pl": "Hełm Smoczego Rycerza", "pt": "Elmo do cavaleiro dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -714,7 +714,7 @@ "pl": "Hełm Jadowitej Mgły", "pt": "Elmo da névoa de veneno" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -741,7 +741,7 @@ "pl": "Hełm Sylphid Ray", "pt": "Elmo do raio silfídico" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -768,7 +768,7 @@ "pl": "Maska Słońca", "pt": "Máscara da luz do sol" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -795,7 +795,7 @@ "pl": "Hełm Ashcrow", "pt": "Elmo de Ashcrow" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -820,7 +820,7 @@ "pl": "Hełm Zaćmienia", "pt": "Elmo do eclipse" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -845,7 +845,7 @@ "pl": "Hełm Iris", "pt": "Elmo de Iris" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -870,7 +870,7 @@ "pl": "Chwalebna maska", "pt": "Máscara gloriosa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -895,7 +895,7 @@ "pl": "Hełm Gwałtownego Wiatru", "pt": "Elmo do vento violento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -920,7 +920,7 @@ "pl": "Hełm Czerwonego Skrzydła", "pt": "Elmo da asa vermelha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -946,7 +946,7 @@ "pl": "Pradawny hełm", "pt": "Elmo antigo" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -972,7 +972,7 @@ "pl": "Demoniczny hełm", "pt": "Elmo demoníaco" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -997,7 +997,7 @@ "pl": "Hełm Burzowego Błysku", "pt": "Elmo Relâmpago de Tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1024,7 +1024,7 @@ "pl": "Hełm Wiecznego Skrzydła", "pt": "Elmo da asa eterna" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1051,7 +1051,7 @@ "pl": "Hełm Tytana", "pt": "Elmo do titã" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1077,7 +1077,7 @@ "pl": "Hełm Śmiałka", "pt": "Elmo do guerreiro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1103,7 +1103,7 @@ "pl": "Hełm Serafina", "pt": "Elmo de serafim" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1129,7 +1129,7 @@ "pl": "Hełm Wiary", "pt": "Elmo da fé" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1156,7 +1156,7 @@ "pl": "Królewska maska", "pt": "Máscara real" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1182,7 +1182,7 @@ "pl": "Hełm Hadesa", "pt": "Elmo de Hades" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1212,7 +1212,7 @@ "pl": "Hełm Świętego Ognia", "pt": "Elmo de Fogo Sagrado" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1238,7 +1238,7 @@ "pl": "Hełm Storm Jahad", "pt": "Elmo de Tempestade Zahard" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1263,7 +1263,7 @@ "pl": "Hełm Piercing Groove", "pt": "Elmo de Entalhe Perfurante" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1289,7 +1289,7 @@ "pt": "Elmo de escamas" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1323,7 +1323,7 @@ "pt": "Elmo de seda" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1355,7 +1355,7 @@ "pt": "Elmo de Esfinge" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1387,7 +1387,7 @@ "pt": "Elmo do vento violento" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1419,7 +1419,7 @@ "pt": "Máscara de adamantina" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1451,7 +1451,7 @@ "pt": "Elmo de Dragão" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1483,7 +1483,7 @@ "pt": "Elmo de Guardião" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1515,7 +1515,7 @@ "pt": "Elmo Lendário" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1547,7 +1547,7 @@ "pt": "Elmo da asa vermelha" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1579,7 +1579,7 @@ "pt": "Elmo de Tempestade Zahard" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", @@ -1610,7 +1610,7 @@ "pl": "Hełm Duszy Feniksa", "pt": "Elmo de Alma de Fênix" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "helm", diff --git a/src/bin/Data/Items/Group08_Armor.json b/src/bin/Data/Items/Group08_Armor.json index 372d762c94..42abd4c5c1 100644 --- a/src/bin/Data/Items/Group08_Armor.json +++ b/src/bin/Data/Items/Group08_Armor.json @@ -11,7 +11,7 @@ "pl": "Brązowa zbroja", "pt": "Armadura de bronze" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -39,7 +39,7 @@ "pl": "Smocza zbroja", "pt": "Armadura do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -66,7 +66,7 @@ "pl": "Pikowana zbroja", "pt": "Armadura acolchoada" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -92,7 +92,7 @@ "pl": "Legendarna zbroja", "pt": "Armadura lendária" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -118,7 +118,7 @@ "pl": "Kościana zbroja", "pt": "Armadura de osso" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -144,7 +144,7 @@ "pl": "Skórzana zbroja", "pt": "Armadura de couro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -172,7 +172,7 @@ "pl": "Łuskowa zbroja", "pt": "Armadura de escamas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -200,7 +200,7 @@ "pl": "Zbroja Sfinksa", "pt": "Armadura da esfinge" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -226,7 +226,7 @@ "pl": "Mosiężna zbroja", "pt": "Armadura de latão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -254,7 +254,7 @@ "pl": "Płytowa zbroja", "pt": "Armadura de placa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -281,7 +281,7 @@ "pl": "Zbroja z pnączy", "pt": "Armadura da vinha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -307,7 +307,7 @@ "pl": "Jedwabna zbroja", "pt": "Armadura de seda" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -333,7 +333,7 @@ "pl": "Zbroja Wiatru", "pt": "Armadura do vento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -359,7 +359,7 @@ "pl": "Zbroja Ducha", "pt": "Armadura do espírito" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -385,7 +385,7 @@ "pl": "Zbroja Strażnika", "pt": "Armadura do guardião" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -411,7 +411,7 @@ "pl": "Zbroja Burzowej Wrony", "pt": "Arm. do Corvo da Tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -437,7 +437,7 @@ "pl": "Zbroja Czarnego Smoka", "pt": "Armadura do dragão negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -463,7 +463,7 @@ "pl": "Zbroja Mrocznego Feniksa", "pt": "Armadura da fênix negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -489,7 +489,7 @@ "pl": "Zbroja Wielkiej Duszy", "pt": "Armadura da grande alma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -515,7 +515,7 @@ "pl": "Boska zbroja", "pt": "Armadura divina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -541,7 +541,7 @@ "pl": "Zbroja Gromowego Jastrzębia", "pt": "Armadura de Thunder Hawk" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -567,7 +567,7 @@ "pl": "Zbroja Wielkiego Smoka", "pt": "Armadura do grande dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -593,7 +593,7 @@ "pl": "Zbroja Mrocznej Duszy", "pt": "Armadura da alma negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -619,7 +619,7 @@ "pl": "Zbroja Huraganu", "pt": "Armadura do furacão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -645,7 +645,7 @@ "pl": "Zbroja Czerwonego Ducha", "pt": "Armadura do espírito vermelho" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -671,7 +671,7 @@ "pl": "Lekka zbroja płytowa", "pt": "Armadura de placa leve" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -697,7 +697,7 @@ "pl": "Adamantytowa zbroja", "pt": "Armadura de adamantina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -723,7 +723,7 @@ "pl": "Zbroja z mrocznej stali", "pt": "Armadura de aço negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -749,7 +749,7 @@ "pl": "Zbroja Mrocznego Mistrza", "pt": "Armadura do Mestre negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -775,7 +775,7 @@ "pl": "Zbroja Smoczego Rycerza", "pt": "Armadura do cavaleiro dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -802,7 +802,7 @@ "pl": "Zbroja Jadowitej Mgły", "pt": "Armadura da névoa de veneno" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -829,7 +829,7 @@ "pl": "Zbroja Sylphid Ray", "pt": "Armadura do raio silfídico" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -856,7 +856,7 @@ "pl": "Zbroja Wulkanu", "pt": "Armadura do vulcão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -883,7 +883,7 @@ "pl": "Zbroja Słońca", "pt": "Armadura da luz do sol" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -910,7 +910,7 @@ "pl": "Zbroja Ashcrow", "pt": "Armadura de Ashcrow" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -935,7 +935,7 @@ "pl": "Zbroja Zaćmienia", "pt": "Armadura do eclipse" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -960,7 +960,7 @@ "pl": "Zbroja Iris", "pt": "Armadura de Iris" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -985,7 +985,7 @@ "pl": "Waleczna zbroja", "pt": "Armadura do valor" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1010,7 +1010,7 @@ "pl": "Chwalebna zbroja", "pt": "Armadura gloriosa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1035,7 +1035,7 @@ "pl": "Zbroja Gwałtownego Wiatru", "pt": "Armadura do vento violento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1060,7 +1060,7 @@ "pl": "Zbroja Czerwonego Skrzydła", "pt": "Armadura da asa vermelha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1086,7 +1086,7 @@ "pl": "Pradawna zbroja", "pt": "Armadura antiga" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1112,7 +1112,7 @@ "pl": "Demoniczna zbroja", "pt": "Armadura demoníaca" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1137,7 +1137,7 @@ "pl": "Zbroja Burzowego Błysku", "pt": "Arm. Relâmpago de Tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1164,7 +1164,7 @@ "pl": "Zbroja Wiecznego Skrzydła", "pt": "Armadura da asa eterna" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1191,7 +1191,7 @@ "pl": "Zbroja Tytana", "pt": "Armadura do titã" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1217,7 +1217,7 @@ "pl": "Zbroja Śmiałka", "pt": "Armadura da coragem" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1243,7 +1243,7 @@ "pl": "Zbroja Widma", "pt": "Armadura do fantasma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1269,7 +1269,7 @@ "pl": "Zbroja Zniszczenia", "pt": "Armadura da destruição" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1296,7 +1296,7 @@ "pl": "Zbroja Serafina", "pt": "Armadura do serafim" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1322,7 +1322,7 @@ "pl": "Zbroja Wiary", "pt": "Armadura da fé" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1349,7 +1349,7 @@ "pl": "Królewska zbroja", "pt": "Armadura real" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1375,7 +1375,7 @@ "pl": "Zbroja Hadesa", "pt": "Armadura de Hades" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1405,7 +1405,7 @@ "pl": "Zbroja Świętego Ognia", "pt": "Armadura de Fogo Sagrado" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1431,7 +1431,7 @@ "pl": "Zbroja Storm Jahad", "pt": "Armadura de Tempestade Zahard" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1456,7 +1456,7 @@ "pl": "Zbroja Piercing Groove", "pt": "Armadura de Entalhe Perfurante" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1482,7 +1482,7 @@ "pt": "Armadura de escama" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1517,7 +1517,7 @@ "pt": "Armadura de seda" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1549,7 +1549,7 @@ "pt": "Armadura de Esfinge" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1582,7 +1582,7 @@ "pt": "Armadura do vento violento" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1614,7 +1614,7 @@ "pt": "Armadura de adamantina" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1646,7 +1646,7 @@ "pt": "Armadura de Dragão" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1679,7 +1679,7 @@ "pt": "Armadura de Guardião" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1711,7 +1711,7 @@ "pt": "Armadura Lendária" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1744,7 +1744,7 @@ "pt": "Armadura da asa vermelha" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "armor", @@ -1776,7 +1776,7 @@ "pt": "Armadura do corvo da tempestade" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1808,7 +1808,7 @@ "pt": "Armadura de Tempestade Zahard" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", @@ -1839,7 +1839,7 @@ "pl": "Zbroja Duszy Feniksa", "pt": "Armadura de Alma de Fênix" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 3, "slot": "armor", diff --git a/src/bin/Data/Items/Group09_Pants.json b/src/bin/Data/Items/Group09_Pants.json index 46ccf32fa1..deb73d342b 100644 --- a/src/bin/Data/Items/Group09_Pants.json +++ b/src/bin/Data/Items/Group09_Pants.json @@ -11,7 +11,7 @@ "pl": "Brązowe spodnie", "pt": "Calças de bronze" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -39,7 +39,7 @@ "pl": "Smocze spodnie", "pt": "Calças do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -66,7 +66,7 @@ "pl": "Pikowane spodnie", "pt": "Calças acolchoadas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -92,7 +92,7 @@ "pl": "Legendarne spodnie", "pt": "Calças lendárias" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -118,7 +118,7 @@ "pl": "Kościane spodnie", "pt": "Calças de osso" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -144,7 +144,7 @@ "pl": "Skórzane spodnie", "pt": "Calças de couro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -172,7 +172,7 @@ "pl": "Łuskowe spodnie", "pt": "Calças de escamas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -200,7 +200,7 @@ "pl": "Spodnie Sfinksa", "pt": "Calças da esfinge" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -226,7 +226,7 @@ "pl": "Mosiężne spodnie", "pt": "Calças de latão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -254,7 +254,7 @@ "pl": "Płytowe spodnie", "pt": "Calças de placa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -281,7 +281,7 @@ "pl": "Spodnie z pnączy", "pt": "Calças da vinha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -307,7 +307,7 @@ "pl": "Jedwabne spodnie", "pt": "Calças de seda" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -333,7 +333,7 @@ "pl": "Spodnie Wiatru", "pt": "Calças do vento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -359,7 +359,7 @@ "pl": "Spodnie Ducha", "pt": "Calças do espírito" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -385,7 +385,7 @@ "pl": "Spodnie Strażnika", "pt": "Calças do guardião" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -411,7 +411,7 @@ "pl": "Spodnie Burzowej Wrony", "pt": "Calças do corvo da tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -437,7 +437,7 @@ "pl": "Spodnie Czarnego Smoka", "pt": "Calças do dragão negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -463,7 +463,7 @@ "pl": "Spodnie Mrocznego Feniksa", "pt": "Calças da fênix negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -489,7 +489,7 @@ "pl": "Spodnie Wielkiej Duszy", "pt": "Calças da grande alma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -515,7 +515,7 @@ "pl": "Boskie spodnie", "pt": "Calças divinas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -541,7 +541,7 @@ "pl": "Spodnie Gromowego Jastrzębia", "pt": "Calças de Thunder Hawk" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -567,7 +567,7 @@ "pl": "Spodnie Wielkiego Smoka", "pt": "Calças do grande dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -593,7 +593,7 @@ "pl": "Spodnie Mrocznej Duszy", "pt": "Calças da alma negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -619,7 +619,7 @@ "pl": "Spodnie Huraganu", "pt": "Calças do furacão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -645,7 +645,7 @@ "pl": "Spodnie Czerwonego Ducha", "pt": "Calças do espírito vermelho" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -671,7 +671,7 @@ "pl": "Lekkie spodnie płytowe", "pt": "Calças de placa Leve" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -697,7 +697,7 @@ "pl": "Adamantytowe spodnie", "pt": "Calças de adamantina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -723,7 +723,7 @@ "pl": "Spodnie z mrocznej stali", "pt": "Calças de aço negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -749,7 +749,7 @@ "pl": "Spodnie Mrocznego Mistrza", "pt": "Calças do Mestre negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -775,7 +775,7 @@ "pl": "Spodnie Smoczego Rycerza", "pt": "Calças do cavaleiro dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -802,7 +802,7 @@ "pl": "Spodnie Jadowitej Mgły", "pt": "Calças da névoa de veneno" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -829,7 +829,7 @@ "pl": "Spodnie Sylphid Ray", "pt": "Calças do raio silfídico" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -856,7 +856,7 @@ "pl": "Spodnie Wulkanu", "pt": "Calças do vulcão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -883,7 +883,7 @@ "pl": "Spodnie Słońca", "pt": "Calças da luz do sol" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -910,7 +910,7 @@ "pl": "Spodnie Ashcrow", "pt": "Calças de Ashcrow" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -935,7 +935,7 @@ "pl": "Spodnie Zaćmienia", "pt": "Calças do eclipse" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -960,7 +960,7 @@ "pl": "Spodnie Iris", "pt": "Calças de Iris" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -985,7 +985,7 @@ "pl": "Waleczne spodnie", "pt": "Calças do valor" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1010,7 +1010,7 @@ "pl": "Chwalebne spodnie", "pt": "Calças gloriosas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1035,7 +1035,7 @@ "pl": "Spodnie Gwałtownego Wiatru", "pt": "Calças do vento violento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1060,7 +1060,7 @@ "pl": "Spodnie Czerwonego Skrzydła", "pt": "Calças da asa vermelha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1086,7 +1086,7 @@ "pl": "Pradawne spodnie", "pt": "Calças antigas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1112,7 +1112,7 @@ "pl": "Demoniczne spodnie", "pt": "Calças demoníacas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1137,7 +1137,7 @@ "pl": "Spodnie Burzowego Błysku", "pt": "Calças Relâmpago de Tempest." }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1164,7 +1164,7 @@ "pl": "Spodnie Wiecznego Skrzydła", "pt": "Calças da asa eterna" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1191,7 +1191,7 @@ "pl": "Spodnie Tytana", "pt": "Calças do titã" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1217,7 +1217,7 @@ "pl": "Spodnie Śmiałka", "pt": "Calças da coragem" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1243,7 +1243,7 @@ "pl": "Spodnie Widma", "pt": "Calças do fantasma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1269,7 +1269,7 @@ "pl": "Spodnie Zniszczenia", "pt": "Calças da destruição" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1296,7 +1296,7 @@ "pl": "Spodnie Serafina", "pt": "Calças do serafim" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1322,7 +1322,7 @@ "pl": "Spodnie Wiary", "pt": "Calças da fé" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1349,7 +1349,7 @@ "pl": "Królewskie spodnie", "pt": "Calças reais" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1375,7 +1375,7 @@ "pl": "Spodnie Hadesa", "pt": "Calças de Hades" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1405,7 +1405,7 @@ "pl": "Spodnie Świętego Ognia", "pt": "Calças de Fogo Sagrado" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1431,7 +1431,7 @@ "pl": "Spodnie Storm Jahad", "pt": "Calças de Tempestade Zahard" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1456,7 +1456,7 @@ "pl": "Spodnie Piercing Groove", "pt": "Calças de Entalhe Perfurante" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1482,7 +1482,7 @@ "pt": "Calças de escamas" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1517,7 +1517,7 @@ "pt": "Calças de seda" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1549,7 +1549,7 @@ "pt": "Calças de Esfinge" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1582,7 +1582,7 @@ "pt": "Calças do vento violento" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1614,7 +1614,7 @@ "pt": "Calças de adamantina" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1646,7 +1646,7 @@ "pt": "Calças de Dragão" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1679,7 +1679,7 @@ "pt": "Calças de Guardião" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1711,7 +1711,7 @@ "pt": "Calças Lendárias" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1744,7 +1744,7 @@ "pt": "Calças da asa vermelha" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1776,7 +1776,7 @@ "pt": "Calças do corvo da tempestade" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1808,7 +1808,7 @@ "pt": "Calças de Tempestade Zahard" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", @@ -1839,7 +1839,7 @@ "pl": "Spodnie Duszy Feniksa", "pt": "Calças de Alma de Fogo" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "pants", diff --git a/src/bin/Data/Items/Group10_Gloves.json b/src/bin/Data/Items/Group10_Gloves.json index f8fb66500c..e35e2fe85d 100644 --- a/src/bin/Data/Items/Group10_Gloves.json +++ b/src/bin/Data/Items/Group10_Gloves.json @@ -11,7 +11,7 @@ "pl": "Brązowe rękawice", "pt": "Luvas de bronze" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -40,7 +40,7 @@ "pl": "Smocze rękawice", "pt": "Luvas do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -68,7 +68,7 @@ "pl": "Pikowane rękawice", "pt": "Luvas acolchoadas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -94,7 +94,7 @@ "pl": "Legendarne rękawice", "pt": "Luvas lendárias" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -120,7 +120,7 @@ "pl": "Kościane rękawice", "pt": "Luvas de osso" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -146,7 +146,7 @@ "pl": "Skórzane rękawice", "pt": "Luvas de couro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -174,7 +174,7 @@ "pl": "Łuskowe rękawice", "pt": "Luvas de escamas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -202,7 +202,7 @@ "pl": "Rękawice Sfinksa", "pt": "Luvas da esfinge" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -228,7 +228,7 @@ "pl": "Mosiężne rękawice", "pt": "Luvas de latão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -256,7 +256,7 @@ "pl": "Płytowe rękawice", "pt": "Luvas de placa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -283,7 +283,7 @@ "pl": "Rękawice z pnączy", "pt": "Luvas da vinha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -310,7 +310,7 @@ "pl": "Jedwabne rękawice", "pt": "Luvas de seda" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -337,7 +337,7 @@ "pl": "Rękawice Wiatru", "pt": "Luvas do vento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -364,7 +364,7 @@ "pl": "Rękawice Ducha", "pt": "Luvas do espírito" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -391,7 +391,7 @@ "pl": "Rękawice Strażnika", "pt": "Luvas do guardião" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -418,7 +418,7 @@ "pl": "Rękawice Burzowej Wrony", "pt": "Luvas do corvo da tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -445,7 +445,7 @@ "pl": "Rękawice Czarnego Smoka", "pt": "Luvas do dragão negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -472,7 +472,7 @@ "pl": "Rękawice Mrocznego Feniksa", "pt": "Luvas da fênix negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -499,7 +499,7 @@ "pl": "Rękawice Wielkiej Duszy", "pt": "Luvas da grande alma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -526,7 +526,7 @@ "pl": "Boskie rękawice", "pt": "Luvas divinas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -553,7 +553,7 @@ "pl": "Rękawice Gromowego Jastrzębia", "pt": "Luvas de Thunder Hawk" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -580,7 +580,7 @@ "pl": "Rękawice Wielkiego Smoka", "pt": "Luvas do grande dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -607,7 +607,7 @@ "pl": "Rękawice Mrocznej Duszy", "pt": "Luvas da alma negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -634,7 +634,7 @@ "pl": "Rękawice Huraganu", "pt": "Luvas do furacão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -661,7 +661,7 @@ "pl": "Rękawice Czerwonego Ducha", "pt": "Luvas do espírito vermelho" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -688,7 +688,7 @@ "pl": "Lekkie rękawice płytowe", "pt": "Luvas de placa leve" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -715,7 +715,7 @@ "pl": "Adamantytowe rękawice", "pt": "Luvas de adamantina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -742,7 +742,7 @@ "pl": "Rękawice z mrocznej stali", "pt": "Luvas de aço negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -769,7 +769,7 @@ "pl": "Rękawice Mrocznego Mistrza", "pt": "Luvas do Mestre negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -796,7 +796,7 @@ "pl": "Rękawice Smoczego Rycerza", "pt": "Luvas do cavaleiro dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -824,7 +824,7 @@ "pl": "Rękawice Jadowitej Mgły", "pt": "Luvas da névoa de veneno" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -852,7 +852,7 @@ "pl": "Rękawice Sylphid Ray", "pt": "Luvas do raio silfídico" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -880,7 +880,7 @@ "pl": "Rękawice Wulkanu", "pt": "Luvas do vulcão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -908,7 +908,7 @@ "pl": "Rękawice Słońca", "pt": "Luvas da luz do sol" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -936,7 +936,7 @@ "pl": "Rękawice Ashcrow", "pt": "Luvas de Ashcrow" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -962,7 +962,7 @@ "pl": "Rękawice Zaćmienia", "pt": "Luvas do eclipse" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -988,7 +988,7 @@ "pl": "Rękawice Iris", "pt": "Luvas de Iris" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1014,7 +1014,7 @@ "pl": "Waleczne rękawice", "pt": "Luvas do valor" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1040,7 +1040,7 @@ "pl": "Chwalebne rękawice", "pt": "Luvas gloriosas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1066,7 +1066,7 @@ "pl": "Rękawice Gwałtownego Wiatru", "pt": "Luvas do vento violento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1092,7 +1092,7 @@ "pl": "Rękawice Czerwonego Skrzydła", "pt": "Luvas da asa vermelha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1119,7 +1119,7 @@ "pl": "Pradawne rękawice", "pt": "Luvas antigas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1146,7 +1146,7 @@ "pl": "Demoniczne rękawice", "pt": "Luvas demoníacas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1172,7 +1172,7 @@ "pl": "Rękawice Burzowego Błysku", "pt": "Luvas Relâmpago de Tempest." }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1200,7 +1200,7 @@ "pl": "Rękawice Wiecznego Skrzydła", "pt": "Luvas da asa eterna" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1227,7 +1227,7 @@ "pl": "Rękawice Tytana", "pt": "Luvas do titã" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1254,7 +1254,7 @@ "pl": "Rękawice Śmiałka", "pt": "Luvas da coragem" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1281,7 +1281,7 @@ "pl": "Rękawice Widma", "pt": "Luvas do fantasma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1308,7 +1308,7 @@ "pl": "Rękawice Zniszczenia", "pt": "Luvas da destruição" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1336,7 +1336,7 @@ "pl": "Rękawice Serafina", "pt": "Luvas do serafim" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1363,7 +1363,7 @@ "pl": "Rękawice Wiary", "pt": "Luvas da fé" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1391,7 +1391,7 @@ "pl": "Królewskie rękawice", "pt": "Luvas reais" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1418,7 +1418,7 @@ "pl": "Rękawice Hadesa", "pt": "Luvas de Hades" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1450,7 +1450,7 @@ "pt": "Luvas de escamas" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1486,7 +1486,7 @@ "pt": "Luvas de seda" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1519,7 +1519,7 @@ "pt": "Luvas de Esfinge" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1552,7 +1552,7 @@ "pt": "Luvas do vento violento" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1585,7 +1585,7 @@ "pt": "Luvas de adamantina" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1618,7 +1618,7 @@ "pt": "Luvas de Dragão" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1652,7 +1652,7 @@ "pt": "Luvas de Guardião" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1685,7 +1685,7 @@ "pt": "Luvas Lendárias" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1718,7 +1718,7 @@ "pt": "Luvas da asa vermelha" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", @@ -1751,7 +1751,7 @@ "pt": "Luvas do corvo da tempestade" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "gloves", diff --git a/src/bin/Data/Items/Group11_Boots.json b/src/bin/Data/Items/Group11_Boots.json index 2b0f7a8691..ef3642e12d 100644 --- a/src/bin/Data/Items/Group11_Boots.json +++ b/src/bin/Data/Items/Group11_Boots.json @@ -11,7 +11,7 @@ "pl": "Brązowe buty", "pt": "Botas de bronze" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -40,7 +40,7 @@ "pl": "Smocze buty", "pt": "Botas do dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -68,7 +68,7 @@ "pl": "Pikowane buty", "pt": "Botas acolchoadas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -95,7 +95,7 @@ "pl": "Legendarne buty", "pt": "Botas lendárias" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -121,7 +121,7 @@ "pl": "Kościane buty", "pt": "Botas de osso" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -148,7 +148,7 @@ "pl": "Skórzane buty", "pt": "Botas de couro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -177,7 +177,7 @@ "pl": "Łuskowe buty", "pt": "Botas de escamas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -206,7 +206,7 @@ "pl": "Buty Sfinksa", "pt": "Botas da esfinge" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -233,7 +233,7 @@ "pl": "Mosiężne buty", "pt": "Botas de latão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -262,7 +262,7 @@ "pl": "Płytowe buty", "pt": "Botas de placa" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -290,7 +290,7 @@ "pl": "Buty z pnączy", "pt": "Botas da vinha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -316,7 +316,7 @@ "pl": "Jedwabne buty", "pt": "Botas de seda" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -342,7 +342,7 @@ "pl": "Buty Wiatru", "pt": "Botas do vento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -368,7 +368,7 @@ "pl": "Buty Ducha", "pt": "Botas do espírito" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -394,7 +394,7 @@ "pl": "Buty Strażnika", "pt": "Botas do guardião" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -420,7 +420,7 @@ "pl": "Buty Burzowej Wrony", "pt": "Botas do corvo da tempestade" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -447,7 +447,7 @@ "pl": "Buty Czarnego Smoka", "pt": "Botas do dragão negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -474,7 +474,7 @@ "pl": "Buty Mrocznego Feniksa", "pt": "Botas da fênix negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -501,7 +501,7 @@ "pl": "Buty Wielkiej Duszy", "pt": "Botas da grande alma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -527,7 +527,7 @@ "pl": "Boskie buty", "pt": "Botas divinas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -553,7 +553,7 @@ "pl": "Buty Gromowego Jastrzębia", "pt": "Botas de Thunder Hawk" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -580,7 +580,7 @@ "pl": "Buty Wielkiego Smoka", "pt": "Botas do grande dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -606,7 +606,7 @@ "pl": "Buty Mrocznej Duszy", "pt": "Botas da alma negra" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -632,7 +632,7 @@ "pl": "Buty Huraganu", "pt": "Botas do furacão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -658,7 +658,7 @@ "pl": "Buty Czerwonego Ducha", "pt": "Botas do espírito vermelho" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -684,7 +684,7 @@ "pl": "Lekkie buty płytowe", "pt": "Botas de placa leve" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -710,7 +710,7 @@ "pl": "Adamantytowe buty", "pt": "Botas de adamantina" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -736,7 +736,7 @@ "pl": "Buty z mrocznej stali", "pt": "Botas de aço negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -762,7 +762,7 @@ "pl": "Buty Mrocznego Mistrza", "pt": "Botas do Mestre negro" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -788,7 +788,7 @@ "pl": "Buty Smoczego Rycerza", "pt": "Botas do cavaleiro dragão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -815,7 +815,7 @@ "pl": "Buty Jadowitej Mgły", "pt": "Botas da névoa de veneno" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -842,7 +842,7 @@ "pl": "Buty Sylphid Ray", "pt": "Botas do raio silfídico" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -869,7 +869,7 @@ "pl": "Buty Wulkanu", "pt": "Botas do vulcão" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -896,7 +896,7 @@ "pl": "Buty Słońca", "pt": "Botas da luz do sol" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -923,7 +923,7 @@ "pl": "Buty Ashcrow", "pt": "Botas de Ashcrow" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -948,7 +948,7 @@ "pl": "Buty Zaćmienia", "pt": "Botas do eclipse" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -973,7 +973,7 @@ "pl": "Buty Iris", "pt": "Botas de Iris" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -998,7 +998,7 @@ "pl": "Waleczne buty", "pt": "Botas do valor" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1023,7 +1023,7 @@ "pl": "Chwalebne buty", "pt": "Botas gloriosas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1048,7 +1048,7 @@ "pl": "Buty Gwałtownego Wiatru", "pt": "Botas do vento violento" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1073,7 +1073,7 @@ "pl": "Buty Czerwonego Skrzydła", "pt": "Botas da asa vermelha" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1099,7 +1099,7 @@ "pl": "Pradawne buty", "pt": "Botas antigas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1125,7 +1125,7 @@ "pl": "Demoniczne buty", "pt": "Botas demoníacas" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1150,7 +1150,7 @@ "pl": "Buty Burzowego Błysku", "pt": "Botas Relâmpago de Tempest." }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1177,7 +1177,7 @@ "pl": "Buty Wiecznego Skrzydła", "pt": "Botas da asa eterna" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1204,7 +1204,7 @@ "pl": "Buty Tytana", "pt": "Botas do titã" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1230,7 +1230,7 @@ "pl": "Buty Śmiałka", "pt": "Botas da coragem" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1256,7 +1256,7 @@ "pl": "Buty Widma", "pt": "Botas do fantasma" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1282,7 +1282,7 @@ "pl": "Buty Zniszczenia", "pt": "Botas da destruição" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1309,7 +1309,7 @@ "pl": "Buty Serafina", "pt": "Botas do serafim" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1335,7 +1335,7 @@ "pl": "Buty Wiary", "pt": "Botas da fé" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1362,7 +1362,7 @@ "pl": "Królewskie buty", "pt": "Botas reais" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1388,7 +1388,7 @@ "pl": "Buty Hadesa", "pt": "Botas de Hades" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1418,7 +1418,7 @@ "pl": "Buty Świętego Ognia", "pt": "Botas de Fogo Sagrado" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1444,7 +1444,7 @@ "pl": "Buty Storm Jahad", "pt": "Botas de Tempestade Zahard" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1469,7 +1469,7 @@ "pl": "Buty Piercing Groove", "pt": "Botas de Entalhe Perfurante" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1495,7 +1495,7 @@ "pt": "Botas de escamas" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1531,7 +1531,7 @@ "pt": "Botas de seda" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1563,7 +1563,7 @@ "pt": "Botas de Esfinge" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1597,7 +1597,7 @@ "pt": "Botas do vento violento" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1629,7 +1629,7 @@ "pt": "Botas de adamantina" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1661,7 +1661,7 @@ "pt": "Botas de Dragão" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1695,7 +1695,7 @@ "pt": "Botas de Guardião" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1727,7 +1727,7 @@ "pt": "Botas Lendárias" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1760,7 +1760,7 @@ "pt": "Botas da asa vermelha" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1792,7 +1792,7 @@ "pt": "Botas do corvo da tempestade" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1825,7 +1825,7 @@ "pt": "Botas de Tempestade Zahard" }, "tags": ["luckyItem"], - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", @@ -1856,7 +1856,7 @@ "pl": "Buty Duszy Feniksa", "pt": "Botas de Alma de Fênix" }, - "options": ["luck", "defenseOption"], + "options": ["luck", "defenseOption", "excellentDefense"], "width": 2, "height": 2, "slot": "boots", diff --git a/src/bin/Data/Items/Group13_Helper.json b/src/bin/Data/Items/Group13_Helper.json index 8f82ad63c5..265f5368e7 100644 --- a/src/bin/Data/Items/Group13_Helper.json +++ b/src/bin/Data/Items/Group13_Helper.json @@ -345,7 +345,7 @@ "pl": "Pierścień Lodu", "pt": "Anel de gelo" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -378,7 +378,7 @@ "pl": "Pierścień Trucizny", "pt": "Anel do veneno" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -612,7 +612,7 @@ "pl": "Wisior Błyskawic", "pt": "Pingente da luz" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentWizardryAttack"], "width": 1, "height": 1, "slot": "pendant", @@ -645,7 +645,7 @@ "pl": "Wisior Ognia", "pt": "Pingente do fogo" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentPhysicalAttack"], "width": 1, "height": 1, "slot": "pendant", @@ -1737,7 +1737,7 @@ "pl": "Pierścień Ognia", "pt": "Anel do fogo" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -1770,7 +1770,7 @@ "pl": "Pierścień Ziemi", "pt": "Anel da terra" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -1803,7 +1803,7 @@ "pl": "Pierścień Wiatru", "pt": "Anel do vento" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -1836,7 +1836,7 @@ "pl": "Pierścień Magii", "pt": "Anel da magia" }, - "options": ["ringOfMagicMana"], + "options": ["ringOfMagicMana", "excellentDefense"], "width": 1, "height": 1, "slot": "ring", @@ -1866,7 +1866,7 @@ "pl": "Wisior Lodu", "pt": "Pingente do gelo" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentWizardryAttack"], "width": 1, "height": 1, "slot": "pendant", @@ -1899,7 +1899,7 @@ "pl": "Wisior Wiatru", "pt": "Pingente do vento" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentPhysicalAttack"], "width": 1, "height": 1, "slot": "pendant", @@ -1932,7 +1932,7 @@ "pl": "Wisior Wody", "pt": "Pingente da água" }, - "options": ["jewelryHealthRecovery"], + "options": ["jewelryHealthRecovery", "excellentWizardryAttack"], "width": 1, "height": 1, "slot": "pendant", @@ -1965,7 +1965,7 @@ "pl": "Wisior Zdolności", "pt": "Pingente da habilidade" }, - "options": ["pendantOfAbilityAg"], + "options": ["pendantOfAbilityAg", "excellentPhysicalAttack"], "width": 1, "height": 1, "slot": "pendant", diff --git a/src/bin/Data/Items/Options/Excellent.json b/src/bin/Data/Items/Options/Excellent.json new file mode 100644 index 0000000000..477ded377f --- /dev/null +++ b/src/bin/Data/Items/Options/Excellent.json @@ -0,0 +1,86 @@ +{ + "formatVersion": 1, + "definitions": [ + { + "name": "excellentDefense", + "type": "excellent", + "displayName": { + "en": "Excellent defense", + "de": "Exzellente Verteidigung", + "es": "Defensa excelente", + "id": "Pertahanan unggul", + "ja": "エクセレント防御", + "pl": "Doskonała obrona", + "pt": "Defesa excelente", + "ru": "Превосходная защита", + "tl": "Napakahusay na depensa", + "uk": "Чудовий захист", + "zh-TW": "卓越防禦" + }, + "openMu": {"id": "00000083-0012-0000-0000-000000000000", "name": "Excellent Defense Options"}, + "server": {"addsRandomly": true, "addChance": 0.001, "maximumOptionsPerItem": 2}, + "options": [ + {"number": 1, "attribute": "moneyAmountRate", "percent": {"values": 30}, "text": "zenAfterKill"}, + {"number": 2, "attribute": "defenseRatePvm", "percent": {"values": 10}, "text": "defenseSuccessRate"}, + {"number": 3, "attribute": "damageReflection", "percent": {"values": 5}, "text": "reflectDamage"}, + {"number": 4, "attribute": "armorDamageDecrease", "percent": {"values": 4}, "text": "damageDecrease"}, + {"number": 5, "attribute": "maximumMana", "percent": {"values": 4}, "text": "increaseMaxMana"}, + {"number": 6, "attribute": "maximumHealth", "percent": {"values": 4}, "text": "increaseMaxHp"} + ] + }, + { + "name": "excellentPhysicalAttack", + "type": "excellent", + "displayName": { + "en": "Excellent physical attack", + "de": "Exzellenter physischer Angriff", + "es": "Ataque físico excelente", + "id": "Serangan fisik unggul", + "ja": "エクセレント物理攻撃", + "pl": "Doskonały atak fizyczny", + "pt": "Ataque físico excelente", + "ru": "Превосходная физическая атака", + "tl": "Napakahusay na pisikal na atake", + "uk": "Чудова фізична атака", + "zh-TW": "卓越物理攻擊" + }, + "openMu": {"id": "00000083-0013-0000-0000-000000000000", "name": "Excellent Physical Attack Options"}, + "server": {"addsRandomly": true, "addChance": 0.001, "maximumOptionsPerItem": 2}, + "options": [ + {"number": 1, "attribute": "manaAfterMonsterKillMultiplier", "add": {"values": 8}, "text": "manaAfterKill"}, + {"number": 2, "attribute": "healthAfterMonsterKillMultiplier", "add": {"values": 8}, "text": "lifeAfterKill"}, + {"number": 3, "attribute": "attackSpeedAny", "add": {"values": 7}, "text": "increaseAttackSpeed"}, + {"number": 4, "attribute": "physicalBaseDmgIncrease", "percent": {"values": 2}, "text": "increaseDamagePercent"}, + {"number": 5, "attribute": "physicalBaseDmg", "add": {"values": 0, "per": [{"attribute": "level", "divisor": 20}]}, "text": "increaseDamageLevel20"}, + {"number": 6, "attribute": "excellentDamageChance", "percent": {"values": 10}, "text": "excellentDamageRate"} + ] + }, + { + "name": "excellentWizardryAttack", + "type": "excellent", + "displayName": { + "en": "Excellent wizardry attack", + "de": "Exzellenter Zaubereiangriff", + "es": "Ataque de hechicería excelente", + "id": "Serangan sihir unggul", + "ja": "エクセレント魔法攻撃", + "pl": "Doskonały atak magiczny", + "pt": "Ataque de magia excelente", + "ru": "Превосходная магическая атака", + "tl": "Napakahusay na wizardry na atake", + "uk": "Чудова магічна атака", + "zh-TW": "卓越魔法攻擊" + }, + "openMu": {"id": "00000083-0014-0000-0000-000000000000", "name": "Excellent Wizardry Attack Options"}, + "server": {"addsRandomly": true, "addChance": 0.001, "maximumOptionsPerItem": 2}, + "options": [ + {"number": 1, "attribute": "manaAfterMonsterKillMultiplier", "add": {"values": 8}, "text": "manaAfterKill"}, + {"number": 2, "attribute": "healthAfterMonsterKillMultiplier", "add": {"values": 8}, "text": "lifeAfterKill"}, + {"number": 3, "attribute": "attackSpeedAny", "add": {"values": 7}, "text": "increaseAttackSpeed"}, + {"number": 4, "attribute": "wizardryBaseDmgIncrease", "percent": {"values": 2}, "text": "increaseWizardryPercent"}, + {"number": 5, "attribute": "wizardryBaseDmg", "add": {"values": 0, "per": [{"attribute": "level", "divisor": 20}]}, "text": "increaseWizardryLevel20"}, + {"number": 6, "attribute": "excellentDamageChance", "percent": {"values": 10}, "text": "excellentDamageRate"} + ] + } + ] +} diff --git a/src/bin/Data/Items/Options/OptionRules.json b/src/bin/Data/Items/Options/OptionRules.json index bda93d10ed..9ca2405258 100644 --- a/src/bin/Data/Items/Options/OptionRules.json +++ b/src/bin/Data/Items/Options/OptionRules.json @@ -2,17 +2,19 @@ "formatVersion": 1, "rules": [ {"options": [], "tags": ["ammunition"]}, - {"options": ["luck", "physicalAndWizardryDamageOption"], "tags": ["magicSword"]}, - {"options": ["luck", "physicalDamageOption"], "group": [0, 1, 2, 3, 4]}, - {"options": ["luck", "curseDamageOption"], "group": [5], "tags": ["summonerBook"]}, - {"options": ["luck", "wizardryDamageOption"], "group": [5]}, - {"options": ["luck", "defenseRateOption"], "group": [6]}, - {"options": ["luck", "defenseOption"], "group": [7, 8, 9, 10, 11]}, + {"options": ["luck", "physicalAndWizardryDamageOption", "excellentPhysicalAttack"], "tags": ["magicSword"]}, + {"options": ["luck", "physicalDamageOption", "excellentPhysicalAttack"], "group": [0, 1, 2, 3, 4]}, + {"options": ["luck", "curseDamageOption", "excellentWizardryAttack"], "group": [5], "tags": ["summonerBook"]}, + {"options": ["luck", "wizardryDamageOption", "excellentWizardryAttack"], "group": [5]}, + {"options": ["luck", "defenseRateOption", "excellentDefense"], "group": [6]}, + {"options": ["luck", "defenseOption", "excellentDefense"], "group": [7, 8, 9, 10, 11]}, {"options": ["luck"], "group": [12], "numbers": [0, 1, 2, 3, 4, 5, 6, 41, 42, 49]}, {"options": ["luck"], "slot": ["wings"], "wingTier": ["third"]}, {"options": ["luck"], "group": [13], "numbers": [30]}, - {"options": ["jewelryHealthRecovery"], "group": [13], "numbers": [8, 9, 12, 13, 21, 22, 23, 25, 26, 27]}, - {"options": ["ringOfMagicMana"], "group": [13], "numbers": [24]}, - {"options": ["pendantOfAbilityAg"], "group": [13], "numbers": [28]} + {"options": ["jewelryHealthRecovery", "excellentDefense"], "group": [13], "numbers": [8, 9, 21, 22, 23]}, + {"options": ["ringOfMagicMana", "excellentDefense"], "group": [13], "numbers": [24]}, + {"options": ["jewelryHealthRecovery", "excellentWizardryAttack"], "group": [13], "numbers": [12, 25, 27]}, + {"options": ["jewelryHealthRecovery", "excellentPhysicalAttack"], "group": [13], "numbers": [13, 26]}, + {"options": ["pendantOfAbilityAg", "excellentPhysicalAttack"], "group": [13], "numbers": [28]} ] } diff --git a/src/bin/Data/Items/Tooltips/GroundLabels.json b/src/bin/Data/Items/Tooltips/GroundLabels.json index 1015bb18dd..9f561c1f15 100644 --- a/src/bin/Data/Items/Tooltips/GroundLabels.json +++ b/src/bin/Data/Items/Tooltips/GroundLabels.json @@ -43,7 +43,8 @@ {"when": ["setItem"], "style": "setItem"}, {"when": ["tag:divineArchangelWeapon"], "style": "divineArchangel"}, {"when": ["socketItem"], "style": "socketItem"}, - {"when": ["excellentFlags", "!upperTierWings"], "style": "excellent"}, + {"when": ["excellent"], "style": "excellent"}, + {"when": ["tag:hornMount", "excellentFlags"], "style": "excellent"}, {"when": ["level>=7"], "style": "level7up"}, {"when": ["skillLuckOrOption"], "style": "withOptions"}, {"when": ["level=0"], "style": "level0"}, diff --git a/src/bin/Data/Items/Tooltips/OptionTexts.json b/src/bin/Data/Items/Tooltips/OptionTexts.json index c6e76ef1b9..b5c8ad659d 100644 --- a/src/bin/Data/Items/Tooltips/OptionTexts.json +++ b/src/bin/Data/Items/Tooltips/OptionTexts.json @@ -79,6 +79,149 @@ "uk": "Автоматичне відновлення HP {value}%", "zh-TW": "HP自動恢復 {value}%" }, + "damageDecrease": { + "en": "Damage Decrease +{value}%", + "de": "Schadensreduzierung +{value}%", + "es": "Disminución de daño +{value}%", + "id": "Penurunan Kerusakan +{value}%", + "ja": "ダメージ減少 +{value}%", + "pl": "Zmniejszenie obrażeń +{value}%", + "pt": "Redução de dano +{value}%", + "ru": "Уменьшение урона +{value}%", + "tl": "Pagbawas ng Pinsala +{value}%", + "uk": "Зменшення шкоди +{value}%", + "zh-TW": "傷害減少 +{value}%" + }, + "defenseSuccessRate": { + "en": "Defense success rate +{value}%", + "de": "Verteidigungserfolgsrate +{value}%", + "es": "Tasa de éxito de defensa +{value}%", + "id": "Tingkat keberhasilan pertahanan +{value}%", + "ja": "防御成功率 +{value}%", + "pl": "Wskaźnik skuteczności obrony +{value}%", + "pt": "Taxa de sucesso de defesa +{value}%", + "ru": "Вероятность успеха защиты +{value}%", + "tl": "Rate ng tagumpay sa pagtatanggol +{value}%", + "uk": "Відсоток успішного захисту +{value}%", + "zh-TW": "防禦成功率+{value}%" + }, + "excellentDamageRate": { + "en": "Excellent Damage rate +{value}%", + "de": "Exzellente Schadensrate +{value}%", + "es": "Excelente tasa de daño +{value}%", + "id": "Tingkat Kerusakan Luar Biasa +{value}%", + "ja": "エクセレントダメージ確率 +{value}%", + "pl": "Szansa na obrażenia doskonałe +{value}%", + "pt": "Excelente taxa de dano +{value}%", + "ru": "Отличный урон +{value}%", + "tl": "Napakahusay na Damage rate +{value}%", + "uk": "Відмінний рівень шкоди +{value}%", + "zh-TW": "優 破損率+{value}%" + }, + "increaseAttackSpeed": { + "en": "Increase Attacking(Wizardry)speed +{value}", + "de": "Erhöht Angriffsgeschwindigkeit (Zauberei) +{value}", + "es": "Aumentar la velocidad de ataque (hechicería) +{value}", + "id": "Meningkatkan kecepatan Menyerang (Sihir) +{value}", + "ja": "攻撃(魔法)速度増加 +{value}", + "pl": "Zwiększa szybkość ataku (i czarowania) +{value}", + "pt": "Aumenta a velocidade de ataque (feitiçaria) +{value}", + "ru": "Увеличение скорости атаки (волшебства) +{value}", + "tl": "Dagdagan ang bilis ng Pag-atake(Wizardry) +{value}", + "uk": "Збільшити швидкість атаки (чарівництво) +{value}", + "zh-TW": "增加攻擊(魔法)速度+{value}" + }, + "increaseDamageLevel20": { + "en": "Increase Damage +level/{divisor}", + "de": "Erhöht Schaden +Level/{divisor}", + "es": "Aumentar daño +nivel/{divisor}", + "id": "Meningkatkan Kerusakan +level/{divisor}", + "ja": "攻撃力増加 +レベル/{divisor}", + "pl": "Zwiększa obrażenia + poziom/{divisor}", + "pt": "Aumentar Dano +nível/{divisor}", + "ru": "Увеличение урона +уровень/{divisor}", + "tl": "Taasan ang Damage +level/{divisor}", + "uk": "Збільшення шкоди + рівень/{divisor}", + "zh-TW": "傷害增加+level/{divisor}" + }, + "increaseDamagePercent": { + "en": "Increase Damage +{value}%", + "de": "Erhöht Schaden +{value}%", + "es": "Aumentar daño +{value}%", + "id": "Meningkatkan Kerusakan +{value}%", + "ja": "攻撃力増加 +{value}%", + "pl": "Zwiększa obrażenia +{value}%", + "pt": "Aumentar Dano +{value}%", + "ru": "Увеличение урона +{value}%", + "tl": "Palakihin ang Pinsala +{value}%", + "uk": "Збільшення шкоди +{value}%", + "zh-TW": "增加傷害+{value}%" + }, + "increaseMaxHp": { + "en": "Increase Max HP +{value}%", + "de": "Erhöht max. HP +{value}%", + "es": "Incrementar HP máximo +{value}%", + "id": "Meningkatkan HP Maks +{value}%", + "ja": "最大生命力増加 +{value}%", + "pl": "Zwiększa maks. HP +{value}%", + "pt": "Aumenta HP máximo +{value}%", + "ru": "Увеличение максимального запаса здоровья +{value}%", + "tl": "Taasan ang Max HP +{value}%", + "uk": "Збільшити макс. HP +{value}%", + "zh-TW": "最大生命值增加+{value}%" + }, + "increaseMaxMana": { + "en": "Increase Max Mana +{value}%", + "de": "Erhöht max. Mana +{value}%", + "es": "Incrementar maná máximo +{value}%", + "id": "Tingkatkan Mana Maks +{value}%", + "ja": "最大マナ増加 +{value}%", + "pl": "Zwiększa maksymalną manę +{value}%", + "pt": "Aumenta Mana Máxima +{value}%", + "ru": "Увеличение максимального запаса маны +{value}%", + "tl": "Taasan ang Max Mana +{value}%", + "uk": "Збільшення максимальної мани +{value}%", + "zh-TW": "增加最大法力 +{value}%" + }, + "increaseWizardryLevel20": { + "en": "Increase Wizardry Dmg +level/{divisor}", + "de": "Erhöht Zaubereischaden +Level/{divisor}", + "es": "Aumentar el daño de hechicería +nivel/{divisor}", + "id": "Meningkatkan Dmg Sihir +level/{divisor}", + "ja": "魔力増加 +レベル/{divisor}", + "pl": "Zwiększa obrażenia magiczne +poziom/{divisor}", + "pt": "Aumenta Dano de Magia +nível/{divisor}", + "ru": "Увеличение магического урона +уровень/{divisor}", + "tl": "Taasan ang Wizardry Dmg +level/{divisor}", + "uk": "Збільшити Wizardry Dmg +level/{divisor}", + "zh-TW": "增加魔法傷害+level/{divisor}" + }, + "increaseWizardryPercent": { + "en": "Increase Wizardry Dmg +{value}%", + "de": "Erhöht Zaubereischaden +{value}%", + "es": "Aumentar daño mágico +{value}%", + "id": "Meningkatkan Dmg Sihir +{value}%", + "ja": "魔力増加 +{value}%", + "pl": "Zwiększa obrażenia magiczne +{value}%", + "pt": "Aumenta Dano de Magia +{value}%", + "ru": "Увеличение урона от волшебства +{value}%", + "tl": "Dagdagan ang Wizardry Dmg +{value}%", + "uk": "Збільшити шкоду магії +{value}%", + "zh-TW": "增加魔法傷害+{value}%" + }, + "lifeAfterKill": { + "en": "Increases acquisition rate of Life after hunting monsters +life/{value}", + "de": "Erhöht die Lebensregeneration beim Jagen von Monstern +Leben/{value}", + "es": "Aumenta la tasa de adquisición de vida después de cazar monstruos +vida/{value}", + "id": "Meningkatkan tingkat perolehan Nyawa setelah berburu monster +nyawa/{value}", + "ja": "獲得する生命増加 +生命/{value}", + "pl": "Zwiększa tempo zdobywania życia po upolowaniu potworów +życie/{value}", + "pt": "Aumenta a taxa de aquisição de Vida após caçar monstros +vida/{value}", + "ru": "Увеличивает скорость получения жизни после охоты на монстров +жизнь/{value}.", + "tl": "Pinapataas ang rate ng pagkuha ng Buhay pagkatapos manghuli ng mga halimaw +buhay/{value}", + "uk": "Збільшує швидкість отримання життя після полювання на монстрів + життя/{value}", + "zh-TW": "狩獵怪物後生命獲得率增加+life/{value}" + }, "luckCriticalDamage": { "en": "Luck (critical damage rate +{value}%)", "de": "Glück (kritische Schadensrate +{value}%)", @@ -105,6 +248,19 @@ "uk": "Удача (швидкість успіху Jewel of Soul +25%)", "zh-TW": "幸運(靈魂寶石成功率+25%)" }, + "manaAfterKill": { + "en": "Increases acquisition rate of Mana after hunting monsters +Mana/{value}", + "de": "Erhöht die Manaregeneration beim Jagen von Monstern +Mana/{value}", + "es": "Aumenta la tasa de adquisición de Mana después de cazar monstruos +Mana/{value}", + "id": "Meningkatkan tingkat perolehan Mana setelah berburu monster +Mana/{value}", + "ja": "獲得するマナ増加 +マナ/{value}", + "pl": "Zwiększa szybkość zdobywania many po polowaniu na potwory +Mana/{value}", + "pt": "Aumenta a taxa de aquisição de Mana após caçar monstros +Mana/{value}", + "ru": "Увеличивает скорость получения маны после охоты на монстров +Мана/{value}.", + "tl": "Pinapataas ang rate ng pagkuha ng Mana pagkatapos manghuli ng mga halimaw +Mana/{value}", + "uk": "Збільшує швидкість отримання мани після полювання на монстрів +Мана/{value}", + "zh-TW": "狩獵怪物後魔力獲取率增加+魔力/{value}" + }, "maxAgIncrease": { "en": "Max AG increased by {value}%", "de": "Max. AG um {value}% erhöht", @@ -130,6 +286,32 @@ "tl": "Ang max mana ay tumaas ng {value}%", "uk": "Макс мани збільшено на {value}%", "zh-TW": "最大法力值增加 {value}%" + }, + "reflectDamage": { + "en": "Reflect Damage +{value}%", + "de": "Schadensreflexion +{value}%", + "es": "Reflejar daño +{value}%", + "id": "Merefleksikan Kerusakan +{value}%", + "ja": "ダメージ反射 +{value}%", + "pl": "Odbicie obrażeń +{value}%", + "pt": "Refletir Dano +{value}%", + "ru": "Отражение урона +{value}%", + "tl": "Sumasalamin sa Pinsala +{value}%", + "uk": "Відбитий збиток +{value}%", + "zh-TW": "反射傷害+{value}%" + }, + "zenAfterKill": { + "en": "Increases acquisition rate of Zen after hunting monsters +{value}%", + "de": "Erhöht den Zen-Ertrag beim Jagen von Monstern +{value}%", + "es": "Aumenta la tasa de adquisición de Zen después de cazar monstruos +{value}%", + "id": "Meningkatkan tingkat perolehan Zen setelah berburu monster +{value}%", + "ja": "獲得ゼンの増加 +{value}%", + "pl": "Zwiększa szybkość zdobywania Zen po polowaniu na potwory +{value}%", + "pt": "Aumenta a taxa de aquisição de Zen após caçar monstros +{value}%", + "ru": "Увеличивает скорость получения Дзен после охоты на монстров +{value}%", + "tl": "Pinapataas ang rate ng pagkuha ng Zen pagkatapos ng pangangaso ng mga halimaw +{value}%", + "uk": "Збільшує швидкість отримання Дзен після полювання на монстрів +{value}%", + "zh-TW": "狩獵怪物後禪的獲得率增加+{value}%" } } } diff --git a/src/source/Character/CharacterManager.cpp b/src/source/Character/CharacterManager.cpp index 54a3e0c9a2..9f3ac7f66a 100644 --- a/src/source/Character/CharacterManager.cpp +++ b/src/source/Character/CharacterManager.cpp @@ -8,6 +8,7 @@ #include "GameLogic/Skills/SkillManager.h" #include "Engine/Object/ZzzInfomation.h" #include "GameLogic/Items/ItemCategories.h" +#include "Network/Server/WSclient.h" #include #include @@ -204,6 +205,20 @@ bool CCharacterManager::IsMasterLevel(const CLASS_TYPE byClass) return this->IsThirdClass(byClass); } +int CCharacterManager::GetHeroMasterLevel() +{ + if (CharacterAttribute == nullptr || !this->IsMasterLevel(CharacterAttribute->Class)) + { + return 0; + } + return Master_Level_Data.nMLevel; +} + +void CCharacterManager::ForgetHeroMasterLevel() +{ + Master_Level_Data = {}; +} + bool CCharacterManager::IsMasterExperienceActive(const CLASS_TYPE byClass, const int level) { return this->IsMasterLevel(byClass) && level >= kMasterExperienceUnlockLevel; diff --git a/src/source/Character/CharacterManager.h b/src/source/Character/CharacterManager.h index 6291ed6b48..7046a9481b 100644 --- a/src/source/Character/CharacterManager.h +++ b/src/source/Character/CharacterManager.h @@ -10,6 +10,12 @@ class CCharacterManager bool IsThirdClass(const CLASS_TYPE byClass); bool IsMasterLevel(const CLASS_TYPE byClass); bool IsMasterExperienceActive(const CLASS_TYPE byClass, const int level); + // The hero's master level; 0 for a hero whose class has none, and 0 after a character is picked until the server + // sends the new hero's (ForgetHeroMasterLevel). + int GetHeroMasterLevel(); + // Forgets the master level values of the hero before, when a character is picked: the new hero's come from the + // server after it enters the game. + void ForgetHeroMasterLevel(); CLASS_TYPE GetBaseClass(CLASS_TYPE iClass); const wchar_t* GetCharacterClassText(const CLASS_TYPE byClass); diff --git a/src/source/Data/GameData/ItemData/ItemEnumNames.cpp b/src/source/Data/GameData/ItemData/ItemEnumNames.cpp index 85ed0f6578..d795214c2d 100644 --- a/src/source/Data/GameData/ItemData/ItemEnumNames.cpp +++ b/src/source/Data/GameData/ItemData/ItemEnumNames.cpp @@ -90,9 +90,10 @@ constexpr std::array, ItemRequirementCount> ItemRequir {ItemRequirement::Leadership, "leadership"}, }}; -constexpr std::array, 2> ItemOptionTypeNames = {{ +constexpr std::array, 3> ItemOptionTypeNames = {{ {ItemOptionType::Luck, "luck"}, {ItemOptionType::Option, "option"}, + {ItemOptionType::Excellent, "excellent"}, }}; constexpr std::array, ItemTextColorCount> ItemTextColorNames = {{ diff --git a/src/source/Data/GameData/ItemData/ItemOptionDatabase.cpp b/src/source/Data/GameData/ItemData/ItemOptionDatabase.cpp index 82eaa7db52..2b0b72f99c 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionDatabase.cpp +++ b/src/source/Data/GameData/ItemData/ItemOptionDatabase.cpp @@ -11,7 +11,8 @@ namespace { // The order the game takes an item's definitions in, by type (the tooltip shows their lines in it): wing options, // the skill (no definition), luck, the additional option, the Dark Horse, excellent options, fixed options. -constexpr std::array TakeOrder = {ItemOptionType::Luck, ItemOptionType::Option}; +constexpr std::array TakeOrder = {ItemOptionType::Luck, ItemOptionType::Option, + ItemOptionType::Excellent}; size_t GetTakeOrder(ItemOptionType type) { @@ -24,14 +25,26 @@ ItemOptionDatabase::ItemOptionDatabase(std::vector definit : m_definitions(std::move(definitions)), m_texts(std::move(texts)), m_rules(std::move(rules)) { m_effects.reserve(m_definitions.size()); - for (const ItemOptionDefinition& definition : m_definitions) + m_optionOrders.reserve(m_definitions.size()); + for (ItemOptionDefinition& definition : m_definitions) { std::vector& effects = m_effects.emplace_back(); - for (const ItemOption& option : definition.options) + for (ItemOption& option : definition.options) { + ResolveTermAttributes(option.value); effects.push_back(FindItemOptionEffect(definition.type, option.attribute, option.add) .value_or(ItemOptionEffect{NoItemOptionEffect, false})); } + std::vector& order = m_optionOrders.emplace_back(definition.options.size()); + for (size_t index = 0; index < order.size(); ++index) + { + order[index] = index; + } + if (definition.type == ItemOptionType::Excellent) + { + std::stable_sort(order.begin(), order.end(), [&definition](size_t left, size_t right) + { return definition.options[left].number > definition.options[right].number; }); + } } } diff --git a/src/source/Data/GameData/ItemData/ItemOptionDatabase.h b/src/source/Data/GameData/ItemData/ItemOptionDatabase.h index 052166e5c7..d663ac2cdd 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionDatabase.h +++ b/src/source/Data/GameData/ItemData/ItemOptionDatabase.h @@ -25,7 +25,7 @@ class ItemOptionDatabase static constexpr int NoDefinition = -1; ItemOptionDatabase() = default; - // Each option's effect (FindItemOptionEffect) is looked up here once. + // Each option's effect (FindItemOptionEffect) and its terms' hero attributes are looked up here once. ItemOptionDatabase(std::vector definitions, ItemOptionTexts texts, std::vector rules = {}); @@ -48,6 +48,14 @@ class ItemOptionDatabase return m_effects[definition][option]; } + // The order an item takes the definition's options in, as indexes of its options: as the code before the + // definitions tested their bits, the excellent options from the highest number down (the tooltip shows them so), + // the others as written. Worked out when the options load. + const std::vector& GetOptionOrder(ItemOptionIndex definition) const + { + return m_optionOrders[definition]; + } + const ItemOptionTexts& GetTexts() const { return m_texts; @@ -71,6 +79,7 @@ class ItemOptionDatabase private: std::vector m_definitions; std::vector> m_effects; + std::vector> m_optionOrders; ItemOptionTexts m_texts; std::vector m_rules; }; diff --git a/src/source/Data/GameData/ItemData/ItemOptionDefinition.h b/src/source/Data/GameData/ItemData/ItemOptionDefinition.h index ca473a7f56..fd2d297e94 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionDefinition.h +++ b/src/source/Data/GameData/ItemData/ItemOptionDefinition.h @@ -24,8 +24,15 @@ enum class ItemOptionType : BYTE // The additional option's level (ITEM::OptionLevel, the option byte's low four bits: 1 to 15, Season 6 sends 1 to // 4); its options numbered by the option type the server sends (ITEM::OptionType), their value by that level. Option, + // The excellent byte (ITEM::ExcellentFlags); its options numbered 1 to 6, each on with the byte's bit number - 1. + Excellent, }; +// An excellent option's number - 1 is its bit of the excellent byte, whose bits 0 to 5 hold them. +constexpr int MaxExcellentOptionNumber = 6; +// The excellent byte with every excellent option on. +constexpr BYTE AllExcellentOptionFlags = (1 << MaxExcellentOptionNumber) - 1; + // How an option's value adds to its attribute: as it is, after the other additions (OpenMU's AddFinal), or in per // cent. enum class ItemOptionAdd : BYTE @@ -35,15 +42,48 @@ enum class ItemOptionAdd : BYTE Percent, }; +// The hero attributes a term can read, named in ItemOptionTermAttributes (ItemOptionEffects.h); Unread for a name the +// client doesn't read, which adds nothing. +enum class ItemOptionTermAttribute : BYTE +{ + Unread, + // The hero's level. + Level, + // The level plus the master level. + TotalLevel, + MasterLevel, +}; + +// A term an option's value adds on an attribute of the hero ("level" / 20): the attribute times `times`, or divided by +// `divisor`, rounded down on its own. Exactly one of the two is above 0. The attributes the client reads are +// ItemOptionTermAttributes (ItemOptionEffects.h). +struct ItemOptionTerm +{ + std::string attribute; + int times = 0; + int divisor = 0; + // The attribute of that name, which the option database resolves when it loads (ResolveTermAttributes), so the + // value computed every frame never compares a name. + ItemOptionTermAttribute heroAttribute = ItemOptionTermAttribute::Unread; + + // The data only: heroAttribute follows from the name, so a loaded term equals an edited one with the same data. + bool operator==(const ItemOptionTerm& other) const + { + return attribute == other.attribute && times == other.times && divisor == other.divisor; + } +}; + // An option's value: a constant, or a list with one value per level from level 1, whose last entry also counts above -// it. +// it; plus its terms on hero attributes, computed when the value is asked (GameLogic::Items::ComputeOptionValue). struct ItemOptionValue { std::vector values; // Written as a list, also with one entry; else values holds the constant. bool isList = false; + std::vector per; - // The value at `level`: the constant, or the list's entry (0 below level 1, the last entry above the list). + // The value at `level` without its terms: the constant, or the list's entry (0 below level 1, the last entry above + // the list). int At(int level) const { if (values.empty() || (isList && level < 1)) diff --git a/src/source/Data/GameData/ItemData/ItemOptionEffects.cpp b/src/source/Data/GameData/ItemData/ItemOptionEffects.cpp index e7cedb3320..290af9f953 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionEffects.cpp +++ b/src/source/Data/GameData/ItemData/ItemOptionEffects.cpp @@ -22,7 +22,7 @@ struct EffectRow // (GameLogic::Combat::GetHeroCriticalDamageRate). The additional options write theirs. A magic sword's option // (baseDamageBonus) is one slot, AT_IMPROVE_DAMAGE, as before, which the stat code adds to the wizardry damage too; // its definition shows two lines. -constexpr std::array EffectRows = {{ +constexpr std::array EffectRows = {{ {ItemOptionType::Luck, "criticalDamageChance", ItemOptionAdd::Percent, {AT_LUCK, true}}, {ItemOptionType::Option, "physicalBaseDmg", ItemOptionAdd::Add, {AT_IMPROVE_DAMAGE, true}}, {ItemOptionType::Option, "baseDamageBonus", ItemOptionAdd::Add, {AT_IMPROVE_DAMAGE, true, true}}, @@ -33,6 +33,23 @@ constexpr std::array EffectRows = {{ {ItemOptionType::Option, "healthRecoveryMultiplier", ItemOptionAdd::Percent, {AT_LIFE_REGENERATION, true}}, {ItemOptionType::Option, "maximumMana", ItemOptionAdd::Percent, {AT_IMPROVE_MAX_MANA, true}}, {ItemOptionType::Option, "maximumAbility", ItemOptionAdd::Percent, {AT_IMPROVE_MAX_AG, true}}, + // The excellent options: the ones the server computes write no value, as the code before them (the client shows + // only their lines); the damage, wizardry and defense rate per cent and level / 20 write theirs, which the stat + // code adds. The attack speed writes its value for its line only: the server computes the speed. + {ItemOptionType::Excellent, "maximumHealth", ItemOptionAdd::Percent, {AT_IMPROVE_LIFE, false}}, + {ItemOptionType::Excellent, "maximumMana", ItemOptionAdd::Percent, {AT_IMPROVE_MANA, false}}, + {ItemOptionType::Excellent, "armorDamageDecrease", ItemOptionAdd::Percent, {AT_DECREASE_DAMAGE, false}}, + {ItemOptionType::Excellent, "damageReflection", ItemOptionAdd::Percent, {AT_REFLECTION_DAMAGE, false}}, + {ItemOptionType::Excellent, "defenseRatePvm", ItemOptionAdd::Percent, {AT_IMPROVE_BLOCKING_PERCENT, true}}, + {ItemOptionType::Excellent, "moneyAmountRate", ItemOptionAdd::Percent, {AT_IMPROVE_GAIN_GOLD, false}}, + {ItemOptionType::Excellent, "excellentDamageChance", ItemOptionAdd::Percent, {AT_EXCELLENT_DAMAGE, false}}, + {ItemOptionType::Excellent, "physicalBaseDmg", ItemOptionAdd::Add, {AT_IMPROVE_DAMAGE_LEVEL, true}}, + {ItemOptionType::Excellent, "wizardryBaseDmg", ItemOptionAdd::Add, {AT_IMPROVE_MAGIC_LEVEL, true}}, + {ItemOptionType::Excellent, "physicalBaseDmgIncrease", ItemOptionAdd::Percent, {AT_IMPROVE_DAMAGE_PERCENT, true}}, + {ItemOptionType::Excellent, "wizardryBaseDmgIncrease", ItemOptionAdd::Percent, {AT_IMPROVE_MAGIC_PERCENT, true}}, + {ItemOptionType::Excellent, "attackSpeedAny", ItemOptionAdd::Add, {AT_IMPROVE_ATTACK_SPEED, true}}, + {ItemOptionType::Excellent, "healthAfterMonsterKillMultiplier", ItemOptionAdd::Add, {AT_IMPROVE_GAIN_LIFE, false}}, + {ItemOptionType::Excellent, "manaAfterMonsterKillMultiplier", ItemOptionAdd::Add, {AT_IMPROVE_GAIN_MANA, false}}, }}; } // namespace diff --git a/src/source/Data/GameData/ItemData/ItemOptionEffects.h b/src/source/Data/GameData/ItemData/ItemOptionEffects.h index cce4e09c7c..7b9a370ec4 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionEffects.h +++ b/src/source/Data/GameData/ItemData/ItemOptionEffects.h @@ -2,6 +2,7 @@ #include "Data/GameData/ItemData/ItemOptionDefinition.h" +#include #include #include @@ -24,6 +25,42 @@ struct ItemOptionEffect // The effect id of an option the client doesn't compute: its slot shows its line and adds nothing. constexpr WORD NoItemOptionEffect = 0xFFFF; +// The hero attributes a value's term (ItemOptionTerm, "per") can read, by their names in the data +// (GameLogic::Items::ComputeOptionValue). A term on another attribute adds nothing. +struct ItemOptionTermAttributeName +{ + std::string_view name; + ItemOptionTermAttribute attribute; +}; + +constexpr std::array ItemOptionTermAttributes = {{ + {"level", ItemOptionTermAttribute::Level}, + {"totalLevel", ItemOptionTermAttribute::TotalLevel}, + {"masterLevel", ItemOptionTermAttribute::MasterLevel}, +}}; + +// The hero attribute of that name; Unread for a name the client doesn't read. +constexpr ItemOptionTermAttribute FindItemOptionTermAttribute(std::string_view name) +{ + for (const ItemOptionTermAttributeName& entry : ItemOptionTermAttributes) + { + if (entry.name == name) + { + return entry.attribute; + } + } + return ItemOptionTermAttribute::Unread; +} + +// Gives each of the value's terms the hero attribute its name names. +inline void ResolveTermAttributes(ItemOptionValue& value) +{ + for (ItemOptionTerm& term : value.per) + { + term.heroAttribute = FindItemOptionTermAttribute(term.attribute); + } +} + // The effect of an option, or none when the client doesn't compute its attribute that way. std::optional FindItemOptionEffect(ItemOptionType type, std::string_view attribute, ItemOptionAdd add); diff --git a/src/source/Data/GameData/ItemData/ItemOptionValidation.cpp b/src/source/Data/GameData/ItemData/ItemOptionValidation.cpp index e8554c5cc9..ba262efe84 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionValidation.cpp +++ b/src/source/Data/GameData/ItemData/ItemOptionValidation.cpp @@ -1,7 +1,10 @@ #include "stdafx.h" #include "ItemOptionValidation.h" +#include "ItemDescriptionPlaceholders.h" #include "ItemEnumNames.h" +#include "ItemOptionEffects.h" +#include "OptionTextsJson.h" #include #include @@ -65,14 +68,41 @@ void ValidateOptions(std::span definitions, const It "the client computes no " + option.attribute + " for a definition of type " + FindEnumName(definition.type) + " this way: its line is shown, it adds nothing"}); } + for (size_t term = 0; term < option.value.per.size(); ++term) + { + const std::string& attribute = option.value.per[term].attribute; + if (FindItemOptionTermAttribute(attribute) == ItemOptionTermAttribute::Unread) + { + issues.push_back({ItemDataIssueSeverity::Warning, DefinitionSource(definition), + ItemDataIssue::NoItem, ItemDataIssue::NoItem, + field + ".per[" + std::to_string(term) + "].attribute", + "the client reads no hero attribute " + attribute + ": the term adds nothing"}); + } + } + const auto divisorTerms = std::count_if(option.value.per.begin(), option.value.per.end(), + [](const ItemOptionTerm& term) { return term.divisor > 0; }); for (const std::string& text : option.texts) { namedTexts.insert(text); - if (texts.Find(text) == nullptr) + const LocalizedString* found = texts.Find(text); + if (found == nullptr) { issues.push_back({ItemDataIssueSeverity::Error, DefinitionSource(definition), ItemDataIssue::NoItem, ItemDataIssue::NoItem, field + ".text", "\"" + text + "\" is no text of OptionTexts.json: its line is left out"}); + continue; + } + const std::vector names = ScanPlaceholders(found->GetNeutral()).names; + if (divisorTerms != 1 && std::find(names.begin(), names.end(), OptionDivisorPlaceholder) != names.end()) + { + const std::string problem = + divisorTerms == 0 ? std::string("no term with a divisor: the line shows 0 there") + : std::to_string(divisorTerms) + " terms with a divisor: the line shows the " + "first one's"; + issues.push_back({ItemDataIssueSeverity::Warning, DefinitionSource(definition), + ItemDataIssue::NoItem, ItemDataIssue::NoItem, field + ".text", + "\"" + text + "\" shows {" + std::string(OptionDivisorPlaceholder) + + "}, but the option has " + problem}); } } } @@ -138,12 +168,24 @@ void ValidateItemOptionLinks(std::span items, const ItemOp } ++known; } - if (options.ResolveLinks(item.options).size() < known) + const std::vector links = options.ResolveLinks(item.options); + if (links.size() < known) { issues.push_back({ItemDataIssueSeverity::Error, "", item.group, item.number, OptionsField, "links two definitions whose options the same part of the server's item data turns on " "(of one type): the later one is left out"}); } + // The excellent byte of wings holds their wing options, the Horn of Fenrir's its kind; no horn is excellent. + const bool byteMeansOther = item.slot == ItemSlot::Wings || item.tags.Has(ItemTag::HornMount); + const bool linksExcellent = std::any_of(links.begin(), links.end(), [&options](ItemOptionIndex link) + { return options.Get(link).type == ItemOptionType::Excellent; }); + if (byteMeansOther && linksExcellent) + { + issues.push_back( + {ItemDataIssueSeverity::Error, "", item.group, item.number, OptionsField, + "links excellent options, but its excellent byte holds its wing options or a horn's kind, " + "or nothing: no horn is excellent"}); + } } } diff --git a/src/source/Data/GameData/ItemData/ItemOptionsJson.cpp b/src/source/Data/GameData/ItemData/ItemOptionsJson.cpp index 20cfd2e94f..dc305dbe09 100644 --- a/src/source/Data/GameData/ItemData/ItemOptionsJson.cpp +++ b/src/source/Data/GameData/ItemData/ItemOptionsJson.cpp @@ -33,6 +33,9 @@ constexpr const char* Attribute = "attribute"; constexpr const char* Text = "text"; constexpr const char* Values = "values"; constexpr const char* PerLevel = "perLevel"; +constexpr const char* Per = "per"; +constexpr const char* Times = "times"; +constexpr const char* Divisor = "divisor"; } // namespace Keys // The keys of the ways a value adds, in the order of ItemOptionAdd. @@ -52,7 +55,8 @@ const KeySet OpenMuKeys = {Keys::Id, Keys::Name}; const KeySet ServerKeys = {Keys::AddsRandomly, Keys::AddChance, Keys::MaximumOptionsPerItem}; const KeySet OptionKeys = {Keys::Number, Keys::Attribute, AddKeys[0], AddKeys[1], AddKeys[2], Keys::Text}; // perLevel has an error of its own, so it is no unknown field. -const KeySet ValueKeys = {Keys::Values, Keys::PerLevel}; +const KeySet ValueKeys = {Keys::Values, Keys::PerLevel, Keys::Per}; +const KeySet TermKeys = {Keys::Attribute, Keys::Times, Keys::Divisor}; // Whether the options of a type have a number (OpenMU's ItemOption.Number), and whether a definition of it has one // option only. @@ -123,6 +127,7 @@ class ItemOptionsReader void ReadNumber(const OrderedJson& json, const std::string& field, ItemOptionType type, ItemOption& option); void ReadAdd(const OrderedJson& json, const std::string& field, ItemOption& option); void ReadValue(const OrderedJson& json, const std::string& field, ItemOptionValue& value); + void ReadTerms(const OrderedJson& json, const std::string& field, std::vector& terms); bool ReadWholeNumber(const OrderedJson& json, const std::string& field, int minimum, int maximum, int& value); void ReadTexts(const OrderedJson& json, const std::string& field, std::vector& texts); @@ -308,9 +313,53 @@ void ItemOptionsReader::ReadValue(const OrderedJson& json, const std::string& fi value.values.push_back(entry); } } + if (const auto per = json.find(Keys::Per); per != json.end()) + { + ReadTerms(*per, field + "." + Keys::Per, value.per); + } WarnAboutUnknownKeys(json, ValueKeys, field); } +void ItemOptionsReader::ReadTerms(const OrderedJson& json, const std::string& field, std::vector& terms) +{ + if (!json.is_array() || json.empty()) + { + AddFatal(field, R"(must be a list of terms: [{"attribute": "level", "divisor": 20}])"); + return; + } + for (size_t index = 0; index < json.size(); ++index) + { + const std::string termField = field + "[" + std::to_string(index) + "]"; + const OrderedJson& entry = json[index]; + if (!entry.is_object()) + { + AddFatal(termField, R"(must be an object: {"attribute": "level", "divisor": 20})"); + continue; + } + ItemOptionTerm term; + if (!ReadName(entry, Keys::Attribute, termField, term.attribute)) + { + continue; + } + const auto times = entry.find(Keys::Times); + const auto divisor = entry.find(Keys::Divisor); + if ((times == entry.end()) == (divisor == entry.end())) + { + AddFatal(termField, "needs exactly one of times and divisor"); + } + else if (times != entry.end()) + { + ReadWholeNumber(*times, termField + "." + Keys::Times, 1, MaxValue, term.times); + } + else + { + ReadWholeNumber(*divisor, termField + "." + Keys::Divisor, 1, MaxValue, term.divisor); + } + WarnAboutUnknownKeys(entry, TermKeys, termField); + terms.push_back(std::move(term)); + } +} + void ItemOptionsReader::ReadTexts(const OrderedJson& json, const std::string& field, std::vector& texts) { constexpr const char* Message = "must be the name of a text of OptionTexts.json, or a list of them"; @@ -353,8 +402,11 @@ void ItemOptionsReader::ReadNumber(const OrderedJson& json, const std::string& f AddFatal(field + "." + Keys::Number, "missing"); return; } - ReadWholeNumber(*number, field + "." + Keys::Number, 0, - type == ItemOptionType::Option ? MaxOptionTypeNumber : MaxNumber, option.number); + const int minimum = type == ItemOptionType::Excellent ? 1 : 0; + const int maximum = type == ItemOptionType::Option ? MaxOptionTypeNumber + : type == ItemOptionType::Excellent ? MaxExcellentOptionNumber + : MaxNumber; + ReadWholeNumber(*number, field + "." + Keys::Number, minimum, maximum, option.number); } void ItemOptionsReader::ReadAdd(const OrderedJson& json, const std::string& field, ItemOption& option) @@ -466,6 +518,25 @@ OrderedJson WriteValue(const ItemOptionValue& value) { json[Keys::Values] = value.values.empty() ? 0 : value.values.front(); } + if (!value.per.empty()) + { + OrderedJson terms = OrderedJson::array(); + for (const ItemOptionTerm& term : value.per) + { + OrderedJson entry; + entry[Keys::Attribute] = term.attribute; + if (term.divisor > 0) + { + entry[Keys::Divisor] = term.divisor; + } + else + { + entry[Keys::Times] = term.times; + } + terms.push_back(std::move(entry)); + } + json[Keys::Per] = std::move(terms); + } return json; } diff --git a/src/source/Data/GameData/ItemData/OptionTextsJson.cpp b/src/source/Data/GameData/ItemData/OptionTextsJson.cpp index 895e35877c..38e0879e46 100644 --- a/src/source/Data/GameData/ItemData/OptionTextsJson.cpp +++ b/src/source/Data/GameData/ItemData/OptionTextsJson.cpp @@ -21,7 +21,7 @@ void AddIssue(std::vector& issues, ItemDataIssueSeverity severity } // The problems of a text, each a field and its message: no English, a language code that is none, a placeholder -// problem, or a placeholder other than {value}. +// problem, or a placeholder other than {value} and {divisor}. std::vector> CheckText(const LocalizedString& text, const std::string& field) { if (text.GetNeutral().empty()) @@ -41,10 +41,11 @@ std::vector> CheckText(const LocalizedString const PlaceholderScan english = ScanPlaceholders(text.GetNeutral()); for (const std::string& name : english.names) { - if (name != OptionValuePlaceholder) + if (name != OptionValuePlaceholder && name != OptionDivisorPlaceholder) { - problems.emplace_back(field, "{" + name + "} is no placeholder of an option text; the one there is {" + - std::string(OptionValuePlaceholder) + "}, the option's value"); + problems.emplace_back(field, "{" + name + "} is no placeholder of an option text; there are {" + + std::string(OptionValuePlaceholder) + "}, the option's value, and {" + + std::string(OptionDivisorPlaceholder) + "}, its term's divisor"); break; } } diff --git a/src/source/Data/GameData/ItemData/OptionTextsJson.h b/src/source/Data/GameData/ItemData/OptionTextsJson.h index 66f5129967..43b9a0981d 100644 --- a/src/source/Data/GameData/ItemData/OptionTextsJson.h +++ b/src/source/Data/GameData/ItemData/OptionTextsJson.h @@ -17,14 +17,16 @@ // } // } // -// {value} is the option's value at the item's level. An option names its texts ("text" in Data/Items/Options), and +// {value} is the option's value at the item's level, {divisor} the divisor of its first term that has one (the 20 of +// "+level/{divisor}"; 0 without such a term). An option names its texts ("text" in Data/Items/Options), and // names are looked up in this file only. See docs/item-data.md, "Item options". namespace Data::Items { constexpr int OptionTextsFormatVersion = 1; constexpr const char* OptionTextsFileName = "OptionTexts.json"; -// The one placeholder of the option texts. +// The placeholders of the option texts. constexpr const char* OptionValuePlaceholder = "value"; +constexpr const char* OptionDivisorPlaceholder = "divisor"; // Reads the file into `texts`, its problems into `issues` (`source` names the file in them). A text without English or // with a placeholder problem is an error and left out: the lines that name it are left out. diff --git a/src/source/Engine/Object/ItemOptionLines.cpp b/src/source/Engine/Object/ItemOptionLines.cpp index f0869634eb..03b2d87b07 100644 --- a/src/source/Engine/Object/ItemOptionLines.cpp +++ b/src/source/Engine/Object/ItemOptionLines.cpp @@ -18,10 +18,19 @@ namespace Engine::Items::OptionLines { namespace { -// A text split at its {value}: the value goes between two pieces. A placeholder of another name stays as written. +// The placeholders a line fills in. +enum class Placeholder : unsigned char +{ + Value, + Divisor, +}; + +// A text split at its {value} and {divisor}: between two pieces goes the number of the placeholder between them. A +// placeholder of another name stays as written. struct SplitText { std::vector pieces; + std::vector between; }; // A text of the option texts in a language. The texts stay where they are until the item data changes. @@ -51,12 +60,14 @@ SplitText Split(std::string_view text) size_t position = 0; for (const Data::Items::PlaceholderSpan& span : Data::Items::FindPlaceholders(text).spans) { - if (span.name != Data::Items::OptionValuePlaceholder) + if (span.name != Data::Items::OptionValuePlaceholder && span.name != Data::Items::OptionDivisorPlaceholder) { continue; } piece.append(text.substr(position, span.begin - position)); split.pieces.push_back(Core::Text::FromUtf8(piece)); + split.between.push_back(span.name == Data::Items::OptionValuePlaceholder ? Placeholder::Value + : Placeholder::Divisor); piece.clear(); position = span.end; } @@ -91,7 +102,7 @@ void Append(const wchar_t* text, size_t length, wchar_t* out, size_t capacity, s } } // namespace -bool Write(std::string_view name, int value, wchar_t* out, size_t capacity) +bool Write(std::string_view name, const LineValues& values, wchar_t* out, size_t capacity) { const Data::LocalizedString* text = Data::Items::ItemDatabase::GetInstance().GetOptions().GetTexts().Find(name); if (text == nullptr || capacity == 0) @@ -100,13 +111,14 @@ bool Write(std::string_view name, int value, wchar_t* out, size_t capacity) } const SplitText& split = Find(*text, I18N::GetCurrentLocale()); std::array number{}; - const int numberLength = std::swprintf(number.data(), number.size(), L"%d", value); size_t written = 0; out[0] = L'\0'; for (size_t piece = 0; piece < split.pieces.size(); ++piece) { if (piece > 0) { + const int shown = split.between[piece - 1] == Placeholder::Value ? values.value : values.divisor; + const int numberLength = std::swprintf(number.data(), number.size(), L"%d", shown); Append(number.data(), static_cast(numberLength > 0 ? numberLength : 0), out, capacity, written); } Append(split.pieces[piece].c_str(), split.pieces[piece].size(), out, capacity, written); diff --git a/src/source/Engine/Object/ItemOptionLines.h b/src/source/Engine/Object/ItemOptionLines.h index 4785a41606..b5f8deea77 100644 --- a/src/source/Engine/Object/ItemOptionLines.h +++ b/src/source/Engine/Object/ItemOptionLines.h @@ -4,11 +4,19 @@ #include // The tooltip lines of an item's options from the option definitions: their texts (Data/Items/Tooltips/ -// OptionTexts.json) in the UI language with the option's value. Each text is split at its {value} once and kept until -// the item data or the language changes, so a tooltip drawn every frame only copies it (CODING_RULES.md, section 12). +// OptionTexts.json) in the UI language with the option's value. Each text is split at its placeholders once and kept +// until the item data or the language changes, so a tooltip drawn every frame only copies it (CODING_RULES.md, +// section 12). namespace Engine::Items::OptionLines { -// Writes the text `name` with `value` for {value} into `out` (at most `capacity` characters with the terminating 0); -// false, with nothing written, for a name the texts lack. -bool Write(std::string_view name, int value, wchar_t* out, size_t capacity); +// The numbers an option line shows: {value} and {divisor}. +struct LineValues +{ + int value = 0; + int divisor = 0; +}; + +// Writes the text `name` with `values` for its placeholders into `out` (at most `capacity` characters with the +// terminating 0); false, with nothing written, for a name the texts lack. +bool Write(std::string_view name, const LineValues& values, wchar_t* out, size_t capacity); } // namespace Engine::Items::OptionLines diff --git a/src/source/Engine/Object/ItemTooltipSnapshot.cpp b/src/source/Engine/Object/ItemTooltipSnapshot.cpp index 1aa9b7e56a..6ed44d425b 100644 --- a/src/source/Engine/Object/ItemTooltipSnapshot.cpp +++ b/src/source/Engine/Object/ItemTooltipSnapshot.cpp @@ -19,6 +19,12 @@ struct TooltipVariant void (*apply)(ItemCreationParams& params); }; +void ApplyExcellent(ItemCreationParams& params, int number) +{ + params.HasExcellentOption = true; + params.ExcellentFlags = static_cast(1 << (number - 1)); +} + void ApplyOption(ItemCreationParams& params, BYTE level, BYTE type) { params.WithOption = true; @@ -77,6 +83,12 @@ constexpr TooltipVariant TooltipVariants[] = { params.HasExcellentOption = true; params.ExcellentFlags = 1; }}, + // Each other excellent option alone: the excellent byte's bit number - 1. + {"excellent 2", [](ItemCreationParams& params) { ApplyExcellent(params, 2); }}, + {"excellent 3", [](ItemCreationParams& params) { ApplyExcellent(params, 3); }}, + {"excellent 4", [](ItemCreationParams& params) { ApplyExcellent(params, 4); }}, + {"excellent 5", [](ItemCreationParams& params) { ApplyExcellent(params, 5); }}, + {"excellent 6", [](ItemCreationParams& params) { ApplyExcellent(params, 6); }}, // A worn and a broken item; for a stack, its count (one, none). {"durability 1", [](ItemCreationParams& params) { params.Durability = 1; }}, {"durability 0", [](ItemCreationParams& params) { params.Durability = 0; }}, diff --git a/src/source/Engine/Object/ItemTooltipValues.cpp b/src/source/Engine/Object/ItemTooltipValues.cpp index 94a128f77b..02c3eb3a24 100644 --- a/src/source/Engine/Object/ItemTooltipValues.cpp +++ b/src/source/Engine/Object/ItemTooltipValues.cpp @@ -174,7 +174,7 @@ ItemTooltipValues ComputeItemTooltipValues(const ITEM& item, TooltipValueScope s { values.resistances[resistance] = attribute->Resistance[resistance] ? item.Level + 1 : 0; } - values.excellent = item.ExcellentFlags > 0; + values.excellent = GameLogic::Items::HasExcellentOptions(item); values.ancient = item.AncientDiscriminator > 0; values.socketItem = g_SocketItemMgr.IsSocketItem(&item); const Data::Items::ItemDefinition* definition = g_ItemDatabase.Find(item.Type); diff --git a/src/source/Engine/Object/ZzzInfomation.cpp b/src/source/Engine/Object/ZzzInfomation.cpp index a9909ae4bf..2c80fe7570 100644 --- a/src/source/Engine/Object/ZzzInfomation.cpp +++ b/src/source/Engine/Object/ZzzInfomation.cpp @@ -8,7 +8,9 @@ #include "Data/DataHandler/DataFileIO.h" #include "Core/Utilities/FileHandle.h" +#include #include +#include #include #include "Render/Models/ZzzBMD.h" @@ -377,79 +379,9 @@ void CalcWingOptions(ITEM* ip) } } -void CalcExcellentOptions(ITEM* ip) +// The Wizard's rings' options; the excellent options come from the definitions the item links. +void CalcWizardsRingOptions(ITEM* ip) { - if ((ip->Type >= ITEM_SHIELD && ip->Type < ITEM_BOOTS + MAX_ITEM_INDEX) || (ip->Type >= ITEM_RING_OF_ICE && ip->Type <= ITEM_RING_OF_POISON) || (ip->Type >= ITEM_RING_OF_FIRE && ip->Type <= ITEM_RING_OF_MAGIC)) - { - // todo: add enum for these flags - if ((ip->ExcellentFlags >> 5) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_LIFE); - } - if ((ip->ExcellentFlags >> 4) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_MANA); - } - if ((ip->ExcellentFlags >> 3) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_DECREASE_DAMAGE); - } - if ((ip->ExcellentFlags >> 2) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_REFLECTION_DAMAGE); - } - if ((ip->ExcellentFlags >> 1) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_BLOCKING_PERCENT); - } - if ((ip->ExcellentFlags) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_GAIN_GOLD); - } - } - if ((ip->Type >= ITEM_SWORD && ip->Type < ITEM_STAFF + MAX_ITEM_INDEX) || (ip->Type >= ITEM_PENDANT_OF_LIGHTING && ip->Type <= ITEM_PENDANT_OF_FIRE) || (ip->Type >= ITEM_PENDANT_OF_ICE && ip->Type <= ITEM_PENDANT_OF_ABILITY)) - { - if ((ip->ExcellentFlags >> 5) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_EXCELLENT_DAMAGE); - } - if ((ip->Type >= ITEM_STAFF && ip->Type < ITEM_STAFF + MAX_ITEM_INDEX) || - (ip->Type == ITEM_PENDANT_OF_LIGHTING) - || (ip->Type == ITEM_PENDANT_OF_ICE || ip->Type == ITEM_PENDANT_OF_WATER)) - { - if ((ip->ExcellentFlags >> 4) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_MAGIC_LEVEL, CharacterAttribute->Level / 20); - } - if ((ip->ExcellentFlags >> 3) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_MAGIC_PERCENT, 2); - } - } - else - { - if ((ip->ExcellentFlags >> 4) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_DAMAGE_LEVEL, CharacterAttribute->Level / 20); - } - if ((ip->ExcellentFlags >> 3) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_DAMAGE_PERCENT, 2); - } - } - if ((ip->ExcellentFlags >> 2) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_ATTACK_SPEED, 7); - } - if ((ip->ExcellentFlags >> 1) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_GAIN_LIFE); - } - if ((ip->ExcellentFlags) & 1) - { - GameLogic::Items::AddOptionSlot(*ip, AT_IMPROVE_GAIN_MANA); - } - } if (ip->Type == ITEM_WIZARDS_RING) { switch (ip->Level) @@ -710,7 +642,8 @@ void SetItemAttributes(ITEM* ip) giPetManager::SetPetItemConvert(ip, giPetManager::GetPetInfo(ip)); } - CalcExcellentOptions(ip); + GameLogic::Items::AddLinkedOptions(*ip, Data::Items::ItemOptionType::Excellent); + CalcWizardsRingOptions(ip); } int64_t ItemValue(const ITEM* ip, int goldType) @@ -1558,11 +1491,11 @@ void PlusSpecial(WORD* Value, int Special, ITEM* Item) for (int i = 0; i < Item->SpecialNum; i++) { if (Item->Special[i] == Special) - *Value += Item->SpecialValue[i]; + *Value += static_cast(GameLogic::Items::GetCurrentSlotValue(*Item, i)); } } -void PlusSpecialPercent(WORD* Value, int Special, ITEM* Item, WORD Percent) +void PlusSpecialPercentOfSlot(WORD* Value, int Special, ITEM* Item) { if (!AreItemOptionsActive(Item)) { @@ -1572,21 +1505,12 @@ void PlusSpecialPercent(WORD* Value, int Special, ITEM* Item, WORD Percent) for (int i = 0; i < Item->SpecialNum; i++) { if (Item->Special[i] == Special) - *Value += *Value * Percent / 100; - } -} - -void PlusSpecialPercent2(WORD* Value, int Special, ITEM* Item) -{ - if (!AreItemOptionsActive(Item)) - { - return; - } - - for (int i = 0; i < Item->SpecialNum; i++) - { - if (Item->Special[i] == Special) - *Value += (unsigned short)(*Value * (Item->SpecialValue[i] / 100.f)); + { + // The per cent comes from the data: a large one stops at what the stat holds instead of wrapping around. + const long long percent = GameLogic::Items::GetCurrentSlotValue(*Item, i); + const long long added = *Value * percent / 100; + *Value = static_cast(std::min(*Value + added, std::numeric_limits::max())); + } } } @@ -1886,8 +1810,8 @@ void CHARACTER_MACHINE::CalculateDamage() PlusSpecial(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_LEVEL, Right); PlusSpecial(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_LEVEL, Right); - PlusSpecialPercent(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, Right, 2); - PlusSpecialPercent(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, Right, 2); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, Right); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, Right); } if (Left->Type != -1 && Left->Durability != 0) @@ -1909,35 +1833,35 @@ void CHARACTER_MACHINE::CalculateDamage() PlusSpecial(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_LEVEL, Left); PlusSpecial(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_LEVEL, Left); - PlusSpecialPercent(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, Left, 2); - PlusSpecialPercent(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, Left, 2); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, Left); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, Left); } if (Amulet->Type != -1 && Amulet->Durability != 0) { PlusSpecial(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_LEVEL, Amulet); PlusSpecial(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_LEVEL, Amulet); - PlusSpecialPercent(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, Amulet, 2); - PlusSpecialPercent(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, Amulet, 2); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, Amulet); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, Amulet); PlusSpecial(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_LEVEL, Amulet); PlusSpecial(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_LEVEL, Amulet); - PlusSpecialPercent(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, Amulet, 2); - PlusSpecialPercent(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, Amulet, 2); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, Amulet); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, Amulet); } if (RRing->Type != -1 && RRing->Durability != 0) { - PlusSpecialPercent(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, RRing, RRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, RRing, RRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, RRing, RRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, RRing, RRing->SpecialValue[1]); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, RRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, RRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, RRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, RRing); } if (LRing->Type != -1 && LRing->Durability != 0) { - PlusSpecialPercent(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, LRing, LRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, LRing, LRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, LRing, LRing->SpecialValue[1]); - PlusSpecialPercent(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, LRing, LRing->SpecialValue[1]); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinRight, AT_IMPROVE_DAMAGE_PERCENT, LRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxRight, AT_IMPROVE_DAMAGE_PERCENT, LRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMinLeft, AT_IMPROVE_DAMAGE_PERCENT, LRing); + PlusSpecialPercentOfSlot(&Character.AttackDamageMaxLeft, AT_IMPROVE_DAMAGE_PERCENT, LRing); } WORD Damage = 0; @@ -2076,8 +2000,8 @@ void CHARACTER_MACHINE::CalculateMagicDamage() PlusSpecial(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_LEVEL, Right); PlusSpecial(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_LEVEL, Right); - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Right, 2); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Right, 2); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Right); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Right); } if (Left->Type != -1 && Left->Durability != 0) @@ -2110,8 +2034,8 @@ void CHARACTER_MACHINE::CalculateMagicDamage() PlusSpecial(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_LEVEL, Left); PlusSpecial(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_LEVEL, Left); - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Left, 2); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Left, 2); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Left); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Left); } } } @@ -2144,8 +2068,8 @@ void CHARACTER_MACHINE::CalculateMagicDamage() PlusSpecial(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_LEVEL, Left); PlusSpecial(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_LEVEL, Left); - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Left, 2); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Left, 2); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Left); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Left); } } @@ -2153,19 +2077,19 @@ void CHARACTER_MACHINE::CalculateMagicDamage() { PlusSpecial(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_LEVEL, Amulet); PlusSpecial(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_LEVEL, Amulet); - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Amulet, 2); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Amulet, 2); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, Amulet); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, Amulet); } if (RRing->Type != -1 && RRing->Durability != 0) { - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, RRing, RRing->SpecialValue[0]); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, RRing, RRing->SpecialValue[0]); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, RRing); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, RRing); } if (LRing->Type != -1 && LRing->Durability != 0) { - PlusSpecialPercent(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, LRing, LRing->SpecialValue[0]); - PlusSpecialPercent(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, LRing, LRing->SpecialValue[0]); + PlusSpecialPercentOfSlot(&Character.MagicDamageMin, AT_IMPROVE_MAGIC_PERCENT, LRing); + PlusSpecialPercentOfSlot(&Character.MagicDamageMax, AT_IMPROVE_MAGIC_PERCENT, LRing); } if (g_isCharacterBuff((&Hero->Object), eBuff_EliteScroll4)) @@ -2252,8 +2176,8 @@ void CHARACTER_MACHINE::CalculateCurseDamage() PlusSpecial(&Character.CurseDamageMin, AT_IMPROVE_MAGIC_LEVEL, pEquipLeft); PlusSpecial(&Character.CurseDamageMax, AT_IMPROVE_MAGIC_LEVEL, pEquipLeft); - PlusSpecialPercent(&Character.CurseDamageMin, AT_IMPROVE_MAGIC_PERCENT, pEquipLeft, 2); - PlusSpecialPercent(&Character.CurseDamageMax, AT_IMPROVE_MAGIC_PERCENT, pEquipLeft, 2); + PlusSpecialPercentOfSlot(&Character.CurseDamageMin, AT_IMPROVE_MAGIC_PERCENT, pEquipLeft); + PlusSpecialPercentOfSlot(&Character.CurseDamageMax, AT_IMPROVE_MAGIC_PERCENT, pEquipLeft); } if (g_isCharacterBuff((&Hero->Object), eBuff_StrengthOfSanta)) @@ -2396,16 +2320,18 @@ void CHARACTER_MACHINE::CalculateSuccessfulBlocking() Character.SuccessfulBlocking += SuccessBlocking - (WORD)(SuccessBlocking * percent); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, Left, 10); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, Left); } - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_HELM], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_ARMOR], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_PANTS], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_GLOVES], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_BOOTS], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_RING_LEFT], 10); - PlusSpecialPercent(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_RING_RIGHT], 10); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_HELM]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_ARMOR]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_PANTS]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_GLOVES]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, &Equipment[EQUIPMENT_BOOTS]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, + &Equipment[EQUIPMENT_RING_LEFT]); + PlusSpecialPercentOfSlot(&Character.SuccessfulBlocking, AT_IMPROVE_BLOCKING_PERCENT, + &Equipment[EQUIPMENT_RING_RIGHT]); Character.SuccessfulBlocking *= g_SocketItemMgr.m_StatusBonus.m_fDefenceRateBonus; } diff --git a/src/source/Engine/Object/ZzzInfomation.h b/src/source/Engine/Object/ZzzInfomation.h index 83581e3b38..684171c938 100644 --- a/src/source/Engine/Object/ZzzInfomation.h +++ b/src/source/Engine/Object/ZzzInfomation.h @@ -41,6 +41,8 @@ bool IsRequireEquipItem(ITEM* pItem); bool AreItemOptionsActive(ITEM* Item); // Adds the values of the item's option slots of effect `Special` to `Value` when its options count. void PlusSpecial(WORD* Value, int Special, ITEM* Item); +// Adds the per cent of `Value` the item's option slots of effect `Special` hold to `Value` when its options count. +void PlusSpecialPercentOfSlot(WORD* Value, int Special, ITEM* Item); class CHARACTER_MACHINE { diff --git a/src/source/Engine/Object/ZzzInventory.cpp b/src/source/Engine/Object/ZzzInventory.cpp index f177505706..48b4914768 100644 --- a/src/source/Engine/Object/ZzzInventory.cpp +++ b/src/source/Engine/Object/ZzzInventory.cpp @@ -1070,8 +1070,8 @@ WORD CalcMaxDurability(const ITEM* ip, ITEM_ATTRIBUTE* p, int Level) { maxDurability += 20; } - else if (ip->ExcellentFlags > 0 && !GameLogic::Items::IsSecondOrThirdTierWing(ip) && - !GameLogic::Items::IsDivineArchangelWeapon(ip)) + // Excellent, not the Divine Archangel weapons. The Horn of Fenrir's byte is its kind, no excellent options. + else if (GameLogic::Items::HasExcellentOptions(*ip) && !GameLogic::Items::IsDivineArchangelWeapon(ip)) { maxDurability += 15; } @@ -1091,12 +1091,21 @@ std::optional WriteDefinitionOptionLines(const ITEM& item, int slot, int te { return std::nullopt; } - const int value = GameLogic::Items::GetSlotOptionValue(item, *slotOption); + Engine::Items::OptionLines::LineValues values; + values.value = GameLogic::Items::GetSlotOptionValue(item, *slotOption); + for (const Data::Items::ItemOptionTerm& term : slotOption->option->value.per) + { + if (term.divisor > 0) + { + values.divisor = term.divisor; + break; + } + } const int lastRow = std::min(rowLimit, MaxTextListRows); int row = textNum; for (const std::string& name : slotOption->option->texts) { - if (row < lastRow && Engine::Items::OptionLines::Write(name, value, TextList[row], std::size(TextList[row]))) + if (row < lastRow && Engine::Items::OptionLines::Write(name, values, TextList[row], std::size(TextList[row]))) { TextListColor[row] = TEXT_COLOR_BLUE; TextBold[row] = false; @@ -1639,7 +1648,7 @@ static std::wstring StandardItemName(const ITEM& item, int level, bool full) if (full && g_csItemOption.GetSetItemName(setName, item.Type, item.AncientDiscriminator)) name = setName; name += ItemAttribute[item.Type].Name; - if (full && item.ExcellentFlags > 0) + if (full && GameLogic::Items::HasExcellentOptions(item)) name = std::wstring(I18N::Game::Excellent) + L" " + name; if (level > 0) name += L" +" + std::to_wstring(level); @@ -1653,7 +1662,7 @@ static int StandardItemNameColor(const ITEM& item, int level) return TEXT_COLOR_GREEN_BLUE; if (g_SocketItemMgr.IsSocketItem(&item)) return TEXT_COLOR_VIOLET; - if (item.SpecialNum > 0 && item.ExcellentFlags > 0) + if (GameLogic::Items::HasExcellentOptions(item)) return TEXT_COLOR_GREEN; if (level >= 7) return TEXT_COLOR_YELLOW; diff --git a/src/source/GameLogic/Items/ItemOptions.cpp b/src/source/GameLogic/Items/ItemOptions.cpp index b8744dff30..6de0e7e03f 100644 --- a/src/source/GameLogic/Items/ItemOptions.cpp +++ b/src/source/GameLogic/Items/ItemOptions.cpp @@ -2,10 +2,14 @@ #include "GameLogic/Items/ItemOptions.h" +#include "Character/CharacterManager.h" #include "Data/GameData/ItemData/ItemDatabase.h" +#include "Data/GameData/ItemData/ItemOptionEffects.h" +#include "Engine/Object/ZzzInfomation.h" #include "GameLogic/Items/ItemOptionSlots.h" #include +#include namespace GameLogic::Items { @@ -18,6 +22,9 @@ using Data::Items::ItemOptionType; // The level of a type without levels: its constant counts. constexpr int LevelOfTypesWithoutLevels = 1; +// The highest value an option slot holds (ITEM::SpecialValue, a WORD). +constexpr std::int64_t MaxSlotValue = 0xFFFF; + // Whether the item's data from the server turns the definition's options on. bool IsTurnedOn(const ITEM& item, ItemOptionType type) { @@ -27,17 +34,62 @@ bool IsTurnedOn(const ITEM& item, ItemOptionType type) return item.HasLuck; case ItemOptionType::Option: return item.OptionLevel > 0; + case ItemOptionType::Excellent: + return item.ExcellentFlags != 0; default: return false; } } -// Whether the item's data turns this one of the definition's options on: the additional option's by its number, which -// the server sends as the option type (ITEM::OptionType, the option byte's high nibble; 0 for most items), as OpenMU -// reads it. -bool IsOptionTurnedOn(int optionType, ItemOptionType type, const ItemOption& option) +// Whether the additional option is the one the server sends: by its number, the option type (ITEM::OptionType, the +// option byte's high nibble; 0 for most items), as OpenMU reads it. +bool IsAdditionalOptionSent(int optionType, const ItemOption& option) +{ + return option.number == optionType; +} + +// Whether the excellent byte turns the excellent option on: its bit number - 1. +bool IsExcellentBitSet(BYTE excellentFlags, const ItemOption& option) +{ + return option.number >= 1 && option.number <= Data::Items::MaxExcellentOptionNumber && + ((excellentFlags >> (option.number - 1)) & 1) != 0; +} + +// Whether the item's data turns this one of the definition's options on: the additional option by its number, an +// excellent option by its bit of the excellent byte; luck's one option with the definition. +bool IsOptionTurnedOn(const ITEM& item, ItemOptionType type, const ItemOption& option) +{ + switch (type) + { + case ItemOptionType::Option: + return IsAdditionalOptionSent(item.OptionType, option); + case ItemOptionType::Excellent: + return IsExcellentBitSet(item.ExcellentFlags, option); + case ItemOptionType::Luck: + break; + } + return true; +} + +// The value of a hero attribute a term reads; 0 for one the client doesn't read. +int GetHeroTermAttribute(Data::Items::ItemOptionTermAttribute attribute) { - return type != ItemOptionType::Option || option.number == optionType; + if (CharacterAttribute == nullptr) + { + return 0; + } + switch (attribute) + { + case Data::Items::ItemOptionTermAttribute::Level: + return CharacterAttribute->Level; + case Data::Items::ItemOptionTermAttribute::TotalLevel: + return CharacterAttribute->Level + gCharacterManager.GetHeroMasterLevel(); + case Data::Items::ItemOptionTermAttribute::MasterLevel: + return gCharacterManager.GetHeroMasterLevel(); + case Data::Items::ItemOptionTermAttribute::Unread: + break; + } + return 0; } // The source of the item's slot `slot` when it names an option the database has; nothing for a slot the code wrote. @@ -78,19 +130,56 @@ void AddLinkedOptions(ITEM& item, ItemOptionType type) { continue; } - for (size_t option = 0; option < definition.options.size(); ++option) + for (const size_t option : options.GetOptionOrder(link)) { - if (!IsOptionTurnedOn(item.OptionType, type, definition.options[option])) + if (!IsOptionTurnedOn(item, type, definition.options[option])) { continue; } const Data::Items::ItemOptionEffect& effect = options.GetEffect(link, option); - const int value = effect.writesValue ? definition.options[option].value.At(GetOptionLevel(item, type)) : 0; + const int value = effect.writesValue + ? ComputeOptionValue(definition.options[option].value, GetOptionLevel(item, type)) + : 0; AddOptionSlot(item, effect.effect, value, {link, static_cast(option)}); } } } +bool HasExcellentOptions(int itemType, BYTE excellentFlags) +{ + return excellentFlags != 0 && HasExcellentOptions(g_ItemDatabase.GetOptionLinks(itemType), excellentFlags); +} + +bool HasExcellentOptions(std::span links, BYTE excellentFlags) +{ + if (excellentFlags == 0) + { + return false; + } + const Data::Items::ItemOptionDatabase& options = g_ItemDatabase.GetOptions(); + for (const Data::Items::ItemOptionIndex link : links) + { + const ItemOptionDefinition& definition = options.Get(link); + if (definition.type != ItemOptionType::Excellent) + { + continue; + } + for (const ItemOption& option : definition.options) + { + if (IsExcellentBitSet(excellentFlags, option)) + { + return true; + } + } + } + return false; +} + +bool HasExcellentOptions(const ITEM& item) +{ + return HasExcellentOptions(item.Type, item.ExcellentFlags); +} + bool LinksOptionType(int itemType, ItemOptionType type) { const Data::Items::ItemOptionDatabase& options = g_ItemDatabase.GetOptions(); @@ -142,7 +231,7 @@ int CountAdditionalOptionLevel(std::span lin linksOption = true; for (const ItemOption& option : definition.options) { - if (IsOptionTurnedOn(optionType, definition.type, option)) + if (IsAdditionalOptionSent(optionType, option)) { // Above a list its last level counts, as its value does. return option.value.isList ? std::min(optionLevel, static_cast(option.value.values.size())) @@ -180,9 +269,46 @@ std::optional FindSlotOption(const ITEM& item, int slot) return SlotOption{&definition, &definition.options[source->option]}; } +int ComputeOptionValue(const Data::Items::ItemOptionValue& value, int level) +{ + if (value.per.empty()) + { + return value.At(level); + } + // Times a hero attribute a term can pass what the slot's value holds (a WORD); the sum stops at its range. + std::int64_t result = value.At(level); + for (const Data::Items::ItemOptionTerm& term : value.per) + { + const std::int64_t attribute = GetHeroTermAttribute(term.heroAttribute); + result += term.divisor > 0 ? attribute / term.divisor : attribute * term.times; + } + return static_cast(std::clamp(result, 0, MaxSlotValue)); +} + int GetSlotOptionValue(const ITEM& item, const SlotOption& slotOption) { - return slotOption.option->value.At(GetOptionLevel(item, slotOption.definition->type)); + return ComputeOptionValue(slotOption.option->value, GetOptionLevel(item, slotOption.definition->type)); +} + +int GetCurrentSlotValue(const ITEM& item, int slot) +{ + if (slot < 0 || slot >= item.SpecialNum) + { + return 0; + } + // Only an option that writes its value: the others keep the 0 the stat code reads them with. + const std::optional source = FindValidSource(item, slot); + if (source) + { + const Data::Items::ItemOptionDatabase& options = g_ItemDatabase.GetOptions(); + const ItemOptionDefinition& definition = options.Get(source->definition); + const ItemOption& option = definition.options[source->option]; + if (!option.value.per.empty() && options.GetEffect(source->definition, source->option).writesValue) + { + return ComputeOptionValue(option.value, GetOptionLevel(item, definition.type)); + } + } + return item.SpecialValue[slot]; } int GetItemOptionValue(const ITEM& item, int slot) diff --git a/src/source/GameLogic/Items/ItemOptions.h b/src/source/GameLogic/Items/ItemOptions.h index 9703d52283..b513cb835e 100644 --- a/src/source/GameLogic/Items/ItemOptions.h +++ b/src/source/GameLogic/Items/ItemOptions.h @@ -18,6 +18,14 @@ namespace GameLogic::Items // effect the client computes for it. void AddLinkedOptions(ITEM& item, Data::Items::ItemOptionType type); +// Whether the item has an active excellent option: it links a definition of type excellent with an option whose bit +// its excellent byte has. What "excellent" means for the name, the maximum durability, the tooltip and the stats; wings +// with wing options and the Horn of Fenrir, whose byte means something else, are not excellent by it. +bool HasExcellentOptions(int itemType, BYTE excellentFlags); +bool HasExcellentOptions(const ITEM& item); +// The same for an item with these option links (an item draft's). +bool HasExcellentOptions(std::span links, BYTE excellentFlags); + // Whether the item links a definition of `type`. bool LinksOptionType(int itemType, Data::Items::ItemOptionType type); @@ -55,9 +63,18 @@ struct SlotOption // item's slots. std::optional FindSlotOption(const ITEM& item, int slot); +// The option value at `level` with its terms on the hero's attributes (level / 20) as they are now; the terms' +// attributes as the option database resolved them (Data::Items::ResolveTermAttributes). A value with terms stops at +// 0 and 65535, what an option slot holds. +int ComputeOptionValue(const Data::Items::ItemOptionValue& value, int level); + // The value of the slot's option at the item's level, from its definition: what its tooltip lines show. int GetSlotOptionValue(const ITEM& item, const SlotOption& slotOption); +// What the stat code adds for the item's slot `slot`: an option with terms on the hero's attributes (level / 20) is +// computed again, as the hero is now; any other slot gives the SpecialValue written when the item was made. +int GetCurrentSlotValue(const ITEM& item, int slot); + // The same for the item's slot `slot`; a slot the code wrote gives its SpecialValue. int GetItemOptionValue(const ITEM& item, int slot); } // namespace GameLogic::Items diff --git a/src/source/GameLogic/Items/ItemStats.cpp b/src/source/GameLogic/Items/ItemStats.cpp index 6d6f0b3278..955a9e1abb 100644 --- a/src/source/GameLogic/Items/ItemStats.cpp +++ b/src/source/GameLogic/Items/ItemStats.cpp @@ -3,6 +3,7 @@ #include "ItemStats.h" #include "Data/GameData/ItemData/ItemDatabase.h" +#include "GameLogic/Items/ItemOptions.h" #include #include @@ -130,12 +131,13 @@ int ComputeStatRequirement(const RequirementFormula& formula, int base, int drop return LimitToItemValue(formula.add + weighted * formula.percent / 100); } -void ComputeRequirements(const ITEM_ATTRIBUTE& attribute, const ItemStatInput& input, const ItemDefinition* definition, - const RequirementTerms& terms, bool wing, const Data::Items::ItemStatProfiles& profiles, - ItemStatValues& values) +// `excellent`: the item has active excellent options. The drop level's excellent bonus reads the byte alone. +void ComputeRequirements(const ITEM_ATTRIBUTE& attribute, const ItemStatInput& input, bool excellent, + const ItemDefinition* definition, const RequirementTerms& terms, + const Data::Items::ItemStatProfiles& profiles, ItemStatValues& values) { const size_t levelIndex = static_cast(std::clamp(input.level, 0, Data::Items::ItemLevelCount - 1)); - const bool excellentOptions = input.excellentFlags > 0; + const bool excellentByte = input.excellentFlags > 0; const RequirementByLevel* levelByLevel = FindRequirementByLevel(definition, ItemRequirement::Level); if (levelByLevel != nullptr) @@ -148,7 +150,7 @@ void ComputeRequirements(const ITEM_ATTRIBUTE& attribute, const ItemStatInput& i LimitToItemValue(attribute.RequireLevel + WideValue{terms.levelPerItemLevel} * input.level); } const bool raisesLevel = definition == nullptr || definition->excellentRaisesLevel; - if (excellentOptions && values.requireLevel > 0 && !wing && raisesLevel) + if (excellent && values.requireLevel > 0 && raisesLevel) { values.requireLevel = LimitToItemValue(values.requireLevel + WideValue{terms.excellentLevelAdd}); } @@ -156,7 +158,7 @@ void ComputeRequirements(const ITEM_ATTRIBUTE& attribute, const ItemStatInput& i // The level requirement the "levelRequirement" basis takes: the one given by level, or the // base value, without the growth per item level and the excellent addition. const int levelRequirementBasis = levelByLevel != nullptr ? (*levelByLevel)[levelIndex] : attribute.RequireLevel; - const int dropLevel = attribute.Level + (excellentOptions ? profiles.GetExcellentDropLevelBonus() + const int dropLevel = attribute.Level + (excellentByte ? profiles.GetExcellentDropLevelBonus() : input.ancientDiscriminator > 0 ? profiles.GetAncientDropLevelBonus() : 0); int* const requirements[] = {&values.requireStrength, &values.requireDexterity, &values.requireEnergy, @@ -183,8 +185,8 @@ ItemStatValues ComputeItemStats(const ITEM_ATTRIBUTE& attribute, const ItemStatI { const Data::Items::ItemStatProfile& profile = g_ItemDatabase.GetStatProfile(input.itemType); const Data::Items::ItemDefinition* definition = g_ItemDatabase.Find(input.itemType); - const bool wing = g_ItemDatabase.GetSlot(input.itemType) == ItemSlot::Wings; - return ComputeItemStats(ItemStatSources{attribute, definition, profile, wing}, input); + return ComputeItemStats( + ItemStatSources{attribute, definition, profile, g_ItemDatabase.GetOptionLinks(input.itemType)}, input); } ItemStatValues ComputeItemStats(const ItemStatSources& sources, const ItemStatInput& input) @@ -192,11 +194,11 @@ ItemStatValues ComputeItemStats(const ItemStatSources& sources, const ItemStatIn const ITEM_ATTRIBUTE& attribute = sources.attribute; const Data::Items::ItemStatProfile& profile = sources.profile; const Data::Items::ItemDefinition* definition = sources.definition; - const bool wing = sources.wing; + const bool excellent = HasExcellentOptions(sources.optionLinks, input.excellentFlags); const StatContext context{g_ItemDatabase.GetStatProfiles(), input.level, attribute.Level, - (input.excellentFlags > 0 && !wing) || input.ancientDiscriminator > 0, + excellent || input.ancientDiscriminator > 0, input.ancientDiscriminator > 0, definition != nullptr ? definition->excellentBonus : 0}; @@ -217,7 +219,7 @@ ItemStatValues ComputeItemStats(const ItemStatSources& sources, const ItemStatIn values.defense = AddUpStat(profile.Get(ItemStat::Defense), attribute.Defense, attribute.Defense, false, context); values.magicDefense = AddUpStat(profile.Get(ItemStat::MagicDefense), attribute.MagicDefense, attribute.MagicDefense, false, context); - ComputeRequirements(attribute, input, definition, profile.requirements, wing, g_ItemDatabase.GetStatProfiles(), + ComputeRequirements(attribute, input, excellent, definition, profile.requirements, g_ItemDatabase.GetStatProfiles(), values); return values; } diff --git a/src/source/GameLogic/Items/ItemStats.h b/src/source/GameLogic/Items/ItemStats.h index 25a917f13d..9ea10fc94e 100644 --- a/src/source/GameLogic/Items/ItemStats.h +++ b/src/source/GameLogic/Items/ItemStats.h @@ -1,7 +1,10 @@ #pragma once +#include "Data/GameData/ItemData/ItemOptionDatabase.h" #include "Data/GameData/ItemData/ItemStructs.h" +#include + namespace Data::Items { struct ItemDefinition; @@ -37,6 +40,9 @@ struct ItemStatInput int itemType = 0; // The + level, a byte in the item data. int level = 0; + // The excellent byte. With the item's option links it says whether the item has active excellent options + // (GameLogic::Items::HasExcellentOptions): the excellent stat bonus and the excellent level requirement. The drop + // level's excellent bonus reads the byte alone, which wings with wing options and the Horn of Fenrir have too. BYTE excellentFlags = 0; BYTE ancientDiscriminator = 0; // The level the additional option counts at (GameLogic::Items::GetAdditionalOptionLevel): the strength @@ -49,21 +55,22 @@ struct ItemStatInput // bonus, the requirements by level, excellentRaisesLevel and the slot come from the // item database. A stat or requirement with a base value of 0 stays 0, except a requirement // given by level and the strength the additional option's counted level adds. For the stats, -// excellent options count on items that are not wings (a wing's are wing options), and -// ancient items get the excellent part too. For the requirements any excellent option -// counts (the excellent drop level bonus before the ancient one), and the level -// requirement of a wing does not grow with excellent options. +// active excellent options count (the excellent byte with the item's option links), and +// ancient items get the excellent part too. For the requirements the excellent byte gives the excellent drop level +// bonus (before the ancient one), and active excellent options raise the level requirement. [[nodiscard]] ItemStatValues ComputeItemStats(const ITEM_ATTRIBUTE& attribute, const ItemStatInput& input); // What ComputeItemStats takes from the item database, given instead: for an item as the // item editor has it before it is stored. `definition` may be null (no requirements by -// level, excellent options raise the level requirement, no fixed excellent bonus). +// level, excellent options raise the level requirement, no fixed excellent bonus); +// `optionLinks` are the item's resolved option links, which say whether its excellent byte +// turns an excellent option on (an item without links is never excellent). struct ItemStatSources { const ITEM_ATTRIBUTE& attribute; const Data::Items::ItemDefinition* definition; const Data::Items::ItemStatProfile& profile; - bool wing = false; + std::span optionLinks; }; // ComputeItemStats with the item's data from `sources`; the item stat file's drop level diff --git a/src/source/Scenes/MainScene.cpp b/src/source/Scenes/MainScene.cpp index 9f1ee2d3ca..3c85ea9698 100644 --- a/src/source/Scenes/MainScene.cpp +++ b/src/source/Scenes/MainScene.cpp @@ -14,6 +14,7 @@ #include "Render/Textures/ZzzOpenglUtil.h" #include "Render/Renderer/MuRenderer.h" #include "Engine/Object/ZzzObject.h" +#include "Character/CharacterManager.h" #include "Engine/Object/ZzzCharacter.h" #include "GameLogic/Events/CSChaosCastle.h" #include "Render/Terrain/ZzzLodTerrain.h" @@ -156,6 +157,8 @@ static void InitializeMainScene() MU_LOG_DEBUG(mu::log::Get("network"), "SendRequestJoinMapServer"); CurrentProtocolState = REQUEST_JOIN_MAP_SERVER; + // The hero before's master level would count for the new one until the server sends its own. + gCharacterManager.ForgetHeroMasterLevel(); SocketClient->ToGameServer()->SendSelectCharacter(MU_C16(CharactersClient[SelectedHero].ID)); // Remember which character is in play so auto-reconnect can re-select it. diff --git a/tests/data/item_tooltip_snapshot.txt b/tests/data/item_tooltip_snapshot.txt index 9bd7e6e273..c8f6cb0b58 100644 --- a/tests/data/item_tooltip_snapshot.txt +++ b/tests/data/item_tooltip_snapshot.txt @@ -1,1822 +1,1822 @@ -bladeMaster 0/0 15bcf6328a2c0aed -bladeMaster 0/1 2b09ca394571f53f -bladeMaster 0/10 ce09ea612ec8d04f -bladeMaster 0/11 f8b71ef06f41f2db -bladeMaster 0/12 c27bbc17003d977b -bladeMaster 0/13 0d258cb6211746ba -bladeMaster 0/14 2a3e55280dff5c6b -bladeMaster 0/15 dcba2a2554dc0c29 -bladeMaster 0/16 b1925f8ef38e5f33 -bladeMaster 0/17 b2a2eee9813ceba9 -bladeMaster 0/18 8e2d247733e0bd68 -bladeMaster 0/19 b30b60998443dbce -bladeMaster 0/2 1d21a70ae0e729b3 -bladeMaster 0/20 506b204d955778ed -bladeMaster 0/21 1147aff54d35f3b2 -bladeMaster 0/22 2a9708e2864eeeeb -bladeMaster 0/23 0e7a7db45e6509c5 -bladeMaster 0/24 e2fe17905f79ce6c -bladeMaster 0/25 9ec133451391ffee -bladeMaster 0/26 7fbeea2dd6e9b6a5 -bladeMaster 0/27 58116bdac7376716 -bladeMaster 0/28 c798436bc3fb0600 -bladeMaster 0/3 2bf9d5c12daba2a8 -bladeMaster 0/31 76bfaa76f47d619f -bladeMaster 0/32 fb0ffaddc51daf35 -bladeMaster 0/33 be1bba6b6a98a727 -bladeMaster 0/34 af10accc76474bee -bladeMaster 0/35 c9076feeb3b30a16 -bladeMaster 0/4 f265234bee733510 -bladeMaster 0/5 4cb5039ca6a76988 -bladeMaster 0/6 63e4a17e4ae1a89a -bladeMaster 0/7 08eb8ec0d0ade700 -bladeMaster 0/8 a04ea0c3a00853b4 -bladeMaster 0/9 f1613b9cf8e509de -bladeMaster 1/0 2081507d4ab59570 -bladeMaster 1/1 2402cd49f9f32be4 -bladeMaster 1/2 c764855b7b24fd28 -bladeMaster 1/3 848db2016ef8a3f1 -bladeMaster 1/4 c861cfafc1a6faea -bladeMaster 1/5 8f87b8428f4862f8 -bladeMaster 1/6 38781054fb9983ab -bladeMaster 1/7 cf6ba7cdbb466910 -bladeMaster 1/8 7e54991a1dc135db -bladeMaster 10/0 4310617a621f643b -bladeMaster 10/1 ca97c71bf306e71e -bladeMaster 10/10 ccb76283818e315f -bladeMaster 10/11 ab74d68b49bb4ebd -bladeMaster 10/12 10f97f9a5daeee58 -bladeMaster 10/13 edfe794fa0fe9e75 -bladeMaster 10/14 89e3a2f4db1ce82e -bladeMaster 10/15 1b3966ad688f8f1c -bladeMaster 10/16 9d1283e276d12073 -bladeMaster 10/17 1007b2564f94b978 -bladeMaster 10/18 21dd00222850ccaa -bladeMaster 10/19 d12dcc72fa2710fd -bladeMaster 10/2 3e0d3e72c714b75f -bladeMaster 10/20 a9cbf149b8ef927e -bladeMaster 10/21 d1c6292936024fd8 -bladeMaster 10/22 ce4a5a0f919a9b3e -bladeMaster 10/23 dae4c272971d996d -bladeMaster 10/24 8fa43db3b26d5c70 -bladeMaster 10/25 f36bc70008025ae3 -bladeMaster 10/26 0a7e1fe29e84082b -bladeMaster 10/27 fa038dce9fe11581 -bladeMaster 10/28 d6cdfcbbef177c6f -bladeMaster 10/29 3ad1b6e66f5ffc81 -bladeMaster 10/3 3e99e69b6f49f04a -bladeMaster 10/30 b5ccf655e669c310 -bladeMaster 10/31 ace7b9b098dd54d1 -bladeMaster 10/32 daec20f4a1bcb2ae -bladeMaster 10/33 d92f1dafd8979ee4 -bladeMaster 10/34 447ae6e0ba57a2b5 -bladeMaster 10/35 0d8268f2b6db3c48 -bladeMaster 10/36 ae028f311848b5b5 -bladeMaster 10/37 cedb8b4d26f58283 -bladeMaster 10/38 c9a5c0d5ad79557b -bladeMaster 10/39 a5d631ba030b03eb -bladeMaster 10/4 93b2e8a6b60cf17a -bladeMaster 10/40 eba8ff1008d4f611 -bladeMaster 10/41 222e60900b3ac607 -bladeMaster 10/42 8ba3b93c6477ffd0 -bladeMaster 10/43 35a86be3e79b449b -bladeMaster 10/44 487b6227f56265c0 -bladeMaster 10/45 654ce5238c6cbf20 -bladeMaster 10/46 b2d34c59319cca37 -bladeMaster 10/47 2852014f672ba307 -bladeMaster 10/48 ae30517fb7346303 -bladeMaster 10/49 18a7b74c1c6bf363 -bladeMaster 10/5 457b5fea4d2a26f2 -bladeMaster 10/50 2c14c4d768ff93e6 -bladeMaster 10/51 dce32634cf35e12d -bladeMaster 10/52 c4648c5fa7805a04 -bladeMaster 10/6 0df33746d1942d86 -bladeMaster 10/62 321618c8439384f1 -bladeMaster 10/63 cea579e8ef71e70f -bladeMaster 10/64 ba5016ad2b51ade2 -bladeMaster 10/65 0ed93c64ca261f4f -bladeMaster 10/66 7db5c7dad14c6827 -bladeMaster 10/67 75cc73f65147fd7a -bladeMaster 10/68 371af1fcb6eadc6e -bladeMaster 10/69 7cf8010399748070 -bladeMaster 10/7 c42438f1d0152933 -bladeMaster 10/70 0a0538f0949aaa19 -bladeMaster 10/71 2c51f368ea93d5ef -bladeMaster 10/8 b841e61e7c97bed6 -bladeMaster 10/9 de78923a78b5b9ab -bladeMaster 11/0 d2ef32843fb529fa -bladeMaster 11/1 aea25e5f32da26a4 -bladeMaster 11/10 164ea735c48fe7d7 -bladeMaster 11/11 faa2035ed71ae960 -bladeMaster 11/12 472879187c0d2ae9 -bladeMaster 11/13 6dda023bda60a32b -bladeMaster 11/14 495c91344a1373e8 -bladeMaster 11/15 cdb598a67177137f -bladeMaster 11/16 a2208ce744f92504 -bladeMaster 11/17 4a239151ddbaabb4 -bladeMaster 11/18 72c06699035c4c33 -bladeMaster 11/19 cad28dbfc7148643 -bladeMaster 11/2 5dc190135698e2ae -bladeMaster 11/20 6a42468e9664fe40 -bladeMaster 11/21 15214560aaaa5b64 -bladeMaster 11/22 e4fa610dce6c385d -bladeMaster 11/23 822c8c28c7675110 -bladeMaster 11/24 78d602b1dd2efff3 -bladeMaster 11/25 7b75cdf3796b0ab4 -bladeMaster 11/26 9486e4334e36ab0f -bladeMaster 11/27 e60260fe1381324c -bladeMaster 11/28 8c762cf68d166d43 -bladeMaster 11/29 23560f1398f223f1 -bladeMaster 11/3 57a59647453ebe34 -bladeMaster 11/30 5ec0a26ac8401538 -bladeMaster 11/31 9620edf1ebb8cacf -bladeMaster 11/32 be18cc260d9db9e7 -bladeMaster 11/33 68270ed08225e2cb -bladeMaster 11/34 ad3bec778262e3e5 -bladeMaster 11/35 c769ad21f767aa44 -bladeMaster 11/36 29f5f53dfbe4d50a -bladeMaster 11/37 dfec43db88b45a54 -bladeMaster 11/38 9cd0282f9ba73f02 -bladeMaster 11/39 a596f55b93c80967 -bladeMaster 11/4 36966c92b9587fd5 -bladeMaster 11/40 cf409b73202ad4de -bladeMaster 11/41 a016efa9a349beb7 -bladeMaster 11/42 0958b73ef03bbc31 -bladeMaster 11/43 f1c2b0519a32ff0c -bladeMaster 11/44 d0e1559aa93bbe5e -bladeMaster 11/45 fc929706867ab37e -bladeMaster 11/46 f0f6bd0275bd90d0 -bladeMaster 11/47 5738c9f98010a12a -bladeMaster 11/48 1c3170b335e4080f -bladeMaster 11/49 64bd9913cb5279a1 -bladeMaster 11/5 f02dbc14c651b243 -bladeMaster 11/50 a9e8f1785446e47a -bladeMaster 11/51 7ca86bb26231f586 -bladeMaster 11/52 2db4b4efe06fc268 -bladeMaster 11/59 4fc9872ba8c4b61a -bladeMaster 11/6 b326909078e37008 -bladeMaster 11/60 9f4833680a5f7513 -bladeMaster 11/61 91dc253df5ff157a -bladeMaster 11/62 731a1d1018fb8d30 -bladeMaster 11/63 c9476784a7be7a2b -bladeMaster 11/64 ec3eabbc587c020c -bladeMaster 11/65 cccec72d49b0b929 -bladeMaster 11/66 45d5a18bdf078049 -bladeMaster 11/67 5d4a273ca08c65a0 -bladeMaster 11/68 b4315aeb518b986b -bladeMaster 11/69 96d9b51701bd44a7 -bladeMaster 11/7 b0aba015f309b3c8 -bladeMaster 11/70 ea6359bc96bdea21 -bladeMaster 11/71 4c811a19830cb89f -bladeMaster 11/72 ba1e5d972afcd156 -bladeMaster 11/73 1589f516e57188ce -bladeMaster 11/8 592887eaa292c277 -bladeMaster 11/9 9f98f99caebdf131 -bladeMaster 12/0 d8cf2be6db99ed89 -bladeMaster 12/1 3bd4b25b24a21243 -bladeMaster 12/10 141c47357cec04ce -bladeMaster 12/100 b5fc6e5067b7a089 -bladeMaster 12/101 0f2a44954f825f4d -bladeMaster 12/102 017d8b27d5f238cf -bladeMaster 12/103 cb8bfdbe616d1e8b -bladeMaster 12/104 54b0bf75a40e1bcf -bladeMaster 12/105 9652143d7c398adf -bladeMaster 12/106 0aa2b57e8641307f -bladeMaster 12/107 b25c9c4c96399727 -bladeMaster 12/108 2e92a71711088fc7 -bladeMaster 12/109 de405bd8b1f315b5 -bladeMaster 12/11 92ae04a6820fe4ec -bladeMaster 12/110 017cfdf80647d56f -bladeMaster 12/111 64eacaf3a5ac6a33 -bladeMaster 12/112 c7eab012a4913921 -bladeMaster 12/113 0261a448d77c857f -bladeMaster 12/114 52b3491038e89133 -bladeMaster 12/115 a98cabfe23c613c7 -bladeMaster 12/116 c30fb0a8172e1015 -bladeMaster 12/117 30ba7e8d37100573 -bladeMaster 12/118 9accb287edd6cab1 -bladeMaster 12/119 03ea1835625c57cd -bladeMaster 12/12 ccfc6937e9e41f18 -bladeMaster 12/120 8234af91d6ac5ff3 -bladeMaster 12/121 80fcbe31ed4350f3 -bladeMaster 12/122 7746702f9eb02a35 -bladeMaster 12/123 afb763e42d686673 -bladeMaster 12/124 da60fd80c5d630c9 -bladeMaster 12/125 edb6c66e34066bd3 -bladeMaster 12/126 168c60b539d3a671 -bladeMaster 12/127 55544185a550c191 -bladeMaster 12/128 b9107810270989a9 -bladeMaster 12/129 d2cbcef19d664567 -bladeMaster 12/13 b9c401299489c1be -bladeMaster 12/130 4287df7945755c03 -bladeMaster 12/131 f07a1e3bbb6c5a21 -bladeMaster 12/132 443a9933f53f174f -bladeMaster 12/133 67ecd4b04a3420d9 -bladeMaster 12/134 05f170da3e4a08fe -bladeMaster 12/135 9c2f18cc9ac88a35 -bladeMaster 12/136 23783434a484b401 -bladeMaster 12/137 a955a3f3992b7b85 -bladeMaster 12/138 5a2c8e9853e9e3ed -bladeMaster 12/139 e0d0f6fe2ebf6249 -bladeMaster 12/14 c188fd4c516a0bc4 -bladeMaster 12/140 ab42c0224c5cbacd -bladeMaster 12/141 b03509ef7fde2f19 -bladeMaster 12/142 96c5d00c40701299 -bladeMaster 12/143 b271decfad2c3f65 -bladeMaster 12/15 0b22aeec075063ff -bladeMaster 12/16 a505328849346c14 -bladeMaster 12/17 d28d89f4f1510a10 -bladeMaster 12/18 1ea4a250b585a442 -bladeMaster 12/19 3e78149f6f65bc44 -bladeMaster 12/2 6dac4308e7cf7efa -bladeMaster 12/21 1981436f9faf8db2 -bladeMaster 12/22 a8dce8c2ef97510e -bladeMaster 12/23 6c575fd8cfcedbb8 -bladeMaster 12/24 9415ab345dba7ff6 -bladeMaster 12/26 e522ded730403f3a -bladeMaster 12/3 8347f429b38c48e2 -bladeMaster 12/30 c042763bb5e4829d -bladeMaster 12/31 7caae1d5e81724a9 -bladeMaster 12/32 b0cf0e5d9e82fcf4 -bladeMaster 12/33 326cb73e4edb3040 -bladeMaster 12/34 9ec1daa2ea6ad666 -bladeMaster 12/35 bdc492b117b55614 -bladeMaster 12/36 cdcdc5d450c1bea2 -bladeMaster 12/37 cc2441c8880a6b97 -bladeMaster 12/38 f08860af3cc66fd9 -bladeMaster 12/39 6937597c47ab7ff4 -bladeMaster 12/4 7f3518eae783a27e -bladeMaster 12/40 f80eea59bde7d3e7 -bladeMaster 12/41 927aaa756a3975b3 -bladeMaster 12/42 1d2d40be2f27e9a6 -bladeMaster 12/43 3940883697f1056f -bladeMaster 12/44 8cb890d461a0b5be -bladeMaster 12/45 665b932aa80bdd44 -bladeMaster 12/46 937c99ff5e0b0d5c -bladeMaster 12/47 3ccb9fd13967e532 -bladeMaster 12/48 c2bb656ddcabe050 -bladeMaster 12/49 22a5aa8d07ce0ce9 -bladeMaster 12/5 cc3e34eea3818277 -bladeMaster 12/50 971f6d834f1551c3 -bladeMaster 12/6 801f22ff2c27b1ae -bladeMaster 12/60 7b6d118dbb0eecbf -bladeMaster 12/61 3662478207ff8f23 -bladeMaster 12/62 a45d452187ebfb81 -bladeMaster 12/63 31203a1874098c03 -bladeMaster 12/64 42d6acc72e61de39 -bladeMaster 12/65 f51a063af8aa4171 -bladeMaster 12/7 4c4e416fbde3b9be -bladeMaster 12/70 ebc68fa28c00c415 -bladeMaster 12/71 b93ab82c3f3ad9f9 -bladeMaster 12/72 c08ffe6642869169 -bladeMaster 12/8 683ecf262b35042a -bladeMaster 12/9 088294a321bd17f0 -bladeMaster 13/0 8b6747fffea41d8e -bladeMaster 13/1 03f40d282177237a -bladeMaster 13/10 d4c6bb45a10fa038 -bladeMaster 13/103 ffe102bf7dc0e014 -bladeMaster 13/104 aba974c5bdf2d6f8 -bladeMaster 13/105 b2aa6b5b18a793ae -bladeMaster 13/106 fd1fd2dd3cd2f2ac -bladeMaster 13/107 407ffa11415153a3 -bladeMaster 13/109 34354e5df68b885c -bladeMaster 13/11 42a7549ca2f3890c -bladeMaster 13/110 9828920251d40bfc -bladeMaster 13/111 24d8918e6002d29e -bladeMaster 13/112 c2b1b1aec9617a74 -bladeMaster 13/113 180d61ac2aaa3e32 -bladeMaster 13/114 d66a92488b69f80c -bladeMaster 13/115 4fb708548192b660 -bladeMaster 13/116 bac49e82f047dc96 -bladeMaster 13/117 53034f2ed11b899e -bladeMaster 13/118 1314ffb1036be25e -bladeMaster 13/119 6a0160b3e4e9a6f8 -bladeMaster 13/12 877d4860797646b4 -bladeMaster 13/120 4bea83a6283b664c -bladeMaster 13/121 96151e9e7dc4b6ea -bladeMaster 13/122 0f2f00c916ef3966 -bladeMaster 13/123 24cd94404a80ae9a -bladeMaster 13/124 98f513e5be29c48c -bladeMaster 13/125 655230cd1b826018 -bladeMaster 13/126 2c1c0d80fd140fc2 -bladeMaster 13/127 f80d7fe01330d14e -bladeMaster 13/128 2acd815ad9d8ab6a -bladeMaster 13/129 2762fe299f29973e -bladeMaster 13/13 6c858336f14194a2 -bladeMaster 13/130 5ec7137258dfaac6 -bladeMaster 13/131 910d09677bdde37a -bladeMaster 13/132 11a835a0bfe46888 -bladeMaster 13/133 8220fcb5bbc4ec34 -bladeMaster 13/134 0b8e3482061852f8 -bladeMaster 13/135 0fa5844fcbef159f -bladeMaster 13/136 faee271b0567741f -bladeMaster 13/137 9bb35e5fe428116b -bladeMaster 13/138 3fec2c075747a0e3 -bladeMaster 13/139 7ff1d34a24799f8f -bladeMaster 13/14 3d16d55604dd0d73 -bladeMaster 13/140 5f6b46b50bbf7d1b -bladeMaster 13/141 ee590cdca5bfa927 -bladeMaster 13/142 17fef807a1d49037 -bladeMaster 13/143 500949ec35910d3b -bladeMaster 13/144 4b1a6f5fb651536b -bladeMaster 13/15 4019d770452a0f2d -bladeMaster 13/16 4a77b9dfed3aacdb -bladeMaster 13/17 1d56838ba271a9d7 -bladeMaster 13/18 bc27db488403d21c -bladeMaster 13/19 45bb90ba2dadda83 -bladeMaster 13/2 10ea3b0709aa7fbc -bladeMaster 13/20 287209a700736f10 -bladeMaster 13/21 918a8fc93f2c2d82 -bladeMaster 13/22 d64ce0696c9c7878 -bladeMaster 13/23 8cc57d1138a358de -bladeMaster 13/24 f63e57d0ffb13f90 -bladeMaster 13/25 6029ae3ea0fe7bb0 -bladeMaster 13/26 8665cb0a49875de4 -bladeMaster 13/27 645f48e717041c2e -bladeMaster 13/28 4c6ddbe236946100 -bladeMaster 13/29 4e288567f6b4bc6e -bladeMaster 13/3 2b7214f693195a2e -bladeMaster 13/30 ec88c53aba8e96ef -bladeMaster 13/31 82b09dffa946fc74 -bladeMaster 13/32 f0fc2797c4b8f20f -bladeMaster 13/33 a149a0c01fef4493 -bladeMaster 13/34 1d325871c9e8295f -bladeMaster 13/35 5d55e59792200135 -bladeMaster 13/36 d849b4ec5fd966b8 -bladeMaster 13/37 6af879df6f4f00c1 -bladeMaster 13/38 7eb9ac6d024ec057 -bladeMaster 13/39 91778322c0eaf39b -bladeMaster 13/4 c30065f96e0a3f3f -bladeMaster 13/40 f4115ad28da0f07e -bladeMaster 13/41 4b49d2bcc4657be2 -bladeMaster 13/42 e670af347bbc029f -bladeMaster 13/43 e102be1c2ee19478 -bladeMaster 13/44 e69f1fb99524e3fc -bladeMaster 13/45 7fd1b4e949d8308a -bladeMaster 13/46 d4b6541887bbf298 -bladeMaster 13/47 83ebe13db93d9a00 -bladeMaster 13/48 d719f1d0ebaadde4 -bladeMaster 13/49 77de283993e76a54 -bladeMaster 13/5 54874fe02339390f -bladeMaster 13/50 88d6212728a8923a -bladeMaster 13/51 d45be964e47d73ee -bladeMaster 13/52 985696797ff9478b -bladeMaster 13/53 d170d04fb230a407 -bladeMaster 13/54 43bd590099541634 -bladeMaster 13/55 ea04f3babf6587ee -bladeMaster 13/56 0bf59863695d8a08 -bladeMaster 13/57 61e31240ea12d5b4 -bladeMaster 13/58 e42c14abbac12718 -bladeMaster 13/59 5931263cf5b6cf74 -bladeMaster 13/60 1e421fa4e4d0c552 -bladeMaster 13/61 2502d6a0ba82e980 -bladeMaster 13/62 348b4fc30c885d6c -bladeMaster 13/63 4f3935b62ab5853e -bladeMaster 13/64 b58c393c26388236 -bladeMaster 13/65 c4fc79695a62dce8 -bladeMaster 13/66 5cd0799e06b7f7c6 -bladeMaster 13/67 943a2fa58f6c41ba -bladeMaster 13/68 0b963ddd8bf675dc -bladeMaster 13/69 b8abbadfb48ada58 -bladeMaster 13/7 c701d0c873dff9ac -bladeMaster 13/70 06ae1db3f3b7f5e0 -bladeMaster 13/71 95b1da9b849569f6 -bladeMaster 13/72 289501061e7f14d4 -bladeMaster 13/73 b0a7d110cf7e4b8e -bladeMaster 13/74 5838fdf16bb46e88 -bladeMaster 13/75 5c42dd19fd2ee654 -bladeMaster 13/76 86b42f33d3ce9cd4 -bladeMaster 13/8 4326f126d767e7f8 -bladeMaster 13/80 85b0e9526d0e4f34 -bladeMaster 13/81 5568bf138b434644 -bladeMaster 13/82 09f0b91ea06eb836 -bladeMaster 13/83 b554d9dc5887eaee -bladeMaster 13/84 3777011aefdbb524 -bladeMaster 13/85 d661dc7a56d3a87e -bladeMaster 13/86 98ed73737700d664 -bladeMaster 13/87 3563c45fb2859b14 -bladeMaster 13/88 57b9d895c5c50f28 -bladeMaster 13/89 eff0f8d982ec1edc -bladeMaster 13/9 82b9a6ad58616b16 -bladeMaster 13/90 1595422c484b2cde -bladeMaster 13/91 bba9e8b477f2f6c4 -bladeMaster 13/92 adbc4f9eec85c860 -bladeMaster 13/93 0bddac744bc93426 -bladeMaster 13/94 b863f066b9beb728 -bladeMaster 13/95 99f2c49b919f936e -bladeMaster 13/96 93bff665ed2cea74 -bladeMaster 13/97 4c50526c09a129e4 -bladeMaster 13/98 95b7258aa11bc718 -bladeMaster 13/99 a6587695c4ec191c -bladeMaster 14/0 f7c3a07b59b1b5fc -bladeMaster 14/1 2cadbb4359f897d2 -bladeMaster 14/10 44bd525fcbfd54b2 -bladeMaster 14/100 3e8b7dba34e3ca77 -bladeMaster 14/101 d05f34b151313cb3 -bladeMaster 14/102 bcb4b264dba3ee9d -bladeMaster 14/103 9714c3def8c27eb9 -bladeMaster 14/104 2966859b3cedf2d9 -bladeMaster 14/105 05401873db29432d -bladeMaster 14/106 9d36c2d2bf3ba135 -bladeMaster 14/107 2d042628849a63d9 -bladeMaster 14/108 048371351e2c15f1 -bladeMaster 14/109 6e403caf562109ed -bladeMaster 14/11 3e19e15c32d3d3fa -bladeMaster 14/110 21885b7622451abc -bladeMaster 14/111 2cdc8375434d2801 -bladeMaster 14/112 2dc2f84d057f3bd6 -bladeMaster 14/113 6146020d6aa58426 -bladeMaster 14/114 4436c0e8e5348a10 -bladeMaster 14/115 7ee7f473d9dba436 -bladeMaster 14/116 eb1e343dcd48eab8 -bladeMaster 14/117 694036c0898781e0 -bladeMaster 14/118 e81dc4cbe5b4d1b2 -bladeMaster 14/119 3d159b43ed1f9936 -bladeMaster 14/12 f147041a92b470e0 -bladeMaster 14/120 e9134b00c49b4e92 -bladeMaster 14/121 6547545cab3819ee -bladeMaster 14/122 0756f5961f900a2e -bladeMaster 14/123 80e4340e03237baa -bladeMaster 14/124 08214dd971779a12 -bladeMaster 14/125 b81f55bc64a7b31a -bladeMaster 14/126 cdaa6fdb956343ca -bladeMaster 14/127 29f26a03e2d30bca -bladeMaster 14/128 26a386cbe6331aac -bladeMaster 14/129 9a70f6eb4c115bb4 -bladeMaster 14/13 198b57f422c075b7 -bladeMaster 14/130 78074ee8b581a98a -bladeMaster 14/131 321a8b16d3a2f752 -bladeMaster 14/132 0617a66ef1667850 -bladeMaster 14/133 cdba899dd0b100c8 -bladeMaster 14/134 a9308b58f68fcce8 -bladeMaster 14/135 51b7fbc3421b935c -bladeMaster 14/136 9f5e9acfdbe1e6f0 -bladeMaster 14/137 2d144b96ca22e0dc -bladeMaster 14/138 f1f923750b6cbea0 -bladeMaster 14/139 cdfaae8d8fb12f9c -bladeMaster 14/14 43d5fb100f1cfe8f -bladeMaster 14/140 3a8bd4a323356938 -bladeMaster 14/141 d3b9f5be269d6997 -bladeMaster 14/142 362aa2d02136f477 -bladeMaster 14/143 671afd0db0682533 -bladeMaster 14/144 81c1c0dd6bfbfa3b -bladeMaster 14/145 e8f1c186b496f2b2 -bladeMaster 14/146 2048b7e62ffb620e -bladeMaster 14/147 f2528b4a7efff95e -bladeMaster 14/148 972db4ddfa397f10 -bladeMaster 14/149 25fd8338bc9fefc8 -bladeMaster 14/15 ab387f28b547e202 -bladeMaster 14/150 e6b4b339d04247c0 -bladeMaster 14/151 7510cf703e66712e -bladeMaster 14/152 155f318e01dad5f0 -bladeMaster 14/153 9d4862e45a74833e -bladeMaster 14/154 a9b6ef18c2afc9c6 -bladeMaster 14/155 f9e4444159e75a2e -bladeMaster 14/156 7a6cda891129b010 -bladeMaster 14/157 3fb1ffd22e888b3e -bladeMaster 14/158 229311298fae2a42 -bladeMaster 14/159 ee8e9aaa6b3babd8 -bladeMaster 14/16 ce229b533ae4bd4b -bladeMaster 14/160 5a85b125877d008f -bladeMaster 14/161 b44c89750548663b -bladeMaster 14/162 58f377e876396e1c -bladeMaster 14/163 a0f632ba6b3d9f7e -bladeMaster 14/169 a6ca3ff2575edf4c -bladeMaster 14/17 51159d6bfa7feb2f -bladeMaster 14/18 58a5b1bc8536d5df -bladeMaster 14/19 5abcf5fb6f315713 -bladeMaster 14/2 eeb211d1379f6c16 -bladeMaster 14/20 df236554553bba10 -bladeMaster 14/21 3bbee8b156d06c0a -bladeMaster 14/22 94a05994e85d6f53 -bladeMaster 14/23 ad12f0c0f693a513 -bladeMaster 14/24 b23b47f368f67c85 -bladeMaster 14/25 f562ca9e1c6731c9 -bladeMaster 14/26 ff17b985762a7ee1 -bladeMaster 14/28 851ca5783389831f -bladeMaster 14/29 47a7c25ce1419b0a -bladeMaster 14/3 3cff0a08000afffa -bladeMaster 14/31 9340beff073510ff -bladeMaster 14/32 146f74d2699c0b1e -bladeMaster 14/33 69de55154055e43c -bladeMaster 14/34 07305c9bf70f401a -bladeMaster 14/35 b5eb1f274a82a63c -bladeMaster 14/36 6cd8abc51ce28e70 -bladeMaster 14/37 53daf732efa5d3b4 -bladeMaster 14/38 c536b8c065a80a1a -bladeMaster 14/39 f6865c35a83b3102 -bladeMaster 14/4 ab52a4478c779ab4 -bladeMaster 14/40 018e7b36ede18436 -bladeMaster 14/41 68bf89f736244cbd -bladeMaster 14/42 cf6815a2c75d224d -bladeMaster 14/43 dd42df8ce0572869 -bladeMaster 14/44 075d4b9a23dd3a91 -bladeMaster 14/45 f50712e7a7f77db0 -bladeMaster 14/46 bd5902a9be4a2c72 -bladeMaster 14/47 c1e99cc95e59d7a6 -bladeMaster 14/48 dcf7ff67c45ae822 -bladeMaster 14/49 98b79380fb8e08a0 -bladeMaster 14/5 fcea0805f5c7e43c -bladeMaster 14/50 23c3f4154872ccf6 -bladeMaster 14/51 dfd7ce9347260fa2 -bladeMaster 14/52 93520479f9d19880 -bladeMaster 14/53 2437ce96b25c5dbe -bladeMaster 14/54 74767a136a1b51fa -bladeMaster 14/55 6e4c2f7db15c5eea -bladeMaster 14/56 de970b19c22c0b26 -bladeMaster 14/57 4ba6da29544b6d30 -bladeMaster 14/58 cc75ba78c5694f0c -bladeMaster 14/59 6984cf991a427228 -bladeMaster 14/6 674bd9ae9fca907c -bladeMaster 14/60 f4500b3cc56e2e40 -bladeMaster 14/61 4de047be88cf20b4 -bladeMaster 14/62 aee6887d4be78e38 -bladeMaster 14/63 667108b84a5e0ffa -bladeMaster 14/64 cef48af4cea32e28 -bladeMaster 14/65 ad6dbbd07db80eeb -bladeMaster 14/66 c8feeb824f31baa3 -bladeMaster 14/67 927f15c1b7e83087 -bladeMaster 14/68 b1c69212a16b171f -bladeMaster 14/7 039598128c7c9ed8 -bladeMaster 14/70 f86a12f00aecf9c4 -bladeMaster 14/71 608e4e78ad697b5a -bladeMaster 14/72 00820f8c320ffa84 -bladeMaster 14/73 2014773f79be4f7a -bladeMaster 14/74 35f36537f308fd04 -bladeMaster 14/75 30edc867ae55716a -bladeMaster 14/76 6cf46d427d0b6ce4 -bladeMaster 14/77 c2d25b852f62449c -bladeMaster 14/78 44557101289c4044 -bladeMaster 14/79 a92bd8712a8b1380 -bladeMaster 14/8 5c0cfbf0d458f81a -bladeMaster 14/80 10e51b8d0855c5ba -bladeMaster 14/81 8bb7ed476042d12c -bladeMaster 14/82 0996217aa36221e4 -bladeMaster 14/83 7637173f079e0d0e -bladeMaster 14/84 6ba995b38186b8dc -bladeMaster 14/85 f2b5d6dce3719f26 -bladeMaster 14/86 f5684fd70b73213c -bladeMaster 14/87 e8bda57c2596735a -bladeMaster 14/88 e0241534f08156be -bladeMaster 14/89 b830a3b512c1534a -bladeMaster 14/9 ecac69950cd86b70 -bladeMaster 14/90 a1a9f9c50144c944 -bladeMaster 14/91 7108cdd868387876 -bladeMaster 14/92 bed7d9ab12b4968c -bladeMaster 14/93 cd7af60c7c4679c4 -bladeMaster 14/94 22fefb1513fb52f4 -bladeMaster 14/95 be81c1e0e2b8c31e -bladeMaster 14/96 4363d11572afde5a -bladeMaster 14/97 a5363676073356d2 -bladeMaster 14/98 d6516d5ca26e54f6 -bladeMaster 14/99 bbfa7ffdae0a107e -bladeMaster 15/0 1ca918bc1b1c8096 -bladeMaster 15/1 03837424344342dc -bladeMaster 15/10 f7ed092df3b7a6c0 -bladeMaster 15/11 92d93d1456ae2938 -bladeMaster 15/12 0138650d8a745306 -bladeMaster 15/13 ebc01eafaa7c9634 -bladeMaster 15/14 3c8b4d6812621f78 -bladeMaster 15/15 1fe7815fc8521fb2 -bladeMaster 15/16 75e6b27bc72ea220 -bladeMaster 15/17 03b7d4fa589d9054 -bladeMaster 15/18 0cfac5d8cb74fa28 -bladeMaster 15/19 40eac2acb85d5716 -bladeMaster 15/2 1326d761ab60e5cc -bladeMaster 15/20 9591012fbd98d49e -bladeMaster 15/21 f80d761bd92ec3d6 -bladeMaster 15/22 50fb5fb5f945977a -bladeMaster 15/23 af887433eb585796 -bladeMaster 15/24 065600bc61a5b526 -bladeMaster 15/26 05cba1b1856260f6 -bladeMaster 15/27 c04685006cff73c6 -bladeMaster 15/28 7fe34a884e604340 -bladeMaster 15/29 88baba504236392e -bladeMaster 15/3 dbdc0fa6a6f26734 -bladeMaster 15/30 002c16bc215bf17a -bladeMaster 15/31 5fad9ce37a743042 -bladeMaster 15/32 f42b18018afa9d2e -bladeMaster 15/33 7e0903fb234e54b1 -bladeMaster 15/34 fb39699a79435ad4 -bladeMaster 15/35 91b9005dd0fbed83 -bladeMaster 15/36 e8af7b2e73d0c7d1 -bladeMaster 15/4 b0fbff25356fdff8 -bladeMaster 15/5 8caf74886ebf7a58 -bladeMaster 15/6 4849a4750a4ad7a0 -bladeMaster 15/7 2185c239f071a02c -bladeMaster 15/8 0c31ed6f3f436850 -bladeMaster 15/9 29eeaacb6941274e -bladeMaster 2/0 ced95feb014350d8 -bladeMaster 2/1 52c9060e35c5980b -bladeMaster 2/10 cb3c5251957d9a85 -bladeMaster 2/11 8447678d0b470793 -bladeMaster 2/12 28ea06eb908464ff -bladeMaster 2/13 ce40edfc665c3e08 -bladeMaster 2/14 a65e391515d9e92f -bladeMaster 2/15 bc089589953ca722 -bladeMaster 2/16 53290ce5711287c5 -bladeMaster 2/17 8aa439d28efc7be7 -bladeMaster 2/18 8722b9e8493a137d -bladeMaster 2/2 ad917588baaa2122 -bladeMaster 2/3 3e316f3398a8fc4c -bladeMaster 2/4 3841c7247c47b1ab -bladeMaster 2/5 64061504e3baf80c -bladeMaster 2/6 3b7862b77b5bf0ee -bladeMaster 2/7 fedfa16186e9c991 -bladeMaster 2/8 5f5841b5fa9afce2 -bladeMaster 2/9 e43edf71c6aaeed9 -bladeMaster 3/0 14ff8626941ad30d -bladeMaster 3/1 6fb296e28958127f -bladeMaster 3/10 6adfafde70c543e8 -bladeMaster 3/11 f2c6914ce283a171 -bladeMaster 3/2 8c17282fb7b7d5d5 -bladeMaster 3/3 927052e6f19f8c5e -bladeMaster 3/4 6ec73593da449cf9 -bladeMaster 3/5 8673dbf4879124d8 -bladeMaster 3/6 da67100fe001b152 -bladeMaster 3/7 ad993fd797660282 -bladeMaster 3/8 cf04c9bc9a54f190 -bladeMaster 3/9 68b5a0d0e2597b9d -bladeMaster 4/0 aa6584b3eab7ea25 -bladeMaster 4/1 0f9a7190f5db17f5 -bladeMaster 4/10 93cece274de42659 -bladeMaster 4/11 de111b4e33911a0f -bladeMaster 4/12 cee4100cd97070fc -bladeMaster 4/13 87302b1dc56c7155 -bladeMaster 4/14 494c9ff5e1fe2df5 -bladeMaster 4/15 f696918a59130364 -bladeMaster 4/16 c1f31f8c5d9047a0 -bladeMaster 4/17 6ae5a250127d7c86 -bladeMaster 4/18 e45bcec814716493 -bladeMaster 4/19 59b13ad7e4493dfc -bladeMaster 4/2 31f0378d07db7cc6 -bladeMaster 4/20 ebe148c0438e9f51 -bladeMaster 4/21 687e8987392e11df -bladeMaster 4/22 d154b0557685e278 -bladeMaster 4/23 510806dc28200dbe -bladeMaster 4/24 f7bf7fc54d10adf9 -bladeMaster 4/3 058d09d6cd86825f -bladeMaster 4/4 778a40e28ab4fa44 -bladeMaster 4/5 c51ab6bb4589350f -bladeMaster 4/6 4e686d633289ab50 -bladeMaster 4/7 8ce75cf255a438c4 -bladeMaster 4/8 17d2bbd089002b32 -bladeMaster 4/9 5903b74c2e356c52 -bladeMaster 5/0 516f00f6b8015dd9 -bladeMaster 5/1 b0f097c022d3f962 -bladeMaster 5/10 8813e48fed515210 -bladeMaster 5/11 37cf06c5e9965ac0 -bladeMaster 5/12 14888f0ea1c23439 -bladeMaster 5/13 7b031d4a60821e17 -bladeMaster 5/14 83a913ecd53416f1 -bladeMaster 5/15 8df8d15bde804d13 -bladeMaster 5/16 35bbc5fc265be7db -bladeMaster 5/17 6249f92e9717d353 -bladeMaster 5/18 f6da0edcc90ffd5c -bladeMaster 5/19 4727875eb25c1fe7 -bladeMaster 5/2 d8ed946d5a3b54a4 -bladeMaster 5/20 45615ba56367c766 -bladeMaster 5/21 97dc8558e0996ded -bladeMaster 5/22 21f27e5c739422c9 -bladeMaster 5/23 0118819272a1e85c -bladeMaster 5/3 78bf7048ae38a923 -bladeMaster 5/30 b4435e2a61a15a99 -bladeMaster 5/31 2ff0fe5b033d35da -bladeMaster 5/33 aab81dd3d1665793 -bladeMaster 5/34 e2b8ec203fd331c5 -bladeMaster 5/36 75e66cc29c35c1d5 -bladeMaster 5/4 3dff01629ffefd75 -bladeMaster 5/5 2d274af56b3cc0f5 -bladeMaster 5/6 a7101b4afdfc217e -bladeMaster 5/7 8a4ce1483304204c -bladeMaster 5/8 8978a90eb7de6413 -bladeMaster 5/9 e234d5a9e05e27f3 -bladeMaster 6/0 6f843479c4d90900 -bladeMaster 6/1 50f81fae741b67c8 -bladeMaster 6/10 fb228b81651fd6f1 -bladeMaster 6/11 5fe69aead5f52b74 -bladeMaster 6/12 5b9c671bc9c9427f -bladeMaster 6/13 e67a8ab2117c91e0 -bladeMaster 6/14 afa756b02ac0b24d -bladeMaster 6/15 ca4d60959a583090 -bladeMaster 6/16 19a09b5aa47a5c5f -bladeMaster 6/17 6219b24b71a89cfa -bladeMaster 6/18 420d0dc467561f21 -bladeMaster 6/19 764bb68a26022fbc -bladeMaster 6/2 488d8eae34db4d32 -bladeMaster 6/20 1a01d5cae40fa45a -bladeMaster 6/21 61d66899774d3a4b -bladeMaster 6/3 07e7caccb3ce091e -bladeMaster 6/4 f4b36eb35c9b757f -bladeMaster 6/5 509891bc4a040236 -bladeMaster 6/6 d479ce036a5b24b0 -bladeMaster 6/7 3b07b195aca10ff9 -bladeMaster 6/8 2ac8c17846805dbb -bladeMaster 6/9 9ee0a4db87ff86f5 -bladeMaster 7/0 7463c28357af4f5c -bladeMaster 7/1 a799ad047fda07c1 -bladeMaster 7/10 60d1e9254c599dd4 -bladeMaster 7/11 40990f621b787d11 -bladeMaster 7/12 2b3bcdea8b480a72 -bladeMaster 7/13 99171f7695c90d25 -bladeMaster 7/14 1cb40c1295a63c79 -bladeMaster 7/16 37b4f8fd75f3ecee -bladeMaster 7/17 57e6081dfe4c95de -bladeMaster 7/18 5a8a38bcad104aa6 -bladeMaster 7/19 fbd8057bfc3759c6 -bladeMaster 7/2 339bd92f569d404e -bladeMaster 7/21 d6027e77c619b3f6 -bladeMaster 7/22 bd4abe30dfbe6bd8 -bladeMaster 7/24 ed9dee80e385b527 -bladeMaster 7/25 1c88b129766cad55 -bladeMaster 7/26 efcecdf03af87950 -bladeMaster 7/27 72f919636b86fb91 -bladeMaster 7/28 1007553692b3a572 -bladeMaster 7/29 6ba2f738d6bbf0be -bladeMaster 7/3 f98dc170485782eb -bladeMaster 7/30 428443d7ac62fead -bladeMaster 7/31 69d7a8634cb9256e -bladeMaster 7/33 83c88e37b1b4b2d3 -bladeMaster 7/34 b8d7085d735e1fac -bladeMaster 7/35 370633cd68649be7 -bladeMaster 7/36 b6090d7280233cbb -bladeMaster 7/38 b6393004cd8ba2e5 -bladeMaster 7/39 5a6ac2605337cd87 -bladeMaster 7/4 13afb93766b5973b -bladeMaster 7/40 683c3ed977c5a462 -bladeMaster 7/41 94ba3609ad509163 -bladeMaster 7/42 b9fdad0f600ec29e -bladeMaster 7/43 648c0f9b7f605550 -bladeMaster 7/44 f0a9d3cbd729dce6 -bladeMaster 7/45 dd9eb04b6dd9fb49 -bladeMaster 7/46 1c0064a6c91f3fa9 -bladeMaster 7/49 9a4cebed34efcef3 -bladeMaster 7/5 1772727e4e18140e -bladeMaster 7/50 05eaa7ec0066fb27 -bladeMaster 7/51 f38124955b85463f -bladeMaster 7/52 1c0bf98743f3737e -bladeMaster 7/59 acb51a6b61a23c3f -bladeMaster 7/6 ae807f62486fa688 -bladeMaster 7/60 ae11d19a2e86c3c1 -bladeMaster 7/61 906e788b5589fc37 -bladeMaster 7/62 dd20a890b0b859a7 -bladeMaster 7/63 75a563858fdcf71d -bladeMaster 7/64 ad3cc79b0192ef63 -bladeMaster 7/65 fd61f57940319acb -bladeMaster 7/66 0ce5a70dbd23d821 -bladeMaster 7/67 45ff5cee9bbcd953 -bladeMaster 7/68 ccbbec5572072b60 -bladeMaster 7/69 2c72ba369623f195 -bladeMaster 7/7 5fe085542e2327d3 -bladeMaster 7/70 5488550f3d8e3d1e -bladeMaster 7/72 3a5837ff83b68ddc -bladeMaster 7/73 725f32bc98c22624 -bladeMaster 7/8 4dd7e3f21fc1b243 -bladeMaster 7/9 7fb7dde215cc989e -bladeMaster 8/0 aad0341d70572e0c -bladeMaster 8/1 3891ec437558c9da -bladeMaster 8/10 9b5fa007686e8b34 -bladeMaster 8/11 ace3b0fd2c29b25c -bladeMaster 8/12 f7bbbe74217da43d -bladeMaster 8/13 031f464ec1f5130a -bladeMaster 8/14 6567b731488d137b -bladeMaster 8/15 53be9a90297c9ade -bladeMaster 8/16 aa48fbf4f12e87ed -bladeMaster 8/17 0e7f3b30264f54de -bladeMaster 8/18 88c7fc03e770b6a9 -bladeMaster 8/19 39954101bc5d4b0a -bladeMaster 8/2 d32018f945d32d92 -bladeMaster 8/20 e6a6461b23f5fd45 -bladeMaster 8/21 0f53a6a27ea0c02d -bladeMaster 8/22 0747639d9e288e15 -bladeMaster 8/23 d94f333a02a56a9e -bladeMaster 8/24 5a3703ecdcb52150 -bladeMaster 8/25 e0cd706e641d4221 -bladeMaster 8/26 785a7241fe0e6c16 -bladeMaster 8/27 6ac413ae20851eca -bladeMaster 8/28 bbbe9f97b5563953 -bladeMaster 8/29 dde9cc5ed86f2a5b -bladeMaster 8/3 2a0d755c19c9b985 -bladeMaster 8/30 6f83c9ef484d93f3 -bladeMaster 8/31 78df65f3027847c5 -bladeMaster 8/32 9171ac2a3b59b18f -bladeMaster 8/33 e654f5dfe87809c5 -bladeMaster 8/34 eb19ce9ab439e6e1 -bladeMaster 8/35 051a184f9ebb037e -bladeMaster 8/36 52ef746b8f4d8eca -bladeMaster 8/37 365b971870bdbd2a -bladeMaster 8/38 62125a60359a776f -bladeMaster 8/39 f088b1bce40d84af -bladeMaster 8/4 1f9836605512bb78 -bladeMaster 8/40 cb4a6f03c83cf53d -bladeMaster 8/41 8951fed01d24e572 -bladeMaster 8/42 398b6efb1306c576 -bladeMaster 8/43 4e0f75ca04409b0b -bladeMaster 8/44 2ad1260460975815 -bladeMaster 8/45 e06f0ecbaa710dfc -bladeMaster 8/46 e8a6f333b1775bfc -bladeMaster 8/47 10cb81ea4988f0b8 -bladeMaster 8/48 de5794be74da3ea7 -bladeMaster 8/49 65c8c2eb9739df30 -bladeMaster 8/5 971e22025842cc0f -bladeMaster 8/50 2a11b319d19ee0dc -bladeMaster 8/51 6f1d07e22e8a6652 -bladeMaster 8/52 3f9e4f1a6a7d229b -bladeMaster 8/59 6c4af3e0249ca6a4 -bladeMaster 8/6 571729775487db52 -bladeMaster 8/60 50a6322ec5f6c6cc -bladeMaster 8/61 07d22c52ff92bf6c -bladeMaster 8/62 854e25dfdb38a5f8 -bladeMaster 8/63 9b6d4a07f0b9c09c -bladeMaster 8/64 ef7a074a2816263f -bladeMaster 8/65 26623bc589dcf363 -bladeMaster 8/66 e83c352a73a47d8d -bladeMaster 8/67 9736425e5d6ceeca -bladeMaster 8/68 6f3c4aeb0739c7ed -bladeMaster 8/69 c22dd936f5a159fb -bladeMaster 8/7 541ad29ee96fbf2c -bladeMaster 8/70 4567f73dbdbe5df1 -bladeMaster 8/71 cc19482bc0a786de -bladeMaster 8/72 8e33f4655180efff -bladeMaster 8/73 2f91bfb37b561e81 -bladeMaster 8/8 92aa952db3eab632 -bladeMaster 8/9 7314c0a8fe7a4046 -bladeMaster 9/0 6e0dfaa2db2507d9 -bladeMaster 9/1 4a5668d23990c728 -bladeMaster 9/10 5f2aa4da492b7ceb -bladeMaster 9/11 f4110c740611e6a0 -bladeMaster 9/12 5b97ef10fa9cb313 -bladeMaster 9/13 7e947ce7f23f15b1 -bladeMaster 9/14 d6d0b4878b11fe9d -bladeMaster 9/15 a8252b7772c7aae0 -bladeMaster 9/16 44712e8f7c2e3d7c -bladeMaster 9/17 3bafaf65f4196757 -bladeMaster 9/18 c9e5d51294b1d4c7 -bladeMaster 9/19 8e9f1fda7fbe9fde -bladeMaster 9/2 162aab74c468306d -bladeMaster 9/20 364c6664820897a9 -bladeMaster 9/21 a3ef06a0cc361c9d -bladeMaster 9/22 89c31f3dead2469a -bladeMaster 9/23 62d818229f0ef7b6 -bladeMaster 9/24 2dd84000320d9884 -bladeMaster 9/25 6732ec2bdb1c4b2f -bladeMaster 9/26 75712d3839d3d4f3 -bladeMaster 9/27 351410c9e7cfd1be -bladeMaster 9/28 d028bc7465e10d43 -bladeMaster 9/29 4710740976b6ef1e -bladeMaster 9/3 5c218a727d318017 -bladeMaster 9/30 7b5502668de50546 -bladeMaster 9/31 7a66280ea723ae5f -bladeMaster 9/32 ed9c6ebbd32c5983 -bladeMaster 9/33 1873521d2ea610c7 -bladeMaster 9/34 c481ec8e7f233c3b -bladeMaster 9/35 0bed7b469998b13c -bladeMaster 9/36 da6b51b5a77e08e3 -bladeMaster 9/37 e23dae792e184b20 -bladeMaster 9/38 319bb5db285ba93d -bladeMaster 9/39 18e5c6852ed26ef4 -bladeMaster 9/4 33f3e428f89c4e5d -bladeMaster 9/40 7e9235f9330da480 -bladeMaster 9/41 9cef5d1271b4b823 -bladeMaster 9/42 fb020eef276d2eb4 -bladeMaster 9/43 181d19bef8b2d868 -bladeMaster 9/44 5462eb3e203567ec -bladeMaster 9/45 0960f6ad2b5feda2 -bladeMaster 9/46 6dc3e70f2dede746 -bladeMaster 9/47 f592faeb9209ded2 -bladeMaster 9/48 ee0af5abce8d95cb -bladeMaster 9/49 62c871c33b29ac86 -bladeMaster 9/5 adb4a2e46e82efb5 -bladeMaster 9/50 29514dea161bc27e -bladeMaster 9/51 59776925bd513c74 -bladeMaster 9/52 a2a4634d3d0583b3 -bladeMaster 9/59 52a509384bd1d97c -bladeMaster 9/6 8f9419c3d8f81fcb -bladeMaster 9/60 7906291137364ba1 -bladeMaster 9/61 345687d84f1cfa13 -bladeMaster 9/62 44ce8d9f1af34f63 -bladeMaster 9/63 879d437f886acbac -bladeMaster 9/64 dcffcd1650195beb -bladeMaster 9/65 460a12bd0860f9b6 -bladeMaster 9/66 0ec21c99978ab669 -bladeMaster 9/67 134169f2374a151f -bladeMaster 9/68 d089daf7c7767504 -bladeMaster 9/69 b19ae85ab5952dba -bladeMaster 9/7 9ccb104e42a7f79d -bladeMaster 9/70 abc2bfbbaca4b85c -bladeMaster 9/71 d2a2a186f0068a5c -bladeMaster 9/72 6808594e6eb2e2b0 -bladeMaster 9/73 ff2cb1f74bddfb50 -bladeMaster 9/8 36653355aa7c32db -bladeMaster 9/9 39ea036a3aedf6fd -newDarkWizard 0/0 134798a8b915e09d -newDarkWizard 0/1 1f4d29182dfc3993 -newDarkWizard 0/10 2d37101c6a4c3aa7 -newDarkWizard 0/11 0c96ccf0bcfdeecf -newDarkWizard 0/12 89d68772e6e56de4 -newDarkWizard 0/13 02ea925a3ec44157 -newDarkWizard 0/14 e036fb42fde0b6f1 -newDarkWizard 0/15 05b749b18fc6d586 -newDarkWizard 0/16 40c697256af7b1a1 -newDarkWizard 0/17 a88ce97cb16eb01f -newDarkWizard 0/18 0dc45a9e9ebbbf18 -newDarkWizard 0/19 1373c61d49ca7266 -newDarkWizard 0/2 0bda73914316f583 -newDarkWizard 0/20 e7917f650a745a6b -newDarkWizard 0/21 15ffa5ed478bdd4d -newDarkWizard 0/22 4f1b113a5d6ff167 -newDarkWizard 0/23 f2028aa3d6688c99 -newDarkWizard 0/24 2aa3c6aa6e93a024 -newDarkWizard 0/25 6763384509ea9181 -newDarkWizard 0/26 822c9d89a05e74f8 -newDarkWizard 0/27 1b63f830141caecc -newDarkWizard 0/28 edc7df1705811ce1 -newDarkWizard 0/3 d1a3917dacb8513a -newDarkWizard 0/31 d7a5c1358d8d461c -newDarkWizard 0/32 0fb4b50cd3a5712b -newDarkWizard 0/33 3b4a1c53fb4fd425 -newDarkWizard 0/34 a3eb5c50f5525751 -newDarkWizard 0/35 79a8cd15a1f13663 -newDarkWizard 0/4 50d0f46fe355cb3d -newDarkWizard 0/5 448cc776de4dc4c6 -newDarkWizard 0/6 6c1e59a4fca30906 -newDarkWizard 0/7 b7a2b2ea3664d909 -newDarkWizard 0/8 fcd21f9b0cd20edf -newDarkWizard 0/9 3c2299d88305e633 -newDarkWizard 1/0 bb623a783c6fbc35 -newDarkWizard 1/1 af355767f3a2e98e -newDarkWizard 1/2 ef553b49af13bd18 -newDarkWizard 1/3 ce86d813c77a877e -newDarkWizard 1/4 239b50ae0aa034c8 -newDarkWizard 1/5 49a5a4de68a33a0a -newDarkWizard 1/6 b930326ef18fc238 -newDarkWizard 1/7 f77a362b2f3a9bfb -newDarkWizard 1/8 ecb13fe733d0441d -newDarkWizard 10/0 b20c66d740945ab1 -newDarkWizard 10/1 c6afc572ace98671 -newDarkWizard 10/10 be4fd1d0c1acbcce -newDarkWizard 10/11 796b9ccee9044113 -newDarkWizard 10/12 c73ab64238aa85c3 -newDarkWizard 10/13 27ee394d27045b44 -newDarkWizard 10/14 11f8a4ed1e7f6ed7 -newDarkWizard 10/15 f9a728ba5022c805 -newDarkWizard 10/16 57212d44835a3172 -newDarkWizard 10/17 86ecb27155da1c68 -newDarkWizard 10/18 3fc5235e36556e8a -newDarkWizard 10/19 76480fa1a2f96b71 -newDarkWizard 10/2 1cf897f0d78900d3 -newDarkWizard 10/20 96851496b09bade4 -newDarkWizard 10/21 ab9996d2b87398ab -newDarkWizard 10/22 fc43768fde3a25f0 -newDarkWizard 10/23 1620a9023f5df909 -newDarkWizard 10/24 708b63e6a3d927e4 -newDarkWizard 10/25 344106c701023b75 -newDarkWizard 10/26 83ccdbf881c894c3 -newDarkWizard 10/27 e14d8eeeb2cee3f8 -newDarkWizard 10/28 39a1681c6c7c1370 -newDarkWizard 10/29 56c060833fee67bc -newDarkWizard 10/3 8bf6cfd493cc9bea -newDarkWizard 10/30 6f6a76029980609d -newDarkWizard 10/31 259fa6a94f4471ea -newDarkWizard 10/32 1b61f38003e7e14a -newDarkWizard 10/33 730e27856c6cf118 -newDarkWizard 10/34 cdf678f20f62824e -newDarkWizard 10/35 1d411c39c8e0a900 -newDarkWizard 10/36 532273db6c1a894b -newDarkWizard 10/37 2c6a35a378a7fc2e -newDarkWizard 10/38 439346a32bdf9145 -newDarkWizard 10/39 a2ba4766da1b9981 -newDarkWizard 10/4 f4aaf0fd30751a81 -newDarkWizard 10/40 3f38eccf4d0f317f -newDarkWizard 10/41 37b5c2865753c074 -newDarkWizard 10/42 781697e96251d26b -newDarkWizard 10/43 bbf57ff2f32244cf -newDarkWizard 10/44 ca858b53502898cf -newDarkWizard 10/45 c9362aa59037a149 -newDarkWizard 10/46 7cf70e32e54b83d7 -newDarkWizard 10/47 b55a4e366d9151da -newDarkWizard 10/48 f5c732b1ac98429a -newDarkWizard 10/49 dc341c8d6aa197d9 -newDarkWizard 10/5 0bf1d66ebac21309 -newDarkWizard 10/50 c25dac3e87be24cf -newDarkWizard 10/51 4cdb86a01c44785f -newDarkWizard 10/52 a658cec97c8a904d -newDarkWizard 10/6 a20e3ef852f414ee -newDarkWizard 10/62 bd1206cdc7383f25 -newDarkWizard 10/63 cea579e8ef71e70f -newDarkWizard 10/64 fcd74113a14063fe -newDarkWizard 10/65 0ed93c64ca261f4f -newDarkWizard 10/66 ce89264f3edce6d7 -newDarkWizard 10/67 3445980710472884 -newDarkWizard 10/68 ef65e404c880ca2e -newDarkWizard 10/69 70dac564867b702e -newDarkWizard 10/7 8b028f56d0ed32bc -newDarkWizard 10/70 f4ceec0d98233c29 -newDarkWizard 10/71 a3e0a235d92cd8c3 -newDarkWizard 10/8 14ee27dacbebe363 -newDarkWizard 10/9 1fa5265accdb256b -newDarkWizard 11/0 306f9ff8b09c17b7 -newDarkWizard 11/1 e2517dbf7b5b5c5f -newDarkWizard 11/10 17eff52527c47bd9 -newDarkWizard 11/11 6760498a8890a7a7 -newDarkWizard 11/12 38e8e569b602af31 -newDarkWizard 11/13 4c3fe78b687cca3c -newDarkWizard 11/14 f8a68ecdcbecc743 -newDarkWizard 11/15 9f2da6f36c6d1ea3 -newDarkWizard 11/16 ad67fa4881e0073c -newDarkWizard 11/17 0308b953ca8761fa -newDarkWizard 11/18 347125a3c9ce5c73 -newDarkWizard 11/19 f25e8a465142db65 -newDarkWizard 11/2 4d9626010eca6b6b -newDarkWizard 11/20 2c9eb524be7499be -newDarkWizard 11/21 ccc2831c117f9270 -newDarkWizard 11/22 d4b9986e7ba88880 -newDarkWizard 11/23 cd7531276e4029f8 -newDarkWizard 11/24 a82347ca7478ba11 -newDarkWizard 11/25 dc6bccfee5cfe79c -newDarkWizard 11/26 b07070a84ea637aa -newDarkWizard 11/27 97310cf819eea378 -newDarkWizard 11/28 c81ff30e3c51cbee -newDarkWizard 11/29 1d008c234248dc0b -newDarkWizard 11/3 2424efa8cb1862d2 -newDarkWizard 11/30 ec7fefe0106bc3bc -newDarkWizard 11/31 4f805db26a5fa200 -newDarkWizard 11/32 053efc5b31f6f637 -newDarkWizard 11/33 7c043aea428990c6 -newDarkWizard 11/34 9173aa8822b9ff9a -newDarkWizard 11/35 e36e59fc901fd667 -newDarkWizard 11/36 45ee2dd5a00edb09 -newDarkWizard 11/37 2c814cbb2204ca45 -newDarkWizard 11/38 285fbb63505ef12a -newDarkWizard 11/39 860e72960dc031bb -newDarkWizard 11/4 ee0a5078081b2b75 -newDarkWizard 11/40 6114611f2f2c4c9f -newDarkWizard 11/41 e2f66bf03e465165 -newDarkWizard 11/42 2d34aeed8fd33280 -newDarkWizard 11/43 8fc2a93091b048ac -newDarkWizard 11/44 b6cc1b1a60aea25b -newDarkWizard 11/45 7a32b9a54a8fbb5a -newDarkWizard 11/46 fe78e6a08a6cdb90 -newDarkWizard 11/47 60ceb0dc82346056 -newDarkWizard 11/48 95283505b3c2ee12 -newDarkWizard 11/49 3c01fb7b4090b4a2 -newDarkWizard 11/5 0e5c8440c314d0c6 -newDarkWizard 11/50 52c29b2d4d52e847 -newDarkWizard 11/51 a58b58d98c385baf -newDarkWizard 11/52 a617fb5a0b55159b -newDarkWizard 11/59 63b8c7d350763638 -newDarkWizard 11/6 4b573303ff56e594 -newDarkWizard 11/60 1667cb72fbc43b93 -newDarkWizard 11/61 e1846f2ec85141d6 -newDarkWizard 11/62 5137771bf254eca0 -newDarkWizard 11/63 c9476784a7be7a2b -newDarkWizard 11/64 7d5cfd009598ebec -newDarkWizard 11/65 cccec72d49b0b929 -newDarkWizard 11/66 51a6d88af03b92e1 -newDarkWizard 11/67 54188d94cb0b088a -newDarkWizard 11/68 24efb3ffe5225723 -newDarkWizard 11/69 3293f1046ca9de69 -newDarkWizard 11/7 edfb4f33c88d3123 -newDarkWizard 11/70 7e03b4bc697c5c3d -newDarkWizard 11/71 765e15534370a33f -newDarkWizard 11/72 86df3ffedbd3cc4a -newDarkWizard 11/73 aef31f28e5ca5b33 -newDarkWizard 11/8 643f00d171317c10 -newDarkWizard 11/9 4f385d56c1ea8049 -newDarkWizard 12/0 4951a36c54f67611 -newDarkWizard 12/1 6ce3e83ace95cced -newDarkWizard 12/10 51618a4edbbd5a90 -newDarkWizard 12/100 3ff42392ea36da09 -newDarkWizard 12/101 eca3dae7a3c6ca35 -newDarkWizard 12/102 06f1dd752ce7d8cb -newDarkWizard 12/103 cb8bfdbe616d1e8b -newDarkWizard 12/104 54b0bf75a40e1bcf -newDarkWizard 12/105 9652143d7c398adf -newDarkWizard 12/106 c1aa139def6c8121 -newDarkWizard 12/107 97512d4abf4b5327 -newDarkWizard 12/108 418080b785f43197 -newDarkWizard 12/109 de405bd8b1f315b5 -newDarkWizard 12/11 0cf9d4df9a6a4fba -newDarkWizard 12/110 017cfdf80647d56f -newDarkWizard 12/111 64eacaf3a5ac6a33 -newDarkWizard 12/112 d63475cbd9820ce1 -newDarkWizard 12/113 233670a4a83af85b -newDarkWizard 12/114 989a590fb219cfe3 -newDarkWizard 12/115 a98cabfe23c613c7 -newDarkWizard 12/116 c30fb0a8172e1015 -newDarkWizard 12/117 30ba7e8d37100573 -newDarkWizard 12/118 103bcde2bd20cefb -newDarkWizard 12/119 9c06d0467cca7035 -newDarkWizard 12/12 0cd6b0716168acec -newDarkWizard 12/120 fbc4009c17284717 -newDarkWizard 12/121 80fcbe31ed4350f3 -newDarkWizard 12/122 7746702f9eb02a35 -newDarkWizard 12/123 afb763e42d686673 -newDarkWizard 12/124 dc86ebc72fb25649 -newDarkWizard 12/125 fb9b1f6be972d017 -newDarkWizard 12/126 f2b288adaba4d539 -newDarkWizard 12/127 55544185a550c191 -newDarkWizard 12/128 b9107810270989a9 -newDarkWizard 12/129 d2cbcef19d664567 -newDarkWizard 12/13 15714fc8a7551e30 -newDarkWizard 12/130 4287df7945755c03 -newDarkWizard 12/131 f07a1e3bbb6c5a21 -newDarkWizard 12/132 443a9933f53f174f -newDarkWizard 12/133 607639b2b47b0f0d -newDarkWizard 12/134 2366468d6f8edfae -newDarkWizard 12/135 9c2f18cc9ac88a35 -newDarkWizard 12/136 23783434a484b401 -newDarkWizard 12/137 a955a3f3992b7b85 -newDarkWizard 12/138 5a2c8e9853e9e3ed -newDarkWizard 12/139 e0d0f6fe2ebf6249 -newDarkWizard 12/14 0960371d869d7dac -newDarkWizard 12/140 ab42c0224c5cbacd -newDarkWizard 12/141 b03509ef7fde2f19 -newDarkWizard 12/142 96c5d00c40701299 -newDarkWizard 12/143 b271decfad2c3f65 -newDarkWizard 12/15 0b22aeec075063ff -newDarkWizard 12/16 88ce380a2c0a3fb0 -newDarkWizard 12/17 838b104835d7e328 -newDarkWizard 12/18 38170637d2a7acc6 -newDarkWizard 12/19 12b23d52a48bba50 -newDarkWizard 12/2 972e3cb3ba59e2ca -newDarkWizard 12/21 7824565a0a5ecc68 -newDarkWizard 12/22 abb6949336e4b81a -newDarkWizard 12/23 f6cb3906f0f6c882 -newDarkWizard 12/24 623343b0fa67f098 -newDarkWizard 12/26 e522ded730403f3a -newDarkWizard 12/3 411e24a37f6c22f6 -newDarkWizard 12/30 c042763bb5e4829d -newDarkWizard 12/31 7caae1d5e81724a9 -newDarkWizard 12/32 b0cf0e5d9e82fcf4 -newDarkWizard 12/33 326cb73e4edb3040 -newDarkWizard 12/34 9ec1daa2ea6ad666 -newDarkWizard 12/35 9c7c93a2a9e750e4 -newDarkWizard 12/36 32e4a3450f290ca6 -newDarkWizard 12/37 e9d5894adb642c7d -newDarkWizard 12/38 a15d516f236f0c3b -newDarkWizard 12/39 80e2d0047c51c296 -newDarkWizard 12/4 7b5db732c0d99a76 -newDarkWizard 12/40 58bad31e58167bd5 -newDarkWizard 12/41 28481a3a027dd30f -newDarkWizard 12/42 0987e05dcfb647de -newDarkWizard 12/43 33ed39f6cdf90879 -newDarkWizard 12/44 728bb64895c90ee6 -newDarkWizard 12/45 3760539ddb5960e0 -newDarkWizard 12/46 3f8a85ca1da84fac -newDarkWizard 12/47 849d7e3a9ffe375e -newDarkWizard 12/48 84d94f08e8f68322 -newDarkWizard 12/49 f892b4654fbeab17 -newDarkWizard 12/5 67beb8ec106863f3 -newDarkWizard 12/50 afffae0eddff6c3d -newDarkWizard 12/6 a7680bccb1c7d6e8 -newDarkWizard 12/60 7b6d118dbb0eecbf -newDarkWizard 12/61 3662478207ff8f23 -newDarkWizard 12/62 a45d452187ebfb81 -newDarkWizard 12/63 31203a1874098c03 -newDarkWizard 12/64 42d6acc72e61de39 -newDarkWizard 12/65 f51a063af8aa4171 -newDarkWizard 12/7 8c2f4df15f4f3604 -newDarkWizard 12/70 ebc68fa28c00c415 -newDarkWizard 12/71 b93ab82c3f3ad9f9 -newDarkWizard 12/72 c08ffe6642869169 -newDarkWizard 12/8 c32404c6f22081d4 -newDarkWizard 12/9 b480f7a013a60466 -newDarkWizard 13/0 6c85837d6ddf876a -newDarkWizard 13/1 6be0128e642745a8 -newDarkWizard 13/10 cb64de86b0b18680 -newDarkWizard 13/103 ffe102bf7dc0e014 -newDarkWizard 13/104 aba974c5bdf2d6f8 -newDarkWizard 13/105 b2aa6b5b18a793ae -newDarkWizard 13/106 a0cdbf0a5b488042 -newDarkWizard 13/107 407ffa11415153a3 -newDarkWizard 13/109 34354e5df68b885c -newDarkWizard 13/11 42a7549ca2f3890c -newDarkWizard 13/110 9828920251d40bfc -newDarkWizard 13/111 24d8918e6002d29e -newDarkWizard 13/112 c2b1b1aec9617a74 -newDarkWizard 13/113 180d61ac2aaa3e32 -newDarkWizard 13/114 d66a92488b69f80c -newDarkWizard 13/115 4fb708548192b660 -newDarkWizard 13/116 bac49e82f047dc96 -newDarkWizard 13/117 53034f2ed11b899e -newDarkWizard 13/118 1314ffb1036be25e -newDarkWizard 13/119 6a0160b3e4e9a6f8 -newDarkWizard 13/12 09502bfa3e8ae4a6 -newDarkWizard 13/120 4bea83a6283b664c -newDarkWizard 13/121 96151e9e7dc4b6ea -newDarkWizard 13/122 6f6566e89e6f7048 -newDarkWizard 13/123 a97f6175f3bcc268 -newDarkWizard 13/124 98f513e5be29c48c -newDarkWizard 13/125 655230cd1b826018 -newDarkWizard 13/126 2c1c0d80fd140fc2 -newDarkWizard 13/127 f80d7fe01330d14e -newDarkWizard 13/128 2acd815ad9d8ab6a -newDarkWizard 13/129 2762fe299f29973e -newDarkWizard 13/13 c7694a4a531cd570 -newDarkWizard 13/130 5ec7137258dfaac6 -newDarkWizard 13/131 910d09677bdde37a -newDarkWizard 13/132 11a835a0bfe46888 -newDarkWizard 13/133 8220fcb5bbc4ec34 -newDarkWizard 13/134 0b8e3482061852f8 -newDarkWizard 13/135 0fa5844fcbef159f -newDarkWizard 13/136 faee271b0567741f -newDarkWizard 13/137 9bb35e5fe428116b -newDarkWizard 13/138 3fec2c075747a0e3 -newDarkWizard 13/139 7ff1d34a24799f8f -newDarkWizard 13/14 3d16d55604dd0d73 -newDarkWizard 13/140 5f6b46b50bbf7d1b -newDarkWizard 13/141 ee590cdca5bfa927 -newDarkWizard 13/142 17fef807a1d49037 -newDarkWizard 13/143 500949ec35910d3b -newDarkWizard 13/144 4b1a6f5fb651536b -newDarkWizard 13/15 4019d770452a0f2d -newDarkWizard 13/16 4a77b9dfed3aacdb -newDarkWizard 13/17 1d56838ba271a9d7 -newDarkWizard 13/18 bc27db488403d21c -newDarkWizard 13/19 45bb90ba2dadda83 -newDarkWizard 13/2 d3e4276206674566 -newDarkWizard 13/20 287209a700736f10 -newDarkWizard 13/21 ef007255cb7fea78 -newDarkWizard 13/22 7752560b9c1d9858 -newDarkWizard 13/23 d102bbfc752ec3b2 -newDarkWizard 13/24 b43bcc277bcd6052 -newDarkWizard 13/25 a5dc5c9f879f6d9e -newDarkWizard 13/26 f26d457695b1903c -newDarkWizard 13/27 b19bfbb792fd310a -newDarkWizard 13/28 847b306f6b665116 -newDarkWizard 13/29 a2214cd76d01f84e -newDarkWizard 13/3 ca39f041955d0b08 -newDarkWizard 13/30 6f7d12eeebe7ad59 -newDarkWizard 13/31 82b09dffa946fc74 -newDarkWizard 13/32 f0fc2797c4b8f20f -newDarkWizard 13/33 a149a0c01fef4493 -newDarkWizard 13/34 1d325871c9e8295f -newDarkWizard 13/35 5d55e59792200135 -newDarkWizard 13/36 d849b4ec5fd966b8 -newDarkWizard 13/37 f6c8892736a92211 -newDarkWizard 13/38 c44bc80da14b15db -newDarkWizard 13/39 2b3fc39e41540035 -newDarkWizard 13/4 c30065f96e0a3f3f -newDarkWizard 13/40 1c5fea7d58ed83e4 -newDarkWizard 13/41 46d48f47229fa52e -newDarkWizard 13/42 e670af347bbc029f -newDarkWizard 13/43 e102be1c2ee19478 -newDarkWizard 13/44 e69f1fb99524e3fc -newDarkWizard 13/45 7fd1b4e949d8308a -newDarkWizard 13/46 d4b6541887bbf298 -newDarkWizard 13/47 83ebe13db93d9a00 -newDarkWizard 13/48 d719f1d0ebaadde4 -newDarkWizard 13/49 77de283993e76a54 -newDarkWizard 13/5 54874fe02339390f -newDarkWizard 13/50 88d6212728a8923a -newDarkWizard 13/51 d45be964e47d73ee -newDarkWizard 13/52 985696797ff9478b -newDarkWizard 13/53 d170d04fb230a407 -newDarkWizard 13/54 43bd590099541634 -newDarkWizard 13/55 ea04f3babf6587ee -newDarkWizard 13/56 0bf59863695d8a08 -newDarkWizard 13/57 61e31240ea12d5b4 -newDarkWizard 13/58 e42c14abbac12718 -newDarkWizard 13/59 5931263cf5b6cf74 -newDarkWizard 13/60 1e421fa4e4d0c552 -newDarkWizard 13/61 2502d6a0ba82e980 -newDarkWizard 13/62 348b4fc30c885d6c -newDarkWizard 13/63 4f3935b62ab5853e -newDarkWizard 13/64 6a17c2352b1cdf40 -newDarkWizard 13/65 66bb77ac6c3dcea2 -newDarkWizard 13/66 5cd0799e06b7f7c6 -newDarkWizard 13/67 f2b1d1a04db019fc -newDarkWizard 13/68 d5f878bb461a6ae4 -newDarkWizard 13/69 b8abbadfb48ada58 -newDarkWizard 13/7 c701d0c873dff9ac -newDarkWizard 13/70 06ae1db3f3b7f5e0 -newDarkWizard 13/71 95b1da9b849569f6 -newDarkWizard 13/72 289501061e7f14d4 -newDarkWizard 13/73 b0a7d110cf7e4b8e -newDarkWizard 13/74 5838fdf16bb46e88 -newDarkWizard 13/75 5c42dd19fd2ee654 -newDarkWizard 13/76 d4bb8f9fcd5b3972 -newDarkWizard 13/8 b16c4df09a32a336 -newDarkWizard 13/80 a794ed28a3c69bda -newDarkWizard 13/81 5568bf138b434644 -newDarkWizard 13/82 09f0b91ea06eb836 -newDarkWizard 13/83 b554d9dc5887eaee -newDarkWizard 13/84 3777011aefdbb524 -newDarkWizard 13/85 d661dc7a56d3a87e -newDarkWizard 13/86 98ed73737700d664 -newDarkWizard 13/87 3563c45fb2859b14 -newDarkWizard 13/88 57b9d895c5c50f28 -newDarkWizard 13/89 eff0f8d982ec1edc -newDarkWizard 13/9 6fb28832a3a2b06e -newDarkWizard 13/90 1595422c484b2cde -newDarkWizard 13/91 bba9e8b477f2f6c4 -newDarkWizard 13/92 adbc4f9eec85c860 -newDarkWizard 13/93 0bddac744bc93426 -newDarkWizard 13/94 b863f066b9beb728 -newDarkWizard 13/95 99f2c49b919f936e -newDarkWizard 13/96 93bff665ed2cea74 -newDarkWizard 13/97 4c50526c09a129e4 -newDarkWizard 13/98 95b7258aa11bc718 -newDarkWizard 13/99 a6587695c4ec191c -newDarkWizard 14/0 f7c3a07b59b1b5fc -newDarkWizard 14/1 2cadbb4359f897d2 -newDarkWizard 14/10 44bd525fcbfd54b2 -newDarkWizard 14/100 3e8b7dba34e3ca77 -newDarkWizard 14/101 d05f34b151313cb3 -newDarkWizard 14/102 bcb4b264dba3ee9d -newDarkWizard 14/103 9714c3def8c27eb9 -newDarkWizard 14/104 2966859b3cedf2d9 -newDarkWizard 14/105 05401873db29432d -newDarkWizard 14/106 9d36c2d2bf3ba135 -newDarkWizard 14/107 2d042628849a63d9 -newDarkWizard 14/108 048371351e2c15f1 -newDarkWizard 14/109 6e403caf562109ed -newDarkWizard 14/11 3e19e15c32d3d3fa -newDarkWizard 14/110 21885b7622451abc -newDarkWizard 14/111 2cdc8375434d2801 -newDarkWizard 14/112 2dc2f84d057f3bd6 -newDarkWizard 14/113 6146020d6aa58426 -newDarkWizard 14/114 4436c0e8e5348a10 -newDarkWizard 14/115 7ee7f473d9dba436 -newDarkWizard 14/116 eb1e343dcd48eab8 -newDarkWizard 14/117 694036c0898781e0 -newDarkWizard 14/118 e81dc4cbe5b4d1b2 -newDarkWizard 14/119 3d159b43ed1f9936 -newDarkWizard 14/12 f147041a92b470e0 -newDarkWizard 14/120 e9134b00c49b4e92 -newDarkWizard 14/121 6547545cab3819ee -newDarkWizard 14/122 0756f5961f900a2e -newDarkWizard 14/123 80e4340e03237baa -newDarkWizard 14/124 08214dd971779a12 -newDarkWizard 14/125 b81f55bc64a7b31a -newDarkWizard 14/126 cdaa6fdb956343ca -newDarkWizard 14/127 29f26a03e2d30bca -newDarkWizard 14/128 26a386cbe6331aac -newDarkWizard 14/129 9a70f6eb4c115bb4 -newDarkWizard 14/13 198b57f422c075b7 -newDarkWizard 14/130 78074ee8b581a98a -newDarkWizard 14/131 321a8b16d3a2f752 -newDarkWizard 14/132 0617a66ef1667850 -newDarkWizard 14/133 cdba899dd0b100c8 -newDarkWizard 14/134 a9308b58f68fcce8 -newDarkWizard 14/135 51b7fbc3421b935c -newDarkWizard 14/136 9f5e9acfdbe1e6f0 -newDarkWizard 14/137 2d144b96ca22e0dc -newDarkWizard 14/138 f1f923750b6cbea0 -newDarkWizard 14/139 cdfaae8d8fb12f9c -newDarkWizard 14/14 43d5fb100f1cfe8f -newDarkWizard 14/140 3a8bd4a323356938 -newDarkWizard 14/141 d3b9f5be269d6997 -newDarkWizard 14/142 362aa2d02136f477 -newDarkWizard 14/143 671afd0db0682533 -newDarkWizard 14/144 81c1c0dd6bfbfa3b -newDarkWizard 14/145 e8f1c186b496f2b2 -newDarkWizard 14/146 2048b7e62ffb620e -newDarkWizard 14/147 f2528b4a7efff95e -newDarkWizard 14/148 972db4ddfa397f10 -newDarkWizard 14/149 25fd8338bc9fefc8 -newDarkWizard 14/15 ab387f28b547e202 -newDarkWizard 14/150 e6b4b339d04247c0 -newDarkWizard 14/151 7510cf703e66712e -newDarkWizard 14/152 155f318e01dad5f0 -newDarkWizard 14/153 9d4862e45a74833e -newDarkWizard 14/154 a9b6ef18c2afc9c6 -newDarkWizard 14/155 f9e4444159e75a2e -newDarkWizard 14/156 7a6cda891129b010 -newDarkWizard 14/157 3fb1ffd22e888b3e -newDarkWizard 14/158 229311298fae2a42 -newDarkWizard 14/159 ee8e9aaa6b3babd8 -newDarkWizard 14/16 ce229b533ae4bd4b -newDarkWizard 14/160 5a85b125877d008f -newDarkWizard 14/161 b44c89750548663b -newDarkWizard 14/162 58f377e876396e1c -newDarkWizard 14/163 a0f632ba6b3d9f7e -newDarkWizard 14/169 a6ca3ff2575edf4c -newDarkWizard 14/17 51159d6bfa7feb2f -newDarkWizard 14/18 58a5b1bc8536d5df -newDarkWizard 14/19 5abcf5fb6f315713 -newDarkWizard 14/2 eeb211d1379f6c16 -newDarkWizard 14/20 df236554553bba10 -newDarkWizard 14/21 3bbee8b156d06c0a -newDarkWizard 14/22 94a05994e85d6f53 -newDarkWizard 14/23 ad12f0c0f693a513 -newDarkWizard 14/24 b23b47f368f67c85 -newDarkWizard 14/25 f562ca9e1c6731c9 -newDarkWizard 14/26 ff17b985762a7ee1 -newDarkWizard 14/28 3816b3c3151ddcaf -newDarkWizard 14/29 47a7c25ce1419b0a -newDarkWizard 14/3 3cff0a08000afffa -newDarkWizard 14/31 9340beff073510ff -newDarkWizard 14/32 146f74d2699c0b1e -newDarkWizard 14/33 69de55154055e43c -newDarkWizard 14/34 07305c9bf70f401a -newDarkWizard 14/35 b5eb1f274a82a63c -newDarkWizard 14/36 6cd8abc51ce28e70 -newDarkWizard 14/37 53daf732efa5d3b4 -newDarkWizard 14/38 c536b8c065a80a1a -newDarkWizard 14/39 f6865c35a83b3102 -newDarkWizard 14/4 ab52a4478c779ab4 -newDarkWizard 14/40 018e7b36ede18436 -newDarkWizard 14/41 68bf89f736244cbd -newDarkWizard 14/42 cf6815a2c75d224d -newDarkWizard 14/43 dd42df8ce0572869 -newDarkWizard 14/44 075d4b9a23dd3a91 -newDarkWizard 14/45 f50712e7a7f77db0 -newDarkWizard 14/46 bd5902a9be4a2c72 -newDarkWizard 14/47 c1e99cc95e59d7a6 -newDarkWizard 14/48 dcf7ff67c45ae822 -newDarkWizard 14/49 98b79380fb8e08a0 -newDarkWizard 14/5 fcea0805f5c7e43c -newDarkWizard 14/50 23c3f4154872ccf6 -newDarkWizard 14/51 dfd7ce9347260fa2 -newDarkWizard 14/52 93520479f9d19880 -newDarkWizard 14/53 2437ce96b25c5dbe -newDarkWizard 14/54 74767a136a1b51fa -newDarkWizard 14/55 6e4c2f7db15c5eea -newDarkWizard 14/56 de970b19c22c0b26 -newDarkWizard 14/57 4ba6da29544b6d30 -newDarkWizard 14/58 cc75ba78c5694f0c -newDarkWizard 14/59 6984cf991a427228 -newDarkWizard 14/6 674bd9ae9fca907c -newDarkWizard 14/60 f4500b3cc56e2e40 -newDarkWizard 14/61 4de047be88cf20b4 -newDarkWizard 14/62 aee6887d4be78e38 -newDarkWizard 14/63 667108b84a5e0ffa -newDarkWizard 14/64 cef48af4cea32e28 -newDarkWizard 14/65 ad6dbbd07db80eeb -newDarkWizard 14/66 c8feeb824f31baa3 -newDarkWizard 14/67 927f15c1b7e83087 -newDarkWizard 14/68 b1c69212a16b171f -newDarkWizard 14/7 039598128c7c9ed8 -newDarkWizard 14/70 f86a12f00aecf9c4 -newDarkWizard 14/71 608e4e78ad697b5a -newDarkWizard 14/72 00820f8c320ffa84 -newDarkWizard 14/73 2014773f79be4f7a -newDarkWizard 14/74 35f36537f308fd04 -newDarkWizard 14/75 30edc867ae55716a -newDarkWizard 14/76 6cf46d427d0b6ce4 -newDarkWizard 14/77 c2d25b852f62449c -newDarkWizard 14/78 44557101289c4044 -newDarkWizard 14/79 a92bd8712a8b1380 -newDarkWizard 14/8 5c0cfbf0d458f81a -newDarkWizard 14/80 10e51b8d0855c5ba -newDarkWizard 14/81 8bb7ed476042d12c -newDarkWizard 14/82 0996217aa36221e4 -newDarkWizard 14/83 7637173f079e0d0e -newDarkWizard 14/84 6ba995b38186b8dc -newDarkWizard 14/85 f2b5d6dce3719f26 -newDarkWizard 14/86 f5684fd70b73213c -newDarkWizard 14/87 e8bda57c2596735a -newDarkWizard 14/88 e0241534f08156be -newDarkWizard 14/89 b830a3b512c1534a -newDarkWizard 14/9 ecac69950cd86b70 -newDarkWizard 14/90 a1a9f9c50144c944 -newDarkWizard 14/91 7108cdd868387876 -newDarkWizard 14/92 bed7d9ab12b4968c -newDarkWizard 14/93 cd7af60c7c4679c4 -newDarkWizard 14/94 22fefb1513fb52f4 -newDarkWizard 14/95 be81c1e0e2b8c31e -newDarkWizard 14/96 4363d11572afde5a -newDarkWizard 14/97 a5363676073356d2 -newDarkWizard 14/98 d6516d5ca26e54f6 -newDarkWizard 14/99 bbfa7ffdae0a107e -newDarkWizard 15/0 f1418f6a4313ad4e -newDarkWizard 15/1 aca2186fc1e1e6e6 -newDarkWizard 15/10 af2fdaa6561810de -newDarkWizard 15/11 ffdd9d0c82d14f46 -newDarkWizard 15/12 4b801575c8a3f88a -newDarkWizard 15/13 12ff12d19ff04300 -newDarkWizard 15/14 e7aee4c0c6e60fd8 -newDarkWizard 15/15 4c32aa9128cf10d6 -newDarkWizard 15/16 ddc7ecddfa51e774 -newDarkWizard 15/17 6ff685bbc1e1b5dc -newDarkWizard 15/18 4966a659ab30c612 -newDarkWizard 15/19 821ee4a59d54b20e -newDarkWizard 15/2 c990c0dc466b311e -newDarkWizard 15/20 2ae329abd0332f1e -newDarkWizard 15/21 07ef4c646e4ebcde -newDarkWizard 15/22 8b31af62518b216a -newDarkWizard 15/23 d85f7b66c9dfc62e -newDarkWizard 15/24 e0b097fec630841a -newDarkWizard 15/26 5e0f82b5470a2f86 -newDarkWizard 15/27 d8f02601409644fa -newDarkWizard 15/28 b61ec17f96e51d3a -newDarkWizard 15/29 ab3359d03069bf80 -newDarkWizard 15/3 3db52b1b2f1b6dd2 -newDarkWizard 15/30 1c5114ec982ba000 -newDarkWizard 15/31 23aaf2489498ef74 -newDarkWizard 15/32 4c095de224dc05c8 -newDarkWizard 15/33 d7036947bcb198cf -newDarkWizard 15/34 46dc5be1c05b0b8e -newDarkWizard 15/35 f0e4969813e83fa9 -newDarkWizard 15/36 cac127593bd9105b -newDarkWizard 15/4 a47b218c40414080 -newDarkWizard 15/5 063556cfb11f9026 -newDarkWizard 15/6 3d8435367790a52a -newDarkWizard 15/7 d252dba7843db068 -newDarkWizard 15/8 d36be331bc0567d4 -newDarkWizard 15/9 86e37337b18f5306 -newDarkWizard 2/0 919526afa89053d2 -newDarkWizard 2/1 bb98062a7dd3a72a -newDarkWizard 2/10 adfeda6aeefda02d -newDarkWizard 2/11 6a50d71a0f4d6c84 -newDarkWizard 2/12 a483e8f6516892c7 -newDarkWizard 2/13 5c46df9421b8cdf3 -newDarkWizard 2/14 da2a6e8facbff72b -newDarkWizard 2/15 eba17ad2b3e978bb -newDarkWizard 2/16 75f45ec1126b4e3c -newDarkWizard 2/17 f8ee019812dee097 -newDarkWizard 2/18 3109851c0f86c227 -newDarkWizard 2/2 899b29b6a85e922d -newDarkWizard 2/3 c6c86bff8dc57025 -newDarkWizard 2/4 ea23fac63fc8aee2 -newDarkWizard 2/5 879bfea7c594e382 -newDarkWizard 2/6 1beb2249e522e87e -newDarkWizard 2/7 ec3e9aa15ebbdc1d -newDarkWizard 2/8 8f6c83f62ca2ddfc -newDarkWizard 2/9 1e9e61c13aa36e09 -newDarkWizard 3/0 8eeb4d307a71a2a2 -newDarkWizard 3/1 1dd184fe2d505dea -newDarkWizard 3/10 14eb448c0761c40c -newDarkWizard 3/11 ce658717a2a24bde -newDarkWizard 3/2 aad98fdb59ce5e14 -newDarkWizard 3/3 27576a09c4e4e558 -newDarkWizard 3/4 27ec9e23a43e33ef -newDarkWizard 3/5 9ce52eabfe8a9ac9 -newDarkWizard 3/6 fabc646cf4defb56 -newDarkWizard 3/7 72facc5483e32250 -newDarkWizard 3/8 5e18e78498a01b85 -newDarkWizard 3/9 875c3fb1ef88be09 -newDarkWizard 4/0 15c5f09d55746856 -newDarkWizard 4/1 1c9b20cd8373f2e1 -newDarkWizard 4/10 268f0b82be513ac2 -newDarkWizard 4/11 a27c99b18de38c0e -newDarkWizard 4/12 eb6b04a70788cd57 -newDarkWizard 4/13 e204bed1cae07734 -newDarkWizard 4/14 1450fc0599cd5d4d -newDarkWizard 4/15 f696918a59130364 -newDarkWizard 4/16 c1e3b0a4ebb5a438 -newDarkWizard 4/17 ad109cfa60f3e647 -newDarkWizard 4/18 a2f7ebe347d99f03 -newDarkWizard 4/19 277df3ef379460d4 -newDarkWizard 4/2 1809a78321479b14 -newDarkWizard 4/20 1717e4232753a755 -newDarkWizard 4/21 41fc9a69a6c66a96 -newDarkWizard 4/22 b3d83168b22cb1bc -newDarkWizard 4/23 8553e366a93fa48d -newDarkWizard 4/24 ac549875f25cef75 -newDarkWizard 4/3 a400418061aa26ba -newDarkWizard 4/4 5bb3acf3d992ffd9 -newDarkWizard 4/5 7a75088cb86bcce4 -newDarkWizard 4/6 5767784223b00c06 -newDarkWizard 4/7 8ce75cf255a438c4 -newDarkWizard 4/8 29984a7d3e77380b -newDarkWizard 4/9 20d7131e73adc4c9 -newDarkWizard 5/0 34fae570c149e2ca -newDarkWizard 5/1 f5e6f21c6cc611f6 -newDarkWizard 5/10 99e38397d0937632 -newDarkWizard 5/11 92278ac3bd192e34 -newDarkWizard 5/12 750c3d104c851d7b -newDarkWizard 5/13 6edbff6e61ee7aeb -newDarkWizard 5/14 140497494cf45567 -newDarkWizard 5/15 63ed63ef870314e4 -newDarkWizard 5/16 68c20d40411a4437 -newDarkWizard 5/17 cbdec420d13ef893 -newDarkWizard 5/18 a148197f10123ef0 -newDarkWizard 5/19 7f6646a3eacb520d -newDarkWizard 5/2 7e59ecaf0c0c7538 -newDarkWizard 5/20 f1ff6606d84dc729 -newDarkWizard 5/21 ff141215065fd780 -newDarkWizard 5/22 c215247bc504490b -newDarkWizard 5/23 d0a493db10e716d1 -newDarkWizard 5/3 18bb0d386fcdeb5d -newDarkWizard 5/30 92b800466e39bfa8 -newDarkWizard 5/31 bcd37d1b7b908aee -newDarkWizard 5/33 b92d66ee28b3bbf4 -newDarkWizard 5/34 b05936f235b077da -newDarkWizard 5/36 fc2f79529e216ce9 -newDarkWizard 5/4 1b2f0c2dfd28951c -newDarkWizard 5/5 4169d6edb6e8d681 -newDarkWizard 5/6 33a814f5d1f692e3 -newDarkWizard 5/7 34d5ea9683a545d4 -newDarkWizard 5/8 563437a063280910 -newDarkWizard 5/9 1c2fe9c996c9f120 -newDarkWizard 6/0 d714c5915a82dce1 -newDarkWizard 6/1 2ca21e7104e7584d -newDarkWizard 6/10 4cd6f9d2e081af0f -newDarkWizard 6/11 063f802698f917d2 -newDarkWizard 6/12 32f8463ab5cf906a -newDarkWizard 6/13 2d850ad6657198d0 -newDarkWizard 6/14 1802e6ef98e21518 -newDarkWizard 6/15 13d9bb97bc681e98 -newDarkWizard 6/16 14b64fad5ba68138 -newDarkWizard 6/17 815a4df393a2bfdd -newDarkWizard 6/18 c891b2fece954db7 -newDarkWizard 6/19 0a8f7e245c3df6d0 -newDarkWizard 6/2 2118329cf3a8e00b -newDarkWizard 6/20 d2089b65a1b972d5 -newDarkWizard 6/21 447bc61540ccefc4 -newDarkWizard 6/3 a7b74fd58fc123a1 -newDarkWizard 6/4 03053626823b62fa -newDarkWizard 6/5 d1e03dc917195de9 -newDarkWizard 6/6 1ac72d70efbe4b7e -newDarkWizard 6/7 254d155e1139f356 -newDarkWizard 6/8 b2d2c64d6ca4452b -newDarkWizard 6/9 99d6e3ef8818a5a3 -newDarkWizard 7/0 8f18bc2aaea8e9e4 -newDarkWizard 7/1 0b284613397e7e45 -newDarkWizard 7/10 30bc4ad4ae0cc599 -newDarkWizard 7/11 08552d8b840c0a92 -newDarkWizard 7/12 a44d9a971356bdd2 -newDarkWizard 7/13 54af98323740f8f6 -newDarkWizard 7/14 acd6384acbb0f591 -newDarkWizard 7/16 2675f15db9cf3453 -newDarkWizard 7/17 4ebc1bbbec2ccf0c -newDarkWizard 7/18 edd42de024b7aee6 -newDarkWizard 7/19 5f2c4be6b475fd91 -newDarkWizard 7/2 503f803beb972f2d -newDarkWizard 7/21 c4137d09a11b19ba -newDarkWizard 7/22 f973fe72f51ad1b1 -newDarkWizard 7/24 905f253b4a918388 -newDarkWizard 7/25 144d6dd1314e47bf -newDarkWizard 7/26 35b5700d231e0dbb -newDarkWizard 7/27 cd41d5de2cf8acb6 -newDarkWizard 7/28 b57fe835fd9c88d9 -newDarkWizard 7/29 92b6edb2dd621e82 -newDarkWizard 7/3 e0bcdeee67082c0c -newDarkWizard 7/30 80047bd3f2ae3a4b -newDarkWizard 7/31 2b5ae99b75f751c9 -newDarkWizard 7/33 f37e746a67b25a45 -newDarkWizard 7/34 fe8141520d03e29a -newDarkWizard 7/35 226db4372cce47c4 -newDarkWizard 7/36 2f410e9bb9c7e440 -newDarkWizard 7/38 b33ff48173b622b0 -newDarkWizard 7/39 8d46d70ca132e2d5 -newDarkWizard 7/4 a73e0f3cb88524aa -newDarkWizard 7/40 2ef17a4dcd986844 -newDarkWizard 7/41 eecfedd5b4e0c04b -newDarkWizard 7/42 3de304a6d90d3f48 -newDarkWizard 7/43 555d50d7b37fef3e -newDarkWizard 7/44 a3f311ff360b2103 -newDarkWizard 7/45 d19fd52b5bcd6a08 -newDarkWizard 7/46 f75c621819373bd2 -newDarkWizard 7/49 b4dac35a3002a203 -newDarkWizard 7/5 0fdd444e5e7a0bdf -newDarkWizard 7/50 d1b4a521a1d2ea05 -newDarkWizard 7/51 e652801530d18f53 -newDarkWizard 7/52 f919d44d3d722a0f -newDarkWizard 7/59 d1a015807a5718fe -newDarkWizard 7/6 831dd8115d3cde9e -newDarkWizard 7/60 74a68c4b1d1f3566 -newDarkWizard 7/61 5c188ec5a91a75be -newDarkWizard 7/62 357ee6864b824535 -newDarkWizard 7/63 75a563858fdcf71d -newDarkWizard 7/64 5b7861a448384d09 -newDarkWizard 7/65 fd61f57940319acb -newDarkWizard 7/66 d05eac54df55e8b9 -newDarkWizard 7/67 a83f10105546dab1 -newDarkWizard 7/68 454d2b6068fc1c88 -newDarkWizard 7/69 f7fea86f6b153f6b -newDarkWizard 7/7 870b2ed70120174a -newDarkWizard 7/70 105cc5968d376bb6 -newDarkWizard 7/72 592fba0ba02d4670 -newDarkWizard 7/73 966dd339c8cf2283 -newDarkWizard 7/8 bf15fcab14efee2e -newDarkWizard 7/9 98689e4a149634f0 -newDarkWizard 8/0 c5975c22ce678dd5 -newDarkWizard 8/1 9cb07f1600345267 -newDarkWizard 8/10 223639adc5008c4a -newDarkWizard 8/11 1ac84146c33db513 -newDarkWizard 8/12 c54c34cdded97b8c -newDarkWizard 8/13 5abfa4bf98f03363 -newDarkWizard 8/14 cb06c24d626801f0 -newDarkWizard 8/15 e9039752e36d0521 -newDarkWizard 8/16 af66b3abfa4fc408 -newDarkWizard 8/17 ed86bd07dbb316dc -newDarkWizard 8/18 82378a9f87549aff -newDarkWizard 8/19 15544889d3cbc35f -newDarkWizard 8/2 1cedf605e9b0ac61 -newDarkWizard 8/20 f7f1eaf62428492d -newDarkWizard 8/21 3921f9a0aa89c5f1 -newDarkWizard 8/22 4e68fb7298a668d4 -newDarkWizard 8/23 5c0d41c54964c2fb -newDarkWizard 8/24 cbb24121f9bbe9f2 -newDarkWizard 8/25 83128f943d01ad32 -newDarkWizard 8/26 fe357a05b0cb8328 -newDarkWizard 8/27 b88d72626a3857dd -newDarkWizard 8/28 63ed4de3a8a7e6e6 -newDarkWizard 8/29 87b84499ba561125 -newDarkWizard 8/3 e47f55db7925f69c -newDarkWizard 8/30 bdafb81f009a45eb -newDarkWizard 8/31 3bd4ffef906e2bfe -newDarkWizard 8/32 2e6efb0df32c3086 -newDarkWizard 8/33 ebae5a319071ca09 -newDarkWizard 8/34 7e972339c0e317bf -newDarkWizard 8/35 f36fa3c84663306c -newDarkWizard 8/36 4a74c858347418ef -newDarkWizard 8/37 5d0a14a7cec8699e -newDarkWizard 8/38 05d73d3bc50a2fe5 -newDarkWizard 8/39 46c3d1312b64208d -newDarkWizard 8/4 9c732b4c6726c36d -newDarkWizard 8/40 6e405aa95faed138 -newDarkWizard 8/41 b5f5521cbefee9a8 -newDarkWizard 8/42 50c5ca3048bf9271 -newDarkWizard 8/43 949a2ba5ccceb9ec -newDarkWizard 8/44 7cb41b0fa1ceabbf -newDarkWizard 8/45 c913bb9082a9926d -newDarkWizard 8/46 c5e901053cdecf75 -newDarkWizard 8/47 dfb3af5f0234cc79 -newDarkWizard 8/48 34e51601d88fc33c -newDarkWizard 8/49 ee8b9792092315a5 -newDarkWizard 8/5 da32967530ccbf50 -newDarkWizard 8/50 65ce2480c4038d1a -newDarkWizard 8/51 676f876a465ec3c6 -newDarkWizard 8/52 0096171df61243f5 -newDarkWizard 8/59 992e8ccda067914e -newDarkWizard 8/6 f0ae8272cd6d691a -newDarkWizard 8/60 1b6ae012c322095b -newDarkWizard 8/61 aa3a77e780ef012b -newDarkWizard 8/62 7d551c27865b19ca -newDarkWizard 8/63 9b6d4a07f0b9c09c -newDarkWizard 8/64 7ac14da492297cc5 -newDarkWizard 8/65 26623bc589dcf363 -newDarkWizard 8/66 b6765b60b867f761 -newDarkWizard 8/67 21455cf8c04abfde -newDarkWizard 8/68 b6bb47c997aa1d79 -newDarkWizard 8/69 e93bca2e1e5c8685 -newDarkWizard 8/7 6decd8a233aefbd9 -newDarkWizard 8/70 5815759cf4c98761 -newDarkWizard 8/71 3abeb5291d58daae -newDarkWizard 8/72 6b6c066c0f68d56b -newDarkWizard 8/73 6f6dc43a07b53b11 -newDarkWizard 8/8 068b4e436e3e2a7b -newDarkWizard 8/9 62e4b2d64c9e636c -newDarkWizard 9/0 41897e03cc562e8b -newDarkWizard 9/1 4a4354f86267234a -newDarkWizard 9/10 8fb46d8c4f083ded -newDarkWizard 9/11 9dd68cddcfc3a7b6 -newDarkWizard 9/12 7345f055f0a883b0 -newDarkWizard 9/13 6e3dbf51681362cd -newDarkWizard 9/14 8446804bc7f30c70 -newDarkWizard 9/15 35844d9d5fb8cf57 -newDarkWizard 9/16 e5a616fe5bb66717 -newDarkWizard 9/17 787433f05eb91633 -newDarkWizard 9/18 582e81834a980fdf -newDarkWizard 9/19 0c74fbd6e78de3b1 -newDarkWizard 9/2 41d294fa4c2f1a74 -newDarkWizard 9/20 a5d5e7307c0ccd85 -newDarkWizard 9/21 cf09f0c72e0e0b54 -newDarkWizard 9/22 3c00500da6deb1f5 -newDarkWizard 9/23 37e53bba0f6caef9 -newDarkWizard 9/24 801122318214369f -newDarkWizard 9/25 6df535fc79e5b2ac -newDarkWizard 9/26 f3c8fc44c55fabc9 -newDarkWizard 9/27 8a3dd6522d36448c -newDarkWizard 9/28 b90521ecd88ff1f6 -newDarkWizard 9/29 94ec378818d5f4b9 -newDarkWizard 9/3 95dc0dca6324a18f -newDarkWizard 9/30 62283247af40b45b -newDarkWizard 9/31 6184459b620cd39a -newDarkWizard 9/32 4c967b4b36c52869 -newDarkWizard 9/33 e60c8deb80e7f365 -newDarkWizard 9/34 998ee6daeeaaa4dd -newDarkWizard 9/35 dda0dc99cdf0f3f6 -newDarkWizard 9/36 92871606f2af83d5 -newDarkWizard 9/37 78c4ce6932062b5a -newDarkWizard 9/38 967504ea416fdc6b -newDarkWizard 9/39 ab0946542c603d97 -newDarkWizard 9/4 291e6b00842f92fe -newDarkWizard 9/40 4480185eea98009e -newDarkWizard 9/41 20402ff9b6bb7b83 -newDarkWizard 9/42 8586734211211598 -newDarkWizard 9/43 7a4c7c57df5fbb64 -newDarkWizard 9/44 b0798a840c4678a0 -newDarkWizard 9/45 5c0d925d5e6bc868 -newDarkWizard 9/46 7e9a3de5ce9cebcb -newDarkWizard 9/47 7521973a98bc2241 -newDarkWizard 9/48 169c8733a5c14769 -newDarkWizard 9/49 dbae413e98a1d6eb -newDarkWizard 9/5 3be6edf452efff29 -newDarkWizard 9/50 165905a25ed28d3e -newDarkWizard 9/51 65dd93271a522ad7 -newDarkWizard 9/52 68ea4d96baca5c6d -newDarkWizard 9/59 1faa139e63be1c21 -newDarkWizard 9/6 2eef6c4362423257 -newDarkWizard 9/60 40d8cdcde171ae5a -newDarkWizard 9/61 63700216cb40aade -newDarkWizard 9/62 c1a5c7af06f2d409 -newDarkWizard 9/63 879d437f886acbac -newDarkWizard 9/64 c444cbb63949a7d9 -newDarkWizard 9/65 460a12bd0860f9b6 -newDarkWizard 9/66 51e18b85b34b17ed -newDarkWizard 9/67 da755da63c4a18e5 -newDarkWizard 9/68 d73ad4369d184d18 -newDarkWizard 9/69 e7e9834844987390 -newDarkWizard 9/7 788e2a14e8d7b6b3 -newDarkWizard 9/70 80e6d947b58c3694 -newDarkWizard 9/71 96fcb4baafe8b530 -newDarkWizard 9/72 62d2421c2ca04308 -newDarkWizard 9/73 443024e25c2c62e3 -newDarkWizard 9/8 86cec1ce94101197 -newDarkWizard 9/9 f09886972b8da6c1 +bladeMaster 0/0 c66afc623f25fb6e +bladeMaster 0/1 cfb6515046a74110 +bladeMaster 0/10 508c4aeefc187980 +bladeMaster 0/11 b73d818c5408c499 +bladeMaster 0/12 77c14afb23544df3 +bladeMaster 0/13 70d2b6014d0257ca +bladeMaster 0/14 e4cba606d95bebba +bladeMaster 0/15 784f2e08c8598a8f +bladeMaster 0/16 244b88bcff8cac15 +bladeMaster 0/17 c1dcb7c86f762daa +bladeMaster 0/18 d7d203184d1531b3 +bladeMaster 0/19 6e16ac221fecf119 +bladeMaster 0/2 78b1e862ba603b5e +bladeMaster 0/20 f6ea31351c6311d9 +bladeMaster 0/21 64ae9f8661b84ebd +bladeMaster 0/22 eb08bdd0a48f0ab0 +bladeMaster 0/23 b3a6ff94e34b8d40 +bladeMaster 0/24 4d02759508076c5e +bladeMaster 0/25 e93f7f7866163bc9 +bladeMaster 0/26 b5d4bdd4c0257b3b +bladeMaster 0/27 4a37f5f091a30904 +bladeMaster 0/28 fe8cdcd72e67a887 +bladeMaster 0/3 ce48047dfabdbc90 +bladeMaster 0/31 f9c441613537fbd3 +bladeMaster 0/32 079534bb64bd5a89 +bladeMaster 0/33 918b92275f46e933 +bladeMaster 0/34 f436f3dcb7863983 +bladeMaster 0/35 d18a7c7b095eeac2 +bladeMaster 0/4 de26745239a7599f +bladeMaster 0/5 5209da8853ccfd8d +bladeMaster 0/6 c166dfb4d933f351 +bladeMaster 0/7 619c750aa942bca7 +bladeMaster 0/8 eabdbceed036b9c3 +bladeMaster 0/9 15e062f8a8482a00 +bladeMaster 1/0 ac68500f4f7abcf8 +bladeMaster 1/1 fdbd7329a7e61df2 +bladeMaster 1/2 3f90d7d965b4d7e4 +bladeMaster 1/3 a72b65f061aa1be0 +bladeMaster 1/4 4c84727493646a3d +bladeMaster 1/5 52940409761a9f76 +bladeMaster 1/6 040be442b0bb7964 +bladeMaster 1/7 358b7098546d803e +bladeMaster 1/8 ad2d086282fc2325 +bladeMaster 10/0 c9a642db9140e956 +bladeMaster 10/1 c65666c6d55d41fa +bladeMaster 10/10 822a9840f8fb3cc0 +bladeMaster 10/11 4c823683dfc189c7 +bladeMaster 10/12 98ac02b70ab2bcca +bladeMaster 10/13 ec1abf451a084af7 +bladeMaster 10/14 a3586995074ca258 +bladeMaster 10/15 202eefc7335a59ff +bladeMaster 10/16 e79f22566418039f +bladeMaster 10/17 54e9f9737a8a4b08 +bladeMaster 10/18 6f5b94e092ef0933 +bladeMaster 10/19 be70001232656943 +bladeMaster 10/2 f3cfd61f427d5749 +bladeMaster 10/20 4650c3cd3ef719a2 +bladeMaster 10/21 75804b9d47d4f30b +bladeMaster 10/22 330907e92192bac2 +bladeMaster 10/23 e4fd58654ffb9b0f +bladeMaster 10/24 eca87402c8a597eb +bladeMaster 10/25 2d4daba6197a5a31 +bladeMaster 10/26 43b09fedbb7e861e +bladeMaster 10/27 eb75301be001f358 +bladeMaster 10/28 89e94aecd31479d3 +bladeMaster 10/29 e633946468c57679 +bladeMaster 10/3 f74f899fae9ed405 +bladeMaster 10/30 e4d0f15e5064e521 +bladeMaster 10/31 6570e61d156ff6aa +bladeMaster 10/32 3b8721023f7c53bc +bladeMaster 10/33 8fda41ca31469618 +bladeMaster 10/34 684327ba26b6bcfd +bladeMaster 10/35 dfd13424f6390dde +bladeMaster 10/36 02856d7994447290 +bladeMaster 10/37 57802a1294d7cf28 +bladeMaster 10/38 e94c6128cb6bdf8b +bladeMaster 10/39 076f891d4a73b626 +bladeMaster 10/4 36912e51c5299c3f +bladeMaster 10/40 b16fcb1f8ec6543b +bladeMaster 10/41 495355b5ce89ac30 +bladeMaster 10/42 d5388df059a5f4c4 +bladeMaster 10/43 79f111175c12ece0 +bladeMaster 10/44 7fd937070d65e0d1 +bladeMaster 10/45 ccf41a5b04fd66a3 +bladeMaster 10/46 dfcf5f0ec2ac6b30 +bladeMaster 10/47 1de03c415fb5a37f +bladeMaster 10/48 add14c634beffee1 +bladeMaster 10/49 7e55b2449856a54b +bladeMaster 10/5 8b0145233d5e3d61 +bladeMaster 10/50 930581b6e5cdc055 +bladeMaster 10/51 11d560ded799be22 +bladeMaster 10/52 045c13976196f20a +bladeMaster 10/6 02706a2d047d6285 +bladeMaster 10/62 eb35fe638dafdb01 +bladeMaster 10/63 3626f9615960865b +bladeMaster 10/64 26eaf352b6c4de5b +bladeMaster 10/65 35c65f2fb1e9664b +bladeMaster 10/66 dbba8e6d2f503650 +bladeMaster 10/67 1c8890b79c40b4b9 +bladeMaster 10/68 d1ed34c7fa2d5fa3 +bladeMaster 10/69 1be1227ffafac124 +bladeMaster 10/7 869f0b2b613f6909 +bladeMaster 10/70 3ee8bddf015af201 +bladeMaster 10/71 2b5e1181a03efc61 +bladeMaster 10/8 c84f67f4844934f3 +bladeMaster 10/9 e1f616ccdbdcf491 +bladeMaster 11/0 6a33798727df042e +bladeMaster 11/1 650e019491596569 +bladeMaster 11/10 f38e5fb23b0d0aad +bladeMaster 11/11 4a8d08bf55166770 +bladeMaster 11/12 7f821e7b6e35316f +bladeMaster 11/13 2b2aa27b425115d1 +bladeMaster 11/14 9778c5685449a188 +bladeMaster 11/15 5bb4c4eab66ea6f7 +bladeMaster 11/16 5e91fc15c35a466d +bladeMaster 11/17 779ae23a76cedf2b +bladeMaster 11/18 eb52dd0ace351bbb +bladeMaster 11/19 66e853aed9b05fd1 +bladeMaster 11/2 351bcb01d5ff7dc7 +bladeMaster 11/20 2d18f4b2f1f86f18 +bladeMaster 11/21 f82fbc5697ccbe0e +bladeMaster 11/22 e4e857d3fd95200c +bladeMaster 11/23 5b23dd547050fe7e +bladeMaster 11/24 e73289b9f455b6b2 +bladeMaster 11/25 98099d9bdb39f147 +bladeMaster 11/26 da29bb729b6ea018 +bladeMaster 11/27 78e57a6d74df5469 +bladeMaster 11/28 92393316536fe094 +bladeMaster 11/29 7a8dd8225a7fb28c +bladeMaster 11/3 ca63803812f369be +bladeMaster 11/30 d624f3d59917f7a0 +bladeMaster 11/31 02cc384fc6387994 +bladeMaster 11/32 29fd9769b40b02d8 +bladeMaster 11/33 8a317aa85198a3b2 +bladeMaster 11/34 56615923dc6524b0 +bladeMaster 11/35 1f4645e0ed0caf27 +bladeMaster 11/36 6cfe0746b9704208 +bladeMaster 11/37 766d1ae83b1d4e08 +bladeMaster 11/38 ff768dfb3f77eaa5 +bladeMaster 11/39 e2331136bb4ae977 +bladeMaster 11/4 4dbc7f898a0b08cf +bladeMaster 11/40 dd8be159f37a4332 +bladeMaster 11/41 022b2114cf808fda +bladeMaster 11/42 6aa1a55b64ad56e5 +bladeMaster 11/43 fb2add802fad733c +bladeMaster 11/44 216ecc318cbf8a2f +bladeMaster 11/45 e6e402b418e68792 +bladeMaster 11/46 abe8b8841d90b463 +bladeMaster 11/47 a39055f516c43df4 +bladeMaster 11/48 66945bc91a880f57 +bladeMaster 11/49 62c5c77aaf6a3b5b +bladeMaster 11/5 6eb9b23255fa5a8b +bladeMaster 11/50 d0e3bf2f1a695ff0 +bladeMaster 11/51 402809399e174077 +bladeMaster 11/52 15a20d160757396a +bladeMaster 11/59 06a8a51fdafa95b5 +bladeMaster 11/6 338311b2961d992a +bladeMaster 11/60 1d3393ca313a9f79 +bladeMaster 11/61 8e8e252beabf79cb +bladeMaster 11/62 0e52d6f9c69de551 +bladeMaster 11/63 89374c72922e6e1f +bladeMaster 11/64 320d9c71a80dfb6a +bladeMaster 11/65 4f45923e564861c4 +bladeMaster 11/66 eb0f636b079bb096 +bladeMaster 11/67 e9f1b9cca5f67fa3 +bladeMaster 11/68 87e807bcc5e4f242 +bladeMaster 11/69 c932b3c0bfbafc23 +bladeMaster 11/7 d9eccb30e4f34bf0 +bladeMaster 11/70 56479b12a4c7db9d +bladeMaster 11/71 3927b33fe8fcbaa5 +bladeMaster 11/72 dac2088ddd5737c3 +bladeMaster 11/73 eddcf8c463e5748d +bladeMaster 11/8 8dfde27dd4c51778 +bladeMaster 11/9 f700fd68e7c76cbf +bladeMaster 12/0 8edc292b5b4194e8 +bladeMaster 12/1 6cace1b58688db60 +bladeMaster 12/10 719850b38e8b1788 +bladeMaster 12/100 b3e98f2c9c545699 +bladeMaster 12/101 b62a10942cb65a35 +bladeMaster 12/102 1ce5fa5f6514c3c0 +bladeMaster 12/103 8d22b303177919e8 +bladeMaster 12/104 28f5ac64917bd204 +bladeMaster 12/105 ba3ead8c8b3c48a0 +bladeMaster 12/106 3e25a5d904e496d2 +bladeMaster 12/107 55170f7f895233f8 +bladeMaster 12/108 e66ae20426adc18a +bladeMaster 12/109 efb7331191a62aa1 +bladeMaster 12/11 e8130735d0cfc175 +bladeMaster 12/110 f9cb0b5cf573a34e +bladeMaster 12/111 e9183aec3d4d4e90 +bladeMaster 12/112 e6a782a585e0d81d +bladeMaster 12/113 1004f1fc067a4046 +bladeMaster 12/114 0aea4bea44ff1d36 +bladeMaster 12/115 e07b13c674710ea2 +bladeMaster 12/116 be94d6102ff0fd6b +bladeMaster 12/117 ef7c8c6034882a1a +bladeMaster 12/118 6ef57b16fa193efb +bladeMaster 12/119 a4f8944c95ab94e3 +bladeMaster 12/12 c6f44cdbd633c906 +bladeMaster 12/120 6195fc48c9c3ce0e +bladeMaster 12/121 84137fd517c0771a +bladeMaster 12/122 eca684a8bc0d863b +bladeMaster 12/123 fd2c3e65beb8ca02 +bladeMaster 12/124 ee88a6837303e1ef +bladeMaster 12/125 81db3a30e1b44e06 +bladeMaster 12/126 bafadcf8e278e89f +bladeMaster 12/127 16ad09f1c05a13a3 +bladeMaster 12/128 bcf2f1dda7d056ed +bladeMaster 12/129 00971f39b84b94dc +bladeMaster 12/13 dc8dbe53af7fc720 +bladeMaster 12/130 f09df24897432af2 +bladeMaster 12/131 81f4a4b8beb19e11 +bladeMaster 12/132 ec1f5a3ae4aa224f +bladeMaster 12/133 7364bec808cd19d1 +bladeMaster 12/134 4bfa30575d959b46 +bladeMaster 12/135 b8aab0f335106700 +bladeMaster 12/136 deed836136f8a36f +bladeMaster 12/137 26e4cfd83b53b2f9 +bladeMaster 12/138 a4770273a8e335eb +bladeMaster 12/139 44872c8b99a75c3b +bladeMaster 12/14 c3d1ad28a105ed8c +bladeMaster 12/140 15a879787bbcbf19 +bladeMaster 12/141 173d76d6c3d41d27 +bladeMaster 12/142 7e8d2372777c01b9 +bladeMaster 12/143 8d331dabc1bac6d3 +bladeMaster 12/15 bbe0e7917dd8aaa8 +bladeMaster 12/16 724ca0f9279e71ec +bladeMaster 12/17 79d013b99eaae644 +bladeMaster 12/18 ef5ee2e58be80b78 +bladeMaster 12/19 497dce7b6341e94c +bladeMaster 12/2 94ce733c777591ab +bladeMaster 12/21 79be295ed89949c6 +bladeMaster 12/22 ceb105257095b350 +bladeMaster 12/23 49fd4c9b8e9ea512 +bladeMaster 12/24 012531db9daf69a2 +bladeMaster 12/26 56b00b7c00d1fd28 +bladeMaster 12/3 2d36094a284d2eac +bladeMaster 12/30 cac9cad9b5951fb7 +bladeMaster 12/31 284c17aa996e5e0d +bladeMaster 12/32 46f67b1cc531f17b +bladeMaster 12/33 7e1e271a991930b9 +bladeMaster 12/34 b911958ef761edcd +bladeMaster 12/35 ed3f06de7196efd9 +bladeMaster 12/36 40ff5f2dbb785c6c +bladeMaster 12/37 4390a9461491c47b +bladeMaster 12/38 0e003ca1043bc3bf +bladeMaster 12/39 fda53bdedc9a9230 +bladeMaster 12/4 d5fd21629b7e45d2 +bladeMaster 12/40 89cfd6f9411d31e7 +bladeMaster 12/41 adbb5f54f6abdb18 +bladeMaster 12/42 10644bbe4646aa66 +bladeMaster 12/43 96c3fd1564e7bdaf +bladeMaster 12/44 84d81ea49253a9d4 +bladeMaster 12/45 34a1cc066787d308 +bladeMaster 12/46 96c88789c7d35004 +bladeMaster 12/47 a4d6c623bf8cc15e +bladeMaster 12/48 551d07f9581ff1ec +bladeMaster 12/49 e13c2054c1e05e83 +bladeMaster 12/5 a724e1ccfcc5d6f7 +bladeMaster 12/50 ba222614bee65177 +bladeMaster 12/6 2b3d67c035c84efc +bladeMaster 12/60 dc16ebda90571882 +bladeMaster 12/61 dfbb75ea2cddc690 +bladeMaster 12/62 b43d8f3b24526cc5 +bladeMaster 12/63 7aaaabe90740b10a +bladeMaster 12/64 86e39525c0233d4d +bladeMaster 12/65 cc960f30a80c2115 +bladeMaster 12/7 17c023b74cbb980c +bladeMaster 12/70 701ad68f7523e5db +bladeMaster 12/71 f2d1c5dd88bf6fb7 +bladeMaster 12/72 a0036bf2b5c9f901 +bladeMaster 12/8 ac801184e8faca90 +bladeMaster 12/9 46943f8c5c66c3c2 +bladeMaster 13/0 a1fed971c4872d33 +bladeMaster 13/1 d464a3b24fb13b90 +bladeMaster 13/10 2f08702e3de13710 +bladeMaster 13/103 2e29a549431c3526 +bladeMaster 13/104 9efa0dd03d7ed822 +bladeMaster 13/105 46a39d1427bc7e0e +bladeMaster 13/106 431f343dfcb2f4ec +bladeMaster 13/107 4a2a64479b1228ef +bladeMaster 13/109 c61e5b23b0eec304 +bladeMaster 13/11 d13c6459bbb64a40 +bladeMaster 13/110 39722cb662031540 +bladeMaster 13/111 837fa79b85f32d64 +bladeMaster 13/112 8775f5a1a66dbd4e +bladeMaster 13/113 bbc36515dfe130e6 +bladeMaster 13/114 f1fcf8fda34bbede +bladeMaster 13/115 4b62bbdd097e1cba +bladeMaster 13/116 f2e15b06ca0c8910 +bladeMaster 13/117 67f8b90e8b358668 +bladeMaster 13/118 0e8c88a0874a8f1a +bladeMaster 13/119 68a6074b5f86dcf8 +bladeMaster 13/12 b307cdc33ade5287 +bladeMaster 13/120 103cd2914f3ef79a +bladeMaster 13/121 992df813fed0e7a0 +bladeMaster 13/122 35971924c35cc59c +bladeMaster 13/123 19137f0ac3a7df1c +bladeMaster 13/124 9ac7f172011c19f6 +bladeMaster 13/125 a2f10043f762d614 +bladeMaster 13/126 d60487047dcdbbc6 +bladeMaster 13/127 3e7ce14410201fe2 +bladeMaster 13/128 4ab89476787d5096 +bladeMaster 13/129 6293ea2678781194 +bladeMaster 13/13 5172dd02d4838a2f +bladeMaster 13/130 afa434877766766c +bladeMaster 13/131 8b01ff51ed0964d2 +bladeMaster 13/132 9b4d447a033c6ff8 +bladeMaster 13/133 4c7b7cf5ecff27da +bladeMaster 13/134 bf7cecc2cdff11e2 +bladeMaster 13/135 eff3fb845f3233c0 +bladeMaster 13/136 65186b97705adc6c +bladeMaster 13/137 6d630b3e31aae100 +bladeMaster 13/138 ab9e2ddbf72a88fe +bladeMaster 13/139 59cd2a15e6baefb4 +bladeMaster 13/14 b3f81ee5a9f4c648 +bladeMaster 13/140 f9bc591f06433b54 +bladeMaster 13/141 a0a2ddd265a5350c +bladeMaster 13/142 0e8add9381725c70 +bladeMaster 13/143 808b265bccc50fee +bladeMaster 13/144 ea6ae6a3b9372580 +bladeMaster 13/15 ffc1beb4bff6fc3d +bladeMaster 13/16 0e793b2f56c36818 +bladeMaster 13/17 5771722e4297e152 +bladeMaster 13/18 ae372773a7f32aa0 +bladeMaster 13/19 5b53d4ea6df240fa +bladeMaster 13/2 a434844519ed6ac2 +bladeMaster 13/20 7664cc5a14b9f313 +bladeMaster 13/21 cf55a13a1f7d11b9 +bladeMaster 13/22 67b50726f487f0eb +bladeMaster 13/23 65d534436250ccd1 +bladeMaster 13/24 a590f61bfa17a4b3 +bladeMaster 13/25 e8464a571e5fa972 +bladeMaster 13/26 1984508a42126b85 +bladeMaster 13/27 d931df1eaea652a0 +bladeMaster 13/28 2be3431177670e53 +bladeMaster 13/29 5df1300966feea3e +bladeMaster 13/3 b7636b350ef51ab2 +bladeMaster 13/30 3d089e3119a7a0c2 +bladeMaster 13/31 1da2b5ed08b97d76 +bladeMaster 13/32 943ea9352304524b +bladeMaster 13/33 2b1982b2b6e88a2d +bladeMaster 13/34 4428ef56c0659e11 +bladeMaster 13/35 8964d76b11562cdd +bladeMaster 13/36 c96e488744f9009f +bladeMaster 13/37 92fe128387431eef +bladeMaster 13/38 2c05bf6358869039 +bladeMaster 13/39 d9c0d91f5f53498e +bladeMaster 13/4 a93231a25048c6ed +bladeMaster 13/40 130c034a78849fd0 +bladeMaster 13/41 8501e62553b8b296 +bladeMaster 13/42 58317cfa8406cc3b +bladeMaster 13/43 c8c0b7cf150746ce +bladeMaster 13/44 6c6d131ef71d36e6 +bladeMaster 13/45 c0faaf63b34b749c +bladeMaster 13/46 9a0d6d50410b26e0 +bladeMaster 13/47 85f907d4f58701dc +bladeMaster 13/48 8ccf5abcb50f420c +bladeMaster 13/49 21d2e28fce57b296 +bladeMaster 13/5 6e204d87a0904853 +bladeMaster 13/50 5999577e295ec696 +bladeMaster 13/51 cea4322a520f4396 +bladeMaster 13/52 b2fec3c09ed665c8 +bladeMaster 13/53 ca39bb43cc2103f2 +bladeMaster 13/54 203f1e4dcdae2364 +bladeMaster 13/55 911d375e01e17082 +bladeMaster 13/56 54f6c96237df3cd6 +bladeMaster 13/57 a1d8a4e97e864de8 +bladeMaster 13/58 9b67e33a3a80e2d6 +bladeMaster 13/59 162212b838841cd2 +bladeMaster 13/60 18eab2127715308c +bladeMaster 13/61 6317b0d6356c5972 +bladeMaster 13/62 0647de455bf41a6e +bladeMaster 13/63 15084336bae2b9de +bladeMaster 13/64 2266c19bc34eca70 +bladeMaster 13/65 a444eea947cae64a +bladeMaster 13/66 23d61a9d08b64d9c +bladeMaster 13/67 3f7380acfa637eac +bladeMaster 13/68 e16a32660a1e686a +bladeMaster 13/69 c7cc241c5e39ba18 +bladeMaster 13/7 e4b865a49e5d7e18 +bladeMaster 13/70 c56f2a9a482d7c14 +bladeMaster 13/71 0cc8df0da73ae888 +bladeMaster 13/72 d6a8e5253c646814 +bladeMaster 13/73 2c3eaab8cd2ef8aa +bladeMaster 13/74 6ed7fb85dab50aec +bladeMaster 13/75 68d83f8d90db519e +bladeMaster 13/76 4001ff3fdf728f20 +bladeMaster 13/8 79225f6d37ff34fd +bladeMaster 13/80 48d0111251b424c6 +bladeMaster 13/81 af5045acd1fdbb48 +bladeMaster 13/82 b9a945ed967df6aa +bladeMaster 13/83 5af11662c05881d4 +bladeMaster 13/84 674b0fd5517921fa +bladeMaster 13/85 538c949b979b3f30 +bladeMaster 13/86 f1743c69961b640a +bladeMaster 13/87 2a5b0386dd103ce8 +bladeMaster 13/88 bbb6fcdecca098b2 +bladeMaster 13/89 6988ca2f28aaad60 +bladeMaster 13/9 fdc75f2e592c6e73 +bladeMaster 13/90 8c515c2f1d5fb8ba +bladeMaster 13/91 a433ad9b34f0966e +bladeMaster 13/92 d22a90cfa813d354 +bladeMaster 13/93 a1ff3164a7488c18 +bladeMaster 13/94 0f70104308088426 +bladeMaster 13/95 9062522078f5ff2c +bladeMaster 13/96 d2b46c9364c44268 +bladeMaster 13/97 38ee94908f28c636 +bladeMaster 13/98 94385a23a173e28a +bladeMaster 13/99 2ca6b790b9ed0e88 +bladeMaster 14/0 7687ed5c5a0bb3cc +bladeMaster 14/1 43efe29f5a7b367c +bladeMaster 14/10 ebc17bd6838c4c1a +bladeMaster 14/100 c3c1c2018ed854d2 +bladeMaster 14/101 4aeb9ad5b9824447 +bladeMaster 14/102 c54820f6d2711b4f +bladeMaster 14/103 a1fa9d72e4ba8b35 +bladeMaster 14/104 53263af3c8182769 +bladeMaster 14/105 3d864ea4c675ac43 +bladeMaster 14/106 0fd113a915866565 +bladeMaster 14/107 864dd94b38b96937 +bladeMaster 14/108 ef8e330ec3c1a5af +bladeMaster 14/109 72badc46b1be28d9 +bladeMaster 14/11 af37be6d7fb64aea +bladeMaster 14/110 a0919415cdc1655a +bladeMaster 14/111 36eb21124772bd51 +bladeMaster 14/112 a1a651b2cfb98548 +bladeMaster 14/113 702670042271cb48 +bladeMaster 14/114 2dd1e312768bc4a0 +bladeMaster 14/115 985272396eb1f18e +bladeMaster 14/116 772aaaf5a39b83b8 +bladeMaster 14/117 5a85748f68a698c6 +bladeMaster 14/118 2320c542dbac586a +bladeMaster 14/119 526afc5288ce72de +bladeMaster 14/12 4dad4b1d2301d0bf +bladeMaster 14/120 248b1b1dd150131a +bladeMaster 14/121 b77ff345b3189f7e +bladeMaster 14/122 0a042784c14ca2b0 +bladeMaster 14/123 385f18b517e7127c +bladeMaster 14/124 9d26838c6249afd2 +bladeMaster 14/125 0991a2018c39e978 +bladeMaster 14/126 510c1f6fdbfd3042 +bladeMaster 14/127 4b0f668f3a61af88 +bladeMaster 14/128 8929e865c36d9bd8 +bladeMaster 14/129 a6da5012265e0c72 +bladeMaster 14/13 0838130c898a904a +bladeMaster 14/130 a29c550bcfff37b8 +bladeMaster 14/131 84cd4ebfa1e4a1be +bladeMaster 14/132 71c52f5e2e4cf38e +bladeMaster 14/133 21171bb1040b9486 +bladeMaster 14/134 aa24c347d7e530c2 +bladeMaster 14/135 5085d8581e5db5b2 +bladeMaster 14/136 4371a56c60158526 +bladeMaster 14/137 3fe5a1fb3f879b8e +bladeMaster 14/138 5cc28da8b1c98ea2 +bladeMaster 14/139 b0eb7780e103633a +bladeMaster 14/14 84900ac408a7a05a +bladeMaster 14/140 2d090c128ea6cf60 +bladeMaster 14/141 1ba76cf5bdd445d2 +bladeMaster 14/142 4f269794114dedac +bladeMaster 14/143 fcab1a14123edcac +bladeMaster 14/144 d600902b31f3833a +bladeMaster 14/145 d3d93c927b7a8e84 +bladeMaster 14/146 bf78d8be2dbb5178 +bladeMaster 14/147 01629755528c480c +bladeMaster 14/148 eb9bc684792188c4 +bladeMaster 14/149 728ed6c42247a870 +bladeMaster 14/15 7c12d60791a13e36 +bladeMaster 14/150 0a5e090f2c8303a2 +bladeMaster 14/151 accd2b0c434585d2 +bladeMaster 14/152 87606823d10effe4 +bladeMaster 14/153 426d307ef487c0d0 +bladeMaster 14/154 b44f8a7e3bf6c7ec +bladeMaster 14/155 cbb7cb6e0e86ea36 +bladeMaster 14/156 bebf7cf6a99941be +bladeMaster 14/157 10a943a530248f40 +bladeMaster 14/158 76ae7ca1d81ac196 +bladeMaster 14/159 3a329cf37ba03708 +bladeMaster 14/16 922aef98fa16d5d0 +bladeMaster 14/160 bb7a8542dc4d5dd6 +bladeMaster 14/161 90755485950e6310 +bladeMaster 14/162 66e291ba2aea6e0c +bladeMaster 14/163 07dc56eba635feca +bladeMaster 14/169 594beea6626ff9be +bladeMaster 14/17 29aa3fff7727a0f4 +bladeMaster 14/18 4080bb375ad7314a +bladeMaster 14/19 c6acab5d038fbb4a +bladeMaster 14/2 739d114d44fef314 +bladeMaster 14/20 91c9456c261f6630 +bladeMaster 14/21 60da8775fefa236b +bladeMaster 14/22 86e4a42b7cecc804 +bladeMaster 14/23 a649a7d8cb0e8a18 +bladeMaster 14/24 b13f2bd6248f6a3d +bladeMaster 14/25 d4e734c039a7a45b +bladeMaster 14/26 2953b98d49f69e35 +bladeMaster 14/28 c132b360871a628c +bladeMaster 14/29 a300f5a1d7e34d08 +bladeMaster 14/3 edffbafc46d4b488 +bladeMaster 14/31 b99b62b26f94b4d0 +bladeMaster 14/32 b5c4129a02ca6f76 +bladeMaster 14/33 18b5d21922609b66 +bladeMaster 14/34 8cc44a4740cf5835 +bladeMaster 14/35 17b98d102bed7bc8 +bladeMaster 14/36 4a6841647506be78 +bladeMaster 14/37 68c2b70bbcabbd5c +bladeMaster 14/38 6fba31e96ed3bfce +bladeMaster 14/39 468af4c0a4dedcd6 +bladeMaster 14/4 806e1d96a2770e1a +bladeMaster 14/40 6a1bcc71bbbc0394 +bladeMaster 14/41 5d37f80c1996f6a5 +bladeMaster 14/42 2da58f1adce2b465 +bladeMaster 14/43 e527d6ed9ab30357 +bladeMaster 14/44 8fc47fcd5c13f5d7 +bladeMaster 14/45 04092953f41e2c0d +bladeMaster 14/46 3164ae11d06f2aa3 +bladeMaster 14/47 8dd999f3b500bc01 +bladeMaster 14/48 4cacbdf84f5c084f +bladeMaster 14/49 e4497d6e86b06b91 +bladeMaster 14/5 d4e23c84af5b61b6 +bladeMaster 14/50 297dc274145243f9 +bladeMaster 14/51 eaae49a22d67ed98 +bladeMaster 14/52 82ea682b095553aa +bladeMaster 14/53 3e36219f41dd49da +bladeMaster 14/54 f7e14ec176498914 +bladeMaster 14/55 6422dc67c13905ac +bladeMaster 14/56 7457aa9af99f9b62 +bladeMaster 14/57 ccb12e55b843cfe0 +bladeMaster 14/58 2d1874c554adeab6 +bladeMaster 14/59 e420fe067568960e +bladeMaster 14/6 42cbbeef57197576 +bladeMaster 14/60 2d85beaf78e48e8c +bladeMaster 14/61 f1977d765ef163d8 +bladeMaster 14/62 bf251654df5e2888 +bladeMaster 14/63 fcab362470a76c50 +bladeMaster 14/64 6f32b9156477fbca +bladeMaster 14/65 ffb1be9817394cc0 +bladeMaster 14/66 4656d34ed9a21292 +bladeMaster 14/67 d20e8869c4fb436a +bladeMaster 14/68 16bcb794330ab43a +bladeMaster 14/7 f98ef4bf81ceca2e +bladeMaster 14/70 fba79d623c23adc4 +bladeMaster 14/71 feb13c5d5fba6f0a +bladeMaster 14/72 c73fe2104cc5c98a +bladeMaster 14/73 2040bb0b44f2ab8c +bladeMaster 14/74 335af2dc3ca957ba +bladeMaster 14/75 77ae291006880ad2 +bladeMaster 14/76 11d4a9135aaf2d94 +bladeMaster 14/77 0bc76098922a22c4 +bladeMaster 14/78 5ce19675f29ffef2 +bladeMaster 14/79 b103519805edca7e +bladeMaster 14/8 396e7465dbd5103a +bladeMaster 14/80 3945ca93e700a3d2 +bladeMaster 14/81 2eac8a445168a550 +bladeMaster 14/82 d689c7b05af56ece +bladeMaster 14/83 1e96afbab5dfc08e +bladeMaster 14/84 724f869df7b45a2c +bladeMaster 14/85 1dced9af29daa258 +bladeMaster 14/86 6b8f8ccb229327e4 +bladeMaster 14/87 d2e73e24f6db65f0 +bladeMaster 14/88 f4358467e18ca506 +bladeMaster 14/89 44928c2926a3d930 +bladeMaster 14/9 b2fffac7a48f72dc +bladeMaster 14/90 53f0311b9f2fc5de +bladeMaster 14/91 65022da49602d932 +bladeMaster 14/92 751ece030d8f586e +bladeMaster 14/93 dc23b041672dbf8c +bladeMaster 14/94 fb77641969753e80 +bladeMaster 14/95 bfdb112f180a54a4 +bladeMaster 14/96 a54778a0852d5934 +bladeMaster 14/97 cfe8357cdbe016fa +bladeMaster 14/98 1376f8214eacff26 +bladeMaster 14/99 b37ed90fcb22cd02 +bladeMaster 15/0 c39e0cd1232f4f22 +bladeMaster 15/1 7ebff6c213d668a2 +bladeMaster 15/10 8d8be8686b77b10a +bladeMaster 15/11 e02e57133c110218 +bladeMaster 15/12 c8826dd22b27dfa2 +bladeMaster 15/13 384892d9324e0b40 +bladeMaster 15/14 517074de135ff97a +bladeMaster 15/15 6651e3518ff39d7c +bladeMaster 15/16 6828ebbaf3d72a80 +bladeMaster 15/17 dc7237d9a781a842 +bladeMaster 15/18 152cbbbc3aeb766a +bladeMaster 15/19 fc251bf3853d9218 +bladeMaster 15/2 2f1c8fd9ba2f6006 +bladeMaster 15/20 6b6c5a01f9cd3308 +bladeMaster 15/21 ce528442e85fa510 +bladeMaster 15/22 265ed9eab73b2025 +bladeMaster 15/23 4af36b770495df4e +bladeMaster 15/24 b506b837e02489f0 +bladeMaster 15/26 f96be02902dbcab2 +bladeMaster 15/27 f9026bd7482a6b3b +bladeMaster 15/28 adb2e8f4f4df5df2 +bladeMaster 15/29 bdbed04eb5174350 +bladeMaster 15/3 57415de3c19e4394 +bladeMaster 15/30 8c61026807e55151 +bladeMaster 15/31 629a50743cc58a3f +bladeMaster 15/32 d1da8ee6040de879 +bladeMaster 15/33 6b0f71f11284328d +bladeMaster 15/34 40670c3317e95be7 +bladeMaster 15/35 21bfea5a9b2a609e +bladeMaster 15/36 0044cdbb56ac238b +bladeMaster 15/4 cca4c98fc3461efa +bladeMaster 15/5 57e02a76cb1baec6 +bladeMaster 15/6 a1886db20fc1139a +bladeMaster 15/7 53aad8a73468ce86 +bladeMaster 15/8 7151c81adc4f2642 +bladeMaster 15/9 e38f52f5f60b1b2a +bladeMaster 2/0 4aeb835b15e41f21 +bladeMaster 2/1 cac59c4759bdbbc7 +bladeMaster 2/10 a25d816c1eda9070 +bladeMaster 2/11 3b2e92afcf07ec1e +bladeMaster 2/12 d00faac57f349137 +bladeMaster 2/13 8305d73ef37f2982 +bladeMaster 2/14 32a62a87f34c5c22 +bladeMaster 2/15 aef108776706e121 +bladeMaster 2/16 17f468b8f44f0cb6 +bladeMaster 2/17 8aff505c83add137 +bladeMaster 2/18 cc32a7822912e529 +bladeMaster 2/2 6a3882a4e76d83cb +bladeMaster 2/3 46c3912d6735a5b0 +bladeMaster 2/4 c3d12829d9ed8e5e +bladeMaster 2/5 263576bda6bd6851 +bladeMaster 2/6 9b07c422ef47284d +bladeMaster 2/7 adddf5fa117ee142 +bladeMaster 2/8 0f9bbc06d8714e8c +bladeMaster 2/9 86de26b98e30474d +bladeMaster 3/0 cd54cb90213b1c8d +bladeMaster 3/1 071e1d037487526b +bladeMaster 3/10 2a01712c8e4bb9ad +bladeMaster 3/11 07896c22f60e3938 +bladeMaster 3/2 dad42b872f2593b4 +bladeMaster 3/3 6e9290bab28a52ea +bladeMaster 3/4 ebcf59909a0fc28e +bladeMaster 3/5 381ebd1eb87304a5 +bladeMaster 3/6 876b21def5540a21 +bladeMaster 3/7 ea070dfee267da81 +bladeMaster 3/8 65963bad8fa3ad3a +bladeMaster 3/9 a4c776620919a741 +bladeMaster 4/0 2e21561e73f0bc55 +bladeMaster 4/1 4f23133620771733 +bladeMaster 4/10 96f55233e1c077e0 +bladeMaster 4/11 1ba079613d98bd15 +bladeMaster 4/12 b81a71dbb9850b6a +bladeMaster 4/13 08542c019ae83f60 +bladeMaster 4/14 e91942cb53111a5a +bladeMaster 4/15 77473bfd07e18407 +bladeMaster 4/16 7b586e12019d1720 +bladeMaster 4/17 c25dda80515e5e9c +bladeMaster 4/18 8d3765090f997dd1 +bladeMaster 4/19 cf665aeb7a8a8da4 +bladeMaster 4/2 1f86ccfa203c8325 +bladeMaster 4/20 bb02ebf40de5b928 +bladeMaster 4/21 aa2300938bbb8068 +bladeMaster 4/22 cae98b1aed21ac7a +bladeMaster 4/23 cca4dd1cf627060c +bladeMaster 4/24 4d3cdd8dd0a2666d +bladeMaster 4/3 107d889d6e76b898 +bladeMaster 4/4 9ebb035aebb50f92 +bladeMaster 4/5 5771c99bdc6fcbad +bladeMaster 4/6 3e2af290399d90f5 +bladeMaster 4/7 2fa1607b3b6d70d9 +bladeMaster 4/8 c0e5d700d999b244 +bladeMaster 4/9 4dd8c13d02d7b1f3 +bladeMaster 5/0 f53b0ccd912b67f9 +bladeMaster 5/1 7645c4fb66ff0247 +bladeMaster 5/10 98c9e5799c7653a4 +bladeMaster 5/11 4d7ba53861a9851f +bladeMaster 5/12 36a45fcb1aa44e41 +bladeMaster 5/13 2b1298cb42120d68 +bladeMaster 5/14 e2ab325cd8327486 +bladeMaster 5/15 feb6c1bd3208212b +bladeMaster 5/16 761b2d55a1cfed3c +bladeMaster 5/17 69bd6fa9aea1833d +bladeMaster 5/18 6ae1a9a00ca9ff2d +bladeMaster 5/19 796f6baded303824 +bladeMaster 5/2 f03005d926cdf678 +bladeMaster 5/20 bf6706f607887c22 +bladeMaster 5/21 770ab10bccd4765a +bladeMaster 5/22 5d78a8c9d8b77beb +bladeMaster 5/23 b313940dbe0df7a1 +bladeMaster 5/3 93f113bc2e683218 +bladeMaster 5/30 137c348dd062cf07 +bladeMaster 5/31 779fd471758c4cfc +bladeMaster 5/33 1568d5a38eeff02b +bladeMaster 5/34 1b423693808d3b8f +bladeMaster 5/36 57e3e41ae0ec22c5 +bladeMaster 5/4 b02c5d84f5e784a5 +bladeMaster 5/5 05997a8b84c5049f +bladeMaster 5/6 7c2669aad95339a0 +bladeMaster 5/7 2e1b0a535ea8830b +bladeMaster 5/8 4534d895ada7269b +bladeMaster 5/9 95dbcf21b83c7569 +bladeMaster 6/0 8f6b21fdee7e2b32 +bladeMaster 6/1 bcb55c6ed3375ee7 +bladeMaster 6/10 fcb0e34288166a99 +bladeMaster 6/11 a7ca68a6112a4bea +bladeMaster 6/12 5cc65faeee2c396b +bladeMaster 6/13 4698b0e6f68b06fa +bladeMaster 6/14 96c7d6266f69b5b0 +bladeMaster 6/15 1509842edb7a45a2 +bladeMaster 6/16 086371e2ac441320 +bladeMaster 6/17 c677fb83b8aeb7f3 +bladeMaster 6/18 ec3474166de5cb55 +bladeMaster 6/19 c99de851d6ad8498 +bladeMaster 6/2 e4eb30d775a40a34 +bladeMaster 6/20 5995f39336919c04 +bladeMaster 6/21 5ad1684495e80293 +bladeMaster 6/3 5d35f0336c7e164c +bladeMaster 6/4 5dbe1af5f3797cdf +bladeMaster 6/5 033b8c36de2805fb +bladeMaster 6/6 d17faaa26daa6f48 +bladeMaster 6/7 c5879fdfb5e6bbb0 +bladeMaster 6/8 daf5cf1e203b6dcb +bladeMaster 6/9 d3e14d98c69cac82 +bladeMaster 7/0 fd27c492660a0e84 +bladeMaster 7/1 276e942fc7b40fb6 +bladeMaster 7/10 ef825e1930ed8f9a +bladeMaster 7/11 657baaf82d604a39 +bladeMaster 7/12 27194c49c306e15a +bladeMaster 7/13 f92791cea3ffaf8f +bladeMaster 7/14 2d31ad99107c2931 +bladeMaster 7/16 f2554f111ba9acec +bladeMaster 7/17 b7932e9dfa741099 +bladeMaster 7/18 ba72b3bb9e55ccba +bladeMaster 7/19 fb81defc65e593d2 +bladeMaster 7/2 51f5e6956aef6b54 +bladeMaster 7/21 105e121835e9c35c +bladeMaster 7/22 eba9c9cf02b25edc +bladeMaster 7/24 8304063f8b8bbd2c +bladeMaster 7/25 1c08bbf2dc85a85e +bladeMaster 7/26 5561913361b93da5 +bladeMaster 7/27 12a4152cf97e5f91 +bladeMaster 7/28 06e9a438c14d28ec +bladeMaster 7/29 3c877ce3353a9fb6 +bladeMaster 7/3 b41258b2dd9dd8cf +bladeMaster 7/30 ca352b119665c06d +bladeMaster 7/31 490919a76692083b +bladeMaster 7/33 b20e60d0a776c525 +bladeMaster 7/34 124e502e4f372b79 +bladeMaster 7/35 2c0a263385234e9d +bladeMaster 7/36 146bd733fe858989 +bladeMaster 7/38 d00fea0810881024 +bladeMaster 7/39 4ffeec0b6db5eefa +bladeMaster 7/4 d4f2a61d56e9d241 +bladeMaster 7/40 33ead686fd69c029 +bladeMaster 7/41 0b3cc3eeb990d7e1 +bladeMaster 7/42 6bef819119689f44 +bladeMaster 7/43 e2b0dfd925fb10f8 +bladeMaster 7/44 7d29d12a01e5168b +bladeMaster 7/45 7363ee6e461a8bb2 +bladeMaster 7/46 a2bd8ac892a0b781 +bladeMaster 7/49 6fba8ffe6f89d1eb +bladeMaster 7/5 03931d27f546a221 +bladeMaster 7/50 ddbf097caa73f4fc +bladeMaster 7/51 b4d1f3fee99e5efa +bladeMaster 7/52 cb3a69a39fb56a74 +bladeMaster 7/59 5ac26211f090acd3 +bladeMaster 7/6 e2d1a1d5017d1c0c +bladeMaster 7/60 141ea166c671ef4b +bladeMaster 7/61 85626d9063a379b2 +bladeMaster 7/62 a656a0f59fa2ea03 +bladeMaster 7/63 b98b042320fcdfde +bladeMaster 7/64 2aa9eb71979426b1 +bladeMaster 7/65 9630c08ac4e087d3 +bladeMaster 7/66 16a962dbb3c7c3f1 +bladeMaster 7/67 0d3a560fa1d746ce +bladeMaster 7/68 ce8241ee75ceaa46 +bladeMaster 7/69 282f47483acaabea +bladeMaster 7/7 aa8d3301e5057236 +bladeMaster 7/70 d16ff92b7007ded5 +bladeMaster 7/72 d4d5fd2b2f1dad13 +bladeMaster 7/73 68f776162a8792ca +bladeMaster 7/8 4feaa0e3d0c7c8a5 +bladeMaster 7/9 5ad9624c5620ae8c +bladeMaster 8/0 9b9a7a7bf861be8a +bladeMaster 8/1 634609a920e991d8 +bladeMaster 8/10 9ce3be8a17f752bd +bladeMaster 8/11 66d2d68dfcc6914b +bladeMaster 8/12 59f640bd96b716ba +bladeMaster 8/13 a7b48976784fac21 +bladeMaster 8/14 25d03feee06736b6 +bladeMaster 8/15 de6cecd6538ce15b +bladeMaster 8/16 66d9369fd917fd5d +bladeMaster 8/17 7b4162572a96b92f +bladeMaster 8/18 6726786323094263 +bladeMaster 8/19 35292b6772e129fd +bladeMaster 8/2 31d1b8010dd6f691 +bladeMaster 8/20 bbf5ee37ece07164 +bladeMaster 8/21 b3e580191404ac0d +bladeMaster 8/22 132ee1f0a2ee3178 +bladeMaster 8/23 21ee4134ab09c2cb +bladeMaster 8/24 2ef7d69c70af8b3e +bladeMaster 8/25 ec1d8a199cd28f39 +bladeMaster 8/26 430ffbb81db2bb56 +bladeMaster 8/27 102c10486d70557e +bladeMaster 8/28 6a31c471035d92b2 +bladeMaster 8/29 f73577e8d7cd8cd7 +bladeMaster 8/3 70452b47711a6e03 +bladeMaster 8/30 e72a4b8afd9e422f +bladeMaster 8/31 815fbc34c04edd73 +bladeMaster 8/32 411de2c71a15b4c1 +bladeMaster 8/33 b194d4908c49ec2c +bladeMaster 8/34 1bc73d0f76a88b6f +bladeMaster 8/35 a309936b7717eedc +bladeMaster 8/36 722a5e8395d79411 +bladeMaster 8/37 b702d4d82f4b08cf +bladeMaster 8/38 8158c1adf2ad09e6 +bladeMaster 8/39 0ec3ef0af2462c4e +bladeMaster 8/4 b7eee9e29abeb525 +bladeMaster 8/40 62d81d7bce347527 +bladeMaster 8/41 dc8356c53bd5047c +bladeMaster 8/42 788c7b408689bf09 +bladeMaster 8/43 3bedd3d9aac0e300 +bladeMaster 8/44 4be4f54c1020014d +bladeMaster 8/45 919c60babc56136d +bladeMaster 8/46 dc3d4d6bf65dcfd9 +bladeMaster 8/47 3e8f4d4b9ca71d65 +bladeMaster 8/48 a53c4db3bacf635a +bladeMaster 8/49 58199b28d3f7729b +bladeMaster 8/5 523f735c90d37a0d +bladeMaster 8/50 adf744d367638172 +bladeMaster 8/51 0d6456709065c20a +bladeMaster 8/52 53efbb368668ec43 +bladeMaster 8/59 ff033336c5f744b5 +bladeMaster 8/6 b4a29265abe94b1f +bladeMaster 8/60 91b03d9456c97748 +bladeMaster 8/61 af71081f4096a120 +bladeMaster 8/62 f629e33fb0099c7b +bladeMaster 8/63 17a8a44263ab5bbb +bladeMaster 8/64 338b0c4f7485bb61 +bladeMaster 8/65 3efc565807ca7927 +bladeMaster 8/66 9520ac3f4eeec17f +bladeMaster 8/67 77195732f4c822a5 +bladeMaster 8/68 0dd8cf0cc57c4952 +bladeMaster 8/69 bb01008303f50246 +bladeMaster 8/7 86661c7f402ab106 +bladeMaster 8/70 bd324a9e5e8d16ce +bladeMaster 8/71 8ad5efac0639ffea +bladeMaster 8/72 404286820d80a35d +bladeMaster 8/73 2331974c95a90f91 +bladeMaster 8/8 d32189d70efbb9d1 +bladeMaster 8/9 83df4380fed3865c +bladeMaster 9/0 a2024beecf7678bf +bladeMaster 9/1 943400494704c5b8 +bladeMaster 9/10 aaf36ec24761935b +bladeMaster 9/11 973eaebab5e57b8d +bladeMaster 9/12 0167686f779a0840 +bladeMaster 9/13 6330e3d433b5db1f +bladeMaster 9/14 c5b22505dc4851b8 +bladeMaster 9/15 dc7905c33ff9c531 +bladeMaster 9/16 38e79518e8c12fb3 +bladeMaster 9/17 e354b954598de66f +bladeMaster 9/18 dbe41a0e2e3349c6 +bladeMaster 9/19 1e3489aec5bb312d +bladeMaster 9/2 c0bfddb65f019c13 +bladeMaster 9/20 5e4c05cc899093e5 +bladeMaster 9/21 162ea3ca43fce9cf +bladeMaster 9/22 ed76474b7ebda956 +bladeMaster 9/23 ecc11216cc960dd9 +bladeMaster 9/24 b8b0a2e056910ef7 +bladeMaster 9/25 eca14f0e53b9933a +bladeMaster 9/26 247c2597c4e614de +bladeMaster 9/27 0e189bdcd24b53fe +bladeMaster 9/28 57d034692c11506f +bladeMaster 9/29 abcbafa723c2da7e +bladeMaster 9/3 3d388fb0d6516d94 +bladeMaster 9/30 7397c416d676795d +bladeMaster 9/31 bf25c603c54d7b6b +bladeMaster 9/32 f43cf6d473972b55 +bladeMaster 9/33 836e44c63246ea92 +bladeMaster 9/34 36c268d2dca63598 +bladeMaster 9/35 4fa987824aed9168 +bladeMaster 9/36 42a1a37a3aa75559 +bladeMaster 9/37 7b65942e5bbd4ecb +bladeMaster 9/38 b9b3bbe46e6fc731 +bladeMaster 9/39 8330b0be73f28483 +bladeMaster 9/4 65327a98602c9670 +bladeMaster 9/40 7128ef91a1a3f14c +bladeMaster 9/41 d3f3622d16ec12dd +bladeMaster 9/42 63532487b9e13ded +bladeMaster 9/43 80e4d93f5c33b9c3 +bladeMaster 9/44 54936208c89e1abe +bladeMaster 9/45 d110a33f260a3710 +bladeMaster 9/46 c4ba8711b39158e7 +bladeMaster 9/47 120255b32930fa44 +bladeMaster 9/48 d23b58adde7c3fb8 +bladeMaster 9/49 2c6e7ff6cd0ee63c +bladeMaster 9/5 55faf332f8c9bd34 +bladeMaster 9/50 26944c61ae60d433 +bladeMaster 9/51 bbbd327cf9ebb2f7 +bladeMaster 9/52 96d3ea51d1988aad +bladeMaster 9/59 742ae58bc4a22dd6 +bladeMaster 9/6 7867f8bffc130f84 +bladeMaster 9/60 bcd5d2d14e804036 +bladeMaster 9/61 df0b78b1634930f8 +bladeMaster 9/62 6be8c428ad9fc8c8 +bladeMaster 9/63 cce79bc37ba15b6e +bladeMaster 9/64 a2e99f65d9e77c92 +bladeMaster 9/65 f057d7fcc033debb +bladeMaster 9/66 22413bc8142a7581 +bladeMaster 9/67 7e217967cfce17b3 +bladeMaster 9/68 8d9d4c67ed4c4453 +bladeMaster 9/69 96818dd633e401ff +bladeMaster 9/7 e7e0ba254538db29 +bladeMaster 9/70 66cfa71cf9ee9f88 +bladeMaster 9/71 b395f8d7750fc752 +bladeMaster 9/72 1ea7b3cf6359659d +bladeMaster 9/73 731021c2d50569b5 +bladeMaster 9/8 d5f1b5ae4c47f4ed +bladeMaster 9/9 5e5a0777ece28872 +newDarkWizard 0/0 6148c644d5bcc24a +newDarkWizard 0/1 3b6272f42a76e0b0 +newDarkWizard 0/10 af418bcce3ae0eb7 +newDarkWizard 0/11 ecdc29ba70e5da94 +newDarkWizard 0/12 f7ce84c4cedb6199 +newDarkWizard 0/13 8ad8e7356f8fe75d +newDarkWizard 0/14 481804e16d65b011 +newDarkWizard 0/15 64e4b861f3655c78 +newDarkWizard 0/16 b715f645bfb4e692 +newDarkWizard 0/17 40b98407df77a05c +newDarkWizard 0/18 55062da5392f303e +newDarkWizard 0/19 c80d481a22a9dd39 +newDarkWizard 0/2 446bb49b54716507 +newDarkWizard 0/20 b04607a1834e3801 +newDarkWizard 0/21 0570a2e7bf35f1c7 +newDarkWizard 0/22 e52762f1f0c69368 +newDarkWizard 0/23 0c54eac040e3ec9a +newDarkWizard 0/24 2eb6930d78a08bcd +newDarkWizard 0/25 d465c44bee53bf35 +newDarkWizard 0/26 76b127c82449129c +newDarkWizard 0/27 b290ce9d9a4418d6 +newDarkWizard 0/28 2ffdaac0a7cc4932 +newDarkWizard 0/3 8fc7944a94383abc +newDarkWizard 0/31 c52f3f5451c23f05 +newDarkWizard 0/32 bcd855a71ed02596 +newDarkWizard 0/33 29292a3fd568596e +newDarkWizard 0/34 5551e248e4e17e20 +newDarkWizard 0/35 e63340e2b213ebb0 +newDarkWizard 0/4 f3ac45596d4d7cf0 +newDarkWizard 0/5 5a085dab281cc3ed +newDarkWizard 0/6 1a0548e13255d118 +newDarkWizard 0/7 574604be40ab500b +newDarkWizard 0/8 2936b3cec8107278 +newDarkWizard 0/9 e1d77eccac1cefc1 +newDarkWizard 1/0 e2b774cd20bc0457 +newDarkWizard 1/1 3a7450498aac1b71 +newDarkWizard 1/2 f6e8bd3efa40904e +newDarkWizard 1/3 eba4517f76bc5199 +newDarkWizard 1/4 10e97ec4c698f3c6 +newDarkWizard 1/5 2b156cdfd049c813 +newDarkWizard 1/6 3d649c09a2c3b41c +newDarkWizard 1/7 1123bfe5218fd00c +newDarkWizard 1/8 87ae108c8e1a1b88 +newDarkWizard 10/0 6e5834a4270a9e15 +newDarkWizard 10/1 5d61a3ca60f0cd8b +newDarkWizard 10/10 e4697b0f3129273d +newDarkWizard 10/11 57a12fbc53629c88 +newDarkWizard 10/12 94505a03137b2b44 +newDarkWizard 10/13 4b765aef198648f6 +newDarkWizard 10/14 1423fd959a2e6138 +newDarkWizard 10/15 dbc03b2d52ebba2a +newDarkWizard 10/16 1966161011d464d6 +newDarkWizard 10/17 cc483b574fb4ff31 +newDarkWizard 10/18 11a473a1bf9f4f5b +newDarkWizard 10/19 f77c9baf03ffe1e0 +newDarkWizard 10/2 a3dfc866c7d200bd +newDarkWizard 10/20 207dd2d349cad1b8 +newDarkWizard 10/21 d1bff0494374ed3e +newDarkWizard 10/22 2f0afa6072f4fa2f +newDarkWizard 10/23 5243cae8a52fb15f +newDarkWizard 10/24 724c605e4a9f3b4c +newDarkWizard 10/25 ff5f3315d1b20ec3 +newDarkWizard 10/26 c4648370b3385146 +newDarkWizard 10/27 e7736d7ffbf8d312 +newDarkWizard 10/28 84993b553f45222c +newDarkWizard 10/29 e5e2a37a39edd5fc +newDarkWizard 10/3 051dc4b2cc996020 +newDarkWizard 10/30 147396b5579bc552 +newDarkWizard 10/31 bb747fcd7b7bb1ce +newDarkWizard 10/32 e484e2b4827490db +newDarkWizard 10/33 ed6ef671e97509dc +newDarkWizard 10/34 5396997a6cd04470 +newDarkWizard 10/35 6aa00ae348fc2056 +newDarkWizard 10/36 1d33aea4aca172cb +newDarkWizard 10/37 c76db39088c9f8d1 +newDarkWizard 10/38 737dd2fe9fc7ee79 +newDarkWizard 10/39 4dd0f52003db88d2 +newDarkWizard 10/4 79ba200805e1d3ae +newDarkWizard 10/40 20b965bdf784ad88 +newDarkWizard 10/41 4cc7be24862af47c +newDarkWizard 10/42 21de59d01ee484b0 +newDarkWizard 10/43 c90d71604f432c86 +newDarkWizard 10/44 8c4162377e9d18d8 +newDarkWizard 10/45 eeb018c49e789ce0 +newDarkWizard 10/46 4fb1db8d2e56f3d5 +newDarkWizard 10/47 1c1ba2df23c3e92e +newDarkWizard 10/48 33f5efc919992aad +newDarkWizard 10/49 c5cf1a52d2985873 +newDarkWizard 10/5 3835977f5d7296f0 +newDarkWizard 10/50 c7199716ff423976 +newDarkWizard 10/51 0167e5d36cd76078 +newDarkWizard 10/52 691a4aab8288dca9 +newDarkWizard 10/6 3084b9d168a46505 +newDarkWizard 10/62 260df4f87ccc963b +newDarkWizard 10/63 3626f9615960865b +newDarkWizard 10/64 4315260362cb4349 +newDarkWizard 10/65 35c65f2fb1e9664b +newDarkWizard 10/66 401552d7439ecd18 +newDarkWizard 10/67 a468c17e7338079f +newDarkWizard 10/68 8dcc91847bc8c1f3 +newDarkWizard 10/69 d4a32dc80cb74710 +newDarkWizard 10/7 974da2edebb28704 +newDarkWizard 10/70 2e74955f84ba7789 +newDarkWizard 10/71 278f26a27944d771 +newDarkWizard 10/8 a4f7f137be7b2ba8 +newDarkWizard 10/9 5fa066f2fdb49a8f +newDarkWizard 11/0 de1c704ab9a4bf86 +newDarkWizard 11/1 4440ef621f96fccc +newDarkWizard 11/10 13a4b0ab835fbed4 +newDarkWizard 11/11 a8392a4ae4686453 +newDarkWizard 11/12 dbede2222b753e21 +newDarkWizard 11/13 17c77cb6769ec011 +newDarkWizard 11/14 d8aab84a2d6ab89b +newDarkWizard 11/15 ee60faf23d6e1e38 +newDarkWizard 11/16 7b58ab9348f485eb +newDarkWizard 11/17 ac28c4643168af6f +newDarkWizard 11/18 3cfbb5598cf61099 +newDarkWizard 11/19 766e7565d2539965 +newDarkWizard 11/2 5b7b26b66387a51d +newDarkWizard 11/20 dc19315add4a745a +newDarkWizard 11/21 46250ca7984d2421 +newDarkWizard 11/22 02f236609d568107 +newDarkWizard 11/23 d5157b1566e83943 +newDarkWizard 11/24 c3a95d23f3184c1f +newDarkWizard 11/25 07335efa420d6ff9 +newDarkWizard 11/26 a41c4dcc142571b6 +newDarkWizard 11/27 9a9f3408b9a0f91a +newDarkWizard 11/28 4a88ded4b094197a +newDarkWizard 11/29 314c7b3fbc81863b +newDarkWizard 11/3 e373654bb4cd0d16 +newDarkWizard 11/30 8e806938095cb258 +newDarkWizard 11/31 c92e90b77d420bd3 +newDarkWizard 11/32 c21a097ae69c0d57 +newDarkWizard 11/33 ce99323dc186fa15 +newDarkWizard 11/34 1d0f4763ba3942e5 +newDarkWizard 11/35 fa88da337fa4bd19 +newDarkWizard 11/36 22c05a51b41c7cb2 +newDarkWizard 11/37 00fc256906de36de +newDarkWizard 11/38 c0967ac8cf0f237e +newDarkWizard 11/39 6769b4f21c6171bf +newDarkWizard 11/4 e7a614b2715048c6 +newDarkWizard 11/40 5037599e804948bb +newDarkWizard 11/41 fc276994e5578df1 +newDarkWizard 11/42 b54c6d3f98a67033 +newDarkWizard 11/43 98873df7f3118fcc +newDarkWizard 11/44 a425f97453152101 +newDarkWizard 11/45 c256264a369281f7 +newDarkWizard 11/46 32e352bc5c8bdcc5 +newDarkWizard 11/47 834760fd51626bc5 +newDarkWizard 11/48 0727e89a3aec966a +newDarkWizard 11/49 7b74d65a9eb1144e +newDarkWizard 11/5 574bd7a993e65b40 +newDarkWizard 11/50 71c6b6747d155c86 +newDarkWizard 11/51 fa284725e9d3786a +newDarkWizard 11/52 f63bcf36146fc5bd +newDarkWizard 11/59 dcb8cd79c3deeb9e +newDarkWizard 11/6 8d1023bf06541866 +newDarkWizard 11/60 657200b2bd385eb1 +newDarkWizard 11/61 cde2977a61d59884 +newDarkWizard 11/62 ee6045669d164f05 +newDarkWizard 11/63 89374c72922e6e1f +newDarkWizard 11/64 cb296d084484930a +newDarkWizard 11/65 4f45923e564861c4 +newDarkWizard 11/66 98e5f016e1cbb4ea +newDarkWizard 11/67 972fbe051bf8d6f7 +newDarkWizard 11/68 e42b301e980861d2 +newDarkWizard 11/69 85eea92e47abed13 +newDarkWizard 11/7 aac0434f887c9969 +newDarkWizard 11/70 85d3d1b6f12a9175 +newDarkWizard 11/71 d6e916d42140381d +newDarkWizard 11/72 9cde63ae1edbaafb +newDarkWizard 11/73 edbdd0c8b9954399 +newDarkWizard 11/8 827d1f695d96c665 +newDarkWizard 11/9 425b3f6393905ea3 +newDarkWizard 12/0 93ff30c6bad63fa4 +newDarkWizard 12/1 4a8b6ee2d58134a2 +newDarkWizard 12/10 1f0d281e869f0018 +newDarkWizard 12/100 0f44a3aef740a467 +newDarkWizard 12/101 47065e92aa162629 +newDarkWizard 12/102 624af3ca096f867c +newDarkWizard 12/103 8d22b303177919e8 +newDarkWizard 12/104 28f5ac64917bd204 +newDarkWizard 12/105 ba3ead8c8b3c48a0 +newDarkWizard 12/106 4f8b7623c6c11d2f +newDarkWizard 12/107 a4526078ac031e78 +newDarkWizard 12/108 3fc8ee674556ca7a +newDarkWizard 12/109 efb7331191a62aa1 +newDarkWizard 12/11 261da925c0199441 +newDarkWizard 12/110 f9cb0b5cf573a34e +newDarkWizard 12/111 e9183aec3d4d4e90 +newDarkWizard 12/112 105db025d1fee6a3 +newDarkWizard 12/113 4ea2fd61eb749772 +newDarkWizard 12/114 e942089f9673f9a0 +newDarkWizard 12/115 e07b13c674710ea2 +newDarkWizard 12/116 be94d6102ff0fd6b +newDarkWizard 12/117 ef7c8c6034882a1a +newDarkWizard 12/118 9df14e0771a3ed28 +newDarkWizard 12/119 b7d5e704cd20d8ab +newDarkWizard 12/12 d746766633d9d7a6 +newDarkWizard 12/120 9fa1f1f0e439f7fe +newDarkWizard 12/121 84137fd517c0771a +newDarkWizard 12/122 eca684a8bc0d863b +newDarkWizard 12/123 fd2c3e65beb8ca02 +newDarkWizard 12/124 a79e9e3c3cb30899 +newDarkWizard 12/125 e9c6e71ea30868fa +newDarkWizard 12/126 e57a33d4f2e4884d +newDarkWizard 12/127 16ad09f1c05a13a3 +newDarkWizard 12/128 bcf2f1dda7d056ed +newDarkWizard 12/129 00971f39b84b94dc +newDarkWizard 12/13 b7008e58df70ec90 +newDarkWizard 12/130 f09df24897432af2 +newDarkWizard 12/131 81f4a4b8beb19e11 +newDarkWizard 12/132 ec1f5a3ae4aa224f +newDarkWizard 12/133 549d13e55deba441 +newDarkWizard 12/134 cfb4db0d622e9952 +newDarkWizard 12/135 b8aab0f335106700 +newDarkWizard 12/136 deed836136f8a36f +newDarkWizard 12/137 26e4cfd83b53b2f9 +newDarkWizard 12/138 a4770273a8e335eb +newDarkWizard 12/139 44872c8b99a75c3b +newDarkWizard 12/14 1c67519b1147cc1c +newDarkWizard 12/140 15a879787bbcbf19 +newDarkWizard 12/141 173d76d6c3d41d27 +newDarkWizard 12/142 7e8d2372777c01b9 +newDarkWizard 12/143 8d331dabc1bac6d3 +newDarkWizard 12/15 bbe0e7917dd8aaa8 +newDarkWizard 12/16 9cb3ca87776c3a24 +newDarkWizard 12/17 3a8d0dffa49a4aa4 +newDarkWizard 12/18 dec5e842bfeabf50 +newDarkWizard 12/19 37c0feff1cec03b0 +newDarkWizard 12/2 22adb7de6b9c1aab +newDarkWizard 12/21 0792af6ade79b23e +newDarkWizard 12/22 df69e19845bcf6dc +newDarkWizard 12/23 dab587ec6e6659be +newDarkWizard 12/24 75bc9308644aaa9e +newDarkWizard 12/26 56b00b7c00d1fd28 +newDarkWizard 12/3 d009334cdf829fb4 +newDarkWizard 12/30 cac9cad9b5951fb7 +newDarkWizard 12/31 284c17aa996e5e0d +newDarkWizard 12/32 46f67b1cc531f17b +newDarkWizard 12/33 7e1e271a991930b9 +newDarkWizard 12/34 b911958ef761edcd +newDarkWizard 12/35 4b2a86be6d945ab7 +newDarkWizard 12/36 9e7f8d98fc4b706c +newDarkWizard 12/37 1ee3f1babce223bd +newDarkWizard 12/38 9c733099dbdd5d99 +newDarkWizard 12/39 86467194d304c4b4 +newDarkWizard 12/4 17e138804375366e +newDarkWizard 12/40 a1da41fa15b7bd15 +newDarkWizard 12/41 16b6121afc453edc +newDarkWizard 12/42 cb0840807e6202e6 +newDarkWizard 12/43 f4b5ff0c2f21a1d1 +newDarkWizard 12/44 1535432187544f64 +newDarkWizard 12/45 fd1c887439786238 +newDarkWizard 12/46 53e6128df3287e14 +newDarkWizard 12/47 ca91a9ac7feab5ae +newDarkWizard 12/48 571e43fe4f174904 +newDarkWizard 12/49 737470c8eb088c97 +newDarkWizard 12/5 4ccf03c572cbb72d +newDarkWizard 12/50 2ea0afa078b2e851 +newDarkWizard 12/6 e6c54e868d9c8276 +newDarkWizard 12/60 dc16ebda90571882 +newDarkWizard 12/61 dfbb75ea2cddc690 +newDarkWizard 12/62 b43d8f3b24526cc5 +newDarkWizard 12/63 7aaaabe90740b10a +newDarkWizard 12/64 86e39525c0233d4d +newDarkWizard 12/65 cc960f30a80c2115 +newDarkWizard 12/7 ee4db2a40fe1d790 +newDarkWizard 12/70 701ad68f7523e5db +newDarkWizard 12/71 f2d1c5dd88bf6fb7 +newDarkWizard 12/72 a0036bf2b5c9f901 +newDarkWizard 12/8 78703323910e5520 +newDarkWizard 12/9 1a7fd8b654d50f7a +newDarkWizard 13/0 ec1c1559f1d18496 +newDarkWizard 13/1 e14621839844b08d +newDarkWizard 13/10 8e90f8c48bd42e07 +newDarkWizard 13/103 2e29a549431c3526 +newDarkWizard 13/104 9efa0dd03d7ed822 +newDarkWizard 13/105 46a39d1427bc7e0e +newDarkWizard 13/106 f95d077bb9ec3379 +newDarkWizard 13/107 4a2a64479b1228ef +newDarkWizard 13/109 c61e5b23b0eec304 +newDarkWizard 13/11 d13c6459bbb64a40 +newDarkWizard 13/110 39722cb662031540 +newDarkWizard 13/111 837fa79b85f32d64 +newDarkWizard 13/112 8775f5a1a66dbd4e +newDarkWizard 13/113 bbc36515dfe130e6 +newDarkWizard 13/114 f1fcf8fda34bbede +newDarkWizard 13/115 4b62bbdd097e1cba +newDarkWizard 13/116 f2e15b06ca0c8910 +newDarkWizard 13/117 67f8b90e8b358668 +newDarkWizard 13/118 0e8c88a0874a8f1a +newDarkWizard 13/119 68a6074b5f86dcf8 +newDarkWizard 13/12 c3139242fd6a9e08 +newDarkWizard 13/120 103cd2914f3ef79a +newDarkWizard 13/121 992df813fed0e7a0 +newDarkWizard 13/122 33bbbe55bc4f1e1c +newDarkWizard 13/123 79898c348456289a +newDarkWizard 13/124 9ac7f172011c19f6 +newDarkWizard 13/125 a2f10043f762d614 +newDarkWizard 13/126 d60487047dcdbbc6 +newDarkWizard 13/127 3e7ce14410201fe2 +newDarkWizard 13/128 4ab89476787d5096 +newDarkWizard 13/129 6293ea2678781194 +newDarkWizard 13/13 433711a78aeb7df0 +newDarkWizard 13/130 afa434877766766c +newDarkWizard 13/131 8b01ff51ed0964d2 +newDarkWizard 13/132 9b4d447a033c6ff8 +newDarkWizard 13/133 4c7b7cf5ecff27da +newDarkWizard 13/134 bf7cecc2cdff11e2 +newDarkWizard 13/135 eff3fb845f3233c0 +newDarkWizard 13/136 65186b97705adc6c +newDarkWizard 13/137 6d630b3e31aae100 +newDarkWizard 13/138 ab9e2ddbf72a88fe +newDarkWizard 13/139 59cd2a15e6baefb4 +newDarkWizard 13/14 b3f81ee5a9f4c648 +newDarkWizard 13/140 f9bc591f06433b54 +newDarkWizard 13/141 a0a2ddd265a5350c +newDarkWizard 13/142 0e8add9381725c70 +newDarkWizard 13/143 808b265bccc50fee +newDarkWizard 13/144 ea6ae6a3b9372580 +newDarkWizard 13/15 ffc1beb4bff6fc3d +newDarkWizard 13/16 0e793b2f56c36818 +newDarkWizard 13/17 5771722e4297e152 +newDarkWizard 13/18 ae372773a7f32aa0 +newDarkWizard 13/19 5b53d4ea6df240fa +newDarkWizard 13/2 73c1d9a8959927b6 +newDarkWizard 13/20 7664cc5a14b9f313 +newDarkWizard 13/21 37db226acf86b2fa +newDarkWizard 13/22 2454142b02cbda5f +newDarkWizard 13/23 7ec4dfcb8c0e6a18 +newDarkWizard 13/24 583ac536cb93b54b +newDarkWizard 13/25 ee32040d991ceff1 +newDarkWizard 13/26 742984a84dd37513 +newDarkWizard 13/27 391862fc8c35bc9f +newDarkWizard 13/28 d779d63c7c7fe1d9 +newDarkWizard 13/29 90fa6251d1bcb9ae +newDarkWizard 13/3 5f63177b5aa006ec +newDarkWizard 13/30 c159bbcde4af9dea +newDarkWizard 13/31 1da2b5ed08b97d76 +newDarkWizard 13/32 943ea9352304524b +newDarkWizard 13/33 2b1982b2b6e88a2d +newDarkWizard 13/34 4428ef56c0659e11 +newDarkWizard 13/35 8964d76b11562cdd +newDarkWizard 13/36 c96e488744f9009f +newDarkWizard 13/37 ba9f152db4134f61 +newDarkWizard 13/38 dafcbc1d82636805 +newDarkWizard 13/39 f3c397b2e6866112 +newDarkWizard 13/4 a93231a25048c6ed +newDarkWizard 13/40 c930abdd1f696fd0 +newDarkWizard 13/41 0eec4c53aeb6f1c4 +newDarkWizard 13/42 58317cfa8406cc3b +newDarkWizard 13/43 c8c0b7cf150746ce +newDarkWizard 13/44 6c6d131ef71d36e6 +newDarkWizard 13/45 c0faaf63b34b749c +newDarkWizard 13/46 9a0d6d50410b26e0 +newDarkWizard 13/47 85f907d4f58701dc +newDarkWizard 13/48 8ccf5abcb50f420c +newDarkWizard 13/49 21d2e28fce57b296 +newDarkWizard 13/5 6e204d87a0904853 +newDarkWizard 13/50 5999577e295ec696 +newDarkWizard 13/51 cea4322a520f4396 +newDarkWizard 13/52 b2fec3c09ed665c8 +newDarkWizard 13/53 ca39bb43cc2103f2 +newDarkWizard 13/54 203f1e4dcdae2364 +newDarkWizard 13/55 911d375e01e17082 +newDarkWizard 13/56 54f6c96237df3cd6 +newDarkWizard 13/57 a1d8a4e97e864de8 +newDarkWizard 13/58 9b67e33a3a80e2d6 +newDarkWizard 13/59 162212b838841cd2 +newDarkWizard 13/60 18eab2127715308c +newDarkWizard 13/61 6317b0d6356c5972 +newDarkWizard 13/62 0647de455bf41a6e +newDarkWizard 13/63 15084336bae2b9de +newDarkWizard 13/64 fb57dd0be8719484 +newDarkWizard 13/65 7771b56a5b615694 +newDarkWizard 13/66 23d61a9d08b64d9c +newDarkWizard 13/67 e84afc69e350468d +newDarkWizard 13/68 49b9394e289a46f8 +newDarkWizard 13/69 c7cc241c5e39ba18 +newDarkWizard 13/7 e4b865a49e5d7e18 +newDarkWizard 13/70 c56f2a9a482d7c14 +newDarkWizard 13/71 0cc8df0da73ae888 +newDarkWizard 13/72 d6a8e5253c646814 +newDarkWizard 13/73 2c3eaab8cd2ef8aa +newDarkWizard 13/74 6ed7fb85dab50aec +newDarkWizard 13/75 68d83f8d90db519e +newDarkWizard 13/76 9755753997a22452 +newDarkWizard 13/8 dbdf7510ce65f165 +newDarkWizard 13/80 77acc5c020d01218 +newDarkWizard 13/81 af5045acd1fdbb48 +newDarkWizard 13/82 b9a945ed967df6aa +newDarkWizard 13/83 5af11662c05881d4 +newDarkWizard 13/84 674b0fd5517921fa +newDarkWizard 13/85 538c949b979b3f30 +newDarkWizard 13/86 f1743c69961b640a +newDarkWizard 13/87 2a5b0386dd103ce8 +newDarkWizard 13/88 bbb6fcdecca098b2 +newDarkWizard 13/89 6988ca2f28aaad60 +newDarkWizard 13/9 43695ec69848ec84 +newDarkWizard 13/90 8c515c2f1d5fb8ba +newDarkWizard 13/91 a433ad9b34f0966e +newDarkWizard 13/92 d22a90cfa813d354 +newDarkWizard 13/93 a1ff3164a7488c18 +newDarkWizard 13/94 0f70104308088426 +newDarkWizard 13/95 9062522078f5ff2c +newDarkWizard 13/96 d2b46c9364c44268 +newDarkWizard 13/97 38ee94908f28c636 +newDarkWizard 13/98 94385a23a173e28a +newDarkWizard 13/99 2ca6b790b9ed0e88 +newDarkWizard 14/0 7687ed5c5a0bb3cc +newDarkWizard 14/1 43efe29f5a7b367c +newDarkWizard 14/10 ebc17bd6838c4c1a +newDarkWizard 14/100 c3c1c2018ed854d2 +newDarkWizard 14/101 4aeb9ad5b9824447 +newDarkWizard 14/102 c54820f6d2711b4f +newDarkWizard 14/103 a1fa9d72e4ba8b35 +newDarkWizard 14/104 53263af3c8182769 +newDarkWizard 14/105 3d864ea4c675ac43 +newDarkWizard 14/106 0fd113a915866565 +newDarkWizard 14/107 864dd94b38b96937 +newDarkWizard 14/108 ef8e330ec3c1a5af +newDarkWizard 14/109 72badc46b1be28d9 +newDarkWizard 14/11 af37be6d7fb64aea +newDarkWizard 14/110 a0919415cdc1655a +newDarkWizard 14/111 36eb21124772bd51 +newDarkWizard 14/112 a1a651b2cfb98548 +newDarkWizard 14/113 702670042271cb48 +newDarkWizard 14/114 2dd1e312768bc4a0 +newDarkWizard 14/115 985272396eb1f18e +newDarkWizard 14/116 772aaaf5a39b83b8 +newDarkWizard 14/117 5a85748f68a698c6 +newDarkWizard 14/118 2320c542dbac586a +newDarkWizard 14/119 526afc5288ce72de +newDarkWizard 14/12 4dad4b1d2301d0bf +newDarkWizard 14/120 248b1b1dd150131a +newDarkWizard 14/121 b77ff345b3189f7e +newDarkWizard 14/122 0a042784c14ca2b0 +newDarkWizard 14/123 385f18b517e7127c +newDarkWizard 14/124 9d26838c6249afd2 +newDarkWizard 14/125 0991a2018c39e978 +newDarkWizard 14/126 510c1f6fdbfd3042 +newDarkWizard 14/127 4b0f668f3a61af88 +newDarkWizard 14/128 8929e865c36d9bd8 +newDarkWizard 14/129 a6da5012265e0c72 +newDarkWizard 14/13 0838130c898a904a +newDarkWizard 14/130 a29c550bcfff37b8 +newDarkWizard 14/131 84cd4ebfa1e4a1be +newDarkWizard 14/132 71c52f5e2e4cf38e +newDarkWizard 14/133 21171bb1040b9486 +newDarkWizard 14/134 aa24c347d7e530c2 +newDarkWizard 14/135 5085d8581e5db5b2 +newDarkWizard 14/136 4371a56c60158526 +newDarkWizard 14/137 3fe5a1fb3f879b8e +newDarkWizard 14/138 5cc28da8b1c98ea2 +newDarkWizard 14/139 b0eb7780e103633a +newDarkWizard 14/14 84900ac408a7a05a +newDarkWizard 14/140 2d090c128ea6cf60 +newDarkWizard 14/141 1ba76cf5bdd445d2 +newDarkWizard 14/142 4f269794114dedac +newDarkWizard 14/143 fcab1a14123edcac +newDarkWizard 14/144 d600902b31f3833a +newDarkWizard 14/145 d3d93c927b7a8e84 +newDarkWizard 14/146 bf78d8be2dbb5178 +newDarkWizard 14/147 01629755528c480c +newDarkWizard 14/148 eb9bc684792188c4 +newDarkWizard 14/149 728ed6c42247a870 +newDarkWizard 14/15 7c12d60791a13e36 +newDarkWizard 14/150 0a5e090f2c8303a2 +newDarkWizard 14/151 accd2b0c434585d2 +newDarkWizard 14/152 87606823d10effe4 +newDarkWizard 14/153 426d307ef487c0d0 +newDarkWizard 14/154 b44f8a7e3bf6c7ec +newDarkWizard 14/155 cbb7cb6e0e86ea36 +newDarkWizard 14/156 bebf7cf6a99941be +newDarkWizard 14/157 10a943a530248f40 +newDarkWizard 14/158 76ae7ca1d81ac196 +newDarkWizard 14/159 3a329cf37ba03708 +newDarkWizard 14/16 922aef98fa16d5d0 +newDarkWizard 14/160 bb7a8542dc4d5dd6 +newDarkWizard 14/161 90755485950e6310 +newDarkWizard 14/162 66e291ba2aea6e0c +newDarkWizard 14/163 07dc56eba635feca +newDarkWizard 14/169 594beea6626ff9be +newDarkWizard 14/17 29aa3fff7727a0f4 +newDarkWizard 14/18 4080bb375ad7314a +newDarkWizard 14/19 c6acab5d038fbb4a +newDarkWizard 14/2 739d114d44fef314 +newDarkWizard 14/20 91c9456c261f6630 +newDarkWizard 14/21 60da8775fefa236b +newDarkWizard 14/22 86e4a42b7cecc804 +newDarkWizard 14/23 a649a7d8cb0e8a18 +newDarkWizard 14/24 b13f2bd6248f6a3d +newDarkWizard 14/25 d4e734c039a7a45b +newDarkWizard 14/26 2953b98d49f69e35 +newDarkWizard 14/28 098fa891a2274ebc +newDarkWizard 14/29 a300f5a1d7e34d08 +newDarkWizard 14/3 edffbafc46d4b488 +newDarkWizard 14/31 b99b62b26f94b4d0 +newDarkWizard 14/32 b5c4129a02ca6f76 +newDarkWizard 14/33 18b5d21922609b66 +newDarkWizard 14/34 8cc44a4740cf5835 +newDarkWizard 14/35 17b98d102bed7bc8 +newDarkWizard 14/36 4a6841647506be78 +newDarkWizard 14/37 68c2b70bbcabbd5c +newDarkWizard 14/38 6fba31e96ed3bfce +newDarkWizard 14/39 468af4c0a4dedcd6 +newDarkWizard 14/4 806e1d96a2770e1a +newDarkWizard 14/40 6a1bcc71bbbc0394 +newDarkWizard 14/41 5d37f80c1996f6a5 +newDarkWizard 14/42 2da58f1adce2b465 +newDarkWizard 14/43 e527d6ed9ab30357 +newDarkWizard 14/44 8fc47fcd5c13f5d7 +newDarkWizard 14/45 04092953f41e2c0d +newDarkWizard 14/46 3164ae11d06f2aa3 +newDarkWizard 14/47 8dd999f3b500bc01 +newDarkWizard 14/48 4cacbdf84f5c084f +newDarkWizard 14/49 e4497d6e86b06b91 +newDarkWizard 14/5 d4e23c84af5b61b6 +newDarkWizard 14/50 297dc274145243f9 +newDarkWizard 14/51 eaae49a22d67ed98 +newDarkWizard 14/52 82ea682b095553aa +newDarkWizard 14/53 3e36219f41dd49da +newDarkWizard 14/54 f7e14ec176498914 +newDarkWizard 14/55 6422dc67c13905ac +newDarkWizard 14/56 7457aa9af99f9b62 +newDarkWizard 14/57 ccb12e55b843cfe0 +newDarkWizard 14/58 2d1874c554adeab6 +newDarkWizard 14/59 e420fe067568960e +newDarkWizard 14/6 42cbbeef57197576 +newDarkWizard 14/60 2d85beaf78e48e8c +newDarkWizard 14/61 f1977d765ef163d8 +newDarkWizard 14/62 bf251654df5e2888 +newDarkWizard 14/63 fcab362470a76c50 +newDarkWizard 14/64 6f32b9156477fbca +newDarkWizard 14/65 ffb1be9817394cc0 +newDarkWizard 14/66 4656d34ed9a21292 +newDarkWizard 14/67 d20e8869c4fb436a +newDarkWizard 14/68 16bcb794330ab43a +newDarkWizard 14/7 f98ef4bf81ceca2e +newDarkWizard 14/70 fba79d623c23adc4 +newDarkWizard 14/71 feb13c5d5fba6f0a +newDarkWizard 14/72 c73fe2104cc5c98a +newDarkWizard 14/73 2040bb0b44f2ab8c +newDarkWizard 14/74 335af2dc3ca957ba +newDarkWizard 14/75 77ae291006880ad2 +newDarkWizard 14/76 11d4a9135aaf2d94 +newDarkWizard 14/77 0bc76098922a22c4 +newDarkWizard 14/78 5ce19675f29ffef2 +newDarkWizard 14/79 b103519805edca7e +newDarkWizard 14/8 396e7465dbd5103a +newDarkWizard 14/80 3945ca93e700a3d2 +newDarkWizard 14/81 2eac8a445168a550 +newDarkWizard 14/82 d689c7b05af56ece +newDarkWizard 14/83 1e96afbab5dfc08e +newDarkWizard 14/84 724f869df7b45a2c +newDarkWizard 14/85 1dced9af29daa258 +newDarkWizard 14/86 6b8f8ccb229327e4 +newDarkWizard 14/87 d2e73e24f6db65f0 +newDarkWizard 14/88 f4358467e18ca506 +newDarkWizard 14/89 44928c2926a3d930 +newDarkWizard 14/9 b2fffac7a48f72dc +newDarkWizard 14/90 53f0311b9f2fc5de +newDarkWizard 14/91 65022da49602d932 +newDarkWizard 14/92 751ece030d8f586e +newDarkWizard 14/93 dc23b041672dbf8c +newDarkWizard 14/94 fb77641969753e80 +newDarkWizard 14/95 bfdb112f180a54a4 +newDarkWizard 14/96 a54778a0852d5934 +newDarkWizard 14/97 cfe8357cdbe016fa +newDarkWizard 14/98 1376f8214eacff26 +newDarkWizard 14/99 b37ed90fcb22cd02 +newDarkWizard 15/0 380d400bb66e036e +newDarkWizard 15/1 dc8591dbd2137bce +newDarkWizard 15/10 21a0282cffb51562 +newDarkWizard 15/11 8d1ba23945c505bc +newDarkWizard 15/12 f8c6ddaa5efabdd2 +newDarkWizard 15/13 928003e1f6c8a8b8 +newDarkWizard 15/14 f7421525e28a327a +newDarkWizard 15/15 07ac8ae24d3ae7f4 +newDarkWizard 15/16 823b4257e6f1a298 +newDarkWizard 15/17 d78b10a82cefbb62 +newDarkWizard 15/18 6a805dc1681fd44a +newDarkWizard 15/19 22bd911fb789a218 +newDarkWizard 15/2 42ba84ba2404ffd6 +newDarkWizard 15/20 ccaa5bc38f4da3fc +newDarkWizard 15/21 9bef7cc3e5f697e0 +newDarkWizard 15/22 674a35c786edfe15 +newDarkWizard 15/23 283ff8c7b616db72 +newDarkWizard 15/24 71dbdfdf68865650 +newDarkWizard 15/26 8aaeecff0a988ec2 +newDarkWizard 15/27 42e85a21cd9d7353 +newDarkWizard 15/28 919220e10592c824 +newDarkWizard 15/29 a00bdfd3197d3d70 +newDarkWizard 15/3 f7299d255bab7cfc +newDarkWizard 15/30 4a17128a5a38b5ac +newDarkWizard 15/31 e1c4509fdea7f517 +newDarkWizard 15/32 4cf7800fac29969c +newDarkWizard 15/33 e282abfd8bae22c0 +newDarkWizard 15/34 8e54304ee49a4863 +newDarkWizard 15/35 6c1a0304e18f007a +newDarkWizard 15/36 6c8276b142c7f7a0 +newDarkWizard 15/4 75520a92a6ed64ae +newDarkWizard 15/5 ed3071554d69ebce +newDarkWizard 15/6 7e26bb700d71c8ea +newDarkWizard 15/7 ba439864b3f603b2 +newDarkWizard 15/8 6e01d92a894ce69e +newDarkWizard 15/9 c926c2ccbdf410fe +newDarkWizard 2/0 b2682c3f2e349fd9 +newDarkWizard 2/1 aaabd7d6aa131665 +newDarkWizard 2/10 1e37082745ff5528 +newDarkWizard 2/11 0d4dbb3c35f6a83a +newDarkWizard 2/12 f3910ca3c4eaad17 +newDarkWizard 2/13 d7263f6abbc2ba2c +newDarkWizard 2/14 86ae31220a4b56ba +newDarkWizard 2/15 be5bc0f8f6a5ae78 +newDarkWizard 2/16 d31f64d10aefb318 +newDarkWizard 2/17 c9eaee5cd2875fab +newDarkWizard 2/18 4031e32dfd22e4b1 +newDarkWizard 2/2 5e967c6cdb7748a8 +newDarkWizard 2/3 8adfee89e2886691 +newDarkWizard 2/4 bb750a672c1f6f0f +newDarkWizard 2/5 60f3c9f9f50c628a +newDarkWizard 2/6 ccbb347fe7f9a9cf +newDarkWizard 2/7 d9bab54319d8416b +newDarkWizard 2/8 d2636cbca66f6707 +newDarkWizard 2/9 73b36f9062b43ca2 +newDarkWizard 3/0 1671c9f837071993 +newDarkWizard 3/1 90dd83ac6df5289b +newDarkWizard 3/10 66c0630894b7c596 +newDarkWizard 3/11 67cce18d65f774b8 +newDarkWizard 3/2 659293241f6c3082 +newDarkWizard 3/3 efb78d70462f76d8 +newDarkWizard 3/4 da7b9c3c665ef174 +newDarkWizard 3/5 a8c2efcfbf84c642 +newDarkWizard 3/6 ba4a6e07c8f44ddf +newDarkWizard 3/7 ed655de83270a6a8 +newDarkWizard 3/8 75f0ca8fa18466d2 +newDarkWizard 3/9 a6d7313deb1fc387 +newDarkWizard 4/0 208c9d48bd065c81 +newDarkWizard 4/1 0a6524a1775a82c8 +newDarkWizard 4/10 ed6c74c9880e31ae +newDarkWizard 4/11 4fb2c87dde2a4b99 +newDarkWizard 4/12 936a259438e16961 +newDarkWizard 4/13 7c8ce1ce78faac17 +newDarkWizard 4/14 d3ea59afaf4d788c +newDarkWizard 4/15 77473bfd07e18407 +newDarkWizard 4/16 c7ed0d47e36464b6 +newDarkWizard 4/17 bbb33009f4f2c5ff +newDarkWizard 4/18 cfeb54496c542cbf +newDarkWizard 4/19 b33cb11cb9294650 +newDarkWizard 4/2 18e8d081ed1b6126 +newDarkWizard 4/20 5d7b211597258966 +newDarkWizard 4/21 482ba86f97a80deb +newDarkWizard 4/22 8697ed72db14d3cc +newDarkWizard 4/23 90dd6e9857f7096e +newDarkWizard 4/24 3bfe06d2eae05f72 +newDarkWizard 4/3 2b6dbe3e200374b6 +newDarkWizard 4/4 4eed496b19fbfb78 +newDarkWizard 4/5 e4f9c01ee0c0cec3 +newDarkWizard 4/6 83a30ddd31916397 +newDarkWizard 4/7 2fa1607b3b6d70d9 +newDarkWizard 4/8 0ba60931e625ccd7 +newDarkWizard 4/9 7394daa253f51b2d +newDarkWizard 5/0 1db27e6011ec8375 +newDarkWizard 5/1 bd5fc74cc632a556 +newDarkWizard 5/10 70d03e3800250890 +newDarkWizard 5/11 16a097dfb577677b +newDarkWizard 5/12 7941fd482295ac54 +newDarkWizard 5/13 b16b0175a12e780a +newDarkWizard 5/14 8e01e0b19bc8deef +newDarkWizard 5/15 941b60c5cf968aee +newDarkWizard 5/16 5b9884af7bfded30 +newDarkWizard 5/17 1c15ffdc455e3e56 +newDarkWizard 5/18 d37b2503aaa4ce8c +newDarkWizard 5/19 1b0a6a87963be377 +newDarkWizard 5/2 d65546a2e750d8fb +newDarkWizard 5/20 2a9ee4a8fec935a9 +newDarkWizard 5/21 6fadcf9da5e57577 +newDarkWizard 5/22 fd71956b79d2e865 +newDarkWizard 5/23 df17faa9e4af0b0d +newDarkWizard 5/3 6b223b41ba3ad129 +newDarkWizard 5/30 0df97d021ae48447 +newDarkWizard 5/31 708a96ade6944b7e +newDarkWizard 5/33 6a201ad8f0098eed +newDarkWizard 5/34 c8f14bb179a494c7 +newDarkWizard 5/36 d31e3d69ae84e405 +newDarkWizard 5/4 9e303935aa0f13cd +newDarkWizard 5/5 39f84a791d6f4b3e +newDarkWizard 5/6 ff01d2a4e4c59815 +newDarkWizard 5/7 b0e57c62b9f040b6 +newDarkWizard 5/8 a815f606edfdefd2 +newDarkWizard 5/9 4d77696b7d05b11f +newDarkWizard 6/0 e2e8bcbefb137f03 +newDarkWizard 6/1 447d109b564e33e7 +newDarkWizard 6/10 b6ac17109ebd4529 +newDarkWizard 6/11 1072ad629ef009ea +newDarkWizard 6/12 6438993dd3922d93 +newDarkWizard 6/13 8b1cd10abd5efdeb +newDarkWizard 6/14 e565c413af3a6aa8 +newDarkWizard 6/15 5460d41632ba7a50 +newDarkWizard 6/16 e65a1de11ae5f628 +newDarkWizard 6/17 9137983c2f995efd +newDarkWizard 6/18 1c838dc475399069 +newDarkWizard 6/19 fdc624be784b197c +newDarkWizard 6/2 1a785e601dd7122d +newDarkWizard 6/20 f92710c51a7137de +newDarkWizard 6/21 df462c4e56d38476 +newDarkWizard 6/3 bfb6e14d71297ef5 +newDarkWizard 6/4 4e86bf8021accf09 +newDarkWizard 6/5 184507f6d12f2d0a +newDarkWizard 6/6 24eca5a0ada310a1 +newDarkWizard 6/7 a28126a54a99f633 +newDarkWizard 6/8 f5b3978a2027de56 +newDarkWizard 6/9 f0a2722c71cb127b +newDarkWizard 7/0 bf2f5141452365e5 +newDarkWizard 7/1 0f13732cc26b40e4 +newDarkWizard 7/10 94fedf38916b2325 +newDarkWizard 7/11 4659edcf9e73987b +newDarkWizard 7/12 bf5712ff579e0e8a +newDarkWizard 7/13 5bc79eecf7e66ce9 +newDarkWizard 7/14 1da89b00662f29f0 +newDarkWizard 7/16 a2bc539382f1b6c4 +newDarkWizard 7/17 dd5b702bc690743a +newDarkWizard 7/18 6ef664d15bace080 +newDarkWizard 7/19 d94cd790e2057e69 +newDarkWizard 7/2 7681bf98a5a57057 +newDarkWizard 7/21 ed3106ce9b22f3a1 +newDarkWizard 7/22 6fa71374e6ef85c8 +newDarkWizard 7/24 2bd4029e05a5dfd3 +newDarkWizard 7/25 7ad7df1949cb35f1 +newDarkWizard 7/26 a5d840cf9f203f32 +newDarkWizard 7/27 93c87c05e1810b9a +newDarkWizard 7/28 302f6571848dc624 +newDarkWizard 7/29 f9a8f93b5c92f8a9 +newDarkWizard 7/3 ec7d2863aa0ada6f +newDarkWizard 7/30 ab0df3de7834a284 +newDarkWizard 7/31 2941ab0ed32803ae +newDarkWizard 7/33 629afce9c8f587cd +newDarkWizard 7/34 68db30916740fa2e +newDarkWizard 7/35 36887cb9845880b1 +newDarkWizard 7/36 54d300ed61b2a265 +newDarkWizard 7/38 f957ba84ff38800a +newDarkWizard 7/39 6a25d240a3de05fa +newDarkWizard 7/4 d3dc2d707f159414 +newDarkWizard 7/40 2e5996184a7e782e +newDarkWizard 7/41 e9156565c5c0a12f +newDarkWizard 7/42 93456080d2fa5891 +newDarkWizard 7/43 cdbb10662d49d2ff +newDarkWizard 7/44 e445ab0dec96f853 +newDarkWizard 7/45 49a03db4946ff42e +newDarkWizard 7/46 012c5ac45a4f46a0 +newDarkWizard 7/49 f9117dfea20c4405 +newDarkWizard 7/5 ed34bc61e5e02f65 +newDarkWizard 7/50 b0cef4e207b258d3 +newDarkWizard 7/51 7a39339dcc63985b +newDarkWizard 7/52 cab54c4d86b0051f +newDarkWizard 7/59 b546eb0c66b59511 +newDarkWizard 7/6 55996a48e7954459 +newDarkWizard 7/60 62403fcf1ab71284 +newDarkWizard 7/61 713671179cbb1760 +newDarkWizard 7/62 2ca7d7c6d4a4a759 +newDarkWizard 7/63 b98b042320fcdfde +newDarkWizard 7/64 c59c47265c156eb3 +newDarkWizard 7/65 9630c08ac4e087d3 +newDarkWizard 7/66 228f067d73e1e14d +newDarkWizard 7/67 67bfc1f98cdcaf72 +newDarkWizard 7/68 389055597c37b012 +newDarkWizard 7/69 9e7c2f9cb88db92a +newDarkWizard 7/7 52d2497e536db5bf +newDarkWizard 7/70 12bde33a6f8ccab9 +newDarkWizard 7/72 b1260d5f4edafe33 +newDarkWizard 7/73 b42063ac666e139b +newDarkWizard 7/8 ee3f9d91efa2fad5 +newDarkWizard 7/9 650526e22f2a9ab5 +newDarkWizard 8/0 1b7db854dd1f1777 +newDarkWizard 8/1 4d8fbb2e776dd6c4 +newDarkWizard 8/10 6a6f818306db8392 +newDarkWizard 8/11 a8b1214675649f48 +newDarkWizard 8/12 285a6c31f0d28860 +newDarkWizard 8/13 2fe8dd909169c77a +newDarkWizard 8/14 74cf53783cdb5830 +newDarkWizard 8/15 2299102116d5893d +newDarkWizard 8/16 769c9d6998fd6c4e +newDarkWizard 8/17 701078b5a31e50ad +newDarkWizard 8/18 b81f764494fcb501 +newDarkWizard 8/19 84f66f21945d0c48 +newDarkWizard 8/2 4712a312cc8178b3 +newDarkWizard 8/20 9fdc69eb74b4276a +newDarkWizard 8/21 c021aafedb13072a +newDarkWizard 8/22 4517286edb49cea4 +newDarkWizard 8/23 98334ed69d8fc39e +newDarkWizard 8/24 bef1c65ca1a31267 +newDarkWizard 8/25 16bbbfdc73dc3af5 +newDarkWizard 8/26 b369af56c8996379 +newDarkWizard 8/27 0f654a1b4c7ca128 +newDarkWizard 8/28 997bc3e3e6fa2844 +newDarkWizard 8/29 f6cc72479fa319ec +newDarkWizard 8/3 db9aa295a2c8949c +newDarkWizard 8/30 4558fbb80fc0da78 +newDarkWizard 8/31 3530cf1747131391 +newDarkWizard 8/32 3a012bad6b299a12 +newDarkWizard 8/33 e5e88ee9e1372ac0 +newDarkWizard 8/34 b16e5785ff8da479 +newDarkWizard 8/35 58b8b11f4ccf913c +newDarkWizard 8/36 2857feac73455933 +newDarkWizard 8/37 98fc3aa645dab126 +newDarkWizard 8/38 ce9cad21e9ece6b1 +newDarkWizard 8/39 12766944e038406b +newDarkWizard 8/4 9bcc2d1f156878cb +newDarkWizard 8/40 e8ddd8e4e78e7b9e +newDarkWizard 8/41 2ff457f578c17555 +newDarkWizard 8/42 45324b49d7bdbafe +newDarkWizard 8/43 93faa7e190600c0f +newDarkWizard 8/44 08cdeff0f580b696 +newDarkWizard 8/45 c44a2bd0f43cb404 +newDarkWizard 8/46 bf90e420319f5618 +newDarkWizard 8/47 f81a02a152f3372f +newDarkWizard 8/48 6ee3f8de7b818300 +newDarkWizard 8/49 43c9610f6d023dca +newDarkWizard 8/5 d13aedcfe867d912 +newDarkWizard 8/50 b5a13e339f4bc0d8 +newDarkWizard 8/51 01e853f27859aeb2 +newDarkWizard 8/52 287026cd8b0231a1 +newDarkWizard 8/59 10471f7c0f418d9d +newDarkWizard 8/6 0699c535dff6c233 +newDarkWizard 8/60 545ca48c15264a3d +newDarkWizard 8/61 249fcbfa3717e7ce +newDarkWizard 8/62 724e6f7d5b23d0a7 +newDarkWizard 8/63 17a8a44263ab5bbb +newDarkWizard 8/64 72958c044d2264a9 +newDarkWizard 8/65 3efc565807ca7927 +newDarkWizard 8/66 05b22aec4b57e1af +newDarkWizard 8/67 afdd15bb3160d5ef +newDarkWizard 8/68 7e18abe80919716a +newDarkWizard 8/69 783b36e22dc3d992 +newDarkWizard 8/7 aed2e770830b2541 +newDarkWizard 8/70 ec016fff322afd96 +newDarkWizard 8/71 72de54ccc74f83ba +newDarkWizard 8/72 a0d2fa6bd4cbafe1 +newDarkWizard 8/73 cc0599a5ab443b64 +newDarkWizard 8/8 fcf5e5177bc31a4c +newDarkWizard 8/9 c8ef878db6e39308 +newDarkWizard 9/0 79deb09d8ac8eabf +newDarkWizard 9/1 7914393ab49dafe3 +newDarkWizard 9/10 39409b30430736c4 +newDarkWizard 9/11 680d4f6fedc5e97a +newDarkWizard 9/12 556698ee2b2ee599 +newDarkWizard 9/13 9e8e1e573f0c37f7 +newDarkWizard 9/14 8c27202ad63f39b7 +newDarkWizard 9/15 373a3fa9e8ffe321 +newDarkWizard 9/16 7cfe85256d97f80d +newDarkWizard 9/17 1075b335f81a1eed +newDarkWizard 9/18 6e52332a325e6386 +newDarkWizard 9/19 b247e11630de434a +newDarkWizard 9/2 9ecd6ba804b47663 +newDarkWizard 9/20 33e4f729170ad0df +newDarkWizard 9/21 bc1237f926586875 +newDarkWizard 9/22 f1c4dc976b5b6094 +newDarkWizard 9/23 68a99f656df312e3 +newDarkWizard 9/24 92bf384103635a3f +newDarkWizard 9/25 1fde2117849c44e0 +newDarkWizard 9/26 88c8d22776d9d406 +newDarkWizard 9/27 858ffb84e73d9ea3 +newDarkWizard 9/28 8e37c75eb6740513 +newDarkWizard 9/29 9027b80786d407b4 +newDarkWizard 9/3 fde0e74279456d3d +newDarkWizard 9/30 04fc82bb9d371901 +newDarkWizard 9/31 b202387c2a7bb056 +newDarkWizard 9/32 366c67762af4fc9e +newDarkWizard 9/33 2070511c23ebfde1 +newDarkWizard 9/34 060a9115eae56fb1 +newDarkWizard 9/35 eda5374c78a7c493 +newDarkWizard 9/36 88a9e8df1a05ca38 +newDarkWizard 9/37 dc78a1f683716cf4 +newDarkWizard 9/38 5b748c7c71995d5f +newDarkWizard 9/39 05fe977fce22f9c3 +newDarkWizard 9/4 6334b631e750843f +newDarkWizard 9/40 bd7fc8804b871b20 +newDarkWizard 9/41 afc9727b734cde4d +newDarkWizard 9/42 9bcf1f953f3ab28c +newDarkWizard 9/43 3875f6eb5239a6c4 +newDarkWizard 9/44 377848cfb16d1e68 +newDarkWizard 9/45 4123ad04c077b506 +newDarkWizard 9/46 d6e19c7bce775c90 +newDarkWizard 9/47 3812ec7693376cc8 +newDarkWizard 9/48 6cba5fc26c1077dc +newDarkWizard 9/49 4af2446355e48d03 +newDarkWizard 9/5 ddca1aecfaaefed5 +newDarkWizard 9/50 22784335ad3ecc85 +newDarkWizard 9/51 af0d28b2ad75cc81 +newDarkWizard 9/52 dded3a3d8402501f +newDarkWizard 9/59 cf5dc7cf799f1cb3 +newDarkWizard 9/6 1f71af7ce1795066 +newDarkWizard 9/60 773fee6355648b88 +newDarkWizard 9/61 d9c1b7345a800aa4 +newDarkWizard 9/62 437ef8f6b8fc5410 +newDarkWizard 9/63 cce79bc37ba15b6e +newDarkWizard 9/64 13e3ef1a2cf3ec1e +newDarkWizard 9/65 f057d7fcc033debb +newDarkWizard 9/66 d4a377decb1f7e7d +newDarkWizard 9/67 2a4a5db8d0e7a6bb +newDarkWizard 9/68 707051ffe93e55ff +newDarkWizard 9/69 850fc583ee4f6b33 +newDarkWizard 9/7 484593387e9fc64d +newDarkWizard 9/70 3570092837c982d4 +newDarkWizard 9/71 d6238275cec60892 +newDarkWizard 9/72 fce87c0fe1cbd441 +newDarkWizard 9/73 a6f4a59ee86d7c07 +newDarkWizard 9/8 69567566d25b0e12 +newDarkWizard 9/9 9d62bbd3134284ea diff --git a/tests/data/test_item_database_files.cpp b/tests/data/test_item_database_files.cpp index bdc3cbe12f..134de5e3fd 100644 --- a/tests/data/test_item_database_files.cpp +++ b/tests/data/test_item_database_files.cpp @@ -4,6 +4,7 @@ #include "ClientDataScope.h" #include "ItemModelDatabaseScope.h" +#include "ItemOptionsScope.h" #include "LookEditsScope.h" #include "LogCapture.h" #include "ItemStatProfilesScope.h" @@ -49,6 +50,7 @@ #include "Engine/Object/ZzzInfomation.h" #include "Engine/Object/ZzzInventory.h" #include "Engine/Physics/PhysicsManager.h" +#include "GameLogic/Items/ItemOptions.h" #include "GameLogic/Items/ItemStats.h" #include "Core/Text/Utf8.h" #include "I18N/All.h" @@ -1926,12 +1928,13 @@ TEST_CASE("Item editor changes go into the item database [data][items][editor]") REQUIRE(g_ItemDataHandler.AddItem(spear, nullptr)); CHECK(g_ItemDatabase.GetWeaponKind(MakeItemType(3, 100)) == WeaponKind::Spear); // And the options the option rules give it. - CHECK(g_ItemDatabase.Find(3, 100)->options == std::vector{"luck", "physicalDamageOption"}); + CHECK(g_ItemDatabase.Find(3, 100)->options == std::vector{"luck", "physicalDamageOption", + "excellentPhysicalAttack"}); } SUBCASE("an item's option list follows its data, and a list an edit picked stays") { - const std::vector weapon{"luck", "physicalDamageOption"}; + const std::vector weapon{"luck", "physicalDamageOption", "excellentPhysicalAttack"}; REQUIRE(g_ItemDatabase.Find(KrisType)->options == weapon); EditItem(KrisType, [](ItemDefinition& item) { item.tags.Set(ItemTag::Ammunition); }); CHECK(g_ItemDatabase.Find(KrisType)->options.empty()); @@ -3990,8 +3993,9 @@ TEST_CASE("Item Basics shows the stats at each level, from the values being type for (int level = 0; level < Data::Items::ItemLevelCount; ++level) { const GameLogic::Items::ItemStatValues game = GameLogic::Items::ComputeItemStats( - ItemAttribute[itemType], {itemType, level, static_cast(variant.excellent ? 1 : 0), - static_cast(variant.ancient ? 1 : 0), 0}); + ItemAttribute[itemType], + {itemType, level, static_cast(variant.excellent ? 1 : 0), + static_cast(variant.ancient ? 1 : 0), 0}); const GameLogic::Items::ItemStatValues& shown = values[static_cast(level)]; INFO(g_ItemDatabase.GetLogName(itemType) << " +" << level << " excellent " << variant.excellent << " ancient " << variant.ancient); @@ -4010,6 +4014,20 @@ TEST_CASE("Item Basics shows the stats at each level, from the values being type const int before = ComputeItemLevelValues(stronger, {})[5].damageMax; stronger.damageMax = static_cast(stronger.damageMax + 10); CHECK(ComputeItemLevelValues(stronger, {})[5].damageMax == before + 10); + + // Excellent counts with any excellent option the draft's definition has, also without option 1. + ItemOptionsScope restoreOptions; + const Data::Items::ItemOptionDatabase& shipped = restoreOptions.Saved(); + std::vector definitions(shipped.GetDefinitions().begin(), + shipped.GetDefinitions().end()); + const int physical = shipped.Find("excellentPhysicalAttack"); + REQUIRE(physical != Data::Items::ItemOptionDatabase::NoDefinition); + std::erase_if(definitions[static_cast(physical)].options, + [](const Data::Items::ItemOption& option) { return option.number == 1; }); + g_ItemDatabase.SetOptions(Data::Items::ItemOptionDatabase(std::move(definitions), shipped.GetTexts())); + const ItemDefinition kris = *g_ItemDatabase.Find(KrisType); + CHECK(ComputeItemLevelValues(kris, RequirementVariant{true, false, 0})[0].damageMin > + ComputeItemLevelValues(kris, {})[0].damageMin); } TEST_CASE("Item Requirements shows what the game asks at each level, from the values being typed " diff --git a/tests/data/test_item_option_links.cpp b/tests/data/test_item_option_links.cpp index 4472b2b628..18c608374b 100644 --- a/tests/data/test_item_option_links.cpp +++ b/tests/data/test_item_option_links.cpp @@ -175,6 +175,39 @@ TEST_CASE("An item's links name definitions, one of each byte, and every definit CHECK(issues.empty()); } +// The excellent byte of wings and the Horn of Fenrir means something else, and no horn is excellent, so they can't link +// excellent options. +TEST_CASE("Wings and horn mounts link no excellent options [data][items]") +{ + ItemOptionDefinition excellent; + excellent.name = "excellent"; + excellent.type = ItemOptionType::Excellent; + excellent.file = "Excellent.json"; + const ItemOptionDatabase options({MakeLuck("luck"), excellent}, MakeTexts()); + ItemDefinition wing = MakeItem(12, 3, {"luck", "excellent"}); + wing.slot = ItemSlot::Wings; + ItemDefinition horn = MakeItem(13, 37, {"excellent"}); + horn.tags.Set(ItemTag::HornMount); + const ItemDefinition sword = MakeItem(0, 0, {"luck", "excellent"}); + ItemDefinition wingWithLuck = MakeItem(12, 4, {"luck"}); + wingWithLuck.slot = ItemSlot::Wings; + std::vector issues; + // The Horn of Uniria's byte holds nothing, but it isn't excellent either. + ItemDefinition uniria = MakeItem(13, 2, {"excellent"}); + uniria.tags.Set(ItemTag::HornMount); + ValidateItemOptionLinks(std::vector{wing, horn, sword, wingWithLuck, uniria}, options, issues); + const auto linksIssue = [&](int group, int number) + { + return std::any_of(issues.begin(), issues.end(), [&](const ItemDataIssue& issue) + { return issue.group == group && issue.number == number && issue.field == "options"; }); + }; + CHECK(linksIssue(12, 3)); + CHECK(linksIssue(13, 37)); + CHECK_FALSE(linksIssue(0, 0)); + CHECK_FALSE(linksIssue(12, 4)); + CHECK(linksIssue(13, 2)); +} + TEST_CASE("An edited item's option list follows the option rules while it is the one they give [data][items]") { OptionRule ammunition; @@ -226,3 +259,59 @@ TEST_CASE("The item database resolves an item's links when the item or the optio CHECK(database.GetOptionLinks(MakeItemType(0, 1))[0] == 0); CHECK(database.GetOptionLinks(-1).empty()); } + +// The excellent options' effects: the slots the stat code, the price and the mixes read, with a value where the code +// before the definitions wrote one. +TEST_CASE("The excellent options' effects are the client's excellent slots [data][items]") +{ + using Type = ItemOptionType; + CHECK(FindItemOptionEffect(Type::Excellent, "maximumHealth", ItemOptionAdd::Percent) == + ItemOptionEffect{AT_IMPROVE_LIFE, false}); + CHECK(FindItemOptionEffect(Type::Excellent, "moneyAmountRate", ItemOptionAdd::Percent) == + ItemOptionEffect{AT_IMPROVE_GAIN_GOLD, false}); + CHECK(FindItemOptionEffect(Type::Excellent, "physicalBaseDmg", ItemOptionAdd::Add) == + ItemOptionEffect{AT_IMPROVE_DAMAGE_LEVEL, true}); + CHECK(FindItemOptionEffect(Type::Excellent, "wizardryBaseDmgIncrease", ItemOptionAdd::Percent) == + ItemOptionEffect{AT_IMPROVE_MAGIC_PERCENT, true}); + CHECK(FindItemOptionEffect(Type::Excellent, "attackSpeedAny", ItemOptionAdd::Add) == + ItemOptionEffect{AT_IMPROVE_ATTACK_SPEED, true}); + // The same attribute of another type is another effect. + CHECK(FindItemOptionEffect(Type::Option, "physicalBaseDmg", ItemOptionAdd::Add) == + ItemOptionEffect{AT_IMPROVE_DAMAGE, true}); + CHECK(FindItemOptionEffect(Type::Excellent, "maximumMana", ItemOptionAdd::Percent) == + ItemOptionEffect{AT_IMPROVE_MANA, false}); +} + +// A term on a hero attribute the client doesn't read is shown and adds nothing, with a warning. +TEST_CASE("A term on a hero attribute the client doesn't read loads with a warning [data][items]") +{ + ItemOptionDefinition luck = MakeLuck("luck"); + luck.options[0].value.per = {{"level", 0, 20}, {"horseLevel", 2, 0}}; + std::vector issues; + ValidateItemOptions(std::vector{luck}, MakeTexts(), "OptionTexts.json", issues); + CHECK(HasIssue(issues, ItemDataIssueSeverity::Warning, "definitions[0].options[0].per[1].attribute")); + CHECK_FALSE(HasIssue(issues, ItemDataIssueSeverity::Warning, "definitions[0].options[0].per[0].attribute")); +} + +// A text with {divisor} on an option whose terms have no divisor would show 0 there, and on one with several only the +// first one's: both load with a warning. +TEST_CASE("A {divisor} text on an option without one divisor term loads with a warning [data][items]") +{ + ItemOptionTexts texts = MakeTexts(); + texts.texts["luckCriticalDamage"].Set(Data::LocalizedString::NeutralLocale, "Damage +level/{divisor}"); + ItemOptionDefinition luck = MakeLuck("luck"); + std::vector issues; + ValidateItemOptions(std::vector{luck}, texts, "OptionTexts.json", issues); + CHECK(HasIssue(issues, ItemDataIssueSeverity::Warning, "definitions[0].options[0].text")); + + luck.options[0].value.per = {{"level", 0, 20}}; + issues.clear(); + ValidateItemOptions(std::vector{luck}, texts, "OptionTexts.json", issues); + CHECK_FALSE(HasIssue(issues, ItemDataIssueSeverity::Warning, "definitions[0].options[0].text")); + + // Two terms with a divisor: the line shows only the first one's. + luck.options[0].value.per = {{"level", 0, 20}, {"masterLevel", 0, 10}}; + issues.clear(); + ValidateItemOptions(std::vector{luck}, texts, "OptionTexts.json", issues); + CHECK(HasIssue(issues, ItemDataIssueSeverity::Warning, "definitions[0].options[0].text")); +} diff --git a/tests/data/test_item_option_slots.cpp b/tests/data/test_item_option_slots.cpp index eab8b44438..f0b2d61030 100644 --- a/tests/data/test_item_option_slots.cpp +++ b/tests/data/test_item_option_slots.cpp @@ -7,6 +7,7 @@ #include "ItemOptionsScope.h" #include "LogCapture.h" +#include "Character/CharacterManager.h" #include "Data/DataHandler/ItemData/ItemDataHandler.h" #include "Data/GameData/ItemData/ItemDatabase.h" #include "Engine/Object/ZzzInfomation.h" @@ -22,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -681,3 +683,420 @@ TEST_CASE("An additional option with a constant value counts at its option level REQUIRE(slots.size() == 1); CHECK(slots.front().value == 6); } + +namespace +{ +// The value with its terms' attributes resolved, as the option database has it. +int ComputeResolved(Data::Items::ItemOptionValue value, int level) +{ + Data::Items::ResolveTermAttributes(value); + return GameLogic::Items::ComputeOptionValue(value, level); +} +} // namespace + +// A value's terms read the hero's attributes when the value is asked: level / 20 of a level 85 hero is 4, rounded +// down; level plus master level with the master level, which only a master hero has. +TEST_CASE("An option value adds its terms on the hero's attributes, each rounded down [data][items]") +{ + HeroScope hero; + hero.Hero().Level = 85; + hero.Hero().Class = CLASS_GRANDMASTER; + const MASTER_LEVEL_VALUE savedMasterLevel = Master_Level_Data; + Master_Level_Data.nMLevel = 30; + + Data::Items::ItemOptionValue value{{0}, false, {{"level", 0, 20}}}; + CHECK(ComputeResolved(value, 1) == 4); + value.per = {{"totalLevel", 0, 20}}; + CHECK(ComputeResolved(value, 1) == 5); + value.per = {{"masterLevel", 2, 0}, {"level", 0, 20}}; + CHECK(ComputeResolved(value, 1) == 64); + // A list's entry plus the terms; an attribute the client doesn't read adds nothing. + const Data::Items::ItemOptionValue list{{4, 8}, true, {{"horseLevel", 1, 0}, {"level", 0, 40}}}; + CHECK(ComputeResolved(list, 2) == 10); + // A value with terms stops at what an option slot holds. + value.per = {{"level", 1000, 0}}; + CHECK(ComputeResolved(value, 1) == 65535); + + // A hero who isn't a master has no master level, also when the server sent one for a hero before. + hero.Hero().Class = CLASS_WIZARD; + value.per = {{"totalLevel", 0, 20}}; + CHECK(ComputeResolved(value, 1) == 4); + value.per = {{"masterLevel", 2, 0}}; + CHECK(ComputeResolved(value, 1) == 0); + + // Picking a character forgets the hero before's master level until the server sends the new hero's. + hero.Hero().Class = CLASS_GRANDMASTER; + gCharacterManager.ForgetHeroMasterLevel(); + value.per = {{"totalLevel", 0, 20}}; + CHECK(ComputeResolved(value, 1) == 4); + + Master_Level_Data = savedMasterLevel; +} + +// A loaded term, whose attribute the option database resolved, equals an edited one with the same data. +TEST_CASE("A term compares by its data, not by its resolved attribute [data][items]") +{ + Data::Items::ItemOptionValue loaded{{0}, false, {{"level", 0, 20}}}; + Data::Items::ResolveTermAttributes(loaded); + const Data::Items::ItemOptionValue edited{{0}, false, {{"level", 0, 20}}}; + CHECK(loaded.per[0].heroAttribute != edited.per[0].heroAttribute); + CHECK(loaded.per[0] == edited.per[0]); + CHECK_FALSE(loaded.per[0] == Data::Items::ItemOptionTerm{"level", 0, 25}); +} + +namespace +{ +// The excellent options the code before the definitions gave an item (CalcExcellentOptions up to 9a3, with its fix for +// arrows and bolts), for the hero's level `heroLevel`. +std::vector OldExcellentOptions(int type, BYTE flags, int heroLevel) +{ + std::vector slots; + const auto bit = [flags](int index) { return ((flags >> index) & 1) != 0; }; + const bool defensive = (type >= ITEM_SHIELD && type < ITEM_BOOTS + MAX_ITEM_INDEX) || + (type >= ITEM_RING_OF_ICE && type <= ITEM_RING_OF_POISON) || + (type >= ITEM_RING_OF_FIRE && type <= ITEM_RING_OF_MAGIC); + if (defensive) + { + constexpr std::array effects{AT_IMPROVE_LIFE, AT_IMPROVE_MANA, + AT_DECREASE_DAMAGE, AT_REFLECTION_DAMAGE, + AT_IMPROVE_BLOCKING_PERCENT, AT_IMPROVE_GAIN_GOLD}; + for (int index = 5; index >= 0; --index) + { + if (bit(index)) + { + // The defense rate option writes its 10 since the stat code adds it from the slot. + const WORD effect = effects[static_cast(5 - index)]; + slots.push_back({effect, static_cast(effect == AT_IMPROVE_BLOCKING_PERCENT ? 10 : 0)}); + } + } + } + const bool offensive = ((type >= ITEM_SWORD && type < ITEM_STAFF + MAX_ITEM_INDEX) && + !g_ItemDatabase.HasTag(type, Data::Items::ItemTag::Ammunition)) || + (type >= ITEM_PENDANT_OF_LIGHTING && type <= ITEM_PENDANT_OF_FIRE) || + (type >= ITEM_PENDANT_OF_ICE && type <= ITEM_PENDANT_OF_ABILITY); + if (offensive) + { + const bool wizardry = (type >= ITEM_STAFF && type < ITEM_STAFF + MAX_ITEM_INDEX) || + type == ITEM_PENDANT_OF_LIGHTING || type == ITEM_PENDANT_OF_ICE || + type == ITEM_PENDANT_OF_WATER; + if (bit(5)) + { + slots.push_back({AT_EXCELLENT_DAMAGE, 0}); + } + if (bit(4)) + { + slots.push_back( + {static_cast(wizardry ? AT_IMPROVE_MAGIC_LEVEL : AT_IMPROVE_DAMAGE_LEVEL), static_cast(heroLevel / 20)}); + } + if (bit(3)) + { + slots.push_back({static_cast(wizardry ? AT_IMPROVE_MAGIC_PERCENT : AT_IMPROVE_DAMAGE_PERCENT), 2}); + } + if (bit(2)) + { + slots.push_back({AT_IMPROVE_ATTACK_SPEED, 7}); + } + if (bit(1)) + { + slots.push_back({AT_IMPROVE_GAIN_LIFE, 0}); + } + if (bit(0)) + { + slots.push_back({AT_IMPROVE_GAIN_MANA, 0}); + } + } + return slots; +} + +ITEM MakeItemWithExcellent(int type, BYTE flags) +{ + ItemCreationParams params{}; + params.Group = type / MAX_ITEM_INDEX; + params.Number = type % MAX_ITEM_INDEX; + params.HasExcellentOption = flags != 0; + params.ExcellentFlags = flags; + ITEM item; + FillItemFromParameters(item, params); + return item; +} + +// The slots of the item's excellent definitions. +std::vector ExcellentDefinitionSlots(const ITEM& item) +{ + std::vector slots; + for (int slot = 0; slot < item.SpecialNum; ++slot) + { + const std::optional option = GameLogic::Items::FindSlotOption(item, slot); + if (option && option->definition->type == Data::Items::ItemOptionType::Excellent) + { + slots.push_back({item.Special[slot], item.SpecialValue[slot]}); + } + } + return slots; +} +} // namespace + +// Every item's excellent options come from the definitions it links (Data/Items/Options/Excellent.json) with the +// slots, values and order (bit 5 down to bit 0) the code before the definitions gave it, for every excellent byte; an +// item whose excellent byte nothing else reads (no wing, no Horn of Fenrir) has the whole slot list it had. +TEST_CASE("Every item's excellent options come from its option links as the code before the definitions gave them " + "[data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + hero.Hero().Level = 85; + + int itemsWithExcellent = 0; + for (int type = 0; type < MAX_ITEM; ++type) + { + if (g_ItemDatabase.Find(type) == nullptr) + { + continue; + } + CAPTURE(type); + const bool byteReadElsewhere = + g_ItemDatabase.GetSlot(type) == Data::Items::ItemSlot::Wings || type == ITEM_HORN_OF_FENRIR; + const std::vector withoutExcellent = AllSlots(MakeItemWithExcellent(type, 0)); + for (int flags = 1; flags < 64; ++flags) + { + CAPTURE(flags); + const ITEM item = MakeItemWithExcellent(type, static_cast(flags)); + const std::vector expected = OldExcellentOptions(type, static_cast(flags), 85); + REQUIRE(ExcellentDefinitionSlots(item) == expected); + if (!byteReadElsewhere) + { + std::vector expectedSlots = withoutExcellent; + expectedSlots.insert(expectedSlots.end(), expected.begin(), expected.end()); + CHECK(AllSlots(item) == expectedSlots); + } + } + itemsWithExcellent += OldExcellentOptions(type, 63, 85).empty() ? 0 : 1; + } + CHECK(itemsWithExcellent > 400); +} + +// The excellent lines come from their texts, with the definition's value where the code before wrote the number into +// the text. +TEST_CASE("The excellent options' tooltip lines come from their texts [data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + hero.Hero().Level = 85; + + const ITEM shield = MakeItemWithExcellent(ITEM_SHIELD, 0x21); + REQUIRE(shield.SpecialNum == 2); + CHECK(WriteDefinitionOptionLines(shield, 0, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increase Max HP +4%"); + CHECK(WriteDefinitionOptionLines(shield, 1, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increases acquisition rate of Zen after hunting monsters +30%"); + + const ITEM kris = MakeItemWithExcellent(ITEM_KRIS, 0x1C); + REQUIRE(kris.SpecialNum == 3); + CHECK(WriteDefinitionOptionLines(kris, 0, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increase Damage +level/20"); + CHECK(WriteDefinitionOptionLines(kris, 1, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increase Damage +2%"); + CHECK(WriteDefinitionOptionLines(kris, 2, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increase Attacking(Wizardry)speed +7"); + + // Arrows and bolts link none. + CHECK(MakeItemWithExcellent(ITEM_ARROWS, 63).SpecialNum == 0); + + // The formula's numbers come from the definition: the term's divisor and the after-kill option's value. + const ITEM pendant = MakeItemWithExcellent(ITEM_PENDANT_OF_FIRE, 0x01); + REQUIRE(pendant.SpecialNum >= 1); + CHECK(WriteDefinitionOptionLines(pendant, pendant.SpecialNum - 1, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increases acquisition rate of Mana after hunting monsters +Mana/8"); + ItemOptionsScope restoreOptions; + const Data::Items::ItemOptionDatabase& shipped = restoreOptions.Saved(); + std::vector definitions(shipped.GetDefinitions().begin(), + shipped.GetDefinitions().end()); + const int physical = shipped.Find("excellentPhysicalAttack"); + REQUIRE(physical != Data::Items::ItemOptionDatabase::NoDefinition); + for (Data::Items::ItemOption& option : definitions[static_cast(physical)].options) + { + if (option.number == 5) + { + option.value.per[0].divisor = 25; + } + } + g_ItemDatabase.SetOptions(Data::Items::ItemOptionDatabase(std::move(definitions), shipped.GetTexts())); + const ITEM changed = MakeItemWithExcellent(ITEM_KRIS, 0x10); + REQUIRE(changed.SpecialNum >= 1); + CHECK(WriteDefinitionOptionLines(changed, changed.SpecialNum - 1, 0, MaxTextListRows) == 1); + CHECK(std::wstring(TextList[0]) == L"Increase Damage +level/25"); +} + +// The stat code adds an option with terms on the hero's attributes as the hero is now, not as the hero was when the +// item was made: level / 20 grows with the hero. The other options add what the item was made with. +TEST_CASE("The stat code adds the excellent level / 20 as the hero is now [data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + hero.Hero().Level = 15; + + ITEM kris = MakeItemWithExcellent(ITEM_KRIS, 0x1C); + kris.Durability = 20; + REQUIRE(kris.Special[0] == AT_IMPROVE_DAMAGE_LEVEL); + CHECK(kris.SpecialValue[0] == 0); + CHECK(GameLogic::Items::GetCurrentSlotValue(kris, 0) == 0); + hero.Hero().Level = 85; + CHECK(GameLogic::Items::GetCurrentSlotValue(kris, 0) == 4); + CHECK(kris.SpecialValue[0] == 0); + // The others: what the item was made with (2 % and attack speed 7). + CHECK(GameLogic::Items::GetCurrentSlotValue(kris, 1) == 2); + CHECK(GameLogic::Items::GetCurrentSlotValue(kris, 2) == 7); + // A defensive option the server computes writes no value and adds none. + const ITEM shield = MakeItemWithExcellent(ITEM_SMALL_SHIELD, 0x20); + CHECK(GameLogic::Items::GetCurrentSlotValue(shield, 0) == 0); +} + +// The stats add the excellent per cent options (damage 2 %, wizardry 2 %, defense rate 10 %) with the values of their +// definitions, so a changed value changes the stats, not only the tooltip. +TEST_CASE("The stats add the excellent per cent options with their definitions' values [data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + hero.HeroCharacter().Class = CLASS_KNIGHT; + hero.Hero().Class = CLASS_KNIGHT; + hero.Hero().Level = 400; + hero.Hero().Strength = hero.Hero().Dexterity = hero.Hero().Energy = hero.Hero().Vitality = 5000; + + ITEM shield = MakeItemWithExcellent(ITEM_SMALL_SHIELD, 0x02); + shield.Durability = 20; + WORD blocking = 200; + PlusSpecialPercentOfSlot(&blocking, AT_IMPROVE_BLOCKING_PERCENT, &shield); + CHECK(blocking == 220); + ITEM kris = MakeItemWithExcellent(ITEM_KRIS, 0x08); + kris.Durability = 20; + WORD damage = 200; + PlusSpecialPercentOfSlot(&damage, AT_IMPROVE_DAMAGE_PERCENT, &kris); + CHECK(damage == 204); + + ItemOptionsScope restoreOptions; + const Data::Items::ItemOptionDatabase& shipped = restoreOptions.Saved(); + std::vector definitions(shipped.GetDefinitions().begin(), + shipped.GetDefinitions().end()); + for (const char* name : {"excellentDefense", "excellentPhysicalAttack"}) + { + const int found = shipped.Find(name); + REQUIRE(found != Data::Items::ItemOptionDatabase::NoDefinition); + for (Data::Items::ItemOption& option : definitions[static_cast(found)].options) + { + if (option.number == 2 || option.number == 4) + { + option.value = {{20}, false}; + } + } + } + g_ItemDatabase.SetOptions(Data::Items::ItemOptionDatabase(std::move(definitions), shipped.GetTexts())); + shield = MakeItemWithExcellent(ITEM_SMALL_SHIELD, 0x02); + shield.Durability = 20; + blocking = 200; + PlusSpecialPercentOfSlot(&blocking, AT_IMPROVE_BLOCKING_PERCENT, &shield); + CHECK(blocking == 240); + kris = MakeItemWithExcellent(ITEM_KRIS, 0x08); + kris.Durability = 20; + damage = 200; + PlusSpecialPercentOfSlot(&damage, AT_IMPROVE_DAMAGE_PERCENT, &kris); + CHECK(damage == 240); + + // A stat the per cent would carry past what it holds stops there instead of wrapping around. + damage = 60000; + PlusSpecialPercentOfSlot(&damage, AT_IMPROVE_DAMAGE_PERCENT, &kris); + CHECK(damage == 65535); +} + +// A ring's wizardry per cent comes from each of its own slots, also when a linked option comes before the slots its +// code gives: the Wizard's Ring with the excellent wizardry +2 % linked has the 2 % in slot 0 and its own 10 % in slot 1. +TEST_CASE("A ring's wizardry per cent comes from its own option slots [data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + hero.HeroCharacter().Class = CLASS_WIZARD; + hero.Hero().Class = CLASS_WIZARD; + hero.Hero().Level = 400; + hero.Hero().Strength = hero.Hero().Dexterity = hero.Hero().Energy = hero.Hero().Vitality = 5000; + + const Data::Items::ItemDefinition shipped = *g_ItemDatabase.Find(ITEM_WIZARDS_RING); + Data::Items::ItemDefinition linked = shipped; + linked.options.push_back("excellentWizardryAttack"); + g_ItemDatabase.Set(linked); + ITEM ring = MakeItemWithExcellent(ITEM_WIZARDS_RING, 0x08); + g_ItemDatabase.Set(shipped); + ring.Durability = 20; + REQUIRE(ring.SpecialNum >= 2); + CHECK(ring.Special[0] == AT_IMPROVE_MAGIC_PERCENT); + CHECK(GameLogic::Items::GetCurrentSlotValue(ring, 0) == 2); + CHECK(ring.Special[1] == AT_IMPROVE_MAGIC_PERCENT); + CHECK(ring.SpecialValue[1] == 10); + + // The magic damage with and without the ring: 900 energy gives 100 to 225; the ring adds 2 %, then 10 %. + const auto magicDamage = [](const ITEM* worn) + { + auto machine = std::make_unique(); + for (ITEM& equipped : machine->Equipment) + { + equipped = ITEM{}; + equipped.Type = -1; + } + if (worn != nullptr) + { + machine->Equipment[EQUIPMENT_RING_RIGHT] = *worn; + } + machine->Character.Energy = 900; + machine->CalculateMagicDamage(); + return std::make_pair(machine->Character.MagicDamageMin, machine->Character.MagicDamageMax); + }; + const auto [plainMin, plainMax] = magicDamage(nullptr); + const auto [ringMin, ringMax] = magicDamage(&ring); + CHECK(ringMin - plainMin == 12); + CHECK(ringMax - plainMax == 26); +} + +// "Excellent" is having an active excellent option: an item that links an excellent definition with an option its byte +// turns on. Wings with wing options and the Horn of Fenrir with a kind use the byte for something else and are not +// excellent by it. +TEST_CASE("An item is excellent when its excellent byte turns on an option it links [data][items]") +{ + ClientDataScope client(ClientDirectory); + I18N::SetLocale("en"); + std::string errorMessage; + REQUIRE(g_ItemDataHandler.Load(errorMessage)); + HeroScope hero; + + CHECK(GameLogic::Items::HasExcellentOptions(ITEM_KRIS, 0x01)); + CHECK(GameLogic::Items::HasExcellentOptions(ITEM_RING_OF_ICE, 0x20)); + CHECK(GameLogic::Items::HasExcellentOptions(MakeItemWithExcellent(ITEM_SMALL_SHIELD, 0x04))); + CHECK_FALSE(GameLogic::Items::HasExcellentOptions(ITEM_KRIS, 0)); + CHECK_FALSE(GameLogic::Items::HasExcellentOptions(ITEM_WINGS_OF_SPIRITS, 0x01)); + CHECK_FALSE(GameLogic::Items::HasExcellentOptions(ITEM_HORN_OF_FENRIR, 0x02)); + CHECK_FALSE(GameLogic::Items::HasExcellentOptions(ITEM_TRANSFORMATION_RING, 0x3F)); + CHECK_FALSE(GameLogic::Items::HasExcellentOptions(ITEM_ARROWS, 0x3F)); + + // The excellent +15 durability: an excellent item, not a wing with options or the Horn of Fenrir with a kind. + const auto durability = [](int type, BYTE flags) + { + const ITEM item = MakeItemWithExcellent(type, flags); + return CalcMaxDurability(&item, &ItemAttribute[type], 0); + }; + CHECK(durability(ITEM_KRIS, 0x01) == durability(ITEM_KRIS, 0) + 15); + CHECK(durability(ITEM_HORN_OF_FENRIR, 0x02) == durability(ITEM_HORN_OF_FENRIR, 0)); + CHECK(durability(ITEM_WINGS_OF_SPIRITS, 0x01) == durability(ITEM_WINGS_OF_SPIRITS, 0)); +} + diff --git a/tests/data/test_item_options_json.cpp b/tests/data/test_item_options_json.cpp index e932baff5a..a254002371 100644 --- a/tests/data/test_item_options_json.cpp +++ b/tests/data/test_item_options_json.cpp @@ -132,7 +132,7 @@ TEST_CASE("Option definition file errors stop the start [data][items]") }; fatal(R"({"type": "luck", "displayName": {"en": "Luck"}, )" + std::string(LuckOption) + "}", "definitions[0].name"); - fatal(R"({"name": "luck", "type": "excellent", "displayName": {"en": "Luck"}, )" + std::string(LuckOption) + "}", + fatal(R"({"name": "luck", "type": "wing", "displayName": {"en": "Luck"}, )" + std::string(LuckOption) + "}", "definitions[0].type"); fatal(R"({"name": "luck", "type": "luck", )" + std::string(LuckOption) + "}", "definitions[0].displayName"); fatal(R"({"name": "luck", "type": "luck", "displayName": {"de": "Glück"}, )" + std::string(LuckOption) + "}", @@ -374,3 +374,67 @@ TEST_CASE("Option definitions of type option read their numbered options and wri CHECK(HasIssue(ReadDefinition(option(R"({"number": 16, "attribute": "a", "add": {"values": [1]}, "text": "t"})")), ItemDataIssueSeverity::Fatal, "definitions[0].options[0].number")); } + +// An excellent definition: its options numbered 1 to 6 (the excellent byte's bit number - 1), a value with a term on a +// hero attribute ("level" / 20). +TEST_CASE("Option definitions of type excellent read their numbered options and terms and write them back [data][items]") +{ + constexpr const char* ExcellentFile = R"({ + "formatVersion": 1, + "definitions": [ + { + "name": "excellentAttack", + "type": "excellent", + "displayName": { + "en": "Excellent attack" + }, + "options": [ + {"number": 5, "attribute": "physicalBaseDmg", "add": {"values": 0, "per": [{"attribute": "level", "divisor": 20}]}, "text": "increaseDamageLevel20"}, + {"number": 6, "attribute": "excellentDamageChance", "percent": {"values": 10, "per": [{"attribute": "masterLevel", "times": 2}]}, "text": "excellentDamageRate"} + ] + } + ] +} +)"; + std::vector definitions; + std::vector issues; + ReadItemOptionsJson(ExcellentFile, "Options/Excellent.json", "Excellent.json", definitions, issues); + CHECK(issues.empty()); + REQUIRE(definitions.size() == 1); + const ItemOptionDefinition& excellent = definitions[0]; + CHECK(excellent.type == ItemOptionType::Excellent); + REQUIRE(excellent.options.size() == 2); + CHECK(excellent.options[0].number == 5); + REQUIRE(excellent.options[0].value.per.size() == 1); + CHECK(excellent.options[0].value.per[0] == ItemOptionTerm{"level", 0, 20}); + CHECK(excellent.options[1].value.per[0] == ItemOptionTerm{"masterLevel", 2, 0}); + CHECK(excellent.options[1].value.At(1) == 10); + CHECK(WriteItemOptionsJson(definitions) == ExcellentFile); + + const auto option = [](const std::string& options) + { + return R"({"name": "e", "type": "excellent", "displayName": {"en": "E"}, "options": [)" + options + "]}"; + }; + // The numbers are the byte's bits 1 to 6. + CHECK(HasIssue(ReadDefinition(option(R"({"number": 0, "attribute": "a", "add": {"values": 1}, "text": "t"})")), + ItemDataIssueSeverity::Fatal, "definitions[0].options[0].number")); + CHECK(HasIssue(ReadDefinition(option(R"({"number": 7, "attribute": "a", "add": {"values": 1}, "text": "t"})")), + ItemDataIssueSeverity::Fatal, "definitions[0].options[0].number")); + // A term has an attribute and exactly one of times and divisor, each a whole number from 1. + const auto term = [&option](const std::string& per) + { + return ReadDefinition( + option(R"({"number": 1, "attribute": "a", "add": {"values": 0, "per": )" + per + R"(}, "text": "t"})")); + }; + CHECK(HasIssue(term(R"([])"), ItemDataIssueSeverity::Fatal, "definitions[0].options[0].add.per")); + CHECK(HasIssue(term(R"([{"divisor": 20}])"), ItemDataIssueSeverity::Fatal, + "definitions[0].options[0].add.per[0].attribute")); + CHECK(HasIssue(term(R"([{"attribute": "level"}])"), ItemDataIssueSeverity::Fatal, + "definitions[0].options[0].add.per[0]")); + CHECK(HasIssue(term(R"([{"attribute": "level", "times": 2, "divisor": 20}])"), ItemDataIssueSeverity::Fatal, + "definitions[0].options[0].add.per[0]")); + CHECK(HasIssue(term(R"([{"attribute": "level", "divisor": 0}])"), ItemDataIssueSeverity::Fatal, + "definitions[0].options[0].add.per[0].divisor")); + CHECK(HasIssue(term(R"([{"attribute": "level", "divisor": 20, "round": "up"}])"), ItemDataIssueSeverity::Warning, + "definitions[0].options[0].add.per[0].round")); +} diff --git a/tests/data/test_item_stats.cpp b/tests/data/test_item_stats.cpp index 8f89c2a1ec..bc058ba89c 100644 --- a/tests/data/test_item_stats.cpp +++ b/tests/data/test_item_stats.cpp @@ -19,6 +19,7 @@ #include "Engine/Object/ZzzInfomation.h" #include "Engine/Object/ZzzInventory.h" #include "GameLogic/Items/ItemCategories.h" +#include "GameLogic/Items/ItemOptions.h" #include "GameLogic/Items/ItemStats.h" #include "I18N/All.h" #include "UI/Inventory/ItemHelpContentKey.h" @@ -297,7 +298,7 @@ TEST_CASE("Item stats come from the item's stat profile [data][items]") const auto stats = [&items](int itemType, int level, BYTE excellentFlags = 0, BYTE ancientDiscriminator = 0) { return GameLogic::Items::ComputeItemStats(items[itemType], - {itemType, level, excellentFlags, ancientDiscriminator}); + {itemType, level, excellentFlags, ancientDiscriminator, 0}); }; // Shield: block rate from the default table, defense +1 per level and no excellent part; @@ -360,12 +361,23 @@ TEST_CASE("Item requirements come from the item's stat profile [data][items]") CHECK(stats(ITEM_DRAGON_KNIGHT_HELM, 0, 0x01).requireLevel == 380); CHECK(stats(ITEM_HORN_OF_FENRIR, 15, 0x01).requireLevel == 300); - // Requirements by level, and the +20 on top of the ring's list. + // Requirements by level. CHECK(stats(ITEM_ORB_OF_SUMMONING, 3).requireEnergy == 130); CHECK(stats(ITEM_ORB_OF_SUMMONING, 7).requireEnergy == 500); CHECK(stats(ITEM_ORB_OF_SUMMONING, 8).requireEnergy == 0); CHECK(stats(ITEM_TRANSFORMATION_RING, 2).requireLevel == 20); - CHECK(stats(ITEM_TRANSFORMATION_RING, 3, 0x01).requireLevel == 70); + // A transformation ring links no excellent options, so the excellent byte doesn't raise it (OpenMU never sends one). + CHECK(stats(ITEM_TRANSFORMATION_RING, 3, 0x01).requireLevel == 50); + // A level requirement given by level gets the excellent +20 too: a Ring of Ice with one. + ItemDefinition ringByLevel = *g_ItemDatabase.Find(ITEM_RING_OF_ICE); + RequirementByLevel ringLevels{}; + ringLevels.fill(30); + ringByLevel.requirementsByLevel.Set(ItemRequirement::Level, ringLevels); + const GameLogic::Items::ItemStatSources ringSources{items[ITEM_RING_OF_ICE], &ringByLevel, + g_ItemDatabase.GetStatProfile(ITEM_RING_OF_ICE), + g_ItemDatabase.GetOptionLinks(ITEM_RING_OF_ICE)}; + CHECK(GameLogic::Items::ComputeItemStats(ringSources, {ITEM_RING_OF_ICE, 3}).requireLevel == 30); + CHECK(GameLogic::Items::ComputeItemStats(ringSources, {ITEM_RING_OF_ICE, 3, 0x01}).requireLevel == 50); // Books: energy with one per level; their strength grows with the option even from 0. The item counts its option // at its value list's last level above the list (GetAdditionalOptionLevel): 4. @@ -418,7 +430,7 @@ TEST_CASE("Item stats from an item's definition are those from the item database const ItemStatProfile& profile = profiles.Get( profileIndex == ItemStatProfiles::UnknownProfile ? ItemStatProfiles::DefaultProfile : profileIndex); const GameLogic::Items::ItemStatSources sources{attribute, &definition, profile, - definition.slot == ItemSlot::Wings}; + g_ItemDatabase.GetOptionLinks(itemType)}; for (int level = 0; level < ItemLevelCount; ++level) { for (const BYTE excellentFlags : {BYTE{0}, BYTE{0x01}}) diff --git a/tests/data/test_item_tooltips.cpp b/tests/data/test_item_tooltips.cpp index ca22b3aa20..3655ceb69f 100644 --- a/tests/data/test_item_tooltips.cpp +++ b/tests/data/test_item_tooltips.cpp @@ -169,8 +169,9 @@ class TextMeasureScope }; } // namespace -// Every item's tooltip at every level 0 to 15, in the twenty variants of WriteItemTooltipSnapshot (plain, full, ancient, -// harmony, each option alone, the additional option at levels 2 to 7 and option types 1 to 3, worn, broken and expired), +// Every item's tooltip at every level 0 to 15, in the 25 variants of WriteItemTooltipSnapshot (plain, full, ancient, +// harmony, each option alone, the additional option at levels 2 to 7 and option types 1 to 3, each excellent option +// alone, worn, broken and expired), // for the two heroes, against the hashes recorded in item_tooltip_snapshot.txt: a tooltip that changes shows here. // After a change that is meant, run the test with MU_TOOLTIP_SNAPSHOT_UPDATE=1 to record the new hashes; the control // socket's `tooltip-snapshot` writes the full lines in the game to compare with. @@ -224,7 +225,7 @@ TEST_CASE("Every item's tooltip is as recorded [data][items][tooltip]") changedTooltips.emplace_back(key, text); } }); - CHECK(tooltips == 911 * 20 * 16); + CHECK(tooltips == 911 * 25 * 16); } SetItemTooltipTextMeasure(nullptr); @@ -952,7 +953,7 @@ TEST_CASE("A ground label takes its look from the item's own style or else the s CHECK(lucky.textColor == rgb(0x66, 0xb2, 0xff)); CHECK(lucky.text == std::wstring(L"Kris +3") + I18N::Game::Luck); CHECK(lucky.style == "withOptions"); - // ... green when excellent, also first-tier wings, but not the second-tier wings, ... + // ... green when excellent (active excellent options), not wings with the excellent byte, ... const auto excellent = [&](int group, int number) { ItemCreationParams params = at(group, number, 0); @@ -961,8 +962,10 @@ TEST_CASE("A ground label takes its look from the item's own style or else the s return label(params).textColor; }; CHECK(excellent(0, 0) == rgb(0x19, 0xff, 0x7f)); - CHECK(excellent(12, 0) == rgb(0x19, 0xff, 0x7f)); + CHECK(excellent(12, 0) == rgb(0xb2, 0xb2, 0xb2)); CHECK(excellent(12, 3) == rgb(0xb2, 0xb2, 0xb2)); + // ... and the Horn of Fenrir with a colour, until its options move into data, ... + CHECK(excellent(13, 37) == rgb(0x19, 0xff, 0x7f)); // ... a set item green on blue and bold after its set's name, but not an item whose discriminator names no set. ItemCreationParams rapier = at(0, 2, 0); rapier.IsAncient = true; @@ -1030,6 +1033,12 @@ TEST_CASE("A transformation ring's restriction comes after its option lines [dat for (const int number : {10, 39, 41, 68, 76, 122}) { INFO("13/" << number); + // A transformation ring links no options: one linked for the test gives it option lines to come after. + const int type = Data::Items::MakeItemType(13, number); + const Data::Items::ItemDefinition shipped = *g_ItemDatabase.Find(type); + Data::Items::ItemDefinition linked = shipped; + linked.options.push_back("excellentDefense"); + g_ItemDatabase.Set(linked); const std::vector plain = Engine::Items::TooltipSnapshot::TooltipOfParameters(Engine::Items::TooltipSnapshot::FullItemParameters(13, number)); ItemCreationParams full = Engine::Items::TooltipSnapshot::FullItemParameters(13, number); full.WithLuck = true; @@ -1048,6 +1057,7 @@ TEST_CASE("A transformation ring's restriction comes after its option lines [dat shown += Core::Text::ToUtf8(line.text.c_str()) + " | "; } INFO(shown); + g_ItemDatabase.Set(shipped); if (at == lines.end()) { CHECK(at != lines.end());